⚙️CLAUDE.md + hook で「毎回・自動」にする
ここが本題。上のプロンプトを毎回手で打たなくても、プロジェクトに仕込めば勝手に走ります。
レベル1(CLAUDE.mdだけ)→ レベル2(hookで自動再生成)の順にどうぞ。
レベル1 — CLAUDE.md に貼るだけ(hook不要)
プロジェクト直下の CLAUDE.md(無ければ新規作成)に、この節を足すだけ。以降、作業のたびに Claude Code が自分でHTMLを書き出します。
▎<プロジェクト>/CLAUDE.md に追記
## 成果物の見える化ルール(HTMLプレビュー)
作業(1タスク・1機能・1調査)が一区切りしたら、その進捗を
**Markdownの長文ではなく、1枚のHTMLダッシュボード**として書き出す。
- 出力先: `progress/status.html`(毎回このファイルを上書き。履歴は git に任せる)
- 内容: 全体の進捗% / やったこと(チェックリスト)/ 残タスク / 次の一手 / 詰まり
- 1ファイル自己完結(外部CDN・外部フォント・外部画像を使わない)
- 配色は落ち着いたライトテーマ1つに固定し、毎回同じ見た目にする
- 事実に基づく。分からない所は「未確認」と書く(それらしく埋めない)
レベル2 — Stop hook で「作業のたび自動再生成」
HTMLをスクリプトで組み立てている場合(実ファイルを読んでダッシュボード化する等)、そのビルドを Stop hook に載せると、Claude Code が応答を返すたびに再生成されます。開きっぱなしのタブが自動更新に。まず .claude/settings.json にこう書きます。
▎<プロジェクト>/.claude/settings.json
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "bash \"$CLAUDE_PROJECT_DIR/.claude/hooks/regen-preview.sh\"",
"async": true,
"timeout": 60,
"statusMessage": "HTMLプレビューを再生成中…"
}
]
}
]
}
}
そして再生成スクリプト .claude/hooks/regen-preview.sh。120秒ガード(毎ターン走っても軽い)と常に exit 0(失敗してもセッションを止めない)がコツです。build-preview.py の中身は「実ファイルを読んで status.html を吐く」自作ビルダーに差し替えてください。
▎.claude/hooks/regen-preview.sh(chmod +x を忘れずに)
#!/bin/bash
# HTMLプレビューの自動再生成(Stop / SessionStart hook から async 呼び出し)
# - 120秒以内に再生成済みならスキップ(毎ターン走っても軽い)
# - 失敗してもセッションを止めない(常に exit 0)
set -u
ROOT="${CLAUDE_PROJECT_DIR:-$(pwd)}"
OUT="$ROOT/progress/status.html"
LOG="$ROOT/.claude/hooks/regen-preview.log"
[ -f "$ROOT/build-preview.py" ] || exit 0 # ← 自作ビルダーが無ければ何もしない
if [ -f "$OUT" ]; then
now=$(date +%s)
mt=$(stat -f %m "$OUT" 2>/dev/null || stat -c %Y "$OUT" 2>/dev/null || echo 0)
[ $((now - mt)) -lt 120 ] && exit 0
fi
{
echo "--- $(date '+%Y-%m-%d %H:%M:%S') regen-preview"
/usr/bin/python3 "$ROOT/build-preview.py"
} >> "$LOG" 2>&1 || true
exit 0
※ レベル2は「HTMLをスクリプトで作る」派向け。まずはレベル1(CLAUDE.mdだけ)で十分効果があります。
※ 同じ regen-preview.sh を SessionStart hook にも足すと、セッション開始時にも最新化されます。