Code Trace Tree
コードワークフローを、行、ファイル、ディレクトリのトレースポイントのネストされたツリーとして構築および表示します。提供される Python スクリプトを使用して、Code Trace Tree IDE プラグインが使用するハイブリッドストレージを操作し、その後 IDE にリロードを依頼します。
ユーザーが明示的に要求した場合(例:トピック関連のノードを生成する、ある行にヒントを追加する、編集後にリバインドする)にのみ、トレースを編集または同期してください。毎ターンの自動同期は行わないでください。ユーザーが明示的に削除を要求しない限り、既存のトレースポイント(rebind が "invalid" として報告するものを含む)を決して delete しないでください。
このスキルの使い方
この SKILL.md のみを読んでください。このスキルの scripts/ または references/ フォルダをリスト、検索、または探索せず、API を学ぶためにスクリプトソースを開かないでください。文書化された Python コマンドは絶対パスで呼び出してください。
スキルの使用中に重大な問題が発生した場合(スクリプトの欠落やクラッシュ、ストレージの破損、またはこのファイルでカバーされていないエラー)にのみ、scripts/ または references/ を開いてください。
スキルスクリプトの場所
ヘルパースクリプトは <Agent Skill Path>/code-trace-tree/scripts/ にあります。
Agent Skill Path は、実行中のエージェントのスキルディレクトリ(code-trace-tree/ の親)です。プロジェクトローカルにあればそちら、なければグローバルです。skills で終わり、code-trace-tree では終わりません。パスは npx skills に一致します。表に一般的な例を示しますが、他のリストにあるエージェントも同様に機能します。
| エージェント(例) | グローバルエージェントスキルパス | プロジェクトローカルエージェントスキルパス |
|---|---|---|
| Claude Code | ~/.claude/skills | <repo>/.claude/skills |
| Cursor | ~/.cursor/skills | <repo>/.agents/skills |
| GitHub Copilot | ~/.copilot/skills | <repo>/.agents/skills |
| Codex | ~/.codex/skills | <repo>/.agents/skills |
| Gemini CLI | ~/.gemini/skills | <repo>/.agents/skills |
Windows では、~ は %USERPROFILE% です。Agent Skill Path はセッションごとに 1 回解決してください。スクリプトは python(または PATH 上にあれば python3)を使用して絶対パスで呼び出してください。プロセス CWD は IDE プロジェクト内に保持してください(スキルフォルダに cd しないでください)。直接呼び出しについては トレースツリー操作 を参照してください。PowerShell の場合は Windows PowerShell も参照してください。
トレースツリー操作
すべてのスキルスクリプト呼び出し。Agent Skill Path の絶対パスをこのエージェントのものに置き換えてください。プロセス CWD は IDE プロジェクト内に保持してください(スキルフォルダに cd しないでください)。PowerShell の場合は Windows PowerShell を参照してください。
- resolve_storage.py
- create_tree.py
- trace_tree.py
- request_refresh.py
- request_refresh_profile.py
- request_refresh_settings.py
- select_trace_points.py
resolve_storage.py
プロジェクト ID とバインドされたグローバル XML を解決します。ストレージがない場合は作成します(ケース C)。.idea/code-trace-tree.project.id が存在するが XML がない場合は、同じ projectId で XML を再作成します。.idea の ID ファイルを作成/上書きしません。ミューテーションを行う create_tree および trace_tree add / ensure / move / delete / rebind も自動的にストレージを作成します。trace_tree search は自動的に作成しません。
使用方法
python "<Agent Skill Path>/code-trace-tree/scripts/resolve_storage.py" [project_path]
オプションパラメータ:
[project_path]: IDE プロジェクトルートを検出するために使用するパス(デフォルト: CWD)。XML<path>が正しくなるようにプロジェクトルートを渡してください。
戻り値
標準出力は JSON です(indent=2、UTF-8)。エラーは標準エラー出力に ERROR: … を出力します。
{
"created": false,
"project_root": "<abs>",
"global_dir": "<OS Config Dir>/code-trace-tree",
"project_id": "<uuid or null>",
"storage_xml": "<abs xml path>"
}
created は新しい XML が書き込まれた場合に true になります。終了コード 0 は成功、1 はプロジェクトルートが見つからない場合です。
例:
python "<Agent Skill Path>/code-trace-tree/scripts/resolve_storage.py"
python "<Agent Skill Path>/code-trace-tree/scripts/resolve_storage.py" /path/to/project
create_tree.py
1 回の呼び出しでネストされたトレースポイントツリーを作成します。ペイロードのルートのみを確実にします(および既に存在するルートの子はそのままにします)。ノードが作成されると、その子孫は追加されます(子ごとの ensure はありません)。不要な場合は search を行わないでください。このスクリプトは既存のノードを既に確実にしています。ID が必要な場合(select/move/delete)や調査のために search を使用してください。LINE ロケーターは trace_tree.py と同じです(file + line + content)。行コンテンツの出現情報(occurrenceIndex / totalOccurrences)は無視してください。スクリプトが計算します。PowerShell では --tree-file を推奨します。
オプションの --parent-id は、ペイロードを既存のノードの下にアタッチします(その親は解決され、確実にはされません)。
使用方法
python "<Agent Skill Path>/code-trace-tree/scripts/create_tree.py" --tree-file tree.json
python "<Agent Skill Path>/code-trace-tree/scripts/create_tree.py" tree.json
python "<Agent Skill Path>/code-trace-tree/scripts/create_tree.py" --tree '<json>'
必須パラメータ(厳密に 1 つのツリーソース):
--tree-file <path>: JSON ファイル(-= 標準入力)。--treeよりもこちらを推奨します。--tree <json>: JSON 文字列。- 位置引数
<path>:--tree-fileと同じ。
パラメータ(共有。すべてオプション):
--project <path>: プロジェクトパス(デフォルト: CWD)。--profile <name>: プロファイル名のオーバーライド(デフォルト:<activeProfileName>)。--dry-run: XML の書き込みやリフレッシュを行いません。--no-refresh: IDE リフレッシュシグナルをスキップします。--parent-id <uuid>: 既存の親。ルート方向から繰り返して直近の親を指定します。プロファイルルートの場合は省略します。--parent <json>: 既存の親パス JSON(--parent-idと組み合わせないでください)。
ツリー JSON(1 つのノードオブジェクト、またはノードオブジェクトの配列)。すべてのノードは同じ形状を使用し、children を含みます(description はルートだけでなくすべてのノードにあります):
{
"file": "src/A.java",
"line": 10,
"content": "void methodA() {",
"name": "methodA",
"description": "",
"type": "LINE",
"children": [
{
"file": "src/B.java",
"line": 40,
"content": "void methodB() {",
"name": "methodB",
"description": "",
"type": "LINE",
"children": [
{
"file": "src/C.java",
"line": 20,
"content": "void methodC() {",
"name": "methodC",
"description": "",
"type": "LINE"
},
{
"type": "FILE",
"file": "src/Util.java",
"name": "Util",
"description": ""
}
]
}
]
}
フィールド(すべてのノード。子を含む): file(必須)。type(LINE | FILE | DIRECTORY。省略時は推論: line/content があれば LINE、それ以外はディスク上のパス)。LINE には line + content が必要です。name / description / children はオプションです。occurrenceIndex / totalOccurrences は含めないでください。children は同じオブジェクトの配列です。
戻り値
標準出力は JSON です(indent=2、UTF-8)。ノードで skipped: true は、ensure が既に見つけたことを意味し、そのノードの子は引き続き確実にされます。created: true は追加を意味し、そのノードの子孫は ensure なしで追加されました。
{
"action": "create_tree",
"profile": "<profile-name>",
"storage_xml": "<abs>",
"parentId": "<uuid or empty>",
"created": 3,
"skipped": 1,
"ids": ["<uuid>", …],
"roots": [ { "skipped": false, "created": true, "node": <node-object>, "children": [ … ] } ],
"refreshed": true
}
終了コード 0 は成功です。
例:
python "<Agent Skill Path>/code-trace-tree/scripts/create_tree.py" --tree-file tree.json
python "<Agent Skill Path>/code-trace-tree/scripts/create_tree.py" --parent-id "$PARENT_ID" --tree-file tree.json
trace_tree.py
ノードの検索、追加、確保、移動、削除、およびリバインドを行います。行コンテンツの出現情報(occurrenceIndex / totalOccurrences)は無視してください。これらのフィールドを渡さないでください。スクリプトが計算します。
使用方法
python "<Agent Skill Path>/code-trace-tree/scripts/trace_tree.py" <subcommand> [flags…]
python "<Agent Skill Path>/code-trace-tree/scripts/trace_tree.py" [shared-flags] <subcommand> [flags…]
共有フラグ(--project、--profile、--dry-run、--no-refresh)は、サブコマンドの前後どちらでも指定できます。CWD が既に IDE プロジェクト内にある場合は --project を省略してください(スクリプトは上位に移動して .vscode / .idea / .git、または他の一般的なプロジェクトマーカーを見つけます)。デフォルトプロファイル: <activeProfileName>。
LINE ロケーター: 保存されるヒントは [file, line, full-trimmed-line] です。--line は必須です。スクリプトはその行のトリミングされたテキストをチェックし、完全なトリミング行を保存し(--content の部分文字列は展開されます)、その後ファイルをスキャンして occurrenceIndex / totalOccurrences を設定します。1 つのファイル内で重複するトリミング行は、--line がどのコピーを選択するかを決めるため区別されます。出現情報は無視してください: occurrenceIndex / totalOccurrences を読み取り、渡したり、計算したりしないでください。PowerShell では、引用符で囲まれた --content を --% で保護するか(Windows PowerShell を参照)、部分文字列のヒントと --line を使用してください。$Args という名前のパラメータを使用するヘルパーで CLI をラップしないでください。
| ヒント | 結果 |
|---|---|
| 正確な行 + 完全なトリミングテキスト | そのまま使用 |
その行の特徴的な部分文字列(例: .handleEmailTriggerRequest() | --line が必要。完全なトリミング行を保存 |
| 同じトリミングテキストが 2 行以上にある場合 | 目的のコピーに対して --line を渡す。スクリプトが出現情報を設定 |
| 複数行の呼び出し | 最も特徴的な物理行を推奨(多くの場合 .methodName( の継続行) |
add と ensure の違い: add は常に新しい UUID を作成します(IDE プラグインと同じ)。異なるラベルまたは親で同じ行に 2 番目のノードを作成する場合に使用します。ensure は取得または作成です。同じ ID の場合 → "skipped": true(終了コード 0)。LINE の場合、ID はファイル + トリミングされた lineContent + --line で選択されたコピーです(スクリプトが出現情報を保存します。渡さないでください)。FILE/DIRECTORY の ID はパス + タイプです。--trace-name、説明、親は ID に含まれません。
ツリーの生成: create_tree.py を推奨します。不要な場合は search を行わないでください。このスクリプトは既存のノードを確実にし、新しいサブツリーを追加します。select/move/delete や調査のために ID が必要な場合は search を使用してください。単一のノードの場合は、ensure(取得または作成。検索不要)または add(常に新しい UUID)を使用してください。
親パス: ルート方向の祖先から直近の親まで --parent-id を繰り返すことを推奨します。add / ensure でルートの場合は省略します。--parent-id を --parent と組み合わせないでください。--parent JSON 内のベア文字列はUUID のみであり、traceName ラベルではありません。
--parent の形式 | 例 |
|---|---|
| ルート | --parent [](move でルートに戻す場合に必要。add / ensure のデフォルトはルート) |
| JSON 内のノード ID | --parent '["3d41c2d1-…"]' |
[file, line, content] | --parent '[["src/A.java",10,"void methodA() {"]]' |
method A def
method B call
method C call ← --parent-id idA --parent-id idB で add(または B が既に存在する場合は ensure)
ディスク編集後のリバインド: エージェントは IDE エディタを介して編集しないため、ライブ行のシフトは適用されません。プロジェクトのソースを変更したターンの後は、ロケーターや select/navigate に依存する前に rebind を実行してください(オプションで --file で影響を受けたパスを指定)。Rebind はトリミングされた lineContent から lineNumber を修復し、出現情報を再計算します。"invalid" 配列は、それらの LINE ロケーターが見つからなかったことを意味します。これらのノードはツリーに残しておき、ユーザーが削除を要求しない限り delete しないでください。
多くのミューテーション呼び出しがある場合は、それぞれに --no-refresh を使用し、最後に 1 回 request_refresh.py を呼び出してください。
必須サブコマンド:
<subcommand>:search|add|ensure|move|delete|rebind
パラメータ(共有。すべてオプション):
--project <path>: プロジェクトパス(デフォルト: CWD)。--profile <name>: プロファイル名のオーバーライド(デフォルト:<activeProfileName>)。--dry-run: XML の書き込みやリフレッシュを行いません。--no-refresh: IDE リフレッシュシグナルをスキップします。
パラメータ(search。すべてオプション):
--id <uuid>: ノード UUID。--file <path>: 相対ファイル/ディレクトリパス。--line <n>: 1 ベースの行番号。--content <text>:lineContentに対する部分文字列マッチ。--trace-name <text>:traceNameに対する部分文字列マッチ。--type <LINE|FILE|DIRECTORY>: タイプでフィルタリング。
パラメータ(add / ensure):
- ロケーター(必須): LINE の場合は
--file+--line+--content(その行の部分文字列でも可)。FILE/DIRECTORY の場合は--file。または位置引数FILE LINE CONTENT、またはパス。 --parent-id <uuid>(オプション): 親ノード UUID。ルート方向から繰り返して直近の親を指定(推奨)。ルートの場合は省略。--parent <json>(オプション): JSON 親パス(--parent-idと組み合わせないでください)。--trace-name <text>(オプション): トレースポイントのラベル。--description <text>(オプション): 説明。--type <LINE|FILE|DIRECTORY>(オプション): タイプのオーバーライド(デフォルト: LINE)。
パラメータ(move):
- ロケーター(必須):
--id、または--file+--line+--content、または FILE/DIRECTORY の場合は--file単独。 - 新しい親(必須):
--parent-id(ルート方向から繰り返して直近の親)または--parentJSON。ルートの場合は--parent []を使用します。--parent-idを--parentと組み合わせないでください。
パラメータ(delete):
- ロケーター(必須):
--id、または--file+--line+--content、または FILE/DIRECTORY の場合は--file単独。
パラメータ(rebind。すべてオプション):
--file <path>: 相対パスに制限。繰り返し可能。デフォルト: プロファイル内のすべての LINE ノード。
戻り値
標準出力は JSON です(indent=2、UTF-8)。エラーは標準エラー出力に ERROR: … を出力し、ゼロ以外の終了コードで終了します。
node-object:
{
"id": "<uuid>",
"parentId": "<uuid or empty>",
"type": "LINE|FILE|DIRECTORY",
"file": "<relative path>",
"line": "<n or empty>",
"content": "<trimmed lineContent>",
"name": "<traceName>",
"depth": 0,
"childCount": 0
}
search:
{
"project_root": "<abs>",
"storage_xml": "<abs>",
"profile": "<profile-name>",
"matches": [ <node-object>, … ]
}
add(常に作成。"skipped" なし)
…
[truncated for translation]