Skip to content

Commit b2db43c

Browse files
committed
docs: tighten best-of-both-worlds conflict workflow
1 parent b76da07 commit b2db43c

1 file changed

Lines changed: 92 additions & 19 deletions

File tree

  • .claude/skills/best-of-both-worlds

.claude/skills/best-of-both-worlds/SKILL.md

Lines changed: 92 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
---
22
name: best-of-both-worlds
3-
description: "This skill should be used when the user asks to sync upstream `caozhiyuan/dev` (previously `caozhiyuan/all`, now removed upstream) into the buffer branch `czy-all`, push `czy-all`, create/update a PR from `czy-all` to `dev`, or, if that PR conflicts, resolve conflicts only in a local `dev <- czy-all` integration merge and never on `czy-all`."
3+
description: "This skill should be used when the user asks to sync upstream `caozhiyuan/dev` (previously `caozhiyuan/all`, now removed upstream) into the buffer branch `czy-all`, push `czy-all`, create/update a PR from `czy-all` to `dev`, or, if that PR conflicts, analyze conflicts only in a local `dev <- czy-all` integration merge, require explicit user approval for each conflict block before editing it, and never resolve conflicts on `czy-all`."
44
---
55

66
# Best of Both Worlds
77

8-
`caozhiyuan/dev` 的最新内容带到本仓库的 `czy-all`,再向本仓库 `dev` 发起 PR;若 PR 出现冲突,只能在本地 `dev <- czy-all` 集成工作区逐个冲突块分析,尽量取两边之长,不得在 `czy-all` 上解决 PR 冲突。
8+
`caozhiyuan/dev` 的最新内容带到本仓库的 `czy-all`,再向本仓库 `dev` 发起 PR;若 PR 出现冲突,只能在本地 `dev <- czy-all` 集成工作区逐个冲突块分析,逐块取得用户明确拍板后再编辑,尽量取两边之长,不得在 `czy-all` 上解决 PR 冲突。
99

1010
> **上游分支变更说明(2026-05)**:上游仓库 `caozhiyuan` 已经删除 `all` 分支,唯一的活跃分支是 `caozhiyuan/dev`。本 skill 中所有原来写作 `caozhiyuan/all` 的位置一律改用 `caozhiyuan/dev`。本地遗留的 `remotes/caozhiyuan/all` ref 是历史残留,请勿再用。
1111
@@ -34,7 +34,7 @@ description: "This skill should be used when the user asks to sync upstream `cao
3434
- `git commit --amend` / `git rebase` / 重写上游同步提交
3535
- 任何不是来自 `caozhiyuan/dev` 的 commit
3636

37-
这些动作的正确发生地点是 **`dev` 分支**且必须在 `git merge --no-ff czy-all` 之后的 `dev <- czy-all` 集成工作区里完成,不是在 `czy-all`
37+
这些动作的正确发生地点是 **`dev` 分支**且必须在用户明确授权启动的 `git merge --no-ff --no-commit czy-all` 之后的 `dev <- czy-all` 集成工作区里完成,不是在 `czy-all`
3838

3939
### 分支职责(硬规则)
4040

@@ -75,7 +75,7 @@ description: "This skill should be used when the user asks to sync upstream `cao
7575

7676
1. 先确保 `origin/czy-all` 已推送,且 PR 指向 `dev`
7777
2. 若 PR 可直接通过 GitHub merge,则按 PR 状态和用户授权执行。
78-
3. 若 PR 有冲突,则在本地 `dev` 上执行 `git merge --no-ff czy-all`,逐块解决冲突,验证后 push `origin dev`
78+
3. 若 PR 有冲突,则在本地 `dev` 上取得用户授权后执行 `git merge --no-ff --no-commit czy-all` 创建冲突分析工作区,逐块分析并逐块取得用户明确授权后才落地;全部冲突按用户决定解决并完成验证、取得最终 push 授权后,才可 push `origin dev`
7979
4. GitHub 发现 `dev` 已包含 PR head 后,原 `czy-all -> dev` PR 会自动变为 merged/closed。
8080

8181
这仍然是通过 PR 完成 `czy-all -> dev`,不是绕过 PR,也不是反向污染 `czy-all`
@@ -91,9 +91,9 @@ description: "This skill should be used when the user asks to sync upstream `cao
9191
1. **保持 tracking 不乱改。** 除非用户明确要求,不要擅自把 `czy-all` 的 upstream 从 `origin/czy-all` 改到别的远端。
9292
2. **把“拉内容”和“改 tracking”分开。** 需要同步 `caozhiyuan/dev` 时,优先 `git fetch caozhiyuan --prune``git merge --ff-only caozhiyuan/dev`;若 fast-forward 不可用,只能做明确的纯同步 merge commit。不要顺手重写 upstream,不要让 `git pull` 隐式 rebase 或生成含本地修复的 merge。注意 `caozhiyuan/dev` 指的是上游 remote 的分支名,与本仓库的 `dev` 同名但不是同一分支。
9393
3. **合并方向固定。** 这条工作流里,PR 方向始终是 `czy-all -> dev`;PR 冲突时,本地解决方向是 `dev <- czy-all`
94-
4. **冲突逐个解,不批量糊。** 出现 PR conflict 后,不要直接全选 ours/theirs,不要一次性大面积接受某一边。
94+
4. **冲突逐个问,不批量糊。** 出现 PR conflict 后,不要直接全选 ours/theirs,不要一次性大面积接受某一边;也不要在用户未确认前先编辑“显然正确”的块
9595
5. **优先保留两边有效意图。** 目标不是“偏向哪边”,而是“best of both worlds”。
96-
6. **冲突决定权在用户。** agent 负责把每个冲突拆成可理解的选项、说明影响并执行用户决定;不要替用户拍板。
96+
6. **冲突决定权在用户。** agent 负责把每个冲突拆成可理解的选项、说明影响、给出推荐,并执行用户决定;不要替用户拍板。即使 agent 认为没有歧义、sub-agent 也同意,也必须等用户对当前块明确说 yes / 执行 / 选 A 后才能改
9797
7. **先报数量,再解冲突。** agent 应先告诉用户一共有多少冲突文件、多少冲突块,再进入逐个处理。
9898
8. **处理过程中持续播报。** 每解决一块或推进到下一文件时,都要让用户知道当前进度,不要闷头解到最后。
9999
9. **先讲非冲突改动的价值。** 在进入冲突决策前,agent 应先告诉用户这批不冲突改动分别带来了什么功能变化、面向什么 use case。
@@ -162,7 +162,7 @@ git status --short
162162

163163
- 本次是否在执行 `czy-all -> dev`
164164
- 当前是否已创建或确认存在 `czy-all -> dev` PR?
165-
- 当前操作是否只会临时切到 `czy-all` 做同步,然后回到 `dev`;若要解决 PR 冲突,是否是在 `dev` 上执行 `git merge --no-ff czy-all`
165+
- 当前操作是否只会临时切到 `czy-all` 做同步,然后回到 `dev`;若要解决 PR 冲突,是否是在 `dev` 上按第七步 B 执行用户授权的 `git merge --no-ff --no-commit czy-all`
166166
- 当前操作是否会把 `dev` 反向写入 `czy-all`
167167

168168
若最后一问答案是“会”,立即停止;这不是本 skill 的流程。解决 PR 冲突时允许 `dev <- czy-all`,禁止 `czy-all <- dev`
@@ -306,18 +306,50 @@ merge 完成后,还要再次确认:
306306

307307
### 第七步 B:PR 有冲突时本地 `dev <- czy-all` 合并
308308

309-
仅当 PR 状态明确为 conflict / dirty,且用户知道将进入本地冲突处理流程时,才进入本步骤。本步骤不是在 `czy-all` 上修 PR,而是在 `dev` 上吸收 `czy-all`
309+
仅当 PR 状态明确为 conflict / dirty,且用户明确授权“开始本地 `dev <- czy-all` 冲突分析 merge”时,才进入本步骤。本步骤不是在 `czy-all` 上修 PR,而是在 `dev` 上创建本地 merge/conflict 工作区来统计和分析冲突。
310+
311+
进入本地 merge 前,必须先说出这句话(verbatim preflight):
312+
313+
```text
314+
确认:你已明确授权我在本地 dev 上执行 `git merge --no-ff --no-commit czy-all` 以生成冲突分析工作区(原话:“...”)。这不包含任何冲突块编辑、删除 marker、git add、验证、commit 或 push 授权。
315+
```
316+
317+
若无法填入用户授权原话,则禁止执行本地 merge。
310318

311319
按本仓库约定在本地合并 PR:
312320

313321
```bash
314322
git checkout dev
315-
git merge --no-ff czy-all
323+
git merge --no-ff --no-commit czy-all
316324
```
317325

318-
冲突仍按后文“逐块走 best of both worlds”处理;冲突解决应落在 `dev` 的 merge commit 中,不得在 `czy-all` 上提交“解决冲突”提交。
326+
若该命令没有产生冲突且 Git 提示可直接提交,仍然不要提交;先按第六步重新检查 PR 状态并向用户报告“本地 merge 未产生冲突”。报告后默认应执行 `git merge --abort` 退出本地 merge 工作区;是否回到第七步 A 走 GitHub merge,或改走其他收尾路径,必须由用户明示决定。未取得用户对后续路径的明确指示前,不得保留 staged 状态走 Y=0 汇总 + commit/push 路径。
327+
328+
冲突仍按后文“逐块走 best of both worlds”处理;每个冲突块都必须先等用户明确拍板再落地。冲突解决应落在 `dev` 的 merge commit 中,不得在 `czy-all` 上提交“解决冲突”提交。
329+
330+
在运行项目级验证前,必须先完成冲突块授权汇总门禁。汇总 preflight 未通过前,不得运行 `bun run lint:all --fix``bun run build``bun test``bun run typecheck` 中任何一条;它们是项目级验证,不是准备工作。执行前必须说出这句话(verbatim preflight):
331+
332+
```text
333+
确认:本次 merge 共 Y 个冲突块,每块的用户拍板原话如下:
334+
- 第 1 块(<file>:<hunk>):原话“...”
335+
- 第 2 块(<file>:<hunk>):原话“...”
336+
- ...
337+
现在才进入项目级验证。
338+
```
339+
340+
若任一块无法填入用户拍板原话,说明还没有全部授权,禁止进入项目级验证。
341+
342+
在提交 merge commit 或推送 `dev` 前,必须完成本仓库项目级验证门禁:当前分支必须是 `dev`。验证门禁只授权运行验证命令,不授权修复验证失败;若任一验证失败,必须停止,贴出失败摘要和相关 `git diff` / `git status --short`,不得切回 `czy-all` 修。
343+
344+
任何为修复 `bun run lint:all --fix` / `bun run build` / `bun test` / `bun run typecheck` 失败而产生的代码、测试、lockfile、文档或配置改动,都必须先说明失败证据、拟改文件、拟改内容与风险,并取得用户明确授权后才能编辑。该授权不同于冲突块拍板,也不同于最终 commit/push 授权。
345+
346+
执行修复编辑前,必须先说出这句话(verbatim preflight):
347+
348+
```text
349+
确认:验证 `<命令>` 失败,相关失败摘要:<paste>。拟修改文件:<list>,拟改内容摘要:<summary>,已知风险:<risk>。你已明确授权我按上述方案进行修复编辑(原话:“...”),现在才执行。本授权不包含再次运行验证、commit、push。
350+
```
319351

320-
在提交 merge commit 或推送 `dev` 前,必须完成本仓库项目级验证门禁:当前分支必须是 `dev`;若验证失败,只能在当前 `dev <- czy-all` 工作区修复并重新验证,不得切回 `czy-all`
352+
若无法填入失败摘要、拟改文件、拟改内容、风险或用户授权原话,禁止编辑。修复编辑完成后必须重新进入第七步 B 项目级验证门禁,重跑全部验证;不得跳验证直接走 commit/push 授权
321353

322354
```bash
323355
git rev-parse --abbrev-ref HEAD
@@ -327,9 +359,26 @@ bun test
327359
bun run typecheck
328360
```
329361

330-
验证全部通过后,提交 merge commit(若 `git merge` 未自动提交)并推送:
362+
注意:`bun run lint:all --fix` 是写盘命令。它运行后必须执行 `git diff`,向用户明确展示自动改写了哪些内容,并说明“这些是 lint 自动产生的改动,不是你逐块拍板过的内容”。随后必须说出这句话(verbatim preflight):
363+
364+
```text
365+
确认:lint --fix 自动改写了以下文件:<list>,diff 已展示给你;其中触碰用户拍板范围外内容的文件:<list 或“无”>;你已明确授权将这些 lint 自动改动纳入本次 merge commit(原话:“...”),现在才进入下一步验证。
366+
```
367+
368+
若 lint 自动改动触碰冲突文件、lockfile、文档或任何用户未确认的内容,必须暂停并让用户确认这些自动改动;不得把它们悄悄卷入 commit。若无法填入用户授权原话,禁止继续 build/test/typecheck、commit 或 push。
369+
370+
所有冲突块都按用户逐块拍板落地、lint 自动改动已获确认、且验证全部通过后,必须停止并汇报结果。只有用户另行明确授权“创建 merge commit 并 push origin/dev”后,才可创建 merge commit 并推送。
371+
372+
在 commit 或 push 前,必须先说出这句话(verbatim preflight):
373+
374+
```text
375+
确认:本次本地 merge `dev <- czy-all` 共解决 Y 块冲突,全部用户拍板原话已列出;项目级验证已全绿(lint/build/test/typecheck 均通过);你已明确授权将 merge commit <sha 或待创建 merge commit> push 到 origin/dev(原话:“...”),现在才执行 commit/push。
376+
```
377+
378+
若无法填入全部冲突块授权摘要、验证结果、merge commit SHA(或说明当前仍待创建)、用户最终 commit/push 授权原话,则禁止 commit / push。
331379

332380
```bash
381+
git commit
333382
git push origin dev
334383
```
335384

@@ -388,7 +437,7 @@ git push --force-with-lease origin czy-all
388437
```
389438

390439
6. 重新检查 `czy-all -> dev` PR 是否更新到干净 head;若原 PR 已存在,确认它不再包含污染提交;若无 PR,再创建 PR。
391-
7. 切回 `dev`,从 `dev` 上重新执行 `git merge --no-ff czy-all`,所有冲突与验证修复都在 `dev` 上完成
440+
7. 切回 `dev` 后,不得直接执行旧式 merge 命令;必须重新回到“第七步 B:PR 有冲突时本地 `dev <- czy-all` 合并”,重新取得进入本地 merge 的用户授权,并使用 `git merge --no-ff --no-commit czy-all`。所有冲突、验证修复、commit/push 仍受第七步 B 与逐块冲突门禁约束
392441

393442
## 冲突处理:逐块走 “best of both worlds”
394443

@@ -406,7 +455,7 @@ git push --force-with-lease origin czy-all
406455
1. `dev` 这一边保留了什么意图?
407456
2. `czy-all` 这一边带来了什么新能力或修复?
408457
3. 两边是否能组合,而不是二选一?
409-
4. 如果不能自动判断,哪一点需要用户拍板?
458+
4. 我推荐哪一种,风险是什么,需要用户明确选哪一项?(固定需要用户拍板,不存在“agent 可自动判断所以直接执行”的情况)
410459

411460
### 决策权限规则
412461

@@ -417,14 +466,20 @@ git push --force-with-lease origin czy-all
417466
- agent 可以指出哪种组合更像 “best of both worlds”
418467
- **但最终保留哪边、怎么拼,必须由用户拍板**
419468
- 如果用户还没拍板,agent 不要擅自完成该冲突块的最终取舍
469+
- **无歧义也要问。** “我能判断”“显然该组合”“只是 lockfile/文档/小块”都不是例外;每个冲突块都需要用户对当前块编号确认。
470+
- **不能先改后问。** 在用户确认前,不得把冲突文件改成推荐方案、不得删除 conflict marker、不得 `git add`、不得把该块标记 resolved、不得继续下一块。
420471

421472
### 执行门禁(强制,不可绕过)
422473

423-
在对每个冲突块落地任何操作(写文件、标记已解决、进入下一块)之前,必须同时满足以下全部条件:
474+
本节只规定**块级门禁**:写文件、删除 conflict marker、标记 resolved、`git add -- <具体文件>`、进入下一块,必须等用户对当前块编号确认。
475+
476+
验证和收尾另有独立门禁:所有块级授权完成后,必须先做冲突块授权汇总 preflight,才能进入项目级验证;commit / push 必须在验证通过后另行取得用户最终授权。任何单个块确认或全部块确认都不自动授权验证、commit 或 push。
477+
478+
在对每个冲突块落地块级操作之前,必须同时满足以下全部条件:
424479

425480
1. 主 agent 已给出本块的对比分析与推荐方案;
426481
2. sub-agent 已返回独立意见(若本轮启用了 sub-agent);
427-
3. 用户对**当前块编号**给出明确确认(如”yes / agree / 执行方案 A”)。
482+
3. 用户对**当前块编号**给出明确确认(如”yes / agree / 执行方案 A”),且确认发生在本块分析之后
428483

429484
**三方对齐 = 信息齐全。用户拍板 = 唯一执行许可。两者不能混用。**
430485

@@ -438,6 +493,22 @@ git push --force-with-lease origin czy-all
438493

439494
若无法填入用户的原话,则还没有授权,禁止执行。
440495

496+
**反例(明确违规):**
497+
498+
- 只说“我会合并两边意图”,然后直接编辑冲突文件。
499+
- 报告“3 个冲突文件”,但没有逐块等待用户选择就 `git add` / commit / push。
500+
- 认为 `bun.lock``package-lock.json`、文档冲突是机械冲突,所以自行取一边或重新生成。
501+
- 认为 “best of both worlds” 有明显答案,所以省略用户确认。
502+
503+
**正确做法:**即使推荐方案明显,也要停在该块,等待用户确认后才执行。
504+
505+
**`git add` 颗粒度规则:**
506+
507+
- 每块拍板后,只允许标记该块所在的具体文件路径:`git add -- <该块所在文件>`
508+
- 禁止使用 `git add .``git add -u``git add -A``git add <目录>`
509+
- 全部冲突块解决完毕、进入第七步 B 验证阶段前,必须运行 `git status --short` 给用户看:“还剩 0 个 unmerged 路径,已 staged 的文件清单如下:...”。
510+
- 任何 staged 文件不在用户拍板清单内,立即停止;不能继续验证、commit 或 push。
511+
441512
### Sub-Agent 独立意见格式
442513

443514
每次调用 sub-agent 时,要求它按以下结构输出(在 prompt 中明确要求):
@@ -488,7 +559,7 @@ czy-all 意图:
488559
推荐话术:
489560

490561
```text
491-
先说不冲突的部分:这批改动里,已有 A 个文件可以直接收下
562+
先说不冲突的部分:这批改动里,已有 A 个文件不涉及冲突块,无需逐块拍板;但它们仍受 PR 状态、项目级验证、lint 自动改动复核、最终 commit/push 授权门禁约束
492563
它们带来的变化主要是:
493564
1. <功能变化> —— 对应 <use case>
494565
2. <功能变化> —— 对应 <use case>
@@ -519,7 +590,9 @@ czy-all 侧:
519590
- 为什么这样是 best of both worlds
520591
521592
需要用户确认:
522-
- 仅列真正有歧义的点
593+
- 固定列出当前块编号、推荐方案、风险
594+
- 即使无歧义,也必须请用户明确确认“按方案 A 执行”
595+
- 不得写“无需确认”,不得只列有歧义点
523596
```
524597

525598
### 用户 brainstorming 规则
@@ -567,7 +640,7 @@ czy-all 侧:
567640
- `caozhiyuan/dev` 的最新内容已经带进本地 `czy-all`
568641
- `origin/czy-all` 已推送
569642
- PR 已从 `czy-all` 指向 `dev`
570-
- 若通过本地解决 PR 冲突,`dev` 已包含 `czy-all` head,已推送 `origin/dev`,且 PR 已自动变为 merged/closed
643+
- 若通过本地解决 PR 冲突,已记录用户对进入本地 merge、每个冲突块、lint 自动改动、验证后 commit/push 的明确授权原话;若验证一度失败,已记录用户对每次修复方案的明确授权原话,且修复后已重跑全部验证至全绿;`dev` 已包含 `czy-all` head,已推送 `origin/dev`,且 PR 已自动变为 merged/closed
571644
- 若有冲突,已逐块分析,而不是整边覆盖
572645
- 若无冲突,已向用户明确汇报 checks / merge 状态,并处理到“等待项已说明”或“最终 merge 已完成”这两个收尾之一
573646

0 commit comments

Comments
 (0)