Jujutsu 工作流
对于代理编码,当存在 .jj/ 仓库时,优先使用 jj (Jujutsu) 而非原生的 git——它是更优秀的本地变更层。Git 保留为规范的远程/PR/CI/审计接口:使用 jj 进行变更,使用只读 Git 进行验证。
1. 检测与拦截优先
运行 ${CLAUDE_SKILL_DIR}/scripts/detect_jj_state.sh,或手动检查:
- 存在
.jj/→ jj 仓库:使用jj,绝不使用git进行变更性操作。 - 同时存在
.jj/和.git/→ 协同仓库:使用jj进行变更,使用git读取,绝不触及 git 索引/暂存区。 - 仅存在
.git/→ 纯 Git 仓库:除非被要求,否则不引入jj。
2. 代理安全规则(不可协商)
- 输出命令始终使用
--no-pager;设置jj config set --user ui.paginate never。 - 始终使用
-m。绝不运行编辑器/TUI 表单——裸jj 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 "<项目规范消息>"
j new -m "<下一个单元>" # 每个逻辑单元一个变更——避免一个大提交
非交互式拆分混合变更: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. 并行代理
每个并发代理一个 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。