Claude Code本体の難読化されたコードをCursorを使って解析する

Claude Codeのソースコードを入手するには?

Claude Codeのソースコードは現在GitHubに公開されていません(計画にはあるようです)。しかし、Node.js環境で実行されるスクリプトであるため、ユーザーはNPMレジストリ経由でパッケージを自由に取得できます。ただし、NPMから入手できるソースコードは難読化(ミニファイ)された状態で提供されています。

❯ npm pack @anthropic-ai/claude-code
❯ tar zxfv anthropic-ai-claude-code-1.0.5.tgz
❯ ls package/
cli.js  LICENSE.md  package.json  README.md  scripts  vendor  yoga.wasm
@anthropic-ai/claude-code
Use Claude, Anthropic’s AI assistant, right from your terminal. Claude can understand your codebase, edit files, run terminal commands, and handle entire workflows for you.. Latest version: 1.0.5, last published: 17 hours ago. Start using @anthropic-ai/claude-code in your project by running `npm i @anthropic-ai/claude-code`. There are 7 other projects in the npm registry using @anthropic-ai/claude-code.

この難読化されたcli.jsというファイルは6.9MBの容量を持ち、約250万トークンに相当します。このファイルには依存ライブラリのコードもすべてバンドルされています。この規模のトークン数は、現在利用可能なあらゆる言語モデルの入力制限を超えるものです。

❯ du -sh package/cli.js
6.9M    package/cli.js

❯ ttok -i package/cli.js
2507499

幸い、コードは行単位で分割可能な形式であったため、Pythonスクリプトを用いてファイルを20個に分割しました。これで1つ10−20万トークンに収まるはずです。

import os

input_file = "package/cli.js"
output_dir = "split_files"
lines_per_file = 124  # 2480行 ÷ 20ファイル

os.makedirs(output_dir, exist_ok=True)

with open(input_file, "r") as f:
    lines = f.readlines()

for i in range(20):
    start = i * lines_per_file
    end = start + lines_per_file
    chunk = lines[start:end]
    
    with open(f"{output_dir}/cli_part{i+1:02d}.md", "w") as out:
        out.write(f"# CLI.js Part {i+1}\n\n```javascript\n")
        out.writelines(chunk)
        out.write("\n```")

print("分割完了: 20ファイルを生成")
❯ ls split_files/
cli_part01.js  cli_part02.js  cli_part03.js  cli_part04.js  cli_part05.js  cli_part06.js  cli_part07.js  cli_part08.js  cli_part09.js  cli_part10.js  cli_part11.js  cli_part12.js  cli_part13.js  cli_part14.js  cli_part15.js  cli_part16.js  cli_part17.js  cli_part18.js  cli_part19.js  cli_part20.js

各AIツールでの解析を試行する

Devin

分割したコード断片をまずDevinに登録し、「Search機能による質問回答」「Wiki機能によるドキュメント化」で解析を試みました。

❯ git init
❯ wget https://raw.githubusercontent.com/github/gitignore/refs/heads/main/Node.gitignore -O .gitignore
❯ echo package/vendor/ >> .gitignore
❯ echo package/yoga.wasm >> .gitignore
❯ git add -n .
add '.gitignore'
add 'package/.claude/settings.local.json'
add 'package/LICENSE.md'
add 'package/README.md'
add 'package/cli.js'
add 'package/package.json'
add 'package/scripts/preinstall.js'

しかし、Devinはコード内部のコメント行のみを抽出・解析する結果となり、解析には至りませんでした。

これでもいいといえばいいんですが……

NotebookLM

次に、分割したコード断片をNotebookLMに登録する方法を試みました。この際、NotebookLMの制約上ファイル拡張子を.mdに変更してコードをマークダウンファイルとして扱わせます。しかし、NotebookLMも同様にコード内容を有効に読み取ることができず、解析には至りませんでした。

Askrepo

しかし、拙作Askrepoを使用してGemini APIに1〜10ファイルずつ分割コードを送信したところ、コード部分の解析が可能であることを確認しました。この結果から、モデルがコードに直接アクセスさえできれば、難読化されたコードであっても推論が可能であることが分かりました。でかした、Askrepo戻れ!

❯ askrepo -m'gemini-2.5-flash-preview-05-20' --prompt "how to work Search tool? in Japanese." claude-code/split_files/cli_part1*.js
Claude Codeには、主に2種類の「検索」ツールがあります。

1.  **ファイル内容を検索するツール (grepのような機能)**
    このツールは、ファイル内のテキストパターンを検索するために使用されます。
    パラメータ:
    *   `pattern`: 検索する**正規表現**パターンを指定します。
    *   `path`: 検索するディレクトリの絶対パスを指定します。省略した場合、現在の作業ディレクトリが使用されます。
    *   `include`: 検索に含めるファイルパターン(例: "*.js", "*.{ts,tsx}")を指定します。
    参照: `../claude-code/split_files/cli_part15.js:1483` (U95 schema)

2.  **ファイル名を検索するツール (globのような機能)**
    このツールは、プロジェクト内のファイル名をパターンに一致させて検索するために使用されます。
    パラメータ:
    *   `pattern`: ファイル名と一致させる**グロブパターン**を指定します。
    *   `path`: 検索するディレクトリの絶対パスを指定します。

Cursor

最後に特に期待せず、Cursorで難読化コードを含むディレクトリ全体を開いて質問をして試みたところ、大成功しました。筆者が従来から行っていた目grepやデバッガによる解析結果と一致する出力を得られ、ハルシネーションが発生していないことは明らかです。Cursorは関連するコードブロックへの直接的なポインタ(ファイルパス+行番号)を示しながら回答を提供しました。

ただし、分割前の状態(6.9MBの単一cli.jsファイル)ではCursorも解析不可能でした。このことから、いくらCursorといえど大規模な難読化コードを解析するためにはファイルの分割が必須であると思われます。また、モデルをMaxモード(Claude 4を選択)に切り替えた場合、より詳細な解析が可能であることを確認しました。

おまけ:システムプロンプトの差分分析
リリース時点で取得されていたシステムプロンプト(Claude_Code_03-04-24.md)との差分を解析した結果、複数の更新が確認できました。とくに興味深かかった"Taskツール"の定義について紹介します。このツールの技術的特徴は以下の通りです:

  • 並列実行アーキテクチャ:
    • 複数の子ツールを並列に呼び出し、ファイル検索や編集タスクを処理する
  • タスクのオーケストレーション:
    • 各子ツールの出力を統合し、タスクの取りまとめを行う
  • 状態管理:
    • Batch APIは使用せず、クライアントサイドでストリーミングAPIにリクエストをして、タスク状態を保持する方式を採用していました。
I've assigned multiple agents to tackle this task. Each agent has analyzed the problem and provided their findings.

${Q}

Based on all the information provided by these agents, synthesize a comprehensive and cohesive response that:
1. Combines the key insights from all agents
2. Resolves any contradictions between agent findings
3. Presents a unified solution that addresses the original task
4. Includes all important details and code examples from the individual responses
5. Is well-structured and complete

Your synthesis should be thorough but focused on the original task.

ソースコードから抜粋

Subscribe to laiso

Sign up now to get access to the library of members-only issues.
Jamie Larson
Subscribe