Files
Rune-Spec/openspec/changes/configurable-pipeline/specs/flow-commands/spec.md
lanyuanxiaoyao a6b76b690a docs: 新增 configurable-pipeline 变更提案,探索可配置多阶段流水线模型
- proposal/design/specs/tasks:将固定 5 阶段重构为可配置 pipeline(discuss + pipeline + archive 三明治结构)
- 引入 stage 完成判定(文档落地基线 + 可选 validate 实质门禁)与 finish 硬门禁
- 保留 explore 会话记录 session-ses_1357.md 作为思考溯源
2026-06-15 19:04:03 +08:00

130 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## ADDED Requirements
### Requirement: 三明治流程结构
系统 MUST 采用三明治结构:`discuss`(固定,流水线之前)→ `pipeline`(可配置的线性阶段序列)→ `finish`固定流水线之后终端收尾。discuss 和 finish MUST NOT 在 pipeline stages 中定义——它们是框架级固定命令。
#### Scenario: 完整流程顺序
- **WHEN** 用户执行一个变更的完整流程
- **THEN** 流程顺序为:先可选执行 discuss再按序执行 pipeline 中每个 stage最后执行 finish 归档
#### Scenario: discuss 不可作为 stage id
- **WHEN** 用户尝试在 stages 中定义 id 为 `discuss` 的阶段
- **THEN** 配置校验失败(被保留字规则拦截)
#### Scenario: finish 不可作为 stage id
- **WHEN** 用户尝试在 stages 中定义 id 为 `finish` 的阶段
- **THEN** 配置校验失败(被保留字规则拦截)
### Requirement: discuss 命令
系统 MUST 提供 `rune discuss <change>` 命令。该命令 MUST 输出讨论模式提示词文本。该命令 MUST NOT 检查任何前置条件(无门禁)。该命令 MUST NOT 要求产出任何文档。该命令的行为与当前 0.1.x 实现(输出探索模式 prompt保持一致。
#### Scenario: 输出讨论提示词
- **WHEN** 用户执行 `rune discuss my-feature`
- **THEN** 命令输出讨论模式提示词文本,退出码为 0
#### Scenario: discuss 无前置门禁
- **WHEN** 变更目录为空(无任何 stage 文档),用户执行 `rune discuss my-feature`
- **THEN** 命令正常输出提示词,不报任何前置条件错误
### Requirement: 动态 Stage 命令注册
系统 MUST 为配置中的每个 pipeline stage 注册对应的 CLI 命令 `rune <stage-id> <change>`。命令名由 stage id 决定运行时从配置动态生成MUST NOT 硬编码任何特定 stage。
#### Scenario: 从配置注册命令
- **WHEN** 配置定义 stages 为 `[requirements, design, plan, task, build]`
- **THEN** CLI 注册 5 个命令:`rune requirements``rune design``rune plan``rune task``rune build`
#### Scenario: 自定义 stage 注册命令
- **WHEN** 配置定义 stages 包含 `{ id: "code-review", prompt: "..." }`
- **THEN** CLI 注册 `rune code-review <change>` 命令
#### Scenario: 执行 stage 命令输出提示词
- **WHEN** 用户执行 `rune plan my-feature`,且前置阶段全完成
- **THEN** 命令输出 plan 阶段的 prompt 文本,退出码为 0
### Requirement: Stage 命令软门禁
`rune <stage-id> <change>` MUST 在输出提示词前检查该 stage 的所有前置 stage 是否完全完成fully done。若任一前置 stage 未完全完成,命令 MUST 拒绝输出提示词,报错指出第一个未完成的前置 stage并退出码非零。
#### Scenario: 前置全完成则放行
- **WHEN** 流水线为 [A, B, C]A 和 B 完全完成,用户执行 `rune C my-feature`
- **THEN** 命令输出 C 的提示词
#### Scenario: 前置有未完成则拒绝
- **WHEN** 流水线为 [A, B, C]A 完全完成但 B 未完成,用户执行 `rune C my-feature`
- **THEN** 命令拒绝输出提示词,报错指出 B 阶段未完成,退出码非零
#### Scenario: 第一个 stage 无前置门禁
- **WHEN** 流水线为 [A, B, C],变更目录为空,用户执行 `rune A my-feature`(第一个 stage
- **THEN** 命令输出 A 的提示词,不报前置条件错误
### Requirement: finish 命令硬门禁
`rune finish <change>` MUST 在执行归档操作前检查所有 pipeline stage 是否完全完成。若任一 stage 未完全完成,命令 MUST 拒绝归档,报错列出所有未完成的 stage 及其原因(文档缺失或 validate 失败),退出码非零。所有 stage 完全完成时,命令 MUST 执行归档操作(移动变更目录到 archive/)。
#### Scenario: 全完成则归档
- **WHEN** 流水线为 [A, B, C],所有 stage 完全完成,用户执行 `rune finish my-feature`
- **THEN** 命令将变更目录移动到 archive/,退出码为 0
#### Scenario: 有未完成则拒绝归档
- **WHEN** 流水线为 [A, B, C]A 和 C 完全完成但 B 文档缺失,用户执行 `rune finish my-feature`
- **THEN** 命令拒绝归档,报错指出 B 阶段文档缺失,退出码非零
#### Scenario: validate 失败则拒绝归档
- **WHEN** 所有 stage 文档存在,但 build 阶段的 validate 返回 falsy用户执行 `rune finish my-feature`
- **THEN** 命令拒绝归档,报错指出 build 阶段 validate 未通过(含失败原因),退出码非零
#### Scenario: finish 列出所有未完成项
- **WHEN** 流水线为 [A, B, C]A 缺文档且 B validate 失败,用户执行 `rune finish my-feature`
- **THEN** 报错同时列出 A文档缺失和 Bvalidate 失败),不只是第一个
### Requirement: status 命令
系统 MUST 提供 `rune status <change>` 命令,输出变更的流水线进度。输出 MUST 包含每个 stage 的状态文档是否存在、validate 是否通过、是否完全完成)和整体进度(当前阶段索引、是否全部完成)。该命令 MUST NOT 有任何门禁——纯只读审计。
#### Scenario: 显示全部阶段状态
- **WHEN** 流水线为 [A, B, C]A 完全完成B 文档存在但 validate 失败C 文档不存在
- **THEN** status 输出显示A done、B 文档存在但 validate 失败、C 文档缺失,当前进度为 B
#### Scenario: 全新变更状态
- **WHEN** 变更目录为空,用户执行 `rune status my-feature`
- **THEN** status 输出显示所有阶段未完成,当前进度为第一个阶段
#### Scenario: 全完成状态
- **WHEN** 所有阶段完全完成,用户执行 `rune status my-feature`
- **THEN** status 输出显示所有阶段 done可执行 finish 归档
### Requirement: 变更目录约定
所有 stage 文档 MUST 位于变更目录内(如 `changes/<change-name>/`。discuss 不产出文档。finish 执行后变更目录 MUST 被移动到 `archive/<change-name>/`
#### Scenario: stage 文档路径
- **WHEN** stage id 为 `design`,变更名为 `my-feature`
- **THEN** 文档路径为 `changes/my-feature/design.md`
#### Scenario: finish 后目录移动
- **WHEN** finish 成功执行
- **THEN** `changes/my-feature/` 目录移动到 `archive/my-feature/`