feat(git): 完善 Worktree 生命周期与发布约定
This commit is contained in:
@@ -98,3 +98,14 @@ plugins/<plugin>/skills/<skill>/
|
|||||||
- 提交前执行 `git status --short`、`git diff --cached --check` 并检查暂存文件清单。
|
- 提交前执行 `git status --short`、`git diff --cached --check` 并检查暂存文件清单。
|
||||||
- 不提交本地配置、凭据、缓存、运行产物和 IDE 私有状态。
|
- 不提交本地配置、凭据、缓存、运行产物和 IDE 私有状态。
|
||||||
- 不使用破坏性历史改写,也不推送,除非用户明确授权。
|
- 不使用破坏性历史改写,也不推送,除非用户明确授权。
|
||||||
|
|
||||||
|
## 分支与发布约定
|
||||||
|
|
||||||
|
- 一个完整主题使用一个短生命周期开发分支;分支只包含同一能力闭环,不为凑版本混入无关变更。
|
||||||
|
- 分支命名优先遵循仓库现有约定;没有更具体规则时使用 `feature/<short-name>`、`fix/<short-name>`、`docs/<short-name>` 或 `chore/<short-name>`。
|
||||||
|
- 工作区不干净、当前 checkout 被 IDE/服务/测试占用,或用户要求不影响主工作区时,使用独立 Worktree。分支任务完成后必须通过安全清理门禁移除额外 Worktree,保留分支和提交。
|
||||||
|
- 已验证的开发分支合入 `master` 后,先在 `CHANGELOG.md` 的 `Unreleased` 累计;形成一组相关、完整、可交付的能力后再发布,不因每次普通修改单独发版。
|
||||||
|
- 阻断性缺陷、安全问题或已发布能力的明确回归可以单独发布修订版本;不得为等待批次延迟必要修复。
|
||||||
|
- 仓库整体版本遵循 SemVer:不兼容变化升级主版本,向后兼容的新能力升级次版本,向后兼容的问题修复升级修订版本。
|
||||||
|
- `dev`、`doc`、`git`、`knowledge` 和 `skill` 插件清单版本按实际变化独立维护;修改某个插件的可见能力时同步评估其 `plugin.json` 版本。
|
||||||
|
- 发布前必须确认工作区、发布范围、版本号、验证证据、`CHANGELOG.md`、插件清单版本、标签目标和远程地址。版本提交、标签和推送分别按用户授权执行。
|
||||||
|
|||||||
@@ -10,6 +10,21 @@
|
|||||||
|
|
||||||
当前没有尚未发布的重大变更。
|
当前没有尚未发布的重大变更。
|
||||||
|
|
||||||
|
## [1.3.0] - 2026-08-31
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- 为 `branch` 增加当前工作区与独立 Worktree 两种分支创建方式,以及任务结束后的 `close` 清理模式。
|
||||||
|
- 为 `integrate` 增加预集成 Worktree 的 `cleanup` 阶段和完整生命周期状态。
|
||||||
|
- 增加 Worktree 分支占用诊断、安全移除门禁和清理后分支、提交及主工作区验证规则。
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- 脏工作区、当前 checkout 被占用或用户要求隔离时,优先在独立 Worktree 创建需求或预集成分支。
|
||||||
|
- 预集成交付范围统一以目标分支到预集成 HEAD 的真实差异判断,不再以 merge 输出、分支名、提交数量或测试结果代替纯度检查。
|
||||||
|
- 全流程自动化在独立 Worktree 的分支任务完成后进入清理门禁,释放分支占用后再结束任务。
|
||||||
|
- 增加短生命周期开发分支和批量发布约定:相关完整变更累计发布,阻断性修复可单独发布修订版本。
|
||||||
|
|
||||||
## [1.2.0] - 2026-08-31
|
## [1.2.0] - 2026-08-31
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -75,11 +75,11 @@ CraftKit 是面向 Codex 的通用插件工具集,覆盖软件开发、文档
|
|||||||
|
|
||||||
| Skill | 用途 |
|
| Skill | 用途 |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `branch` | 按仓库约定规划名称,并在确认后创建和切换本地分支。 |
|
| `branch` | 按仓库约定创建本地分支,并管理独立 Worktree 的创建与安全关闭。 |
|
||||||
| `commit-msg` | 根据工作区或暂存区的真实变更生成 Conventional Commit 信息。 |
|
| `commit-msg` | 根据工作区或暂存区的真实变更生成 Conventional Commit 信息。 |
|
||||||
| `identity` | 查看或设置 Git 提交用户名和邮箱及其作用域。 |
|
| `identity` | 查看或设置 Git 提交用户名和邮箱及其作用域。 |
|
||||||
| `export` | 按提交、时间或工作区范围导出变更文件并生成分类清单。 |
|
| `export` | 按提交、时间或工作区范围导出变更文件并生成分类清单。 |
|
||||||
| `integrate` | 评估分支集成风险,通过隔离 worktree 准备和验证预集成分支。 |
|
| `integrate` | 评估分支集成风险,通过隔离 Worktree 准备、验证、发布和清理预集成分支。 |
|
||||||
| `release` | 准备版本号、变更摘要和发布检查,并按授权执行版本提交、标签或发布。 |
|
| `release` | 准备版本号、变更摘要和发布检查,并按授权执行版本提交、标签或发布。 |
|
||||||
|
|
||||||
### Knowledge
|
### Knowledge
|
||||||
|
|||||||
+14
-8
@@ -88,7 +88,7 @@
|
|||||||
| S6 验证与自修复 | `test-backend`、`test-ui` | 分层验证记录、失败分类、修复结果 | 自动进入 S7 |
|
| S6 验证与自修复 | `test-backend`、`test-ui` | 分层验证记录、失败分类、修复结果 | 自动进入 S7 |
|
||||||
| S7 代码审核 | `review-code`,按需叠加 `review-java`、`review-mybatis`、`review-frontend` | 审核报告、问题清单、未验证边界 | 自动修复明确问题后复审,进入 G4 |
|
| S7 代码审核 | `review-code`,按需叠加 `review-java`、`review-mybatis`、`review-frontend` | 审核报告、问题清单、未验证边界 | 自动修复明确问题后复审,进入 G4 |
|
||||||
| S8 提交准备 | `commit-msg` | 精确文件范围、提交拆分与提交信息 | 进入审批门 G5 |
|
| S8 提交准备 | `commit-msg` | 精确文件范围、提交拆分与提交信息 | 进入审批门 G5 |
|
||||||
| S9 本地提交 | Git 原生命令 | 一个或多个本地提交、提交后状态 | 输出最终交付报告并结束 |
|
| S9 本地提交与收尾 | Git 原生命令、`branch close` | 一个或多个本地提交、提交后状态、Worktree 清理结果 | 释放额外 Worktree 后输出最终交付报告 |
|
||||||
|
|
||||||
阶段不得仅凭名称跳过。确实不适用时,应记录“不适用”的证据和原因,再继续推进。
|
阶段不得仅凭名称跳过。确实不适用时,应记录“不适用”的证据和原因,再继续推进。
|
||||||
|
|
||||||
@@ -126,10 +126,11 @@
|
|||||||
- 当前分支和工作区状态;
|
- 当前分支和工作区状态;
|
||||||
- 目标分支名;
|
- 目标分支名;
|
||||||
- 基准引用及提交短哈希;
|
- 基准引用及提交短哈希;
|
||||||
- 是否携带未提交修改;
|
- 在当前工作区还是独立 Worktree 创建,以及是否影响未提交修改;
|
||||||
|
- 使用独立 Worktree 时的准确绝对路径;
|
||||||
- 唯一的分支创建命令。
|
- 唯一的分支创建命令。
|
||||||
|
|
||||||
只有用户明确批准这组最终信息后才能创建并切换本地分支。`fetch`、创建分支、推送分支是彼此独立的授权;本流程默认不执行 fetch 和 push。
|
只有用户明确批准这组最终信息后才能创建本地分支。`fetch`、创建分支、移除 Worktree 和推送分支是彼此独立的授权;本流程默认不执行 fetch 和 push。
|
||||||
|
|
||||||
### G4 代码效果审批
|
### G4 代码效果审批
|
||||||
|
|
||||||
@@ -237,9 +238,9 @@
|
|||||||
3. 不默认基准分支,不默认远端为最新;
|
3. 不默认基准分支,不默认远端为最新;
|
||||||
4. 验证分支名、基准提交和同名引用;
|
4. 验证分支名、基准提交和同名引用;
|
||||||
5. 到达 G3,等待用户对最终命令的明确批准;
|
5. 到达 G3,等待用户对最终命令的明确批准;
|
||||||
6. 创建后验证当前分支、起点和工作区状态。
|
6. 创建后验证实际工作目录中的分支、起点和状态;使用独立 Worktree 时,还要确认主工作区未变化并记录分支占用路径。
|
||||||
|
|
||||||
若工作区不干净,不能自动 stash、提交、还原或清理。必须说明现有修改是否会随分支切换携带,并等待用户决定。
|
若工作区不干净,不能自动 stash、提交、还原或清理。必须说明直接切换会携带哪些修改,并优先建议在经 G3 批准的独立 Worktree 中创建分支。独立 Worktree 在开发期间保持使用,任务完成后必须通过 `branch close` 清理门禁释放分支占用。
|
||||||
|
|
||||||
### S5:代码实现
|
### S5:代码实现
|
||||||
|
|
||||||
@@ -312,7 +313,10 @@ G5 批准后:
|
|||||||
4. 确认无敏感文件、缓存、本地配置和无关改动;
|
4. 确认无敏感文件、缓存、本地配置和无关改动;
|
||||||
5. 使用批准的提交信息创建本地提交;
|
5. 使用批准的提交信息创建本地提交;
|
||||||
6. 验证提交哈希、提交内容、当前分支和提交后工作区状态;
|
6. 验证提交哈希、提交内容、当前分支和提交后工作区状态;
|
||||||
7. 输出最终交付报告。
|
7. 如果本次使用独立 Worktree,确认开发、验证和本地交付已完成,检查 Worktree 干净、无进行中的 Git 操作且 HEAD 已被本地分支引用;
|
||||||
|
8. 展示准确清理路径、分支、HEAD 和 `git worktree remove` 命令,取得独立确认后使用 `branch close` 移除额外 Worktree;
|
||||||
|
9. 验证 Worktree 目录和占用记录已移除、分支与提交仍存在、主工作区未变化;
|
||||||
|
10. 输出最终交付报告。
|
||||||
|
|
||||||
最终报告至少包含:需求与设计产物路径、分支、提交哈希、实现摘要、验证结果、审核结论、未提交文件、未验证边界和后续建议。
|
最终报告至少包含:需求与设计产物路径、分支、提交哈希、实现摘要、验证结果、审核结论、未提交文件、未验证边界和后续建议。
|
||||||
|
|
||||||
@@ -381,7 +385,7 @@ G5 批准后:
|
|||||||
3. 到达 G1 时一次性展示需求基线、疑问、建议决策和拟落盘路径,等待我批准。批准后自动执行到下一审批门,不再要求我发送“继续”。
|
3. 到达 G1 时一次性展示需求基线、疑问、建议决策和拟落盘路径,等待我批准。批准后自动执行到下一审批门,不再要求我发送“继续”。
|
||||||
4. 使用 plan-change 和实际适用的设计 Skill 完成设计。只调用与需求有关的 design-db、design-api、design-backend、design-frontend、design-frontend-data、design-workflow、prepare-api、component、form、style,不为不适用领域制造空文档。
|
4. 使用 plan-change 和实际适用的设计 Skill 完成设计。只调用与需求有关的 design-db、design-api、design-backend、design-frontend、design-frontend-data、design-workflow、prepare-api、component、form、style,不为不适用领域制造空文档。
|
||||||
5. 到达 G2 时展示设计、影响范围、风险、实施步骤、验证矩阵和文档路径,等待批准。
|
5. 到达 G2 时展示设计、影响范围、风险、实施步骤、验证矩阵和文档路径,等待批准。
|
||||||
6. 设计批准后使用 branch 检查并规划本地开发分支。严格按照该 Skill 展示当前状态、分支名、基准提交、工作区影响和唯一创建命令,在 G3 等待明确批准。不要自动 fetch、stash、清理、提交或 push。
|
6. 设计批准后使用 branch 检查并规划本地开发分支。严格按照该 Skill 展示当前状态、分支名、基准提交、创建位置、工作区影响和唯一创建命令,在 G3 等待明确批准。工作区不干净或要求不影响当前 checkout 时使用独立 Worktree。不要自动 fetch、stash、清理、提交或 push。
|
||||||
7. 分支创建后,使用 implement-backend 和/或 implement-frontend 在批准范围内完成最小完整实现。保持项目现有语言、框架版本、目录、注释和测试风格,不虚构接口、组件、业务规则或内部依赖。
|
7. 分支创建后,使用 implement-backend 和/或 implement-frontend 在批准范围内完成最小完整实现。保持项目现有语言、框架版本、目录、注释和测试风格,不虚构接口、组件、业务规则或内部依赖。
|
||||||
8. 自动运行格式化、静态检查、编译、聚焦测试和具备条件的真实验证。本次实现缺陷可自动修复并重跑;需求或设计变化必须回到对应审批门。
|
8. 自动运行格式化、静态检查、编译、聚焦测试和具备条件的真实验证。本次实现缺陷可自动修复并重跑;需求或设计变化必须回到对应审批门。
|
||||||
9. 使用 review-code 审查最终差异,并按需叠加 review-java、review-mybatis、review-frontend。已批准范围内、低风险且修复方式明确的问题自动修复、复测和复审;范围外或改变契约的问题只报告并等待决策。
|
9. 使用 review-code 审查最终差异,并按需叠加 review-java、review-mybatis、review-frontend。已批准范围内、低风险且修复方式明确的问题自动修复、复测和复审;范围外或改变契约的问题只报告并等待决策。
|
||||||
@@ -390,7 +394,8 @@ G5 批准后:
|
|||||||
12. G5 批准后只暂存已展示的精确路径,执行暂存检查并创建本地提交。禁止 git add .、git add -A、push、合并、打标签、发布和历史改写。
|
12. G5 批准后只暂存已展示的精确路径,执行暂存检查并创建本地提交。禁止 git add .、git add -A、push、合并、打标签、发布和历史改写。
|
||||||
13. 每阶段满足质量门后自动进入下一阶段。只有审批门、证据不足、权限缺失、脏工作区冲突、敏感信息或高风险外部操作可以暂停。
|
13. 每阶段满足质量门后自动进入下一阶段。只有审批门、证据不足、权限缺失、脏工作区冲突、敏感信息或高风险外部操作可以暂停。
|
||||||
14. 每次等待审批时,给出:已完成事项、产物、关键证据、需要批准的明确内容、批准后的自动动作。不要只问“是否继续”。
|
14. 每次等待审批时,给出:已完成事项、产物、关键证据、需要批准的明确内容、批准后的自动动作。不要只问“是否继续”。
|
||||||
15. 最终报告必须包含文档路径、分支、提交哈希、变更文件、验证结果、审核结论、未提交内容、未验证边界和后续建议。
|
15. 本地提交核对完成后,如果使用了独立 Worktree,确认生命周期已经结束并进入 branch close:展示准确路径、分支、HEAD、干净状态和唯一移除命令,取得确认后移除,验证分支与提交仍存在且主工作区未变化。
|
||||||
|
16. 最终报告必须包含文档路径、分支、提交哈希、变更文件、验证结果、审核结论、未提交内容、未验证边界、Worktree 清理结果和后续建议。
|
||||||
|
|
||||||
现在从 S0 开始执行,并自动推进到 G1。
|
现在从 S0 开始执行,并自动推进到 G1。
|
||||||
```
|
```
|
||||||
@@ -434,6 +439,7 @@ G5 批准后:
|
|||||||
- 代码效果已通过 G4;
|
- 代码效果已通过 G4;
|
||||||
- 提交范围与信息已通过 G5;
|
- 提交范围与信息已通过 G5;
|
||||||
- 本地提交已创建并核对内容;
|
- 本地提交已创建并核对内容;
|
||||||
|
- 使用独立 Worktree 时,其生命周期已经结束并安全移除;若用户明确要求保留现场,则任务状态应说明生命周期尚未结束及分支占用路径;
|
||||||
- 未发生未经授权的 push、合并、发布、生产操作或历史改写。
|
- 未发生未经授权的 push、合并、发布、生产操作或历史改写。
|
||||||
|
|
||||||
如果由于环境或外部依赖无法完成某项验证,任务只能标记为“本地实现完成,等待外部验证”,不能声称全流程验收通过。
|
如果由于环境或外部依赖无法完成某项验证,任务只能标记为“本地实现完成,等待外部验证”,不能声称全流程验收通过。
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "git",
|
"name": "git",
|
||||||
"version": "0.4.0",
|
"version": "0.5.0",
|
||||||
"description": "安全、可复核的通用 Git 工作流。",
|
"description": "安全、可复核的通用 Git 工作流。",
|
||||||
"author": {
|
"author": {
|
||||||
"name": "CraftKit"
|
"name": "CraftKit"
|
||||||
|
|||||||
@@ -1,18 +1,25 @@
|
|||||||
---
|
---
|
||||||
name: branch
|
name: branch
|
||||||
description: 根据当前仓库约定生成名称,并在用户确认准确命令后创建和切换本地 Git 分支。适用于明确要求新建分支的场景;仅查看、重命名、删除、合并、推送或发布分支不应触发本 Skill。
|
description: 根据当前仓库约定,在用户确认后于当前工作区或独立 worktree 创建本地 Git 分支,并在分支任务结束后安全关闭额外 worktree。适用于新增需求、缺陷、维护分支及解除 worktree 分支占用;仅查看、重命名、删除、合并、推送或发布分支不应触发本 Skill。
|
||||||
---
|
---
|
||||||
|
|
||||||
# 创建 Git 分支
|
# 创建 Git 分支
|
||||||
|
|
||||||
安全地创建并切换本地分支。所有检查默认只读;`fetch` 和分支创建分别需要明确授权,不得把它们合并为一次隐含操作。
|
安全地创建本地分支并管理其独立 worktree 生命周期。所有检查默认只读;`fetch`、分支创建和 worktree 移除分别需要明确授权,不得把它们合并为一次隐含操作。
|
||||||
|
|
||||||
|
## 选择模式
|
||||||
|
|
||||||
|
- `create`:规划名称,并在当前工作区或独立 worktree 创建分支。
|
||||||
|
- `close`:分支任务结束后安全移除额外 worktree,释放分支占用。
|
||||||
|
|
||||||
|
涉及独立 worktree 时读取 [Worktree 分支规则](references/worktree-branch.md)。用户只说“创建分支”时进入 `create`;用户要求结束、关闭、清理额外 worktree,或出现分支已被 worktree 占用错误时进入 `close`。
|
||||||
|
|
||||||
## 创建前检查
|
## 创建前检查
|
||||||
|
|
||||||
1. 运行 `git status --short --branch`、`git branch --show-current`、`git branch --list`、`git branch --remotes` 和 `git worktree list --porcelain`。
|
1. 运行 `git status --short --branch`、`git branch --show-current`、`git branch --list`、`git branch --remotes` 和 `git worktree list --porcelain`。
|
||||||
2. 读取当前仓库适用的 `AGENTS.md`、贡献指南或其他明确的分支约定;没有约定时再参考现有分支命名。
|
2. 读取当前仓库适用的 `AGENTS.md`、贡献指南或其他明确的分支约定;没有约定时再参考现有分支命名。
|
||||||
3. 收集分支用途、简短描述和基准引用。不要默认 `main`、`master`、远程名称、版本分支或合并目标。
|
3. 收集分支用途、简短描述和基准引用。不要默认 `main`、`master`、远程名称、版本分支或合并目标。
|
||||||
4. 若工作区不干净,说明现有修改会随切换保留;在用户明确选择继续前不得创建分支,也不得自动暂存、提交、还原或清理。
|
4. 若工作区不干净,列出现有修改并说明直接切换会携带这些修改;不得自动暂存、提交、还原或清理,优先建议使用独立 worktree。
|
||||||
5. `.craftkit/local/**` 和 `.craftkit/cache/**` 不视为业务改动;若它们出现在普通状态中,提示检查 `.craftkit/.gitignore`。`.craftkit/agents/**`、`standards/**`、`knowledge/**`、`handoff/**` 和 `project.json` 属于普通项目改动,应与其他未提交内容一起展示。
|
5. `.craftkit/local/**` 和 `.craftkit/cache/**` 不视为业务改动;若它们出现在普通状态中,提示检查 `.craftkit/.gitignore`。`.craftkit/agents/**`、`standards/**`、`knowledge/**`、`handoff/**` 和 `project.json` 属于普通项目改动,应与其他未提交内容一起展示。
|
||||||
|
|
||||||
## 生成和验证名称
|
## 生成和验证名称
|
||||||
@@ -34,9 +41,11 @@ description: 根据当前仓库约定生成名称,并在用户确认准确命
|
|||||||
- 当前分支和工作区状态;
|
- 当前分支和工作区状态;
|
||||||
- 目标分支名称;
|
- 目标分支名称;
|
||||||
- 基准引用及其提交短哈希;
|
- 基准引用及其提交短哈希;
|
||||||
- 是否会携带未提交修改;
|
- 在当前工作区还是独立 worktree 创建,以及是否影响未提交修改;
|
||||||
- 将执行的唯一创建命令。
|
- 将执行的唯一创建命令。
|
||||||
|
|
||||||
|
工作区干净、当前 checkout 可以切换且用户没有隔离要求时,可以在当前工作区创建。工作区不干净、当前分支被 IDE/服务/测试占用,或用户要求不影响当前 checkout 时,使用独立 worktree;创建前确认目标绝对路径不存在、分支不存在且基准哈希已锁定。
|
||||||
|
|
||||||
本地基准使用:
|
本地基准使用:
|
||||||
|
|
||||||
```text
|
```text
|
||||||
@@ -49,10 +58,16 @@ git switch -c "<branch>" "<base>"
|
|||||||
git switch --no-track -c "<branch>" "<remote>/<base>"
|
git switch --no-track -c "<branch>" "<remote>/<base>"
|
||||||
```
|
```
|
||||||
|
|
||||||
|
独立 worktree 使用:
|
||||||
|
|
||||||
|
```text
|
||||||
|
git worktree add -b "<branch>" "<absolute-worktree-path>" "<base>"
|
||||||
|
```
|
||||||
|
|
||||||
只有用户在看到上述最终信息后明确确认,才执行该命令。用户调整名称或基准后必须重新展示并确认。
|
只有用户在看到上述最终信息后明确确认,才执行该命令。用户调整名称或基准后必须重新展示并确认。
|
||||||
|
|
||||||
## 创建后验证
|
## 创建后验证
|
||||||
|
|
||||||
运行 `git branch --show-current`、`git rev-parse --short HEAD` 和 `git status --short --branch`,确认当前分支、起点和工作区状态。远程基准创建时再用 `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}` 检查没有错误 upstream;命令返回“无 upstream”属于预期结果。
|
在实际创建位置运行 `git branch --show-current`、`git rev-parse --short HEAD` 和 `git status --short --branch`,确认当前分支、起点和工作区状态。独立 worktree 创建后还要复核主工作区分支、HEAD 和未提交内容未变化,并明确报告分支占用路径、后续操作目录以及生命周期结束后的清理义务。远程基准创建时再用 `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}` 检查没有错误 upstream;命令返回“无 upstream”属于预期结果。
|
||||||
|
|
||||||
本 Skill 到此结束,不执行 push、不设置远程 upstream,也不创建合并请求。失败时报告原始错误和当前仓库状态,不自动重试破坏性替代命令。
|
`create` 到此不执行 push、不设置远程 upstream,也不创建合并请求。独立 worktree 在分支任务完成前保持 `active`,完成后必须调用 `close` 进入清理门禁。失败时报告原始错误和当前仓库状态,不自动重试破坏性替代命令。
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
interface:
|
interface:
|
||||||
display_name: "Create Branch"
|
display_name: "Create Branch"
|
||||||
short_description: "确认名称和基准后安全创建本地 Git 分支"
|
short_description: "创建分支并管理独立 Worktree 的安全关闭"
|
||||||
default_prompt: "使用 $branch 为当前仓库规划并创建一个本地分支,执行前先向我确认。"
|
default_prompt: "使用 $branch 规划并创建本地分支;工作区不干净时使用独立 worktree,分支任务结束后安全关闭它,所有写操作前先向我确认。"
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# Worktree 分支规则
|
||||||
|
|
||||||
|
## 创建条件
|
||||||
|
|
||||||
|
满足任一条件时,优先在独立 worktree 创建新需求、缺陷或维护分支,不切换当前主工作区:
|
||||||
|
|
||||||
|
- 主工作区存在未提交文件、本地配置、环境配置或缓存;
|
||||||
|
- 用户要求不影响当前 checkout;
|
||||||
|
- 当前分支正被 IDE、服务或测试占用;
|
||||||
|
- 当前工作需要与主工作区并行进行。
|
||||||
|
|
||||||
|
Worktree 共享仓库对象和本地分支引用。同一个本地分支不能同时被两个 worktree 签出。
|
||||||
|
|
||||||
|
## 创建前检查
|
||||||
|
|
||||||
|
确认主仓库绝对路径、目标 worktree 绝对路径、分支名、基准引用和完整哈希。检查目标路径不存在、同名本地及远程引用的处理已经确认、目标分支未被其他 worktree 占用。分支名可能包含中文时始终加引号。
|
||||||
|
|
||||||
|
取得分支创建授权后执行唯一命令:
|
||||||
|
|
||||||
|
```text
|
||||||
|
git worktree add -b "<branch>" "<absolute-worktree-path>" "<base>"
|
||||||
|
```
|
||||||
|
|
||||||
|
创建后验证新 worktree 的分支、HEAD 和状态,并重新检查主工作区分支、HEAD 和未提交内容未变化。报告该分支的占用路径,提示主工作区不能同时签出,并记录任务完成后的清理义务。
|
||||||
|
|
||||||
|
## 关闭条件
|
||||||
|
|
||||||
|
创建分支的当次操作完成不等于 worktree 生命周期结束。只有分支开发任务、验证和用户要求的交付已经完成,并且用户不再要求保留现场时,才进入 `close`。
|
||||||
|
|
||||||
|
关闭前必须满足:
|
||||||
|
|
||||||
|
- worktree 没有未提交或未跟踪文件;
|
||||||
|
- 没有进行中的 merge、rebase、cherry-pick 或 revert;
|
||||||
|
- 当前 HEAD 已被预期本地分支引用;
|
||||||
|
- 主仓库、worktree 路径、分支和 HEAD 均已准确确认。
|
||||||
|
|
||||||
|
展示检查结果、移除后保留的分支和唯一清理命令,取得用户确认后执行:
|
||||||
|
|
||||||
|
```text
|
||||||
|
git -C "<main-repository>" worktree remove "<absolute-worktree-path>"
|
||||||
|
```
|
||||||
|
|
||||||
|
不得直接删除目录,不得默认使用 `--force`,不得删除或重置分支,也不得批量清理其他 worktree。
|
||||||
|
|
||||||
|
## 关闭后验证
|
||||||
|
|
||||||
|
```text
|
||||||
|
Test-Path -LiteralPath "<absolute-worktree-path>"
|
||||||
|
git -C "<main-repository>" rev-parse --verify "<branch>"
|
||||||
|
git -C "<main-repository>" worktree list --porcelain
|
||||||
|
git -C "<main-repository>" status --short --branch
|
||||||
|
```
|
||||||
|
|
||||||
|
目录不存在、占用记录已释放、分支和提交仍存在、主工作区原有状态未变化时,关闭才算完成。
|
||||||
|
|
||||||
|
## 分支占用错误
|
||||||
|
|
||||||
|
```text
|
||||||
|
fatal: '<branch>' is already used by worktree at '<path>'
|
||||||
|
```
|
||||||
|
|
||||||
|
该错误表示分支仍由指定 worktree 签出。若任务仍在进行,继续在该 worktree 中操作;若任务已经结束,执行 `close`。不得强制 checkout、直接删除目录或删除分支绕过占用保护。
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
---
|
---
|
||||||
name: integrate
|
name: integrate
|
||||||
description: 评估两个 Git 分支的集成风险,并在用户逐步确认后通过隔离 worktree 准备、验证和发布预集成分支。适用于合并前验证或准备 MR/PR;直接修改目标分支、一键推送或未经审查处理冲突不应触发本 Skill。
|
description: 评估两个 Git 分支的集成风险,并在用户逐步确认后通过隔离 worktree 准备、验证、发布和清理预集成分支。适用于合并前验证、准备 MR/PR 或关闭预集成 worktree;直接修改目标分支、一键推送或未经审查处理冲突不应触发本 Skill。
|
||||||
---
|
---
|
||||||
|
|
||||||
# Git 分支集成
|
# Git 分支集成
|
||||||
@@ -12,6 +12,7 @@ description: 评估两个 Git 分支的集成风险,并在用户逐步确认
|
|||||||
- `assess`:只读比较分支、预判冲突和识别交付风险。执行时读取 [评估规则](references/assess.md)。
|
- `assess`:只读比较分支、预判冲突和识别交付风险。执行时读取 [评估规则](references/assess.md)。
|
||||||
- `prepare`:在独立 worktree 中创建预集成分支、执行 merge 并验证。执行时读取 [准备规则](references/prepare.md)。
|
- `prepare`:在独立 worktree 中创建预集成分支、执行 merge 并验证。执行时读取 [准备规则](references/prepare.md)。
|
||||||
- `publish`:推送预集成分支并准备 MR/PR。执行时读取 [发布规则](references/publish.md)。
|
- `publish`:推送预集成分支并准备 MR/PR。执行时读取 [发布规则](references/publish.md)。
|
||||||
|
- `cleanup`:本地交付或发布完成后关闭独立 worktree。执行时读取 [Worktree 生命周期](references/worktree-lifecycle.md)。
|
||||||
|
|
||||||
用户要求“集成”但未明确阶段时,从 `assess` 开始。前一阶段的授权不能自动扩展到后一阶段。
|
用户要求“集成”但未明确阶段时,从 `assess` 开始。前一阶段的授权不能自动扩展到后一阶段。
|
||||||
|
|
||||||
@@ -22,7 +23,9 @@ description: 评估两个 Git 分支的集成风险,并在用户逐步确认
|
|||||||
- fetch、worktree 创建、分支创建、merge、冲突暂存、commit、push 和创建 MR/PR 分别展示准确命令并取得对应确认。
|
- fetch、worktree 创建、分支创建、merge、冲突暂存、commit、push 和创建 MR/PR 分别展示准确命令并取得对应确认。
|
||||||
- 工作区不干净、引用不可解析、已有 worktree 冲突或分支归属不清时停止写操作。
|
- 工作区不干净、引用不可解析、已有 worktree 冲突或分支归属不清时停止写操作。
|
||||||
- 不自动使用 `ours`、`theirs`、rebase、reset、stash、强制推送或历史改写。
|
- 不自动使用 `ours`、`theirs`、rebase、reset、stash、强制推送或历史改写。
|
||||||
- 不直接把预集成分支合入目标分支,也不自动删除 worktree 或分支。
|
- 不直接把预集成分支合入目标分支,也不删除预集成分支。
|
||||||
|
- Worktree 生命周期结束后必须进入 `cleanup` 门禁;未确认准确路径、状态、HEAD 和分支引用前不得移除,也不得使用 `--force`。
|
||||||
|
- 预集成是否合格以目标分支到预集成分支的真实差异为准,不能只凭 merge 输出、分支名、提交数量或测试通过判断。
|
||||||
|
|
||||||
## 环境和本地配置
|
## 环境和本地配置
|
||||||
|
|
||||||
@@ -36,6 +39,7 @@ description: 评估两个 Git 分支的集成风险,并在用户逐步确认
|
|||||||
|
|
||||||
- 只读集成评估报告;
|
- 只读集成评估报告;
|
||||||
- 本地隔离且已验证的预集成分支;
|
- 本地隔离且已验证的预集成分支;
|
||||||
- 经独立授权推送的预集成分支及 MR/PR 建议。
|
- 经独立授权推送的预集成分支及 MR/PR 建议;
|
||||||
|
- 生命周期已经结束并安全移除额外 worktree,同时保留预集成分支和提交。
|
||||||
|
|
||||||
报告源、目标、预集成分支和对应哈希,列出冲突处理、验证结果、环境配置判断及仍需人工完成的动作。
|
报告源、目标、预集成分支和对应哈希,列出冲突处理、验证结果、环境配置判断及仍需人工完成的动作。
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
interface:
|
interface:
|
||||||
display_name: "Integrate Branches"
|
display_name: "Integrate Branches"
|
||||||
short_description: "隔离评估、准备并发布可审查的预集成分支"
|
short_description: "隔离准备、发布并安全清理预集成 Worktree"
|
||||||
default_prompt: "使用 $integrate 先只读评估这两个分支的集成风险,再决定是否准备预集成分支。"
|
default_prompt: "使用 $integrate 先只读评估分支集成风险,再准备和验证预集成分支;生命周期结束后安全移除额外 worktree。"
|
||||||
|
|||||||
@@ -7,6 +7,8 @@
|
|||||||
- 当前工作区和目标 worktree 路径没有未处理状态或归属冲突。
|
- 当前工作区和目标 worktree 路径没有未处理状态或归属冲突。
|
||||||
- 环境配置风险已按项目规范处理;凭据风险为零。
|
- 环境配置风险已按项目规范处理;凭据风险为零。
|
||||||
|
|
||||||
|
创建、复用或关闭独立 worktree 时,同时读取 [Worktree 生命周期](worktree-lifecycle.md)。
|
||||||
|
|
||||||
## 隔离创建
|
## 隔离创建
|
||||||
|
|
||||||
根据项目规范决定预集成分支基于源还是目标。没有规范时说明两种历史形状,由用户选择,不能默认套用固定组织模型。
|
根据项目规范决定预集成分支基于源还是目标。没有规范时说明两种历史形状,由用户选择,不能默认套用固定组织模型。
|
||||||
@@ -32,4 +34,6 @@ git status --short --branch
|
|||||||
|
|
||||||
确认源、目标引用仍等于操作前哈希;只有预集成分支发生变化。记录 merge 提交、测试结果和未验证边界。
|
确认源、目标引用仍等于操作前哈希;只有预集成分支发生变化。记录 merge 提交、测试结果和未验证边界。
|
||||||
|
|
||||||
保留 worktree 供用户复核。清理 worktree、删除分支或中止 merge 都是独立操作,不属于自动收尾。
|
必须以目标引用为基准检查 `git diff --check "<target>...HEAD"`、`git diff --stat "<target>...HEAD"`、`git diff --name-status "<target>...HEAD"` 和 `git log --oneline "<target>..HEAD"`。最终文件清单包含本地配置、缓存、IDE 文件或无关需求文件时停止,不得进入交付阶段。
|
||||||
|
|
||||||
|
需要人工复核时暂时保留 worktree 并标记为 `delivery-ready`。用户确认仅本地交付,或完成已授权的发布后,生命周期进入 `cleanup-ready`,必须继续执行清理门禁。中止 merge 和删除分支不属于自动收尾。
|
||||||
|
|||||||
@@ -23,3 +23,7 @@
|
|||||||
- 关联任务或项目文档。
|
- 关联任务或项目文档。
|
||||||
|
|
||||||
默认只给出标题、描述、命令或网页入口。实际创建 MR/PR 需要新的明确授权;审核、合并、删除远程分支和删除 worktree 均不在本阶段自动执行。
|
默认只给出标题、描述、命令或网页入口。实际创建 MR/PR 需要新的明确授权;审核、合并、删除远程分支和删除 worktree 均不在本阶段自动执行。
|
||||||
|
|
||||||
|
## 发布后收尾
|
||||||
|
|
||||||
|
完成用户已授权的推送或 MR/PR 创建后,确认远程结果和本地预集成分支仍可解析,然后将 worktree 标记为 `cleanup-ready`,继续读取 [Worktree 生命周期](worktree-lifecycle.md) 并执行清理门禁。移除额外 worktree 不删除本地或远程分支。
|
||||||
|
|||||||
@@ -0,0 +1,103 @@
|
|||||||
|
# Worktree 生命周期
|
||||||
|
|
||||||
|
## 适用范围
|
||||||
|
|
||||||
|
本规则管理预集成独立 worktree 从创建到安全移除的完整生命周期。主工作区不干净、用户要求不影响当前 checkout、当前分支被 IDE/服务/测试占用、需要复用旧预集成分支或预计发生冲突时,必须使用独立 worktree。
|
||||||
|
|
||||||
|
Worktree 只隔离工作目录;所有 worktree 共享仓库对象和本地分支引用。同一个本地分支不能同时被两个 worktree 签出。
|
||||||
|
|
||||||
|
## 生命周期状态
|
||||||
|
|
||||||
|
- `planned`:已确认仓库、分支、基准和绝对路径,尚未创建。
|
||||||
|
- `active`:worktree 已创建,开发、合并或验证正在进行。
|
||||||
|
- `delivery-ready`:差异和验证完成,等待本地交付确认或发布。
|
||||||
|
- `cleanup-ready`:本地交付已确认,或用户要求的发布已经完成,可以清理。
|
||||||
|
- `cleanup-blocked`:存在未提交内容、进行中的 Git 操作、引用风险或需要保留的现场。
|
||||||
|
- `removed`:额外 worktree 已移除,分支和提交仍存在。
|
||||||
|
|
||||||
|
## 创建和占用记录
|
||||||
|
|
||||||
|
创建前确认目标绝对路径不存在、目标分支未被其他 worktree 占用、基准引用可解析并记录完整哈希。分支名可能包含中文时始终加引号,不使用 `$HOME`、`$home` 或 `$CODEX_HOME` 作为任务变量。
|
||||||
|
|
||||||
|
创建后记录并报告:
|
||||||
|
|
||||||
|
- 主仓库绝对路径;
|
||||||
|
- worktree 绝对路径;
|
||||||
|
- worktree 当前分支和 HEAD;
|
||||||
|
- 主工作区当前分支、HEAD 和未提交状态;
|
||||||
|
- 该分支已被额外 worktree 占用,主工作区不能同时签出;
|
||||||
|
- 后续操作目录和生命周期结束后的清理义务。
|
||||||
|
|
||||||
|
## 新建或复用预集成
|
||||||
|
|
||||||
|
旧预集成已经合入目标分支时,默认新建增量预集成分支,使交付历史易于审计。只有用户明确选择复用,并且旧预集成可解析、上次源分支基线已包含、旧预集成与目标分支关系已查清、最终 `<target>...HEAD` 可收敛为本次需求文件时,才能继续复用。
|
||||||
|
|
||||||
|
历史中存在直接合入错误版本分支、无关需求或异常大量文件时,不得只因引用可解析就复用。复用时推荐先合入源分支最新增量,再合入最新目标分支;项目规范规定其他拓扑时以项目规范为准。
|
||||||
|
|
||||||
|
## 交付范围和结束条件
|
||||||
|
|
||||||
|
Merge 输出出现大量目标分支文件不等于 MR/PR 包含这些文件。必须检查:
|
||||||
|
|
||||||
|
```text
|
||||||
|
git diff --check "<target>...HEAD"
|
||||||
|
git diff --stat "<target>...HEAD"
|
||||||
|
git diff --name-status "<target>...HEAD"
|
||||||
|
git log --oneline "<target>..HEAD"
|
||||||
|
git log --first-parent --oneline -20
|
||||||
|
```
|
||||||
|
|
||||||
|
只有同时满足以下条件,生命周期才可进入 `cleanup-ready`:
|
||||||
|
|
||||||
|
- 本次开发或预集成已经完成;
|
||||||
|
- 用户要求的验证已经完成;
|
||||||
|
- 用户确认仅本地交付,或用户要求的发布已经完成;
|
||||||
|
- worktree 没有未提交或未跟踪文件;
|
||||||
|
- 没有进行中的 merge、rebase、cherry-pick 或 revert;
|
||||||
|
- 当前 HEAD 已被预期本地分支引用;
|
||||||
|
- 用户不再要求保留现场。
|
||||||
|
|
||||||
|
用户要求保留现场时标记为 `delivery-ready`,明确说明生命周期尚未结束以及分支仍被该 worktree 占用。
|
||||||
|
|
||||||
|
## 清理门禁
|
||||||
|
|
||||||
|
移除前展示主仓库和 worktree 的准确绝对路径、分支、HEAD、状态、分支引用验证和唯一清理命令。检查至少包括:
|
||||||
|
|
||||||
|
```text
|
||||||
|
git -C "<worktree>" status --porcelain
|
||||||
|
git -C "<worktree>" branch --show-current
|
||||||
|
git -C "<worktree>" rev-parse HEAD
|
||||||
|
git -C "<worktree>" rev-parse -q --verify MERGE_HEAD
|
||||||
|
git -C "<main-repository>" worktree list --porcelain
|
||||||
|
git -C "<main-repository>" branch --contains "<head-sha>"
|
||||||
|
```
|
||||||
|
|
||||||
|
`MERGE_HEAD` 不存在是预期结果。还要依据 Git 状态确认不存在 rebase、cherry-pick 或 revert;任一操作未结束时标记为 `cleanup-blocked`。
|
||||||
|
|
||||||
|
用户确认准确清理信息后执行:
|
||||||
|
|
||||||
|
```text
|
||||||
|
git -C "<main-repository>" worktree remove "<absolute-worktree-path>"
|
||||||
|
```
|
||||||
|
|
||||||
|
不得直接删除目录,不得默认使用 `--force`,不得为解除占用而删除或重置分支,也不得批量清理其他 worktree。
|
||||||
|
|
||||||
|
## 清理后验证
|
||||||
|
|
||||||
|
```text
|
||||||
|
Test-Path -LiteralPath "<absolute-worktree-path>"
|
||||||
|
git -C "<main-repository>" rev-parse --verify "<branch>"
|
||||||
|
git -C "<main-repository>" worktree list --porcelain
|
||||||
|
git -C "<main-repository>" status --short --branch
|
||||||
|
```
|
||||||
|
|
||||||
|
只有目录不存在、worktree 列表已释放占用、分支和提交仍存在、主工作区原有状态未变化时,才能标记为 `removed`。
|
||||||
|
|
||||||
|
## 分支已被占用
|
||||||
|
|
||||||
|
出现以下错误表示目标分支仍由额外 worktree 签出:
|
||||||
|
|
||||||
|
```text
|
||||||
|
fatal: '<branch>' is already used by worktree at '<path>'
|
||||||
|
```
|
||||||
|
|
||||||
|
继续在错误给出的 worktree 中操作,或者在其生命周期结束并通过清理门禁后移除。不得强制 checkout、直接删除目录或删除分支绕过 Git 的占用保护。
|
||||||
Reference in New Issue
Block a user