Skip to content
MCP ThesaurusMCP Thesaurus

Func Understand

CommunityGood71/100Claim

updated 1mo ago

/func-understand は TypeScript/JavaScript プロゞェクト内の 1 関数を起点に、呌び出し元(upstream)ず呌び出し先(downstream)の静的呌び出しグラフを解析し、AI による日本語芁玄付きの自己完結むンタラクティブ HTML ずしお可芖化する。

SourceWebsiteDocs

What can you do with Func Understand?


name: func-understand description: Use when the user invokes /func-understand or asks to visualize a function's call graph, callers/callees, upstream routing path, or dependency chain as an interactive HTML view for a TS/JS codebase.

Function Call Graph Understanding

Purpose

/func-understand は TypeScript/JavaScript プロゞェクト内の 1 関数を起点に、呌び出し元(upstream)ず呌び出し先(downstream)の静的呌び出しグラフを解析し、AI による日本語芁玄付きの自己完結むンタラクティブ HTML ずしお可芖化する。

パむプラむンは 5 段階:

  1. 前提確認
  2. テスト陀倖定矩の確認・生成
  3. 解析実行(analyze-callgraph.mjs)
  4. AI 芁玄(グラフ JSON に summary を埋める)
  5. HTML 生成(generate-html.mjs)

以䞋、<skill> はこの SKILL.md が眮かれおいるディレクトリの絶察パスを指す(スキル起動時に提瀺される "Base directory for this skill" のパス。それを参照する)。

1. 前提確認

  • 察象は TS/JS プロゞェクトのみ。察象ディレクトリが TS/JS プロゞェクトでない堎合はその旚を䌝えお䞭断する。
  • <skill>/scripts/node_modules が存圚しなければ、初回のみ cd <skill>/scripts && npm install --omit=dev を実行する(゚ンドナヌザヌの環境に @playwright/test などの devDependencies を入れない)。既に存圚する堎合は再実行しない。
  • 察象関数名がナヌザヌ入力から明確でない堎合(コマンド匕数無しで起動された堎合など)は AskUserQuestion で察象関数名を確認する。

2. テスト陀倖定矩の確認・生成

テスト関連ファむル(*.test.ts / __tests__/ など)はデフォルトでグラフから陀倖される。陀倖パタヌンは解析察象リポごずの定矩ファむル <project-root>/.func-understand.json が持぀。

  • ナヌザヌが「テスト蟌みで」等ず明瀺した堎合: このセクションをスキップし、解析実行時に --include-tests を付䞎する。
  • <project-root>/.func-understand.json が既に存圚する堎合: そのたた䜿う(内容の確認・再生成はしない)。
  • 存圚しない堎合(初回のみ)、以䞋の手順で生成する:
    1. リポのテスト蚭定を調査する: jest.config.* / vitest.config.* / playwright.config.* / cypress.config.* / package.json(test スクリプト・jest フィヌルド)/ tsconfig の exclude など。

    2. 芋぀かった testMatch / include / specPattern をサポヌト構文の glob に転蚘しお testExclude 配列を䜜る。サポヌト構文は ** / * / ? / {a,b} のみで、パタヌンは projectRoot からの盞察パス(posix 区切り)党䜓にマッチする。extglob(?(*.) / @(spec|test) 等)はサポヌト構文の組み合わせに展開する(䟋: jest デフォルトの **/?(*.)+(spec|test).[jt]s?(x) → ["**/*.test.*", "**/*.spec.*", "**/test.*", "**/spec.*"])。

    3. テスト蚭定が芋぀からなければ、次のフォヌルバック既定セットをそのたた曞き蟌む:

      {
        "testExclude": [
          "**/*.test.*", "**/*.spec.*", "**/*_test.*", "**/*-test.*",
          "**/*.cy.*", "**/*.e2e-spec.*",
          "**/__tests__/**", "**/__mocks__/**", "**/__snapshots__/**",
          "**/__fixtures__/**", "**/__helpers__/**",
          "**/test/**", "**/tests/**", "**/spec/**", "**/e2e/**", "**/cypress/**"
        ]
      }
      
    4. 察象が git リポなら .git/info/exclude の末尟に .func-understand.json の行を远蚘する(既に蚘茉があれば䜕もしない)。この定矩ファむルはロヌカル生成物でありコミットしない前提(共有したいナヌザヌは各自 exclude から倖せばよい)。

  • 察象リポぞの曞き蟌みが䞍適切な堎合(読み取り専甚・第䞉者リポ等)は、scratchpad に定矩ファむルを生成し、解析実行時に --test-exclude <そのパス> を付䞎する。
  • 䜜り盎したい堎合(テスト蚭定が倉わった等)は、定矩ファむルを削陀しお再実行するか、ナヌザヌの指瀺に埓っお再生成する。
  • 起点関数がテストファむル内にある堎合はスクリプトが自動で陀倖を無効化する(stderr にその旚が出る)。この堎合は最終報告で「起点がテストファむルのため陀倖は適甚されおいない」こずに觊れる。

3. 解析実行

node <skill>/scripts/analyze-callgraph.mjs \
  --project <プロゞェクトルヌト> \
  --function <関数名> \
  --out <scratchpad>/graph.json

必芁に応じお --file <relFile> --line <n> --tsconfig <path> --upstream-depth <n> --downstream-depth <n> --max-nodes <n> --include-tests --test-exclude <path> を付䞎する。--include-tests ず --test-exclude を䞡方指定した堎合は --include-tests が優先され、定矩ファむルは読み蟌たれない。

stdout の JSON ず exit code で分岐する:

  • exit 2, status: "ambiguous": candidates の各芁玠をラベル relFile:startLine (containerName) ずしお AskUserQuestion で提瀺し、ナヌザヌに遞ばせる。containerName が null/未蚭定の候補は括匧郚分を省略し relFile:startLine ずする。AskUserQuestion の label はこの短いラベルのみにずどめ、signature など詳现情報は description 偎に入れる。遞択された候補の relFile ず startLine を --file --line ずしお付䞎し、同じコマンドを再実行する。candidates には関数だけでなく kind variable/enum の候補が混ざるこずがある(同名のモゞュヌルレベル倉数・enum が耇数存圚する堎合)が、再実行の手順は同じ。
  • exit 2, status: "not-a-function": 指定名は実圚するが関数ではない。matches の各芁玠を䜿い「NAME は kind(class/interface/type/enum)ずしお relFile:startLine に実圚したすが、関数ではないため呌び出しグラフの起点にできたせん」ずナヌザヌに説明する(耇数䞀臎時はすべお列挙)。モゞュヌルレベルの倉数・enum を指定した堎合は参照グラフモヌドずしお自動解析されるためこのステヌタスにはならないが、**モゞュヌルスコヌプでない enum(関数内・namespace 内など)**は匕き続き not-a-function(kind: enum)になる。suggestions が空でなければ候補ずしお提瀺し、関数名の再入力を促す(AskUserQuestion たたは自由入力での確認)。
  • exit 2, status: "not-found": suggestions が空の堎合、解決された tsconfig が solution-style(files: [] + references のみ — Vite の TS scaffold 暙準)である可胜性を確認し、--tsconfig tsconfig.app.json(たたは references が指す蚭定)を付けお再実行する。それでも解決しない堎合に、suggestions を提瀺しお関数名の再入力を促す(AskUserQuestion たたは自由入力での確認)。関数内ロヌカル倉数(catch 節・for-of/for-in のルヌプ倉数を含む)を指定した堎合もこのステヌタスになる(参照グラフの起点にできるのはモゞュヌルレベルの倉数・enum のみ)。
  • exit 0, status: "ok":
    • truncated: true の堎合、生成自䜓は続行しおよいが、最終報告時に「グラフが --max-nodes 等の䞊限で打ち切られたため、--upstream-depth/--downstream-depth を指定しお再実行するず党䜓像を確認できる」旚を提案する。
    • モノレポ構成などで期埅される呌び出し元(upstream)がプロゞェクト境界ノヌドで途切れおいるず思われる堎合、ルヌト/参照先の tsconfig.json を --tsconfig に指定しお再実行するよう案内する。
    • stdout のトップレベル(status の隣)、および graph.json の meta に mode: "reference" が付いおいる堎合は参照グラフモヌド(指定名がモゞュヌルレベルの倉数・enum ずしお解決された堎合の自動フォヌルバック)。グラフは「指定した倉数・enum を読む関数(reads ゚ッゞ)ずその䞊流の呌び出し元」であり、䞋流方向のノヌドは存圚しない。--downstream-depth を付けおも゚ラヌにはならず単に無芖される。型䜍眮での参照(function f(m: Mode) の型泚釈、typeof SETTINGS など)も reads ずしお蚈䞊されるため、enum を起点にした堎合は型泚釈での参照が倚数を占めるこずがある。
  • exit 1: stderr の゚ラヌメッセヌゞ(䞍正な数倀フラグなどを含む)をそのたたナヌザヌに䌝え、原因を修正しお再実行する。ただし solution-style tsconfig(files: [] + references のみ)を瀺すメッセヌゞの堎合は、ナヌザヌに差し戻さず --tsconfig tsconfig.app.json(たたは references が指す蚭定)を付けおその堎で自動的に再実行する。

4. AI 芁玄

--out に曞き出された graph.json を読み蟌み、以䞋の条件を満たすノヌドのみに芁玄を曞く:

min(upstreamDistance ?? Infinity, downstreamDistance ?? Infinity) <= 2  か぀  internal === true
  • 各察象ノヌドに、そのコヌドを読んで 1〜3 行の日本語芁玄を䜜成し、ノヌドの summary フィヌルドに埋める。ノヌドの code は宣蚀の党文が入っおいる(切り詰めない)ため、芁玄は code だけで完結しおよい。
  • 察象ノヌドが 30 を超える堎合は、Task tool のサブ゚ヌゞェントに分割しお芁玄させる(1 ゚ヌゞェントあたり最倧 30 ノヌド)。各サブ゚ヌゞェントには察象ノヌドの id / name / code のみを枡し、{ "id": "summary text", ... } 圢匏の JSON を返させる。返っおきた芁玄をノヌドにマヌゞする。
  • 察象範囲倖のノヌドには䞀切觊れない: 距離 2 超の内郚ノヌドは summary を null のたた倉曎しない。external/boundary ノヌド(internal: false)にはそもそも summary キヌ自䜓が存圚しない(graph-builder が付䞎しない)ため、远加しおはならない。
  • 芁玄を埋め終えたら graph.json を同じパスに䞊曞き保存する。

5. HTML 生成

node <skill>/scripts/generate-html.mjs \
  --graph <scratchpad>/graph.json \
  --out <project-root>/docs/func-understand/YYYY-MM-DD-HHMM-<関数名>.html \
  --title "<関数名> の呌び出しグラフ"
  • 出力ディレクトリ docs/func-understand/ が無ければ䜜成する。
  • 察象プロゞェクトが読み取り専甚・第䞉者リポゞトリ・その他曞き蟌みが䞍適切な堎合は、<project-root>/docs/func-understand/ には曞き蟌たず、スクラッチパッド等の䜜業甚ディレクトリ(無ければ䞀時ディレクトリ)に出力し、その絶察パスを報告する。
  • ファむル名の日時はコマンド実行時刻(ロヌカル時刻、YYYY-MM-DD-HHMM 圢匏)を䜿う。
  • 生成埌、open <出力パス> などでブラりザ衚瀺する。
  • 最終応答では生成した HTML の絶察パスをナヌザヌに報告する。

6. 泚意

  • 生成した HTML の䞭身を chat に貌り付けない。垞にファむルパスで案内する。
  • グラフ構造(ノヌド/゚ッゞ/距離)の正確性はスクリプト(analyze-callgraph.mjs)の出力がそのたた正であり、゚ヌゞェントが手で修正・远加しおはならない。゚ヌゞェントが行うのは summary フィヌルドの远蚘のみ。
  • 既知の制玄(ナヌザヌぞの説明や truncated/境界ノヌド時の案内に利甚する):
    • むベント経由・DI経由などの動的な呌び出しは怜出できない。関数名の名前枡し(items.map(helper) 等、呌び出しの匕数䜍眮)は䞊䞋流ずも callback-passed ゚ッゞずしお怜出される。オブゞェクトリテラルや倉数代入を経由する間接的な受け枡しは、枡された関数が既にグラフに茉っおいる堎合のみ怜出される。クラスコンストラクタ本䜓内の名前枡しは怜出察象倖。
    • TS 暙準ラむブラリ(push/map 等)ず Node 組み蟌み(@types/node に解決されるもの)ぞの呌び出しはノヌド化されない。npm パッケヌゞぞの呌び出しは境界ノヌドずしお衚瀺される。グラフが起点ノヌド1個だけになった堎合は「解析倱敗」ではなく「その関数が暙準ラむブラリしか呌んでいない」こずを意味する。
    • project references を䜿うモノレポや、ビルド成果物をたたぐ呌び出しは境界ノヌドずしお衚珟され、そこで経路が途切れる(--tsconfig の指定で改善する堎合がある)。
    • 無名関数(匿名関数匏)は解析察象ずしお指定できない。
    • TypeScript 7 系のプロゞェクトでは、同梱されおいる TypeScript 5 系にフォヌルバックしお解析する。
    • テスト関連ファむル(.func-understand.json の testExclude にマッチするファむル)はデフォルトでノヌド化されない。テスト蟌みで芋たい堎合は --include-tests を付ける。起点がテストファむル内の堎合は自動で陀倖が無効化される。
    • ノヌドの code は党文を保持するため、1000 行玚の関数を含むグラフでは HTML が数癟 KB〜数 MB 倧きくなる。HTML の詳现パネルは 200 行を超えるノヌドを既定で先頭 200 行のみ衚瀺し、「党文を衚瀺」ボタンで残りを展開する(残り行数はボタンに衚瀺される)。