@nova286/nova-workflow 2.1.1 → 2.3.0

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 (42) hide show
  1. package/README.md +113 -36
  2. package/dist/cli/commands/init.js +3 -1
  3. package/dist/cli/commands/init.js.map +1 -1
  4. package/dist/cli/index.js +6 -1
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/cli-core/__tests__/adapters.test.js +25 -0
  7. package/dist/cli-core/__tests__/adapters.test.js.map +1 -1
  8. package/dist/cli-core/__tests__/context-generator.test.js +31 -0
  9. package/dist/cli-core/__tests__/context-generator.test.js.map +1 -1
  10. package/dist/cli-core/__tests__/dispatcher.test.js +22 -0
  11. package/dist/cli-core/__tests__/dispatcher.test.js.map +1 -1
  12. package/dist/cli-core/__tests__/guard.test.js +41 -1
  13. package/dist/cli-core/__tests__/guard.test.js.map +1 -1
  14. package/dist/cli-core/__tests__/init-manager.test.js +118 -21
  15. package/dist/cli-core/__tests__/init-manager.test.js.map +1 -1
  16. package/dist/cli-core/__tests__/pipeline.test.js +22 -0
  17. package/dist/cli-core/__tests__/pipeline.test.js.map +1 -1
  18. package/dist/cli-core/adapters/claude-code.d.ts +5 -3
  19. package/dist/cli-core/adapters/claude-code.js +130 -50
  20. package/dist/cli-core/adapters/claude-code.js.map +1 -1
  21. package/dist/cli-core/adapters/codex.js +25 -19
  22. package/dist/cli-core/adapters/codex.js.map +1 -1
  23. package/dist/cli-core/adapters/hermes-agent.js +25 -19
  24. package/dist/cli-core/adapters/hermes-agent.js.map +1 -1
  25. package/dist/cli-core/adapters/openclaw.js +25 -19
  26. package/dist/cli-core/adapters/openclaw.js.map +1 -1
  27. package/dist/cli-core/adapters/opencode.js +25 -19
  28. package/dist/cli-core/adapters/opencode.js.map +1 -1
  29. package/dist/cli-core/context-generator.js +44 -2
  30. package/dist/cli-core/context-generator.js.map +1 -1
  31. package/dist/cli-core/guard.js +4 -0
  32. package/dist/cli-core/guard.js.map +1 -1
  33. package/dist/cli-core/init-manager.d.ts +4 -0
  34. package/dist/cli-core/init-manager.js +72 -6
  35. package/dist/cli-core/init-manager.js.map +1 -1
  36. package/dist/cli-core/quality-check.d.ts +1 -0
  37. package/dist/cli-core/quality-check.js +23 -0
  38. package/dist/cli-core/quality-check.js.map +1 -1
  39. package/dist/cli-core/types.d.ts +57 -1
  40. package/package.json +1 -1
  41. package/templates/docs/design.md +4 -0
  42. package/templates/docs/verification-report.md +21 -0
@@ -39,7 +39,8 @@ const path = __importStar(require("path"));
39
39
  const CODEX_INSTRUCTIONS = `# Nova Workflow
40
40
 
41
41
  This project uses Nova — an AI-assisted development workflow with 5 phases.
42
- All state is in \`.nova.yaml\`. Always read it first.
42
+ Nova orchestrates OpenSpec-compatible specs, Superpowers-compatible execution,
43
+ and ECC-compatible review. All state is in \`.nova.yaml\`. Always read it first.
43
44
 
44
45
  ## How to Use
45
46
 
@@ -50,37 +51,41 @@ All state is in \`.nova.yaml\`. Always read it first.
50
51
 
51
52
  ### Phase 1: Propose (提案)
52
53
  \`\`\`
53
- 帮我为"{你的需求描述}"写一个 proposal
54
+ 帮我为"{你的需求描述}"创建 OpenSpec-compatible change
54
55
  1. 先读 .nova.yaml 和已有代码了解项目
55
56
  2. 问 3-4 个澄清问题
56
- 3. 写入 docs/proposals/proposal.md
57
- 4. 更新 .nova.yaml: phases.propose.status = done
57
+ 3. 写入 .openspec/changes/<change-id>/proposal.md 和 specs
58
+ 4. 更新 .nova.yaml: activeChange, artifacts.*, phases.propose.status = done
58
59
  \`\`\`
59
60
 
60
61
  ### Phase 2: Design (设计)
61
62
  \`\`\`
62
- 读取 docs/proposals/proposal.md,生成技术设计文档。
63
- 1. 读 proposal 和 src/ 了解架构
64
- 2. 写入 docs/designs/design.md,包含架构、组件、YAML 任务列表
65
- 3. 更新 .nova.yaml: phases.design.status = done, tasks = 解析后的列表
63
+ 读取 activeChange 对应的 OpenSpec-compatible change,生成执行计划。
64
+ 1. 读 proposal/spec delta 和 src/ 了解架构
65
+ 2. 写入 docs/designs/design.md 和 docs/superpowers/plans/<change>.md
66
+ 3. 任务必须包含 method, specRefs, acceptanceRefs, verification.commands
67
+ 4. 更新 .nova.yaml: phases.design.status = done, tasks = 解析后的列表
66
68
  \`\`\`
67
69
 
68
70
  ### Phase 3: Implement (实现)
69
71
  \`\`\`
70
- 读取 .nova.yaml 中的 tasks,逐个实现:
71
- 1. 按 priority 排序执行
72
- 2. 每个任务:写代码 → tsc --noEmit → npm test → 更新 task status = done
73
- 3. 失败时问用户:abort / skip / retry
74
- 4. 全部完成后更新 phases.implement.status = done
72
+ 读取 .nova.yaml 中的 spec-bound tasks,逐个实现:
73
+ 1. 按 priority/dependency 排序执行
74
+ 2. 每个任务先解析 specRefs/acceptanceRefs/method
75
+ 3. method=tdd 时先写失败测试,再实现,再重构
76
+ 4. verification.commands,记录 tests/filesChanged/traceIds evidence
77
+ 5. 失败时问用户:abort / skip / retry
78
+ 6. 全部完成后更新 phases.implement.status = done
75
79
  \`\`\`
76
80
 
77
81
  ### Phase 4: Verify (验证)
78
82
  \`\`\`
79
- 对已修改的文件做 code review + security review:
80
- 1. Code review: 正确性、错误处理、类型安全、测试覆盖
81
- 2. Security review: 注入、密钥暴露、路径遍历
82
- 3. 写入 docs/designs/verification-report.md
83
- 4. 更新 phases.verify.status = done
83
+ 对已修改的文件做 spec conformance + code review + security review:
84
+ 1. Spec conformance: evidence 是否覆盖 specRefs/acceptanceRefs
85
+ 2. Code review: 正确性、错误处理、类型安全、测试覆盖
86
+ 3. Security review: 注入、密钥暴露、路径遍历
87
+ 4. 写入 docs/reports/verification-report.md
88
+ 5. 更新 phases.verify.status = done
84
89
  \`\`\`
85
90
 
86
91
  ### Phase 5: Archive (归档)
@@ -96,7 +101,8 @@ All state is in \`.nova.yaml\`. Always read it first.
96
101
  ## Key Rules
97
102
 
98
103
  - Always read \`.nova.yaml\` before any action
99
- - After each task, run \`npx tsc --noEmit\` and \`npm test\`
104
+ - After each task, run task verification commands, then project checks when needed
105
+ - Do not mark a task done without spec/acceptance evidence
100
106
  - Never leave TODOs or stubs
101
107
  - Update \`.nova.yaml\` status after each phase transition
102
108
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/codex.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAG7B,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+D1B,CAAC;AAEF,MAAa,YAAY;IAAzB;QACE,SAAI,GAAG,OAAO,CAAC;IAUjB,CAAC;IARC,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,CAAC,kBAAkB;QAC5B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;CACF;AAXD,oCAWC"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/codex.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAG7B,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqE1B,CAAC;AAEF,MAAa,YAAY;IAAzB;QACE,SAAI,GAAG,OAAO,CAAC;IAUjB,CAAC;IARC,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,CAAC,kBAAkB;QAC5B,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC;CACF;AAXD,oCAWC"}
@@ -39,7 +39,8 @@ const path = __importStar(require("path"));
39
39
  const HERMES_INSTRUCTIONS = `# Nova Workflow
40
40
 
41
41
  This project uses Nova — an AI-assisted development workflow with 5 phases.
42
- All state is in \`.nova.yaml\`. Always read it first.
42
+ Nova orchestrates OpenSpec-compatible specs, Superpowers-compatible execution,
43
+ and ECC-compatible review. All state is in \`.nova.yaml\`. Always read it first.
43
44
 
44
45
  ## How to Use
45
46
 
@@ -50,37 +51,41 @@ All state is in \`.nova.yaml\`. Always read it first.
50
51
 
51
52
  ### Phase 1: Propose (提案)
52
53
  \`\`\`
53
- 帮我为"{你的需求描述}"写一个 proposal
54
+ 帮我为"{你的需求描述}"创建 OpenSpec-compatible change
54
55
  1. 先读 .nova.yaml 和已有代码了解项目
55
56
  2. 问 3-4 个澄清问题
56
- 3. 写入 docs/proposals/proposal.md
57
- 4. 更新 .nova.yaml: phases.propose.status = done
57
+ 3. 写入 .openspec/changes/<change-id>/proposal.md 和 specs
58
+ 4. 更新 .nova.yaml: activeChange, artifacts.*, phases.propose.status = done
58
59
  \`\`\`
59
60
 
60
61
  ### Phase 2: Design (设计)
61
62
  \`\`\`
62
- 读取 docs/proposals/proposal.md,生成技术设计文档。
63
- 1. 读 proposal 和 src/ 了解架构
64
- 2. 写入 docs/designs/design.md,包含架构、组件、YAML 任务列表
65
- 3. 更新 .nova.yaml: phases.design.status = done, tasks = 解析后的列表
63
+ 读取 activeChange 对应的 OpenSpec-compatible change,生成执行计划。
64
+ 1. 读 proposal/spec delta 和 src/ 了解架构
65
+ 2. 写入 docs/designs/design.md 和 docs/superpowers/plans/<change>.md
66
+ 3. 任务必须包含 method, specRefs, acceptanceRefs, verification.commands
67
+ 4. 更新 .nova.yaml: phases.design.status = done, tasks = 解析后的列表
66
68
  \`\`\`
67
69
 
68
70
  ### Phase 3: Implement (实现)
69
71
  \`\`\`
70
- 读取 .nova.yaml 中的 tasks,逐个实现:
71
- 1. 按 priority 排序执行
72
- 2. 每个任务:写代码 → tsc --noEmit → npm test → 更新 task status = done
73
- 3. 失败时问用户:abort / skip / retry
74
- 4. 全部完成后更新 phases.implement.status = done
72
+ 读取 .nova.yaml 中的 spec-bound tasks,逐个实现:
73
+ 1. 按 priority/dependency 排序执行
74
+ 2. 每个任务先解析 specRefs/acceptanceRefs/method
75
+ 3. method=tdd 时先写失败测试,再实现,再重构
76
+ 4. verification.commands,记录 tests/filesChanged/traceIds evidence
77
+ 5. 失败时问用户:abort / skip / retry
78
+ 6. 全部完成后更新 phases.implement.status = done
75
79
  \`\`\`
76
80
 
77
81
  ### Phase 4: Verify (验证)
78
82
  \`\`\`
79
- 对已修改的文件做 code review + security review:
80
- 1. Code review: 正确性、错误处理、类型安全、测试覆盖
81
- 2. Security review: 注入、密钥暴露、路径遍历
82
- 3. 写入 docs/designs/verification-report.md
83
- 4. 更新 phases.verify.status = done
83
+ 对已修改的文件做 spec conformance + code review + security review:
84
+ 1. Spec conformance: evidence 是否覆盖 specRefs/acceptanceRefs
85
+ 2. Code review: 正确性、错误处理、类型安全、测试覆盖
86
+ 3. Security review: 注入、密钥暴露、路径遍历
87
+ 4. 写入 docs/reports/verification-report.md
88
+ 5. 更新 phases.verify.status = done
84
89
  \`\`\`
85
90
 
86
91
  ### Phase 5: Archive (归档)
@@ -91,7 +96,8 @@ All state is in \`.nova.yaml\`. Always read it first.
91
96
  ## Key Rules
92
97
 
93
98
  - Always read \`.nova.yaml\` before any action
94
- - After each task, run \`npx tsc --noEmit\` and \`npm test\`
99
+ - After each task, run task verification commands, then project checks when needed
100
+ - Do not mark a task done without spec/acceptance evidence
95
101
  - Never leave TODOs or stubs
96
102
  - Update \`.nova.yaml\` status after each phase transition
97
103
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"hermes-agent.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/hermes-agent.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAG7B,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0D3B,CAAC;AAEF,MAAa,kBAAkB;IAA/B;QACE,SAAI,GAAG,cAAc,CAAC;IAUxB,CAAC;IARC,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;CACF;AAXD,gDAWC"}
1
+ {"version":3,"file":"hermes-agent.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/hermes-agent.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAG7B,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgE3B,CAAC;AAEF,MAAa,kBAAkB;IAA/B;QACE,SAAI,GAAG,cAAc,CAAC;IAUxB,CAAC;IARC,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC;IAC7D,CAAC;CACF;AAXD,gDAWC"}
@@ -39,7 +39,8 @@ const path = __importStar(require("path"));
39
39
  const OPENCLAW_INSTRUCTIONS = `# Nova Workflow
40
40
 
41
41
  This project uses Nova — an AI-assisted development workflow with 5 phases.
42
- All state is in \`.nova.yaml\`. Always read it first.
42
+ Nova orchestrates OpenSpec-compatible specs, Superpowers-compatible execution,
43
+ and ECC-compatible review. All state is in \`.nova.yaml\`. Always read it first.
43
44
 
44
45
  ## How to Use
45
46
 
@@ -50,37 +51,41 @@ All state is in \`.nova.yaml\`. Always read it first.
50
51
 
51
52
  ### Phase 1: Propose (提案)
52
53
  \`\`\`
53
- 帮我为"{你的需求描述}"写一个 proposal
54
+ 帮我为"{你的需求描述}"创建 OpenSpec-compatible change
54
55
  1. 先读 .nova.yaml 和已有代码了解项目
55
56
  2. 问 3-4 个澄清问题
56
- 3. 写入 docs/proposals/proposal.md
57
- 4. 更新 .nova.yaml: phases.propose.status = done
57
+ 3. 写入 .openspec/changes/<change-id>/proposal.md 和 specs
58
+ 4. 更新 .nova.yaml: activeChange, artifacts.*, phases.propose.status = done
58
59
  \`\`\`
59
60
 
60
61
  ### Phase 2: Design (设计)
61
62
  \`\`\`
62
- 读取 docs/proposals/proposal.md,生成技术设计文档。
63
- 1. 读 proposal 和 src/ 了解架构
64
- 2. 写入 docs/designs/design.md,包含架构、组件、YAML 任务列表
65
- 3. 更新 .nova.yaml: phases.design.status = done, tasks = 解析后的列表
63
+ 读取 activeChange 对应的 OpenSpec-compatible change,生成执行计划。
64
+ 1. 读 proposal/spec delta 和 src/ 了解架构
65
+ 2. 写入 docs/designs/design.md 和 docs/superpowers/plans/<change>.md
66
+ 3. 任务必须包含 method, specRefs, acceptanceRefs, verification.commands
67
+ 4. 更新 .nova.yaml: phases.design.status = done, tasks = 解析后的列表
66
68
  \`\`\`
67
69
 
68
70
  ### Phase 3: Implement (实现)
69
71
  \`\`\`
70
- 读取 .nova.yaml 中的 tasks,逐个实现:
71
- 1. 按 priority 排序执行
72
- 2. 每个任务:写代码 → tsc --noEmit → npm test → 更新 task status = done
73
- 3. 失败时问用户:abort / skip / retry
74
- 4. 全部完成后更新 phases.implement.status = done
72
+ 读取 .nova.yaml 中的 spec-bound tasks,逐个实现:
73
+ 1. 按 priority/dependency 排序执行
74
+ 2. 每个任务先解析 specRefs/acceptanceRefs/method
75
+ 3. method=tdd 时先写失败测试,再实现,再重构
76
+ 4. verification.commands,记录 tests/filesChanged/traceIds evidence
77
+ 5. 失败时问用户:abort / skip / retry
78
+ 6. 全部完成后更新 phases.implement.status = done
75
79
  \`\`\`
76
80
 
77
81
  ### Phase 4: Verify (验证)
78
82
  \`\`\`
79
- 对已修改的文件做 code review + security review:
80
- 1. Code review: 正确性、错误处理、类型安全、测试覆盖
81
- 2. Security review: 注入、密钥暴露、路径遍历
82
- 3. 写入 docs/designs/verification-report.md
83
- 4. 更新 phases.verify.status = done
83
+ 对已修改的文件做 spec conformance + code review + security review:
84
+ 1. Spec conformance: evidence 是否覆盖 specRefs/acceptanceRefs
85
+ 2. Code review: 正确性、错误处理、类型安全、测试覆盖
86
+ 3. Security review: 注入、密钥暴露、路径遍历
87
+ 4. 写入 docs/reports/verification-report.md
88
+ 5. 更新 phases.verify.status = done
84
89
  \`\`\`
85
90
 
86
91
  ### Phase 5: Archive (归档)
@@ -91,7 +96,8 @@ All state is in \`.nova.yaml\`. Always read it first.
91
96
  ## Key Rules
92
97
 
93
98
  - Always read \`.nova.yaml\` before any action
94
- - After each task, run \`npx tsc --noEmit\` and \`npm test\`
99
+ - After each task, run task verification commands, then project checks when needed
100
+ - Do not mark a task done without spec/acceptance evidence
95
101
  - Never leave TODOs or stubs
96
102
  - Update \`.nova.yaml\` status after each phase transition
97
103
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/openclaw.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAG7B,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0D7B,CAAC;AAEF,MAAa,eAAe;IAA5B;QACE,SAAI,GAAG,UAAU,CAAC;IAYpB,CAAC;IAVC,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACxC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;CACF;AAbD,0CAaC"}
1
+ {"version":3,"file":"openclaw.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/openclaw.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAG7B,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgE7B,CAAC;AAEF,MAAa,eAAe;IAA5B;QACE,SAAI,GAAG,UAAU,CAAC;IAYpB,CAAC;IAVC,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACxC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;CACF;AAbD,0CAaC"}
@@ -39,7 +39,8 @@ const path = __importStar(require("path"));
39
39
  const OPENCODE_INSTRUCTIONS = `# Nova Workflow
40
40
 
41
41
  This project uses Nova — an AI-assisted development workflow with 5 phases.
42
- All state is in \`.nova.yaml\`. Always read it first.
42
+ Nova orchestrates OpenSpec-compatible specs, Superpowers-compatible execution,
43
+ and ECC-compatible review. All state is in \`.nova.yaml\`. Always read it first.
43
44
 
44
45
  ## How to Use
45
46
 
@@ -50,37 +51,41 @@ All state is in \`.nova.yaml\`. Always read it first.
50
51
 
51
52
  ### Phase 1: Propose (提案)
52
53
  \`\`\`
53
- 帮我为"{你的需求描述}"写一个 proposal
54
+ 帮我为"{你的需求描述}"创建 OpenSpec-compatible change
54
55
  1. 先读 .nova.yaml 和已有代码了解项目
55
56
  2. 问 3-4 个澄清问题
56
- 3. 写入 docs/proposals/proposal.md
57
- 4. 更新 .nova.yaml: phases.propose.status = done
57
+ 3. 写入 .openspec/changes/<change-id>/proposal.md 和 specs
58
+ 4. 更新 .nova.yaml: activeChange, artifacts.*, phases.propose.status = done
58
59
  \`\`\`
59
60
 
60
61
  ### Phase 2: Design (设计)
61
62
  \`\`\`
62
- 读取 docs/proposals/proposal.md,生成技术设计文档。
63
- 1. 读 proposal 和 src/ 了解架构
64
- 2. 写入 docs/designs/design.md,包含架构、组件、YAML 任务列表
65
- 3. 更新 .nova.yaml: phases.design.status = done, tasks = 解析后的列表
63
+ 读取 activeChange 对应的 OpenSpec-compatible change,生成执行计划。
64
+ 1. 读 proposal/spec delta 和 src/ 了解架构
65
+ 2. 写入 docs/designs/design.md 和 docs/superpowers/plans/<change>.md
66
+ 3. 任务必须包含 method, specRefs, acceptanceRefs, verification.commands
67
+ 4. 更新 .nova.yaml: phases.design.status = done, tasks = 解析后的列表
66
68
  \`\`\`
67
69
 
68
70
  ### Phase 3: Implement (实现)
69
71
  \`\`\`
70
- 读取 .nova.yaml 中的 tasks,逐个实现:
71
- 1. 按 priority 排序执行
72
- 2. 每个任务:写代码 → tsc --noEmit → npm test → 更新 task status = done
73
- 3. 失败时问用户:abort / skip / retry
74
- 4. 全部完成后更新 phases.implement.status = done
72
+ 读取 .nova.yaml 中的 spec-bound tasks,逐个实现:
73
+ 1. 按 priority/dependency 排序执行
74
+ 2. 每个任务先解析 specRefs/acceptanceRefs/method
75
+ 3. method=tdd 时先写失败测试,再实现,再重构
76
+ 4. verification.commands,记录 tests/filesChanged/traceIds evidence
77
+ 5. 失败时问用户:abort / skip / retry
78
+ 6. 全部完成后更新 phases.implement.status = done
75
79
  \`\`\`
76
80
 
77
81
  ### Phase 4: Verify (验证)
78
82
  \`\`\`
79
- 对已修改的文件做 code review + security review:
80
- 1. Code review: 正确性、错误处理、类型安全、测试覆盖
81
- 2. Security review: 注入、密钥暴露、路径遍历
82
- 3. 写入 docs/designs/verification-report.md
83
- 4. 更新 phases.verify.status = done
83
+ 对已修改的文件做 spec conformance + code review + security review:
84
+ 1. Spec conformance: evidence 是否覆盖 specRefs/acceptanceRefs
85
+ 2. Code review: 正确性、错误处理、类型安全、测试覆盖
86
+ 3. Security review: 注入、密钥暴露、路径遍历
87
+ 4. 写入 docs/reports/verification-report.md
88
+ 5. 更新 phases.verify.status = done
84
89
  \`\`\`
85
90
 
86
91
  ### Phase 5: Archive (归档)
@@ -91,7 +96,8 @@ All state is in \`.nova.yaml\`. Always read it first.
91
96
  ## Key Rules
92
97
 
93
98
  - Always read \`.nova.yaml\` before any action
94
- - After each task, run \`npx tsc --noEmit\` and \`npm test\`
99
+ - After each task, run task verification commands, then project checks when needed
100
+ - Do not mark a task done without spec/acceptance evidence
95
101
  - Never leave TODOs or stubs
96
102
  - Update \`.nova.yaml\` status after each phase transition
97
103
  `;
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/opencode.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAG7B,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0D7B,CAAC;AAEF,MAAa,eAAe;IAA5B;QACE,SAAI,GAAG,UAAU,CAAC;IAapB,CAAC;IAXC,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,CAAC,kCAAkC;QAC5C,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,MAAM,GAAG;YACb,YAAY,EAAE,qBAAqB;SACpC,CAAC;QACF,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;CACF;AAdD,0CAcC"}
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/opencode.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAG7B,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgE7B,CAAC;AAEF,MAAa,eAAe;IAA5B;QACE,SAAI,GAAG,UAAU,CAAC;IAapB,CAAC;IAXC,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACjD,IAAI,CAAC;YACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC1B,OAAO,CAAC,kCAAkC;QAC5C,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,MAAM,MAAM,GAAG;YACb,YAAY,EAAE,qBAAqB;SACpC,CAAC;QACF,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;CACF;AAdD,0CAcC"}
@@ -23,6 +23,28 @@ const TYPE_MAP = {
23
23
  testing: 'testing',
24
24
  security: 'security',
25
25
  };
26
+ const DEFAULT_INTEGRATIONS = {
27
+ openspec: { mode: 'compatible' },
28
+ superpowers: { mode: 'compatible' },
29
+ ecc: { mode: 'compatible' },
30
+ };
31
+ const DEFAULT_ARTIFACTS = {
32
+ openspecChange: '',
33
+ proposal: '',
34
+ specDelta: '',
35
+ implementationPlan: '',
36
+ verificationReport: '',
37
+ };
38
+ function normalizeMethod(method, taskType) {
39
+ if (method === 'tdd' ||
40
+ method === 'implementation' ||
41
+ method === 'refactor' ||
42
+ method === 'docs' ||
43
+ method === 'migration') {
44
+ return method;
45
+ }
46
+ return taskType === 'testing' ? 'tdd' : 'implementation';
47
+ }
26
48
  class ContextGenerator {
27
49
  static async generateFromTask(task) {
28
50
  const state = await state_1.StateManager.load();
@@ -33,15 +55,16 @@ class ContextGenerator {
33
55
  buildTool: '',
34
56
  testFramework: '',
35
57
  };
58
+ const taskType = TYPE_MAP[task.type] || 'other';
36
59
  return {
37
60
  taskId: task.id,
38
61
  parentTaskId: task.parentId,
39
62
  title: task.title,
40
63
  description: task.description,
41
- taskType: TYPE_MAP[task.type] || 'other',
64
+ taskType,
42
65
  designContext: {
43
66
  designDocRef: state.phases.design?.designDoc || '',
44
- relevantSpecs: [],
67
+ relevantSpecs: task.specRefs || [],
45
68
  architectureNotes: '',
46
69
  },
47
70
  input: {
@@ -62,6 +85,25 @@ class ContextGenerator {
62
85
  })),
63
86
  constraints: task.constraints || { mustPassTests: true },
64
87
  },
88
+ change: {
89
+ activeChange: state.activeChange || '',
90
+ artifacts: { ...DEFAULT_ARTIFACTS, ...(state.artifacts || {}) },
91
+ },
92
+ methodology: { ...DEFAULT_INTEGRATIONS, ...(state.integrations || {}) },
93
+ implementation: {
94
+ method: normalizeMethod(task.method, taskType),
95
+ specRefs: task.specRefs || [],
96
+ acceptanceRefs: task.acceptanceRefs || [],
97
+ },
98
+ verification: {
99
+ commands: task.verification?.commands || [],
100
+ },
101
+ evidence: {
102
+ required: task.evidence?.required || [],
103
+ tests: task.evidence?.tests,
104
+ filesChanged: task.evidence?.filesChanged,
105
+ traceIds: task.evidence?.traceIds,
106
+ },
65
107
  acceptanceCriteria: task.acceptance || [],
66
108
  guardConditions: {
67
109
  requireReview: true,
@@ -1 +1 @@
1
- {"version":3,"file":"context-generator.js","sourceRoot":"","sources":["../../src/cli-core/context-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-generator.js","sourceRoot":"","sources":["../../src/cli-core/context-generator.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,10 @@ const TRANSITION_RULES = {
37
37
  label: 'All tasks have acceptance criteria',
38
38
  check: (s) => (0, quality_check_1.validateAcceptance)(s.phases.design?.tasks || []),
39
39
  },
40
+ {
41
+ label: 'Implementation tasks are spec-bound',
42
+ check: (s) => (0, quality_check_1.validateSpecBoundExecution)(s.phases.design?.tasks || []),
43
+ },
40
44
  ],
41
45
  'implement:verify': [
42
46
  { label: 'Implement phase is done', check: (s) => s.phases.implement?.status === 'done' },
@@ -1 +1 @@
1
- {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/cli-core/guard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/cli-core/guard.ts"],"names":[],"mappings":"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"}
@@ -2,17 +2,21 @@ export declare class InitManager {
2
2
  private cwd;
3
3
  private options;
4
4
  private backupDir?;
5
+ private resolvedSkillsDir?;
5
6
  private steps;
6
7
  constructor(cwd: string, opts: {
7
8
  eccPath?: string;
8
9
  force?: boolean;
10
+ skillsDir?: 'project' | 'user';
9
11
  });
10
12
  run(): Promise<void>;
11
13
  private isInitialized;
14
+ private promptSkillsDir;
12
15
  private backup;
13
16
  private rollback;
14
17
  private commandExists;
15
18
  private detectAIEnvironment;
19
+ private detectMcpServers;
16
20
  private getAdapter;
17
21
  private createDirs;
18
22
  private removeDirs;
@@ -32,12 +32,17 @@ var __importStar = (this && this.__importStar) || (function () {
32
32
  return result;
33
33
  };
34
34
  })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
35
38
  Object.defineProperty(exports, "__esModule", { value: true });
36
39
  exports.InitManager = void 0;
37
40
  const fs = __importStar(require("fs/promises"));
38
41
  const path = __importStar(require("path"));
42
+ const os = __importStar(require("os"));
39
43
  const child_process_1 = require("child_process");
40
44
  const yaml = __importStar(require("yaml"));
45
+ const inquirer_1 = __importDefault(require("inquirer"));
41
46
  const ui_1 = require("../cli/ui");
42
47
  const project_detect_1 = require("./project-detect");
43
48
  const claude_code_1 = require("./adapters/claude-code");
@@ -66,13 +71,17 @@ class InitManager {
66
71
  await this.backup();
67
72
  const envs = await this.detectAIEnvironment();
68
73
  const envAdapters = envs.map(e => this.getAdapter(e));
74
+ const mcpServers = await this.detectMcpServers();
75
+ const skillsDir = this.options.skillsDir ?? await this.promptSkillsDir(envs);
76
+ this.resolvedSkillsDir = skillsDir;
77
+ const adapterOptions = { skillsDir, mcpServers };
69
78
  this.steps = [
70
79
  { name: 'Create directory structure', run: () => this.createDirs(), rollback: () => this.removeDirs() },
71
- { name: 'Generate .nova.yaml', run: () => this.generateConfig(envs), rollback: () => this.removeFile('.nova.yaml') },
80
+ { name: 'Generate .nova.yaml', run: () => this.generateConfig(envs, mcpServers), rollback: () => this.removeFile('.nova.yaml') },
72
81
  { name: 'Install ECC skills', run: () => this.installEcc(), rollback: () => this.removeDir('.nova/ecc') },
73
82
  { name: 'Generate environment commands', run: async () => {
74
83
  for (const adapter of envAdapters)
75
- await adapter.setup(this.cwd);
84
+ await adapter.setup(this.cwd, adapterOptions);
76
85
  }, rollback: () => this.cleanEnvCommands(envs) },
77
86
  { name: 'Generate templates', run: () => this.generateTemplates(), rollback: () => this.removeDir('docs') }
78
87
  ];
@@ -100,6 +109,21 @@ class InitManager {
100
109
  return false;
101
110
  }
102
111
  }
112
+ async promptSkillsDir(envs) {
113
+ if (!envs.includes('claude-code'))
114
+ return 'project';
115
+ const { skillsDir } = await inquirer_1.default.prompt([{
116
+ type: 'list',
117
+ name: 'skillsDir',
118
+ message: 'Where to install Nova skills?',
119
+ choices: [
120
+ { name: 'User (~/.agents/skills/) — shared across all AI tools', value: 'user' },
121
+ { name: 'Project (.claude/skills/) — project-specific', value: 'project' },
122
+ ],
123
+ default: 'user',
124
+ }]);
125
+ return skillsDir;
126
+ }
103
127
  async backup() {
104
128
  this.backupDir = path.join(this.cwd, '.nova-backup-' + Date.now());
105
129
  await fs.mkdir(this.backupDir, { recursive: true });
@@ -147,6 +171,31 @@ class InitManager {
147
171
  }
148
172
  return detected.length > 0 ? detected : ['claude-code'];
149
173
  }
174
+ async detectMcpServers() {
175
+ const mcpServers = {};
176
+ const settingsPaths = [
177
+ path.join(os.homedir(), '.claude', 'settings.json'),
178
+ path.join(this.cwd, '.claude', 'settings.json'),
179
+ ];
180
+ for (const settingsPath of settingsPaths) {
181
+ try {
182
+ const raw = await fs.readFile(settingsPath, 'utf-8');
183
+ const settings = JSON.parse(raw);
184
+ const servers = settings.mcpServers ?? {};
185
+ for (const [name, config] of Object.entries(servers)) {
186
+ const lower = name.toLowerCase();
187
+ if (!mcpServers.figma && (lower.includes('figma'))) {
188
+ mcpServers.figma = { configured: true, serverName: name };
189
+ }
190
+ if (!mcpServers.mobile && (lower.includes('mobile') || lower.includes('simulator') || lower.includes('maestro'))) {
191
+ mcpServers.mobile = { configured: true, serverName: name };
192
+ }
193
+ }
194
+ }
195
+ catch { }
196
+ }
197
+ return mcpServers;
198
+ }
150
199
  getAdapter(env) {
151
200
  const factory = ADAPTER_FACTORIES[env];
152
201
  if (!factory)
@@ -154,18 +203,32 @@ class InitManager {
154
203
  return factory();
155
204
  }
156
205
  async createDirs() {
157
- const dirs = ['docs/designs', 'docs/proposals', 'docs/reports', '.nova/contexts'];
206
+ const dirs = ['docs/designs', 'docs/proposals', 'docs/reports', '.nova/contexts', '.openspec/changes'];
158
207
  for (const d of dirs)
159
208
  await fs.mkdir(path.join(this.cwd, d), { recursive: true });
160
209
  }
161
210
  async removeDirs() { }
162
- async generateConfig(envs) {
211
+ async generateConfig(envs, mcpServers) {
163
212
  const projectType = await this.detectProjectType();
164
213
  const config = {
165
214
  version: 1,
166
215
  project: path.basename(this.cwd),
167
216
  projectType,
168
217
  environment: envs,
218
+ activeChange: '',
219
+ integrations: {
220
+ openspec: { mode: 'compatible' },
221
+ superpowers: { mode: 'compatible' },
222
+ ecc: { mode: 'compatible' },
223
+ },
224
+ mcpServers,
225
+ artifacts: {
226
+ openspecChange: '',
227
+ proposal: '',
228
+ specDelta: '',
229
+ implementationPlan: '',
230
+ verificationReport: '',
231
+ },
169
232
  phases: {
170
233
  propose: { status: 'pending', proposal: '' },
171
234
  design: { status: 'pending', designDoc: '', tasks: [] },
@@ -196,7 +259,7 @@ class InitManager {
196
259
  }
197
260
  async cleanEnvCommands(envs) {
198
261
  const cleanupMap = {
199
- 'claude-code': ['.claude'],
262
+ 'claude-code': ['.agents/skills'],
200
263
  'codex': ['CODEX.md'],
201
264
  'openclaw': ['.openclaw'],
202
265
  'hermes-agent': ['HERMES.md'],
@@ -205,7 +268,10 @@ class InitManager {
205
268
  for (const env of envs) {
206
269
  const targets = cleanupMap[env] ?? [];
207
270
  for (const target of targets) {
208
- await fs.rm(path.join(this.cwd, target), { recursive: true, force: true });
271
+ const baseDir = (env === 'claude-code' && this.resolvedSkillsDir === 'user')
272
+ ? os.homedir()
273
+ : this.cwd;
274
+ await fs.rm(path.join(baseDir, target), { recursive: true, force: true });
209
275
  }
210
276
  }
211
277
  }