# 原稿の形式を確認するHook（練習用）

macOS/Linuxのターミナル、Node.js、セットアップ済みのClaude Codeを前提にしています。
この検査は読み取り専用です。題名・本文・出典欄を調べ、内容の真偽や権利は判定しません。

## 1. 新規フォルダを準備する

本番や既存Gitプロジェクトの外で実施します。まず `node --version` と `claude --version` が表示されることを確認してください。
下のコマンドは一行ずつ実行し、失敗したらそこで止めます。

```sh
mkdir 0ku-hooks-practice
cd 0ku-hooks-practice
pwd
```

「既に存在する」と出たら既存フォルダを使わず、別の新しい名前にしてください。
配布ファイル `check-draft.mjs`、`settings.example.json`、`draft.md` をこのフォルダへ保存します。
HTML保存ではなくリンク先のテキストを同名で保存し、拡張子が `.txt` へ変わっていないことも確認します。

## 2. 手動で正常と異常を確認する

```sh
node check-draft.mjs --check
```

正常時は `0KU OK`、終了値0です。テキストエディタで `draft.md` の出典見出しとその本文を取り除き、同じコマンドを再実行します。
`0KU INVALID: 不足: 出典`、終了値1を確認します。`echo $?` は直前のコマンドの終了値を表示します。
空の出典欄も不備です。出典を戻し、再びOKになることを確かめます。
検査不能は `0KU ERROR`、終了値2です。原稿がない場合などに発生します。

## 3. 新規プロジェクトだけへ登録する

既存の `.claude/settings.json` を上書きしないでください。本例は新規フォルダ専用です。
次の2行は一行ずつ実行します。`mkdir` が既存の `.claude` を検出したら、コピーをせず別の新規フォルダから始めます。

```sh
mkdir .claude
cp -n settings.example.json .claude/settings.json
```

設定の `PostToolUse` は編集後、`Edit|Write` はClaude Codeの編集ツールを意味します。
`CLAUDE_PROJECT_DIR` はClaude Codeが渡すプロジェクトの場所です。空白を含む場所のため引用符を付けています。
コマンド例はmacOS/Linux用です。WindowsはWSLでこの手順を使うか、公式のWindows向け設定を確認してください。

## 4. 実際のツールで発動を確認する

```sh
claude --debug-file hook-debug.log
```

新規フォルダ内で起動し、内容を確認したうえで必要な確認画面に従います。
Claude Codeで `/hooks` を入力し、PostToolUseに `Edit|Write` と配布スクリプトが表示されることを確認します。
認識されなければ保存場所・JSON構文を見直し、セッションを開始し直します。

最初に次を依頼します。

> draft.mdを読み、Editツールで10時を11時へ変更してください。ほかの行は変更せず、Hookから受け取った結果を報告してください。Bashは使わないでください。

次に、異常を作ります。

> 検出の練習です。Editツールでdraft.mdの出典見出しと本文だけを取り除いてください。Hookの結果を報告し、自動修正はせず、そこで終了してください。

正常時の `0KU OK` と異常時の `0KU INVALID` を `hook-debug.log` のHook出力で確認します。
成功時の表示が会話に出ない場合もあるため、AIの返答だけで判断しません。
最後に、Writeツールで正常な見本と同じ内容をdraft.mdへ保存するよう頼み、OKへ戻ることを確認します。
手動の `node check-draft.mjs --check` も再実行します。

PostToolUseはすでに終わった編集を取り消しません。JSONの `decision: block` は不備をClaudeへ通知するものです。
公開や次の操作を禁止する機構ではありません。人が修正・再検査してから成果物を採用します。
Bashや別のエディタによる編集ではこの設定は発動しません。Readは対象外、draft.md以外のEdit/Writeは `0KU SKIP` です。
Hookモードの終了値0はJSONを返せた意味です。合否はOK/INVALID/ERRORで読みます。

## 5. 原因を切り分ける

- /hooksにない：新規プロジェクトの `.claude/settings.json` とJSON構文を確認します。
- nodeが見つからない：Claude Codeを起動するターミナルでも `node --version` を確認します。
- ERROR：原稿名、保存場所、入力の形式を確認します。成功扱いにはしません。
- 手動ではOK、Hookが出ない：実際のツールがEdit/Writeか確認し、デバッグログを見ます。
- 停止する：登録した項目を `/hooks` で確認し、新規練習設定のPostToolUse項目だけを外して再起動します。

ログには作業内容が含まれることがあるため、本教材の架空資料だけで試してください。

公式資料：
https://code.claude.com/docs/en/hooks-guide
https://code.claude.com/docs/en/hooks
確認日：2026-10-06
