Communityライティング&編集github.com

saidake/code-trace-tree-vscode

Code Trace Tree は VS Code/JetBrains プラグインで、AI エージェントがネストしたコードワークフローをトレースポイントとして構築できるようにします。エディタのメニューまたはエージェントスキルからトレースを追加し、ダブルクリックでソースにジャンプできます。

code-trace-tree-vscode とは?

Code Trace Tree は、AI エージェント(Claude Code、Cursor、Codex など)が IDE ワークフロー内でネストされたコードトレースポイントを構築、整理、ナビゲーションできるようにするスキルです。エディタプラグイン(VS Code/JetBrains)のハイブリッドストレージとやり取りする Python スクリプトを提供し、エージェントがファイル、行、またはディレクトリレベルのトレースをツリー構造で作成、検索、リバインドできるようにします。主な強みは、自動同期や既存のトレースポイントの削除をユーザーの明示的な要求なしに行わないという保守的な設計にあります。これは、AI エージェントがソース編集後にロケーターをリバインドするのを助け、明示的な検索を必要とせずに必要なノードを確保し、呼び出しごとにリフレッシュをバッチ処理して IDE パフォーマンスを維持します。このスキルは、プロジェクトローカルまたはグローバルなエージェントスキルディレクトリパターンに従い、強化されたトレース機能のために IDE プラグインとシームレスに統合されます。

対応✓Claude Code✓Codex CLI✓Cursor✓Gemini CLI
npx skills add saidake/code-trace-tree-vscode

Installed? Explore more ライティング&編集 skills: steipete/notion, langchain-ai/langchain, bytedance/podcast-generation · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

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

プロジェクト 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(ルート方向から繰り返して直近の親)または --parent JSON。ルートの場合は --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]

関連スキル