Claude Code のプランを HTML で書かせて cmux ブラウザで確認する

The unreasonable effectiveness of HTML という記事を教えてもらった。Claude Code にプランを Markdown ではなく HTML で書き出させると、構造が見やすくなるし共有もしやすいという話。

記事の最後にこういう一節がある。

As Claude takes on more, I'd noticed I was reading plans less closely, and I wanted a way to stay engaged with its choices rather than just hand them off.

Claude に任せる範囲が広がるほど、出てきたプランをちゃんと読まなくなる——というのは自分もまさに感じていたところだった。

トークン・コンテキストの消費について気になったが、 これについてはこう書かれていた。

Isn’t it less efficient?
While Markdown often uses fewer tokens, I’ve found that the added expressiveness of HTML and the much higher likelihood of me reading it means I get overall better output. With the 1MM context window in Opus 4.7, the increased token usage is not really noticeable in the context window.

まあそういうものか、と納得。試しにプランを HTML で書かせるようにしてみた。


やりたかったこと

  • Claude Code にプランを .html で出力させる
  • cmux の右ペインのブラウザで HTML としてレンダリングされた状態で見る
  • Chrome など外部ブラウザに飛ばない

設定

1. CLAUDE.md に追加

## Planning

plan mode に入る/更新する/抜ける時は `plan-html` skill を必ず参照する。

2. plan-html スキルを作成

---
name: plan-html
description: Output the plan-mode plan as a standalone HTML file and (when running under cmux) open it in a cmux browser surface for review. Use whenever entering plan mode, updating an in-progress plan, or about to call ExitPlanMode.
---

# Plan as HTML

plan mode で提示するプランは Markdown ではなく HTML ファイルとして書き出す。
ExitPlanMode の本文には要約だけ載せ、詳細は HTML を参照させる。

## なぜ HTML か

表・SVG・リンク・折りたたみ・色分け・チェックリストなどが使え、
Markdown より情報密度と可読性が高い。
参考: https://claude.com/blog/using-claude-code-the-unreasonable-effectiveness-of-html

## 出力規約

- 出力先: `~/.claude/plans/<slug>.html`
  - slug は同ディレクトリの既存ファイル命名規則 (例: `ai-ai-3-dazzling-chipmunk`) に合わせる
  - 既存の `.md` プランと並走するときは同じ slug の `.html` を作る
- ファイルは単独で開ける完全な HTML (`<!doctype html>` から `</html>` まで)
- インライン CSS のみ。外部 CDN や外部フォントへの依存は禁止 (オフラインで開けるように)
- セクション構成: `Goal` / `Context` / `Approach` / `Steps` / `Risks` / `Open Questions`

## ExitPlanMode との関係

ExitPlanMode のテキストには必ず次を含める (`$HOME` は実パスに展開した値で書く):

```
詳細プラン: file://$HOME/.claude/plans/<slug>.html
```

そのうえで 3〜6 行の要約を書く。長い説明は HTML 側に寄せる。

## cmux 連携

環境変数 `CMUX_BUNDLE_ID` が定義されている (= cmux 配下で実行されている) ときのみ以下を行う:

### 初回出力時

```bash
cmux --json browser open "file://$HOME/.claude/plans/<slug>.html"
# 返ってきた surface:N を以降の更新でも使い回す
```

surface 番号は会話のメモとして覚えておく (ファイル名と紐付けて保持)。

### プラン更新時

同じ surface を再 navigate してリロードする (新規タブを開かない):

```bash
cmux browser surface:N open "file://$HOME/.claude/plans/<slug>.html"
```

`open` を同じ URL で再実行すれば該当 surface が再読込される。
新しいタブを増やさないこと。

### `CMUX_BUNDLE_ID` が未定義の環境

HTML 出力だけ行い、ブラウザ操作はスキップする。
ユーザーに「`file://...` を開いてください」と一行案内する。

## やらないこと

- plan モードを抜けた後の進捗報告を HTML に書き戻すこと (HTML は計画のスナップショット)
- 複数の `surface:` を同時に開くこと
- ExitPlanMode 本文に HTML の中身を丸ごとコピペすること (パスだけでよい)

結果

Claude Code がプランを書いた直後に自動で cmux のブラウザペインが開き、HTML としてレンダリングされた状態で表示される。プランが更新されるとリロードもかかる。

cmux のスクリーンショット。左ペインでclaude codeのプラン情報がテキストで表示されており、右ペインにはその内容がHTMLで表示されている。

詰まったこと(備忘録)

plain text で表示される

  • cmux 0.64.5 で openSupportedFilesInCmux(デフォルト true)が追加された
  • オンだと file:// リンクのクリックが cmux の「ファイルプレビューペイン」に渡る
  • プレビューペインは HTML をレンダリングせずソースをテキスト表示する → plain text に見える

openSupportedFilesInCmux: false にすると Chrome で開く

  • plain text を直そうと false にしたら、今度は OS のデフォルトブラウザ(Chrome)に渡るようになった
  • 「Open Terminal Links in cmux Browser」はチェック済みだったが効かない
  • file:// はホスト名を持たないので Host Whitelist でも捕捉できない

解決の気づき

クリックで開こうとしていたのが間違いで、cmux browser open "file://..." を直接叩けば cmux ブラウザに渡り HTML として正しくレンダリングされる。CLAUDE.md でエージェントに cmux browser open を実行させる形にしたら、settings.json の変更も一切不要になった。

No comments yet