diff --git a/.claude-plugin/plugin.json b/.claude-plugin/plugin.json index 2347681..007bcec 100644 --- a/.claude-plugin/plugin.json +++ b/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "genshijin", - "version": "1.3.0", - "description": "超圧縮コミュニケーションモード。原始人のように話してトークン使用量を約75%削減しつつ、技術的正確性は完全に維持。日本語に最適化。コミット生成・PRレビュー・メモリ圧縮サブスキル同梱。SessionStart/UserPromptSubmit フックでモード追跡・毎ターン補強・ドリフト防止。スラッシュコマンド /genshijin /genshijin-commit /genshijin-review 付属。Cursor/Windsurf/Cline/Copilot 等マルチエージェント対応。", + "version": "1.4.0", + "description": "超圧縮コミュニケーションモード。原始人のように話してトークン使用量を約75%削減しつつ、技術的正確性は完全に維持。日本語に最適化。コミット生成・PRレビュー・メモリ圧縮・stats可視化サブスキル同梱。SessionStart/UserPromptSubmit フックでモード追跡・毎ターン補強・ドリフト防止・/genshijin-stats でセッション削減量+USD推定表示。MCP middleware (genshijin-shrink) でMCPツール記述も圧縮。スラッシュコマンド /genshijin /genshijin-commit /genshijin-review /genshijin-stats 付属。Cursor/Windsurf/Cline/Copilot 等マルチエージェント対応。3 cavecrew相当 subagent (investigator/builder/reviewer) で長セッションコンテキスト持続。", "author": { "name": "InterfaceX-co-jp", "url": "https://github.com/InterfaceX-co-jp" @@ -9,7 +9,7 @@ "homepage": "https://interfacex-co-jp.github.io/genshijin/", "repository": "https://github.com/InterfaceX-co-jp/genshijin", "license": "MIT", - "keywords": ["productivity", "communication", "brevity", "japanese", "日本語", "commit", "review", "compress", "memory", "hooks", "statusline", "commands", "cursor", "windsurf", "cline", "copilot"], + "keywords": ["productivity", "communication", "brevity", "japanese", "日本語", "commit", "review", "compress", "stats", "mcp", "subagent", "hooks", "statusline", "commands", "cursor", "windsurf", "cline", "copilot"], "hooks": { "SessionStart": [ { diff --git a/AGENTS.md b/AGENTS.md index bda42d3..fa8e870 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,3 +3,5 @@ @./skills/genshijin-review/SKILL.md @./skills/genshijin-help/SKILL.md @./skills/genshijin-compress/SKILL.md +@./skills/genshijin-stats/SKILL.md +@./skills/genshijin-crew/SKILL.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 2d63a26..cdf25e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,61 @@ ## [Unreleased] +## [1.4.0] - 2026-05-07 + +caveman 本家 v1.3.0以降 (`56875e8` / `83ec61c` / `e031c1e`) との差分を全項目移植。stats receipts / smart installer / cavecrew相当 / cavepack相当 / MCP-shrink。 + +### Added + +- **`/genshijin-stats` スキル + フック** — 現セッションのリアルトークン使用量 + 推定削減量を表示 + - per-million model pricing で USD 換算 (`claude-opus-4`/`claude-sonnet-4`/`claude-haiku-4` 系自動判定) + - `--share` ツイート可能1行サマリ、`--all` / `--since 7d` ライフタイム集計 + - `*.original.md` バックアップ検出で input側 (memory compress) 削減も計測 + - statusline に savings suffix `⛏ 12.3k` 追加表示 + - `.genshijin-history.jsonl` に session毎エントリ append (symlink-safe) +- **`genshijin-crew` 3サブエージェント** — 長セッションコンテキスト持続用 (caveman cavecrew 相当) + - `genshijin-investigator` (read-only locator、haiku model) + - `genshijin-builder` (1-2ファイル surgical edit) + - `genshijin-reviewer` (severity-tagged finding、haiku model) + - subagent tool-result が原始人圧縮 → 主コンテキスト消費約60%減 + - skill `skills/genshijin-crew/SKILL.md` で委譲判断ガイド +- **`genshijin-shrink` MCP middleware proxy** (`mcp-servers/genshijin-shrink/`) + - 任意の MCP server を wrap → `tools/list` `description` を圧縮 + - コード/URL/パス/識別子は byte-for-byte 保護 + - 英語 + 日本語散文両対応 (敬語/クッション/前置き/ぼかし/形式名詞削除) + - npm publishable: `npx genshijin-shrink [args]` +- **`tools/genshijin-init.js`** — マルチエージェント rules 一発投下スクリプト (caveman cavepack 相当) + - Cursor/Windsurf/Cline/Copilot/AGENTS.md に rule 投下 + - sentinel チェックで idempotent、`--dry-run` / `--force` / `--only ` +- **root `install.sh` / `install.ps1`** — smart multi-agent installer + - Claude Code/Cursor/Windsurf/Cline/Copilot 自動検出 → native install + - `--dry-run` / `--force` / `--only` / `--all` / `--minimal` / `--list` + - 既存 `hooks/install.sh` は Claude Code 単独 hooks 用として残存 +- **commands/genshijin-stats.toml** — `/genshijin-stats` スラッシュコマンド定義 +- **agents/** ディレクトリ — 3 subagent definition + +### Changed + +- `plugin.json` description / keywords に stats/MCP/subagent 機能反映、version 1.4.0 に bump +- `skills/genshijin/SKILL.md` 極限モードに **コードシンボル/関数名/API名/エラー文字列の略称化禁止** 明示 (caveman ultra-mode code-symbol guard 相当) +- 自動解除 (Auto-Clarity) 条件拡張: 多段手順での fragment 順誤読リスク、圧縮自体が技術的曖昧性発生時 (LaTeX/SQL/正規表現境界)、ユーザー混乱表明時 +- `hooks/genshijin-mode-tracker.js` 引数ホワイトリスト strict化 — 不正引数で flag file silent overwrite 防止 +- `hooks/genshijin-mode-tracker.js` `/genshijin-stats` 検出時に `decision: "block"` で stats hook 出力を即時注入 +- `hooks/genshijin-config.js` `appendFlag` / `readHistory` 関数追加 (lifetime stats 用 JSONL) +- `hooks/genshijin-config.js` symlink 検証を immediate parent のみに緩和 — `~/.claude` が symlink な環境 (Nix/dotfiles管理/Docker bind-mount) で誤拒否回避 +- `hooks/genshijin-statusline.sh` / `.ps1` に `.genshijin-statusline-suffix` 読込追加 — `/genshijin-stats` 後の savings 値を statusline に表示 +- `skills/genshijin-compress/scripts/compress.py`: + - UTF-8 stdout/stderr 強制 (Windows cp932 環境 UnicodeEncodeError 回避) + - 空ファイルガード — Anthropic API 送信前に skip + - 同一出力ガード — 圧縮効果なし時バックアップ作成せず + - frontmatter cleanup (BOM 除去、frontmatter 後の余白整形、末尾改行正規化) + - `read_text` / `write_text` に `encoding="utf-8"` 明示 +- `AGENTS.md` に `genshijin-stats` / `genshijin-crew` 参照追加 + +### Fixed + +- `hooks/install.ps1` Windows PowerShell + cmd.exe で `node -e "..."` 引用符エスケープ問題 → temp file 経由実行に変更 + ## [1.3.0] - 2026-04-18 ### Added @@ -68,7 +123,9 @@ - 日本語/英語ベンチマークスクリプト + GitHub Actions 自動実行 - GitHub Pages(`docs/index.html`)でのベンチマーク可視化 -[Unreleased]: https://github.com/InterfaceX-co-jp/genshijin/compare/v1.2.0...HEAD +[Unreleased]: https://github.com/InterfaceX-co-jp/genshijin/compare/v1.4.0...HEAD +[1.4.0]: https://github.com/InterfaceX-co-jp/genshijin/compare/v1.3.0...v1.4.0 +[1.3.0]: https://github.com/InterfaceX-co-jp/genshijin/compare/v1.2.0...v1.3.0 [1.2.0]: https://github.com/InterfaceX-co-jp/genshijin/compare/v1.1.0...v1.2.0 [1.1.0]: https://github.com/InterfaceX-co-jp/genshijin/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/InterfaceX-co-jp/genshijin/releases/tag/v1.0.0 diff --git a/README.md b/README.md index 61e5a65..3c83e34 100644 --- a/README.md +++ b/README.md @@ -120,13 +120,15 @@ claude --plugin-dir ./path/to/genshijin ## サブスキル -本体 `/genshijin` に加え、用途別サブスキル4個同梱。 +本体 `/genshijin` に加え、用途別サブスキル6個同梱。 | スキル | トリガー | 内容 | |--------|---------|------| | **genshijin-commit** | `/genshijin-commit` | Conventional Commits 形式の簡潔コミットメッセージ。件名≤50文字、「なぜ」重視 | | **genshijin-review** | `/genshijin-review` | 1行PRコメント `L42: 🔴 バグ: user null。ガード追加。` | | **genshijin-compress** | `/genshijin-compress ` | `CLAUDE.md` 等のメモリファイルを原始人モード化し入力トークン永続削減 | +| **genshijin-stats** (v1.4.0〜) | `/genshijin-stats [--share / --all / --since 7d]` | 現セッションのリアルトークン使用量+推定削減量+USD換算をフックが即時表示 | +| **genshijin-crew** (v1.4.0〜) | (auto) | 3 subagent preset (`investigator`/`builder`/`reviewer`)。tool-result 原始人圧縮で主コンテキスト約60%減 | | **genshijin-help** | `/genshijin-help` | 全モード・サブスキル・設定方法のリファレンスカード | ### genshijin-compress について @@ -215,9 +217,67 @@ JSON - `/genshijin 丁寧|通常|極限` — 強度レベル切替 - `/genshijin-commit` — 現在のステージング変更から簡潔なコミットメッセージ生成(Conventional Commits) - `/genshijin-review` — 現在のコード変更を1行1指摘でレビュー(`L42: 🔴 バグ: ...`) +- `/genshijin-stats` (v1.4.0〜) — 現セッションのリアルトークン使用量+推定削減量+USD換算をフックが即時表示。`--share` ツイート用1行サマリ、`--all` / `--since 7d` ライフタイム集計対応 定義は [commands/](./commands/) 配下。 +## v1.4.0 拡張機能 + +caveman 本家 v1.3.0以降の差分(stats receipts / smart installer / cavecrew相当 / cavepack相当 / MCP-shrink)を全項目移植。 + +### Smart multi-agent installer — root `install.sh` / `install.ps1` + +Claude Code/Cursor/Windsurf/Cline/Copilot を自動検出し、各 agent に native install。 + +```bash +# macOS / Linux +curl -fsSL https://raw.githubusercontent.com/InterfaceX-co-jp/genshijin/main/install.sh | bash + +# Windows PowerShell +iwr -useb https://raw.githubusercontent.com/InterfaceX-co-jp/genshijin/main/install.ps1 | iex +``` + +`--dry-run` / `--force` / `--only ` / `--all` / `--minimal` / `--list` 対応。再実行安全。 + +### genshijin-init — per-repo rule 一発投下 + +1コマンドで対象 repo に常時有効化 rule を全 IDE agent 用に投下。idempotent。 + +```bash +npx -y https://raw.githubusercontent.com/InterfaceX-co-jp/genshijin/main/tools/genshijin-init.js +``` + +Cursor / Windsurf / Cline / Copilot / AGENTS.md 用 rule file 生成。`--dry-run` / `--force` / `--only` 対応。 + +### genshijin-shrink — MCP middleware + +任意の MCP server を wrap → `tools/list` の `description` field を圧縮。コード/URL/パス/識別子は byte-for-byte 保護。 + +```jsonc +{ + "mcpServers": { + "fs-shrunk": { + "command": "npx", + "args": ["genshijin-shrink", "npx", "@modelcontextprotocol/server-filesystem", "/path"] + } + } +} +``` + +詳細は [mcp-servers/genshijin-shrink/README.md](./mcp-servers/genshijin-shrink/README.md)。 + +### genshijin-crew — 3 subagent preset + +長セッションでコンテキストを温存するための subagent 3種。 + +| Subagent | 用途 | +|----------|------| +| `genshijin-investigator` | read-only locator (haiku model)、`file:line` 表で返却 | +| `genshijin-builder` | 1-2ファイル surgical edit。3+ファイルは `too-big.` で拒否 | +| `genshijin-reviewer` | severity-tagged finding (🔴bug / 🟡risk / 🔵nit / ❓question) | + +委譲判断ガイドは [skills/genshijin-crew/SKILL.md](./skills/genshijin-crew/SKILL.md)。 + ## マルチエージェント対応(v1.3.0〜) Claude Code 以外の AI コーディングエージェントでも原始人モード利用可能: diff --git a/agents/genshijin-builder.md b/agents/genshijin-builder.md new file mode 100644 index 0000000..0a844cd --- /dev/null +++ b/agents/genshijin-builder.md @@ -0,0 +1,44 @@ +--- +name: genshijin-builder +description: > + 1-2ファイル surgical 編集。typo修正、単関数書換、機械的rename、コメント削除、フォーマット保持微調整。 + 3ファイル以上は強制拒否。原始人diff receipt 返却。スコープ明確時に使用、新機能/新ファイル/cross-file リファクタには使うな。 +tools: Read, Edit, Write, Grep, Glob +--- + +原始人極限。冠詞・フィラー削除。コード/パス正確、バッククォート付。ナレーション禁止。 + +## スコープ + +1ファイル理想。2ファイル可。3ファイル以上 → 拒否。 +既存編集のみ(新ファイルはユーザー明示時のみ)。 +新abstraction禁止。drive-by refactor禁止。コメント追加禁止。 +`Bash` 不可 → shell実行/push/削除不可。 + +## ワークフロー + +1. `Read` 対象。盲目編集禁止。 +2. `Edit` 最小diff。 +3. 再 `Read` 検証。 +4. Receipt 返却。 + +## 出力 (receipt) + +``` + — <変更 ≤10語>。 + — <変更 ≤10語>。 +verified: 。 +``` + +Diff = artifact。Receipt = 証明。探索ストーリー禁止。 + +## 拒否 (terminal lines) + +3ファイル以上 → `too-big. split: .` +破壊的操作必要 → `needs-confirm. op: .` +仕様曖昧 → `ambiguous. ask: .` +編集後テスト失敗、スコープ内修正不可 → `regressed. revert path:line. cause: .` + +## 自動解除 + +セキュリティ/破壊的パス → 通常日本語警告、その後原始人復帰。 diff --git a/agents/genshijin-investigator.md b/agents/genshijin-investigator.md new file mode 100644 index 0000000..9a1fb79 --- /dev/null +++ b/agents/genshijin-investigator.md @@ -0,0 +1,56 @@ +--- +name: genshijin-investigator +description: > + 読取専用コードロケーター。「Xはどこで定義?」「Yを呼んでるのは?」「Zの全用法」「ディレクトリ構造」に + file:line 表で返却。出力は原始人圧縮 → 主スレッドの消費トークンが vanilla Explore 比で約60%減。 + 修正提案は拒否。 +tools: Read, Grep, Glob, Bash +model: haiku +--- + +原始人極限。冠詞・フィラー・ぼかし削除。コード/シンボル/パスは正確、バッククォート付。先頭に答え。 + +## 役割 + +位置特定。報告。停止。編集禁止、修正提案禁止。 + +## 出力形式 + +``` + — `` — <≤6語メモ> + — `` — <≤6語メモ> +``` + +3行以上時は1語ヘッダ付与: `Defs:` / `Refs:` / `Callers:` / `Tests:` / `Imports:` / `Sites:`。 +1ヒット → 1行のみ、ヘッダなし。 +0ヒット → `No match.` +末尾 → 集計: `2 defs, 5 refs.` (0/1時省略)。 + +## ツール + +`Grep` シンボル/文字列。`Glob` パス。`Read` 範囲指定のみ。`Bash` は `git log -S`/`git grep`/`find` で高速時。 + +## 拒否 + +修正依頼 → `Read-only. genshijin-builder 起動。` +設計依頼 → `Read-only. genshijin-builder or 主スレッド使用。` + +## 自動解除 + +セキュリティ警告・破壊的操作 → 通常日本語。該当部分後復帰。 + +## 例 + +Q: 「symlink-safe フラグ書込どこ?」 + +``` +Defs: +- hooks/genshijin-config.js:81 — `safeWriteFlag` — atomic write w/ O_NOFOLLOW +- hooks/genshijin-config.js:160 — `readFlag` — paired reader +Callers: +- hooks/genshijin-mode-tracker.js:33,87 +- hooks/genshijin-activate.js:40 +Tests: +- tests/test_symlink_flag.js — 12 cases +2 defs, 3 callers, 1 test file. +``` diff --git a/agents/genshijin-reviewer.md b/agents/genshijin-reviewer.md new file mode 100644 index 0000000..5fe181c --- /dev/null +++ b/agents/genshijin-reviewer.md @@ -0,0 +1,47 @@ +--- +name: genshijin-reviewer +description: > + Diff/branch/file レビュアー。1指摘1行、severity タグ付、賞賛なし、スコープ越境なし。 + 出力形式: `path:line: : <問題>. <修正>.`。 + 「PR レビューして」「diff レビュー」「ファイル監査」で使用。意味変更なきフォーマット nit はスキップ。 +tools: Read, Grep, Bash +model: haiku +--- + +原始人極限。指摘のみ。「looks good」「I'd suggest」「前置き」禁止。 + +## Severity + +| Emoji | Tier | 用途 | +|---|---|---| +| 🔴 | bug | 誤出力・クラッシュ・セキュリティホール・データ消失 | +| 🟡 | risk | エッジケース・race・leak・perf cliff・ガード欠落 | +| 🔵 | nit | スタイル・命名・微perf — ユーザーが thorough 要求時のみ出力 | +| ❓ | question | 著者意図確認なしには判定不能 | + +## 出力 + +``` +path/to/file.ts:42: 🔴 bug: token expiry uses `<` not `<=`. Off-by-one allows expired tokens 1 tick. +path/to/file.ts:118: 🟡 risk: pool not closed on error path. Add `try/finally`. +src/utils.ts:7: ❓ question: なぜ `.trim()` 重複? +totals: 1🔴 1🟡 1❓ +``` + +指摘ゼロ → `No issues.` +ファイル順、ファイル内は行昇順。 + +## 境界 + +- 目の前にあるもののみレビュー。「ついでに」禁止。 +- 大型リファクタ提案禁止。 +- 文脈不足 → `(see L in )` 追記。推測禁止。 +- 意味変更なきフォーマット nit スキップ。 + +## ツール + +`Bash` は `git diff`/`git log -p`/`git show` のみ。mutating コマンド禁止。 + +## 自動解除 + +セキュリティ findings → 第1文に通常日本語でリスク明示、その後原始人形式の修正行。 diff --git a/commands/genshijin-stats.toml b/commands/genshijin-stats.toml new file mode 100644 index 0000000..e40d258 --- /dev/null +++ b/commands/genshijin-stats.toml @@ -0,0 +1,2 @@ +description = "現セッションのリアルトークン使用量 + 推定削減量" +prompt = "/genshijin-stats" diff --git a/docs/article.md b/docs/article.md index 39f41d6..30aa35b 100644 --- a/docs/article.md +++ b/docs/article.md @@ -6,6 +6,12 @@ - Claudeのマーケットプレイスに無事公開されました🎉 - [`genshijin@v1.3.0`](https://github.com/InterfaceX-co-jp/genshijin/releases/tag/v1.3.0)を公開しました。マルチエージェント対応やセキュリティ対応、ベンチマーク更新などを含めています +@追記: 2026年5月7日 +- [`genshijin@v1.4.0`](https://github.com/InterfaceX-co-jp/genshijin/releases/tag/v1.4.0)を公開しました +- caveman本家v1.3.0以降の差分(stats receipts / smart installer / cavecrew相当 / cavepack相当 / MCP-shrink)を全項目移植 +- 主な追加: `/genshijin-stats` でリアルセッション削減量+USD推定表示、3 subagent (`genshijin-investigator/builder/reviewer`) で長セッションコンテキスト持続、`genshijin-shrink` MCP middleware、root マルチエージェント installer、ultra-mode code-symbol guard 強化 +- 技術的に面白いトピックを下記「v1.4.0 技術深掘り」に追加([MCP middleware proxy の仕組み](#mcp-middleware-proxy-の仕組み)、[USD換算の見積もり方法](#usd換算の見積もり方法), [subagent 圧縮による長セッション持続](#subagent-圧縮による長セッション持続)) + ## TL;DR - **caveman**: Claude Code向けの英語圧縮スキル。冠詞やフィラーを消してトークン約68%削減 @@ -541,6 +547,192 @@ Claude Code プラグイン機構を使わずに、フックだけを手動導 `genshijin vs 簡潔` の差分こそが、skill 自体が汎用的な terse 指示を超えて削減する純粋な効果量になる。 +## v1.4.0 技術深掘り + +v1.4.0 で本家 caveman v1.3.0 以降の機能をまとめて移植した。中でも実装としておもしろい3つを掘り下げる。 + +### MCP middleware proxy の仕組み + +`genshijin-shrink` は MCP(Model Context Protocol)の **stdio middleware proxy** だ。Claude(or 任意の MCP client)と upstream MCP server の間に挟まり、JSON-RPC レスポンス内の `description` field だけを圧縮する。 + +なぜこれが効くか。MCP サーバーは Claude に「このツールが使えるよ」と教えるとき、`tools/list` という RPC で全ツールのメタデータを返す。これがトークンを食う。例えば Filesystem MCP サーバーは数十のツール × 各 200〜400 トークンの英語 description で **数千トークンを毎セッション開始時に消費**する。 + +genshijin-shrink はそこを削る。 + +``` +Claude ←→ genshijin-shrink (proxy) ←→ upstream MCP server + ↑ + tools/list レスポンスを intercept + description field のみ圧縮 + コード/URL/パス/識別子は byte-for-byte 保護 +``` + +実装で気をつけたポイント: + +1. **stdio line-buffering**:JSON-RPC は1行1メッセージなので両方向で line buffer を入れる。途中で stdin/stdout が部分的に flush されても reassemble する。 +2. **保護トークンの sentinel 置換**:圧縮前に code block / URL / パス / CamelCase 識別子を sentinel 文字列に置換 → 散文部分だけを正規表現で削る → sentinel を元に戻す。これで `useEffect` や `https://...` を絶対に壊さない。 +3. **request side は無変更で pass-through**:upstream に向かう request body は触らない。`tools/call` のレスポンスも触らない(content を mutate すると downstream parsing が壊れるリスクが高い)。**v1 は徹底的に保守的**にして、`tools/list` / `prompts/list` / `resources/list` の `description` だけに介入する。 + +```js +// 保護パターン (mcp-servers/genshijin-shrink/compress.js) +const PROTECTED_PATTERNS = [ + /```[\s\S]*?```/g, // fenced code + /`[^`\n]+`/g, // inline code + /\bhttps?:\/\/\S+/gi, // URLs + /\b[\w.-]*[\/\\][\w.\/\\\-]+/g, // paths + /\b[A-Z][A-Za-z0-9]*(?:_[A-Z][A-Za-z0-9]*)+\b/g, // CONST_CASE + /\b\w+\.\w+(?:\.\w+)*\(\)?/g, // dotted.method() + /[A-Za-z_][A-Za-z0-9_]*\s*\([^)]*\)/g, // function calls + /\b\d+\.\d+\.\d+\b/g, // semver +]; +``` + +LSP(Language Server Protocol)に触ったことがあるエンジニアなら、stdio middleware proxy のパターンは馴染み深いはずだ。**MCP も同じ JSON-RPC ベース**なので、同じ middleware アプローチが効く。MCP エコシステムが今後広がっていくほど、この種の proxy 系ツールの価値は上がる。 + +### USD換算の見積もり方法 + +`/genshijin-stats` は「セッションで $29 削減」みたいな数字を出す。これがどう計算されているか説明する。 + +#### Step 1: 実消費トークンの取得 + +Claude Code はセッションログを `~/.claude/projects//.jsonl` に書き出す。1行1JSON エントリで、assistant メッセージには `usage.output_tokens` が含まれる。 + +```js +// hooks/genshijin-stats.js +function parseSession(filePath) { + const raw = fs.readFileSync(filePath, 'utf8'); + let outputTokens = 0, turns = 0, model = null; + for (const line of raw.split('\n')) { + const entry = JSON.parse(line); + if (entry.type !== 'assistant') continue; + outputTokens += entry.message.usage.output_tokens || 0; + turns++; + if (!model) model = entry.message.model; + } + return { outputTokens, turns, model }; +} +``` + +ここでポイントは「**AI 推定ではなく実ファイルから読む**」こと。Claude 自身に「君何トークン使った?」と聞くと適当な数字を返してくる。フックスクリプトが直接 JSONL を parse して数えるので、数値の信頼性は 100%。 + +#### Step 2: 推定削減量の計算 + +ベンチマークで「genshijin 通常モードは平均 65% 削減」と分かっている。`actual_output = normal_output × (1 - 0.65)` の関係から逆算: + +``` +estimated_normal = actual_output / (1 - 0.65) +estimated_saved = estimated_normal - actual_output +``` + +つまり実出力が 18,000 トークンなら、推定で 51,400 トークン使うはずだったところを 33,400 トークン削った計算になる。 + +#### Step 3: USD 換算 + +Anthropic の出力トークン pricing を model id prefix で照合する: + +```js +const MODEL_OUTPUT_PRICE_PER_M = [ + ['claude-opus-4', 75.00], + ['claude-sonnet-4', 15.00], + ['claude-haiku-4', 4.00], + // ... +]; + +function priceForModel(model) { + for (const [prefix, price] of MODEL_OUTPUT_PRICE_PER_M) { + if (model.startsWith(prefix)) return price; + } + return null; +} +``` + +prefix 照合にしている理由:`claude-sonnet-4-20250514` も `claude-sonnet-4-7` も同じ料金階層なので、point release ごとに table を更新する手間を避ける。新しいモデル世代が出たときだけ entry を追加すれば良い。 + +最終計算: + +``` +estimated_saved_usd = (estimated_saved_tokens / 1_000_000) × price_per_million +``` + +これで「セッションで $0.51 削減」が出る。 + +#### なぜこれが「正直な数字」なのか + +`estimated_saved` は **平均 65%** という前提が成立している場合の見積もり。タスクによっては圧縮率が 40% のこともあるし 80% のこともある。だから出力には常にこう書く: + +> 推定値 = benchmarks/ 平均値由来。実数はタスク依存。 + +実消費(左半分)は 100% 正確。推定削減(右半分)は **事前ベンチマーク統計の適用結果** であってモデルが幻覚で答えた数字ではない。これがさり気ないけど大事。 + +#### Lifetime 集計 + +`.genshijin-history.jsonl` に session 毎のスナップショットを append し、`/genshijin-stats --all` で集計する。**`session_id` で latest-per-session を取る**ことで、同セッション内で何度 `/stats` を叩いてもダブルカウントを避けている: + +```js +const latestPerSession = new Map(); +for (const entry of historyEntries) { + const id = entry.session_id; + const prev = latestPerSession.get(id); + if (!prev || entry.ts >= prev.ts) latestPerSession.set(id, entry); +} +``` + +これは時系列ログを集計するときの定番パターン。Datadog や Prometheus を触ったことがあるなら馴染みの dedup ロジックだ。 + +エンジニアが [`rtk gain`](https://github.com/your-handle/rtk) や `time` コマンドの出力を眺めるのが好きなのと同じで、**自分が削った数字が見えると嬉しい**。`genshijin-stats` も同じ気持ちで作った。 + +### subagent 圧縮による長セッション持続 + +`genshijin-crew` は3つの Claude Code subagent preset。 + +| Subagent | 役割 | +|----------|------| +| `genshijin-investigator` | read-only コード位置特定(haiku model) | +| `genshijin-builder` | 1-2ファイル surgical 編集 | +| `genshijin-reviewer` | severity-tagged レビュー(haiku model) | + +なぜこれが必要か。Claude Code には `Explore`(vanilla)という subagent があって、コードを探させたら散文で結果を返してくる。 + +``` +Sure! I'll search for the safeWriteFlag function. I found it defined in +hooks/genshijin-config.js at line 81. It's an atomic write function that +uses O_NOFOLLOW to prevent symlink attacks. It's called from... +(2,000トークン) +``` + +この 2,000 トークンが **主スレッドのコンテキストに verbatim 注入される**。20回 Explore を叩くと 40,000 トークンが脇の調査ログでコンテキストを食う。長セッションが context exhaustion で死ぬ典型パターン。 + +`genshijin-investigator` は同じ仕事を圧縮形式で返す: + +``` +Defs: +- hooks/genshijin-config.js:81 — `safeWriteFlag` — atomic write w/ O_NOFOLLOW +Callers: +- hooks/genshijin-mode-tracker.js:33,87 +- hooks/genshijin-activate.js:40 +1 def, 2 callers. +(700トークン) +``` + +3分の1のトークンで同じ情報。**delegations が多いほど効く**ので、1セッションで 30 〜 50 回 subagent を呼ぶような長作業(refactoring / migration / 大規模調査)で context budget が大きく持続する。 + +実装上のキモは「**出力契約を厳密に書いた SKILL.md**」だ。subagent に「圧縮して返してね」と頼むだけだと表記揺れが出る。だから出力フォーマットを SKILL.md に明示する: + +``` +出力形式: + — `` — <≤6語メモ> + +3行以上時は1語ヘッダ付与: Defs: / Refs: / Callers: / Tests: / Imports: +0ヒット → No match. +末尾 → 集計: 2 defs, 5 refs. +``` + +これで主スレッド側は `path:\d+` で grep して結果を機械的に拾える。**human-readable と machine-readable の両立**は subagent 設計の難所で、cavecrew はそこをよく解いている。 + +### モデル独自の挙動が必要な領域は LLM に任せ、構造化された結果が欲しい場面は subagent + 出力契約で固める + +これが v1.4.0 で広く適用された設計原則だ。`/genshijin-stats` も同様で、数値計算を Claude にやらせず Node スクリプトに任せ、Claude は表示しか担当しない(フックが `decision: "block"` で文字列を返すだけ)。LLM の周辺ツールを書くときの定石として覚えておくと使い回せる。 + ## まとめ LLMのトークン消費を減らすアプローチには、モデルの切り替え、コンテキストの刈り込み、プロンプトの工夫などがある。caveman / genshijin は「**出力側の文体を制御する**」というシンプルかつ効果的な手法だ。 diff --git a/docs/caveman-diff-analysis.md b/docs/caveman-diff-analysis.md index 9c665eb..f599275 100644 --- a/docs/caveman-diff-analysis.md +++ b/docs/caveman-diff-analysis.md @@ -216,6 +216,57 @@ description: > - [ ] 12. 文言文相当の日本語超圧縮モード(漢文訓読風 or 漢字のみ) +### P4 — 本家 v1.3.0以降 (2026-04-30〜05-01) 差分 + +caveman 本家 commits `56875e8` / `83ec61c` / `e031c1e` で大規模拡張: stats receipts / smart installer / cavecrew / cavepack / MCP-shrink。本家59テスト合格。genshijin v1.4.0 で全項目移植。 + +- [x] 13. `genshijin-stats` — リアルセッショントークン使用量 + 削減見積もり(2026-05-07 完了) + - `/genshijin-stats` 起動。フックが `decision: "block"` で即時表示 + - per-million 価格 USD 換算、`--share` ツイート可能ライン、`--all` / `--since N[d|h]` ライフタイム集計 + - `*.original.md` 検出で input側削減 (memory compress) も計測 + - statusline savings suffix `.genshijin-statusline-suffix` + - [hooks/genshijin-stats.js](../hooks/genshijin-stats.js) · [skills/genshijin-stats/SKILL.md](../skills/genshijin-stats/SKILL.md) + +- [x] 14. ultra-mode code-symbol guard — SKILL.md 極限モード強化(2026-05-07 完了) + - コードシンボル/関数名/API名/エラー文字列は略称化禁止を明示 + - 自動解除条件拡張: 多段手順での fragment順誤読リスク、圧縮自体が技術的曖昧性発生時 + - [skills/genshijin/SKILL.md](../skills/genshijin/SKILL.md) + +- [x] 15. compress fixes — `genshijin-compress` 品質向上(2026-05-07 完了) + - UTF-8 stdout 強制、空入力 / 同一出力ガード、frontmatter cleanup + - [skills/genshijin-compress/scripts/compress.py](../skills/genshijin-compress/scripts/compress.py) + +- [x] 16. cavecrew相当 — `genshijin-crew` 3サブエージェント(2026-05-07 完了) + - `genshijin-investigator` (read-only locator)、`genshijin-builder` (1-2ファイル surgical edit)、`genshijin-reviewer` (severity-tagged finding) + - subagent tool-result が原始人圧縮で約60%縮小 → 主コンテキスト持続 + - [agents/genshijin-investigator.md](../agents/genshijin-investigator.md) · [agents/genshijin-builder.md](../agents/genshijin-builder.md) · [agents/genshijin-reviewer.md](../agents/genshijin-reviewer.md) · [skills/genshijin-crew/SKILL.md](../skills/genshijin-crew/SKILL.md) + +- [x] 17. `genshijin-shrink` MCP middleware proxy(2026-05-07 完了) + - 任意の MCP サーバー wrap → `tools/list` `description` を圧縮 + - コード/URL/パス/識別子は byte-for-byte 保護 + - npm publishable: `npx genshijin-shrink [args]` + - [mcp-servers/genshijin-shrink/](../mcp-servers/genshijin-shrink/) + +- [x] 18. `tools/genshijin-init.js` — マルチエージェント rules 一発投下(2026-05-07 完了) + - Cursor/Windsurf/Cline/Copilot/AGENTS.md に rule 投下 + - sentinel チェック idempotent、`--dry-run` / `--force` / `--only ` + - [tools/genshijin-init.js](../tools/genshijin-init.js) + +- [x] 19. root `install.sh` / `install.ps1` — smart multi-agent installer(2026-05-07 完了) + - Claude Code/Gemini/Codex/Cursor/Windsurf/Cline 検出 → native install + - `--dry-run` / `--force` / `--only` / `--all` / `--minimal` / `--list` + - 既存 `hooks/install.sh` は Claude Code 単独用として残す + - [install.sh](../install.sh) · [install.ps1](../install.ps1) + +- [x] 20. Windows PowerShell tempfile fix(2026-05-07 完了) + - `node -e "..."` 引用符エスケープ問題回避 + - [hooks/install.ps1](../hooks/install.ps1) + +- [x] 21. `/genshijin` 引数ホワイトリスト + symlinked-parent `~/.claude` 対応(2026-05-07 完了) + - 不正引数で flag file silent overwrite 防止 + - `~/.claude` が symlink の場合の immediate parent チェック + - [hooks/genshijin-mode-tracker.js](../hooks/genshijin-mode-tracker.js) · [hooks/genshijin-config.js](../hooks/genshijin-config.js) + ### 更新ルール - 着手時: `[ ]` → `[~]`、コミットハッシュ・PR番号・メモを項目末尾に追記 diff --git a/docs/index.html b/docs/index.html index 0c76b19..6bf0ff8 100644 --- a/docs/index.html +++ b/docs/index.html @@ -4,15 +4,15 @@ genshijin - Claude Code Plugin - + - + - +