bain-riper-cli 0.1.1

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.
Files changed (29) hide show
  1. package/bin/cli.js +14 -0
  2. package/package.json +34 -0
  3. package/src/commands/add.js +28 -0
  4. package/src/commands/init.js +58 -0
  5. package/src/commands/list.js +44 -0
  6. package/src/index.js +86 -0
  7. package/src/modules.js +136 -0
  8. package/src/utils/checklist.js +49 -0
  9. package/src/utils/copier.js +100 -0
  10. package/src/utils/logger.js +18 -0
  11. package/templates/docs/reference-code/controller/EmployeeTrainingController.java +107 -0
  12. package/templates/docs/reference-code/domain/EmployeeTraining.java +89 -0
  13. package/templates/docs/reference-code/domain/bo/EmployeeTrainingBo.java +96 -0
  14. package/templates/docs/reference-code/domain/vo/EmployeeTrainingVo.java +100 -0
  15. package/templates/docs/reference-code/mapper/EmployeeTrainingMapper.java +17 -0
  16. package/templates/docs/reference-code/resources/mapper/EmployeeTrainingMapper.xml +7 -0
  17. package/templates/docs/reference-code/service/IEmployeeTrainingService.java +69 -0
  18. package/templates/docs/reference-code/service/impl/EmployeeTrainingServiceImpl.java +144 -0
  19. package/templates/openspec/config.yaml +126 -0
  20. package/templates/openspec/project-profile.md +107 -0
  21. package/templates/qoder/mcp.json +9 -0
  22. package/templates/qoder/rules/openspec_codegraph.md +162 -0
  23. package/templates/qoder/rules/openspec_output_specs.md +112 -0
  24. package/templates/qoder/rules/openspec_preflight.md +230 -0
  25. package/templates/qoder/rules/openspec_reverse_sync.md +97 -0
  26. package/templates/qoder/rules/openspec_specifications.md +84 -0
  27. package/templates/qoder/rules/openspec_task_tiers.md +109 -0
  28. package/templates/qoder/rules/project_constitution.md +90 -0
  29. package/templates/qoder/skills/requirement-breakdown/SKILL.md +126 -0
@@ -0,0 +1,107 @@
1
+ # bain-riper 项目 Profile
2
+
3
+ > **定位**:本文件是「换了项目必改」信息的**唯一存放处**。
4
+ > `.qoder/rules/` 下的规则文件与 `openspec/config.yaml` 通过硬路径引用本文件,
5
+ > 实现两层架构:**核心套件跨项目复用 / 只换 Profile**。
6
+ >
7
+ > **移植到新项目时**:只需修改本文件,`.qoder/rules/` 下除宪法 §3/§7/§8 少量条款外均无需改动。
8
+ >
9
+ > **当前项目**:bain-riper
10
+
11
+ ---
12
+
13
+ ## §1 技术栈
14
+
15
+ | 项 | 值 |
16
+ |---|---|
17
+ | 语言版本 | JDK 21 |
18
+ | 框架 | Spring Boot 3.5.9 |
19
+ | ORM | MyBatis-Plus |
20
+ | 数据库 | MySQL |
21
+ | Web 容器 | Undertow |
22
+ | 构建工具 | Maven(多模块,根 POM `/pom.xml` 聚合 `admin/`) |
23
+ | 核心依赖 | MapStruct Plus 1.5.0 / Lombok 1.18.42 / Redisson / Jasypt 3.0.5 / EasyExcel |
24
+ | 测试框架 | JUnit 5 (spring-boot-starter-test) |
25
+
26
+ ## §2 项目骨架
27
+
28
+ | 项 | 值 |
29
+ |---|---|
30
+ | Maven groupId | `com.reference` |
31
+ | 业务模块(唯一) | `admin/` |
32
+ | 基础包路径 | `admin/src/main/java/com/reference/` |
33
+ | Mapper XML 路径 | `admin/src/main/resources/mapper/` |
34
+ | 建表 SQL 路径 | `script/SQL/` |
35
+ | 参考代码路径 | `docs/reference-code/` |
36
+ | 知识库路径 | `.qoder/repowiki/zh/content/` |
37
+ | 构建命令 | `cd admin && mvn clean package -DskipTests` |
38
+ | 测试命令 | `cd admin && mvn test` |
39
+ | 本地运行 | IDEA 启动 `com.reference.Application#main` 或 `cd admin && mvn spring-boot:run` |
40
+
41
+ ## §3 标准分层目录
42
+
43
+ ```
44
+ <base-package>/ ← 基础包路径见 §2
45
+ ├── controller/ # REST API 端点
46
+ ├── service/ # 业务接口
47
+ │ └── impl/ # 业务实现
48
+ ├── mapper/ # MyBatis Mapper 接口
49
+ ├── domain/ # 实体(Entity)
50
+ │ ├── bo/ # 业务对象(BO,承载查询/新增/修改参数)
51
+ │ └── vo/ # 返回视图对象
52
+ ├── constant/ # 枚举与常量
53
+ └── config/ # Spring 配置与工具类
54
+ ```
55
+
56
+ - 新增实体 / Mapper / Service / Controller **必须**落在上述目录
57
+ - 常量/枚举统一 `constant/`
58
+ - 工具类与 Spring 配置统一 `config/`
59
+
60
+ ## §4 领域约定
61
+
62
+ | 项 | 值 |
63
+ |---|---|
64
+ | 多租户字段 | `tenant_id`(所有业务表、DTO、Mapper 查询必含) |
65
+ | 实体基类 | `TenantModel` |
66
+ | Mapper 基类 | `BaseMapperPlus<T>`(RuoYi-Vue-Plus 框架提供) |
67
+ | 表名注解 | `@TableName("table_name")`(snake_case) |
68
+ | API 文档注解 | `@ApiModelProperty` |
69
+ | 响应风格 | RESTful |
70
+ | 异常规范 | 统一用 `BusinessException`,禁止直接抛 `RuntimeException` |
71
+ | Commit 风格 | Conventional Commits |
72
+
73
+ ## §5 参考模板(八层标杆,基于 RuoYi-Vue-Plus)
74
+
75
+ 新增 CRUD / 导入导出 / 权限 / 分页等常规功能时,必须以
76
+ `docs/reference-code/` 下 `EmployeeTraining` 示例的继承结构、注解写法、分页约定、多租户处理方式为准。
77
+ 参考代码对齐 [RuoYi-Vue-Plus](https://gitee.com/dromara/RuoYi-Vue-Plus) 5.X 代码生成模板风格:
78
+
79
+ | 层次 | 参考文件 |
80
+ |---|---|
81
+ | Controller | `controller/EmployeeTrainingController.java` |
82
+ | Service 接口 | `service/IEmployeeTrainingService.java` |
83
+ | Service 实现 | `service/impl/EmployeeTrainingServiceImpl.java` |
84
+ | Mapper 接口 | `mapper/EmployeeTrainingMapper.java` |
85
+ | Mapper XML | `resources/mapper/EmployeeTrainingMapper.xml` |
86
+ | Entity 实体 | `domain/EmployeeTraining.java` |
87
+ | 业务对象 BO | `domain/bo/EmployeeTrainingBo.java` |
88
+ | 返回 VO | `domain/vo/EmployeeTrainingVo.java` |
89
+
90
+ ## §6 repowiki 章节目录
91
+
92
+ 基于 `.qoder/repowiki/zh/content/` 的中文章节结构,变更类型 → 主章节映射:
93
+
94
+ | 变更类型 | 候选章节(按命中率排序,选最相关的 1-2 个) |
95
+ |---|---|
96
+ | 新增业务功能 | `核心功能模块/`、`API接口文档/` |
97
+ | 数据模型变更 | `数据模型设计/` |
98
+ | 架构/组件调整 | `系统架构设计/` |
99
+ | 配置/环境变更 | `配置管理/`、`部署与运维/` |
100
+ | 权限/安全相关 | `安全与权限/` |
101
+ | 开发规范相关 | `开发指南/` |
102
+
103
+ > 移植到新项目时,本节是整个 Profile 中**唯一需要根据 repowiki 目录树重新填写**的章节。
104
+
105
+ ---
106
+
107
+ _本文件版本:v1.0;修改时同步检查 `.qoder/rules/` 与 `openspec/config.yaml` 中的引用是否仍有效。_
@@ -0,0 +1,9 @@
1
+ {
2
+ "mcpServers": {
3
+ "codegraph": {
4
+ "command": "codegraph",
5
+ "args": ["serve", "--mcp", "-p", "/path/to/your-java-project"],
6
+ "enabled": true
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,162 @@
1
+ ---
2
+ trigger: model_decision
3
+ description: CodeGraph 代码知识图谱使用规则。在代码探索、检索仓库现有实现、分析调用关系时,优先使用 CodeGraph MCP 工具替代 Grep/Glob 全库扫描,减少 token 消耗。适用于所有 OpenSpec skill 及日常 AI 编码交互。
4
+ ---
5
+
6
+ # CodeGraph 使用规范
7
+
8
+ > ⚖️ **上级规则**:本文件受 `.qoder/rules/project_constitution.md`(项目宪法,always_on)约束。
9
+ > 当本文件与宪法冲突时,以宪法为准。本文件仅定义"优先用什么工具",不修改任何宪法条款。
10
+
11
+ **codegraph**(v0.9.4, TypeScript)是一个本地代码知识图谱,已在本项目完成初始化:
12
+ - 索引范围:210 个文件,5,713 个 AST 节点,9,348 条关系边
13
+ - 数据库:`.codegraph/codegraph.db`(SQLite,WAL 模式,约 11.4 MB)
14
+ - 语言支持:Java(198 文件)+ YAML(12 文件)
15
+
16
+ ---
17
+
18
+ ## §1 工具分层与优先级
19
+
20
+ 代码探索分为两个阶段,不同阶段使用不同工具:
21
+
22
+ ```
23
+ 阶段 A「找在哪」→ CodeGraph MCP 优先(秒级、低 token)
24
+ 阶段 B「读内容」→ Read 确认(精确、必须)
25
+ ```
26
+
27
+ | 阶段 | 任务 | 优先工具 | 降级工具(无 CodeGraph 或失败时) |
28
+ |------|------|---------|--------------------------|
29
+ | A | 搜索符号/类/方法 | `codegraph_query` | search_codebase + Grep |
30
+ | A | 查看文件结构 | `codegraph_files` | Glob |
31
+ | A | 分析调用者 | `codegraph_callers` | ❌ 无等价工具(只能手工 Grep) |
32
+ | A | 分析被调用方 | `codegraph_callees` | ❌ 无等价工具(只能手工 Grep) |
33
+ | A | 变更影响分析 | `codegraph_impact` | ❌ 无等价工具 |
34
+ | A | 任务相关上下文 | `codegraph_context` | Read × N(高 token) |
35
+ | B | 读取实现细节 | Read(必须) | Read(唯一方案) |
36
+ | B | 读取参考模板 | Read(必须) | Read(唯一方案) |
37
+ | B | 读取知识库 | Read(必须) | Read(唯一方案) |
38
+
39
+ > **硬规则**:「阶段 A」任务禁止用 Grep/Glob 直接扫描全库,「阶段 B」任务禁止用 `codegraph_query` 代替 Read。
40
+
41
+ ---
42
+
43
+ ## §2 对各宪法条款的增强
44
+
45
+ ### §5(禁止重复造轮子)—— `codegraph_query`
46
+
47
+ **效果**:将"搜索同名类/同语义方法"从手动多次 Grep 变为一条 query。
48
+
49
+ **使用模式**:
50
+ ```text
51
+ # 检查是否存在同名 Service
52
+ codegraph_query("EmployeeExport") → 返回所有匹配符号(类/方法/字段)+ 位置 + 相关度评分
53
+
54
+ # 若结果 ≥ 1,再 Read 具体文件做精确判断
55
+ Read(结果[0].文件路径)
56
+ ```
57
+
58
+ **前置条件**:在 Restate 阶段声明"将通过 codegraph_query 检查仓库现有实现"。
59
+ **禁止**:① query 出结果后跳过 Read 直接假设功能重复 ② query 无结果后跳过 pom.xml 依赖检查。
60
+
61
+ ### §6(禁止猜测第三方 API)—— `codegraph_callers` / `codegraph_callees`
62
+
63
+ **效果**:通过调用链分析确认"API 是否已被使用"。
64
+
65
+ **使用模式**:
66
+ ```text
67
+ # 查询某方法的所有被调用方(确认依赖该 API 的代码范围)
68
+ codegraph_callees("EmployeeInfoServ")
69
+
70
+ # 查询某方法的所有调用者(确认该 API 是否被实际使用)
71
+ codegraph_callers("TenantModel.getTenantId")
72
+ ```
73
+
74
+ **前置条件**:需要精度跨越的领域(如引入新的二方库/三方库),在 proposal.md 的 Why 中注明"已通过 codegraph 调用链分析确认无同类实现"。
75
+
76
+ ### §1(Spec is Truth)—— `codegraph_impact`
77
+
78
+ **效果**:在改代码前自动评估变更影响面,提前预判是否需要改 spec。
79
+
80
+ **使用模式**:
81
+ ```text
82
+ # 修改某方法前,评估影响面
83
+ codegraph_impact("待修改的符号名") → 返回受影响的调用链
84
+ → 交叉验证 spec.md 中是否有对应 Scenario 覆盖
85
+ → 若无 → 先触发 Reverse Sync
86
+ ```
87
+
88
+ ### §3(多租户完整性)
89
+
90
+ **效果**:`codegraph_query("tenant_id")` 可列出所有包含 `tenant_id` 的符号,辅助验证 Mapper 是否缺多租户过滤。
91
+
92
+ ---
93
+
94
+ ## §3 Preflight 前置阅读中的使用
95
+
96
+ 在 `openspec_preflight.md` §一 前置阅读阶段,CodeGraph 作为可选辅助工具使用:
97
+
98
+ | Preflight 步骤 | CodeGraph 辅助方式 | 严格程度 |
99
+ |---------------|-------------------|---------|
100
+ | §一.1 读取 inputs | 不适用(纯文本输入) | — |
101
+ | §一.2 repowiki 阅读 | 不适用(业务知识,非代码) | — |
102
+ | §一.3 参考代码 | `codegraph_files` 快速了解模板文件结构;仍必须 Read 模板内容 | 辅助,不可替代 |
103
+ | §一.4 项目规则 | 不适用(规则文本) | — |
104
+ | §一.5 存储现有实现检索 | **`codegraph_query` 优先**,替代手工 Grep | 推荐,失败降级 Grep |
105
+ | §一.6 调用链分析 | **`codegraph_callers/callees` 优先**,回答"谁在用这个 API" | 推荐 |
106
+
107
+ > **硬约束**:CodeGraph 的输出是"快速索引摘要",精度不如 Read 全文。
108
+ > 关键决策(如"确定没有重复实现")需要 Read 确认后做出,不可仅凭 CodeGraph 摘要拍板。
109
+
110
+ ---
111
+
112
+ ## §4 同步策略
113
+
114
+ ### 4.1 自动同步
115
+
116
+ 配置 `.qoder/mcp.json` 后,CodeGraph MCP 将以 `serve --mcp` 模式运行,内置文件监听器自动增量同步。无需手动执行 `codegraph sync`。
117
+
118
+ ### 4.2 手动同步(异常恢复)
119
+
120
+ 当索引落后或出现不一致时:
121
+
122
+ ```bash
123
+ cd /path/to/your-java-project
124
+ codegraph sync # 增量同步
125
+ codegraph status # 确认状态
126
+ ```
127
+
128
+ ### 4.3 索引新鲜度验证
129
+
130
+ 每次 OpenSpec skill 启动时,CodeGraph MCP 自动提供的 `codegraph_status` 可查看当前索引状态。若发现文件数明显少于预期(< 200),应触发手动 sync。
131
+
132
+ ---
133
+
134
+ ## §5 Preflight 自检扩展项
135
+
136
+ 使用 CodeGraph 辅助时,preflight 自检清单追加两项(仅在使用阶段生效,不影响不使用时):
137
+
138
+ - [ ] (如启用 CodeGraph)`codegraph_status` 已确认索引新鲜(文件数 ≥ 200)
139
+ - [ ] (如启用 CodeGraph)关键代码检索/调用链分析已通过 CodeGraph 完成,结果已写入 Restate 对齐纪要
140
+
141
+ ---
142
+
143
+ ## §6 禁止行为
144
+
145
+ 以下行为视为违反本规范:
146
+
147
+ | 禁止行为 | 理由 |
148
+ |---------|------|
149
+ | 用 `codegraph_query` 结果代替 Read 做精确判断 | query 返回的是索引摘要,不包括完整方法体/注解/import |
150
+ | 用 `codegraph_context` 代替 Read 阅读源代码 | context 用于了解任务周边,不用于精确实现 |
151
+ | 发现 CodeGraph 失败后直接跳过检索步骤 | 应降级到 Grep/Glob 继续检索,宪法 §5 要求必须检索仓库 |
152
+ | CodeGraph 不可用时以此为由拒绝执行任务 | CodeGraph 是可选增强,不是必需依赖 |
153
+ | 使用 CodeGraph 工具时跳过宪法 §2(Restate First) | 任何工具均不豁免 Restate 义务 |
154
+
155
+ ---
156
+
157
+ ## §7 技术参考
158
+
159
+ - CLI 入口:`codegraph`(v0.9.4, npm 全局安装,路径 `/usr/local/bin/codegraph`)
160
+ - 索引存储:`.codegraph/codegraph.db`(已加入 `.codegraph/.gitignore`,不入库)
161
+ - MCP 模式:`codegraph serve --mcp`(stdio 传输)
162
+ - MCP 工具列表:`codegraph_query` / `codegraph_context` / `codegraph_callers` / `codegraph_callees` / `codegraph_impact` / `codegraph_affected` / `codegraph_files` / `codegraph_status` / `codegraph_sync`
@@ -0,0 +1,112 @@
1
+ ---
2
+ trigger: glob
3
+ glob: openspec/**/*.md
4
+ ---
5
+ # OpenSpec 输出规范(Output Specs)
6
+
7
+ > ⚖️ **上级规则**:本文件受 `.qoder/rules/project_constitution.md`(项目宪法,always_on)约束。宪法 §4(SHALL/MUST 硬性)与 §9(禁止独立编译任务)直接落地于本文件 §四 / §五,冲突以宪法为准。
8
+
9
+ **本文件是 OpenSpec artifact(proposal / design / spec / tasks)输出格式与内容
10
+ 要求的唯一真相源。** 在 `openspec/changes/**` 与 `openspec/specs/**` 下创建或
11
+ 修改任何 artifact 时必须遵守本文件,违反即视为 artifact 不合规。
12
+
13
+ > 与本文件配套的另两份规则:
14
+ > - 📋 `.qoder/rules/openspec_preflight.md`:写作前的 Preflight(Restate + 前置阅读)
15
+ > - 📋 `.qoder/rules/openspec_specifications.md`:项目级目录与命名约束、规则索引
16
+
17
+ ---
18
+
19
+ ## §一、通用输出约定
20
+
21
+ - 所有标题与正文使用中文,代码、路径、标识符保留英文
22
+ - 引用 repowiki 章节统一格式:`见 .qoder/repowiki/zh/content/xxx.md#章节名`
23
+ - 引用 reference-code 统一格式:`参考 docs/reference-code/xxx/Xxx.java`(路径前缀见 `openspec/project-profile.md` §2)
24
+ - 行尾不留多余空格,文末保留单个换行
25
+ - artifact 内禁止粘贴 `<context>` / `<rules>` / `<project_context>` 块
26
+
27
+ ---
28
+
29
+ ## §二、proposal.md
30
+
31
+ | 章节 | 硬性要求 |
32
+ |---|---|
33
+ | **Why** | 必须显式引用 repowiki 相关章节,说明新增能力与现有能力的边界 |
34
+ | **Why / What Changes** | 必须能在 `inputs/requirement.md`(若存在)中找到对应依据,不得夹带需求文档未提及的功能 |
35
+ | **What Changes** | 对每一项新增能力须标注可参考的 reference-code 模板路径 |
36
+ | **Impact** | 列出受影响的 repowiki 章节(将来知识库需要更新的条目) |
37
+
38
+ 附加约束(与 `openspec/config.yaml` `rules.proposal` 同源):
39
+ - 禁止凭空假设技术栈,须以实际依赖为准(pom 路径见 `openspec/project-profile.md` §2)
40
+ - 避免重复造轮子:先检索仓库现有实现与已有依赖,禁止引入功能重复的依赖
41
+ - 禁止猜测第三方包用法:未在 reference-code 与现有实现中找到同类型用法时,
42
+ 必须先阅读包源码或 README 确认 API 存在后再引用
43
+
44
+ ---
45
+
46
+ ## §三、design.md
47
+
48
+ | 章节 | 硬性要求 |
49
+ |---|---|
50
+ | **Context** | 引用 repowiki 的"数据模型设计"与"系统架构设计"对应章节 |
51
+ | **Decisions** | Domain / Mapper / Controller 选型对齐参考模板的继承与注解写法(实体基类、Mapper 基类、表名注解等)。具体注解名与基类见 `openspec/project-profile.md` §4 / §5 |
52
+ | **Non-Goals** | 显式声明不修改的 repowiki 现有模块 |
53
+
54
+ ---
55
+
56
+ ## §四、spec.md
57
+
58
+ - **Requirement 条目必须以 `SHALL` 或 `MUST` 开头**(OpenSpec 归档校验硬性
59
+ 要求,使用其他动词将导致 `openspec archive` 失败)
60
+ - 场景以 `WHEN / THEN / AND` 结构描述,行为与 reference-code 中同类型功能
61
+ 保持一致
62
+ - 数据模型类 spec 必须包含:
63
+ - 建表 SQL 路径约定(路径见 `openspec/project-profile.md` §2)
64
+ - 表名使用 snake_case
65
+ - 主键、多租户字段完整声明(字段名见 `openspec/project-profile.md` §4)
66
+
67
+ ---
68
+
69
+ ## §五、tasks.md
70
+
71
+ - 每个任务可独立验证,给出验证命令或可观察证据
72
+ - 涉及新增类的任务,任务描述必须指明参考的 `docs/reference-code/` 文件路径
73
+ - 建表 / SQL 脚本任务统一放到建表 SQL 路径(见 `openspec/project-profile.md` §2)
74
+ - Mapper XML 统一放到 Mapper XML 路径(见 `openspec/project-profile.md` §2)
75
+ - **禁止包含编译验证任务**:tasks.md 不得独立列出 `mvn clean compile` /
76
+ `mvn compile` 等整体编译验证步骤;单任务内的"编译无错误"作为验证证据
77
+ 可保留,但不得单独用作任务条目
78
+ - **Reverse Sync 硬规则(apply 阶段强制)**:实施任一任务时若发现 spec.md /
79
+ design.md / tasks.md 自身描述与代码/参考实现不一致,**必须先停止代码实现,
80
+ 按 `.qoder/rules/openspec_reverse_sync.md` 的「Reverse Sync 五步法」
81
+ 回写 artifact 并等待用户确认**,禁止反向修改代码适配错误文档
82
+
83
+ ---
84
+
85
+ ## §六、Artifact 输出自检清单(落盘前逐项核验)
86
+
87
+ 通用:
88
+ - [ ] 全文中文叙述、英文路径与代码
89
+ - [ ] 所有 repowiki / reference-code 引用使用统一格式
90
+ - [ ] 未粘贴 context / rules 注入块
91
+
92
+ proposal.md:
93
+ - [ ] Why / What Changes 在 `inputs/requirement.md` 中均能找到依据
94
+ - [ ] What Changes 每项新增能力都标注了 reference-code 模板
95
+ - [ ] Impact 列出受影响 repowiki 章节
96
+
97
+ design.md:
98
+ - [ ] Context 引用了 repowiki 数据模型 / 系统架构章节
99
+ - [ ] Decisions 与 reference-code 注解、继承一致
100
+ - [ ] Non-Goals 明确
101
+
102
+ spec.md:
103
+ - [ ] 每条 Requirement 以 SHALL 或 MUST 开头
104
+ - [ ] 场景使用 WHEN / THEN / AND
105
+ - [ ] 数据模型类 spec 含建表 SQL 路径、snake_case 表名、多租户字段
106
+
107
+ tasks.md:
108
+ - [ ] 每个任务可独立验证
109
+ - [ ] 新增类任务标注了 reference-code 路径
110
+ - [ ] 不含独立的 `mvn compile` 任务
111
+
112
+ **任一项未通过**:禁止落盘,先修订后再写入。
@@ -0,0 +1,230 @@
1
+ ---
2
+ trigger: model_decision
3
+ description: OpenSpec skills(openspec-propose / openspec-continue-change / openspec-explore / openspec-apply-change)与在 openspec/changes/** 或 openspec/specs/** 下生成任何 artifact(proposal/design/spec/tasks)前的统一 Preflight 流程(Restate First + Clarify 主动找歧义 + 前置阅读 + 物理化自检展示)。apply 阶段额外叠加 Reverse Sync 硬规则(发现 spec 偏差时先回写文档再改代码)。因 Qoder 在 skill 触发时同步加载 model_decision 规则,本文件无需在各 SKILL.md 中硬编码 Step 0 引用即可自动生效。
4
+ ---
5
+
6
+ # OpenSpec Preflight(统一前置流程)
7
+
8
+ > ⚖️ **上级规则**:本文件受 `.qoder/rules/project_constitution.md`(项目宪法,always_on)约束。宪法 §2 / §10 直接对应本文件的 §零 Restate First 与 §二 自检清单,冲突以宪法为准。
9
+
10
+ **本文件是 OpenSpec 体系中所有提案/继续/探索前置流程的唯一真相源。**
11
+ 触发 `openspec-propose` / `openspec-continue-change` / `openspec-explore` 三个 skill,
12
+ 或在 `openspec/changes/**`、`openspec/specs/**` 下创建/修改
13
+ `proposal.md` / `design.md` / `spec.md` / `tasks.md` 时,必须按本文件流程执行,
14
+ 不得跳过、简化或重新发明。
15
+
16
+ 其它文件(三个 SKILL.md、`openspec_specifications.md`、`openspec/config.yaml`)
17
+ 仅负责引用本文件,不再重复 Preflight 内容。
18
+
19
+ ---
20
+
21
+ ## §零、Restate First(最先执行,优先级高于一切)
22
+
23
+ 在**任何**前置阅读、CLI 调用、artifact 生成之前,必须先完成一次「Restate + Checkpoint」:
24
+
25
+ 1. **Restate(用自己的话复述)**:以 8 行以内,明确给出:
26
+ - 任务目标(一句话)
27
+ - 变更边界(包含 / 不包含什么)
28
+ - Done Contract(什么算完成、由什么证明)
29
+ - 已识别的关键风险或歧义
30
+ - **任务档位**:`zero` / `fast` / `standard` / `deep` 四选一 + 一句话理由
31
+ (判定规则见 📋 `.qoder/rules/openspec_task_tiers.md` §二 决策树)
32
+ 2. **等待用户确认**:若用户未明确同意("OK / 继续 / 确认"等),
33
+ 禁止进入前置阅读与任何 artifact 生成。若存在歧义,使用 AskUserQuestion 澄清。
34
+ 用户有权在此时覆盖 AI 判定的档位。
35
+ 3. **确认通过后**,按档位裁剪后续流程(fast 档跳过 Clarify、跳过 design.md;
36
+ standard 走全套;deep 追加 codemap.md),才进入 §一 前置阅读与后续工作流。
37
+ 4. **再对齐时机(Core Goal as Loop Anchor)**:
38
+
39
+ 以下三个时机**强制**重新回看 Restate 中的核心目标,不得仅靠记忆推进:
40
+
41
+ | 时机 | 动作 |
42
+ |------|------|
43
+ | **执行前 checkpoint** | 每一个实施步骤(如 tasks.md 的每个 task)执行前,输出 **≤4 行 Core Goal Re-Anchor**:<br>· 核心目标(来自 proposal.md / spec.md,≤1 句)<br>· 当前步骤对目标的贡献<br>· 1 行 sanity check:「基于当前进度,此步骤是否仍合理?」 |
44
+ | **偏差暴露后** | 发现 spec / design / tasks 与实现不一致时,启动 Reverse Sync 五步法(见 `.qoder/rules/openspec_reverse_sync.md`);回写文档后**回到本节的 Re-Anchor 重新对齐** |
45
+ | **artifact 收尾时** | 全部任务完成后,回看 Restate 中的 Done Contract,逐条检查是否由证据证明完成 |
46
+
47
+ **Core Goal Re-Anchor 格式**(轻量,非完整 Restate):
48
+ ```
49
+ ## Core Goal Re-Anchor
50
+ - **目标**:<1 句核心目标>
51
+ - **当前步骤**:<步骤编号 + 描述> → 贡献:<1 句>
52
+ - **Sanity Check**:<1 句路径检查>
53
+ ```
54
+
55
+ 若 Re-Anchor 发现核心目标已偏移、当前步骤不再合理:
56
+ - 立即暂停
57
+ - 报告偏移内容
58
+ - 建议更新 spec / design / tasks 后再继续
59
+ - **禁止**绕过偏移继续推进
60
+
61
+ 此机制是宪法 §2 Restate First 在实施阶段的轻量化延伸,
62
+ 与 Preflight 自检(§二)互为补充:自检管"开始前",Loop Anchor 管"进行中"。
63
+
64
+ > 灵感来源:轻量 AI Agent Harness 实践(SDD-RIPER Light)。
65
+ > 目的:避免"四件套写完才发现理解错了"的返工。
66
+
67
+ ---
68
+
69
+ ## §零点五、Clarify(Restate 通过后、前置阅读前执行)
70
+
71
+ Restate 被用户确认后,**不得直接进入前置阅读**,必须先执行一次主动找歧义:
72
+
73
+ 1. **主动列出 3-5 个歧义点**,每条包含:
74
+ - 歧义编号(Q1 / Q2 ...)
75
+ - 一句话描述争议(例:"字段 X 是否跟随租户隔离?")
76
+ - **二选一或三选一**的候选答案(避免开放式问题)
77
+ - 推荐答案 + 简短理由(可选)
78
+ 2. **展示方式**:必须用 AskUserQuestion 工具提交(多选或单选),
79
+ 禁止以"请回复数字 1/2/3"的自由文本形式草草带过。
80
+ 3. **无歧义的例外**:若任务确实简单(例如仅修正错别字、仅加一个枚举值),
81
+ 允许显式声明「本任务无需 Clarify,理由:XXX」并等待用户"OK"后继续;
82
+ 但涉及数据模型、接口、权限、租户隔离、编制计划等领域变更时不得省略。
83
+ **档位例外**:声明为 `zero` 档的任务不进入本节;声明为 `fast` 档的任务
84
+ **默认跳过** Clarify(需显式写"fast 档无需 Clarify"),`standard` / `deep`
85
+ 档仍必须执行。
86
+ 4. **确认方式**:用户作答后,必须把答案回写到 Restate 末尾形成"对齐纪要",
87
+ 再进入 §一 前置阅读。
88
+
89
+ > 灵感来源:GitHub Spec-Kit `/clarify` 阶段。
90
+ > 目的:把 Restate First 从"复述理解"升级为"主动暴露并锁死边界",
91
+ > 避免"复述看似无误、落盘才知分歧"的隐性返工。
92
+
93
+ ---
94
+
95
+ ## §一、前置阅读(强制,Restate 确认后执行)
96
+
97
+ 在编写任何 OpenSpec artifact 前,必须按需读取以下资料,并在输出文档中
98
+ 显式引用来源(文件路径 + 章节名)。
99
+
100
+ ### 1. 本次 change 的原始需求输入(最高优先级)
101
+ 约定路径:`openspec/changes/<name>/inputs/`
102
+
103
+ - 若该目录存在,必须**完整阅读**其中所有文件(PRD、会议纪要、接口草案、
104
+ 原型图等),作为本次 change 的权威需求源。
105
+ - 若目录缺失或为空,**禁止凭空编写 artifact**,必须先向用户确认需求来源
106
+ (对话 / 外部链接 / 其他),并把确认后的需求落盘到 `inputs/requirement.md`
107
+ 再进入后续流程。
108
+ - 图片资料统一放到 `inputs/mockups/`,在 `inputs/requirement.md` 中用
109
+ 相对路径引用。
110
+ - `inputs/` 目录随 change 一同归档到 `openspec/changes/archive/`,保证可回溯。
111
+
112
+ 建议结构:
113
+ ```
114
+ openspec/changes/<name>/
115
+ ├── inputs/
116
+ │ ├── requirement.md # PRD / 业务方描述(必需)
117
+ │ ├── api-draft.yaml # 接口草案(可选)
118
+ │ ├── mockups/ # 原型/截图(可选)
119
+ │ └── data-samples.sql # 样本数据(可选)
120
+ ├── proposal.md
121
+ ├── design.md
122
+ ├── specs/
123
+ └── tasks.md
124
+ ```
125
+
126
+ ### 2. 知识库 `.qoder/repowiki/zh/content/`(按需阅读,禁止全量扫描)
127
+
128
+ > ⚠️ **读取策略硬规则**:repowiki 体量大,**全量扫描昂贵且无必要**。本节
129
+ > 既是阅读清单,也是**读取成本控制**的硬约束。
130
+
131
+ #### 2.1 三步路由法(按顺序执行)
132
+
133
+ 1. **预判**:根据 Restate 中的变更类型,从下方映射表选出 **最多 2 个** 主章节;
134
+ 无关章节禁止打开。
135
+ 2. **先列目录再读文件**:对每个目标章节,先用 `list_dir` 查看文件清单
136
+ (成本约为 `read_file` 的 1/20),再根据文件名判断只读 1-3 个最相关
137
+ `.md`,禁止把整个章节目录批量 `read_file`。
138
+ 3. **增量补读**:后续 Step 若发现证据不足,再按需补读新文件;
139
+ 禁止"先把所有可能相关的都读一遍再开始"。
140
+
141
+ #### 2.2 变更类型 → 主章节映射(最多选 2 个)
142
+
143
+ > 完整映射表见 `openspec/project-profile.md` §6。该表根据当前项目 repowiki 目录树维护,
144
+ > 移植项目时只需改 profile 一处。
145
+
146
+ #### 2.3 不重复读取(本 session 内强约束)
147
+
148
+ - **已在本 session 内读过的文件禁止再次 `read_file`**。若需回忆内容,
149
+ 通过上下文引用(直接写出文件路径 + 章节名),而不是重新读。
150
+ - 若对已读内容有新的需要(如只记得大意需要精确行号),允许二次读取,
151
+ 但必须在回复中标注"二次读取原因:XXX"。
152
+ - **Preflight 自检清单中必须列出本次已读章节清单**(见 §二),作为
153
+ "不重复读取"的取证基准。
154
+
155
+ #### 2.4 跨轮对话的已读判定
156
+
157
+ - 用户在上一轮已明确引用某文件,或上一轮已通过 `read_file` 输出其内容,
158
+ 视为**已读**,本轮禁止重读,直接基于上下文工作。
159
+ - 仅当用户显式要求"重新读一次最新版"时,才允许重读。
160
+
161
+ > 目的:把 repowiki 从"每轮从零扫描"改为"按需最小读取 + 跨轮缓存",
162
+ > 显著降低 token 成本与响应延迟。
163
+
164
+ ### 3. 参考代码 `docs/reference-code/`
165
+ 以参考模板为标准,按层检索。完整七层文件清单见 `openspec/project-profile.md` §5。
166
+
167
+ ### 4. 项目规则
168
+ - `.qoder/rules/openspec_specifications.md`:项目规则索引层(含目录与命名约束)。
169
+ - `.qoder/rules/openspec_output_specs.md`:**artifact 输出规范的唯一真相源**
170
+ (proposal / design / spec / tasks 章节硬性要求 + 落盘前自检清单),写入
171
+ artifact 前必读且必须严格遵守。
172
+ - `.qoder/rules/openspec_reverse_sync.md`:**apply 阶段偏差处理的唯一标准**(Reverse Sync 五步法),实施代码前必读。
173
+ - `openspec/config.yaml`:`context` 与按 artifact 分类的 `rules` 字段,
174
+ 由 openspec CLI 注入给 AI。
175
+
176
+ ### 5. 依赖版本确认
177
+ 涉及第三方库选型时,必须阅读:
178
+ - `/pom.xml` 的 `dependencyManagement`(版本)
179
+ - `/admin/pom.xml` 的 `dependencies`(实际依赖清单)
180
+ > 模块名与依赖清单见 `openspec/project-profile.md` §2。
181
+
182
+ 禁止凭空假设依赖或版本。
183
+
184
+ ### 6. 依赖与实现复用原则
185
+ - **避免重复造轮子**:新增功能前先检索仓库现有实现与 `pom.xml` 中已有的包,
186
+ 禁止引入功能重复的依赖或重复实现已有的工具类。在 `proposal.md` 的 **Why** /
187
+ **What Changes** 中需明确说明与已有能力的边界。
188
+ - **禁止猜测第三方包用法**:若 `docs/reference-code/` 与仓库现有实现中均未
189
+ 找到同类型用法,必须先阅读该包的源码或官方 README,确认 API 存在、
190
+ 版次兼容后,再在 `design.md` / `tasks.md` 中引用具体类名或方法名;
191
+ 不允许以假定存在的 API 为前提编写 artifact。
192
+
193
+ ---
194
+
195
+ ## §二、Preflight 自检清单(进入 skill 后续 Step 前必须全部通过)
196
+
197
+ **物理化展示硬规则(宪法 §10 落地)**:进入 Step 1 之前,必须在主回复开头
198
+ 用可见的 Markdown checkbox 形式(`- [x]` / `- [ ]`)打印下方清单的真实勾选
199
+ 状态,禁止仅用"已完成 Preflight"等文字描述代替。未展示勾选结果 = 视为
200
+ 未执行 Preflight,用户有权要求重做。
201
+
202
+ - [ ] Restate 已产出且 ≤ 8 行(含目标 / 边界 / Done Contract / 风险)
203
+ - [ ] **已在 Restate 末尾声明任务档位**(`zero` / `fast` / `standard` / `deep`)并给出一句话理由
204
+ - [ ] 用户已明确确认("OK / 继续 / 确认"等),或歧义已通过 AskUserQuestion 澄清
205
+ - [ ] Clarify 阶段已完成:已列 3-5 个歧义点并获用户答复,或已显式声明"本任务无需 Clarify"且得到用户"OK"
206
+ - [ ] `openspec/changes/<name>/inputs/` 已完整阅读,或已按缺失处理流程
207
+ 落盘 `inputs/requirement.md`
208
+ - [ ] 与当前变更主题相关的 repowiki 章节已识别并阅读(已读清单必须列出:`路径A#章节X`、`路径B#章节Y`;已读文件本 session 不重复 `read_file`)
209
+ - [ ] 与当前变更同类型的 reference-code 模板已识别并阅读
210
+ - [ ] 涉及依赖变更时,`/pom.xml` 与 `/admin/pom.xml` 已核对
211
+ - [ ] 已加载 `.qoder/rules/openspec_output_specs.md`,准备在写入 artifact 时按其执行落盘前自检
212
+ - [ ] 已加载 `.qoder/rules/project_constitution.md` 宪法 10 条并确认本次任务不违宪
213
+
214
+ **任一项未完成**:禁止进入 skill 的后续 Step,禁止生成任何 artifact。
215
+
216
+ ---
217
+
218
+ ## §三、与其他文件的引用关系
219
+
220
+ | 文件 | 引用方式 |
221
+ |---|---|
222
+ | `.qoder/skills/openspec-propose/SKILL.md` | 方案甲迁移后不再含 Step 0 硬引用;规则由 Qoder model_decision 自动加载本文件 |
223
+ | `.qoder/skills/openspec-continue-change/SKILL.md` | 同上 |
224
+ | `.qoder/skills/openspec-explore/SKILL.md` | 同上,探索场景通过本文件 §一.5 覆盖 |
225
+ | `.qoder/skills/openspec-apply-change/SKILL.md` | 同上;Reverse Sync 五步法已搬迁至 `openspec_reverse_sync.md` |
226
+ | `.qoder/rules/openspec_specifications.md` | §零 为引用指针,自身只保留输出规范 |
227
+ | `.qoder/rules/openspec_output_specs.md` | §五 tasks.md 末尾记录 Reverse Sync 硬规则,指向 `openspec_reverse_sync.md` |
228
+ | `.qoder/rules/openspec_task_tiers.md` | 在 §零 Restate 与 §零点五 Clarify 中被引用;四档裁剪规则由该文件承载 |
229
+ | `.qoder/rules/openspec_reverse_sync.md` | apply 阶段偏差处理流程(五步法);本文件 §零 完成后、进入实施时由该文件接管偏差处置 |
230
+ | `openspec/config.yaml` | `context.Restate First` / `rules.proposal` 保留硬约束,作为 CLI 注入链路的双保险 |