@nova286/nova-workflow 2.1.0 → 2.2.2

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/README.md +113 -36
  2. package/dist/cli/commands/archive.js +1 -1
  3. package/dist/cli/commands/archive.js.map +1 -1
  4. package/dist/cli/commands/init.js +3 -1
  5. package/dist/cli/commands/init.js.map +1 -1
  6. package/dist/cli/commands/status.js +8 -8
  7. package/dist/cli/commands/status.js.map +1 -1
  8. package/dist/cli/index.js +6 -1
  9. package/dist/cli/index.js.map +1 -1
  10. package/dist/cli-core/__tests__/adapters.test.d.ts +1 -0
  11. package/dist/cli-core/__tests__/adapters.test.js +123 -0
  12. package/dist/cli-core/__tests__/adapters.test.js.map +1 -0
  13. package/dist/cli-core/__tests__/context-generator.test.js +31 -0
  14. package/dist/cli-core/__tests__/context-generator.test.js.map +1 -1
  15. package/dist/cli-core/__tests__/dispatcher.test.js +22 -0
  16. package/dist/cli-core/__tests__/dispatcher.test.js.map +1 -1
  17. package/dist/cli-core/__tests__/guard.test.js +54 -14
  18. package/dist/cli-core/__tests__/guard.test.js.map +1 -1
  19. package/dist/cli-core/__tests__/init-manager.test.js +80 -23
  20. package/dist/cli-core/__tests__/init-manager.test.js.map +1 -1
  21. package/dist/cli-core/__tests__/pipeline.test.js +22 -0
  22. package/dist/cli-core/__tests__/pipeline.test.js.map +1 -1
  23. package/dist/cli-core/__tests__/platform-client.test.d.ts +1 -0
  24. package/dist/cli-core/__tests__/platform-client.test.js +157 -0
  25. package/dist/cli-core/__tests__/platform-client.test.js.map +1 -0
  26. package/dist/cli-core/__tests__/state-manager.test.js +7 -7
  27. package/dist/cli-core/__tests__/state-manager.test.js.map +1 -1
  28. package/dist/cli-core/adapters/claude-code.d.ts +5 -3
  29. package/dist/cli-core/adapters/claude-code.js +95 -47
  30. package/dist/cli-core/adapters/claude-code.js.map +1 -1
  31. package/dist/cli-core/adapters/codex.d.ts +5 -0
  32. package/dist/cli-core/adapters/codex.js +124 -0
  33. package/dist/cli-core/adapters/codex.js.map +1 -0
  34. package/dist/cli-core/adapters/hermes-agent.d.ts +5 -0
  35. package/dist/cli-core/adapters/hermes-agent.js +119 -0
  36. package/dist/cli-core/adapters/hermes-agent.js.map +1 -0
  37. package/dist/cli-core/adapters/openclaw.d.ts +5 -0
  38. package/dist/cli-core/adapters/openclaw.js +121 -0
  39. package/dist/cli-core/adapters/openclaw.js.map +1 -0
  40. package/dist/cli-core/adapters/opencode.d.ts +5 -0
  41. package/dist/cli-core/adapters/opencode.js +122 -0
  42. package/dist/cli-core/adapters/opencode.js.map +1 -0
  43. package/dist/cli-core/context-generator.js +44 -2
  44. package/dist/cli-core/context-generator.js.map +1 -1
  45. package/dist/cli-core/guard.js +16 -12
  46. package/dist/cli-core/guard.js.map +1 -1
  47. package/dist/cli-core/init-manager.d.ts +4 -0
  48. package/dist/cli-core/init-manager.js +89 -10
  49. package/dist/cli-core/init-manager.js.map +1 -1
  50. package/dist/cli-core/platform-client.d.ts +12 -0
  51. package/dist/cli-core/platform-client.js +150 -9
  52. package/dist/cli-core/platform-client.js.map +1 -1
  53. package/dist/cli-core/quality-check.d.ts +1 -0
  54. package/dist/cli-core/quality-check.js +23 -0
  55. package/dist/cli-core/quality-check.js.map +1 -1
  56. package/dist/cli-core/types.d.ts +46 -1
  57. package/package.json +17 -4
@@ -46,9 +46,9 @@ describe('StateManager', () => {
46
46
  project: 'test-project',
47
47
  environment: ['claude-code'],
48
48
  phases: {
49
- open: { status: 'pending', proposal: '' },
49
+ propose: { status: 'pending', proposal: '' },
50
50
  design: { status: 'pending', designDoc: '', tasks: [] },
51
- build: { status: 'pending', tasks: {} },
51
+ implement: { status: 'pending', tasks: {} },
52
52
  verify: { status: 'pending', pipelineResult: null },
53
53
  archive: { status: 'pending' },
54
54
  },
@@ -75,21 +75,21 @@ describe('StateManager', () => {
75
75
  test('update atomically modifies state', async () => {
76
76
  await writeState(baseState);
77
77
  const next = await state_1.StateManager.update((s) => {
78
- s.phases.open.status = 'done';
78
+ s.phases.propose.status = 'done';
79
79
  return s;
80
80
  });
81
- expect(next.phases.open.status).toBe('done');
81
+ expect(next.phases.propose.status).toBe('done');
82
82
  expect(next.metadata.stateVersion).toBe(1);
83
83
  expect(next.metadata.lastModified).toBeTruthy();
84
84
  const raw = await fs.readFile('.nova.yaml', 'utf-8');
85
85
  const disk = yaml.parse(raw);
86
- expect(disk.phases.open.status).toBe('done');
86
+ expect(disk.phases.propose.status).toBe('done');
87
87
  });
88
88
  test('setPhaseField updates a single phase field', async () => {
89
89
  await writeState(baseState);
90
- await state_1.StateManager.setPhaseField('build', 'status', 'in-progress');
90
+ await state_1.StateManager.setPhaseField('implement', 'status', 'in-progress');
91
91
  const state = await state_1.StateManager.load();
92
- expect(state.phases.build.status).toBe('in-progress');
92
+ expect(state.phases.implement.status).toBe('in-progress');
93
93
  });
94
94
  test('getTask finds task by id', async () => {
95
95
  const stateWithTasks = {
@@ -1 +1 @@
1
- {"version":3,"file":"state-manager.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/state-manager.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAC7B,uCAAyB;AACzB,2CAA6B;AAC7B,oCAAwC;AAExC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,OAAe,CAAC;IACpB,IAAI,WAAmB,CAAC;IAExB,MAAM,SAAS,GAAG;QAChB,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,cAAc;QACvB,WAAW,EAAE,CAAC,aAAa,CAAC;QAC5B,MAAM,EAAE;YACN,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;YACzC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACvD,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;YACvC,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE;YACnD,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;SAC/B;QACD,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;KAC7D,CAAC;IAEF,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;QAClE,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC3B,MAAM,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,UAAU,CAAC,IAAS;QACjC,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,oBAAY,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,oBAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YAC9B,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC;QAEhD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,oBAAY,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;QAEnE,MAAM,KAAK,GAAG,MAAM,oBAAY,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QAC1C,MAAM,cAAc,GAAG;YACrB,GAAG,SAAS;YACZ,MAAM,EAAE;gBACN,GAAG,SAAS,CAAC,MAAM;gBACnB,MAAM,EAAE;oBACN,GAAG,SAAS,CAAC,MAAM,CAAC,MAAM;oBAC1B,KAAK,EAAE;wBACL,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE;wBACrC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE;qBACvC;iBACF;aACF;SACF,CAAC;QACF,MAAM,UAAU,CAAC,cAAc,CAAC,CAAC;QAEjC,MAAM,IAAI,GAAG,MAAM,oBAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QAC5B,MAAM,IAAI,GAAG,MAAM,oBAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"state-manager.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/state-manager.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,8 @@
1
- import { EnvironmentAdapter } from '../types';
1
+ import { EnvironmentAdapter, AdapterSetupOptions } from '../types';
2
2
  export declare class ClaudeCodeAdapter implements EnvironmentAdapter {
3
3
  name: string;
4
- setup(cwd: string): Promise<void>;
5
- private writeCommand;
4
+ setup(cwd: string, options?: AdapterSetupOptions): Promise<void>;
5
+ private writeToSharedSkills;
6
+ private writeToProjectSkills;
7
+ private writeSkillFile;
6
8
  }
@@ -36,6 +36,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.ClaudeCodeAdapter = void 0;
37
37
  const fs = __importStar(require("fs/promises"));
38
38
  const path = __importStar(require("path"));
39
+ const os = __importStar(require("os"));
40
+ const crypto = __importStar(require("crypto"));
39
41
  const SKILL_TEMPLATES = {
40
42
  'nova.md': `---
41
43
  description: Nova — unified entry point. Shows progress and suggests next action.
@@ -79,16 +81,17 @@ Ask: "Run the suggested action, pick another, or do something else?"
79
81
  Read-only unless the user explicitly confirms an action.
80
82
  `,
81
83
  'nova-propose.md': `---
82
- description: Nova propose phase — generate a feature proposal from interactive Q&A
84
+ description: Nova propose phase — specify an OpenSpec-compatible change contract
83
85
  ---
84
86
 
85
87
  # Nova Propose Phase
86
88
 
87
89
  You are executing the **propose phase** of a Nova workflow. Your role is to
88
- orchestrate requirements exploration and produce a structured proposal document.
90
+ orchestrate requirements exploration and produce an OpenSpec-compatible change
91
+ contract. Native OpenSpec is optional; if unavailable, write compatible artifacts.
89
92
 
90
93
  ## Step 1: Verify State
91
- Read \`.nova.yaml\`. Check \`phases.open.status\`. If pending, update to
94
+ Read \`.nova.yaml\`. Check \`phases.propose.status\`. If pending, update to
92
95
  \`in-progress\` and set \`startedAt\`.
93
96
 
94
97
  ## Step 2: Gather Context
@@ -101,34 +104,35 @@ explore alternatives, identify risks, define success criteria. Summarize for the
101
104
  user and ask them to confirm before proceeding.
102
105
 
103
106
  ## Step 4: Generate Proposal
104
- Write \`docs/proposals/proposal.md\` with: Problem Statement, Proposed Solution,
105
- User Stories (prioritized), Scope & Deliverables (in/out), Success Criteria
106
- (measurable), Risks & Constraints.
107
+ Write \`.openspec/changes/<change-id>/proposal.md\`, compatible spec files under
108
+ \`.openspec/changes/<change-id>/specs/\`, and \`docs/proposals/proposal.md\` as
109
+ a summary. Include requirement ids and acceptance ids for later task references.
107
110
 
108
111
  ## Step 5: Update State
109
- Set \`phases.open.status = 'in-progress'\`,
110
- \`phases.open.proposal = 'docs/proposals/proposal.md'\`.
112
+ Set \`activeChange\`, \`artifacts.openspecChange\`, \`artifacts.proposal\`,
113
+ \`artifacts.specDelta\`, \`phases.propose.status\`, and
114
+ \`phases.propose.proposal\`.
111
115
 
112
116
  ## Constraints
113
117
  - Read any file for context. Write only to \`docs/proposals/\` and \`.nova.yaml\`.
114
118
  - Do not modify source code — the implement phase handles that.
115
119
  `,
116
120
  'nova-design.md': `---
117
- description: Nova design phase — generate technical design from approved proposal
121
+ description: Nova design phase — plan spec-bound work from an approved change
118
122
  ---
119
123
 
120
124
  # Nova Design Phase
121
125
 
122
- You are executing the **design phase** of a Nova workflow. Your role is to
123
- orchestrate architecture exploration and produce a design document with an
124
- actionable task list.
126
+ You are executing the **design phase** of a Nova workflow. Your role is to turn
127
+ the OpenSpec-compatible change into a Superpowers-compatible plan and task graph.
125
128
 
126
129
  ## Step 1: Verify State
127
- Read \`.nova.yaml\`. Require \`phases.open.status: done\` with a non-empty proposal.
130
+ Read \`.nova.yaml\`. Require \`phases.propose.status: done\` with a non-empty proposal.
128
131
  Update \`phases.design.status\` to \`in-progress\` and set \`startedAt\`.
129
132
 
130
133
  ## Step 2: Load Context
131
- Read the proposal (\`phases.open.proposal\`), \`AGENTS.md\`, \`package.json\`, \`src/\`.
134
+ Read the proposal/spec delta (\`artifacts.proposal\`, \`artifacts.openspecChange\`),
135
+ \`AGENTS.md\`, \`package.json\`, \`src/\`.
132
136
 
133
137
  ## Step 3: Explore Architecture Options
134
138
  Use the **brainstorming skill** to explore at least 2 architectural approaches.
@@ -137,8 +141,9 @@ flow, key trade-offs. Present alternatives to the user for selection.
137
141
 
138
142
  ## Step 4: Generate Design Document
139
143
  Based on the user-selected approach, use the **writing-plans skill** to produce
140
- \`docs/designs/design.md\` with: Architecture Overview, Tech Stack, Component
141
- Breakdown, Data Flow, Implementation Plan (YAML task list), Risks & Mitigations.
144
+ \`docs/designs/design.md\` and \`docs/superpowers/plans/<change-id>.md\`.
145
+ Tasks must include \`method\`, \`specRefs\`, \`acceptanceRefs\`, and
146
+ \`verification.commands\`.
142
147
 
143
148
  ## Step 5: Validate Tasks
144
149
  Verify each task has all required fields (id, title, type, description, files,
@@ -152,82 +157,92 @@ Set \`phases.design.status = 'done'\`, \`designDoc\`, \`tasks\` from parsed YAML
152
157
  - Tasks must be concrete: specific file paths, verifiable acceptance criteria.
153
158
  `,
154
159
  'nova-implement.md': `---
155
- description: Nova implement phase — execute design tasks with retry and tracing
160
+ description: Nova implement phase — execute spec-bound tasks with evidence
156
161
  ---
157
162
 
158
163
  # Nova Implement Phase
159
164
 
160
165
  You are executing the **implement phase** of a Nova workflow. Your role is to
161
- execute each task from the design phase, routing by task type.
166
+ execute each task as a spec-bound unit of work: resolve spec refs, apply the
167
+ task method, verify the result, and record evidence for review.
162
168
 
163
169
  ## Step 1: Verify State
164
170
  Read \`.nova.yaml\`. Require \`phases.design.status: done\` with non-empty tasks.
165
- Update \`phases.build.status\` to \`in-progress\` and set \`startedAt\`.
171
+ Update \`phases.implement.status\` to \`in-progress\` and set \`startedAt\`.
166
172
 
167
173
  ## Step 2: Load Task List
168
- Show task summary (id, title, type, priority). Ask user to confirm before
174
+ Show task summary (id, title, method, specRefs, priority). Ask user to confirm before
169
175
  proceeding.
170
176
 
171
177
  ## Step 3: Execute Each Task
172
178
  For each task in priority order:
173
179
 
174
- ### Route by Task Type
175
- - **implementation** — write production code following project conventions
176
- - **testing** — use the **test-driven-development skill**
177
- - **design** — update design documents (noted for user review)
180
+ ### Route by Method
181
+ - **tdd** — use the **test-driven-development skill** when available
182
+ - **implementation** — write scoped production code with tests or no-test rationale
183
+ - **refactor** — preserve referenced spec behavior and run regression checks
184
+ - **docs** — update docs/specs and validate references
185
+ - **migration** — require dry-run, rollback notes, and compatibility evidence
178
186
 
179
187
  ### Verify After Each Task
180
- 1. Run type check (\`npx tsc --noEmit\`)
181
- 2. Run tests (\`npx jest --no-coverage\`)
182
- 3. Fix before marking complete
188
+ 1. Run \`task.verification.commands\` if present
189
+ 2. Run type check (\`npx tsc --noEmit\`)
190
+ 3. Run tests (\`npm test\` or project equivalent)
191
+ 4. Confirm specRefs and acceptanceRefs have evidence before marking complete
183
192
 
184
193
  ### Record Result
185
- Update \`.nova.yaml\` with task status (done/failed) and timestamp.
194
+ Update \`.nova.yaml\` with task status, specRefs, acceptanceRefs, tests,
195
+ filesChanged, traceIds, and timestamp.
186
196
  On failure, ask user: abort, skip, or retry.
187
197
 
188
198
  ## Step 4: Final Verification
189
199
  Run full test suite and type check. Report summary.
190
200
 
191
201
  ## Step 5: Update State
192
- Set \`phases.build.status = 'done'\`.
202
+ Set \`phases.implement.status = 'done'\`.
193
203
 
194
204
  ## Constraints
195
205
  - Follow existing project conventions. Never leave TODOs or stubs.
196
206
  - Run checks after EACH task, not just at the end.
197
207
  `,
198
208
  'nova-verify.md': `---
199
- description: Nova verify phase — run code review and security review pipeline
209
+ description: Nova verify phase — run spec conformance, code, and security review
200
210
  ---
201
211
 
202
212
  # Nova Verify Phase
203
213
 
204
214
  You are executing the **verify phase** of a Nova workflow. Your role is to
205
- orchestrate a verification pipeline using ECC review skills.
215
+ orchestrate an ECC-compatible verification pipeline.
206
216
 
207
217
  ## Step 1: Verify State
208
- Read \`.nova.yaml\`. Require \`phases.build.status: done\`.
218
+ Read \`.nova.yaml\`. Require \`phases.implement.status: done\`.
209
219
  Update \`phases.verify.status\` to \`in-progress\` and set \`startedAt\`.
210
220
 
211
221
  ## Step 2: Gather Context
212
- Load completed tasks from \`phases.design.tasks\`. Read changed files and the
213
- design document.
222
+ Load completed tasks from \`phases.design.tasks\`. Read changed files, task
223
+ evidence, the design document, and \`artifacts.openspecChange\`.
214
224
 
215
- ## Step 3: Run Code Review
225
+ ## Step 3: Run Spec-Conformance Review
226
+ Compare task evidence against \`specRefs\` and \`acceptanceRefs\`. Verdict:
227
+ PASS / CHANGES_REQUESTED / BLOCKED.
228
+
229
+ ## Step 4: Run Code Review
216
230
  Use the **ecc:code-reviewer** skill to review each task's changed files:
217
231
  correctness, conventions, error handling, test coverage, type safety.
218
232
  Verdict: PASS / CHANGES_REQUESTED / COMMENT.
219
233
 
220
- ## Step 4: Run Security Review
234
+ ## Step 5: Run Security Review
221
235
  Use the **ecc:security-reviewer** skill to audit each task's changed files:
222
236
  injection risks, secret exposure, insecure dependencies, input validation.
223
237
  Verdict: PASS / VULNERABILITY_FOUND. Include severity and remediation.
224
238
 
225
- ## Step 5: Generate Report
226
- Write \`docs/designs/verification-report.md\` with summary, per-task results,
239
+ ## Step 6: Generate Report
240
+ Write \`docs/reports/verification-report.md\` with summary, spec-conformance results, per-task results,
227
241
  overall assessment (PASS / NEEDS_FIXES / BLOCKED), and recommendations.
228
242
 
229
- ## Step 6: Update State
243
+ ## Step 7: Update State
230
244
  Set \`phases.verify.status = 'done'\`, \`pipelineResult\` with stage results.
245
+ Set \`artifacts.verificationReport = 'docs/reports/verification-report.md'\`.
231
246
 
232
247
  ## Constraints
233
248
  - Be specific — reference file paths and line numbers.
@@ -290,18 +305,51 @@ class ClaudeCodeAdapter {
290
305
  constructor() {
291
306
  this.name = 'claude-code';
292
307
  }
293
- async setup(cwd) {
294
- const dir = path.join(cwd, '.claude', 'commands');
295
- await fs.mkdir(dir, { recursive: true });
308
+ async setup(cwd, options) {
309
+ if (options?.skillsDir === 'user') {
310
+ await this.writeToSharedSkills();
311
+ }
312
+ else {
313
+ await this.writeToProjectSkills(cwd);
314
+ }
315
+ }
316
+ async writeToSharedSkills() {
317
+ const agentsSkillsDir = path.join(os.homedir(), '.agents', 'skills');
318
+ const claudeSkillsDir = path.join(os.homedir(), '.claude', 'skills');
319
+ for (const [filename, content] of Object.entries(SKILL_TEMPLATES)) {
320
+ const skillName = filename.replace('.md', '');
321
+ const skillDir = path.join(agentsSkillsDir, skillName);
322
+ await fs.mkdir(skillDir, { recursive: true });
323
+ await this.writeSkillFile(path.join(skillDir, 'SKILL.md'), content);
324
+ // Create symlink in ~/.claude/skills/ for Claude Code discovery
325
+ const linkPath = path.join(claudeSkillsDir, skillName);
326
+ try {
327
+ await fs.access(linkPath);
328
+ continue;
329
+ }
330
+ catch { }
331
+ try {
332
+ await fs.symlink(skillDir, linkPath);
333
+ }
334
+ catch { }
335
+ }
336
+ }
337
+ async writeToProjectSkills(cwd) {
338
+ const skillsDir = path.join(cwd, '.claude', 'skills');
296
339
  for (const [filename, content] of Object.entries(SKILL_TEMPLATES)) {
297
- await this.writeCommand(dir, filename, content);
340
+ const skillName = filename.replace('.md', '');
341
+ const skillDir = path.join(skillsDir, skillName);
342
+ await fs.mkdir(skillDir, { recursive: true });
343
+ await this.writeSkillFile(path.join(skillDir, 'SKILL.md'), content);
298
344
  }
299
345
  }
300
- async writeCommand(dir, file, content) {
301
- const filePath = path.join(dir, file);
346
+ async writeSkillFile(filePath, content) {
347
+ const newHash = crypto.createHash('md5').update(content).digest('hex');
302
348
  try {
303
- await fs.access(filePath);
304
- return;
349
+ const existing = await fs.readFile(filePath, 'utf-8');
350
+ const oldHash = crypto.createHash('md5').update(existing).digest('hex');
351
+ if (oldHash === newHash)
352
+ return;
305
353
  }
306
354
  catch { }
307
355
  await fs.writeFile(filePath, content);
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/claude-code.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAG7B,MAAM,eAAe,GAA2B;IAC9C,SAAS,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCZ;IAEC,iBAAiB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCpB;IAEC,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCnB;IAEC,mBAAmB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CtB;IAEC,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCnB;IAEC,iBAAiB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCpB;IAEC,gBAAgB,EAAE;;;;;;;;;;;;;;;;;;CAkBnB;CACA,CAAC;AAEF,MAAa,iBAAiB;IAA9B;QACE,SAAI,GAAG,aAAa,CAAC;IAavB,CAAC;IAZC,KAAK,CAAC,KAAK,CAAC,GAAW;QACrB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;QAClD,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;YAClE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IACO,KAAK,CAAC,YAAY,CAAC,GAAW,EAAE,IAAY,EAAE,OAAe;QACnE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC;YAAC,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACnD,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;CACF;AAdD,8CAcC"}
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { EnvironmentAdapter } from '../types';
2
+ export declare class CodexAdapter implements EnvironmentAdapter {
3
+ name: string;
4
+ setup(cwd: string): Promise<void>;
5
+ }
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.CodexAdapter = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const CODEX_INSTRUCTIONS = `# Nova Workflow
40
+
41
+ This project uses Nova — an AI-assisted development workflow with 5 phases.
42
+ Nova orchestrates OpenSpec-compatible specs, Superpowers-compatible execution,
43
+ and ECC-compatible review. All state is in \`.nova.yaml\`. Always read it first.
44
+
45
+ ## How to Use
46
+
47
+ ### Check Status
48
+ \`\`\`
49
+ 读取 .nova.yaml,告诉我当前在哪个阶段,下一步该做什么
50
+ \`\`\`
51
+
52
+ ### Phase 1: Propose (提案)
53
+ \`\`\`
54
+ 帮我为"{你的需求描述}"创建 OpenSpec-compatible change。
55
+ 1. 先读 .nova.yaml 和已有代码了解项目
56
+ 2. 问 3-4 个澄清问题
57
+ 3. 写入 .openspec/changes/<change-id>/proposal.md 和 specs
58
+ 4. 更新 .nova.yaml: activeChange, artifacts.*, phases.propose.status = done
59
+ \`\`\`
60
+
61
+ ### Phase 2: Design (设计)
62
+ \`\`\`
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 = 解析后的列表
68
+ \`\`\`
69
+
70
+ ### Phase 3: Implement (实现)
71
+ \`\`\`
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
79
+ \`\`\`
80
+
81
+ ### Phase 4: Verify (验证)
82
+ \`\`\`
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
89
+ \`\`\`
90
+
91
+ ### Phase 5: Archive (归档)
92
+ \`\`\`
93
+ 运行 nova archive 合并产物并清理
94
+ \`\`\`
95
+
96
+ ### Iteration (回退)
97
+ \`\`\`
98
+ 我想回退到 {propose/design/implement} 阶段重新做
99
+ \`\`\`
100
+
101
+ ## Key Rules
102
+
103
+ - Always read \`.nova.yaml\` before any action
104
+ - After each task, run task verification commands, then project checks when needed
105
+ - Do not mark a task done without spec/acceptance evidence
106
+ - Never leave TODOs or stubs
107
+ - Update \`.nova.yaml\` status after each phase transition
108
+ `;
109
+ class CodexAdapter {
110
+ constructor() {
111
+ this.name = 'codex';
112
+ }
113
+ async setup(cwd) {
114
+ const filePath = path.join(cwd, 'CODEX.md');
115
+ try {
116
+ await fs.access(filePath);
117
+ return; // don't overwrite
118
+ }
119
+ catch { }
120
+ await fs.writeFile(filePath, CODEX_INSTRUCTIONS, 'utf-8');
121
+ }
122
+ }
123
+ exports.CodexAdapter = CodexAdapter;
124
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -0,0 +1,5 @@
1
+ import { EnvironmentAdapter } from '../types';
2
+ export declare class HermesAgentAdapter implements EnvironmentAdapter {
3
+ name: string;
4
+ setup(cwd: string): Promise<void>;
5
+ }
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.HermesAgentAdapter = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const HERMES_INSTRUCTIONS = `# Nova Workflow
40
+
41
+ This project uses Nova — an AI-assisted development workflow with 5 phases.
42
+ Nova orchestrates OpenSpec-compatible specs, Superpowers-compatible execution,
43
+ and ECC-compatible review. All state is in \`.nova.yaml\`. Always read it first.
44
+
45
+ ## How to Use
46
+
47
+ ### Check Status
48
+ \`\`\`
49
+ 读取 .nova.yaml,告诉我当前在哪个阶段,下一步该做什么
50
+ \`\`\`
51
+
52
+ ### Phase 1: Propose (提案)
53
+ \`\`\`
54
+ 帮我为"{你的需求描述}"创建 OpenSpec-compatible change。
55
+ 1. 先读 .nova.yaml 和已有代码了解项目
56
+ 2. 问 3-4 个澄清问题
57
+ 3. 写入 .openspec/changes/<change-id>/proposal.md 和 specs
58
+ 4. 更新 .nova.yaml: activeChange, artifacts.*, phases.propose.status = done
59
+ \`\`\`
60
+
61
+ ### Phase 2: Design (设计)
62
+ \`\`\`
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 = 解析后的列表
68
+ \`\`\`
69
+
70
+ ### Phase 3: Implement (实现)
71
+ \`\`\`
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
79
+ \`\`\`
80
+
81
+ ### Phase 4: Verify (验证)
82
+ \`\`\`
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
89
+ \`\`\`
90
+
91
+ ### Phase 5: Archive (归档)
92
+ \`\`\`
93
+ 运行 nova archive 合并产物并清理
94
+ \`\`\`
95
+
96
+ ## Key Rules
97
+
98
+ - Always read \`.nova.yaml\` before any action
99
+ - After each task, run task verification commands, then project checks when needed
100
+ - Do not mark a task done without spec/acceptance evidence
101
+ - Never leave TODOs or stubs
102
+ - Update \`.nova.yaml\` status after each phase transition
103
+ `;
104
+ class HermesAgentAdapter {
105
+ constructor() {
106
+ this.name = 'hermes-agent';
107
+ }
108
+ async setup(cwd) {
109
+ const filePath = path.join(cwd, 'HERMES.md');
110
+ try {
111
+ await fs.access(filePath);
112
+ return;
113
+ }
114
+ catch { }
115
+ await fs.writeFile(filePath, HERMES_INSTRUCTIONS, 'utf-8');
116
+ }
117
+ }
118
+ exports.HermesAgentAdapter = HermesAgentAdapter;
119
+ //# sourceMappingURL=hermes-agent.js.map
@@ -0,0 +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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -0,0 +1,5 @@
1
+ import { EnvironmentAdapter } from '../types';
2
+ export declare class OpenClawAdapter implements EnvironmentAdapter {
3
+ name: string;
4
+ setup(cwd: string): Promise<void>;
5
+ }