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

6.2 KiB
Raw Blame History

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 requirementsrune designrune planrune taskrune 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/