@nova286/nova-workflow 0.2.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 (79) hide show
  1. package/README.md +246 -0
  2. package/dist/cli/commands/archive.d.ts +1 -0
  3. package/dist/cli/commands/archive.js +120 -0
  4. package/dist/cli/commands/archive.js.map +1 -0
  5. package/dist/cli/commands/context.d.ts +1 -0
  6. package/dist/cli/commands/context.js +23 -0
  7. package/dist/cli/commands/context.js.map +1 -0
  8. package/dist/cli/commands/guard.d.ts +1 -0
  9. package/dist/cli/commands/guard.js +21 -0
  10. package/dist/cli/commands/guard.js.map +1 -0
  11. package/dist/cli/commands/init.d.ts +1 -0
  12. package/dist/cli/commands/init.js +22 -0
  13. package/dist/cli/commands/init.js.map +1 -0
  14. package/dist/cli/commands/status.d.ts +1 -0
  15. package/dist/cli/commands/status.js +72 -0
  16. package/dist/cli/commands/status.js.map +1 -0
  17. package/dist/cli/error-handler.d.ts +1 -0
  18. package/dist/cli/error-handler.js +18 -0
  19. package/dist/cli/error-handler.js.map +1 -0
  20. package/dist/cli/index.d.ts +2 -0
  21. package/dist/cli/index.js +35 -0
  22. package/dist/cli/index.js.map +1 -0
  23. package/dist/cli/ui.d.ts +10 -0
  24. package/dist/cli/ui.js +21 -0
  25. package/dist/cli/ui.js.map +1 -0
  26. package/dist/cli-core/__tests__/context-generator.test.d.ts +1 -0
  27. package/dist/cli-core/__tests__/context-generator.test.js +97 -0
  28. package/dist/cli-core/__tests__/context-generator.test.js.map +1 -0
  29. package/dist/cli-core/__tests__/dispatcher.test.d.ts +1 -0
  30. package/dist/cli-core/__tests__/dispatcher.test.js +99 -0
  31. package/dist/cli-core/__tests__/dispatcher.test.js.map +1 -0
  32. package/dist/cli-core/__tests__/guard.test.d.ts +1 -0
  33. package/dist/cli-core/__tests__/guard.test.js +136 -0
  34. package/dist/cli-core/__tests__/guard.test.js.map +1 -0
  35. package/dist/cli-core/__tests__/init-manager.test.d.ts +1 -0
  36. package/dist/cli-core/__tests__/init-manager.test.js +150 -0
  37. package/dist/cli-core/__tests__/init-manager.test.js.map +1 -0
  38. package/dist/cli-core/__tests__/pipeline.test.d.ts +1 -0
  39. package/dist/cli-core/__tests__/pipeline.test.js +119 -0
  40. package/dist/cli-core/__tests__/pipeline.test.js.map +1 -0
  41. package/dist/cli-core/__tests__/project-detect.test.d.ts +1 -0
  42. package/dist/cli-core/__tests__/project-detect.test.js +92 -0
  43. package/dist/cli-core/__tests__/project-detect.test.js.map +1 -0
  44. package/dist/cli-core/__tests__/state-manager.test.d.ts +1 -0
  45. package/dist/cli-core/__tests__/state-manager.test.js +120 -0
  46. package/dist/cli-core/__tests__/state-manager.test.js.map +1 -0
  47. package/dist/cli-core/adapters/claude-code.d.ts +6 -0
  48. package/dist/cli-core/adapters/claude-code.js +311 -0
  49. package/dist/cli-core/adapters/claude-code.js.map +1 -0
  50. package/dist/cli-core/context-generator.d.ts +4 -0
  51. package/dist/cli-core/context-generator.js +81 -0
  52. package/dist/cli-core/context-generator.js.map +1 -0
  53. package/dist/cli-core/dispatcher.d.ts +11 -0
  54. package/dist/cli-core/dispatcher.js +169 -0
  55. package/dist/cli-core/dispatcher.js.map +1 -0
  56. package/dist/cli-core/guard.d.ts +1 -0
  57. package/dist/cli-core/guard.js +57 -0
  58. package/dist/cli-core/guard.js.map +1 -0
  59. package/dist/cli-core/init-manager.d.ts +25 -0
  60. package/dist/cli-core/init-manager.js +182 -0
  61. package/dist/cli-core/init-manager.js.map +1 -0
  62. package/dist/cli-core/pipeline.d.ts +7 -0
  63. package/dist/cli-core/pipeline.js +79 -0
  64. package/dist/cli-core/pipeline.js.map +1 -0
  65. package/dist/cli-core/platform-client.d.ts +19 -0
  66. package/dist/cli-core/platform-client.js +119 -0
  67. package/dist/cli-core/platform-client.js.map +1 -0
  68. package/dist/cli-core/project-detect.d.ts +1 -0
  69. package/dist/cli-core/project-detect.js +64 -0
  70. package/dist/cli-core/project-detect.js.map +1 -0
  71. package/dist/cli-core/state.d.ts +11 -0
  72. package/dist/cli-core/state.js +106 -0
  73. package/dist/cli-core/state.js.map +1 -0
  74. package/dist/cli-core/types.d.ts +141 -0
  75. package/dist/cli-core/types.js +13 -0
  76. package/dist/cli-core/types.js.map +1 -0
  77. package/package.json +33 -0
  78. package/templates/docs/design.md +41 -0
  79. package/templates/docs/proposal.md +25 -0
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const pipeline_1 = require("../pipeline");
4
+ const dispatcher_1 = require("../dispatcher");
5
+ const platform_client_1 = require("../platform-client");
6
+ const types_1 = require("../types");
7
+ class StubClient extends platform_client_1.PlatformClient {
8
+ async sendPrompt() {
9
+ return { content: JSON.stringify({ reviewed: true }) };
10
+ }
11
+ }
12
+ class FailingClient extends platform_client_1.PlatformClient {
13
+ async sendPrompt() {
14
+ throw new Error('simulated failure');
15
+ }
16
+ }
17
+ const baseContext = {
18
+ taskId: 'task-1',
19
+ title: 'Test Task',
20
+ description: 'A task for pipeline testing',
21
+ taskType: 'implementation',
22
+ designContext: { designDocRef: '', relevantSpecs: [], architectureNotes: '' },
23
+ input: {
24
+ files: [],
25
+ dependencies: [],
26
+ environment: { language: '', framework: '', buildTool: '', testFramework: '' },
27
+ },
28
+ output: { expectedArtifacts: [], constraints: { mustPassTests: true } },
29
+ acceptanceCriteria: [],
30
+ guardConditions: { requireReview: true, requireTests: true, blocking: false },
31
+ metadata: {
32
+ createdBy: 'test',
33
+ createdAt: new Date().toISOString(),
34
+ priority: 'medium',
35
+ estimatedComplexity: 1,
36
+ },
37
+ };
38
+ describe('PipelineOrchestrator', () => {
39
+ test('executes a single stage with all tasks succeeding', async () => {
40
+ const dispatcher = new dispatcher_1.Dispatcher(new StubClient());
41
+ const orchestrator = new pipeline_1.PipelineOrchestrator(dispatcher);
42
+ const pipeline = {
43
+ stages: [
44
+ {
45
+ id: 'review',
46
+ tasks: [
47
+ { id: 'r1', agent: types_1.AgentType.CODE_REVIEWER, context: baseContext },
48
+ { id: 'r2', agent: types_1.AgentType.SECURITY_REVIEWER, context: { ...baseContext, taskId: 'task-2' } },
49
+ ],
50
+ },
51
+ ],
52
+ };
53
+ const result = await orchestrator.execute(pipeline);
54
+ expect(result.status).toBe('success');
55
+ expect(result.stages).toHaveLength(1);
56
+ expect(result.stages[0].status).toBe('success');
57
+ expect(result.stages[0].taskResults).toHaveLength(2);
58
+ result.stages[0].taskResults.forEach((r) => expect(r.status).toBe('success'));
59
+ });
60
+ test('stage marked failed when all tasks fail', async () => {
61
+ const dispatcher = new dispatcher_1.Dispatcher(new FailingClient());
62
+ const orchestrator = new pipeline_1.PipelineOrchestrator(dispatcher);
63
+ const pipeline = {
64
+ stages: [
65
+ {
66
+ id: 'review',
67
+ tasks: [{ id: 'r1', agent: types_1.AgentType.CODE_REVIEWER, context: baseContext }],
68
+ },
69
+ ],
70
+ };
71
+ const result = await orchestrator.execute(pipeline);
72
+ expect(result.status).toBe('failed');
73
+ expect(result.stages[0].status).toBe('failed');
74
+ });
75
+ test('dependsOn failure skips dependent stage', async () => {
76
+ const dispatcher = new dispatcher_1.Dispatcher(new FailingClient());
77
+ const orchestrator = new pipeline_1.PipelineOrchestrator(dispatcher);
78
+ const pipeline = {
79
+ stages: [
80
+ {
81
+ id: 'stage-1',
82
+ tasks: [{ id: 't1', agent: types_1.AgentType.CODER, context: baseContext }],
83
+ },
84
+ {
85
+ id: 'stage-2',
86
+ tasks: [{ id: 't2', agent: types_1.AgentType.CODE_REVIEWER, context: baseContext }],
87
+ dependsOn: ['stage-1'],
88
+ },
89
+ ],
90
+ };
91
+ const result = await orchestrator.execute(pipeline);
92
+ expect(result.stages).toHaveLength(2);
93
+ expect(result.stages[0].status).toBe('failed');
94
+ expect(result.stages[1].status).toBe('failed');
95
+ });
96
+ test('continue strategy does not abort on stage failure', async () => {
97
+ const dispatcher = new dispatcher_1.Dispatcher(new FailingClient());
98
+ const orchestrator = new pipeline_1.PipelineOrchestrator(dispatcher);
99
+ const pipeline = {
100
+ stages: [
101
+ {
102
+ id: 's1',
103
+ tasks: [{ id: 't1', agent: types_1.AgentType.CODER, context: baseContext }],
104
+ onStageFailure: 'continue',
105
+ },
106
+ {
107
+ id: 's2',
108
+ tasks: [{ id: 't2', agent: types_1.AgentType.CODE_REVIEWER, context: baseContext }],
109
+ },
110
+ ],
111
+ };
112
+ const result = await orchestrator.execute(pipeline);
113
+ expect(result.stages).toHaveLength(2);
114
+ expect(result.stages[0].status).toBe('failed');
115
+ expect(result.stages[1].status).toBe('failed');
116
+ expect(result.status).toBe('failed');
117
+ });
118
+ });
119
+ //# sourceMappingURL=pipeline.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/pipeline.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,92 @@
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
+ const fs = __importStar(require("fs/promises"));
37
+ const path = __importStar(require("path"));
38
+ const os = __importStar(require("os"));
39
+ const project_detect_1 = require("../project-detect");
40
+ describe('detectProjectType', () => {
41
+ let testDir;
42
+ beforeEach(async () => {
43
+ testDir = await fs.mkdtemp(path.join(os.tmpdir(), 'nova-detect-'));
44
+ });
45
+ afterEach(async () => {
46
+ await fs.rm(testDir, { recursive: true, force: true });
47
+ });
48
+ test('returns node for package.json', async () => {
49
+ await fs.writeFile(path.join(testDir, 'package.json'), JSON.stringify({ name: 'test' }));
50
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('node');
51
+ });
52
+ test('returns python for requirements.txt', async () => {
53
+ await fs.writeFile(path.join(testDir, 'requirements.txt'), 'flask==2.0');
54
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('python');
55
+ });
56
+ test('returns python for pyproject.toml', async () => {
57
+ await fs.writeFile(path.join(testDir, 'pyproject.toml'), '[tool.poetry]\nname = "test"');
58
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('python');
59
+ });
60
+ test('returns go for go.mod', async () => {
61
+ await fs.writeFile(path.join(testDir, 'go.mod'), 'module example.com/app');
62
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('go');
63
+ });
64
+ test('returns java for pom.xml', async () => {
65
+ await fs.writeFile(path.join(testDir, 'pom.xml'), '<project></project>');
66
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('java');
67
+ });
68
+ test('returns java for build.gradle', async () => {
69
+ await fs.writeFile(path.join(testDir, 'build.gradle'), 'plugins { id("java") }');
70
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('java');
71
+ });
72
+ test('returns rust for Cargo.toml', async () => {
73
+ await fs.writeFile(path.join(testDir, 'Cargo.toml'), '[package]\nname = "test"');
74
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('rust');
75
+ });
76
+ test('returns ruby for Gemfile', async () => {
77
+ await fs.writeFile(path.join(testDir, 'Gemfile'), 'source "https://rubygems.org"');
78
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('ruby');
79
+ });
80
+ test('returns php for composer.json', async () => {
81
+ await fs.writeFile(path.join(testDir, 'composer.json'), JSON.stringify({ name: 'test' }));
82
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('php');
83
+ });
84
+ test('returns cpp for CMakeLists.txt', async () => {
85
+ await fs.writeFile(path.join(testDir, 'CMakeLists.txt'), 'cmake_minimum_required(VERSION 3.0)');
86
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('cpp');
87
+ });
88
+ test('returns empty string for unknown project', async () => {
89
+ expect(await (0, project_detect_1.detectProjectType)(testDir)).toBe('');
90
+ });
91
+ });
92
+ //# sourceMappingURL=project-detect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-detect.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/project-detect.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,120 @@
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
+ const fs = __importStar(require("fs/promises"));
37
+ const path = __importStar(require("path"));
38
+ const os = __importStar(require("os"));
39
+ const yaml = __importStar(require("yaml"));
40
+ const state_1 = require("../state");
41
+ describe('StateManager', () => {
42
+ let testDir;
43
+ let originalCwd;
44
+ const baseState = {
45
+ version: 1,
46
+ project: 'test-project',
47
+ environment: ['claude-code'],
48
+ phases: {
49
+ open: { status: 'pending', proposal: '' },
50
+ design: { status: 'pending', designDoc: '', tasks: [] },
51
+ build: { status: 'pending', tasks: {} },
52
+ verify: { status: 'pending', pipelineResult: null },
53
+ archive: { status: 'pending' },
54
+ },
55
+ metadata: { stateVersion: 0, lastModified: '', history: [] },
56
+ };
57
+ beforeEach(async () => {
58
+ testDir = await fs.mkdtemp(path.join(os.tmpdir(), 'nova-state-'));
59
+ originalCwd = process.cwd();
60
+ process.chdir(testDir);
61
+ });
62
+ afterEach(async () => {
63
+ process.chdir(originalCwd);
64
+ await fs.rm(testDir, { recursive: true, force: true });
65
+ });
66
+ async function writeState(data) {
67
+ await fs.writeFile('.nova.yaml', yaml.stringify(data), 'utf-8');
68
+ }
69
+ test('load reads .nova.yaml', async () => {
70
+ await writeState(baseState);
71
+ const state = await state_1.StateManager.load();
72
+ expect(state.project).toBe('test-project');
73
+ expect(state.environment).toEqual(['claude-code']);
74
+ });
75
+ test('update atomically modifies state', async () => {
76
+ await writeState(baseState);
77
+ const next = await state_1.StateManager.update((s) => {
78
+ s.phases.open.status = 'done';
79
+ return s;
80
+ });
81
+ expect(next.phases.open.status).toBe('done');
82
+ expect(next.metadata.stateVersion).toBe(1);
83
+ expect(next.metadata.lastModified).toBeTruthy();
84
+ const raw = await fs.readFile('.nova.yaml', 'utf-8');
85
+ const disk = yaml.parse(raw);
86
+ expect(disk.phases.open.status).toBe('done');
87
+ });
88
+ test('setPhaseField updates a single phase field', async () => {
89
+ await writeState(baseState);
90
+ await state_1.StateManager.setPhaseField('build', 'status', 'in-progress');
91
+ const state = await state_1.StateManager.load();
92
+ expect(state.phases.build.status).toBe('in-progress');
93
+ });
94
+ test('getTask finds task by id', async () => {
95
+ const stateWithTasks = {
96
+ ...baseState,
97
+ phases: {
98
+ ...baseState.phases,
99
+ design: {
100
+ ...baseState.phases.design,
101
+ tasks: [
102
+ { id: 'task-1', title: 'First task' },
103
+ { id: 'task-2', title: 'Second task' },
104
+ ],
105
+ },
106
+ },
107
+ };
108
+ await writeState(stateWithTasks);
109
+ const task = await state_1.StateManager.getTask('task-2');
110
+ expect(task).toBeDefined();
111
+ expect(task.id).toBe('task-2');
112
+ expect(task.title).toBe('Second task');
113
+ });
114
+ test('getTask returns undefined for missing task', async () => {
115
+ await writeState(baseState);
116
+ const task = await state_1.StateManager.getTask('nonexistent');
117
+ expect(task).toBeUndefined();
118
+ });
119
+ });
120
+ //# sourceMappingURL=state-manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/state-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { EnvironmentAdapter } from '../types';
2
+ export declare class ClaudeCodeAdapter implements EnvironmentAdapter {
3
+ name: string;
4
+ setup(cwd: string): Promise<void>;
5
+ private writeCommand;
6
+ }