Jujutsu ワークフロー
エージェントコーディングにおいて、.jj/ リポジトリが存在する場合は、raw git よりも jj(Jujutsu)を優先してください。jjは優れたローカル変更レイヤーです。Gitはリモート/PR/CI/監査のための正規インターフェースとして残ります。変更は jj で行い、読み取り専用の確認にはGitを使用します。
1. 最初に検出とゲートを行う
${CLAUDE_SKILL_DIR}/scripts/detect_jj_state.sh を実行するか、手動で確認してください:
.jj/が存在する → jjリポジトリ:jjを使用し、rawgitで 変更(mutating)操作を行わない。.jj/かつ.git/が存在する → 同一配置(colocated):変更はjjで行い、読み取りはgitで行う。git index/stagingには触れない。.git/のみ → 通常のGitリポジトリ:指示がない限りjjを導入しない。
references/git-interop.md を参照。
2. エージェントセーフティルール(譲れません)
- 出力コマンドには常に
--no-pagerを指定し、jj config set --user ui.paginate neverを設定する。 - 常に
-mを使用する。エディタ/TUIフォームは絶対に実行しない — barejj describe|commit|squash、jj split(インタラクティブ)、jj squash -i、jj resolve、jj diffeditはエージェントを停止させる。 jjはjjコマンド実行時にのみワーキングコピーをスナップショットし、ファイル書き込みのたびに実行されるわけではない。
references/agent-safety.md を参照。
3. 編集ループ
jj --no-pager status
# ファイルを編集(次のjjコマンドでスナップショットされる)
jj --no-pager diff
jj describe -m "<プロジェクト規則に従ったメッセージ>"
nn new -m "<次の単位>" # 論理単位ごとに1つの変更 — 肥大化したコミットを避ける
混在した変更を非インタラクティブに分割する:jj split <path> -m "<msg>"。references/command-map.md を参照。
4. リカバリ(取り消し可能)
jj --no-pager op log → jj undo(最後の操作)または jj op restore <id>。コンフリクトは第一級オブジェクトです:jj status がフラグを立てます。マーカーを編集して解決し、その後確認してください。references/recovery-playbook.md を参照。
5. Git経由でのハンドオフ
jj git fetch
jj rebase -d <デフォルトブランチ>
jj bookmark create <ブランチ> -r @-
jj git push --bookmark <ブランチ> # 新しいブックマークは直接プッシュされる
保護された/デフォルトブランチには決してプッシュしない。許可されていない限り、公開履歴を書き換えない。gh/glab でPRを開く。references/pr-handoff.md を参照。
6. 並列エージェント
並行するエージェントごとに1つの jj workspace を使用する — ワーキングコピーを共有しない。references/parallel-agents.md を参照。
7. 「完了」前に確認する
${CLAUDE_SKILL_DIR}/scripts/verify_handoff.sh を実行するか、jj --no-pager status、jj --no-pager log --limit 10、jj --no-pager diff --stat、git status --short --branch を報告する。正確なコマンドと出力を報告し、それなしに「完了/テスト済み/準備完了」と主張しない。強制プッシュ、リカバリ、コンフリクトを開示する。
エージェントにとってjjがGitに勝る理由(および使用すべきでない場合):references/why-jj-for-agents.md を参照。