@devcxl/opencode-cabbage 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.codex-plugin/plugin.json +36 -0
- package/README.md +67 -21
- package/README.zh.md +26 -13
- package/assets/agents/dev-lifecycle.md +6 -0
- package/assets/prompts/bootstrap.md +4 -0
- package/assets/skills/flow-change/SKILL.md +109 -0
- package/assets/skills/flow-design/SKILL.md +15 -0
- package/assets/skills/flow-docs/SKILL.md +112 -0
- package/assets/skills/flow-incident/SKILL.md +98 -0
- package/assets/skills/flow-research/SKILL.md +9 -0
- package/assets/skills/flow-setup/SKILL.md +13 -0
- package/codex-skills/agent-architect/SKILL.md +79 -0
- package/codex-skills/agent-dev-lifecycle/SKILL.md +311 -0
- package/codex-skills/agent-developer/SKILL.md +51 -0
- package/codex-skills/agent-goal-verify/SKILL.md +45 -0
- package/codex-skills/agent-researcher/SKILL.md +32 -0
- package/codex-skills/agent-reviewer/SKILL.md +109 -0
- package/codex-skills/flow-change/SKILL.md +109 -0
- package/codex-skills/flow-code/SKILL.md +71 -0
- package/codex-skills/flow-design/SKILL.md +161 -0
- package/codex-skills/flow-docs/SKILL.md +112 -0
- package/codex-skills/flow-incident/SKILL.md +98 -0
- package/codex-skills/flow-release/SKILL.md +90 -0
- package/codex-skills/flow-requirements/SKILL.md +90 -0
- package/codex-skills/flow-research/SKILL.md +86 -0
- package/codex-skills/flow-review/SKILL.md +110 -0
- package/codex-skills/flow-setup/SKILL.md +88 -0
- package/codex-skills/flow-tasks/SKILL.md +220 -0
- package/codex-skills/flow-tdd/SKILL.md +235 -0
- package/dist/hooks/session-start.d.ts +1 -0
- package/dist/hooks/session-start.js +72 -0
- package/dist/hooks/session-start.js.map +1 -0
- package/dist/index.d.ts +2 -5
- package/dist/index.js +1 -4
- package/dist/index.js.map +1 -1
- package/dist/plugin/agents.d.ts +20 -0
- package/dist/plugin/agents.js +79 -0
- package/dist/plugin/agents.js.map +1 -1
- package/dist/plugin/cabbage-cli.d.ts +28 -0
- package/dist/plugin/cabbage-cli.js +92 -0
- package/dist/plugin/cabbage-cli.js.map +1 -0
- package/dist/plugin/cabbage-tool.d.ts +103 -0
- package/dist/plugin/cabbage-tool.js +169 -0
- package/dist/plugin/cabbage-tool.js.map +1 -0
- package/dist/plugin/commands.d.ts +10 -0
- package/dist/plugin/commands.js +1 -1
- package/dist/plugin/commands.js.map +1 -1
- package/dist/plugin/continuation.d.ts +22 -0
- package/dist/plugin/continuation.js +233 -0
- package/dist/plugin/continuation.js.map +1 -0
- package/dist/plugin/goal-store.d.ts +64 -0
- package/dist/plugin/goal-store.js +57 -0
- package/dist/plugin/goal-store.js.map +1 -0
- package/dist/plugin/goal.d.ts +95 -38
- package/dist/plugin/goal.js +208 -199
- package/dist/plugin/goal.js.map +1 -1
- package/dist/plugin/install-dir.d.ts +13 -0
- package/dist/plugin/install-dir.js +46 -0
- package/dist/plugin/install-dir.js.map +1 -0
- package/dist/plugin/server.d.ts +4 -12
- package/dist/plugin/server.js +279 -423
- package/dist/plugin/server.js.map +1 -1
- package/dist/plugin/session-abort.d.ts +5 -0
- package/dist/plugin/session-abort.js +26 -0
- package/dist/plugin/session-abort.js.map +1 -0
- package/dist/plugin/skills.d.ts +15 -0
- package/dist/plugin/skills.js +47 -50
- package/dist/plugin/skills.js.map +1 -1
- package/dist/plugin.d.ts +2 -2
- package/dist/plugin.js +6 -2
- package/dist/plugin.js.map +1 -1
- package/dist/util/paths.d.ts +0 -6
- package/dist/util/paths.js +0 -15
- package/dist/util/paths.js.map +1 -1
- package/hooks/hooks.json +17 -0
- package/package.json +13 -8
- package/vendor/cabbage/MANIFEST.json +8 -0
- package/vendor/cabbage/cabbage_cli/__init__.py +1 -0
- package/vendor/cabbage/cabbage_cli/__main__.py +2 -0
- package/vendor/cabbage/cabbage_cli/assets/docs-site/.vitepress/config.ts +78 -0
- package/vendor/cabbage/cabbage_cli/assets/docs-site/README.md +31 -0
- package/vendor/cabbage/cabbage_cli/assets/docs-site/package.json +16 -0
- package/vendor/cabbage/cabbage_cli/assets/docs-site/pnpm-lock.yaml +2504 -0
- package/vendor/cabbage/cabbage_cli/assets/integrations/cabbage.yml +127 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/adr.md +47 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/api-design.md +45 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/change-record.md +21 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/database-design.md +37 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/generic.md +20 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/impact.md +41 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/incident.md +48 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/postmortem.md +43 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/prd.md +71 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/release-plan.md +45 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/rfc.md +44 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/security-review.md +35 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/tasks.md +62 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/tech-spec.md +87 -0
- package/vendor/cabbage/cabbage_cli/assets/templates/test-plan.md +44 -0
- package/vendor/cabbage/cabbage_cli/assets/workflows/change.yaml +11 -0
- package/vendor/cabbage/cabbage_cli/assets/workflows/incident.yaml +4 -0
- package/vendor/cabbage/cabbage_cli/cli.py +283 -0
- package/vendor/cabbage/cabbage_cli/core.py +606 -0
- package/vendor/cabbage/cabbage_cli/scaffold.py +313 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-change
|
|
3
|
+
description: Maintain a Cabbage change record (tasks + documents) through the built-in `cabbage` tool — create the record, declare risk flags, verify stages, pass gates, sync to docs, archive after merge. Use for bug fixes, refactors, small features, hotfixes, or whenever a tracked record with tasks.md and verification evidence is required in this repository.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-change
|
|
7
|
+
|
|
8
|
+
本仓库的变更记录机制由插件内置的 Cabbage 引擎提供(`cabbage` 工具,无需手工安装)。
|
|
9
|
+
一份记录 = 一个目录(`.cabbage/changes/<id>/`):默认只有一份 `tasks.md`,
|
|
10
|
+
高风险时用影响标记展开专项文档;验证通过、合并确认后归档并同步到 `docs/`。
|
|
11
|
+
|
|
12
|
+
## 何时启用
|
|
13
|
+
|
|
14
|
+
- 任何需要留痕的代码改动:bug 修复、重构、小功能、紧急修复、业务调整。
|
|
15
|
+
- 大流程(requirements/design/code/...)中的具体代码改动:在对应阶段用记录承载
|
|
16
|
+
Goal/Design/Tasks/Verification 与验收证据。
|
|
17
|
+
- **不启用**:纯文档小修(直接改归属文档,用 `flow-docs` 约定)、一次性问答、纯调研
|
|
18
|
+
(见 `flow-research`,调研本身不建记录)。
|
|
19
|
+
|
|
20
|
+
## 默认路径:一次变更一份记录
|
|
21
|
+
|
|
22
|
+
1. 创建记录(需要项目已初始化;未初始化先 `op:"init"`):
|
|
23
|
+
- `cabbage({op:"new", type:"change", change:"fix-label"})`
|
|
24
|
+
- 事故复盘用 `type:"incident"`(incident → postmortem → tasks)。
|
|
25
|
+
2. 填写 `tasks.md`:`Goal`(含复现的问题)、`Design`(最小方案)、`Tasks`、`Verification`。
|
|
26
|
+
3. 实现前评估风险并声明标记(会生成对应专项文档):
|
|
27
|
+
- `cabbage({op:"impact", change:"fix-label", impact:["api=true","design=true"]})`
|
|
28
|
+
- 标记表:`design`→tech-spec、`rfc`→rfc、`architecture`→adr、`api`→api-design、
|
|
29
|
+
`database`→database-design、`security`→security-review、`deployment`→release-plan。
|
|
30
|
+
- 数据迁移 = `database` + `deployment`;跨团队评审 = `rfc`(+按需 `design`)。
|
|
31
|
+
4. 复现失败 → 最小修复 → 回归测试;完成任务清单并写入真实命令与结果。
|
|
32
|
+
5. 逐级验证与门禁:
|
|
33
|
+
- `cabbage({op:"verify", change:"fix-label", stage:"tasks"})`(有专项阶段先逐一验证)
|
|
34
|
+
- `cabbage({op:"gate", change:"fix-label", target:"merge"})` → 应输出 ALLOWED。
|
|
35
|
+
6. 合并后收尾:确认合并 → `cabbage({op:"archive", change:"fix-label"})`(自动 sync + 归档)。
|
|
36
|
+
|
|
37
|
+
速查(亮路径全链路):
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
cabbage({op:"new", type:"change", change:"fix-label"})
|
|
41
|
+
cabbage({op:"impact", change:"fix-label", impact:["api=true"]}) # 仅在确有风险时
|
|
42
|
+
cabbage({op:"verify", change:"fix-label", stage:"tasks"}) # 专项阶段先行
|
|
43
|
+
cabbage({op:"gate", change:"fix-label", target:"merge"}) # 期望 ALLOWED
|
|
44
|
+
cabbage({op:"archive", change:"fix-label"}) # 确认合并后
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## 约束
|
|
48
|
+
|
|
49
|
+
- `change.yaml` 与 `state.json` 由 CLI 管理,不要手工编辑;验证后修改产物会让阶段 `stale`。
|
|
50
|
+
- 只声明真实风险;不为省文档隐瞒影响,也不为凑文档虚报标记。
|
|
51
|
+
- `archive` 不检查 Git 合并状态:必须人工确认合并后再归档。
|
|
52
|
+
- 记录描述单次改动;系统当前行为写入 `docs/` 编号目录(sync 只按映射复制,不做语义合并)。
|
|
53
|
+
- CLI 不可用(缺 Python 3.10+)时工具会返回明确错误:告知用户安装 Python,不要伪造验证结果。
|
|
54
|
+
|
|
55
|
+
## 常用操作
|
|
56
|
+
|
|
57
|
+
| 操作 | 用途 |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| `init` | 初始化 `.cabbage/`(工作流、CI 模板、vendored CLI),每项目一次 |
|
|
60
|
+
| `status` / `next` | 记录列表与阶段就绪/阻塞(不猜阶段 ID,以 `next` 为准) |
|
|
61
|
+
| `verify` / `gate` | 阶段验证与门禁(`target`:阶段 ID / `merge` / `archive`) |
|
|
62
|
+
| `validate` | 结构校验(省略 `change` 校验全部) |
|
|
63
|
+
| `sync` / `archive` | 同步当前文档 / 收尾归档 |
|
|
64
|
+
| `tasks` / `discard` | 任务清单只读视图 / 废弃记录 |
|
|
65
|
+
|
|
66
|
+
> 无本插件工具的环境(如 Codex):以上操作对应 `python3 -m cabbage_cli <操作>` 直跑 CLI
|
|
67
|
+
> (CLI 需本地可用),语义与参数一致。
|
|
68
|
+
|
|
69
|
+
## Contract
|
|
70
|
+
|
|
71
|
+
### Trigger
|
|
72
|
+
由 `@dev-lifecycle` 分诊(Bug 修复、重构、业务调整、紧急修复等轻量路径)或用户要求建立变更记录时触发;
|
|
73
|
+
大流程的代码改动也可在实现阶段引用本 skill。
|
|
74
|
+
|
|
75
|
+
### Inputs
|
|
76
|
+
- 变更描述(问题/目标、影响范围)
|
|
77
|
+
- 变更 id(kebab-case,按功能派生)
|
|
78
|
+
- 可选:影响标记(design/rfc/architecture/api/database/security/deployment)
|
|
79
|
+
|
|
80
|
+
### Preconditions
|
|
81
|
+
- 项目已初始化(无 `.cabbage/` 时先 `init`)
|
|
82
|
+
- 插件内置引擎可用(缺 Python 3.10+ 时停止并告知用户)
|
|
83
|
+
|
|
84
|
+
### Procedure
|
|
85
|
+
1. 创建记录并填写 `tasks.md` 的 Goal 与 Design
|
|
86
|
+
2. 实现前声明真实风险标记(必要时)
|
|
87
|
+
3. 实现并完成 Tasks 清单,记录真实验证命令与结果
|
|
88
|
+
4. 逐一 `verify` 已启用阶段(专项在前、`tasks` 在后)
|
|
89
|
+
5. `gate merge` 通过后交回编排器提交;合并确认后 `archive`
|
|
90
|
+
|
|
91
|
+
### Outputs
|
|
92
|
+
- `.cabbage/changes/<id>/`:tasks.md 与按需专项文档(验证后签名写入 state.json)
|
|
93
|
+
- 归档:`.cabbage/archive/<year>/<id>/` 与 `docs/` 的同步文档
|
|
94
|
+
|
|
95
|
+
### Failure
|
|
96
|
+
- `gate` BLOCKED → 用 `next` 找到未完成的已启用前置阶段并验证
|
|
97
|
+
- `placeholder content remains` / `unchecked tasks remain` → 清除模板提示、勾选任务后再验证
|
|
98
|
+
- 阶段 `stale` → 对照上游变化重新审阅并重新验证
|
|
99
|
+
- CLI 不可用 → 告知用户安装 Python 3.10+,不得伪造记录或验证结果
|
|
100
|
+
|
|
101
|
+
### Idempotency
|
|
102
|
+
- 同名记录已存在 → 复用并更新(`new` 报错说明已存在)
|
|
103
|
+
- 重复 `verify` 同一未变化阶段 → 幂等,仅刷新签名时间
|
|
104
|
+
- 重复 `sync` → 按映射覆盖目标文档,无副作用
|
|
105
|
+
|
|
106
|
+
### Prohibited Actions
|
|
107
|
+
- 不手工编辑 `change.yaml` / `state.json`
|
|
108
|
+
- 不在实现前伪造验证结果(专项文档写待执行步骤,真实结果回填 `tasks.md`)
|
|
109
|
+
- 不在未确认合并时 `archive`;不为通过门禁删改 CI 与工作流文件
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-code
|
|
3
|
+
description: 编码实现 — worktree + TDD(flow-tdd 协议)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-code
|
|
7
|
+
|
|
8
|
+
认领 Task Record(Sub Issue),在 worktree 内按 TDD 实现代码与单测。
|
|
9
|
+
worktree 创建、PR 提交由 primary 编排器执行,本 skill 定义编码流程。
|
|
10
|
+
|
|
11
|
+
## 核心流程
|
|
12
|
+
|
|
13
|
+
1. **创建/复用 worktree**(编排器执行)
|
|
14
|
+
```bash
|
|
15
|
+
BASE=$(gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name')
|
|
16
|
+
git worktree add ".worktree/<task-slug>" -b "feat/<task-slug>" "$BASE"
|
|
17
|
+
cd ".worktree/<task-slug>" && pwd
|
|
18
|
+
```
|
|
19
|
+
2. 加载 `flow-tdd` skill,按 Task 的验收标准执行 RED→GREEN cycle(self-report)
|
|
20
|
+
3. 本地 `git add`(限定文件)+ `git commit`(多次提交)
|
|
21
|
+
4. **不 push、不创建 PR** — 由 primary 编排器统一执行
|
|
22
|
+
|
|
23
|
+
## 编码约束
|
|
24
|
+
|
|
25
|
+
- 只改 Task 相关的文件;遵循项目现有代码规范与分层结构
|
|
26
|
+
- 遵循工程原则(KISS/YAGNI/DRY/SRP/最小变更,单份引用仓库 AGENTS.md)
|
|
27
|
+
- 文档同步:涉及 guides/api/db 变更时随代码同 PR 更新
|
|
28
|
+
|
|
29
|
+
## TDD 引用
|
|
30
|
+
|
|
31
|
+
> `flow-tdd` skill 是 TDD 协议的唯一来源,包含完整的 RED→GREEN cycle 状态机、
|
|
32
|
+
> abandon-cycle 规则和 final-regression/verification 流程。测试质量由仓库 CI 把关。
|
|
33
|
+
|
|
34
|
+
## Output
|
|
35
|
+
- 本地 commit 就绪(分支推送与 PR 由编排器完成)
|
|
36
|
+
|
|
37
|
+
## 后续
|
|
38
|
+
- **/review** — 审查 PR
|
|
39
|
+
|
|
40
|
+
## Contract
|
|
41
|
+
|
|
42
|
+
### Trigger
|
|
43
|
+
由 `/code` 命令或 `@dev-lifecycle` Phase 3 触发。
|
|
44
|
+
|
|
45
|
+
### Inputs
|
|
46
|
+
- Task Record(Sub Issue 编号与标题,来源:`/tasks` 产出)
|
|
47
|
+
|
|
48
|
+
### Preconditions
|
|
49
|
+
- `/tasks` 已完成 → Sub Issues 就绪
|
|
50
|
+
- 设计基线已合入;前置依赖任务已合并
|
|
51
|
+
|
|
52
|
+
### Procedure
|
|
53
|
+
1. 在 `.worktree/<task-slug>` 创建/复用 worktree(编排器执行)
|
|
54
|
+
2. 加载 `flow-tdd`,按 Task 验收标准执行 RED→GREEN cycle
|
|
55
|
+
3. 本地 git add + commit(不 push)
|
|
56
|
+
4. 交回 primary 编排器 push + 创建 PR
|
|
57
|
+
|
|
58
|
+
### Outputs
|
|
59
|
+
- 本地 commit
|
|
60
|
+
|
|
61
|
+
### Failure
|
|
62
|
+
- worktree 创建失败 → 检查分支冲突或目录残留
|
|
63
|
+
- 测试失败 → 修复后重试(不跳过 RED)
|
|
64
|
+
|
|
65
|
+
### Idempotency
|
|
66
|
+
- worktree 已存在 → 校验分支一致性后复用
|
|
67
|
+
- 代码已提交 → 追加提交
|
|
68
|
+
|
|
69
|
+
### Prohibited Actions
|
|
70
|
+
- 不 push、不创建 PR、不操作 Issue(由编排器统一执行)
|
|
71
|
+
- 不使用 `git add .`(限定变更文件)
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-design
|
|
3
|
+
description: 技术方案设计 → 方案文档 + ADR → Planning PR
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-design
|
|
7
|
+
|
|
8
|
+
基于 PRD 进行技术方案设计,产出方案文档与 ADR,并通过 Planning PR 合入形成设计基线。
|
|
9
|
+
|
|
10
|
+
## 核心流程
|
|
11
|
+
|
|
12
|
+
1. **创建工作分支**(在默认分支基础上)
|
|
13
|
+
```bash
|
|
14
|
+
BASE=$(gh repo view --json defaultBranchRef --jq '.defaultBranchRef.name')
|
|
15
|
+
git checkout $BASE && git pull origin $BASE
|
|
16
|
+
git checkout -b "feat/<slug>-design"
|
|
17
|
+
```
|
|
18
|
+
2. **产出文档**:
|
|
19
|
+
- 根 `CONTEXT.md` 术语更新(如发现新领域术语)
|
|
20
|
+
- `docs/prd/<title>.md`(PRD 确认版)
|
|
21
|
+
- `docs/dev/specs/<title>.md`(技术方案)
|
|
22
|
+
- `docs/adr/<date>-<slug>.md`(ADR 决议)
|
|
23
|
+
3. **提交并创建 Planning PR**
|
|
24
|
+
```bash
|
|
25
|
+
git add -A && git commit -m "docs: <slug> design baseline"
|
|
26
|
+
git push -u origin "feat/<slug>-design"
|
|
27
|
+
gh pr create --base $BASE --head "feat/<slug>-design" \
|
|
28
|
+
--title "design: <slug>" --body "Planning Baseline for <slug>"
|
|
29
|
+
```
|
|
30
|
+
4. **合入基线**:PR 合并后即形成设计基线(Planning Baseline),后续任务拆解以此为前置。
|
|
31
|
+
|
|
32
|
+
## ADR 内容标准
|
|
33
|
+
|
|
34
|
+
ADR 是决策记录,不是设计文档。只有改变组件边界、拓扑、关键依赖或数据归属的决策才写 ADR;
|
|
35
|
+
仅实现细节、内部重构、无长期影响的选型不写,记入变更记录即可。
|
|
36
|
+
|
|
37
|
+
必需标题(工作流逐字校验 `Context` / `Decision` / `Consequences`):
|
|
38
|
+
|
|
39
|
+
- `Context`:约束和现状,不写解决方案。
|
|
40
|
+
- `Decision`:选了什么**以及为什么**,列出被否决的备选方案和否决理由。
|
|
41
|
+
- `Consequences`:同时写正面和负面影响,包括引入的运维负担与待办。
|
|
42
|
+
|
|
43
|
+
需要跨团队评审、方案尚未定案时先写 RFC(`Problem` / `Proposal` / `Alternatives`),评审通过后再落 ADR。
|
|
44
|
+
**已合并的 ADR/RFC 不重命名、不改写**:新决策用新记录显式取代旧的,旧记录保留可追溯。
|
|
45
|
+
完整接口契约进 API 文档、表结构与迁移进数据库文档、测试策略进测试计划——不要塞进 ADR。
|
|
46
|
+
|
|
47
|
+
## 设计约束
|
|
48
|
+
|
|
49
|
+
技术方案必须遵循以下原则:
|
|
50
|
+
|
|
51
|
+
1. **首选最简单方案** — 如果两个方案都能满足 PRD,选更简单的
|
|
52
|
+
2. **不引入不必要的新技术** — 不要因为"这个技术很流行"而使用它
|
|
53
|
+
3. **方案自检** — 每个设计决策必须能回答"为什么不用更简单的替代方案?"
|
|
54
|
+
4. **ADR 记录简化决策** — 如果选择复杂方案,必须在 ADR 中说明为何简单方案不够
|
|
55
|
+
|
|
56
|
+
## 设计语言
|
|
57
|
+
|
|
58
|
+
技术方案使用以下语言描述可测试设计:
|
|
59
|
+
|
|
60
|
+
- **Module** — 具有 Interface 与 Implementation 的模块,不限定为函数、类或包。
|
|
61
|
+
- **Interface** — 调用者正确使用 Module 必须知道的全部信息,包括输入输出、约束、错误与副作用。
|
|
62
|
+
- **Seam** — 可以通过 Interface 观察或替换行为的位置,也是测试验证行为的公共边界。
|
|
63
|
+
- **Adapter** — 在 Seam 处满足 Interface 的具体实现。
|
|
64
|
+
- **Depth** — Interface 越小、背后隐藏的有效复杂性越多,Module 越深。
|
|
65
|
+
|
|
66
|
+
设计时必须检查:
|
|
67
|
+
|
|
68
|
+
1. Interface 是否保持小而完整,并把复杂性留在 Module 内部,而不是泄漏给多个调用者。
|
|
69
|
+
2. 调用者与测试是否可以通过同一个 Seam 使用和验证行为。
|
|
70
|
+
3. 是否真的需要新的 Seam。一个 Adapter 只代表假设的 Seam;只有存在真实替换需求或多个 Adapter 时才引入抽象。
|
|
71
|
+
4. 是否出现只做透传的浅 Module、`FooService/FooServiceImpl` 式空壳抽象或为未来预留的 Interface。
|
|
72
|
+
|
|
73
|
+
## Testing Decisions
|
|
74
|
+
|
|
75
|
+
技术方案必须包含 `Testing Decisions`,在进入 Task Planning 前为每个关键行为明确:
|
|
76
|
+
|
|
77
|
+
```markdown
|
|
78
|
+
## Testing Decisions
|
|
79
|
+
|
|
80
|
+
### <behavior>
|
|
81
|
+
|
|
82
|
+
- Test Seam: <用于触发并观察行为的公共 Interface>
|
|
83
|
+
- Observable Result: <通过该 Seam 可观察的结果或错误>
|
|
84
|
+
- Test Level: <与仓库现有测试体系一致的最窄有效层级>
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Test Seam 应描述公共行为边界,例如 Session API,而不是 `SessionRepositoryImpl.restore()` 等实现细节。优先复用现有 Seam;不要为了方便 mock 而创建生产抽象。
|
|
88
|
+
|
|
89
|
+
## 存量 Design Amendment
|
|
90
|
+
|
|
91
|
+
当 tasks、code 或 review 阶段发现旧技术方案缺少 `Testing Decisions` 时,调用方可以在**保持当前 lifecycle stage 不变**的前提下委派 `@architect` 补齐设计:
|
|
92
|
+
|
|
93
|
+
1. 读取 Design Gap、原技术方案、相关 PRD / ADR 与 repository context。
|
|
94
|
+
2. 优先识别仓库已有的公共 Interface 和测试惯例,不为了补字段创建新 Seam。
|
|
95
|
+
3. 只向原技术方案补充缺失行为的 `Testing Decisions`,不重写其他设计内容。
|
|
96
|
+
4. 返回已修改文件和补充的 behavior / Test Seam / Observable Result。
|
|
97
|
+
|
|
98
|
+
如果补齐过程暴露新的架构取舍或多个无法直接判断的 Seam 方案,停止 amendment 并把决策交给用户;不得静默扩大设计。Design Amendment 不回退 goal stage、不重复勾选阶段,也不单独创建新的 lifecycle 状态。
|
|
99
|
+
|
|
100
|
+
Design Amendment 是兼容子流程,覆盖本 skill 的普通发布流程:不创建 design 分支、Planning PR 或新 ADR。`@architect` 只修改技术方案,primary 负责在当前 stage 保存变更并把补充内容传给后续 agent。
|
|
101
|
+
|
|
102
|
+
## CONTEXT.md 术语
|
|
103
|
+
|
|
104
|
+
阅读项目根 CONTEXT.md(领域术语权威,已自动注入内容与 digest);
|
|
105
|
+
设计中发现的新术语经用户确认后写入根 CONTEXT.md。
|
|
106
|
+
|
|
107
|
+
## Output
|
|
108
|
+
- `docs/dev/specs/<title>.md` — 技术方案(包含 Module / Interface 设计与 Testing Decisions)
|
|
109
|
+
- `docs/adr/<date>-<slug>.md` — ADR 决议
|
|
110
|
+
- 根 CONTEXT.md 术语更新(如发现新术语)
|
|
111
|
+
- Planning PR(合入后 = 设计基线)
|
|
112
|
+
|
|
113
|
+
## 后续
|
|
114
|
+
- **/tasks** — 基于设计方案拆解为 DAG 任务
|
|
115
|
+
|
|
116
|
+
## Contract
|
|
117
|
+
|
|
118
|
+
### Trigger
|
|
119
|
+
由 `/design` 命令、`@dev-lifecycle` Phase 1,或存量 Flow 的 Testing Decisions 兼容门触发。
|
|
120
|
+
|
|
121
|
+
### Inputs
|
|
122
|
+
- `docs/prd/<title>.md` — 上游 PRD(来源:requirements 阶段产出)
|
|
123
|
+
- Parent Issue 编号(来源:requirements 阶段产出)
|
|
124
|
+
|
|
125
|
+
### Preconditions
|
|
126
|
+
- `/requirements` 已完成 → PRD 与 Parent Issue 存在
|
|
127
|
+
- requirements 基线已用户确认
|
|
128
|
+
|
|
129
|
+
### Procedure
|
|
130
|
+
普通 design 流程:
|
|
131
|
+
|
|
132
|
+
1. 基于默认分支创建工作分支
|
|
133
|
+
2. 阅读 PRD、已有 ADR、根 CONTEXT.md 术语
|
|
134
|
+
3. 识别 Module、Interface 与真实 Seam,检查深度、局部性和抽象必要性
|
|
135
|
+
4. 为关键行为定义 Testing Decisions,明确公共 Test Seam 与可观察结果
|
|
136
|
+
5. 输出技术方案到 `docs/dev/specs/<title>.md`
|
|
137
|
+
6. 记录 ADR 到 `docs/adr/<YYYY-MM-DD>-<slug>.md`
|
|
138
|
+
7. 提交并创建 Planning PR
|
|
139
|
+
|
|
140
|
+
存量 Design Amendment 改用“存量 Design Amendment”章节的受限流程,不执行以上分支、ADR 与 Planning PR 步骤。
|
|
141
|
+
|
|
142
|
+
### Outputs
|
|
143
|
+
- 技术方案(包含 Testing Decisions)+ ADR
|
|
144
|
+
- Planning PR
|
|
145
|
+
|
|
146
|
+
### Failure
|
|
147
|
+
- ADR 与已有决策冲突 → 记录冲突并标注
|
|
148
|
+
- 关键行为没有稳定的公共 Test Seam → 暂停设计,先调整 Interface 或明确缺失决策
|
|
149
|
+
- Planning PR 创建失败 → 通知用户手动处理
|
|
150
|
+
|
|
151
|
+
### Idempotency
|
|
152
|
+
- 技术方案已存在 → 读取并更新
|
|
153
|
+
- 已有完整 `Testing Decisions` → 不重复 amendment
|
|
154
|
+
- ADR 已存在 → 不重复创建
|
|
155
|
+
- 分支已存在 → 检出后追加提交
|
|
156
|
+
|
|
157
|
+
### Prohibited Actions
|
|
158
|
+
- 不跳过 ADR 兼容性检查
|
|
159
|
+
- 不创建只有一个假设 Adapter、没有真实替换需求的 Seam
|
|
160
|
+
- 不以实现方法、私有协作对象或调用顺序作为 Test Seam
|
|
161
|
+
- 不直接 push 到默认分支(写操作走分支 + PR)
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-docs
|
|
3
|
+
description: Write and organize long-lived project documentation — numbered docs tree placement, stable naming, relative links and anchors, Mermaid diagrams, ownership, and site preview or build. Use when authoring or moving current-state docs, fixing broken links, or running the documentation site.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-docs
|
|
7
|
+
|
|
8
|
+
面向长期存在的**当前状态文档**(系统现在如何工作)。变更记录与门禁由 `flow-change` 负责。
|
|
9
|
+
|
|
10
|
+
## 目录归属(编号树)
|
|
11
|
+
|
|
12
|
+
`cabbage init` 生成的当前状态文档写入 `docs/` 下的编号目录,只创建有实际内容的目录:
|
|
13
|
+
|
|
14
|
+
| 目录 | 内容 |
|
|
15
|
+
| --- | --- |
|
|
16
|
+
| `00-overview/` | 项目概览、范围、快速上手 |
|
|
17
|
+
| `01-product/` | 需求、用户故事、验收标准 |
|
|
18
|
+
| `02-design/` | 交互与视觉设计、原型说明 |
|
|
19
|
+
| `03-architecture/` | 系统设计、`adr/`、`rfc/` |
|
|
20
|
+
| `04-domain/` | 数据模型、数据库设计、迁移与回滚 |
|
|
21
|
+
| `05-api/` | 接口契约、事件、集成 |
|
|
22
|
+
| `06-development/` | 本地开发环境、构建与调试 |
|
|
23
|
+
| `07-standards/` | 编码规范、评审约定 |
|
|
24
|
+
| `08-testing/` | 测试策略与用例 |
|
|
25
|
+
| `09-security/` | 威胁模型、权限与合规控制 |
|
|
26
|
+
| `10-infrastructure/` | 部署拓扑、容量、环境配置 |
|
|
27
|
+
| `11-ci-cd/` | 流水线定义与门禁说明 |
|
|
28
|
+
| `12-release/` | 发布流程与版本策略 |
|
|
29
|
+
| `13-operations/` | 运行手册、监控、应急预案 |
|
|
30
|
+
| `14-performance/` | 性能基线与压测结果 |
|
|
31
|
+
| `15-incidents/` | 事故记录与复盘(不可改写的历史) |
|
|
32
|
+
| `16-dependencies/` | 外部依赖清单与升级策略 |
|
|
33
|
+
| `17-compliance/` | 合规要求与审计证据 |
|
|
34
|
+
|
|
35
|
+
- 变更记录归档时 `archive` 自动 `sync`,把专项文档复制进对应编号目录;`sync` 只按映射复制,
|
|
36
|
+
不做语义合并。
|
|
37
|
+
- 流程阶段产出的 PRD / 技术方案 / ADR 保留各自路径(`docs/prd/`、`docs/dev/specs/`、`docs/adr/`),
|
|
38
|
+
与编号树各司其职:前者是流程产物,后者是长期当前状态。
|
|
39
|
+
- `.cabbage/changes/` 是变更历史,`docs/` 是当前状态,两者不互相复制内容。
|
|
40
|
+
|
|
41
|
+
## 写作原则
|
|
42
|
+
|
|
43
|
+
1. **单一事实来源**:一个事实只在一处定义,其他文档链接过去,不复制正文。
|
|
44
|
+
2. **当前状态 vs 决策历史**:当前状态文档原处更新;ADR/RFC/事故记录是不可改写的历史。
|
|
45
|
+
3. **稳定路径**:不使用 `spec-v2-final.md`、`_latest.md`、`_copy.md` 这类文件名,版本交给 Git。
|
|
46
|
+
4. **相对链接**:仓内链接一律用相对路径并带文件扩展名,不写 `/docs/...` 绝对路径。
|
|
47
|
+
5. **不写占位内容**:`TODO`、`TBD`、`FIXME` 会导致校验失败。
|
|
48
|
+
|
|
49
|
+
## 校验与站点
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
cabbage({op:"validate"}) # 结构、标题锚点、相对路径、Mermaid 围栏(不要求先建变更)
|
|
53
|
+
cabbage({op:"validate", change:"x"}) # 或只校验某条记录
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
站点(如仓库使用 VitePress):`pnpm --dir docs run dev` 预览、`pnpm --dir docs run build` 构建;
|
|
57
|
+
构建失败先跑 `validate`(省略 `change` 校验全部)定位死链,再检查围栏闭合与 HTML 标签。
|
|
58
|
+
|
|
59
|
+
## 图表
|
|
60
|
+
|
|
61
|
+
使用 Mermaid,写在 ` ```mermaid ` 围栏内;围栏必须闭合,否则校验与站点构建都会失败。
|
|
62
|
+
常用类型:流程图、时序图、状态图、ER 图。图表只画难以用文字表达的关系。
|
|
63
|
+
|
|
64
|
+
## 归属与评审
|
|
65
|
+
|
|
66
|
+
关键长期文档应在 frontmatter 声明维护方:
|
|
67
|
+
|
|
68
|
+
```yaml
|
|
69
|
+
---
|
|
70
|
+
owner: team-billing
|
|
71
|
+
maintained-by: ["@alice"]
|
|
72
|
+
last-reviewed: 2026-03-01
|
|
73
|
+
---
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
用 `.github/CODEOWNERS` 让架构、安全等目录的改动必须由对应负责人评审。
|
|
77
|
+
该 frontmatter 是约定,CLI 不校验也不强制;真正的强制来自代码托管平台的分支保护。
|
|
78
|
+
|
|
79
|
+
## Contract
|
|
80
|
+
|
|
81
|
+
### Trigger
|
|
82
|
+
撰写或移动当前状态文档、修复死链、整理文档归属、预览或构建文档站点时触发。
|
|
83
|
+
|
|
84
|
+
### Inputs
|
|
85
|
+
- 文档内容或需要修复的链接/结构问题
|
|
86
|
+
- 目标编号目录(按内容性质选择)
|
|
87
|
+
|
|
88
|
+
### Preconditions
|
|
89
|
+
- 项目 docs 树已存在(未初始化时先经 `flow-change` 执行 `op:"init"`)
|
|
90
|
+
|
|
91
|
+
### Procedure
|
|
92
|
+
1. 按内容性质选择编号目录;只创建有实际内容的目录
|
|
93
|
+
2. 遵循写作原则(单一事实来源、稳定路径、相对链接、无占位)
|
|
94
|
+
3. `op:"validate"` 校验结构与链接;站点项目再执行构建
|
|
95
|
+
4. 关键文档补 frontmatter 归属;治理目录配 CODEOWNERS
|
|
96
|
+
|
|
97
|
+
### Outputs
|
|
98
|
+
- `docs/` 编号目录下的当前状态文档(或修复后的链接/结构)
|
|
99
|
+
|
|
100
|
+
### Failure
|
|
101
|
+
- `broken link` → 修正相对路径层级或锚点 slug,确认目标文件存在
|
|
102
|
+
- 链接越出项目根 → 改用仓内相对路径
|
|
103
|
+
- 站点依赖缺失 → 重新安装站点依赖后再构建
|
|
104
|
+
|
|
105
|
+
### Idempotency
|
|
106
|
+
- 重复 `validate` → 幂等只读
|
|
107
|
+
- 同一批移动操作分批提交 → 每批后校验保持可构建
|
|
108
|
+
|
|
109
|
+
### Prohibited Actions
|
|
110
|
+
- 不用 `final-v2`、`_latest`、`_copy` 之类文件名
|
|
111
|
+
- 不改写已归档的历史记录(ADR/RFC/事故)
|
|
112
|
+
- 不在当前状态文档与变更记录间复制正文
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-incident
|
|
3
|
+
description: Document production incidents and postmortems — incident timeline, impact, containment and recovery, blameless root cause, corrective actions grounded through the built-in Cabbage engine. Use for outages, severity events, live-service failures, or writing a postmortem retrospective.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-incident
|
|
7
|
+
|
|
8
|
+
处置生产事故时,先止损、再取证、后复盘。**不要在事故进行中伪造完整时间线或结论。**
|
|
9
|
+
|
|
10
|
+
## 流程(经内置引擎)
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
cabbage({op:"new", type:"incident", change:"payment-timeout-2026-08-29"})
|
|
14
|
+
cabbage({op:"next", change:"payment-timeout-2026-08-29"}) # 阶段:incident → postmortem → tasks
|
|
15
|
+
# 1. 记录事实:填写 incident.md
|
|
16
|
+
cabbage({op:"verify", change:"payment-timeout-2026-08-29", stage:"incident"})
|
|
17
|
+
# 2. 分析根因:填写 postmortem.md
|
|
18
|
+
cabbage({op:"verify", change:"payment-timeout-2026-08-29", stage:"postmortem"})
|
|
19
|
+
# 3. 预防措施落地:完成任务清单
|
|
20
|
+
cabbage({op:"verify", change:"payment-timeout-2026-08-29", stage:"tasks"})
|
|
21
|
+
cabbage({op:"gate", change:"payment-timeout-2026-08-29", target:"merge"})
|
|
22
|
+
# 合并确认后:
|
|
23
|
+
cabbage({op:"archive", change:"payment-timeout-2026-08-29"})
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
阶段 ID 以 `next` 输出为准:`incident` → `postmortem` → `tasks`。前两个阶段是事实与分析,第三个阶段是实际修复与预防措施。
|
|
27
|
+
|
|
28
|
+
**分级降载**:正在处置的紧急故障不要为了走流程而拖延止血。先经 `flow-change` 走最小修复路径
|
|
29
|
+
(`type:"change"` + 声明 `deployment=true`),事后另立 incident 记录复盘;不要把两者混在同一记录里。
|
|
30
|
+
|
|
31
|
+
## incident.md:先记事实
|
|
32
|
+
|
|
33
|
+
必需标题 `Impact` / `Timeline` / `Mitigation`。
|
|
34
|
+
|
|
35
|
+
- 时间戳统一用 UTC 或明确标注时区;事故期间先记原始观测,不追求措辞。
|
|
36
|
+
- `Impact` 量化受影响用户数、时长、区域、功能、数据与 SLO 影响;无法量化时写估计方法与误差。
|
|
37
|
+
- `Timeline` 记录事件、观测与采取的行动及其执行人,包括误判和无效尝试。
|
|
38
|
+
- `Mitigation` 区分 **Containment**(如何限制影响,如回滚、摘流量、限流)与 **Recovery**(如何恢复,
|
|
39
|
+
及仍然降级的行为)。
|
|
40
|
+
- 恢复后补 `Recovery Verification`:证明恢复的指标、检查项与观察窗口。
|
|
41
|
+
- 不要写"疑似"当结论;不确定的内容标注为待确认。
|
|
42
|
+
|
|
43
|
+
## postmortem.md:对事不对人
|
|
44
|
+
|
|
45
|
+
必需标题 `Root Cause` / `Contributing Factors` / `Corrective Actions`。
|
|
46
|
+
|
|
47
|
+
- 区分 **触发点**(直接原因)与 **根因**(使其可能且未被拦截的系统条件)。
|
|
48
|
+
- 根因结论要有证据支撑:日志、指标、变更记录、复现步骤,而非推测。
|
|
49
|
+
- `Corrective Actions` 每项必须有单一责任人、期限、验证方式与状态;笼统的"加强监控""提高意识"
|
|
50
|
+
不是可验证的措施。
|
|
51
|
+
- 保持无责文化:记录系统为何允许人为错误造成影响,不记录个人过失。
|
|
52
|
+
|
|
53
|
+
## tasks.md:预防措施落地
|
|
54
|
+
|
|
55
|
+
`postmortem.md` 中的措施要落到实际任务,完成并验证后才通过阶段。
|
|
56
|
+
只写计划不执行会阻塞合并门禁,这是刻意的:复盘结论必须兑现。
|
|
57
|
+
|
|
58
|
+
## 边界
|
|
59
|
+
|
|
60
|
+
- 事故记录与变更记录都属于决策历史,归档后不重写、不"现代化"措辞。
|
|
61
|
+
- 当前系统的运行方式写到长期运行文档;事故报告本身是历史记录。
|
|
62
|
+
- 结构校验只检查标题、占位符与链接,不判断根因分析是否正确;复盘质量仍需人工评审。
|
|
63
|
+
|
|
64
|
+
## Contract
|
|
65
|
+
|
|
66
|
+
### Trigger
|
|
67
|
+
生产事故、严重事件、线上服务故障的处置与复盘;或用户要求撰写事故报告时触发。
|
|
68
|
+
|
|
69
|
+
### Inputs
|
|
70
|
+
- 事故基本事实(时间、影响、止损与恢复过程)
|
|
71
|
+
- 证据材料(日志、指标、变更记录、复现步骤)
|
|
72
|
+
|
|
73
|
+
### Preconditions
|
|
74
|
+
- 事故已止血或已恢复(进行中不写完整复盘)
|
|
75
|
+
- 项目已初始化(无 `.cabbage/` 时先经 `flow-change` 执行 `op:"init"`)
|
|
76
|
+
|
|
77
|
+
### Procedure
|
|
78
|
+
1. `op:"new" type:"incident"` 创建记录并如实填写 incident.md(Impact/Timeline/Mitigation)
|
|
79
|
+
2. 验证 incident 阶段后撰写 postmortem.md(根因、促成因素、纠正措施)
|
|
80
|
+
3. 将纠正措施落成 tasks.md 清单并实际执行
|
|
81
|
+
4. 逐阶段 `verify` → `gate merge` → 合并确认后 `archive`
|
|
82
|
+
|
|
83
|
+
### Outputs
|
|
84
|
+
- `.cabbage/changes/<id>/`:incident.md、postmortem.md、tasks.md(验证后签名)
|
|
85
|
+
- 归档后:`.cabbage/archive/<year>/<id>/`
|
|
86
|
+
|
|
87
|
+
### Failure
|
|
88
|
+
- 时间线/证据不完整 → 标注待确认,不编造;补齐后重新验证
|
|
89
|
+
- 措施无法在本次完成 → 转入独立变更(flow-change)跟踪,本记录如实标注状态
|
|
90
|
+
|
|
91
|
+
### Idempotency
|
|
92
|
+
- 重复 `verify` 未变化阶段 → 幂等
|
|
93
|
+
- 事故期间多次追加时间线 → 更新产物后重新验证
|
|
94
|
+
|
|
95
|
+
### Prohibited Actions
|
|
96
|
+
- 不在处置进行中伪造完整时间线或根因结论
|
|
97
|
+
- 不把紧急修复与事故复盘混在同一记录
|
|
98
|
+
- 不将未执行的预防措施勾选为完成
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: flow-release
|
|
3
|
+
description: 版本 → Release PR → GitHub Actions 发布(仅人工)
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# flow-release
|
|
7
|
+
|
|
8
|
+
完成版本提议、Release PR、合并发布与发布监控。
|
|
9
|
+
发布流程技术栈无关:按 Profile 的版本规则(version file / tag format / release workflow)执行,
|
|
10
|
+
最终发布走项目自己的 GitHub Actions release workflow(不假设 npm 或任何特定生态)。
|
|
11
|
+
|
|
12
|
+
## 核心流程
|
|
13
|
+
|
|
14
|
+
1. **确定版本**:聚合上一 tag 后全部 commit,按 Profile 版本规则分类(breaking→major, feature→minor, fix→patch),输出提议版本
|
|
15
|
+
```bash
|
|
16
|
+
git describe --tags --abbrev=0
|
|
17
|
+
git log --oneline <last-tag>..HEAD
|
|
18
|
+
```
|
|
19
|
+
2. **创建 Release 分支 + 更新版本文件**
|
|
20
|
+
```bash
|
|
21
|
+
git checkout -b "release/<version>"
|
|
22
|
+
# 按 Profile 版本文件规则更新版本号(如 package.json 的 version 字段)
|
|
23
|
+
git add -A && git commit -m "chore: release <version>"
|
|
24
|
+
git push -u origin "release/<version>"
|
|
25
|
+
```
|
|
26
|
+
3. **创建 Release PR**(人工确认后)
|
|
27
|
+
```bash
|
|
28
|
+
gh pr create --base <default> --head "release/<version>" \
|
|
29
|
+
--title "release: <version>" --body "<release notes>"
|
|
30
|
+
```
|
|
31
|
+
4. **合并 + 打 tag push**
|
|
32
|
+
```bash
|
|
33
|
+
HEAD_SHA=$(gh pr view <pr-number> --json headRefOid --jq .headRefOid)
|
|
34
|
+
gh pr merge <pr-number> --squash --delete-branch --match-head-commit "$HEAD_SHA"
|
|
35
|
+
MERGE_SHA=$(gh pr view <pr-number> --json mergeCommit --jq .mergeCommit.oid)
|
|
36
|
+
git tag "v<version>" "$MERGE_SHA"
|
|
37
|
+
git push origin "v<version>"
|
|
38
|
+
```
|
|
39
|
+
5. **监控发布**:tag push 触发项目 GitHub Actions release workflow,跟踪其运行结果;瞬时失败可重跑;代码/配置缺陷 → Corrective Flow
|
|
40
|
+
|
|
41
|
+
## 版本规则(Profile)
|
|
42
|
+
|
|
43
|
+
版本分类依赖 AGENTS.md `## Project Profile` 的 `version bump rule`:
|
|
44
|
+
`breaking→major, feature→minor, fix→patch`(0.x breaking 也 major)。
|
|
45
|
+
未分类 commit → 请用户分类后重试。
|
|
46
|
+
|
|
47
|
+
## Output
|
|
48
|
+
- 提议版本
|
|
49
|
+
- Release PR(合并 + tag push)
|
|
50
|
+
- GitHub Actions release workflow 运行结果
|
|
51
|
+
|
|
52
|
+
## 后续
|
|
53
|
+
- 发布完成后 Flow 结束(goal-verify 独立验证 → goal complete)
|
|
54
|
+
|
|
55
|
+
## Contract
|
|
56
|
+
|
|
57
|
+
### Trigger
|
|
58
|
+
由 `/release` 命令触发。**仅手动触发**,不包含在自动流程中。
|
|
59
|
+
|
|
60
|
+
### Inputs
|
|
61
|
+
- 用户对提议版本/Release 的确认
|
|
62
|
+
|
|
63
|
+
### Preconditions
|
|
64
|
+
- 所有 PR 已合并
|
|
65
|
+
- 默认分支最新且 CI 通过
|
|
66
|
+
- Release Profile 已确认(AGENTS.md Project Profile)
|
|
67
|
+
|
|
68
|
+
### Procedure
|
|
69
|
+
1. 聚合 commit 确定版本
|
|
70
|
+
2. 创建 release 分支 + 更新版本文件
|
|
71
|
+
3. 创建 Release PR(人工确认)
|
|
72
|
+
4. 合并 + 打 tag push
|
|
73
|
+
5. 监控发布 workflow
|
|
74
|
+
|
|
75
|
+
### Outputs
|
|
76
|
+
- GitHub Release(经项目 release workflow)
|
|
77
|
+
- tag 已推送
|
|
78
|
+
|
|
79
|
+
### Failure
|
|
80
|
+
- 发布 workflow 失败 → 识别瞬时失败并重跑;代码/配置缺陷 → Corrective Flow + 新版本
|
|
81
|
+
- tag 已存在 → 提示版本冲突,不强制覆盖
|
|
82
|
+
|
|
83
|
+
### Idempotency
|
|
84
|
+
- 相同版本号 → 阻止重复发布(tag 不可变)
|
|
85
|
+
|
|
86
|
+
### Prohibited Actions
|
|
87
|
+
- 不在自动模式中执行(release 为人工流程)
|
|
88
|
+
- 不假设 npm 或其他特定技术生态(按 Profile 规则 + 项目 GitHub Actions release workflow)
|
|
89
|
+
- 不跳过测试/CI 直接发布
|
|
90
|
+
- 不强制覆盖已存在的 tag
|