@miniidealab/openlogos 0.9.23 → 0.9.25

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 (57) hide show
  1. package/claude-plugin-template/.claude-plugin/plugin.json +1 -1
  2. package/dist/commands/init.d.ts +1 -1
  3. package/dist/commands/init.d.ts.map +1 -1
  4. package/dist/commands/init.js +59 -36
  5. package/dist/commands/init.js.map +1 -1
  6. package/dist/commands/launch.d.ts +5 -0
  7. package/dist/commands/launch.d.ts.map +1 -1
  8. package/dist/commands/launch.js +54 -0
  9. package/dist/commands/launch.js.map +1 -1
  10. package/dist/commands/merge.d.ts.map +1 -1
  11. package/dist/commands/merge.js +3 -1
  12. package/dist/commands/merge.js.map +1 -1
  13. package/dist/commands/next.d.ts +2 -0
  14. package/dist/commands/next.d.ts.map +1 -1
  15. package/dist/commands/next.js +62 -63
  16. package/dist/commands/next.js.map +1 -1
  17. package/dist/commands/smoke.d.ts +30 -0
  18. package/dist/commands/smoke.d.ts.map +1 -0
  19. package/dist/commands/smoke.js +237 -0
  20. package/dist/commands/smoke.js.map +1 -0
  21. package/dist/commands/status.d.ts +38 -2
  22. package/dist/commands/status.d.ts.map +1 -1
  23. package/dist/commands/status.js +309 -29
  24. package/dist/commands/status.js.map +1 -1
  25. package/dist/commands/verify.d.ts.map +1 -1
  26. package/dist/commands/verify.js +32 -1
  27. package/dist/commands/verify.js.map +1 -1
  28. package/dist/i18n.d.ts +1 -1
  29. package/dist/i18n.d.ts.map +1 -1
  30. package/dist/i18n.js +101 -33
  31. package/dist/i18n.js.map +1 -1
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +9 -0
  34. package/dist/index.js.map +1 -1
  35. package/dist/lib/sync-resource-index.d.ts.map +1 -1
  36. package/dist/lib/sync-resource-index.js +21 -2
  37. package/dist/lib/sync-resource-index.js.map +1 -1
  38. package/package.json +1 -1
  39. package/skills/architecture-designer/SKILL.md +27 -5
  40. package/skills/change-writer/SKILL.md +61 -11
  41. package/skills/code-implementor/SKILL.md +5 -5
  42. package/skills/code-reviewer/SKILL.md +1 -1
  43. package/skills/deployment-designer/SKILL.md +137 -0
  44. package/skills/deployment-executor/SKILL.md +133 -0
  45. package/skills/merge-executor/SKILL.md +17 -4
  46. package/skills/project-init/SKILL.md +42 -2
  47. package/skills/test-orchestrator/SKILL.md +6 -6
  48. package/skills/test-writer/SKILL.md +67 -8
  49. package/spec/agents-md.md +32 -9
  50. package/spec/change-management.md +75 -20
  51. package/spec/cli-json-output.md +106 -17
  52. package/spec/directory-convention.md +28 -6
  53. package/spec/logos-project.md +44 -1
  54. package/spec/logos.config.schema.json +32 -2
  55. package/spec/tasks-spec.md +56 -11
  56. package/spec/test-results.md +2 -2
  57. package/spec/workflow.md +129 -33
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## 1. 概述
6
6
 
7
- OpenLogos CLI 的 `status`、`next`、`verify`、`detect` 四个命令支持 `--format json` 参数,输出结构化 JSON 供外部工具(如 RunLogos)以编程方式消费。
7
+ OpenLogos CLI 的 `status`、`next`、`verify`、`smoke`、`detect` 五类命令支持 `--format json` 参数,输出结构化 JSON 供外部工具(如 RunLogos)以编程方式消费。
8
8
 
9
9
  ### 1.1 通用约定
10
10
 
@@ -21,10 +21,10 @@ OpenLogos CLI 的 `status`、`next`、`verify`、`detect` 四个命令支持 `--
21
21
 
22
22
  ```jsonc
23
23
  {
24
- "command": "<command-name>", // "status" | "next" | "verify" | "detect" | "module list"
25
- "version": "<cli-version>", // CLI 版本号,如 "0.5.9"
26
- "timestamp": "<ISO-8601>", // 输出时间戳
27
- "data": { ... } // 命令特定的数据负载
24
+ "command": "<command-name>", // "status" | "next" | "verify" | "smoke" | "detect" | "module list"
25
+ "version": "<cli-version>",
26
+ "timestamp": "<ISO-8601>",
27
+ "data": { ... }
28
28
  }
29
29
  ```
30
30
 
@@ -106,8 +106,29 @@ openlogos status --format json # JSON 格式
106
106
  "done": false,
107
107
  "skipped": false,
108
108
  "files": []
109
+ },
110
+ {
111
+ "key": "phase.3-3-deployment",
112
+ "label": "Phase 3-3 · 部署方案",
113
+ "done": true,
114
+ "skipped": false,
115
+ "files": ["core-01-deployment-plan.md"]
116
+ },
117
+ {
118
+ "key": "phase.3-7-deploy",
119
+ "label": "Phase 3-7 · 部署执行",
120
+ "done": false,
121
+ "skipped": false,
122
+ "files": []
123
+ },
124
+ {
125
+ "key": "phase.3-8-smoke",
126
+ "label": "Phase 3-8 · 部署冒烟测试(smoke)",
127
+ "done": false,
128
+ "skipped": false,
129
+ "files": []
109
130
  }
110
- // ... 所有 10 个 phase
131
+ // ... 所有 phase
111
132
  ],
112
133
  "modules": [ // 模块注册表(来自 logos-project.yaml)
113
134
  {
@@ -135,13 +156,18 @@ openlogos status --format json # JSON 格式
135
156
  "phase_progress": null,
136
157
  "active_change": { // 当前活跃变更提案
137
158
  "slug": "add-refund",
138
- "proposal_step": "delta-writing", // "writing"|"delta-writing"|"ready-to-merge"|"merge-generated"|"coding"
159
+ "proposal_step": "delta-writing", // 见 proposal_step 枚举
139
160
  "proposal_step_label": "撰写 Delta",
140
161
  "has_proposal": true,
141
162
  "has_tasks": true,
142
163
  "tasks_checked": 2,
143
164
  "tasks_total": 5,
144
- "delta_count": 1
165
+ "delta_count": 1,
166
+ "deployment_required": false,
167
+ "smoke_required": false,
168
+ "deployment_reason": "文档-only 提案,不需要发布运行产物",
169
+ "deployment_decision_source": "proposal",
170
+ "deployment_decision_conflict": false
145
171
  },
146
172
  "suggestion": "继续为 add-refund 产出 delta 文件,完成后明确授权执行 openlogos merge add-refund"
147
173
  }
@@ -184,16 +210,21 @@ openlogos status --format json # JSON 格式
184
210
  | `modules[].phase_progress` | object \| null | 是 | 各阶段进度 map(key = phase key);`launched` 模块为 null |
185
211
  | `modules[].phase_progress[key].done` | boolean | 是 | 该阶段是否已完成 |
186
212
  | `modules[].phase_progress[key].skipped` | boolean | 是 | 该阶段是否被跳过 |
187
- | `modules[].phase_progress[key].scenario_coverage` | object \| undefined | 否 | 仅场景类阶段(`phase.3-1`、`phase.3-3a`)存在 |
213
+ | `modules[].phase_progress[key].scenario_coverage` | object \| undefined | 否 | 仅场景类阶段(`phase.3-1`、`phase.3-4a`)存在 |
188
214
  | `modules[].active_change` | object \| null | 是 | 当前活跃变更提案;`initial` 模块或无活跃提案时为 null |
189
215
  | `modules[].active_change.slug` | string | 是 | 提案 slug |
190
- | `modules[].active_change.proposal_step` | string | 是 | 提案阶段:`"writing"` \| `"delta-writing"` \| `"ready-to-merge"` \| `"merge-generated"` \| `"coding"`;`"implementing"` / `"in-progress"` 为旧版本兼容值 |
216
+ | `modules[].active_change.proposal_step` | string | 是 | 提案阶段:`"writing"` \| `"delta-writing"` \| `"ready-to-merge"` \| `"merge-generated"` \| `"coding"` \| `"ready-to-verify"` \| `"verify-passed"` \| `"verify-failed"` \| `"ready-to-deploy"` \| `"deploy-done"` \| `"ready-to-smoke"` \| `"smoke-passed"` \| `"smoke-failed"`;`"implementing"` / `"in-progress"` 为旧版本兼容值 |
191
217
  | `modules[].active_change.proposal_step_label` | string | 是 | 提案阶段本地化标签 |
192
218
  | `modules[].active_change.has_proposal` | boolean | 是 | 是否存在 proposal.md |
193
219
  | `modules[].active_change.has_tasks` | boolean | 是 | 是否存在 tasks.md |
194
220
  | `modules[].active_change.tasks_checked` | number | 是 | 已勾选任务数 |
195
221
  | `modules[].active_change.tasks_total` | number | 是 | 总任务数 |
196
222
  | `modules[].active_change.delta_count` | number | 是 | deltas 目录下的文件数 |
223
+ | `modules[].active_change.deployment_required` | boolean \| null | 是 | 活跃提案是否需要部署;无法判断时为 null |
224
+ | `modules[].active_change.smoke_required` | boolean \| null | 是 | 活跃提案是否需要部署后 smoke;无法判断时为 null |
225
+ | `modules[].active_change.deployment_reason` | string \| null | 是 | 来自 `proposal.md` 的部署原因或兼容推断说明 |
226
+ | `modules[].active_change.deployment_decision_source` | string | 是 | `"proposal"` \| `"tasks"` \| `"module-default"` \| `"legacy-fallback"`,表示部署决策来源 |
227
+ | `modules[].active_change.deployment_decision_conflict` | boolean | 是 | `proposal.md` 与 `[deploy]` section 是否冲突 |
197
228
  | `modules[].suggestion` | string | 是 | 针对该模块的下一步建议(本地化文本) |
198
229
  | `active_proposals` | array | 是 | 活跃变更提案列表 |
199
230
  | `active_proposals[].name` | string | 是 | 提案目录名 |
@@ -306,7 +337,65 @@ openlogos verify --format json # JSON 格式
306
337
 
307
338
  ---
308
339
 
309
- ## 5. 错误处理
340
+ ## 5. `openlogos smoke --format json`
341
+
342
+ 冒烟测试用于验收部署后的目标环境是否可用,不并入 `openlogos verify`。
343
+
344
+ ### 5.1 用法
345
+
346
+ ```bash
347
+ openlogos smoke # 人类可读格式
348
+ openlogos smoke --format json # JSON 格式
349
+ openlogos smoke --env staging
350
+ openlogos smoke --env production --format json
351
+ ```
352
+
353
+ ### 5.2 JSON Schema(data 部分)
354
+
355
+ ```jsonc
356
+ {
357
+ "environment": "staging", // smoke 目标环境;未指定时为 null
358
+ "summary": {
359
+ "defined_count": 5, // 定义的 smoke 用例数
360
+ "executed_count": 5, // 已执行 smoke 用例数
361
+ "passed_count": 5,
362
+ "failed_count": 0,
363
+ "skipped_count": 0,
364
+ "uncovered_count": 0,
365
+ "coverage_pct": 100,
366
+ "pass_rate_pct": 100
367
+ },
368
+ "gate": {
369
+ "result": "PASS", // "PASS" | "FAIL"
370
+ "reason": null // 失败原因分类
371
+ },
372
+ "failed_cases": [],
373
+ "uncovered_cases": [],
374
+ "skipped_cases": [],
375
+ "report_path": "logos/resources/verify/smoke-report.md",
376
+ "result_path": "logos/resources/verify/smoke-results.jsonl"
377
+ }
378
+ ```
379
+
380
+ ### 5.3 字段说明
381
+
382
+ | 字段 | 类型 | 必填 | 说明 |
383
+ |------|------|------|------|
384
+ | `environment` | string \| null | 是 | 目标环境,由 `--env` 指定 |
385
+ | `summary.defined_count` | number | 是 | smoke 用例规格中定义的用例数 |
386
+ | `summary.executed_count` | number | 是 | smoke 结果中实际执行的用例数 |
387
+ | `gate.result` | string | 是 | `PASS` 或 `FAIL` |
388
+ | `gate.reason` | string \| null | 是 | 失败原因,如 `failed_cases` / `incomplete_coverage` |
389
+ | `failed_cases` | array | 是 | 失败 smoke 用例 |
390
+ | `uncovered_cases` | array | 是 | 未覆盖 smoke 用例 ID |
391
+ | `report_path` | string | 是 | smoke 报告路径 |
392
+ | `result_path` | string | 是 | smoke 结果路径 |
393
+
394
+ `openlogos smoke` 与 `openlogos verify` 共享 JSONL 结果思想,但读取的是 `smoke.result_path`,默认 `logos/resources/verify/smoke-results.jsonl`。冒烟测试用例建议存放在 `logos/resources/test/smoke/`。
395
+
396
+ ---
397
+
398
+ ## 6. 错误处理
310
399
 
311
400
  当命令因错误退出时(如项目未初始化、找不到文件等),JSON 模式下输出错误 JSON 到 **stderr** 并以非零退出码退出:
312
401
 
@@ -322,7 +411,7 @@ openlogos verify --format json # JSON 格式
322
411
  }
323
412
  ```
324
413
 
325
- ### 5.1 错误码
414
+ ### 6.1 错误码
326
415
 
327
416
  | 错误码 | 说明 |
328
417
  |--------|------|
@@ -332,18 +421,18 @@ openlogos verify --format json # JSON 格式
332
421
 
333
422
  ---
334
423
 
335
- ## 6. `openlogos module list --format json`
424
+ ## 7. `openlogos module list --format json`
336
425
 
337
426
  列出项目中注册的所有模块及其生命周期状态。
338
427
 
339
- ### 6.1 用法
428
+ ### 7.1 用法
340
429
 
341
430
  ```bash
342
431
  openlogos module list # 人类可读格式
343
432
  openlogos module list --format json # JSON 格式
344
433
  ```
345
434
 
346
- ### 6.2 JSON Schema(data 部分)
435
+ ### 7.2 JSON Schema(data 部分)
347
436
 
348
437
  ```jsonc
349
438
  {
@@ -362,7 +451,7 @@ openlogos module list --format json # JSON 格式
362
451
  }
363
452
  ```
364
453
 
365
- ### 6.3 字段说明
454
+ ### 7.3 字段说明
366
455
 
367
456
  | 字段 | 类型 | 必填 | 说明 |
368
457
  |------|------|------|------|
@@ -375,7 +464,7 @@ openlogos module list --format json # JSON 格式
375
464
 
376
465
  ---
377
466
 
378
- ## 7. 完整用法示例
467
+ ## 8. 完整用法示例
379
468
 
380
469
  ```bash
381
470
  # 获取项目状态(机器可读)
@@ -22,13 +22,15 @@ project-root/
22
22
  │ │ │ │ └── 2-page-design/ # Phase 2: 页面设计 + HTML 原型
23
23
  │ │ │ └── 3-technical-plan/
24
24
  │ │ │ ├── 1-architecture/ # Phase 3: 架构与技术选型
25
- │ │ │ └── 2-scenario-implementation/ # Phase 3: 场景实现文档
25
+ │ │ │ ├── 2-scenario-implementation/ # Phase 3: 场景实现文档
26
+ │ │ │ └── 3-deployment/ # Phase 3: 部署方案 + 冒烟测试方案
26
27
  │ │ ├── api/ # Phase 3: OpenAPI YAML
27
28
  │ │ ├── database/ # Phase 3: SQL DDL
28
29
  │ │ ├── test/ # Phase 3: 测试用例规格(Markdown)
30
+ │ │ │ └── smoke/ # Phase 3: 部署后冒烟测试用例(Markdown,可选)
29
31
  │ │ ├── scenario/ # Phase 3: API 编排测试(JSON)
30
- │ │ ├── implementation/ # Phase 3-4: 代码实现清单(Markdown)
31
- │ │ └── verify/ # Phase 3: 测试验收结果(JSONL + 报告)
32
+ │ │ ├── implementation/ # Phase 3: 代码实现清单(Markdown)
33
+ │ │ └── verify/ # Phase 3: 验收、部署、冒烟结果(JSONL + 报告)
32
34
  │ │
33
35
  │ └── changes/ # 变更提案工作区
34
36
  │ ├── {change-name}/ # 进行中的变更提案
@@ -57,14 +59,16 @@ OpenLogos 方法论的统一入口。包含配置文件、研发资源文档和
57
59
  | `prd/1-product-requirements/` | Phase 1: WHY | 需求文档、用户故事、竞品分析 |
58
60
  | `prd/2-product-design/1-feature-specs/` | Phase 2: WHAT | 功能规格、信息架构、设计规范 |
59
61
  | `prd/2-product-design/2-page-design/` | Phase 2: WHAT | 页面设计文档 + HTML 原型 |
60
- | `prd/3-technical-plan/1-architecture/` | Phase 3: HOW | 整体架构、技术选型 |
62
+ | `prd/3-technical-plan/1-architecture/` | Phase 3: HOW | 整体架构、技术选型、部署约束 |
61
63
  | `prd/3-technical-plan/2-scenario-implementation/` | Phase 3: HOW | 业务场景文档(时序图 + 步骤说明) |
64
+ | `prd/3-technical-plan/3-deployment/` | Phase 3: HOW | 部署方案、环境配置、回滚策略、冒烟测试方案 |
62
65
  | `api/` | Phase 3: HOW | OpenAPI YAML 规格文件 |
63
66
  | `database/` | Phase 3: HOW | SQL DDL 设计文件 |
64
67
  | `test/` | Phase 3: HOW | 单元测试 + 场景测试用例规格(Markdown) |
68
+ | `test/smoke/` | Phase 3: HOW | 部署后冒烟测试用例规格(Markdown,仅需部署的项目) |
65
69
  | `scenario/` | Phase 3: HOW | API 编排测试用例(JSON,仅 API 项目) |
66
- | `implementation/` | Phase 3-4: HOW | 代码实现清单(Markdown),标记代码实现阶段完成 |
67
- | `verify/` | Phase 3: HOW | 测试运行结果(JSONL)+ 验收报告(Markdown) |
70
+ | `implementation/` | Phase 3: HOW | 代码实现清单(Markdown),标记代码实现阶段完成 |
71
+ | `verify/` | Phase 3: HOW | 测试验收、部署执行、冒烟测试结果(JSONL + 报告) |
68
72
 
69
73
  ### logos/changes/
70
74
 
@@ -104,6 +108,21 @@ OpenLogos 方法论的统一入口。包含配置文件、研发资源文档和
104
108
  - 使用 Markdown 格式,包含单元测试和场景测试的用例设计
105
109
  - 每个文件对应一个场景编号,覆盖该场景的所有测试层级
106
110
 
111
+ ### 部署方案文件
112
+
113
+ - 部署方案默认文件名:`core-01-deployment-plan.md`
114
+ - 命名格式:`<module>-{序号}-deployment-plan.md`
115
+ - 存放位置:`logos/resources/prd/3-technical-plan/3-deployment/`
116
+ - 内容至少包含:目标环境、部署拓扑、环境变量、构建命令、发布命令、数据迁移、回滚策略、部署后检查、冒烟测试方案
117
+
118
+ ### 冒烟测试用例文件
119
+
120
+ - 冒烟测试用例默认文件名:`core-smoke-test-cases.md`
121
+ - 命名格式:`<module>-smoke-test-cases.md`
122
+ - 存放位置:`logos/resources/test/smoke/`
123
+ - 用例 ID 建议使用 `SMOKE-{module}-{序号}`,例如 `SMOKE-core-01`
124
+ - 冒烟测试只验证部署后的环境可用性,不替代 `UT-*` / `ST-*` 用例
125
+
107
126
  ### 场景文件
108
127
 
109
128
  - 按场景分文件:`user-auth.json`、`payment-flow.json`
@@ -113,6 +132,9 @@ OpenLogos 方法论的统一入口。包含配置文件、研发资源文档和
113
132
 
114
133
  - 测试结果:`test-results.jsonl`(JSONL 格式,每行一个用例结果)
115
134
  - 验收报告:`acceptance-report.md`(由 `openlogos verify` 自动生成)
135
+ - 部署报告:`deployment-report.md`(部署执行完成后生成)
136
+ - 冒烟结果:`smoke-results.jsonl`(JSONL 格式,每行一个冒烟用例结果)
137
+ - 冒烟报告:`smoke-report.md`(由 `openlogos smoke` 自动生成)
116
138
  - 详细格式定义见 [test-results.md](./test-results.md)
117
139
 
118
140
  ## 可选目录
@@ -18,6 +18,7 @@
18
18
  | `tech_stack` | object | 是 | 技术栈描述 |
19
19
  | `scenario_counter` | object | 否 | 全局场景编号计数器(多模块项目必填) |
20
20
  | `modules` | array | 否 | 模块注册表(多模块项目必填) |
21
+ | `deployment_gates` | object | 否 | Initial 阶段 launch 前的部署与 smoke 门禁声明 |
21
22
  | `scenarios` | array | 否 | 场景清单(单一真相来源,Phase 3-1 前写入) |
22
23
  | `resource_index` | array | 是 | 资源索引列表 |
23
24
  | `conventions` | array | 否 | 项目约定 |
@@ -41,6 +42,8 @@
41
42
  | `hosting` | 部署平台 | "Cloudflare Pages" |
42
43
  | `database` | 数据库 | "Supabase (PostgreSQL)" |
43
44
  | `auth` | 认证方案 | "Supabase Auth" |
45
+ | `deployment` | 部署形态或发布方式 | "Docker Compose on VPS" |
46
+ | `smoke` | 冒烟测试命令或策略 | "npm run smoke" |
44
47
 
45
48
  ### external_dependencies
46
49
 
@@ -84,6 +87,7 @@
84
87
  | `name` | string | 是 | 模块名称(中文或英文均可) |
85
88
  | `lifecycle` | string | 是 | 模块生命周期:`initial`(初始开发阶段,关注 phase 推进)或 `launched`(迭代开发阶段,关注变更提案) |
86
89
  | `skip_phases` | array | 否 | 声明本模块不需要的阶段,phase 检测时跳过对应目录。由 `architecture-designer` Skill 在技术选型后填写。 |
90
+ | `deployment_required` | boolean | 否 | 是否需要部署执行门禁。软件项目默认 true;纯文档、纯库或明确无需部署的模块可设为 false。 |
87
91
 
88
92
  `skip_phases` 允许值:
89
93
 
@@ -92,6 +96,9 @@
92
96
  | `api` | `logos/resources/api/` | 无 HTTP API 的项目(桌面应用、CLI 工具、前端库) |
93
97
  | `database` | `logos/resources/database/` | 无数据库的项目(纯计算工具、无状态 CLI) |
94
98
  | `scenario` | `logos/resources/scenario/` | 无 API 编排测试的项目(通常与 `api` 同时跳过) |
99
+ | `deployment` | 部署执行与 smoke 门禁 | 纯文档、无需发布运行环境的模块 |
100
+
101
+ > `deployment` skip 只跳过部署执行与 smoke 门禁,不跳过部署方案设计。Initial 软件项目仍应说明为什么不需要部署。
95
102
 
96
103
  示例:
97
104
 
@@ -111,6 +118,27 @@ modules:
111
118
  skip_phases: [api, database, scenario] # 纯 CLI 工具:无数据库,无 HTTP API
112
119
  ```
113
120
 
121
+ ### deployment_gates
122
+
123
+ `deployment_gates` 用于声明 Initial 阶段 launch 前的部署门禁要求。字段可由 `deployment-designer` Skill 写入,供 `status` / `launch` 判断。
124
+
125
+ ```yaml
126
+ deployment_gates:
127
+ core:
128
+ deployment_required: true
129
+ smoke_required: true
130
+ environments:
131
+ - staging
132
+ ```
133
+
134
+ | 字段 | 类型 | 必填 | 说明 |
135
+ |------|------|------|------|
136
+ | `deployment_required` | boolean | 是 | 是否需要部署执行 |
137
+ | `smoke_required` | boolean | 是 | 是否需要部署后冒烟测试 |
138
+ | `environments` | array | 否 | 需要覆盖的部署环境 |
139
+
140
+ 若未声明 `deployment_gates`,软件模块默认需要部署方案;部署执行和 smoke 门禁由模块的 `deployment_required` 与部署方案内容共同决定。
141
+
114
142
  ### resource_index
115
143
 
116
144
  数组,每个元素描述一个关键资源文件:
@@ -140,7 +168,9 @@ modules:
140
168
  |------|-------------|------|
141
169
  | Phase 3-1 场景建模 | `logos/resources/prd/3-technical-plan/2-scenario-implementation/<module>-SXX-*.md` | `core-S01-user-register.md` |
142
170
  | Phase 3-2 API 设计 | `logos/resources/api/SXX-*.yaml` 或 `SXX-*.yml` | `S01-user-register.yaml` |
143
- | Phase 3-3a 测试用例 | `logos/resources/test/<module>-SXX-*.md` | `core-S01-test-cases.md` |
171
+ | Phase 3-3 部署方案 | `logos/resources/prd/3-technical-plan/3-deployment/<module>-01-deployment-plan.md` | `core-01-deployment-plan.md` |
172
+ | Phase 3-4a 测试用例 | `logos/resources/test/<module>-SXX-*.md` | `core-S01-test-cases.md` |
173
+ | Phase 3-4a 冒烟测试 | `logos/resources/test/smoke/<module>-smoke-test-cases.md` | `core-smoke-test-cases.md` |
144
174
 
145
175
  **完成判断规则**:只有 `scenarios` 中每个 `id` 在对应阶段都存在匹配文件,该阶段才视为完成。若 `scenarios` 字段缺失,则降级为旧的"目录有文件即完成"逻辑(向后兼容)。
146
176
 
@@ -163,6 +193,8 @@ tech_stack:
163
193
  database: "Supabase (PostgreSQL)"
164
194
  auth: "Supabase Auth"
165
195
  payment: "Paddle"
196
+ deployment: "Vercel + Supabase"
197
+ smoke: "npm run smoke"
166
198
 
167
199
  scenario_counter:
168
200
  next_id: 6
@@ -175,6 +207,13 @@ modules:
175
207
  name: 支付模块
176
208
  lifecycle: initial
177
209
 
210
+ deployment_gates:
211
+ core:
212
+ deployment_required: true
213
+ smoke_required: true
214
+ environments:
215
+ - staging
216
+
178
217
  external_dependencies:
179
218
  - name: "邮件服务"
180
219
  provider: "SendGrid"
@@ -203,6 +242,10 @@ resource_index:
203
242
  desc: 数据库完整 Schema。涉及表结构、字段设计、RLS 策略时必读。
204
243
  - path: logos/resources/scenario/user-auth.json
205
244
  desc: 用户认证场景的 API 编排。涉及认证流程验收时必读。
245
+ - path: logos/resources/prd/3-technical-plan/3-deployment/core-01-deployment-plan.md
246
+ desc: 核心模块部署方案。涉及部署拓扑、发布命令、回滚策略和 smoke 验证时必读。
247
+ - path: logos/resources/test/smoke/core-smoke-test-cases.md
248
+ desc: 核心模块部署后冒烟测试用例。涉及 openlogos smoke 或 launch 前门禁时必读。
206
249
 
207
250
  conventions:
208
251
  - "所有 API 路径以 /api/ 开头"
@@ -53,9 +53,33 @@
53
53
  "default": "logos/resources/verify/test-results.jsonl",
54
54
  "description": "测试结果 JSONL 文件路径(相对项目根目录)"
55
55
  },
56
- "test_command": {
56
+ "pre_run_command": {
57
57
  "type": "string",
58
58
  "description": "测试命令(可选)。配置后 openlogos verify 会先执行此命令再读取结果"
59
+ },
60
+ "test_command": {
61
+ "type": "string",
62
+ "description": "旧字段,保留兼容。建议使用 pre_run_command"
63
+ }
64
+ }
65
+ },
66
+ "smoke": {
67
+ "type": "object",
68
+ "description": "部署后冒烟测试配置(可选)。配置 openlogos smoke 的行为。",
69
+ "properties": {
70
+ "command": {
71
+ "type": "string",
72
+ "description": "冒烟测试命令。openlogos smoke 会先执行此命令再读取结果"
73
+ },
74
+ "result_path": {
75
+ "type": "string",
76
+ "default": "logos/resources/verify/smoke-results.jsonl",
77
+ "description": "冒烟测试结果 JSONL 文件路径(相对项目根目录)"
78
+ },
79
+ "report_path": {
80
+ "type": "string",
81
+ "default": "logos/resources/verify/smoke-report.md",
82
+ "description": "冒烟测试报告输出路径(相对项目根目录)"
59
83
  }
60
84
  }
61
85
  },
@@ -158,7 +182,13 @@
158
182
  }
159
183
  },
160
184
  "verify": {
161
- "result_path": "logos/resources/verify/test-results.jsonl"
185
+ "result_path": "logos/resources/verify/test-results.jsonl",
186
+ "pre_run_command": "npm test"
187
+ },
188
+ "smoke": {
189
+ "command": "npm run smoke",
190
+ "result_path": "logos/resources/verify/smoke-results.jsonl",
191
+ "report_path": "logos/resources/verify/smoke-report.md"
162
192
  }
163
193
  }
164
194
  ]
@@ -18,8 +18,14 @@ tasks.md 使用带标记的 section 组织任务,每个 section 对应提案
18
18
  ## [code] 代码实现
19
19
  - [ ] 实现 src/xxx 中的业务逻辑
20
20
  - [ ] 编写对应测试
21
+
22
+ ## [deploy] 部署任务
23
+ - [ ] 按部署方案部署到 staging
24
+ - [ ] 确认迁移、配置、服务启动和回滚预案
21
25
  ```
22
26
 
27
+ `[deploy]` section 只能在 `openlogos verify` 通过后执行,且必须由人类明确确认后发起。AI 不得因为 `[deploy]` 任务存在而自动执行部署。
28
+
23
29
  ### Section 标记
24
30
 
25
31
  Section 标题格式为 `## [<tag>] <描述>`,其中 `<tag>` 为小写英文标识符:
@@ -28,27 +34,66 @@ Section 标题格式为 `## [<tag>] <描述>`,其中 `<tag>` 为小写英文
28
34
  |------|------|------|
29
35
  | `[delta]` | delta-writing | delta 文档产出任务。该 section 全部勾选 → 可进入 ready-to-merge |
30
36
  | `[code]` | coding | 代码实现任务。该 section 全部勾选 → coding 阶段完成 |
37
+ | `[deploy]` | deployment | 部署执行任务。只在 verify PASS 后展示,必须人类确认后执行 |
31
38
 
32
39
  ### 规则
33
40
 
34
- 1. **`[delta]` section 只列 delta 任务**:每条任务必须对应一个 delta 文件的产出,不得混入代码任务
35
- 2. **`[code]` section 只列代码任务**:直接修改 `src/`、`test/` 等源文件的任务,不得混入 delta 任务
36
- 3. **两个 section 均为可选**:
41
+ 1. **`[delta]` section 只列 delta 任务**:每条任务必须对应一个 delta 文件的产出,不得混入代码或部署任务
42
+ 2. **`[code]` section 只列代码任务**:直接修改 `src/`、`test/` 等源文件的任务,不得混入 delta 或部署任务
43
+ 3. **`[deploy]` section 只列部署任务**:部署、迁移、发布、重启、配置检查、回滚准备等任务写入此 section,不得混入代码实现任务
44
+ 4. **三个 section 均为可选**:
37
45
  - 纯代码提案(无规格变更):只有 `[code]` section,无 `[delta]` section
38
46
  - 纯规格提案(无代码实现):只有 `[delta]` section,无 `[code]` section
39
- 4. **Section 内可有子标题**:用于分组,不影响 CLI 解析(CLI 只识别 `## [tag]` 级别的 section 边界)
40
- 5. **Section 顺序**:建议 `[delta]` 在前,`[code]` 在后,与流程顺序一致
47
+ - 不需要部署的提案:不得创建 `[deploy]` section
48
+ 5. **部署决策一致性**:`proposal.md` 声明无需部署时不得存在 `[deploy]` section;声明需要部署时必须存在 `[deploy]` section
49
+ 6. **Section 内可有子标题**:用于分组,不影响 CLI 解析(CLI 只识别 `## [tag]` 级别的 section 边界)
50
+ 7. **Section 顺序**:建议 `[delta]` 在前,`[code]` 居中,`[deploy]` 最后,与流程顺序一致
41
51
 
42
52
  ## 状态判断规则
43
53
 
44
54
  CLI 的 `detectProposalStep()` 按以下规则判断各阶段是否完成:
45
55
 
46
- | tasks.md 格式 | `[delta]` section 状态 | 判断结果 |
47
- |---|---|---|
48
- | `[delta]` section | 全部勾选 | → `ready-to-merge` |
49
- | 有 `[delta]` section | 未全部勾选 | → `delta-writing` |
50
- | `[delta]` section(纯代码提案) | | → `ready-to-merge`(直接跳过) |
51
- | 旧格式(无任何 section 标记) | | → 降级为全局 `allTasksChecked` 判断(向后兼容) |
56
+ | tasks.md / 标记状态 | 判断结果 |
57
+ |---|---|
58
+ | 提案模板未填写完整 | → `writing` |
59
+ | 有 `[delta]` section 且未全部勾选 | → `delta-writing` |
60
+ | `[delta]` section 且全部勾选,且未生成 MERGE_PROMPT | → `ready-to-merge` |
61
+ | 已生成 `MERGE_PROMPT.md` / `MERGE_PROMPT_GENERATED`,但未写入 `SPEC_MERGED` | → `merge-generated` |
62
+ | `SPEC_MERGED` 存在,且 `[code]` section 未全部勾选 | → `coding` |
63
+ | `SPEC_MERGED` 存在,且无 `[code]` section 或 `[code]` 全部勾选 | → `ready-to-verify` |
64
+ | `VERIFY_FAIL` 存在 | → `verify-failed` |
65
+ | `VERIFY_PASS` 存在,提案级无需部署,且无 `[deploy]` section | → `verify-passed` |
66
+ | `VERIFY_PASS` 存在,提案级需要部署,且 `[deploy]` section 存在但 `DEPLOY_DONE` 不存在或 `[deploy]` 未全勾 | → `ready-to-deploy` |
67
+ | `DEPLOY_DONE` 存在、`[deploy]` 全部勾选,且提案级无需 smoke | → `deploy-done` |
68
+ | `DEPLOY_DONE` 存在、`[deploy]` 全部勾选,且提案级需要 smoke,但 `SMOKE_PASS` / `SMOKE_FAIL` 均不存在 | → `ready-to-smoke` |
69
+ | `SMOKE_FAIL` 存在 | → `smoke-failed` |
70
+ | `SMOKE_PASS` 存在 | → `smoke-passed` |
71
+
72
+ 优先级规则:
73
+
74
+ 1. `VERIFY_FAIL` 高于 `VERIFY_PASS`、`DEPLOY_DONE` 和 `SMOKE_PASS`
75
+ 2. `SMOKE_FAIL` 高于 `SMOKE_PASS`
76
+ 3. 活跃提案的 `proposal.md` 部署决策高于模块级 `deployment_required` / `smoke_required`
77
+ 4. 重新运行 `openlogos verify` 且失败时,必须清理过期的 `VERIFY_PASS`、`DEPLOY_DONE`、`SMOKE_PASS`、`SMOKE_FAIL`
78
+ 5. 重新部署时,必须清理过期的 `SMOKE_PASS` / `SMOKE_FAIL`
79
+
80
+ ## 部署与冒烟测试设计要求
81
+
82
+ 当提案 `proposal.md` 的部署影响为“需要部署”时:
83
+
84
+ - `change-writer` 必须创建 `[deploy]` section
85
+ - delta-writing 阶段必须产出部署方案 delta,通常位于 `deltas/prd/3-technical-plan/3-deployment/`
86
+ - 测试设计阶段必须一并设计部署冒烟测试,建议写入 `logos/resources/test/smoke/<module>-smoke-test-cases.md`
87
+ - 部署完成后仅在提案级 `是否需要 smoke:是` 时运行 `openlogos smoke`
88
+ - smoke 通过后才能 archive;无需 smoke 的提案在部署完成后可 archive
89
+
90
+ 当提案 `proposal.md` 的部署影响为“不需要部署”时:
91
+
92
+ - 不得创建 `[deploy]` section
93
+ - 不产出部署方案 delta,除非本次变更正在修改部署规则本身
94
+ - verify PASS 后直接进入 `verify-passed`,下一步为 `openlogos archive <slug>`
95
+
96
+ 冒烟测试不写入 `[deploy]` section 作为可勾选任务。`[deploy]` 只表示部署执行完成;冒烟测试由 `openlogos smoke` 命令独立管理。
52
97
 
53
98
  ## 向后兼容
54
99
 
@@ -125,7 +125,7 @@ reporter 在写入前应确保 `logos/resources/verify/` 目录存在(`mkdir -
125
125
 
126
126
  ### 分批闭环执行约定(大任务)
127
127
 
128
- 当 Phase 3 Step 4 采用“分批生成”时,reporter 仍按一次完整测试运行的口径输出结果,并遵循以下约束:
128
+ 当 Phase 3 Step 5 采用“分批生成”时,reporter 仍按一次完整测试运行的口径输出结果,并遵循以下约束:
129
129
 
130
130
  1. **用例 ID 对齐**:每一批开始前先声明本批覆盖的 `UT-xx` / `ST-xx`,测试代码中写入的 `id` 必须与 `logos/resources/test/*.md` 完全一致
131
131
  2. **清空策略一致**:无论是否分批,执行“本批完整测试”前都必须先清空结果文件,避免混入旧批次数据
@@ -134,7 +134,7 @@ reporter 在写入前应确保 `logos/resources/verify/` 目录存在(`mkdir -
134
134
 
135
135
  ## AI 生成 reporter 代码模板
136
136
 
137
- 以下是各语言的 reporter 参考实现。AI 在 Phase 3 Step 4(代码生成,由 `code-implementor` Skill 驱动)时,应根据项目的 `tech_stack` 选择对应语言的模板,嵌入到测试代码中。
137
+ 以下是各语言的 reporter 参考实现。AI 在 Phase 3 Step 5(代码生成,由 `code-implementor` Skill 驱动)时,应根据项目的 `tech_stack` 选择对应语言的模板,嵌入到测试代码中。
138
138
 
139
139
  ### 推荐:共享 reporter 文件模式
140
140