@nova286/nova-workflow 0.2.0 → 2.1.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.
package/README.md CHANGED
@@ -55,7 +55,7 @@ gives you a one-glance overview and suggested next action.
55
55
  ## Installation
56
56
 
57
57
  ```bash
58
- npm install -g nova-workflow
58
+ npm install -g @nova286/nova-workflow
59
59
  ```
60
60
 
61
61
  ## Quick Start
@@ -63,8 +63,8 @@ exports.archiveCommand = (0, error_handler_1.withErrorHandling)(async (options)
63
63
  ui_1.ui.success('Archive phase rolled back to pending.');
64
64
  return;
65
65
  }
66
- const passed = await (0, guard_1.guardPhaseTransition)('verify', 'archive');
67
- if (!passed) {
66
+ const result = await (0, guard_1.guardPhaseTransition)('verify', 'archive');
67
+ if (!result.pass) {
68
68
  ui_1.ui.error('Cannot archive. Complete the verify phase first.');
69
69
  process.exit(1);
70
70
  }
@@ -1 +1 @@
1
- {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/cli/commands/archive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/cli/commands/archive.ts"],"names":[],"mappings":"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"}
@@ -9,12 +9,22 @@ exports.guardCommand = (0, error_handler_1.withErrorHandling)(async (from, to) =
9
9
  ui_1.ui.error('Usage: nova guard <from> <to>');
10
10
  process.exit(1);
11
11
  }
12
- const passed = await (0, guard_1.guardPhaseTransition)(from, to);
13
- if (passed) {
12
+ const result = await (0, guard_1.guardPhaseTransition)(from, to);
13
+ if (result.pass) {
14
14
  ui_1.ui.success(`Guard passed: ${from} → ${to}`);
15
15
  }
16
16
  else {
17
17
  ui_1.ui.error(`Guard failed: ${from} → ${to}`);
18
+ for (const f of result.failures) {
19
+ if (f.errors.length > 0) {
20
+ for (const e of f.errors) {
21
+ ui_1.ui.info(` ✗ ${e}`);
22
+ }
23
+ }
24
+ else {
25
+ ui_1.ui.info(` ✗ ${f.label}`);
26
+ }
27
+ }
18
28
  process.exit(1);
19
29
  }
20
30
  });
@@ -1 +1 @@
1
- {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../src/cli/commands/guard.ts"],"names":[],"mappings":";;;AAAA,8BAA2B;AAC3B,gDAA4D;AAC5D,oDAAqD;AAExC,QAAA,YAAY,GAAG,IAAA,iCAAiB,EAAC,KAAK,EAAE,IAAY,EAAE,EAAU,EAAE,EAAE;IAC/E,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACjB,OAAE,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,MAAM,EAAE,CAAC;QACX,OAAE,CAAC,OAAO,CAAC,iBAAiB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAE,CAAC,KAAK,CAAC,iBAAiB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../src/cli/commands/guard.ts"],"names":[],"mappings":";;;AAAA,8BAA2B;AAC3B,gDAA4D;AAC5D,oDAAqD;AAExC,QAAA,YAAY,GAAG,IAAA,iCAAiB,EAAC,KAAK,EAAE,IAAY,EAAE,EAAU,EAAE,EAAE;IAC/E,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACjB,OAAE,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAoB,EAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,OAAE,CAAC,OAAO,CAAC,iBAAiB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAE,CAAC,KAAK,CAAC,iBAAiB,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;oBACzB,OAAE,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -71,21 +71,21 @@ describe('guardPhaseTransition', () => {
71
71
  ...baseState,
72
72
  phases: { ...baseState.phases, open: { status: 'done', proposal: 'docs/prop.md' } },
73
73
  });
74
- expect(await (0, guard_1.guardPhaseTransition)('open', 'design')).toBe(true);
74
+ expect((await (0, guard_1.guardPhaseTransition)('open', 'design')).pass).toBe(true);
75
75
  });
76
76
  test('open-to-design fails when open is pending', async () => {
77
77
  await writeState(baseState);
78
- expect(await (0, guard_1.guardPhaseTransition)('open', 'design')).toBe(false);
78
+ expect((await (0, guard_1.guardPhaseTransition)('open', 'design')).pass).toBe(false);
79
79
  });
80
80
  test('design-to-build passes when design is done with tasks', async () => {
81
81
  await writeState({
82
82
  ...baseState,
83
83
  phases: {
84
84
  ...baseState.phases,
85
- design: { status: 'done', designDoc: 'docs/design.md', tasks: [{ id: '1' }] },
85
+ design: { status: 'done', designDoc: 'docs/design.md', tasks: [{ id: 'task-1', title: 'T1', type: 'implementation', files: [{ path: 'x.ts', action: 'create' }], acceptance: ['done'] }] },
86
86
  },
87
87
  });
88
- expect(await (0, guard_1.guardPhaseTransition)('design', 'build')).toBe(true);
88
+ expect((await (0, guard_1.guardPhaseTransition)('design', 'build')).pass).toBe(true);
89
89
  });
90
90
  test('design-to-build fails when tasks are empty', async () => {
91
91
  await writeState({
@@ -95,7 +95,7 @@ describe('guardPhaseTransition', () => {
95
95
  design: { status: 'done', designDoc: 'docs/design.md', tasks: [] },
96
96
  },
97
97
  });
98
- expect(await (0, guard_1.guardPhaseTransition)('design', 'build')).toBe(false);
98
+ expect((await (0, guard_1.guardPhaseTransition)('design', 'build')).pass).toBe(false);
99
99
  });
100
100
  test('build-to-verify passes when build is done with completed tasks', async () => {
101
101
  await writeState({
@@ -105,7 +105,7 @@ describe('guardPhaseTransition', () => {
105
105
  build: { status: 'done', tasks: { 'task-1': { status: 'done' } } },
106
106
  },
107
107
  });
108
- expect(await (0, guard_1.guardPhaseTransition)('build', 'verify')).toBe(true);
108
+ expect((await (0, guard_1.guardPhaseTransition)('build', 'verify')).pass).toBe(true);
109
109
  });
110
110
  test('build-to-verify passes when eccReviewPassed is true', async () => {
111
111
  await writeState({
@@ -119,18 +119,56 @@ describe('guardPhaseTransition', () => {
119
119
  },
120
120
  },
121
121
  });
122
- expect(await (0, guard_1.guardPhaseTransition)('build', 'verify')).toBe(true);
122
+ expect((await (0, guard_1.guardPhaseTransition)('build', 'verify')).pass).toBe(true);
123
123
  });
124
124
  test('verify-to-archive passes when verify is done', async () => {
125
125
  await writeState({
126
126
  ...baseState,
127
127
  phases: { ...baseState.phases, verify: { status: 'done', pipelineResult: {} } },
128
128
  });
129
- expect(await (0, guard_1.guardPhaseTransition)('verify', 'archive')).toBe(true);
129
+ expect((await (0, guard_1.guardPhaseTransition)('verify', 'archive')).pass).toBe(true);
130
130
  });
131
131
  test('unknown transition returns true', async () => {
132
132
  await writeState(baseState);
133
- expect(await (0, guard_1.guardPhaseTransition)('unknown', 'transition')).toBe(true);
133
+ expect((await (0, guard_1.guardPhaseTransition)('unknown', 'transition')).pass).toBe(true);
134
+ });
135
+ test('design-to-build fails with structured errors for bad tasks', async () => {
136
+ await writeState({
137
+ ...baseState,
138
+ phases: {
139
+ ...baseState.phases,
140
+ design: {
141
+ status: 'done',
142
+ designDoc: 'docs/design.md',
143
+ tasks: [
144
+ { title: 'No ID task', type: 'implementation', files: [], acceptance: [] },
145
+ { id: 'dup', title: 'First', type: 'implementation', files: [], acceptance: [] },
146
+ { id: 'dup', title: 'Second', type: 'implementation', files: [], acceptance: [] },
147
+ ],
148
+ },
149
+ },
150
+ });
151
+ const result = await (0, guard_1.guardPhaseTransition)('design', 'build');
152
+ expect(result.pass).toBe(false);
153
+ expect(result.failures.length).toBeGreaterThan(0);
154
+ const labels = result.failures.map(f => f.label);
155
+ expect(labels).toContain('All tasks have required fields');
156
+ });
157
+ test('build-to-verify passes when non-blocking tasks are skipped', async () => {
158
+ await writeState({
159
+ ...baseState,
160
+ phases: {
161
+ ...baseState.phases,
162
+ build: {
163
+ status: 'done',
164
+ tasks: {
165
+ 'task-1': { status: 'done' },
166
+ 'task-2': { status: 'skipped', blocking: false },
167
+ },
168
+ },
169
+ },
170
+ });
171
+ expect((await (0, guard_1.guardPhaseTransition)('build', 'verify')).pass).toBe(true);
134
172
  });
135
173
  });
136
174
  //# sourceMappingURL=guard.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"guard.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/guard.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"guard.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/guard.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const quality_check_1 = require("../quality-check");
4
+ describe('validateTaskSchema', () => {
5
+ test('passes when all tasks have required fields', () => {
6
+ const tasks = [
7
+ { id: 'task-1', title: 'Do thing', type: 'implementation', files: [{ path: 'x.ts', action: 'create' }], acceptance: ['Works'] },
8
+ ];
9
+ expect((0, quality_check_1.validateTaskSchema)(tasks).pass).toBe(true);
10
+ });
11
+ test('fails when a task is missing id', () => {
12
+ const tasks = [
13
+ { title: 'No ID', type: 'implementation', files: [], acceptance: [] },
14
+ ];
15
+ const r = (0, quality_check_1.validateTaskSchema)(tasks);
16
+ expect(r.pass).toBe(false);
17
+ expect(r.errors.some(e => e.includes('missing') && e.includes('id'))).toBe(true);
18
+ });
19
+ test('fails when a task is missing files', () => {
20
+ const tasks = [
21
+ { id: 't1', title: 'X', type: 'implementation', acceptance: ['Works'] },
22
+ ];
23
+ const r = (0, quality_check_1.validateTaskSchema)(tasks);
24
+ expect(r.pass).toBe(false);
25
+ expect(r.errors.some(e => e.includes('files'))).toBe(true);
26
+ });
27
+ test('fails when a task is missing acceptance', () => {
28
+ const tasks = [
29
+ { id: 't1', title: 'X', type: 'implementation', files: [{ path: 'x.ts', action: 'create' }] },
30
+ ];
31
+ const r = (0, quality_check_1.validateTaskSchema)(tasks);
32
+ expect(r.pass).toBe(false);
33
+ expect(r.errors.some(e => e.includes('acceptance'))).toBe(true);
34
+ });
35
+ test('reports all failing tasks', () => {
36
+ const tasks = [
37
+ { title: 'No ID 1', type: 'implementation', files: [], acceptance: [] },
38
+ { title: 'No ID 2', type: 'testing', files: [], acceptance: [] },
39
+ ];
40
+ const r = (0, quality_check_1.validateTaskSchema)(tasks);
41
+ expect(r.pass).toBe(false);
42
+ expect(r.errors.length).toBe(2);
43
+ });
44
+ test('fails when a task is missing title', () => {
45
+ const tasks = [
46
+ { id: 't1', type: 'implementation', files: [{ path: 'x.ts', action: 'create' }], acceptance: ['Works'] },
47
+ ];
48
+ const r = (0, quality_check_1.validateTaskSchema)(tasks);
49
+ expect(r.pass).toBe(false);
50
+ expect(r.errors.some(e => e.includes('missing') && e.includes('title'))).toBe(true);
51
+ });
52
+ test('fails when a task is missing type', () => {
53
+ const tasks = [
54
+ { id: 't1', title: 'X', files: [{ path: 'x.ts', action: 'create' }], acceptance: ['Works'] },
55
+ ];
56
+ const r = (0, quality_check_1.validateTaskSchema)(tasks);
57
+ expect(r.pass).toBe(false);
58
+ expect(r.errors.some(e => e.includes('missing') && e.includes('type'))).toBe(true);
59
+ });
60
+ });
61
+ describe('validateTaskIds', () => {
62
+ test('passes when all ids are unique kebab-case', () => {
63
+ const tasks = [
64
+ { id: 'task-one' }, { id: 'task-two' }, { id: 'task-3' },
65
+ ];
66
+ expect((0, quality_check_1.validateTaskIds)(tasks).pass).toBe(true);
67
+ });
68
+ test('fails on duplicate ids', () => {
69
+ const tasks = [
70
+ { id: 'task-one' }, { id: 'task-one' },
71
+ ];
72
+ const r = (0, quality_check_1.validateTaskIds)(tasks);
73
+ expect(r.pass).toBe(false);
74
+ expect(r.errors[0]).toContain('duplicate');
75
+ });
76
+ test('fails on non-kebab-case ids', () => {
77
+ const tasks = [
78
+ { id: 'task_one' }, { id: 'TaskTwo' },
79
+ ];
80
+ const r = (0, quality_check_1.validateTaskIds)(tasks);
81
+ expect(r.pass).toBe(false);
82
+ expect(r.errors.length).toBe(2);
83
+ });
84
+ });
85
+ describe('validateAcceptance', () => {
86
+ test('passes when all tasks have non-empty acceptance arrays', () => {
87
+ const tasks = [
88
+ { id: 't1', acceptance: ['Must work'] },
89
+ { id: 't2', acceptance: ['A', 'B'] },
90
+ ];
91
+ expect((0, quality_check_1.validateAcceptance)(tasks).pass).toBe(true);
92
+ });
93
+ test('fails when acceptance is empty array', () => {
94
+ const tasks = [
95
+ { id: 't1', acceptance: [] },
96
+ ];
97
+ const r = (0, quality_check_1.validateAcceptance)(tasks);
98
+ expect(r.pass).toBe(false);
99
+ expect(r.errors[0]).toContain('empty');
100
+ });
101
+ test('fails when acceptance is missing', () => {
102
+ const tasks = [{ id: 't1' }];
103
+ const r = (0, quality_check_1.validateAcceptance)(tasks);
104
+ expect(r.pass).toBe(false);
105
+ expect(r.errors[0]).toContain('missing');
106
+ });
107
+ });
108
+ describe('validateFiles', () => {
109
+ test('passes when all tasks have files with path and action', () => {
110
+ const tasks = [
111
+ { id: 't1', files: [{ path: 'a.ts', action: 'create' }] },
112
+ ];
113
+ expect((0, quality_check_1.validateFiles)(tasks).pass).toBe(true);
114
+ });
115
+ test('fails when files is empty', () => {
116
+ const tasks = [{ id: 't1', files: [] }];
117
+ const r = (0, quality_check_1.validateFiles)(tasks);
118
+ expect(r.pass).toBe(false);
119
+ expect(r.errors[0]).toContain('empty');
120
+ });
121
+ test('fails when a file entry is missing action', () => {
122
+ const tasks = [
123
+ { id: 't1', files: [{ path: 'a.ts' }] },
124
+ ];
125
+ const r = (0, quality_check_1.validateFiles)(tasks);
126
+ expect(r.pass).toBe(false);
127
+ expect(r.errors[0]).toContain('action');
128
+ });
129
+ test('fails when a file entry is missing path', () => {
130
+ const tasks = [
131
+ { id: 't1', files: [{ action: 'create' }] },
132
+ ];
133
+ const r = (0, quality_check_1.validateFiles)(tasks);
134
+ expect(r.pass).toBe(false);
135
+ expect(r.errors[0]).toContain('path');
136
+ });
137
+ });
138
+ //# sourceMappingURL=quality-check.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-check.test.js","sourceRoot":"","sources":["../../../src/cli-core/__tests__/quality-check.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1,9 @@
1
- export declare function guardPhaseTransition(from: string, to: string): Promise<boolean>;
1
+ export interface GuardFailure {
2
+ label: string;
3
+ errors: string[];
4
+ }
5
+ export interface GuardResult {
6
+ pass: boolean;
7
+ failures: GuardFailure[];
8
+ }
9
+ export declare function guardPhaseTransition(from: string, to: string): Promise<GuardResult>;
@@ -2,6 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.guardPhaseTransition = guardPhaseTransition;
4
4
  const state_1 = require("./state");
5
+ const quality_check_1 = require("./quality-check");
6
+ function toFailure(label, result) {
7
+ if (typeof result === 'boolean') {
8
+ return result ? null : { label, errors: [] };
9
+ }
10
+ return result.pass ? null : { label, errors: result.errors };
11
+ }
5
12
  const TRANSITION_RULES = {
6
13
  'open:design': [
7
14
  { label: 'Proposal phase is done', check: (s) => s.phases.open?.status === 'done' },
@@ -14,6 +21,22 @@ const TRANSITION_RULES = {
14
21
  label: 'Task list is non-empty',
15
22
  check: (s) => Array.isArray(s.phases.design?.tasks) && s.phases.design.tasks.length > 0,
16
23
  },
24
+ {
25
+ label: 'All tasks have required fields',
26
+ check: (s) => (0, quality_check_1.validateTaskSchema)(s.phases.design?.tasks || []),
27
+ },
28
+ {
29
+ label: 'All task IDs are unique kebab-case',
30
+ check: (s) => (0, quality_check_1.validateTaskIds)(s.phases.design?.tasks || []),
31
+ },
32
+ {
33
+ label: 'All tasks have valid file entries',
34
+ check: (s) => (0, quality_check_1.validateFiles)(s.phases.design?.tasks || []),
35
+ },
36
+ {
37
+ label: 'All tasks have acceptance criteria',
38
+ check: (s) => (0, quality_check_1.validateAcceptance)(s.phases.design?.tasks || []),
39
+ },
17
40
  ],
18
41
  'build:verify': [
19
42
  { label: 'Build phase is done', check: (s) => s.phases.build?.status === 'done' },
@@ -24,14 +47,16 @@ const TRANSITION_RULES = {
24
47
  return true;
25
48
  const tasks = s.phases.build?.tasks || {};
26
49
  const entries = Object.values(tasks);
27
- return entries.length > 0 && entries.every((t) => t.status === 'done');
50
+ if (entries.length === 0)
51
+ return false;
52
+ return entries.every((t) => t.status === 'done' || (t.status === 'skipped' && t.blocking !== true));
28
53
  },
29
54
  },
30
55
  ],
31
56
  'verify:archive': [
32
57
  { label: 'Verify phase is done', check: (s) => s.phases.verify?.status === 'done' },
33
58
  ],
34
- // Rollback transitions — always allowed (iteration is expected)
59
+ // Rollback transitions — always allowed
35
60
  'build:design': [
36
61
  { label: 'Build phase has started (rollback)', check: (s) => s.phases.build?.status !== 'pending' },
37
62
  ],
@@ -50,8 +75,15 @@ async function guardPhaseTransition(from, to) {
50
75
  const key = `${from}:${to}`;
51
76
  const rules = TRANSITION_RULES[key];
52
77
  if (!rules) {
53
- return true;
78
+ return { pass: true, failures: [] };
79
+ }
80
+ const failures = [];
81
+ for (const rule of rules) {
82
+ const result = rule.check(state);
83
+ const failure = toFailure(rule.label, result);
84
+ if (failure)
85
+ failures.push(failure);
54
86
  }
55
- return rules.every((rule) => rule.check(state));
87
+ return { pass: failures.length === 0, failures };
56
88
  }
57
89
  //# sourceMappingURL=guard.js.map
@@ -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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"}
@@ -0,0 +1,8 @@
1
+ export interface QualityReport {
2
+ pass: boolean;
3
+ errors: string[];
4
+ }
5
+ export declare function validateTaskSchema(tasks: any[]): QualityReport;
6
+ export declare function validateTaskIds(tasks: any[]): QualityReport;
7
+ export declare function validateAcceptance(tasks: any[]): QualityReport;
8
+ export declare function validateFiles(tasks: any[]): QualityReport;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateTaskSchema = validateTaskSchema;
4
+ exports.validateTaskIds = validateTaskIds;
5
+ exports.validateAcceptance = validateAcceptance;
6
+ exports.validateFiles = validateFiles;
7
+ const REQUIRED_FIELDS = ['id', 'title', 'type', 'files', 'acceptance'];
8
+ const KEBAB_CASE_RE = /^[a-z][a-z0-9]*(-[a-z0-9]+)*$/;
9
+ function validateTaskSchema(tasks) {
10
+ const errors = [];
11
+ for (const task of tasks) {
12
+ const missing = REQUIRED_FIELDS.filter(f => !(f in task));
13
+ if (missing.length > 0) {
14
+ const label = task.id || '<missing-id>';
15
+ errors.push(`${label}: missing fields: ${missing.join(', ')}`);
16
+ }
17
+ }
18
+ return { pass: errors.length === 0, errors };
19
+ }
20
+ function validateTaskIds(tasks) {
21
+ const errors = [];
22
+ const seen = new Set();
23
+ for (const task of tasks) {
24
+ const id = task.id;
25
+ if (!id)
26
+ continue; // caught by validateTaskSchema
27
+ if (!KEBAB_CASE_RE.test(id)) {
28
+ errors.push(`${id}: not kebab-case`);
29
+ }
30
+ if (seen.has(id)) {
31
+ errors.push(`${id}: duplicate task id`);
32
+ }
33
+ seen.add(id);
34
+ }
35
+ return { pass: errors.length === 0, errors };
36
+ }
37
+ function validateAcceptance(tasks) {
38
+ const errors = [];
39
+ for (const task of tasks) {
40
+ const id = task.id || '<missing-id>';
41
+ if (!Array.isArray(task.acceptance)) {
42
+ errors.push(`${id}: missing acceptance criteria`);
43
+ }
44
+ else if (task.acceptance.length === 0) {
45
+ errors.push(`${id}: acceptance criteria is empty`);
46
+ }
47
+ }
48
+ return { pass: errors.length === 0, errors };
49
+ }
50
+ function validateFiles(tasks) {
51
+ const errors = [];
52
+ for (const task of tasks) {
53
+ const id = task.id || '<missing-id>';
54
+ if (!Array.isArray(task.files) || task.files.length === 0) {
55
+ errors.push(`${id}: files array is empty or missing`);
56
+ continue;
57
+ }
58
+ for (const f of task.files) {
59
+ if (!f.path || !f.action) {
60
+ errors.push(`${id}: file entry missing path or action`);
61
+ break;
62
+ }
63
+ }
64
+ }
65
+ return { pass: errors.length === 0, errors };
66
+ }
67
+ //# sourceMappingURL=quality-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quality-check.js","sourceRoot":"","sources":["../../src/cli-core/quality-check.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,7 @@ export declare enum AgentType {
6
6
  CODE_REVIEWER = "code_reviewer",
7
7
  SECURITY_REVIEWER = "security_reviewer"
8
8
  }
9
+ export type TaskStatus = 'pending' | 'in-progress' | 'done' | 'failed' | 'skipped';
9
10
  export interface TaskContext {
10
11
  taskId: string;
11
12
  parentTaskId?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nova286/nova-workflow",
3
- "version": "0.2.0",
3
+ "version": "2.1.0",
4
4
  "description": "Nova: AI workflow orchestration — a thin shell for disciplined AI-assisted development",
5
5
  "main": "dist/cli/index.js",
6
6
  "bin": { "nova": "dist/cli/index.js" },