@miniidealab/openlogos 0.7.3 → 0.8.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 (68) hide show
  1. package/codex-plugin-template/plugin.json +10 -0
  2. package/codex-plugin-template/session-start.sh +125 -0
  3. package/dist/commands/change.d.ts +1 -1
  4. package/dist/commands/change.d.ts.map +1 -1
  5. package/dist/commands/change.js +75 -6
  6. package/dist/commands/change.js.map +1 -1
  7. package/dist/commands/detect.d.ts.map +1 -1
  8. package/dist/commands/detect.js +15 -1
  9. package/dist/commands/detect.js.map +1 -1
  10. package/dist/commands/init.d.ts +13 -4
  11. package/dist/commands/init.d.ts.map +1 -1
  12. package/dist/commands/init.js +181 -44
  13. package/dist/commands/init.js.map +1 -1
  14. package/dist/commands/launch.d.ts +1 -1
  15. package/dist/commands/launch.d.ts.map +1 -1
  16. package/dist/commands/launch.js +71 -16
  17. package/dist/commands/launch.js.map +1 -1
  18. package/dist/commands/module.d.ts +5 -0
  19. package/dist/commands/module.d.ts.map +1 -0
  20. package/dist/commands/module.js +231 -0
  21. package/dist/commands/module.js.map +1 -0
  22. package/dist/commands/next.d.ts +22 -0
  23. package/dist/commands/next.d.ts.map +1 -0
  24. package/dist/commands/next.js +195 -0
  25. package/dist/commands/next.js.map +1 -0
  26. package/dist/commands/status.d.ts +43 -2
  27. package/dist/commands/status.d.ts.map +1 -1
  28. package/dist/commands/status.js +351 -62
  29. package/dist/commands/status.js.map +1 -1
  30. package/dist/commands/sync.d.ts.map +1 -1
  31. package/dist/commands/sync.js +38 -5
  32. package/dist/commands/sync.js.map +1 -1
  33. package/dist/commands/verify.js +2 -2
  34. package/dist/commands/verify.js.map +1 -1
  35. package/dist/i18n.d.ts +1 -1
  36. package/dist/i18n.d.ts.map +1 -1
  37. package/dist/i18n.js +95 -15
  38. package/dist/i18n.js.map +1 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +48 -8
  41. package/dist/index.js.map +1 -1
  42. package/dist/lib/migrate-lifecycle.d.ts +13 -0
  43. package/dist/lib/migrate-lifecycle.d.ts.map +1 -0
  44. package/dist/lib/migrate-lifecycle.js +55 -0
  45. package/dist/lib/migrate-lifecycle.js.map +1 -0
  46. package/dist/lib/sync-resource-index.js +5 -5
  47. package/dist/lib/sync-resource-index.js.map +1 -1
  48. package/opencode-plugin-template/commands/openlogos-launch.md +8 -3
  49. package/opencode-plugin-template/openlogos.js +10 -1
  50. package/package.json +8 -4
  51. package/skills/architecture-designer/SKILL.en.md +1 -1
  52. package/skills/architecture-designer/SKILL.md +1 -1
  53. package/skills/prd-writer/SKILL.en.md +1 -1
  54. package/skills/prd-writer/SKILL.md +1 -1
  55. package/skills/product-designer/SKILL.en.md +1 -1
  56. package/skills/product-designer/SKILL.md +1 -1
  57. package/skills/scenario-architect/SKILL.en.md +2 -2
  58. package/skills/scenario-architect/SKILL.md +5 -5
  59. package/skills/test-writer/SKILL.en.md +1 -1
  60. package/skills/test-writer/SKILL.md +2 -2
  61. package/spec/change-management.md +5 -0
  62. package/spec/cli-json-output.md +63 -6
  63. package/spec/codex-plugin.md +138 -0
  64. package/spec/directory-convention.md +4 -2
  65. package/spec/logos-project.md +38 -5
  66. package/spec/module-naming-convention.md +72 -0
  67. package/spec/opencode-plugin.md +3 -3
  68. package/spec/workflow.md +1 -1
@@ -0,0 +1,55 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
4
+ /**
5
+ * Detects old config.lifecycle === 'active' with no launched modules.
6
+ * Single-module: auto-marks it as launched and returns autoMarked.
7
+ * Multi-module: emits a warning and returns warned=true.
8
+ * Called by both sync and launch before deriving isLaunched.
9
+ */
10
+ export function migrateProjectLifecycle(root) {
11
+ const configPath = join(root, 'logos', 'logos.config.json');
12
+ if (!existsSync(configPath))
13
+ return { migrated: false };
14
+ let config;
15
+ try {
16
+ config = JSON.parse(readFileSync(configPath, 'utf-8'));
17
+ }
18
+ catch {
19
+ return { migrated: false };
20
+ }
21
+ if (config['lifecycle'] !== 'active')
22
+ return { migrated: false };
23
+ const yamlPath = join(root, 'logos', 'logos-project.yaml');
24
+ if (!existsSync(yamlPath))
25
+ return { migrated: false };
26
+ let yaml;
27
+ try {
28
+ yaml = parseYaml(readFileSync(yamlPath, 'utf-8')) ?? {};
29
+ }
30
+ catch {
31
+ return { migrated: false };
32
+ }
33
+ const modules = Array.isArray(yaml['modules'])
34
+ ? yaml['modules']
35
+ : [];
36
+ const hasLaunched = modules.some(m => m.lifecycle === 'launched');
37
+ if (hasLaunched)
38
+ return { migrated: false };
39
+ if (modules.length === 1) {
40
+ modules[0].lifecycle = 'launched';
41
+ writeFileSync(yamlPath, stringifyYaml(yaml, { lineWidth: 0 }));
42
+ // Remove stale project-level lifecycle field
43
+ delete config['lifecycle'];
44
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
45
+ return { migrated: true, autoMarked: modules[0].id };
46
+ }
47
+ if (modules.length > 1) {
48
+ // Remove stale project-level lifecycle field even in multi-module case
49
+ delete config['lifecycle'];
50
+ writeFileSync(configPath, JSON.stringify(config, null, 2));
51
+ return { migrated: true, warned: true };
52
+ }
53
+ return { migrated: false };
54
+ }
55
+ //# sourceMappingURL=migrate-lifecycle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-lifecycle.js","sourceRoot":"","sources":["../../src/lib/migrate-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,SAAS,IAAI,aAAa,EAAE,MAAM,MAAM,CAAC;AAQtE;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAC5D,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAExD,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,QAAQ;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAEjE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC3D,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAEtD,IAAI,IAA6B,CAAC;IAClC,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC,CAAE,IAAI,CAAC,SAAS,CAA+C;QAChE,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,UAAU,CAAC,CAAC;IAClE,IAAI,WAAW;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAE5C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC;QAClC,aAAa,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/D,6CAA6C;QAC7C,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3B,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACvD,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,uEAAuE;QACvE,OAAO,MAAM,CAAC,WAAW,CAAC,CAAC;QAC3B,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC"}
@@ -50,19 +50,19 @@ function scanCandidateFiles(root) {
50
50
  const RULES = [
51
51
  // 1. 场景总览(放在场景文件之前,更具体)
52
52
  {
53
- pattern: /logos\/resources\/prd\/3-technical-plan\/2-scenario-implementation\/00-scenario-overview\.md$/,
53
+ pattern: /logos\/resources\/prd\/3-technical-plan\/2-scenario-implementation\/(?:[a-z][a-z0-9-]*-)?00-scenario-overview\.md$/,
54
54
  zh: () => '场景实现概览索引。涉及全量场景分类、参与方、实现文档映射关系时必读。',
55
55
  en: () => 'Scenario overview index. Required when referencing scenario classification, participants, or document mapping.',
56
56
  },
57
- // 2. 场景时序图:S01-cli-init.md → S01 场景时序图
57
+ // 2. 场景时序图:core-S01-cli-init.md → S01 场景时序图
58
58
  {
59
- pattern: /logos\/resources\/prd\/3-technical-plan\/2-scenario-implementation\/(S\d+)-(.+)\.md$/,
59
+ pattern: /logos\/resources\/prd\/3-technical-plan\/2-scenario-implementation\/(?:[a-z][a-z0-9-]*-)?(S\d+)-(.+)\.md$/,
60
60
  zh: (m) => `${m[1]} 场景时序图。涉及 ${m[1]} 实现细节、API 设计、异常分支时必读。`,
61
61
  en: (m) => `${m[1]} sequence diagram. Required when working on ${m[1]} implementation, API design, or exception branches.`,
62
62
  },
63
- // 3. 测试用例:S01-test-cases.md → S01 测试用例
63
+ // 3. 测试用例:core-S01-test-cases.md → S01 测试用例
64
64
  {
65
- pattern: /logos\/resources\/test\/(S\d+)-test-cases\.md$/,
65
+ pattern: /logos\/resources\/test\/(?:[a-z][a-z0-9-]*-)?(S\d+)-test-cases\.md$/,
66
66
  zh: (m) => `${m[1]} 测试用例。涉及 ${m[1]} 单元测试与场景测试的实现与验收时必读。`,
67
67
  en: (m) => `${m[1]} test cases. Required when implementing or verifying ${m[1]} unit and scenario tests.`,
68
68
  },
@@ -1 +1 @@
1
- {"version":3,"file":"sync-resource-index.js","sourceRoot":"","sources":["../../src/lib/sync-resource-index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync-resource-index.js","sourceRoot":"","sources":["../../src/lib/sync-resource-index.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,14 @@
1
1
  ---
2
- description: "OpenLogos — activate change management after first cycle / 首轮完成后激活变更管理"
2
+ description: "OpenLogos — launch a module into change-management mode / 将模块切换到变更管理阶段"
3
3
  ---
4
4
 
5
5
  在项目根执行:
6
6
 
7
- !`openlogos launch`
7
+ !`openlogos launch $ARGUMENTS`
8
8
 
9
- 向用户解释 lifecycle 已切换为 active 及后续需使用 `change` / `merge` / `archive` 工作流。
9
+ (若项目只有一个模块,可不传参数,CLI 自动识别;多模块时需传 module-id,例如 `/openlogos-launch core`。)
10
+
11
+ 向用户解释:
12
+ - 指定模块的 `lifecycle` 已切换为 `launched`
13
+ - 后续对该模块的修改必须先通过 `openlogos change <slug>` 创建变更提案
14
+ - 使用 `change` / `merge` / `archive` 工作流推进迭代
@@ -12,7 +12,7 @@ const COMMANDS = {
12
12
  next: { cli: ["status"], args: "none" },
13
13
  sync: { cli: ["sync"], args: "none" },
14
14
  verify: { cli: ["verify"], args: "none" },
15
- launch: { cli: ["launch"], args: "none" },
15
+ launch: { cli: ["launch"], args: "optionalModuleId" },
16
16
  init: { cli: ["init"], args: "optionalName" },
17
17
  change: { cli: ["change"], args: "requiredSlug" },
18
18
  merge: { cli: ["merge"], args: "requiredSlug" },
@@ -34,6 +34,15 @@ function parse(raw) {
34
34
  if (spec.args === "none" && rest.length > 0) {
35
35
  return { matched: true, ok: false, code: "E_ARG_INVALID", message: `${name} 不接受参数` };
36
36
  }
37
+ if (spec.args === "optionalModuleId") {
38
+ if (rest.length > 1) {
39
+ return { matched: true, ok: false, code: "E_ARG_INVALID", message: `${name} 只接受 0 或 1 个参数(module-id)` };
40
+ }
41
+ if (rest.length === 1 && !SLUG_RE.test(rest[0])) {
42
+ return { matched: true, ok: false, code: "E_ARG_INVALID", message: `${name} 的 module-id 必须为合法 slug(小写字母/数字/连字符)` };
43
+ }
44
+ return { matched: true, ok: true, name, cliArgs: [...spec.cli, ...rest] };
45
+ }
37
46
  if (spec.args === "optionalName" && rest.length > 1) {
38
47
  return { matched: true, ok: false, code: "E_ARG_INVALID", message: "init 最多接受 1 个参数" };
39
48
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miniidealab/openlogos",
3
- "version": "0.7.3",
3
+ "version": "0.8.1",
4
4
  "description": "CLI tool for the OpenLogos software engineering methodology",
5
5
  "type": "module",
6
6
  "bin": {
@@ -8,8 +8,8 @@
8
8
  },
9
9
  "scripts": {
10
10
  "build": "npx tsc",
11
- "prepack": "npm run build && node -e \"require('fs').cpSync('../skills','./skills',{recursive:true});require('fs').cpSync('../spec','./spec',{recursive:true});require('fs').cpSync('../plugin-opencode/template','./opencode-plugin-template',{recursive:true})\"",
12
- "postpack": "node -e \"require('fs').rmSync('./skills',{recursive:true,force:true});require('fs').rmSync('./spec',{recursive:true,force:true});require('fs').rmSync('./opencode-plugin-template',{recursive:true,force:true})\"",
11
+ "prepack": "npm run build && node -e \"require('fs').cpSync('../skills','./skills',{recursive:true});require('fs').cpSync('../spec','./spec',{recursive:true});require('fs').cpSync('../plugin-opencode/template','./opencode-plugin-template',{recursive:true});require('fs').cpSync('../plugin-codex','./codex-plugin-template',{recursive:true})\"",
12
+ "postpack": "node -e \"require('fs').rmSync('./skills',{recursive:true,force:true});require('fs').rmSync('./spec',{recursive:true,force:true});require('fs').rmSync('./opencode-plugin-template',{recursive:true,force:true});require('fs').rmSync('./codex-plugin-template',{recursive:true,force:true})\"",
13
13
  "dev": "tsc --watch",
14
14
  "start": "node dist/index.js",
15
15
  "lint": "eslint src/",
@@ -45,7 +45,8 @@
45
45
  "dist",
46
46
  "skills",
47
47
  "spec",
48
- "opencode-plugin-template"
48
+ "opencode-plugin-template",
49
+ "codex-plugin-template"
49
50
  ],
50
51
  "devDependencies": {
51
52
  "@eslint/js": "^9.39.4",
@@ -54,5 +55,8 @@
54
55
  "typescript": "^6.0.2",
55
56
  "typescript-eslint": "^8.58.0",
56
57
  "vitest": "^3.2.4"
58
+ },
59
+ "dependencies": {
60
+ "yaml": "^2.8.3"
57
61
  }
58
62
  }
@@ -156,7 +156,7 @@ external_dependencies:
156
156
 
157
157
  ## Output Specification
158
158
 
159
- - Architecture overview document: `logos/resources/prd/3-technical-plan/1-architecture/01-architecture-overview.md`
159
+ - Architecture overview document: `logos/resources/prd/3-technical-plan/1-architecture/core-01-architecture-overview.md` (globally unique; always update this file in place, never create a new one)
160
160
  - Architecture diagrams use Mermaid format
161
161
  - Technology selections use table format, each item must include rationale
162
162
  - Update the `tech_stack` and `external_dependencies` fields in `logos-project.yaml`
@@ -156,7 +156,7 @@ external_dependencies:
156
156
 
157
157
  ## 输出规范
158
158
 
159
- - 架构概要文档:`logos/resources/prd/3-technical-plan/1-architecture/01-architecture-overview.md`
159
+ - 架构概要文档:`logos/resources/prd/3-technical-plan/1-architecture/core-01-architecture-overview.md`(架构文件全局唯一,后续修改始终在此文件上更新,不新建文件)
160
160
  - 架构图使用 Mermaid 格式
161
161
  - 技术选型使用表格格式,每项必须有理由
162
162
  - 更新 `logos-project.yaml` 的 `tech_stack` 和 `external_dependencies` 字段
@@ -172,7 +172,7 @@ Because [reason] → leads to [pain point] → results in [consequence]
172
172
 
173
173
  - File format: Markdown
174
174
  - Storage location: `logos/resources/prd/1-product-requirements/`
175
- - File naming: `{sequence}-{english-name}.md`, e.g., `01-requirements.md`
175
+ - File naming: `<module>-{sequence}-{english-name}.md`, e.g., `core-01-requirements.md` (read current module from `modules[]` in `logos-project.yaml`, default is `core`)
176
176
  - Every scenario must be traceable to at least one user pain point
177
177
  - P0/P1 scenarios must have GIVEN/WHEN/THEN (≥1 normal + ≥1 exception)
178
178
  - Scenario numbers are globally unique and will carry through Phase 2 and Phase 3
@@ -172,7 +172,7 @@
172
172
 
173
173
  - 文件格式:Markdown
174
174
  - 存放位置:`logos/resources/prd/1-product-requirements/`
175
- - 文件命名:`{序号}-{英文名}.md`,如 `01-requirements.md`
175
+ - 文件命名:`<module>-{序号}-{英文名}.md`,如 `core-01-requirements.md`(从 `logos-project.yaml` 的 `modules[]` 读取当前模块,默认为 `core`)
176
176
  - 每个场景必须可追溯到至少一个用户痛点
177
177
  - P0/P1 场景必须有 GIVEN/WHEN/THEN(≥1 正常 + ≥1 异常)
178
178
  - 场景编号全局唯一,将贯穿 Phase 2 和 Phase 3
@@ -202,7 +202,7 @@ This directory has already been initialized as an OpenLogos project.
202
202
 
203
203
  - Feature specs: `logos/resources/prd/2-product-design/1-feature-specs/`
204
204
  - Prototypes: `logos/resources/prd/2-product-design/2-page-design/`
205
- - Design documents and prototypes appear in pairs: `{number}-{name}-design.md` + `{number}-{name}-prototype.{ext}`
205
+ - Design documents and prototypes appear in pairs: `<module>-{number}-{name}-design.md` + `<module>-{number}-{name}-prototype.{ext}` (read current module from `modules[]` in `logos-project.yaml`, default is `core`)
206
206
  - Web Application: `.html`
207
207
  - CLI Tool: `-terminal.md` (terminal interaction simulation)
208
208
  - AI Skills: `-dialogue.md` (dialogue flow script)
@@ -202,7 +202,7 @@ This directory has already been initialized as an OpenLogos project.
202
202
 
203
203
  - 功能规格:`logos/resources/prd/2-product-design/1-feature-specs/`
204
204
  - 原型:`logos/resources/prd/2-product-design/2-page-design/`
205
- - 设计文档与原型成对出现:`{序号}-{名称}-design.md` + `{序号}-{名称}-prototype.{ext}`
205
+ - 设计文档与原型成对出现:`<module>-{序号}-{名称}-design.md` + `<module>-{序号}-{名称}-prototype.{ext}`(从 `logos-project.yaml` 的 `modules[]` 读取当前模块,默认为 `core`)
206
206
  - Web 应用:`.html`
207
207
  - CLI 工具:`-terminal.md`(终端交互模拟)
208
208
  - AI Skills:`-dialogue.md`(对话流程脚本)
@@ -197,8 +197,8 @@ Summarize the technical implementation status of all scenarios:
197
197
 
198
198
  ## Output Specification
199
199
 
200
- - **Scenario overview**: `logos/resources/prd/3-technical-plan/2-scenario-implementation/00-scenario-overview.md`
201
- - **Scenario documents**: `logos/resources/prd/3-technical-plan/2-scenario-implementation/{scenario-number}-{scenario-name}.md`
200
+ - **Scenario overview**: `logos/resources/prd/3-technical-plan/2-scenario-implementation/core-00-scenario-overview.md`
201
+ - **Scenario documents**: `logos/resources/prd/3-technical-plan/2-scenario-implementation/<module>-{scenario-number}-{scenario-name}.md` (read current module from `modules[]` in `logos-project.yaml`, default is `core`; read `scenario_counter.next_id` before generating, increment and write back immediately after)
202
202
  - Sequence diagrams use Mermaid format (renderable directly in Markdown)
203
203
  - Exception cases use `EX-N.M` numbering, globally unique
204
204
  - Each scenario document contains: sequence diagram + step descriptions + exception cases
@@ -66,7 +66,7 @@
66
66
 
67
67
  只有用户明确确认清单无误后,才进入 Step 1 开始建模。
68
68
 
69
- 2. 确认清单后,告知用户当前已完成哪些场景(`SXX-*.md` 文件存在),还剩哪些场景待建模,然后按用户指示开始目标场景的建模。
69
+ 2. 确认清单后,告知用户当前已完成哪些场景(`<module>-SXX-*.md` 文件存在),还剩哪些场景待建模,然后按用户指示开始目标场景的建模。
70
70
 
71
71
  ---
72
72
 
@@ -241,8 +241,8 @@ sequenceDiagram
241
241
 
242
242
  ## 输出规范
243
243
 
244
- - **场景概览**:`logos/resources/prd/3-technical-plan/2-scenario-implementation/00-scenario-overview.md`
245
- - **场景文档**:`logos/resources/prd/3-technical-plan/2-scenario-implementation/{场景编号}-{场景名}.md`
244
+ - **场景概览**:`logos/resources/prd/3-technical-plan/2-scenario-implementation/core-00-scenario-overview.md`
245
+ - **场景文档**:`logos/resources/prd/3-technical-plan/2-scenario-implementation/<module>-{场景编号}-{场景名}.md`(从 `logos-project.yaml` 的 `modules[]` 读取当前模块,默认为 `core`;生成前必须读取 `scenario_counter.next_id` 取号,生成后立即将 `next_id` 加 1 写回)
246
246
  - 时序图使用 Mermaid 格式(可在 Markdown 中直接渲染)
247
247
  - 异常用例使用 `EX-N.M` 编号,全局唯一
248
248
  - 每个场景文档包含:时序图 + 步骤说明 + 异常用例
@@ -274,9 +274,9 @@ sequenceDiagram
274
274
  ```yaml
275
275
  resource_index:
276
276
  # ...已有条目...
277
- - path: logos/resources/prd/3-technical-plan/2-scenario-implementation/00-scenario-overview.md
277
+ - path: logos/resources/prd/3-technical-plan/2-scenario-implementation/core-00-scenario-overview.md
278
278
  desc: 场景实现概览索引。涉及全量场景分类、参与方、实现文档映射关系时必读。
279
- - path: logos/resources/prd/3-technical-plan/2-scenario-implementation/S01-<slug>.md
279
+ - path: logos/resources/prd/3-technical-plan/2-scenario-implementation/core-S01-<slug>.md
280
280
  desc: S01 <场景名称>场景时序图。涉及 S01 实现细节、API 设计、异常分支时必读。
281
281
  # 每个场景文件均需单独一条
282
282
  ```
@@ -167,7 +167,7 @@ Guide the user to the next step based on project type:
167
167
 
168
168
  - **File format**: Markdown
169
169
  - **Location**: `logos/resources/test/`
170
- - **Naming convention**: `{scenario-number}-test-cases.md` (e.g., `S01-test-cases.md`)
170
+ - **Naming convention**: `<module>-{scenario-number}-test-cases.md` (e.g., `core-S01-test-cases.md`; read current module from `modules[]` in `logos-project.yaml`, default is `core`)
171
171
  - Each file contains: Unit test cases (grouped by source) + Scenario test cases (happy path + exception paths)
172
172
  - Case IDs are globally unique: `UT-{scenario-number}-{sequence}` / `ST-{scenario-number}-{sequence}`
173
173
 
@@ -167,7 +167,7 @@
167
167
 
168
168
  - **文件格式**:Markdown
169
169
  - **存放位置**:`logos/resources/test/`
170
- - **命名规则**:`{场景编号}-test-cases.md`(如 `S01-test-cases.md`)
170
+ - **命名规则**:`<module>-{场景编号}-test-cases.md`(如 `core-S01-test-cases.md`;从 `logos-project.yaml` 的 `modules[]` 读取当前模块,默认为 `core`)
171
171
  - 每个文件包含:单元测试用例(按来源分组)+ 场景测试用例(主路径 + 异常路径)
172
172
  - 用例 ID 全局唯一:`UT-{场景编号}-{序号}` / `ST-{场景编号}-{序号}`
173
173
 
@@ -253,7 +253,7 @@
253
253
  ```yaml
254
254
  resource_index:
255
255
  # ...已有条目...
256
- - path: logos/resources/test/S01-test-cases.md
256
+ - path: logos/resources/test/core-S01-test-cases.md
257
257
  desc: S01 <场景名称>测试用例。涉及 UT-S01(单元测试)与 ST-S01(场景测试)的实现与验收时必读。
258
258
  # 每个场景的测试用例文件均需单独一条
259
259
  ```
@@ -10,6 +10,7 @@
10
10
  2. **影响分析先行**:在 `proposal.md` 中明确变更范围
11
11
  3. **按需传播**:不是每次都全链路更新,只更新受影响的环节
12
12
  4. **归档留痕**:变更完成后归档,保留完整历史
13
+ 5. **guard 互斥**:同一时间只允许一个活动提案;存在活动 guard 时,必须阻止新的 `openlogos change`
13
14
 
14
15
  ## 目录结构
15
16
 
@@ -32,6 +33,8 @@ project-root/
32
33
  └── add-remember-me/
33
34
  ```
34
35
 
36
+ > `logos/.openlogos-guard` 是活动提案锁文件。只要它指向 `logos/changes/` 下一个未归档提案,`openlogos change` 就必须拒绝创建新的提案,直到当前提案被 `openlogos archive` 归档后释放锁。
37
+
35
38
  ## 文件规范
36
39
 
37
40
  ### proposal.md
@@ -106,6 +109,7 @@ Delta 文件的目录结构映射主文档目录:
106
109
  1. 创建变更提案(CLI)
107
110
  └── openlogos change {slug}
108
111
  └── 生成 logos/changes/{slug}/proposal.md + tasks.md + deltas/
112
+ └── 写入 logos/.openlogos-guard,锁定当前活动提案
109
113
 
110
114
  2. AI 辅助填写提案(change-writer Skill)
111
115
  └── AI 分析影响范围,填写 proposal.md 和 tasks.md
@@ -126,6 +130,7 @@ Delta 文件的目录结构映射主文档目录:
126
130
  7. 归档变更(CLI)
127
131
  └── openlogos archive {slug}
128
132
  └── 将 logos/changes/{slug}/ 移入 logos/changes/archive/
133
+ └── 若当前 guard 指向该提案,则删除 logos/.openlogos-guard
129
134
  ```
130
135
 
131
136
  ## 变更传播规则
@@ -4,7 +4,7 @@
4
4
 
5
5
  ## 1. 概述
6
6
 
7
- OpenLogos CLI 的 `status`、`verify`、`detect` 三个命令支持 `--format json` 参数,输出结构化 JSON 供外部工具(如 RunLogos)以编程方式消费。
7
+ OpenLogos CLI 的 `status`、`next`、`verify`、`detect` 四个命令支持 `--format json` 参数,输出结构化 JSON 供外部工具(如 RunLogos)以编程方式消费。
8
8
 
9
9
  ### 1.1 通用约定
10
10
 
@@ -21,7 +21,7 @@ OpenLogos CLI 的 `status`、`verify`、`detect` 三个命令支持 `--format js
21
21
 
22
22
  ```jsonc
23
23
  {
24
- "command": "<command-name>", // "status" | "verify" | "detect"
24
+ "command": "<command-name>", // "status" | "next" | "verify" | "detect"
25
25
  "version": "<cli-version>", // CLI 版本号,如 "0.5.9"
26
26
  "timestamp": "<ISO-8601>", // 输出时间戳
27
27
  "data": { ... } // 命令特定的数据负载
@@ -52,7 +52,7 @@ openlogos detect --format json # JSON 格式
52
52
  "project": null | { // null 表示当前目录不是 OpenLogos 项目
53
53
  "name": "my-project", // 项目名
54
54
  "locale": "zh", // 语言设置
55
- "lifecycle": "active", // "initial" | "active"
55
+ "lifecycle": "launched", // "initial" | "launched"
56
56
  "description": "项目描述", // 项目描述
57
57
  "source_roots": null | { // 源代码根目录,null 表示未配置
58
58
  "src": ["src"], // 业务代码根目录列表
@@ -98,7 +98,7 @@ openlogos status --format json # JSON 格式
98
98
  "label": "Phase 1 · 需求文档 (WHY)",
99
99
  "done": true,
100
100
  "skipped": false,
101
- "files": ["01-requirements.md"]
101
+ "files": ["core-01-requirements.md"]
102
102
  },
103
103
  {
104
104
  "key": "phase.2",
@@ -109,6 +109,43 @@ openlogos status --format json # JSON 格式
109
109
  }
110
110
  // ... 所有 10 个 phase
111
111
  ],
112
+ "modules": [ // 模块注册表(来自 logos-project.yaml)
113
+ {
114
+ "id": "core",
115
+ "name": "核心功能",
116
+ "lifecycle": "initial", // "initial" | "launched"
117
+ "current_phase": "phase.3-2-api", // 当前推进阶段 key;launched 模块为 null
118
+ "current_phase_label": "Phase 3.2 · API 设计",
119
+ "phase_progress": { // 各阶段进度;launched 模块为 null
120
+ "phase.1": { "done": true, "skipped": false },
121
+ "phase.3-1": {
122
+ "done": false, "skipped": false,
123
+ "scenario_coverage": { "total": 3, "covered": 2, "missing": ["S03"] }
124
+ }
125
+ },
126
+ "active_change": null, // 仅 launched 模块有值
127
+ "suggestion": "对 AI 说:「设计 API」"
128
+ },
129
+ {
130
+ "id": "payment",
131
+ "name": "支付模块",
132
+ "lifecycle": "launched",
133
+ "current_phase": null,
134
+ "current_phase_label": null,
135
+ "phase_progress": null,
136
+ "active_change": { // 当前活跃变更提案
137
+ "slug": "add-refund",
138
+ "proposal_step": "implementing", // "writing"|"implementing"|"in-progress"|"ready-to-merge"
139
+ "proposal_step_label": "实现中",
140
+ "has_proposal": true,
141
+ "has_tasks": true,
142
+ "tasks_checked": 2,
143
+ "tasks_total": 5,
144
+ "delta_count": 1
145
+ },
146
+ "suggestion": "继续实现 add-refund,完成后运行 openlogos merge add-refund"
147
+ }
148
+ ],
112
149
  "active_proposals": [
113
150
  {
114
151
  "name": "add-feature",
@@ -120,7 +157,7 @@ openlogos status --format json # JSON 格式
120
157
  "current_phase": "phase.2", // 第一个未完成 phase 的 key,若全部完成则为 null
121
158
  "suggestion": "对 AI 说:「基于需求文档做产品设计」", // 建议的下一步操作
122
159
  "all_done": false, // 是否所有 phase 都已完成
123
- "lifecycle": "active", // 项目生命周期
160
+ "lifecycle": "launched", // 项目生命周期,派生值:"initial" | "launched"
124
161
  "source_roots": null | { // 源代码根目录,null 表示未配置
125
162
  "src": ["src"],
126
163
  "test": ["test"]
@@ -138,6 +175,26 @@ openlogos status --format json # JSON 格式
138
175
  | `phases[].done` | boolean | 是 | 该阶段是否已完成(有文件 = true) |
139
176
  | `phases[].skipped` | boolean | 是 | 该阶段是否被跳过(空但后续阶段已完成) |
140
177
  | `phases[].files` | string[] | 是 | 该阶段目录下的文件列表 |
178
+ | `modules` | array | 否 | 模块注册表;`logos-project.yaml` 无 `modules[]` 时省略此字段(向下兼容) |
179
+ | `modules[].id` | string | 是 | 模块标识符 |
180
+ | `modules[].name` | string | 是 | 模块名称 |
181
+ | `modules[].lifecycle` | string | 是 | 模块生命周期:`"initial"` 或 `"launched"` |
182
+ | `modules[].current_phase` | string \| null | 是 | 当前推进阶段 key;`launched` 模块为 null |
183
+ | `modules[].current_phase_label` | string \| null | 是 | 当前阶段本地化标签;`launched` 模块为 null |
184
+ | `modules[].phase_progress` | object \| null | 是 | 各阶段进度 map(key = phase key);`launched` 模块为 null |
185
+ | `modules[].phase_progress[key].done` | boolean | 是 | 该阶段是否已完成 |
186
+ | `modules[].phase_progress[key].skipped` | boolean | 是 | 该阶段是否被跳过 |
187
+ | `modules[].phase_progress[key].scenario_coverage` | object \| undefined | 否 | 仅场景类阶段(`phase.3-1`、`phase.3-3a`)存在 |
188
+ | `modules[].active_change` | object \| null | 是 | 当前活跃变更提案;`initial` 模块或无活跃提案时为 null |
189
+ | `modules[].active_change.slug` | string | 是 | 提案 slug |
190
+ | `modules[].active_change.proposal_step` | string | 是 | 提案阶段:`"writing"` \| `"implementing"` \| `"in-progress"` \| `"ready-to-merge"` |
191
+ | `modules[].active_change.proposal_step_label` | string | 是 | 提案阶段本地化标签 |
192
+ | `modules[].active_change.has_proposal` | boolean | 是 | 是否存在 proposal.md |
193
+ | `modules[].active_change.has_tasks` | boolean | 是 | 是否存在 tasks.md |
194
+ | `modules[].active_change.tasks_checked` | number | 是 | 已勾选任务数 |
195
+ | `modules[].active_change.tasks_total` | number | 是 | 总任务数 |
196
+ | `modules[].active_change.delta_count` | number | 是 | deltas 目录下的文件数 |
197
+ | `modules[].suggestion` | string | 是 | 针对该模块的下一步建议(本地化文本) |
141
198
  | `active_proposals` | array | 是 | 活跃变更提案列表 |
142
199
  | `active_proposals[].name` | string | 是 | 提案目录名 |
143
200
  | `active_proposals[].has_proposal` | boolean | 是 | 是否存在 proposal.md |
@@ -146,7 +203,7 @@ openlogos status --format json # JSON 格式
146
203
  | `current_phase` | string \| null | 是 | 当前应推进的阶段 key;全部完成时为 null |
147
204
  | `suggestion` | string | 是 | 建议的下一步操作(本地化文本) |
148
205
  | `all_done` | boolean | 是 | 是否全部阶段已完成(skipped 阶段不阻塞) |
149
- | `lifecycle` | string | 是 | 项目生命周期(`initial` 或 `active`) |
206
+ | `lifecycle` | string | 是 | 项目生命周期(`initial` 或 `launched`,由模块状态派生) |
150
207
  | `source_roots` | object \| null | 是 | 源代码根目录配置;未配置时为 null |
151
208
 
152
209
  ---
@@ -0,0 +1,138 @@
1
+ # Codex 原生插件规范(OpenLogos)
2
+
3
+ > 版本:0.1.0(草案)
4
+ >
5
+ > 本文档定义 OpenLogos 在 OpenAI Codex CLI 平台上的原生插件方案,目标是把当前"AGENTS 兼容模式"升级为"插件优先 + 文档兜底"的双轨机制。
6
+
7
+ ## 目标
8
+
9
+ 1. 提供与 Claude Code 插件接近的交互体验(SessionStart hook + Phase 上下文注入)
10
+ 2. 最大化复用现有 CLI(`openlogos *`)与 Skills(`logos/skills/*`)
11
+ 3. 保留 `AGENTS.md` 兜底,确保插件不可用时流程不中断
12
+
13
+ ## 运行模式
14
+
15
+ ### 模式 A:兼容模式(当前可用)
16
+
17
+ - 输入:`AGENTS.md` + `logos/skills/*/SKILL.md`
18
+ - 适用:未安装插件或插件异常时
19
+ - 特点:零额外安装,体验相对基础
20
+
21
+ ### 模式 B:原生插件模式(推荐)
22
+
23
+ - 输入:`openlogos init/sync` 自动生成的 `.codex-plugin/plugin.json`、`.codex-plugin/hooks/session-start.sh`、`.codex/config.toml`
24
+ - 适用:希望获得 SessionStart Phase 注入、技能自动加载、统一工作流控制
25
+ - 特点:体验增强,便于分发与版本管理
26
+
27
+ ## 与其他工具的对比
28
+
29
+ | 维度 | Claude Code | OpenCode | Codex |
30
+ |---|---|---|---|
31
+ | 指令文件 | `CLAUDE.md` | `AGENTS.md` | `AGENTS.md` |
32
+ | 技能路径 | `logos/skills/` | `logos/skills/` | `.agents/skills/<name>/SKILL.md` |
33
+ | 插件清单 | `plugin/` 目录 | `.opencode/plugins/openlogos.js` | `.codex-plugin/plugin.json` |
34
+ | 配置文件 | `.claude/settings.json` | `opencode.json` | `.codex/config.toml` |
35
+ | Hook 协议 | stdin/stdout JSON | 事件驱动 JS | stdin/stdout JSON(同 Claude Code) |
36
+ | 技能调用语法 | `/skill-name` | `/openlogos:*` | `$skill-name` |
37
+ | SessionStart | `hooks.json` | `session.created` | `[[hooks.SessionStart]]` |
38
+
39
+ ## 目录结构
40
+
41
+ ```text
42
+ openlogos/
43
+ ├── plugin-codex/
44
+ │ ├── plugin.json # 插件清单模板
45
+ │ └── session-start.sh # SessionStart hook 脚本模板
46
+ └── spec/codex-plugin.md # 本规范文档
47
+ ```
48
+
49
+ 用户项目部署后:
50
+
51
+ ```text
52
+ <user-project>/
53
+ ├── .agents/
54
+ │ └── skills/
55
+ │ ├── prd-writer/SKILL.md
56
+ │ ├── scenario-architect/SKILL.md
57
+ │ └── ... (全部 13 个 skill)
58
+ ├── .codex-plugin/
59
+ │ ├── plugin.json
60
+ │ └── hooks/
61
+ │ └── session-start.sh
62
+ ├── .codex/
63
+ │ └── config.toml
64
+ └── AGENTS.md # 兜底指令(始终保留)
65
+ ```
66
+
67
+ ## 构建与发布边界
68
+
69
+ 1. 插件模板随 `@miniidealab/openlogos`(CLI 单包)一起发布,不单独发布 Codex 插件包。
70
+ 2. 插件只负责"Hook 注入 + 上下文注入",不复制 CLI 业务逻辑。
71
+ 3. 版本策略:
72
+ - 插件模板版本与 CLI 版本保持同步
73
+ - 当依赖 CLI 新参数/新输出时,在同一 CLI 版本内联动升级
74
+ 4. 发布产物包含 `codex-plugin-template/`(由构建脚本从 `plugin-codex/` 生成),由 `init/sync` 自动部署到用户项目。
75
+
76
+ ## Hook 事件模型(MVP)
77
+
78
+ ### `SessionStart`
79
+
80
+ Codex 支持的 SessionStart 输出字段:`systemMessage`、`stopReason`。
81
+
82
+ 执行顺序:
83
+
84
+ 1. 检查项目是否已初始化(`logos/logos.config.json`)
85
+ 2. 调用 `openlogos status --format json` 获取当前 Phase 和建议
86
+ 3. 读取 guard 文件检测活跃变更提案
87
+ 4. 构建 `systemMessage`:包含当前 Phase、变更管理状态、语言策略
88
+ 5. 注入失败时静默返回 `{}`,不阻断会话
89
+
90
+ ### Hook 脚本降级策略
91
+
92
+ | 场景 | 行为 |
93
+ |---|---|
94
+ | `openlogos` CLI 不在 PATH | 静默返回 `{}`,不阻断会话 |
95
+ | 项目未初始化(无 logos.config.json) | 静默返回 `{}` |
96
+ | `openlogos status` 非 0 退出 | 静默返回 `{}` |
97
+ | Python3 和 Node 均不可用 | 输出简化 `systemMessage`(无 JSON 解析) |
98
+
99
+ ## 命令调用
100
+
101
+ Codex 使用 `$skill-name` 语法调用技能(不同于 Claude Code 的 `/skill-name`)。`AGENTS.md` 中的 Active Skills 章节应使用 `$` 前缀说明。
102
+
103
+ ## 配置格式(`.codex/config.toml`)
104
+
105
+ ```toml
106
+ [plugins.openlogos]
107
+ enabled = true
108
+
109
+ [[hooks.SessionStart]]
110
+ [[hooks.SessionStart.hooks]]
111
+ type = "command"
112
+ command = ".codex-plugin/hooks/session-start.sh"
113
+ timeout = 5
114
+ async = false
115
+ statusMessage = "Loading OpenLogos phase context..."
116
+ ```
117
+
118
+ ## 安全边界
119
+
120
+ 1. **最小权限原则**:hook 脚本只读取项目状态,不修改任何文件
121
+ 2. **路径约束**:仅在工作区内执行,不允许跨目录写入
122
+ 3. **错误可观测性**:所有 CLI 失败静默降级,不阻断会话
123
+ 4. **降级策略**:插件不可用时,回退到 `AGENTS.md` 兼容模式
124
+
125
+ ## 双轨策略
126
+
127
+ | 模式 | 配置 | 技能来源 | CLI 桥接 |
128
+ |---|---|---|---|
129
+ | **兼容**(兜底) | `AGENTS.md` only | `logos/skills/` | 无 |
130
+ | **原生插件**(推荐) | `.codex-plugin/` + `.codex/config.toml` | `.agents/skills/` | `session-start.sh` → `openlogos status` |
131
+
132
+ 原生插件模式为推荐路径。`AGENTS.md` 始终保留作为降级兜底。
133
+
134
+ ## 验收标准(文档阶段)
135
+
136
+ - `README.md` 已包含 Codex 原生插件安装说明
137
+ - `spec/agents-md.md` 已明确双轨模式包含 Codex
138
+ - 本文档定义了插件边界、事件、安全策略与双轨策略