自分はエンジニアではない。でも Claude Code を使って自分でプロダクトを作っている。
いわゆる vibe-coding だ。AIに指示を出して、コードを書かせて、動くものを作る。便利な時代になった。
でも一つ、ずっと引っかかっていることがある。
AIが出してくる plan(設計計画)を見ても、専門用語だらけで「まあ、いい感じにやってくれてるんだろう」で流してしまう。これが積み重なると、自分のプロダクトなのに中身がブラックボックスになる。
vibe-coding の「vibe」な部分 — つまり「雰囲気でやる」部分 — をできるだけ減らしたい。理解した上で判断したい。
plan-viewer は、Claude Code の plan mode で出てきた設計計画を非エンジニアでも読める HTML への変換を自動チェックで強制し、スマホで確認できるようにするプラグインだ。
スマホで読める。Zenn のダークテーマ「っぽい」デザイン
やってることはシンプルで:
「後で読もう」は一生読まない。自分のことは自分がよく分かっている。だから「仕組みとして強制する」のが大事だ。その仕組みについては後で詳しく書く。
ターミナルの前にいるときは「作業モード」で、つい「OK、進めて」と流してしまう。
スマホで読むと、物理的にターミナルから離れるので「読解モード」に切り替わる。ソファで読む、散歩中に読む。すると「ここ、なんで必要なの?」「この説明わからん」が自然に出てくる。
AI が出す plan はこういう文章だ:
dependency array に userId を追加する。auth.ts の validateToken を修正する。API エンドポイントを追加する。
非エンジニアの自分にはこれが分からない。何のことだ。
plan-viewer を通すと、こうなる:
dependency array(変更を監視する対象リスト)にuserIdを追加する。これにより、ユーザーが切り替わったときに画面が正しく更新される。auth.ts(ログイン認証を担当するファイル)のvalidateToken(トークンが正しいか検証する関数)を修正する。
API(プログラム同士が会話する窓口)エンドポイントを追加する。このエンドポイントがないとスマホアプリからデータを取得できない。
変わったのは3点:
これだけで「何をやっていて、なぜそれが必要なのか」が分かるようになる。
vibe-coding の問題は「理解せずに進める」ことだ。
動くものは作れる。でも:
plan-viewer を挟むことで、毎回の設計判断を「理解してから承認する」習慣が強制される。vibe が理解に変わる。
完全にコードを読めるようにはならない。それはエンジニアの仕事だ。でも「何をやっているか」「なぜそれが必要か」の概念レベルの理解は、プロダクトオーナーとして最低限必要だと思っている。
さっき「翻訳を強制する」と書いた。その仕組みを説明する。
Claude Code には hook という機能がある。特定の操作が実行される直前や直後に、別の処理を自動で差し込める仕組みだ。
plan-viewer では PreToolUse hook を使っている。「Pre(前)+ ToolUse(ツール実行)」、つまり「ツールが実行される前に発火するフック」だ。具体的にはこう設定している:
ExitPlanMode(plan を確定する操作)index.html(一覧ページ)が直近2分以内に更新されているかチェックexit 2 を返してブロック。plan を確定できないつまり「翻訳 HTML を作らないと plan を確定できない」という制約が、仕組みとして埋め込まれている。意志の力に頼らない。仕組みで解決する。
スマホで読んでいて「ここ分からない」と思ったら、テキストを選択して質問を送れる。
テキストを選択→質問を入力→送信。スマホ上で完結する
送った質問は JSON ファイルに保存される。次に Claude Code を開いたとき、そのファイルを読ませれば「ここの説明をもっと分かりやすくして」と指示できる。
一人で vibe-coding していると、分からないことを言語化する機会がない。アノテーション機能がその機会を作ってくれる。
テキスト選択でフィードバックを送るUI体験は agentation から着想を得た。
4行で使い始められる。外部ライブラリのインストールは不要で、Python の標準機能だけで動く。
サーバーを起動すると、同じ WiFi に繋がったスマホのブラウザから http://<PCのIPアドレス>:8765/ でアクセスできる。特別なツールは不要だ。PCのIPアドレスはターミナルで ipconfig getifaddr en0 を実行すれば分かる(macOS の場合。Wi-FiのIPだけが表示される)。
ただし、カフェなど公共の WiFi に繋がっている状態だと、同じ WiFi に繋いでいる人なら plan を読めてしまう。
だからサーバーはデフォルトで PIN 認証がかかるようになっている。起動するとランダムな4桁 PIN がターミナルに表示されるので、スマホで初回アクセス時にテンキーで入力するだけだ。
--pin 1234 で好きな PIN を固定することもできるし、自宅 WiFi なら --no-pin で解除もできる。
外出先から自宅にある PC にアクセスしたい場合は、Tailscale(個人なら無料で使えるVPN。通信の盗聴も防げる)を入れておくと、WiFi が違ってもスマホから PC にアクセスできる。カフェや移動中でも plan を読めるようになる。
OSS 公開にあたって、2つの AI(OpenAI の Codex と Claude)に独立してセキュリティ監査をさせた。実際に使ったプロンプトはこんな感じだ:
このリポジトリを「ネット上で見つけてインストールする第三者」の視点でセキュリティ監査してください。Critical/High/Medium/Low で分類し、具体的な修正案を出してください。
「え、自分で作ったものを自分で監査できるの?」と思うかもしれないが、AI を2つ使って「ダブルチェック」させるのがポイントだ。1つの AI だけだと見落としがある。2つが独立して同じ問題を指摘したら、優先的に対処すべき問題だと判断できる。ただし両方が見落とす可能性もある点は留意が必要だ。
実際に見つかった問題の例:
非エンジニアが vibe-coding で作ったものをそのまま公開すると、こういうセキュリティ穴が残る。「AI に監査させる」は、非エンジニアでもできる品質管理の手段だ。
/plan-viewer:serve はデフォルトで PIN 認証がかかる(5回間違えると1分間ロック)。PIN はカジュアルなアクセス防止であり、通信の盗聴までは防げない。確実に守りたいなら Tailscale 経由で使おう。自宅 WiFi なら --no-pin で解除できる。
正直、このプラグインの価値は技術じゃなくて文章ルールにある。
AI に「非エンジニア向けに書いて」と指示するだけでは、出力は毎回ブレる。ルールを具体化しないと AI は「なんとなく優しい文章」しか書かない。
plan-viewer の SKILL.md(AI への指示書)に書いたルールの一部:
・専門用語は初出時に括弧で簡潔に解説し、用語集ページへリンクする
・括弧解説の後に「なぜ必要か」を1文で補足する
・比喩で終わらず、比喩から実際の概念への橋渡しをする
・ファイル名・関数名が出てきた場合、その役割を括弧で解説する
・実装の説明は概念レベルに留める(コードは見せない)
「括弧解説 + なぜ必要か」。このパターンを徹底するだけで、AI の出力が劇的に変わる。plan-viewer を使わなくても、CLAUDE.md にこのルールを書くだけで効果がある。
GitHub: https://github.com/ramenumaiwhy/plan-viewer-plugin
「雰囲気で作る」を卒業したい非エンジニアの方、ぜひ試してみてほしい。
まずはこの記事のURLをあなたの Claude Code に読ませて、「このプラグインを分析して」と聞いてみてほしい。それ自体が vibe-coding に「理解」を足す第一歩になるはずだ。