## Why 当前 Rune 把 5 个固定阶段(discuss→plan→task→build→archive)硬编码在 6 处源码里(types/cli/assembler/scanner/defaults/adapters),用户无法自定义阶段流程。不同项目需要不同的工作流(有的要 code-review 阶段,有的不需要 design),但框架不给出任何灵活性。更严重的是,唯一的不可逆操作 `finish`(归档移动目录)**不校验前置阶段是否完成**——agent 可以跳过任意阶段直接归档,流程约束形同虚设。 需要一套**可配置但可强制**的流水线模型:用户自定义阶段,CLI 用"文档落地 + 可选 validate"作为完成判据,`finish` 硬门禁拦住跳过。 ## What Changes - **BREAKING** 移除固定的 STAGES 常量和 5 个 Stage 接口,替换为通用 StageConfig 结构 - **BREAKING** 移除 cli.ts 里 5 个硬编码 command,替换为从配置动态生成的 stage 命令 - **BREAKING** 移除 assembler.ts 里 5 个专用 assembleXxxPrompt 函数,替换为 1 个通用 assembleStagePrompt - **BREAKING** 移除 scanner.ts 里 planCompleted/buildUnlocked 等固定语义函数,替换为配置驱动的完成判定 - 引入三明治结构:`discuss`(固定,pipeline 之前,无门禁,不产文档)+ `pipeline`(可配置的线性阶段序列)+ `archive`(固定,pipeline 之后,终端收尾) - 每个 pipeline 阶段产出且仅产出一个 `.md` 文档;文档存在 = 基线完成 - 每个阶段可配置可选的 `validate` 函数(JS,接收 changeDir),通过 = 实质完成 - `finish` 升级为硬门禁:所有阶段实质完成才允许归档 - 默认 pipeline 拆成 5 个阶段:`[requirements, design, plan, task, build]`(把旧 plan 的 3 文档拆成 3 个线性阶段,消除多文档特例) - `discuss` 命令保留,行为不变(输出讨论提示词) - 新增配置 schema:`stages` 数组,每项含 `id`/`prompt`/可选 `validate` ## Capabilities ### New Capabilities - `pipeline`: 可配置的流水线模型——配置格式、stage 结构(id/prompt/validate)、默认流水线、stage id 命名规则 - `stage-completion`: 阶段完成判定机制——文档落地(基线 done)+ validate 函数(实质 done)、两档门禁(软门禁挡 stage 命令、硬门禁挡 finish) - `flow-commands`: 流程驱动 CLI 命令——discuss(固定前置)、动态 stage 命令(软门禁)、finish(硬门禁+归档)、status(审计可见性) ### Modified Capabilities (无——openspec/specs/ 为空,全部为新建。) ## Impact - **源码重构**(6 处固定阶段渗透点全部替换): - `src/types.ts`:移除 STAGES + 5 个 Stage 接口,新增 StageConfig/PipelineConfig 类型 - `src/cli.ts`:5 个硬编码 command → 从配置动态注册 stage 命令 - `src/core/assembler.ts`:5 个专用函数 → 1 个通用 assembleStagePrompt - `src/core/scanner.ts`:固定语义 → 配置驱动的通用扫描+完成判定 - `src/core/config.ts`:新增 pipeline schema 校验(stage id 唯一性、字符集、validate 语法) - `src/defaults/config.ts`:5 个固定 prompt → 默认 5 阶段 pipeline 配置 - `src/adapters/opencode.ts`、`src/adapters/claude-code.ts`:for(stage of STAGES) → 从配置注入 - **validate 执行引擎**(新增):解析 JS 函数字符串 + 注入 changeDir + 执行 + 捕获结果/异常 - **finish 门禁**(新增/修复):归档前校验所有阶段实质完成 - **配置 schema 变更**:用户现有 `.rune/config.yaml` 的 stage 配置不兼容(BREAKING),需提供迁移指引或 init 重新生成 - **测试**:scanner 完成判定、validate 执行、gate 逻辑、动态命令注册均需新测试覆盖