t-wada(テスト駆動開発の第一人者)の考え方で問題を分析すると、フックの数が多いのは症状であって原因ではない。根本原因は「責務の置き場所」が間違っていること。
プランモード(計画を書くための専用モード)には「プランファイル以外のファイルを書かせない」という設計意図がある。ところが plan-viewer は「プランモード中に HTML ファイルを書け」と要求していた。これは設計意図と真っ向から矛盾する。
その矛盾を無理やりフック(自動ドアのセンサーのように、特定の操作に処理を差し込む仕組み)で解決しようとした結果、6層の防壁ができてしまった。
t-wada が好む Kent Beck の言葉に「まず変更を簡単にして、それから簡単な変更をしなさい」がある。HTML 生成の責務を AI からスクリプトに移すことで、フック問題を根本から解消する。
新しい仕組みの流れはこう:
考え方:今ある plan-sync-reminder フック(PostToolUse フック。ファイル書き込みの直後に発火する仕組み)を改造して、「フラグを作る」のではなく「変換スクリプトを呼ぶ」ようにする。
流れ:
plans/xxx.md を書くconvert-plan.sh を呼ぶmarked(マークダウンをHTMLに変換するツール)で HTML に変換~/plan-viewer/ に保存index.html の一覧に自動追加メリット:
デメリット:
必要なもの:marked(npm パッケージ。npm install -g marked で入る)
npm install -g marked — MD を HTML に変換するコマンドラインツール。{{CONTENT}} プレースホルダー付きのテンプレートファイルとして保存する。変換スクリプトがこのテンプレートの {{CONTENT}} を、marked で変換した HTML に差し替える。convert-plan.sh を作成
~/plan-viewer/ に HTML ファイル + index.html 更新。ファイル名から日付とタイトルを抽出し、テンプレートに流し込む。plan-sync-reminder を convert-plan.sh に差し替え。prompt hook(HTML 品質チェック)はAI が手動で plan-viewer スキルを使うときのために残す。plan-impl-gate.sh、plan-bash-gate.sh、plan-exitplan-gate.sh、plan-viewer-stop-check.sh、plan-sync-reminder.sh の5ファイルを削除。考え方:Claude Code とは完全に切り離した「デーモン(バックグラウンドで常に動き続けるプログラム)」を立てて、ファイルの変更を監視する。
流れ:
chokidar(ファイル変更を監視する Node.js ライブラリ)でプラン用ディレクトリを監視~/plan-viewer/ に保存メリット:
launchd(macOS の標準サービス管理)で起動時に自動起動できるデメリット:
plans/ パスを設定ファイルで管理する必要があるこれが一番大事なポイント。今の plan-viewer は AI が「プランの専門用語を噛み砕いて、非エンジニアが読める HTML を書く」という翻訳をしていた。自動変換にすると、この翻訳がなくなる。
対策1:プランを最初から分かりやすく書く(おすすめ)
AI がプランを書く時点で、非エンジニアにも読めるように書かせる。CLAUDE.md に「plans/ に書く MD は非エンジニアでも理解できる文章にすること」と追記する。MDの段階で翻訳済みなら、自動変換でそのまま読めるHTMLになる。
対策2:手動スキルを併用する
重要なプラン(関係者に共有するもの)は、後から手動で「plan-viewer にまとめて」と AI に頼む。plan-viewer スキルは残すので、使いたいときにいつでも使える。自動変換は「速報版」、手動スキルは「清書版」という使い分け。
対策3:将来的にAI APIで自動翻訳する
変換スクリプトの中で Claude API(Anthropic のAIを外部から呼び出す窓口)を使って翻訳させる。ただし API 呼び出しにはコストがかかる。今すぐは不要(YAGNI)。必要になったときに追加する。
今は plan-viewer のローカルサーバーに同じ Wi-Fi 内からアクセスしているが、cloudflared(Cloudflare Tunnel のクライアント。ローカルサーバーをインターネットに公開するツール)を使えば、外出先のスマホからもアクセスできる。
コマンド1つで公開:cloudflared tunnel --url http://localhost:ポート番号
これだけで https://ランダム文字列.trycloudflare.com という URL が発行されて、どこからでもアクセスできるようになる。アカウント登録もいらない。ただし URL はコマンドを止めると無効になる(一時的な公開)。
常時公開したい場合は Cloudflare のアカウントで Named Tunnel(名前付きトンネル)を設定すれば、固定の URL でいつでもアクセスできる。
おすすめは案A(PostToolUse フック方式)+ 対策1(プランを分かりやすく書く)の組み合わせ。
なぜ案A か:t-wada の原則「動くものを最小の変更で作る」に合致する。フック1つ + スクリプト1つ + テンプレート1つ。デーモン管理もない。問題が起きたら案Bに移行すればいい。
なぜ対策1 か:そもそもプランを書く時点で分かりやすくすれば、後工程の翻訳が不要になる。これは「問題が発生しない設計」であり、「問題を検知して対処する設計」より優れている。
見送った選択肢:案Bのデーモン方式は、plan-viewer 以外のファイル監視にも使えるので拡張性は高い。ただし「今必要か?」と問えば答えは No。chokidar は npm install すれば入るので、必要になったときに15分で追加できる。
Cloudflare Tunnel はおまけだが、外出先からスマホで見たいなら導入する価値がある。