Convert Claude markdown subagent files to Codex CLI TOML format. Parses YAML frontmatter and body, applies model/permission/tool mappings, and outputs to agents/codex/<name>.toml.
日本語の概要は準備中です。原文の説明を表示しています。
新しいフックの雛形(スクリプト + 配線)を本リポジトリの規約どおりに生成する。
イベント選定(PreToolUse / PostToolUse / Stop / SessionStart 等)とブロッキング可否を対話的に決め、 ai-agents/hooks/ か ai-agents/settings/<cli>/hooks/ への配置と、hooks.json / settings.json への配線まで行う。
新しいフックを追加したいときに `/hook-scaffold <フック名> [用途の一言]` で呼び出す。
インストールする前に、エージェントに与えられる指示の中身を確認できます。
新規フックの追加を、スクリプト雛形の生成から配線・検証まで、 本リポジトリの規約どおりに一貫した手順で完了させる。
$ARGUMENTS を以下のように解釈する:
HOOK_NAME。ファイル名は HOOK_NAME.sh)引数なしの場合は対話でフック名と用途を尋ねる。HOOK_NAME は既存に倣い lowercase + ハイフンにする。
ai-agents/hooks/HOOK_NAME.sh と ai-agents/settings/*/hooks/HOOK_NAME.sh の いずれにも存在しないこと を確認する。存在する場合は作成せず中断し、既存スクリプトの修正を案内する。
あわせて既存フックを読み、同種の処理(formatter / lint / guard / notify)が既にないか確認する。 formatter 系は 1 ファイル種別 1 スクリプトで揃っているので、対象拡張子が既存とかぶる場合は新規追加ではなく既存への追記を提案する。
「何をきっかけに走らせたいか」からイベントを選ぶ。現在このリポジトリが配線しているのは以下だけで、他イベントを使う場合は公式ドキュメント(https://code.claude.com/docs/en/hooks)で最新のスキーマを確認する。
| 用途 | claude のイベント | 現行の配線 | 配線ファイル |
|---|---|---|---|
| 起動時の環境チェック | SessionStart | toolchain-doctor.sh | settings.json |
| コンパクション前後の退避 | PreCompact / SessionStart(matcher compact) | context-anchor-save / -restore.sh | hooks.json |
| 毎プロンプトの文脈注入 | UserPromptSubmit | git-state.sh | hooks.json |
| Bash 実行前の遮断 | PreToolUse(matcher Bash) | guard-dangerous-bash.sh | hooks.json |
| ファイル編集後の整形 | PostToolUse(matcher Write|Edit|MultiEdit) | formatter 6 本 | hooks.json |
| 応答終了時のまとめ処理 | Stop | lint-changed.sh ほか | hooks.json |
| 通知 | Notification | notify-macos.sh | settings.json |
| worktree 作成時 | WorktreeCreate | worktree-create.sh | settings.json |
選定時に必ず確認すること:
PreToolUse はブロックできるが PostToolUse はできない。ブロック不可のイベントに強制ロジックを載せると「黙って効かないフック」になる。0 = 正常(stdout が JSON なら構造化出力として解釈される)、2 = ブロッキング(stderr がメッセージ)、それ以外 = 非ブロッキングエラー。hookSpecificOutput の形はイベントごとに違う。使う場合は転記済みの記憶に頼らず、必ず上記ドキュメントで確認する。report-only(報告のみで止めない)で足りるなら、exit 0 + stderr への出力に留めるのが既定。
.claude/rules/hook-authoring.md の判断軸に従い、claude 側の置き場所を決める(以降 HOOK_ROOT)。判断が割れる場合はユーザーに確認する。
| ルート | 選ぶ条件 | 配線先 |
|---|---|---|
ai-agents/hooks | このマシン・このクローンに依存しない(既定) | ai-agents/hooks/hooks.json |
ai-agents/settings/claude/hooks | macOS GUI・ローカル FS レイアウト・ローカル mise のツールチェーンに依存する | settings/claude/settings.json |
サイドカー(設定ファイル等)を読むなら $HOME の絶対パスではなく SCRIPT_DIR 基準にする。plugin として動くときに $HOME/.claude/hooks/ は存在しない。
既定は claude のみ。codex へは次の基準で展開する。cursor / copilot の設定は廃止済み(ADR-0009)。
PreToolUse(matcher Bash)の遮断フック。入力が tool_input.command、遮断が exit 2 + stderr で claude と同じ契約(既存は guard-dangerous-bash)。Stop / SessionStart / WorktreeCreate / macOS 通知など Claude 固有機構に依存するもの。codex 用は ai-agents/settings/codex/hooks/ に claude 版とは別の自前コピーを置く。判定部が同じでも共有しない(claude 側の仕様変更に引きずられないため)。
HOOK_ROOT/HOOK_NAME.sh を既存フック準拠で作る。定型は次のとおり
(インデントは既存フックに合わせてタブにする。以下は markdownlint の hard-tab 検査を避けるためスペース表記にしてあるので、書き出し後に shfmt -w を通して揃える):
#!/bin/bash
# mise-managed tools (non-interactive contexts do not run mise activate)
export PATH="${MISE_DATA_DIR:-$HOME/.local/share/mise}/shims:$PATH"
# stdin から JSON を読み込む
INPUT=$(cat)
FILE_PATH=$(echo "$INPUT" | python3 -c "
import sys, json
data = json.load(sys.stdin)
print(data.get('tool_input', {}).get('file_path', ''))
")
# 対象外なら何もせず抜ける
if [[ "$FILE_PATH" != *.EXT ]]; then
exit 0
fi
if ! COMMAND "$FILE_PATH" 2>&1; then
echo "[HOOK_NAME] fail: $FILE_PATH" >&2
exit 1
fi
JSON は既存エントリの末尾に追記する形にし、並び順の慣習(formatter は既存の並びに続ける)に従う。
HOOK_ROOT が ai-agents/hooks): ai-agents/hooks/hooks.json の hooks.<Event> に
{"type": "command", "command": "\"${CLAUDE_PLUGIN_ROOT}/hooks/HOOK_NAME.sh\""} を追記する。
PostToolUse なら既存の matcher: "Write|Edit|MultiEdit" グループの hooks 配列に足す(新しいグループを作らない)。HOOK_ROOT が ai-agents/settings/claude/hooks): ai-agents/settings/claude/settings.json の
hooks.<Event> に {"type": "command", "command": "~/.claude/hooks/HOOK_NAME.sh"} を追記する。ai-agents/settings/codex/hooks.json の hooks.PreToolUse(matcher: "^Bash$")に
{"type": "command", "command": "bash \"$HOME/.codex/hooks/HOOK_NAME.sh\"", "timeout": 10} を追記する
(timeout は秒)。編集後、触った JSON すべてを jq . <file> にかけてパースできることを必ず確認する。
mise.toml の claude-settings-copy / codex-settings-copy は
ai-agents/scripts/copy-entries.sh でディレクトリ単位に配るため、
既存ディレクトリにファイルを 1 本足すだけなら mise / copy-entries.sh の変更は不要。
新しいディレクトリ階層を導入する場合のみタスク追加を検討する。この前提自体を毎回確認する。
ai-agents/hooks/ に置いたフックは plugin(ai-agents@my-pde)と claude-settings-copy の
両方から配られ、ローカルでは二重に発火する。移行期の既定の挙動なので、そのつもりで
report-only か冪等かを設計する。
以下を実行し、エラーを潰してから完了とする。
chmod +x されていること(既存フックに合わせる)shfmt -d <script> と shellcheck <script>(mise run lint:shell で一括でも可)jq . で配線先 JSON がパースできることecho '{"tool_input":{"file_path":"/tmp/x.sh"}}' | ./HOOK_NAME.shmise run settings-copy で配布される旨を案内する(codex に配線した場合は、配布後に Codex の /hooks で信頼レビューが要る旨も添える)claude --debug 等で行う旨を案内するjq での妥当性確認を飛ばさない。disable-model-invocation: true を付けている。明示呼び出し専用。agents-lint 系の役割で、そちらには踏み込まない。まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Convert Claude markdown subagent files to Codex CLI TOML format. Parses YAML frontmatter and body, applies model/permission/tool mappings, and outputs to agents/codex/<name>.toml.
日本語の概要は準備中です。原文の説明を表示しています。
Create or update a Markdown blog draft from recent work and export it with `YYYY-MM-DD_slug.md` naming. Output directory can be set via environment variable or CLI option; if missing, ask the user and pass it explicitly.
日本語の概要は準備中です。原文の説明を表示しています。
変更をコミットしてドラフトPRを作成する一連のGit/ghワークフロー。ユーザーが「コミットして」「PR作って」「draft PR」等を求めたときに使用し、status/diff確認・命令形コミット・push・gh pr create --draft(--assignee hodanov)まで実行する。ユーザーの明示リクエストが無くても、実装完了後にcommitやPRが必要になった場面(dev-workflowのcommitフェーズ等)では必ずこれを使う。`git commit` や `gh pr create` を単体でBash直接実行しない。
1 つの作業ツリーに混ざった差分を、変更理由ごとの意味単位のコミットへ分割する。ユーザーが「コミットを分割して」「意味単位で分けて」「commit-split」等を求めたとき、または機能追加・付随リファクタ・設定/ドキュメント修正が 1 コミットに混在していると気づいたときに使用する。分割案を提示して承認を得てからステージし、コミットごとに単独で成立することを確認する。メッセージ規約・push・PR の作成は commit-and-draft-pr へ委譲する。
gitleaks + pre-commit を使ってローカルコミット時のクレデンシャル混入を機械的にブロックする。「クレデンシャル漏洩防止」「シークレット混入対策」「gitleaks」「pre-commit シークレット」「credential leak prevention」に言及した場合に使用する。
依存パッケージ(Go modules / npm / Terraform provider / GitHub Actions / pre-commit 等)の アップグレードを、outdated 検出 → CHANGELOG・破壊的変更の確認 → 更新 → lint/test 検証 → コミットまで一連の手順で安全に適用する。「依存更新」「パッケージを上げて」「dependency update」 「go get -u」「npm update」「provider を上げる」等に言及されたときに使用する。