HN 日本語サマリー

← 一覧へ戻る
プログラミング

Show HN: Rust製ContextCodeCache

Show HN: ContextCodeCache in Rust (github.com)

6 pointsby colwont0 コメント

要約

Rustで開発されたContextCodeCache (ccc) は、プロジェクトをスキャンしてソースコードの定数、関数、呼び出しグラフ、TODO/FIXMEなどのマーカーを機械可読な形式で記録するツールです。これにより、AIエージェントがプロジェクトのインデックスを効率的に参照できるようになります。CIでのキャッシュの鮮度チェックや、トークン化された形式での出力も可能です。

全文翻訳

ContextCodeCache (ccc) は、プロジェクトをスキャンしてContextCodeCacheを生成するツールです。これは、定数、関数(戻り値の型とドキュメントの要約付き)、ファイル内の呼び出しグラフ、およびマーカーノート(TODO/FIXMEなど)を含む、コンパクトで機械可読なソースファイルマップを保持する.cccディレクトリです。これは、エージェントにプロジェクトの安価で常に最新のインデックスを提供することを目的としています。有用だと感じたらぜひ⭐をお願いします💚 インストール/ビルド Rust ≥ 1.77 が必要です(tree-sitter 0.25スタック、一部の推移的依存関係はedition 2024を使用)。最近のcargoも必要です。 cargo build --release # バイナリは target/release/ccc にあります ./target/release/ccc install # PATHにコピーします(Linux) ccc install は、実行中のバイナリを~/.local/bin(Linuxのユーザーローカルバイナリディレクトリ。sudo不要)にコピーし、実行可能としてマークします。別のディレクトリを選択するには --dir <DIR> を渡すか、既存のcccを上書きするには --force を渡してください。ターゲットディレクトリが$PATHにない場合、シェルプロファイルに追加する行を出力します。 使用方法 ccc scan [PATH] # PATH/.ccc を再生成します(PATHはデフォルトで「.」) ccc scan [PATH] --tokens # キャッシュをトークンストリームに事前にエンコードします ccc check [PATH] # .ccc が古い場合は非ゼロで終了します - CI用 ccc check [PATH] --format json # 同上ですが、変更されたキャッシュファイルをJSONで出力します ccc tokenize [PATH] # 既存の.cccをtokens.bin + tokens.jsonに事前にエンコードします ccc install [--dir DIR] # cccバイナリをPATHにインストールします(Linux) ccc check --format json は、{ root, up_to_date, files[], changes[] } という1行を出力します。ここで files はキャッシュエントリが最新でないリポジトリ相対パスの配列です。これは他のツールで消費されることを意図しており、バンドルされたGitHub ActionはfromJSON(...)経由でその配列を下流ジョブに渡します:{"root":"example","up_to_date":false, "files":["example/.ccc/CCC.md","example/.ccc/src-math.rs.md"], "changes":[{"status":"modified","file":"CCC.md","path":"example/.ccc/CCC.md"}, ...]} scan は、各ファイルのエントリとCCC.mdインデックスをすべて書き換えるため、コミットされた差分は常にジェネレーターの再実行から生成されます。check はメモリ内で再生成し、コミットされた.cccと比較して、生成タイムスタンプを無視するため、新鮮さゲートが単に時間が経過しただけで失敗することはありません。 仕様 .ccc/ ├── CCC.md # インデックス:合計数 + ファイルごとの1行 ├── src-main.rs.md # <モジュール>-<ファイル>.<拡張子>.md、ソースファイルごとに1つ └── src-math.rs.md 各ファイルのエントリは次の形式に従います: # math.rs.md (yyyymmdd-hh-mm-ss) UTC # source: src/math.rs [rust] # const - L4@PI:f64 # funcs - L7:8@square:f64 // 数値を二乗する。 # funcs - L12:8@circle_area:f64 // 与えられた半径の円の面積。 # refs - circle_area@L14 calls L7:8@square:f64 # note - @L13 NOTE: 上記の丸められたPIを使用しているため、結果は近似値です。 const - ファイルレベルの定数/静的変数:L<行番号>@<名前>:<型>。すべての言語が定数をマークするわけではないため、各言語の慣習を使用します:Rustのconst/staticとGoのconst/var指定子。PythonはSHOUTING_SNEK_CASEモジュールバインディングのみ。JS/TSはconst宣言のみ(let/varではない)。PythonとJS/TSのクラス/impl属性は、ファイル定数ではなくメンバーとして扱われます。 funcs - 定義:L<行番号>:<列番号>@<名前>:<戻り値の型> // ドキュメントの要約 refs - ファイル内の呼び出しグラフ、スコープ(名前だけでなく)で解決されます:<呼び出し元>@L<行番号> calls L<行番号>:<列番号>@<関数>:<戻り値の型>。単なるfoo()は、同じファイル内のフリー関数fooにバインドされます。レシーバー呼び出し(self.foo()、this.foo()、またはGoのrecv.Foo())は、囲む型上のメソッドfooにバインドされます。他のレシーバー(other.foo())への呼び出しは、解決するために型情報が必要なため、名前から推測するのではなく、エッジは発行されません。 note - マーカーコメント(TODO、FIXME、XXX、HACK、BUG、NOTE、SAFETY) 動作例はexample/とその生成されたexample/.ccc/にあります。 トークンストリーム(事前エンコードされたキャッシュ) トークンストリームはAnthropicモデルと互換性がありません。これらは近似的なtiktoken ID(OpenAIの語彙)です。DeepSeek V4-Proなどで使用できます。OpenAIの語彙を共有する下流モデル、またはおおよそのサイズ見積もりに使用してください。Claudeを使用する場合は、コンテキストとして.cccマークダウンを使用してください。正確なClaudeトークン数については、Anthropicのcount_tokensエンドポイントを使用してください。tokens.jsonは、この注意書きをインライン(近似:true + 注記)で運びます。 ccc tokenize(または ccc scan --tokens)は、.cccコーパス全体を事前学習済みtiktoken語彙(デフォルトではo200k_base、--encoding cl100k_baseもサポート)でエンコードし、以下を書き込みます: .ccc/ ├── tokens.bin # 各キャッシュファイルのリトルエンディアンu32トークンIDを連結したもの └── tokens.json # インデックス:エンコーディング、レイアウト、およびファイルごとの{オフセット、長さ}(トークン内) コンシューマーは再トークン化なしで生のトークンをロードします - tokens.binをu32スライスとして読み込み、tokens.json経由でインデックスを作成します。TokenCacheローダーはまさにこれを実行し、各tokenize実行は、永続化されたストリームがバイト単位で同一のコーパスにデコードされることを検証します: let cache = codecache::TokenCache::load(project_root)?; let ids: &[u32] = cache.file("src-main.rs.md").unwrap(); // 生のトークン、使用準備完了 let text = cache.decode(ids)?; // オプション:マークダウンに戻す トークン成果物は派生的なものであるため、単純なccc scanはそれらをクリアします。更新するには --tokens を付けて(または ccc tokenize を使用して)再実行してください。 サポートされている言語 tree-sitter経由で、Rust、Python、JavaScript、TypeScript(+ TSX)、およびGoをサポートしています。サポートされていないファイルはスキップされます。隠しディレクトリや一般的なビルド/ベンダーディレクトリ(target、node_modulesなど)、および.gitignoreルールは尊重されます。言語を追加することは、src/languages.rs(拡張子マップ、グラマー、ノード種別セット)を拡張することです - src/extract.rsの抽出器はグラマーに依存しません。 .cccを最新の状態に保つ エージェントはキャッシュに依存するため、追跡対象のソースが変更されたときはいつでも再生成してください。CIステップの ccc check . は、キャッシュが最新でない場合にビルドを失敗させます。バンドルされたワークフロー .github/workflows/ccc-update.yaml はこれを自動化します:mainへのプッシュ時(および毎週)、各ルートを ccc check --format json でチェックし、キャッシュがずれている場合は再生成して、CCC-botが作成したプルリクエストを開きます。checkステップは、下流ジョブのジョブ出力として、古いファイル、changed_files(JSON配列)、およびchanged_countを公開します。CCC_ROOTS環境変数を編集して、プロジェクトのキャッシュディレクトリに合わせます。