@nova286/nova-workflow 2.1.1 → 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.
- package/README.md +113 -36
- package/dist/cli/commands/init.js +3 -1
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/index.js +6 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli-core/__tests__/context-generator.test.js +31 -0
- package/dist/cli-core/__tests__/context-generator.test.js.map +1 -1
- package/dist/cli-core/__tests__/dispatcher.test.js +22 -0
- package/dist/cli-core/__tests__/dispatcher.test.js.map +1 -1
- package/dist/cli-core/__tests__/guard.test.js +41 -1
- package/dist/cli-core/__tests__/guard.test.js.map +1 -1
- package/dist/cli-core/__tests__/init-manager.test.js +77 -20
- package/dist/cli-core/__tests__/init-manager.test.js.map +1 -1
- package/dist/cli-core/__tests__/pipeline.test.js +22 -0
- package/dist/cli-core/__tests__/pipeline.test.js.map +1 -1
- package/dist/cli-core/adapters/claude-code.d.ts +5 -3
- package/dist/cli-core/adapters/claude-code.js +90 -42
- package/dist/cli-core/adapters/claude-code.js.map +1 -1
- package/dist/cli-core/adapters/codex.js +25 -19
- package/dist/cli-core/adapters/codex.js.map +1 -1
- package/dist/cli-core/adapters/hermes-agent.js +25 -19
- package/dist/cli-core/adapters/hermes-agent.js.map +1 -1
- package/dist/cli-core/adapters/openclaw.js +25 -19
- package/dist/cli-core/adapters/openclaw.js.map +1 -1
- package/dist/cli-core/adapters/opencode.js +25 -19
- package/dist/cli-core/adapters/opencode.js.map +1 -1
- package/dist/cli-core/context-generator.js +44 -2
- package/dist/cli-core/context-generator.js.map +1 -1
- package/dist/cli-core/guard.js +4 -0
- package/dist/cli-core/guard.js.map +1 -1
- package/dist/cli-core/init-manager.d.ts +3 -0
- package/dist/cli-core/init-manager.js +43 -4
- package/dist/cli-core/init-manager.js.map +1 -1
- package/dist/cli-core/quality-check.d.ts +1 -0
- package/dist/cli-core/quality-check.js +23 -0
- package/dist/cli-core/quality-check.js.map +1 -1
- package/dist/cli-core/types.d.ts +46 -1
- package/package.json +1 -1
|
@@ -58,7 +58,7 @@ describe('InitManager', () => {
|
|
|
58
58
|
});
|
|
59
59
|
test('force re-init proceeds and creates new state', async () => {
|
|
60
60
|
await fs.writeFile('.nova.yaml', 'version: 1\nproject: old\n', 'utf-8');
|
|
61
|
-
const mgr = new init_manager_1.InitManager(testDir, { force: true });
|
|
61
|
+
const mgr = new init_manager_1.InitManager(testDir, { force: true, skillsDir: 'project' });
|
|
62
62
|
await mgr.run();
|
|
63
63
|
const raw = await fs.readFile('.nova.yaml', 'utf-8');
|
|
64
64
|
const state = yaml.parse(raw);
|
|
@@ -67,9 +67,9 @@ describe('InitManager', () => {
|
|
|
67
67
|
});
|
|
68
68
|
describe('directory creation', () => {
|
|
69
69
|
test('creates all required directories', async () => {
|
|
70
|
-
const mgr = new init_manager_1.InitManager(testDir, { force: false });
|
|
70
|
+
const mgr = new init_manager_1.InitManager(testDir, { force: false, skillsDir: 'project' });
|
|
71
71
|
await mgr.run();
|
|
72
|
-
const dirs = ['docs/designs', 'docs/proposals', 'docs/reports', '.nova/contexts'];
|
|
72
|
+
const dirs = ['docs/designs', 'docs/proposals', 'docs/reports', '.nova/contexts', '.openspec/changes'];
|
|
73
73
|
for (const d of dirs) {
|
|
74
74
|
await expect(fs.access(path.join(testDir, d))).resolves.toBeUndefined();
|
|
75
75
|
}
|
|
@@ -77,7 +77,7 @@ describe('InitManager', () => {
|
|
|
77
77
|
});
|
|
78
78
|
describe('.nova.yaml generation', () => {
|
|
79
79
|
test('generates valid .nova.yaml with correct structure', async () => {
|
|
80
|
-
const mgr = new init_manager_1.InitManager(testDir, { force: false });
|
|
80
|
+
const mgr = new init_manager_1.InitManager(testDir, { force: false, skillsDir: 'project' });
|
|
81
81
|
await mgr.run();
|
|
82
82
|
const raw = await fs.readFile('.nova.yaml', 'utf-8');
|
|
83
83
|
const state = yaml.parse(raw);
|
|
@@ -89,12 +89,25 @@ describe('InitManager', () => {
|
|
|
89
89
|
expect(state.phases.implement.status).toBe('pending');
|
|
90
90
|
expect(state.phases.verify.status).toBe('pending');
|
|
91
91
|
expect(state.phases.archive.status).toBe('pending');
|
|
92
|
+
expect(state.activeChange).toBe('');
|
|
93
|
+
expect(state.integrations).toEqual({
|
|
94
|
+
openspec: { mode: 'compatible' },
|
|
95
|
+
superpowers: { mode: 'compatible' },
|
|
96
|
+
ecc: { mode: 'compatible' },
|
|
97
|
+
});
|
|
98
|
+
expect(state.artifacts).toEqual({
|
|
99
|
+
openspecChange: '',
|
|
100
|
+
proposal: '',
|
|
101
|
+
specDelta: '',
|
|
102
|
+
implementationPlan: '',
|
|
103
|
+
verificationReport: '',
|
|
104
|
+
});
|
|
92
105
|
expect(state.metadata.stateVersion).toBe(0);
|
|
93
106
|
expect(state.metadata.lastModified).toBeTruthy();
|
|
94
107
|
});
|
|
95
108
|
test('detects project type when package.json exists', async () => {
|
|
96
109
|
await fs.writeFile('package.json', JSON.stringify({ name: 'test-pkg', dependencies: { express: '^4.0.0' } }), 'utf-8');
|
|
97
|
-
const mgr = new init_manager_1.InitManager(testDir, { force: false });
|
|
110
|
+
const mgr = new init_manager_1.InitManager(testDir, { force: false, skillsDir: 'project' });
|
|
98
111
|
await mgr.run();
|
|
99
112
|
const raw = await fs.readFile('.nova.yaml', 'utf-8');
|
|
100
113
|
const state = yaml.parse(raw);
|
|
@@ -102,28 +115,72 @@ describe('InitManager', () => {
|
|
|
102
115
|
});
|
|
103
116
|
});
|
|
104
117
|
describe('environment command generation', () => {
|
|
105
|
-
test('generates all
|
|
106
|
-
const mgr = new init_manager_1.InitManager(testDir, { force: false });
|
|
118
|
+
test('generates all Nova skill dirs with SKILL.md in project', async () => {
|
|
119
|
+
const mgr = new init_manager_1.InitManager(testDir, { force: false, skillsDir: 'project' });
|
|
107
120
|
await mgr.run();
|
|
108
|
-
const
|
|
109
|
-
const
|
|
110
|
-
|
|
111
|
-
expect(
|
|
112
|
-
expect(
|
|
113
|
-
expect(
|
|
114
|
-
expect(
|
|
115
|
-
expect(
|
|
116
|
-
|
|
117
|
-
|
|
121
|
+
const skillsDir = path.join(testDir, '.claude', 'skills');
|
|
122
|
+
const dirs = await fs.readdir(skillsDir);
|
|
123
|
+
const novaDirs = dirs.filter(d => d.startsWith('nova'));
|
|
124
|
+
expect(novaDirs).toContain('nova');
|
|
125
|
+
expect(novaDirs).toContain('nova-propose');
|
|
126
|
+
expect(novaDirs).toContain('nova-design');
|
|
127
|
+
expect(novaDirs).toContain('nova-implement');
|
|
128
|
+
expect(novaDirs).toContain('nova-verify');
|
|
129
|
+
expect(novaDirs).toContain('nova-iterate');
|
|
130
|
+
expect(novaDirs).toContain('nova-status');
|
|
131
|
+
for (const d of novaDirs) {
|
|
132
|
+
const content = await fs.readFile(path.join(skillsDir, d, 'SKILL.md'), 'utf-8');
|
|
118
133
|
expect(content).toContain('description:');
|
|
119
134
|
}
|
|
120
135
|
});
|
|
136
|
+
test('generates Nova skills in ~/.agents/skills/ with symlinks when skillsDir=user', async () => {
|
|
137
|
+
const agentsSkillsDir = path.join(os.homedir(), '.agents', 'skills');
|
|
138
|
+
const claudeSkillsDir = path.join(os.homedir(), '.claude', 'skills');
|
|
139
|
+
const existingDirs = new Set();
|
|
140
|
+
const existingLinks = new Set();
|
|
141
|
+
try {
|
|
142
|
+
for (const f of await fs.readdir(agentsSkillsDir)) {
|
|
143
|
+
if (f.startsWith('nova'))
|
|
144
|
+
existingDirs.add(f);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch { }
|
|
148
|
+
try {
|
|
149
|
+
for (const f of await fs.readdir(claudeSkillsDir)) {
|
|
150
|
+
if (f.startsWith('nova'))
|
|
151
|
+
existingLinks.add(f);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
catch { }
|
|
155
|
+
const mgr = new init_manager_1.InitManager(testDir, { force: false, skillsDir: 'user' });
|
|
156
|
+
await mgr.run();
|
|
157
|
+
// Verify SKILL.md exists in each nova dir
|
|
158
|
+
const dirs = await fs.readdir(agentsSkillsDir);
|
|
159
|
+
const novaDirs = dirs.filter(d => d.startsWith('nova'));
|
|
160
|
+
expect(novaDirs.length).toBeGreaterThanOrEqual(7);
|
|
161
|
+
for (const d of novaDirs) {
|
|
162
|
+
const content = await fs.readFile(path.join(agentsSkillsDir, d, 'SKILL.md'), 'utf-8');
|
|
163
|
+
expect(content).toContain('description:');
|
|
164
|
+
}
|
|
165
|
+
// Cleanup: remove dirs and symlinks we created
|
|
166
|
+
for (const d of novaDirs) {
|
|
167
|
+
if (!existingDirs.has(d)) {
|
|
168
|
+
await fs.rm(path.join(agentsSkillsDir, d), { recursive: true, force: true });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const links = (await fs.readdir(claudeSkillsDir)).filter(f => f.startsWith('nova'));
|
|
172
|
+
for (const l of links) {
|
|
173
|
+
if (!existingLinks.has(l)) {
|
|
174
|
+
await fs.unlink(path.join(claudeSkillsDir, l));
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
});
|
|
121
178
|
});
|
|
122
179
|
describe('ECC installation', () => {
|
|
123
180
|
test('copies ECC skills when --with-ecc provided', async () => {
|
|
124
181
|
const eccDir = await fs.mkdtemp(path.join(os.tmpdir(), 'ecc-src-'));
|
|
125
182
|
await fs.writeFile(path.join(eccDir, 'test-skill.md'), '# Test', 'utf-8');
|
|
126
|
-
const mgr = new init_manager_1.InitManager(testDir, { eccPath: eccDir });
|
|
183
|
+
const mgr = new init_manager_1.InitManager(testDir, { eccPath: eccDir, skillsDir: 'project' });
|
|
127
184
|
await mgr.run();
|
|
128
185
|
const destFile = path.join(testDir, '.nova', 'ecc', 'test-skill.md');
|
|
129
186
|
const content = await fs.readFile(destFile, 'utf-8');
|
|
@@ -131,7 +188,7 @@ describe('InitManager', () => {
|
|
|
131
188
|
await fs.rm(eccDir, { recursive: true, force: true });
|
|
132
189
|
});
|
|
133
190
|
test('creates empty .nova/ecc without --with-ecc', async () => {
|
|
134
|
-
const mgr = new init_manager_1.InitManager(testDir, { force: false });
|
|
191
|
+
const mgr = new init_manager_1.InitManager(testDir, { force: false, skillsDir: 'project' });
|
|
135
192
|
await mgr.run();
|
|
136
193
|
await expect(fs.access(path.join(testDir, '.nova', 'ecc'))).resolves.toBeUndefined();
|
|
137
194
|
const files = await fs.readdir(path.join(testDir, '.nova', 'ecc'));
|
|
@@ -140,7 +197,7 @@ describe('InitManager', () => {
|
|
|
140
197
|
});
|
|
141
198
|
describe('document templates', () => {
|
|
142
199
|
test('copies proposal and design templates to docs/', async () => {
|
|
143
|
-
const mgr = new init_manager_1.InitManager(testDir, { force: false });
|
|
200
|
+
const mgr = new init_manager_1.InitManager(testDir, { force: false, skillsDir: 'project' });
|
|
144
201
|
await mgr.run();
|
|
145
202
|
await expect(fs.access(path.join(testDir, 'docs', 'proposal.md'))).resolves.toBeUndefined();
|
|
146
203
|
await expect(fs.access(path.join(testDir, 'docs', 'design.md'))).resolves.toBeUndefined();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init-manager.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/init-manager.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAC7B,uCAAyB;AACzB,2CAA6B;AAC7B,kDAA8C;AAE9C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,OAAe,CAAC;IACpB,IAAI,WAAmB,CAAC;IAExB,UAAU,CAAC,KAAK,IAAI,EAAE;QACpB,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;QACjE,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,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACvE,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;YAC1D,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAEzC,MAAM,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QACtE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,4BAA4B,EAAE,OAAO,CAAC,CAAC;YAExE,MAAM,GAAG,GAAG,IAAI,0BAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"init-manager.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/init-manager.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,28 @@ const baseContext = {
|
|
|
26
26
|
environment: { language: '', framework: '', buildTool: '', testFramework: '' },
|
|
27
27
|
},
|
|
28
28
|
output: { expectedArtifacts: [], constraints: { mustPassTests: true } },
|
|
29
|
+
change: {
|
|
30
|
+
activeChange: '',
|
|
31
|
+
artifacts: {
|
|
32
|
+
openspecChange: '',
|
|
33
|
+
proposal: '',
|
|
34
|
+
specDelta: '',
|
|
35
|
+
implementationPlan: '',
|
|
36
|
+
verificationReport: '',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
methodology: {
|
|
40
|
+
openspec: { mode: 'compatible' },
|
|
41
|
+
superpowers: { mode: 'compatible' },
|
|
42
|
+
ecc: { mode: 'compatible' },
|
|
43
|
+
},
|
|
44
|
+
implementation: {
|
|
45
|
+
method: 'implementation',
|
|
46
|
+
specRefs: [],
|
|
47
|
+
acceptanceRefs: [],
|
|
48
|
+
},
|
|
49
|
+
verification: { commands: [] },
|
|
50
|
+
evidence: { required: [] },
|
|
29
51
|
acceptanceCriteria: [],
|
|
30
52
|
guardConditions: { requireReview: true, requireTests: true, blocking: false },
|
|
31
53
|
metadata: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/pipeline.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pipeline.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/pipeline.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
|
|
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,13 +81,14 @@ 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 —
|
|
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
|
|
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
94
|
Read \`.nova.yaml\`. Check \`phases.propose.status\`. If pending, update to
|
|
@@ -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
|
|
105
|
-
|
|
106
|
-
|
|
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 \`
|
|
110
|
-
\`phases.propose.
|
|
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 —
|
|
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
|
-
|
|
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
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 (\`
|
|
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\`
|
|
141
|
-
|
|
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,37 +157,42 @@ 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
|
|
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
|
|
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
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,
|
|
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
|
|
175
|
-
- **
|
|
176
|
-
- **
|
|
177
|
-
- **
|
|
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
|
|
181
|
-
2. Run
|
|
182
|
-
3.
|
|
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
|
|
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
|
|
@@ -196,38 +206,43 @@ Set \`phases.implement.status = 'done'\`.
|
|
|
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
|
|
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
|
|
215
|
+
orchestrate an ECC-compatible verification pipeline.
|
|
206
216
|
|
|
207
217
|
## Step 1: Verify State
|
|
208
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
|
|
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
|
|
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
|
|
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
|
|
226
|
-
Write \`docs/
|
|
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
|
|
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
|
-
|
|
295
|
-
|
|
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
|
-
|
|
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
|
|
301
|
-
const
|
|
346
|
+
async writeSkillFile(filePath, content) {
|
|
347
|
+
const newHash = crypto.createHash('md5').update(content).digest('hex');
|
|
302
348
|
try {
|
|
303
|
-
await fs.
|
|
304
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/cli-core/adapters/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
-
|
|
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
|
-
帮我为"{你的需求描述}"
|
|
54
|
+
帮我为"{你的需求描述}"创建 OpenSpec-compatible change。
|
|
54
55
|
1. 先读 .nova.yaml 和已有代码了解项目
|
|
55
56
|
2. 问 3-4 个澄清问题
|
|
56
|
-
3. 写入
|
|
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
|
-
读取
|
|
63
|
-
1. 读 proposal 和 src/ 了解架构
|
|
64
|
-
2. 写入 docs/designs/design.md
|
|
65
|
-
3.
|
|
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.
|
|
73
|
-
3.
|
|
74
|
-
4.
|
|
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.
|
|
81
|
-
2.
|
|
82
|
-
3.
|
|
83
|
-
4.
|
|
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
|
|
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
|
|
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"}
|