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>"
}
新しいXMLが書き込まれた場合、created は 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回の呼び出しで、入れ子になったトレースポイントツリーを作成します。ペイロードのルートのみを保証します(および既に存在するルートの子ノード)。ノードが作成されると、その子孫は保証なしで追加されます。必要でない場合は search を使用しないでください — このスクリプトは既存のノードを既に保証しています。IDが必要な場合(選択/移動/削除)または検査する場合に 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 は追加を意味します。そのノードの子孫は、保証なしで追加されました。
{
"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 vs ensure: add は常に新しいUUIDを作成します(IDEプラグインと同じ)。同じ行に別のラベルまたは親を持つ2番目のノードを作成する場合に使用します。ensure は取得または作成です:同一の識別情報 → "skipped": true(終了コード 0)。LINEの場合、識別情報はファイル + トリミングされた lineContent + --line で選択されたコピーです(スクリプトが出現情報を保存します。渡さないでください)。FILE/DIRECTORYの識別情報はパス + タイプです。--trace-name、description、親は識別情報ではありません。
ツリーの生成: create_tree.py を優先してください。必要でない場合は search を使用しないでください — スクリプトは既存のノードを保証し、新しいサブツリーを追加します。選択/移動/削除のために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エディタを介して編集しないため、ライブラインのシフトは適用されません。プロジェクトのソースを変更したターンの後は、ロケーターや選択/ナビゲーションに依存する前に 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" はありません)
...