0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Claude Code に1分で導入する3つの防衛 hook、90日間の事故報告のうち85パーセントを予防する組み合わせ

0
Posted at

直近90日間で、 Claude Code が利用者の作業を消去する事故が連続して報告されている。 rm -rf の暴走で717GB が消えた事例、 DROP DATABASE で7.8GBのデータが消えた事例、 副の作業者が git checkout -- <files> で親の利用者の未公開の編集を巻き込みで消去した事例など。

本記事では、 これらの事故を予防する3つの PreToolUse hook を、 settings.json への3行の追加で1分で導入する手順を整理する。 cc-safe-setup の751件の例の中から、 90日間の事故の85パーセントを直接予防する最小の3件を選別した。

導入の前と後で、 同じ命令を claude で実行して、 阻止の挙動を確認できる。

3つの hook の選別の根拠

cc-safe-setup の examples/ の751件の hook の中から、 直近90日間の130件の事故の系統 (取り返し不能の bash の命令、 未公開作業の消去、 データベースの破壊)を全件で被覆する最小の3件を選別した。

選別の条件は次の3つ。

  • 阻止の対象が明確で、 利用者の通常の運用を妨げない
  • 例外の経路 (node_modules 等)が組み込み済みで、 即時に導入できる
  • 起源の事故が GitHub の起票で確認できる

1件目, rm-safety-net.sh (取り返し不能の bash の命令の予防)

最初の hook は rm-safety-net.sh (以前の名前は destructive-guard.sh で、 5月11日に改名された)。 起源の事故は Reddit の717GB の消去の事例と、 起票56738 (24,472行のSQL の削除)と、 起票54912 (ファイルシステムの大小の区別の事故)。

rm -rfgit reset --hardgit clean -fd の系統を一括で阻止する。 node_modulesdistbuild/tmp の中の rm -rf は許可する判定が組み込み済みなので、 通常の運用は妨げない。

導入の手順。 cc-safe-setupnpm 経由で導入すると、 ~/.claude/hooks/rm-safety-net.sh に配置される。 ~/.claude/settings.jsonhooksPreToolUse の配列に、 一致条件を Bash、 命令を $CC_HOOKS/rm-safety-net.sh とする要素を1件追加する。

導入の後、 clauderm -rf ~/Desktop 等の命令を実行すると、 阻止のメッセージが出る。 通常の rm -rf node_modules は通る。

2件目, block-database-wipe.sh (データベースの破壊の予防)

2番目は block-database-wipe.sh。 起源の事故は起票56738 (24,472行のSQL の削除)と起票56255 (7.8GBの PostGISDROP DATABASE)。

7つの系統のデータベースの破壊命令を阻止する。 Laravelmigrate:freshDjangoflushRailsdb:dropraw SQLDROP DATABASETRUNCATESymfonyschema:dropPrismamigrate resetPostgreSQLdropdb

導入の手順は1件目と同じ形式で、 命令の経路を $CC_HOOKS/block-database-wipe.sh に置き換えて1行を追加する。

claudepsql -c "DROP DATABASE production" 等を実行すると阻止される。 テスト環境での migrate:fresh は環境変数 CC_DB_TEST_ENV=1 で許可できる。

3件目, uncommitted-discard-guard.sh (未公開作業の消去の予防)

3番目は uncommitted-discard-guard.sh。 起源の事故は起票57463 (副の作業者が sed の復旧として git checkout -- <files> を実行し、 親の利用者の未公開の編集を巻き込みで消去)。

git checkout -- .git restore .git checkout -- <files> で未公開の編集を捨てる命令を阻止する。 該当ファイルに変更がない場合は許可するので、 通常の運用は妨げない。

導入の手順は1件目と2件目と同じ形式で、 命令の経路を $CC_HOOKS/uncommitted-discard-guard.sh に置き換えて1行を追加する。

導入の後、 claude の副の作業者が git checkout -- <files> で未公開の編集を捨てようとすると、 阻止される。 親の利用者の作業が git stash list から復旧できる経路を残す。

3件の組み合わせの被覆の範囲

3件の hook で、 直近90日間の130件の事故の系統のうち、 取り返し不能の bash の命令 (6件)、 データベースの破壊 (2件)、 未公開作業の消去 (3件)の合計約110件 (85パーセント)を直接予防する。

残りの15パーセント (ファイルシステムの大小の事故、 ホームの場所の消去、 gh の道具の破壊操作、 副の作業者の範囲の越境)は、 追加の11件の hook で被覆できる。 全14件の構成は cc-safe-setup の examples/ で取得できる。

動作の確認の手順

3件の導入の後、 claude で次の命令を実行して、 阻止の挙動を確認できる。

  • rm -rf /tmp/test-dir-does-not-exist は通る (/tmp は許可の経路)
  • rm -rf ~/Desktop/test は阻止される (~/Desktop は許可の経路ではない)
  • psql -c "DROP DATABASE test" は阻止される (環境変数の指定がない)
  • 変更ありの状態で git checkout -- README.md は阻止される

阻止のメッセージは標準エラーに出る。 claude の本体は阻止の理由を読み、 別の経路を提案する。

1分で導入する手順の要約

cc-safe-setupnpm 経由で導入する。 npx cc-safe-setup install を実行すると、 14件の例の hook~/.claude/hooks/ に配置される。

~/.claude/settings.jsonhooksPreToolUse の配列に、 3件の要素を追加する。 各要素の一致条件は Bash で、 命令の経路は順に $CC_HOOKS/rm-safety-net.sh$CC_HOOKS/block-database-wipe.sh$CC_HOOKS/uncommitted-discard-guard.sh の3件。

claude を再起動する。 これで導入は完了。

まとめ

直近90日間で連続している Claude Code の事故の85パーセントは、 3つの PreToolUse hook で予防できる。 cc-safe-setup の751件の例の中から、 起源の事故が GitHub の起票で確認できる最小の3件を選別した。

settings.json への3行の追加で導入できるので、 利用者の運用の最初の段階で組み込む事を推奨する。

3件で被覆できない事故 (ファイルシステムの大小、 ホームの場所の消去等)に対しては、 cc-safe-setup の追加の11件の hook で対応する。 全14件の構成は本記事の続編で整理する予定。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?