コンテンツにスキップ

フック

フックを使用すると、Worktreeのライフサイクル中にコマンドを自動的に実行できます。

フック 実行タイミング 作業ディレクトリ
pre_start Worktree作成後 元リポジトリ
post_start Worktree作成後 新しいWorktree
pre_clean Worktree削除前 現在のWorktree
post_clean Worktree削除後 メインリポジトリ
[hooks]
pre_start = ["echo 'Worktreeを準備中...'"]
post_start = [
"pnpm install",
"pnpm db:migrate"
]
pre_clean = ["git stash"]
post_clean = ["echo 'クリーンアップ完了'"]

すべてのフックコマンドで以下の環境変数が利用可能です:

変数 説明
VIBE_WORKTREE_PATH 作成されたWorktreeの絶対パス
VIBE_ORIGIN_PATH 元リポジトリの絶対パス
[hooks]
post_start = [
"echo 'Worktree作成先: $VIBE_WORKTREE_PATH'",
"echo '元リポジトリ: $VIBE_ORIGIN_PATH'"
]

vibeはフック実行中にリアルタイム進捗ツリーを表示します:

✶ Setting up worktree feature/new-ui…
┗ ☒ Pre-start hooks
┗ ☒ npm install
☒ cargo build --release
⠋ Copying files
┗ ⠋ .env.local
⠋ node_modules/
マーカー 意味
待機中または実行中(開始するとスピナーが回ります)
正常に完了
失敗(赤)。理由が (failed: …) として続きます
中断(淡色)。実行終了時点で未完了のまま

フェーズ行(外側の )自体は結果を持たず、配下のタスクを集約して表示します。未完了のタスクが1つでもあれば 、そうでなく失敗したタスクがあれば (failed: N task(s) failed)、いずれでもなければ になります。

状況 標準出力 標準エラー出力
進捗表示が有効 抑制される 常に表示
進捗表示が無効 標準エラーに出力 常に表示
失敗したフック N/A 常に表示

vibe startの場合:

  1. Worktreeが作成される
  2. [submodules] configs = [...]の場合、指定されたサブモジュールが初期化される
  3. 各サブモジュールの信頼済みpre_start、copyルール、post_startがサブモジュールルート基準で実行される
  4. 親のpre_startフックが元リポジトリで実行
  5. 親のファイル/ディレクトリがコピーされる
  6. 親のpost_startフックが新しいWorktreeで実行

vibe cleanの場合:

  1. pre_cleanフックが現在のWorktreeで実行
  2. Worktreeが削除される
  3. post_cleanフックがメインリポジトリで実行

フックが非ゼロで終了した場合、それはエラーではなく警告です。vibeは Warning: Hook "..." failed: ...を表示し、終了ステータスは0のままです。変わるのは ディレクトリ移動が行われるかどうかで、それはフックがライフサイクルのどこに位置するかで 決まります。

フック 失敗時の動作
pre_start ゲートとして機能:コピーとpost_startはスキップされ、元のディレクトリに留まります
post_start 警告のみ:Worktreeのセットアップは完了しているため、vibeはそのままWorktreeへ移動します
pre_clean ゲートとして機能:Worktreeは削除されず、そのWorktreeに留まります
post_clean 警告のみ:Worktreeは既に削除済みのため、vibeはそのままメインリポジトリへ移動します

これによりpre_startpre_cleanを事前条件チェックとして利用できます。たとえば シークレットVaultへの到達性を検証するpre_startは、セットアップできなかったWorktreeへ 入るのを防ぎます。

ゲートされたvibe startでもWorktreeディレクトリ自体はディスク上に残り、抑止されるのは 移動だけです。同じブランチでvibe startを再実行すると、そのWorktreeが見つかり移動するか 確認されますが、その経路でもゲートは再度実行されます。したがってpre_startが依然として 失敗する場合は、やはり中に入れません。原因を修正すれば、再実行時にゲートされた実行で スキップされたコピーとpost_startも実行されるため、最終的に入るWorktreeは完全に セットアップされた状態になります。

vibe start --claude-code-worktree-hookには留まるべきシェルが存在しないため、 pre_startのゲートをディレクトリ移動の抑止として表現できません。このモードは契約を 維持し(Worktreeパスをstdoutへ出力し、終了ステータスは0)、代わりにゲートが作動した ことを機械可読な固定の1行としてstderrへ出力します。

vibe: pre_start hook failed; worktree is not provisioned

この行は1回の実行につき最大1回、装飾なし(カラーコードなし)で出力され、pre_startの ゲート時のみ現れます。post_startの失敗では通常のWarning: Hook "..." failed: ...が 出るだけです。この行は、受け取ったパスがコピーとpost_startをスキップしたWorktreeを 指していることを示すシグナルとして扱ってください。

2点の注意事項があります。

  • 後述のセットアップ例はコマンドの末尾が2>/dev/nullになっており、 stderrを、したがってこのシグナルも破棄します。ゲートを観測したい場合はこの リダイレクトを外してください。
  • このシグナルはWorktreeを作成する実行に付随します。すでにWorktreeが存在する ブランチに対してフックを再度呼び出すと、フックを再実行せずに既存のパスを返すため、 2回目の呼び出しではシグナルは出力されません。
[hooks]
post_start = [
"pnpm install",
"pnpm build"
]
pre_clean = ["git stash --include-untracked"]
[hooks]
post_start = [
"bun install",
"bun run build"
]
pre_clean = ["git stash --include-untracked"]

データベースマイグレーション

Section titled “データベースマイグレーション”
[hooks]
post_start = [
"pnpm install",
"pnpm db:migrate",
"pnpm db:seed"
]
[hooks]
post_start = [
"docker-compose up -d",
"sleep 5",
"pnpm db:migrate"
]
pre_clean = ["docker-compose down"]

直接サブモジュールに独自のsetupファイルやフックがある場合は、ファーストクラスのサブモジュール設定を使用してください:

[submodules]
configs = ["libs/foo"]

これは新しいWorktree内でgit submodule update --init -- libs/fooを実行し、その後libs/foo/.vibe.tomlを通常のtrust store経由で読み込みます。サブモジュールのcopyルールとフックはlibs/foo基準で解決され、親リポジトリのpre_startフックより前に実行されます。

--no-hooksオプションでフックをスキップできます:

Terminal window
vibe start feat/quick-fix --no-hooks

vibeはClaude CodeWorktreeCreateおよびWorktreeRemoveフックと連携できます。これにより、Claude Codeのデフォルトのgit worktree add動作をvibeのフルワークフロー(フック、CoWファイルコピー、設定を含む)に置き換えます。

Claude Codeのsettings.jsonに以下を追加してください:

{
"hooks": {
"WorktreeCreate": [
{
"hooks": [
{
"type": "command",
"command": "vibe start --claude-code-worktree-hook --quiet 2>/dev/null"
}
]
}
],
"WorktreeRemove": [
{
"hooks": [
{
"type": "command",
"command": "vibe clean --claude-code-worktree-hook --force 2>/dev/null"
}
]
}
]
}
}

Claude CodeがWorktreeを作成する場合(自然言語、isolation: "worktree"、または/worktreeコマンド経由)、vibeがフルライフサイクルを管理します:

WorktreeCreate:

  1. stdinからWorktree名を読み取り(Claude Codeフックプロトコル)
  2. git Worktreeを作成
  3. [submodules] configs = [...]の場合、指定されたサブモジュールを初期化し、信頼済みsetupを実行
  4. 元リポジトリで親のpre_startフックを実行
  5. CoWを使用して親のファイル/ディレクトリをコピー
  6. 新しいWorktreeで親のpost_startフックを実行(例:pnpm install
  7. Claude Code向けにWorktreeパスをstdoutに出力

WorktreeRemove:

  1. stdinからWorktreeパスを読み取り(Claude Codeフックプロトコル)
  2. Worktreeでpre_cleanフックを実行
  3. git Worktreeを削除
  4. メインリポジトリでpost_cleanフックを実行

この連携がない場合、Claude CodeのWorktree作成はgit worktree addのみを実行します。vibeのフックを使用することで、以下が自動的に行われます:

  • 依存関係の自動インストールpnpm installbun installなど)
  • CoWファイルコピー.envnode_modulesなど)
  • カスタムセットアップスクリプト(データベースマイグレーション、Dockerコンテナなど)
  • Worktree削除時のクリーンアップフック