Skip to content

Commit 5689490

Browse files
committed
feat(sync-worktree): 添加用于同步git worktree的claude代码技能
新增 `/sync-worktree` Claude Code Skill,用于自动化 git worktree 间的代码同步操作。该技能提供以下功能: - 无参数调用时展示所有 worktree 的同步状态概览(领先/落后 commit 数、工作区是否干净) - 支持单分支同步,默认 rebase 到 master 分支,也可通过 `--from` 指定其他基准分支 - 支持批量同步所有 feature worktree,自动跳过脏工作区和冲突分支 - 内置安全检查,拒绝同步脏工作区并要求用户先处理未提交改动 - 提供冲突处理选项,单分支模式下可协助解决或中止 rebase
1 parent 3256cf0 commit 5689490

5 files changed

Lines changed: 219 additions & 0 deletions

File tree

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
schema: spec-driven
2+
created: 2026-02-11
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
## Context
2+
3+
项目使用 git worktree 进行多分支并行开发(如 `master` + `aifeat`),worktree 分布在磁盘不同目录。当前同步操作需要手动 `cd` 到目标 worktree 目录执行 `git rebase`,缺乏统一的状态视图和安全检查机制。
4+
5+
该 command 以 Claude Code Skill(SKILL.md)形式实现,由 Claude Code 解释执行,不生成独立脚本。Skill 内部通过调用 `git` CLI 完成所有操作。
6+
7+
## Goals / Non-Goals
8+
9+
**Goals:**
10+
11+
- 提供所有 worktree 的同步状态一览(领先/落后 commit 数、工作区干净与否)
12+
- 一条命令完成 rebase 同步,无需手动 cd 到 worktree 目录
13+
- 支持批量同步所有 feature worktree
14+
- 脏工作区安全拒绝,避免误操作
15+
- 冲突场景提供清晰的处理路径
16+
17+
**Non-Goals:**
18+
19+
- 不实现 merge 策略(仅 rebase)
20+
- 不实现 cherry-pick / 文件级同步
21+
- 不管理 worktree 的创建与删除(已有 `zcf:git-worktree` skill)
22+
- 不处理远程仓库的 push/pull(同步仅在本地分支间进行)
23+
- 不自动 stash 脏工作区(直接拒绝,由用户决定如何处理)
24+
25+
## Decisions
26+
27+
### 1. 同步策略:仅支持 rebase
28+
29+
**选择**: 仅提供 rebase,不支持 merge。
30+
31+
**理由**: 用户明确偏好 rebase 以保持线性历史。feature 分支最终需要合回 master,rebase 产生的线性历史比 merge commit 更干净。单一策略也降低了 skill 的复杂度。
32+
33+
**替代方案**: 支持 `--strategy merge|rebase` 参数 → 增加复杂度但灵活性有限,用户已明确不需要 merge。
34+
35+
### 2. 脏工作区:拒绝而非自动 stash
36+
37+
**选择**: 检测到未提交改动时直接拒绝同步,提示用户先 commit 或 stash。
38+
39+
**理由**: 自动 stash → rebase → stash pop 链路中任一环节失败(尤其 stash pop 冲突)会使状态难以恢复。拒绝策略最安全,用户对自己的工作区状态有完全控制权。
40+
41+
**替代方案**: 自动 stash → 方便但风险高;询问用户 → 多一步交互但 skill 上下文中可用 AskUserQuestion。
42+
43+
### 3. 批量模式冲突处理:跳过并继续
44+
45+
**选择**: `--all` 模式下,某个分支 rebase 冲突时自动 `git rebase --abort`,跳过该分支继续处理剩余分支,最后汇总报告。
46+
47+
**理由**: 批量操作的目的是提效,逐个停下来解决冲突会破坏批量的意义。跳过 + 汇报让用户可以事后逐个处理冲突分支。
48+
49+
### 4. 实现形态:Claude Code SKILL.md
50+
51+
**选择**: 作为 `.claude/skills/sync-worktree/SKILL.md` 实现,由 Claude Code 解释执行。
52+
53+
**理由**: Skill 可以利用 Claude 的上下文感知能力(如冲突时协助分析),比纯 shell 脚本更灵活。且项目已有大量 skill 先例。
54+
55+
**替代方案**: PowerShell 脚本 → 可独立运行但失去 AI 辅助能力;两者兼有 → 维护成本翻倍。
56+
57+
### 5. 基准分支默认值检测
58+
59+
**选择**: 默认基准为 `master`,但通过 `git worktree list` 检测主 worktree 对应的分支作为实际默认值。支持 `--from <branch>` 覆盖。
60+
61+
**理由**: 大部分项目主分支是 `master``main`,从主 worktree 检测可以兼容两种命名。`--from` 参数覆盖默认值以支持 feature-to-feature 同步。
62+
63+
## Risks / Trade-offs
64+
65+
- **Rebase 改写历史** → 如果 feature 分支已推送到远程,rebase 后需要 force push。Skill 在结果报告中提醒用户这一点。
66+
- **`--all` 跳过冲突分支可能被忽略** → 最终汇总报告中用醒目标记列出所有跳过的分支,确保用户注意到。
67+
- **`git -C <path>` 依赖** → 要求 git 版本 >= 1.8.5(2013 年发布),几乎所有现代系统都满足,风险极低。
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
## Why
2+
3+
在使用 git worktree 进行多分支并行开发时,feature 分支需要频繁从 master 拉取最新代码(rebase),同时偶尔也需要从其他 feature 分支同步。当前这个操作需要手动 `cd` 到对应 worktree 目录、检查工作区状态、执行 `git rebase`,流程繁琐且容易遗漏状态检查。需要一个 Claude Code Skill 来自动化这个流程,提供状态概览、安全检查和批量同步能力。
4+
5+
## What Changes
6+
7+
- 新增 Claude Code Skill `/sync-worktree`,支持以下功能:
8+
- 无参数调用时展示所有 worktree 的同步状态概览(领先/落后 commit 数、工作区是否干净)
9+
- 指定分支同步:默认 rebase onto master,支持 `--from <branch>` 指定其他基准分支
10+
- 批量同步 `--all`:将所有 feature worktree rebase onto master,冲突分支跳过并继续
11+
- 安全护栏:脏工作区直接拒绝同步,要求用户先 commit 或 stash
12+
- 冲突处理:单分支模式下协助用户解决或 abort;批量模式下自动 abort 并跳过
13+
14+
## Capabilities
15+
16+
### New Capabilities
17+
18+
- `worktree-sync`: 提供 git worktree 间的代码同步能力,包括状态概览、单分支/批量 rebase 同步、安全检查和冲突处理
19+
20+
### Modified Capabilities
21+
22+
(无已有 capability 需要修改)
23+
24+
## Impact
25+
26+
- 新增文件:`.claude/skills/sync-worktree/SKILL.md`
27+
- 依赖:仅依赖 `git` CLI(worktree、rebase、log、rev-list 等子命令)
28+
- 不影响现有 `bin/``scripts/``psutils/` 等模块
29+
- 不引入新的外部依赖
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
## ADDED Requirements
2+
3+
### Requirement: 状态概览显示
4+
当用户调用 `/sync-worktree` 不带任何参数时,系统 SHALL 展示所有 worktree 的同步状态概览。概览 SHALL 包含每个 worktree 的分支名、路径、相对于 master 的领先/落后 commit 数、以及工作区是否干净。主 worktree 的分支 SHALL 被标记为基准分支。
5+
6+
#### Scenario: 展示多个 worktree 状态
7+
- **WHEN** 用户调用 `/sync-worktree` 不带参数
8+
- **THEN** 系统显示所有 worktree 的表格,包含 branch、path、ahead(领先 commit 数)、behind(落后 commit 数)、工作区状态(clean/dirty)
9+
10+
#### Scenario: 仅有主 worktree
11+
- **WHEN** 用户调用 `/sync-worktree` 不带参数,且仅存在主 worktree(无 feature worktree)
12+
- **THEN** 系统提示当前没有可同步的 feature worktree
13+
14+
### Requirement: 单分支 rebase 同步
15+
用户 SHALL 能够指定一个 worktree 分支名,系统将该分支 rebase 到基准分支(默认 master)。
16+
17+
#### Scenario: 成功同步到 master
18+
- **WHEN** 用户调用 `/sync-worktree aifeat`
19+
- **THEN** 系统在 aifeat 的 worktree 目录中执行 `git rebase master`,并报告成功结果和新 HEAD
20+
21+
#### Scenario: 分支已是最新
22+
- **WHEN** 用户调用 `/sync-worktree aifeat`,且 aifeat 已包含 master 的所有 commit
23+
- **THEN** 系统提示 "aifeat 已是最新,无需同步"
24+
25+
#### Scenario: 指定分支不存在于 worktree
26+
- **WHEN** 用户调用 `/sync-worktree nonexistent`
27+
- **THEN** 系统报错,列出可用的 worktree 分支供用户选择
28+
29+
### Requirement: 自定义基准分支
30+
用户 SHALL 能够通过 `--from <branch>` 参数指定任意本地分支作为 rebase 基准,覆盖默认的 master。
31+
32+
#### Scenario: Feature-to-feature 同步
33+
- **WHEN** 用户调用 `/sync-worktree aifeat --from hotfix`
34+
- **THEN** 系统在 aifeat 的 worktree 目录中执行 `git rebase hotfix`
35+
36+
#### Scenario: 指定的基准分支不存在
37+
- **WHEN** 用户调用 `/sync-worktree aifeat --from nonexistent`
38+
- **THEN** 系统报错,提示基准分支不存在
39+
40+
### Requirement: 脏工作区拒绝
41+
当目标 worktree 存在未提交的改动(包括 staged 和 unstaged)时,系统 SHALL 拒绝执行同步,并提示用户先 commit 或 stash。
42+
43+
#### Scenario: 工作区有未提交改动
44+
- **WHEN** 用户调用 `/sync-worktree aifeat`,且 aifeat worktree 有未提交改动
45+
- **THEN** 系统拒绝同步,提示 "aifeat 工作区有未提交改动,请先 commit 或 stash 后重试"
46+
47+
#### Scenario: 工作区干净
48+
- **WHEN** 用户调用 `/sync-worktree aifeat`,且 aifeat worktree 工作区干净
49+
- **THEN** 系统正常执行同步流程
50+
51+
### Requirement: 批量同步
52+
用户 SHALL 能够通过 `--all` 参数一次性将所有 feature worktree rebase 到 master。
53+
54+
#### Scenario: 全部同步成功
55+
- **WHEN** 用户调用 `/sync-worktree --all`,且所有 feature worktree 工作区干净且无冲突
56+
- **THEN** 系统依次 rebase 每个 feature 分支到 master,并显示汇总结果
57+
58+
#### Scenario: 部分分支脏工作区
59+
- **WHEN** 用户调用 `/sync-worktree --all`,且部分 worktree 有未提交改动
60+
- **THEN** 系统跳过脏工作区的分支,同步其余分支,最终汇总中标注被跳过的分支及原因
61+
62+
#### Scenario: 部分分支冲突
63+
- **WHEN** 用户调用 `/sync-worktree --all`,且部分 worktree rebase 时产生冲突
64+
- **THEN** 系统对冲突分支执行 `git rebase --abort`,跳过该分支继续处理剩余分支,最终汇总中标注冲突分支
65+
66+
### Requirement: 单分支冲突处理
67+
当单分支模式下 rebase 产生冲突时,系统 SHALL 提供三个选项让用户选择。
68+
69+
#### Scenario: Rebase 冲突
70+
- **WHEN** 用户调用 `/sync-worktree aifeat`,且 rebase 过程中产生冲突
71+
- **THEN** 系统列出冲突文件,并提供三个选项:(1) Claude 协助解决冲突 (2) 用户手动解决后继续 (3) 中止 rebase(git rebase --abort)
72+
73+
### Requirement: 同步结果报告
74+
每次同步完成后,系统 SHALL 显示操作结果汇总。
75+
76+
#### Scenario: 单分支同步报告
77+
- **WHEN** 单分支 rebase 成功完成
78+
- **THEN** 系统显示:分支名、新 HEAD commit、同步的 commit 数量、是否需要 force push 到远程
79+
80+
#### Scenario: 批量同步汇总报告
81+
- **WHEN** 批量同步完成
82+
- **THEN** 系统显示汇总表格,列出每个分支的状态(✔ 成功 / ⚠ 跳过-脏工作区 / ❌ 跳过-冲突 / ℹ 已是最新)
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
## 1. Skill 基础结构
2+
3+
- [ ] 1.1 创建 `.claude/skills/sync-worktree/SKILL.md` 文件,包含 frontmatter(name、description、metadata)和完整的 skill 指令
4+
- [ ] 1.2 编写参数解析逻辑说明:无参数(状态概览)、`<branch>`(单分支同步)、`--from <branch>`(自定义基准)、`--all`(批量同步)
5+
6+
## 2. 状态概览功能
7+
8+
- [ ] 2.1 实现 worktree 发现:调用 `git worktree list --porcelain` 解析所有 worktree 的分支和路径
9+
- [ ] 2.2 实现基准分支检测:从主 worktree(bare=false 的第一个)提取分支名作为默认基准
10+
- [ ] 2.3 实现领先/落后计算:对每个 feature worktree 调用 `git rev-list --left-right --count <base>...<branch>`
11+
- [ ] 2.4 实现工作区状态检查:对每个 worktree 调用 `git -C <path> status --porcelain` 判断 clean/dirty
12+
- [ ] 2.5 实现状态表格输出格式:分支名、路径、ahead、behind、工作区状态,主 worktree 标记为 base
13+
14+
## 3. 单分支同步功能
15+
16+
- [ ] 3.1 实现目标分支验证:检查指定分支名是否存在于 worktree 列表中,不存在则列出可用分支
17+
- [ ] 3.2 实现脏工作区拒绝:检查目标 worktree 工作区状态,脏则拒绝并提示 commit 或 stash
18+
- [ ] 3.3 实现已是最新检测:通过 `git rev-list --count <base>..<branch>` 和反向检查判断是否需要同步
19+
- [ ] 3.4 实现同步预览:显示将要同步的 commit 列表(`git log --oneline <merge-base>..<base>`
20+
- [ ] 3.5 实现 rebase 执行:`git -C <worktree-path> rebase <base-branch>`
21+
- [ ] 3.6 实现成功报告:显示新 HEAD、同步的 commit 数、是否需要 force push
22+
23+
## 4. 冲突处理
24+
25+
- [ ] 4.1 实现单分支冲突检测:识别 rebase 失败的退出码和冲突文件列表
26+
- [ ] 4.2 实现三选项交互:(1) Claude 协助解决 (2) 用户手动解决后 continue (3) abort
27+
- [ ] 4.3 实现批量模式冲突跳过:检测到冲突后自动 `git -C <path> rebase --abort`,记录跳过原因
28+
29+
## 5. 批量同步功能
30+
31+
- [ ] 5.1 实现 `--all` 模式:遍历所有非主 worktree,逐个执行同步流程
32+
- [ ] 5.2 实现跳过逻辑:脏工作区 → 跳过;冲突 → abort + 跳过;已是最新 → 标记
33+
- [ ] 5.3 实现汇总报告:表格显示每个分支的最终状态(✔ 成功 / ⚠ 跳过-脏工作区 / ❌ 跳过-冲突 / ℹ 已是最新)
34+
35+
## 6. 验证
36+
37+
- [ ] 6.1 在当前 worktree 环境下测试 `/sync-worktree`(无参数)状态概览输出
38+
- [ ] 6.2 测试 `/sync-worktree aifeat` 单分支同步流程
39+
- [ ] 6.3 验证脏工作区拒绝行为

0 commit comments

Comments
 (0)