@rengler33/prov 0.1.1

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 (146) hide show
  1. package/README.md +314 -0
  2. package/dist/cli.d.ts +26 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +381 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/commands/agent.d.ts +107 -0
  7. package/dist/commands/agent.d.ts.map +1 -0
  8. package/dist/commands/agent.js +197 -0
  9. package/dist/commands/agent.js.map +1 -0
  10. package/dist/commands/agent.test.d.ts +5 -0
  11. package/dist/commands/agent.test.d.ts.map +1 -0
  12. package/dist/commands/agent.test.js +199 -0
  13. package/dist/commands/agent.test.js.map +1 -0
  14. package/dist/commands/constraint.d.ts +100 -0
  15. package/dist/commands/constraint.d.ts.map +1 -0
  16. package/dist/commands/constraint.js +763 -0
  17. package/dist/commands/constraint.js.map +1 -0
  18. package/dist/commands/constraint.test.d.ts +9 -0
  19. package/dist/commands/constraint.test.d.ts.map +1 -0
  20. package/dist/commands/constraint.test.js +470 -0
  21. package/dist/commands/constraint.test.js.map +1 -0
  22. package/dist/commands/graph.d.ts +99 -0
  23. package/dist/commands/graph.d.ts.map +1 -0
  24. package/dist/commands/graph.js +552 -0
  25. package/dist/commands/graph.js.map +1 -0
  26. package/dist/commands/graph.test.d.ts +2 -0
  27. package/dist/commands/graph.test.d.ts.map +1 -0
  28. package/dist/commands/graph.test.js +258 -0
  29. package/dist/commands/graph.test.js.map +1 -0
  30. package/dist/commands/impact.d.ts +83 -0
  31. package/dist/commands/impact.d.ts.map +1 -0
  32. package/dist/commands/impact.js +319 -0
  33. package/dist/commands/impact.js.map +1 -0
  34. package/dist/commands/impact.test.d.ts +2 -0
  35. package/dist/commands/impact.test.d.ts.map +1 -0
  36. package/dist/commands/impact.test.js +234 -0
  37. package/dist/commands/impact.test.js.map +1 -0
  38. package/dist/commands/init.d.ts +45 -0
  39. package/dist/commands/init.d.ts.map +1 -0
  40. package/dist/commands/init.js +94 -0
  41. package/dist/commands/init.js.map +1 -0
  42. package/dist/commands/init.test.d.ts +7 -0
  43. package/dist/commands/init.test.d.ts.map +1 -0
  44. package/dist/commands/init.test.js +174 -0
  45. package/dist/commands/init.test.js.map +1 -0
  46. package/dist/commands/integration.test.d.ts +10 -0
  47. package/dist/commands/integration.test.d.ts.map +1 -0
  48. package/dist/commands/integration.test.js +456 -0
  49. package/dist/commands/integration.test.js.map +1 -0
  50. package/dist/commands/mcp.d.ts +21 -0
  51. package/dist/commands/mcp.d.ts.map +1 -0
  52. package/dist/commands/mcp.js +616 -0
  53. package/dist/commands/mcp.js.map +1 -0
  54. package/dist/commands/mcp.test.d.ts +7 -0
  55. package/dist/commands/mcp.test.d.ts.map +1 -0
  56. package/dist/commands/mcp.test.js +132 -0
  57. package/dist/commands/mcp.test.js.map +1 -0
  58. package/dist/commands/plan.d.ts +218 -0
  59. package/dist/commands/plan.d.ts.map +1 -0
  60. package/dist/commands/plan.js +1307 -0
  61. package/dist/commands/plan.js.map +1 -0
  62. package/dist/commands/plan.test.d.ts +9 -0
  63. package/dist/commands/plan.test.d.ts.map +1 -0
  64. package/dist/commands/plan.test.js +569 -0
  65. package/dist/commands/plan.test.js.map +1 -0
  66. package/dist/commands/spec.d.ts +94 -0
  67. package/dist/commands/spec.d.ts.map +1 -0
  68. package/dist/commands/spec.js +635 -0
  69. package/dist/commands/spec.js.map +1 -0
  70. package/dist/commands/spec.test.d.ts +9 -0
  71. package/dist/commands/spec.test.d.ts.map +1 -0
  72. package/dist/commands/spec.test.js +407 -0
  73. package/dist/commands/spec.test.js.map +1 -0
  74. package/dist/commands/trace.d.ts +157 -0
  75. package/dist/commands/trace.d.ts.map +1 -0
  76. package/dist/commands/trace.js +847 -0
  77. package/dist/commands/trace.js.map +1 -0
  78. package/dist/commands/trace.test.d.ts +9 -0
  79. package/dist/commands/trace.test.d.ts.map +1 -0
  80. package/dist/commands/trace.test.js +524 -0
  81. package/dist/commands/trace.test.js.map +1 -0
  82. package/dist/graph.d.ts +204 -0
  83. package/dist/graph.d.ts.map +1 -0
  84. package/dist/graph.js +496 -0
  85. package/dist/graph.js.map +1 -0
  86. package/dist/graph.test.d.ts +2 -0
  87. package/dist/graph.test.d.ts.map +1 -0
  88. package/dist/graph.test.js +382 -0
  89. package/dist/graph.test.js.map +1 -0
  90. package/dist/hash.d.ts +72 -0
  91. package/dist/hash.d.ts.map +1 -0
  92. package/dist/hash.js +137 -0
  93. package/dist/hash.js.map +1 -0
  94. package/dist/hash.test.d.ts +2 -0
  95. package/dist/hash.test.d.ts.map +1 -0
  96. package/dist/hash.test.js +227 -0
  97. package/dist/hash.test.js.map +1 -0
  98. package/dist/index.d.ts +18 -0
  99. package/dist/index.d.ts.map +1 -0
  100. package/dist/index.js +64 -0
  101. package/dist/index.js.map +1 -0
  102. package/dist/index.test.d.ts +2 -0
  103. package/dist/index.test.d.ts.map +1 -0
  104. package/dist/index.test.js +11 -0
  105. package/dist/index.test.js.map +1 -0
  106. package/dist/output.d.ts +84 -0
  107. package/dist/output.d.ts.map +1 -0
  108. package/dist/output.js +175 -0
  109. package/dist/output.js.map +1 -0
  110. package/dist/output.test.d.ts +7 -0
  111. package/dist/output.test.d.ts.map +1 -0
  112. package/dist/output.test.js +146 -0
  113. package/dist/output.test.js.map +1 -0
  114. package/dist/staleness.d.ts +162 -0
  115. package/dist/staleness.d.ts.map +1 -0
  116. package/dist/staleness.js +309 -0
  117. package/dist/staleness.js.map +1 -0
  118. package/dist/staleness.test.d.ts +2 -0
  119. package/dist/staleness.test.d.ts.map +1 -0
  120. package/dist/staleness.test.js +448 -0
  121. package/dist/staleness.test.js.map +1 -0
  122. package/dist/storage.d.ts +267 -0
  123. package/dist/storage.d.ts.map +1 -0
  124. package/dist/storage.js +623 -0
  125. package/dist/storage.js.map +1 -0
  126. package/dist/storage.test.d.ts +5 -0
  127. package/dist/storage.test.d.ts.map +1 -0
  128. package/dist/storage.test.js +434 -0
  129. package/dist/storage.test.js.map +1 -0
  130. package/dist/types.d.ts +270 -0
  131. package/dist/types.d.ts.map +1 -0
  132. package/dist/types.js +12 -0
  133. package/dist/types.js.map +1 -0
  134. package/dist/types.test.d.ts +2 -0
  135. package/dist/types.test.d.ts.map +1 -0
  136. package/dist/types.test.js +232 -0
  137. package/dist/types.test.js.map +1 -0
  138. package/dist/watcher.d.ts +139 -0
  139. package/dist/watcher.d.ts.map +1 -0
  140. package/dist/watcher.js +406 -0
  141. package/dist/watcher.js.map +1 -0
  142. package/dist/watcher.test.d.ts +5 -0
  143. package/dist/watcher.test.d.ts.map +1 -0
  144. package/dist/watcher.test.js +327 -0
  145. package/dist/watcher.test.js.map +1 -0
  146. package/package.json +53 -0
@@ -0,0 +1,569 @@
1
+ /**
2
+ * Tests for prov plan commands.
3
+ *
4
+ * @see req:cli:plan-create
5
+ * @see req:cli:plan-show
6
+ * @see req:cli:plan-validate
7
+ */
8
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
9
+ import { existsSync, rmSync, readFileSync, mkdirSync, writeFileSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { tmpdir } from 'node:os';
12
+ import { runPlanCreate, runPlanShow, runPlanValidate, runPlanNext, runPlanRemaining, runPlanProgress, } from './plan.js';
13
+ import { runSpecAdd } from './spec.js';
14
+ import { runConstraintAdd } from './constraint.js';
15
+ import { runInit } from './init.js';
16
+ import { PROV_DIR, GRAPH_FILE } from '../storage.js';
17
+ // Sample valid spec YAML
18
+ const VALID_SPEC = `id: spec:test-feature:v1
19
+ version: 1.0.0
20
+ title: Test Feature Specification
21
+ status: draft
22
+
23
+ intent: |
24
+ A test specification for plan testing.
25
+
26
+ requirements:
27
+ - id: req:test-feature:init
28
+ description: Initialize the test feature
29
+ acceptance:
30
+ - Feature can be initialized
31
+
32
+ - id: req:test-feature:run
33
+ description: Run the test feature
34
+ acceptance:
35
+ - Feature can be executed
36
+ `;
37
+ // Sample valid constraint YAML
38
+ const VALID_CONSTRAINT = `id: constraint:test-rules:v1
39
+ version: 1.0.0
40
+ title: Test Rules Constraint
41
+ status: draft
42
+
43
+ description: |
44
+ Test constraints for plan testing.
45
+
46
+ invariants:
47
+ - id: inv:test-rules:must-log
48
+ rule: All operations must be logged
49
+ verification:
50
+ type: manual
51
+ value: Check that logging is implemented
52
+ `;
53
+ // Plan with validation errors
54
+ const INVALID_PLAN_NO_STEPS = `id: plan:bad-plan:v1
55
+ version: 1.0.0
56
+ title: Invalid Plan
57
+ status: draft
58
+
59
+ sources:
60
+ - id: spec:test-feature:v1
61
+ hash: sha256:abc123
62
+
63
+ decisions: []
64
+ `;
65
+ describe('plan create command', () => {
66
+ let testDir;
67
+ let mockStdout;
68
+ let mockStderr;
69
+ beforeEach(() => {
70
+ // Create a unique test directory
71
+ testDir = join(tmpdir(), `prov-plan-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
72
+ mkdirSync(testDir, { recursive: true });
73
+ mkdirSync(join(testDir, 'spec'), { recursive: true });
74
+ mkdirSync(join(testDir, 'constraint'), { recursive: true });
75
+ // Capture stdout/stderr
76
+ mockStdout = [];
77
+ mockStderr = [];
78
+ vi.spyOn(process.stdout, 'write').mockImplementation((msg) => {
79
+ mockStdout.push(String(msg));
80
+ return true;
81
+ });
82
+ vi.spyOn(process.stderr, 'write').mockImplementation((msg) => {
83
+ mockStderr.push(String(msg));
84
+ return true;
85
+ });
86
+ // Mock process.exit to throw instead of exiting
87
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
88
+ throw new Error(`Process exited with code ${String(code)}`);
89
+ });
90
+ // Initialize prov
91
+ runInit({ dir: testDir }, {});
92
+ mockStdout = [];
93
+ mockStderr = [];
94
+ });
95
+ afterEach(() => {
96
+ // Clean up test directory
97
+ if (existsSync(testDir)) {
98
+ rmSync(testDir, { recursive: true, force: true });
99
+ }
100
+ vi.restoreAllMocks();
101
+ });
102
+ describe('creating a plan from specs', () => {
103
+ it('should create a plan scaffold from a spec', () => {
104
+ // Add a spec first
105
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
106
+ writeFileSync(specPath, VALID_SPEC);
107
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
108
+ mockStdout = [];
109
+ const globalOpts = { dir: testDir, format: 'json' };
110
+ runPlanCreate(globalOpts, { from: ['spec:test-feature:v1'] });
111
+ const output = mockStdout.join('');
112
+ const result = JSON.parse(output);
113
+ expect(result.success).toBe(true);
114
+ expect(result.planId).toBe('plan:test-feature:v1');
115
+ expect(result.stepCount).toBe(2); // One step per requirement
116
+ });
117
+ it('should create plan file in plan directory', () => {
118
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
119
+ writeFileSync(specPath, VALID_SPEC);
120
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
121
+ mockStdout = [];
122
+ const globalOpts = { dir: testDir };
123
+ runPlanCreate(globalOpts, { from: ['spec:test-feature:v1'] });
124
+ const planPath = join(testDir, 'plan', 'test-feature.plan.yaml');
125
+ expect(existsSync(planPath)).toBe(true);
126
+ });
127
+ it('should add plan to graph', () => {
128
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
129
+ writeFileSync(specPath, VALID_SPEC);
130
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
131
+ mockStdout = [];
132
+ const globalOpts = { dir: testDir };
133
+ runPlanCreate(globalOpts, { from: ['spec:test-feature:v1'] });
134
+ // Verify graph contains plan
135
+ const graphPath = join(testDir, PROV_DIR, GRAPH_FILE);
136
+ const graph = JSON.parse(readFileSync(graphPath, 'utf8'));
137
+ expect(graph.nodes['plan:test-feature:v1']).toBeDefined();
138
+ expect(graph.nodes['plan:test-feature:v1']?.type).toBe('plan');
139
+ });
140
+ it('should create plan with constraint sources', () => {
141
+ // Add spec and constraint
142
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
143
+ writeFileSync(specPath, VALID_SPEC);
144
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
145
+ const constraintPath = join(testDir, 'constraint', 'test.constraint.yaml');
146
+ writeFileSync(constraintPath, VALID_CONSTRAINT);
147
+ runConstraintAdd({ dir: testDir }, 'constraint/test.constraint.yaml', {});
148
+ mockStdout = [];
149
+ const globalOpts = { dir: testDir, format: 'json' };
150
+ runPlanCreate(globalOpts, {
151
+ from: ['spec:test-feature:v1'],
152
+ with: ['constraint:test-rules:v1'],
153
+ });
154
+ const output = mockStdout.join('');
155
+ const result = JSON.parse(output);
156
+ expect(result.success).toBe(true);
157
+ });
158
+ it('should respect custom output path', () => {
159
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
160
+ writeFileSync(specPath, VALID_SPEC);
161
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
162
+ mockStdout = [];
163
+ const customPath = join(testDir, 'custom', 'my-plan.yaml');
164
+ const globalOpts = { dir: testDir, format: 'json' };
165
+ runPlanCreate(globalOpts, {
166
+ from: ['spec:test-feature:v1'],
167
+ output: 'custom/my-plan.yaml',
168
+ });
169
+ expect(existsSync(customPath)).toBe(true);
170
+ });
171
+ });
172
+ describe('error handling', () => {
173
+ it('should fail if prov not initialized', () => {
174
+ const uninitDir = join(testDir, 'uninit');
175
+ mkdirSync(uninitDir, { recursive: true });
176
+ const globalOpts = { dir: uninitDir, format: 'json' };
177
+ expect(() => {
178
+ runPlanCreate(globalOpts, { from: ['spec:test:v1'] });
179
+ }).toThrow('Process exited with code 1');
180
+ const output = mockStdout.join('');
181
+ const result = JSON.parse(output);
182
+ expect(result.success).toBe(false);
183
+ expect(result.error).toContain('not initialized');
184
+ });
185
+ it('should fail if spec not found', () => {
186
+ const globalOpts = { dir: testDir, format: 'json' };
187
+ expect(() => {
188
+ runPlanCreate(globalOpts, { from: ['spec:nonexistent:v1'] });
189
+ }).toThrow('Process exited with code 1');
190
+ const output = mockStdout.join('');
191
+ const result = JSON.parse(output);
192
+ expect(result.success).toBe(false);
193
+ expect(result.error).toContain('not found');
194
+ });
195
+ it('should fail if constraint not found', () => {
196
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
197
+ writeFileSync(specPath, VALID_SPEC);
198
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
199
+ mockStdout = [];
200
+ const globalOpts = { dir: testDir, format: 'json' };
201
+ expect(() => {
202
+ runPlanCreate(globalOpts, {
203
+ from: ['spec:test-feature:v1'],
204
+ with: ['constraint:nonexistent:v1'],
205
+ });
206
+ }).toThrow('Process exited with code 1');
207
+ const output = mockStdout.join('');
208
+ const result = JSON.parse(output);
209
+ expect(result.success).toBe(false);
210
+ expect(result.error).toContain('not found');
211
+ });
212
+ });
213
+ });
214
+ describe('plan show command', () => {
215
+ let testDir;
216
+ let mockStdout;
217
+ let mockStderr;
218
+ beforeEach(() => {
219
+ testDir = join(tmpdir(), `prov-plan-show-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
220
+ mkdirSync(testDir, { recursive: true });
221
+ mkdirSync(join(testDir, 'spec'), { recursive: true });
222
+ mockStdout = [];
223
+ mockStderr = [];
224
+ vi.spyOn(process.stdout, 'write').mockImplementation((msg) => {
225
+ mockStdout.push(String(msg));
226
+ return true;
227
+ });
228
+ vi.spyOn(process.stderr, 'write').mockImplementation((msg) => {
229
+ mockStderr.push(String(msg));
230
+ return true;
231
+ });
232
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
233
+ throw new Error(`Process exited with code ${String(code)}`);
234
+ });
235
+ // Initialize prov
236
+ runInit({ dir: testDir }, {});
237
+ mockStdout = [];
238
+ mockStderr = [];
239
+ });
240
+ afterEach(() => {
241
+ if (existsSync(testDir)) {
242
+ rmSync(testDir, { recursive: true, force: true });
243
+ }
244
+ vi.restoreAllMocks();
245
+ });
246
+ it('should display plan details in JSON format', () => {
247
+ // Add spec and create plan
248
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
249
+ writeFileSync(specPath, VALID_SPEC);
250
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
251
+ runPlanCreate({ dir: testDir }, { from: ['spec:test-feature:v1'] });
252
+ mockStdout = [];
253
+ const globalOpts = { dir: testDir, format: 'json' };
254
+ runPlanShow(globalOpts, 'plan:test-feature:v1', {});
255
+ const output = mockStdout.join('');
256
+ const result = JSON.parse(output);
257
+ expect(result.success).toBe(true);
258
+ expect(result.plan?.id).toBe('plan:test-feature:v1');
259
+ expect(result.plan?.steps).toHaveLength(2);
260
+ });
261
+ it('should display plan details in table format', () => {
262
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
263
+ writeFileSync(specPath, VALID_SPEC);
264
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
265
+ runPlanCreate({ dir: testDir }, { from: ['spec:test-feature:v1'] });
266
+ mockStdout = [];
267
+ // Force table format (test environment is not TTY, so would default to yaml)
268
+ const globalOpts = { dir: testDir, format: 'table' };
269
+ runPlanShow(globalOpts, 'plan:test-feature:v1', {});
270
+ const output = mockStdout.join('');
271
+ expect(output).toContain('plan:test-feature:v1');
272
+ expect(output).toContain('Steps:');
273
+ });
274
+ it('should fail if plan not found', () => {
275
+ const globalOpts = { dir: testDir, format: 'json' };
276
+ expect(() => {
277
+ runPlanShow(globalOpts, 'plan:nonexistent:v1', {});
278
+ }).toThrow('Process exited with code 1');
279
+ const output = mockStdout.join('');
280
+ const result = JSON.parse(output);
281
+ expect(result.success).toBe(false);
282
+ expect(result.error).toContain('not found');
283
+ });
284
+ });
285
+ describe('plan validate command', () => {
286
+ let testDir;
287
+ let mockStdout;
288
+ let mockStderr;
289
+ beforeEach(() => {
290
+ testDir = join(tmpdir(), `prov-plan-validate-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
291
+ mkdirSync(testDir, { recursive: true });
292
+ mkdirSync(join(testDir, 'spec'), { recursive: true });
293
+ mkdirSync(join(testDir, 'plan'), { recursive: true });
294
+ mockStdout = [];
295
+ mockStderr = [];
296
+ vi.spyOn(process.stdout, 'write').mockImplementation((msg) => {
297
+ mockStdout.push(String(msg));
298
+ return true;
299
+ });
300
+ vi.spyOn(process.stderr, 'write').mockImplementation((msg) => {
301
+ mockStderr.push(String(msg));
302
+ return true;
303
+ });
304
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
305
+ throw new Error(`Process exited with code ${String(code)}`);
306
+ });
307
+ // Initialize prov
308
+ runInit({ dir: testDir }, {});
309
+ mockStdout = [];
310
+ mockStderr = [];
311
+ });
312
+ afterEach(() => {
313
+ if (existsSync(testDir)) {
314
+ rmSync(testDir, { recursive: true, force: true });
315
+ }
316
+ vi.restoreAllMocks();
317
+ });
318
+ it('should validate with no issues when plans are valid', () => {
319
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
320
+ writeFileSync(specPath, VALID_SPEC);
321
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
322
+ runPlanCreate({ dir: testDir }, { from: ['spec:test-feature:v1'] });
323
+ mockStdout = [];
324
+ const globalOpts = { dir: testDir, format: 'json' };
325
+ runPlanValidate(globalOpts, {});
326
+ const output = mockStdout.join('');
327
+ const result = JSON.parse(output);
328
+ expect(result.valid).toBe(true);
329
+ expect(result.plansChecked).toBeGreaterThan(0);
330
+ });
331
+ it('should report invalid plan files', () => {
332
+ writeFileSync(join(testDir, 'plan', 'invalid.plan.yaml'), INVALID_PLAN_NO_STEPS);
333
+ const globalOpts = { dir: testDir, format: 'json' };
334
+ expect(() => {
335
+ runPlanValidate(globalOpts, {});
336
+ }).toThrow('Process exited with code 1');
337
+ const output = mockStdout.join('');
338
+ const result = JSON.parse(output);
339
+ expect(result.valid).toBe(false);
340
+ expect(result.issues.length).toBeGreaterThan(0);
341
+ });
342
+ it('should detect stale sources', () => {
343
+ // Create spec and plan
344
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
345
+ writeFileSync(specPath, VALID_SPEC);
346
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
347
+ runPlanCreate({ dir: testDir }, { from: ['spec:test-feature:v1'] });
348
+ // Modify the spec (will change its hash)
349
+ const modifiedSpec = VALID_SPEC.replace('A test specification', 'A modified specification');
350
+ writeFileSync(specPath, modifiedSpec);
351
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
352
+ mockStdout = [];
353
+ const globalOpts = { dir: testDir, format: 'json' };
354
+ runPlanValidate(globalOpts, {});
355
+ const output = mockStdout.join('');
356
+ const result = JSON.parse(output);
357
+ // Should have warning about stale source
358
+ const hasStaleWarning = result.issues.some((i) => i.message.includes('changed') || i.message.includes('hash mismatch'));
359
+ expect(hasStaleWarning).toBe(true);
360
+ });
361
+ it('should report empty result when no plan files found', () => {
362
+ const globalOpts = { dir: testDir, format: 'json' };
363
+ runPlanValidate(globalOpts, {});
364
+ const output = mockStdout.join('');
365
+ const result = JSON.parse(output);
366
+ expect(result.valid).toBe(true);
367
+ expect(result.plansChecked).toBe(0);
368
+ });
369
+ });
370
+ describe('plan next command', () => {
371
+ let testDir;
372
+ let mockStdout;
373
+ beforeEach(() => {
374
+ testDir = join(tmpdir(), `prov-plan-next-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
375
+ mkdirSync(testDir, { recursive: true });
376
+ mkdirSync(join(testDir, 'spec'), { recursive: true });
377
+ mockStdout = [];
378
+ vi.spyOn(process.stdout, 'write').mockImplementation((msg) => {
379
+ mockStdout.push(String(msg));
380
+ return true;
381
+ });
382
+ vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
383
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
384
+ throw new Error(`Process exited with code ${String(code)}`);
385
+ });
386
+ });
387
+ afterEach(() => {
388
+ if (existsSync(testDir)) {
389
+ rmSync(testDir, { recursive: true, force: true });
390
+ }
391
+ vi.restoreAllMocks();
392
+ });
393
+ it('should fail if prov is not initialized', () => {
394
+ const globalOpts = { dir: testDir, format: 'json' };
395
+ expect(() => {
396
+ runPlanNext(globalOpts, 'plan:test:v1', {});
397
+ }).toThrow('Process exited with code 1');
398
+ const output = mockStdout.join('');
399
+ const result = JSON.parse(output);
400
+ expect(result.success).toBe(false);
401
+ expect(result.error).toContain('not initialized');
402
+ });
403
+ it('should fail if plan not found', () => {
404
+ runInit({ dir: testDir }, {});
405
+ mockStdout = [];
406
+ const globalOpts = { dir: testDir, format: 'json' };
407
+ expect(() => {
408
+ runPlanNext(globalOpts, 'plan:nonexistent:v1', {});
409
+ }).toThrow('Process exited with code 1');
410
+ const output = mockStdout.join('');
411
+ const result = JSON.parse(output);
412
+ expect(result.success).toBe(false);
413
+ expect(result.error).toContain('not found');
414
+ });
415
+ it('should return next step from plan', () => {
416
+ runInit({ dir: testDir }, {});
417
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
418
+ writeFileSync(specPath, VALID_SPEC);
419
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
420
+ runPlanCreate({ dir: testDir }, { from: ['spec:test-feature:v1'] });
421
+ mockStdout = [];
422
+ const globalOpts = { dir: testDir, format: 'json' };
423
+ runPlanNext(globalOpts, 'plan:test-feature:v1', {});
424
+ const output = mockStdout.join('');
425
+ const result = JSON.parse(output);
426
+ expect(result.success).toBe(true);
427
+ expect(result.planId).toBe('plan:test-feature:v1');
428
+ expect(result.step).toBeDefined();
429
+ expect(result.step?.number).toBe(1);
430
+ });
431
+ });
432
+ describe('plan remaining command', () => {
433
+ let testDir;
434
+ let mockStdout;
435
+ beforeEach(() => {
436
+ testDir = join(tmpdir(), `prov-plan-remaining-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
437
+ mkdirSync(testDir, { recursive: true });
438
+ mkdirSync(join(testDir, 'spec'), { recursive: true });
439
+ mockStdout = [];
440
+ vi.spyOn(process.stdout, 'write').mockImplementation((msg) => {
441
+ mockStdout.push(String(msg));
442
+ return true;
443
+ });
444
+ vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
445
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
446
+ throw new Error(`Process exited with code ${String(code)}`);
447
+ });
448
+ });
449
+ afterEach(() => {
450
+ if (existsSync(testDir)) {
451
+ rmSync(testDir, { recursive: true, force: true });
452
+ }
453
+ vi.restoreAllMocks();
454
+ });
455
+ it('should fail if prov is not initialized', () => {
456
+ const globalOpts = { dir: testDir, format: 'json' };
457
+ expect(() => {
458
+ runPlanRemaining(globalOpts, 'plan:test:v1', {});
459
+ }).toThrow('Process exited with code 1');
460
+ const output = mockStdout.join('');
461
+ const result = JSON.parse(output);
462
+ expect(result.success).toBe(false);
463
+ expect(result.error).toContain('not initialized');
464
+ });
465
+ it('should list remaining steps', () => {
466
+ runInit({ dir: testDir }, {});
467
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
468
+ writeFileSync(specPath, VALID_SPEC);
469
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
470
+ runPlanCreate({ dir: testDir }, { from: ['spec:test-feature:v1'] });
471
+ mockStdout = [];
472
+ const globalOpts = { dir: testDir, format: 'json' };
473
+ runPlanRemaining(globalOpts, 'plan:test-feature:v1', {});
474
+ const output = mockStdout.join('');
475
+ const result = JSON.parse(output);
476
+ expect(result.success).toBe(true);
477
+ expect(result.planId).toBe('plan:test-feature:v1');
478
+ expect(result.remainingSteps).toBeDefined();
479
+ expect(result.remainingSteps.length).toBeGreaterThan(0);
480
+ expect(result.totalSteps).toBe(result.remainingSteps.length);
481
+ expect(result.completedSteps).toBe(0);
482
+ });
483
+ });
484
+ describe('plan progress command', () => {
485
+ let testDir;
486
+ let mockStdout;
487
+ beforeEach(() => {
488
+ testDir = join(tmpdir(), `prov-plan-progress-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
489
+ mkdirSync(testDir, { recursive: true });
490
+ mkdirSync(join(testDir, 'spec'), { recursive: true });
491
+ mockStdout = [];
492
+ vi.spyOn(process.stdout, 'write').mockImplementation((msg) => {
493
+ mockStdout.push(String(msg));
494
+ return true;
495
+ });
496
+ vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
497
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
498
+ throw new Error(`Process exited with code ${String(code)}`);
499
+ });
500
+ });
501
+ afterEach(() => {
502
+ if (existsSync(testDir)) {
503
+ rmSync(testDir, { recursive: true, force: true });
504
+ }
505
+ vi.restoreAllMocks();
506
+ });
507
+ it('should fail if prov is not initialized', () => {
508
+ const globalOpts = { dir: testDir, format: 'json' };
509
+ expect(() => {
510
+ runPlanProgress(globalOpts, 'plan:test:v1', {});
511
+ }).toThrow('Process exited with code 1');
512
+ const output = mockStdout.join('');
513
+ const result = JSON.parse(output);
514
+ expect(result.success).toBe(false);
515
+ expect(result.error).toContain('not initialized');
516
+ });
517
+ it('should show progress for plan', () => {
518
+ runInit({ dir: testDir }, {});
519
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
520
+ writeFileSync(specPath, VALID_SPEC);
521
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
522
+ runPlanCreate({ dir: testDir }, { from: ['spec:test-feature:v1'] });
523
+ mockStdout = [];
524
+ const globalOpts = { dir: testDir, format: 'json' };
525
+ runPlanProgress(globalOpts, 'plan:test-feature:v1', {});
526
+ const output = mockStdout.join('');
527
+ const result = JSON.parse(output);
528
+ expect(result.success).toBe(true);
529
+ expect(result.planId).toBe('plan:test-feature:v1');
530
+ expect(result.progress).toBeDefined();
531
+ expect(result.progress.totalSteps).toBeGreaterThan(0);
532
+ expect(result.progress.completedSteps).toBe(0);
533
+ expect(result.progress.percentComplete).toBe(0);
534
+ expect(result.progress.breakdown).toBeDefined();
535
+ expect(result.progress.breakdown.pending).toBeGreaterThan(0);
536
+ });
537
+ it('should calculate correct percentage', () => {
538
+ runInit({ dir: testDir }, {});
539
+ const twoReqSpec = `
540
+ id: spec:two-reqs:v1
541
+ version: 1.0.0
542
+ title: Two Requirements Spec
543
+ status: active
544
+ intent: Test progress
545
+ requirements:
546
+ - id: req:two-reqs:one
547
+ description: First requirement
548
+ acceptance:
549
+ - Works
550
+ - id: req:two-reqs:two
551
+ description: Second requirement
552
+ acceptance:
553
+ - Works
554
+ `;
555
+ const specPath = join(testDir, 'spec', 'two-reqs.spec.yaml');
556
+ writeFileSync(specPath, twoReqSpec);
557
+ runSpecAdd({ dir: testDir }, 'spec/two-reqs.spec.yaml', {});
558
+ runPlanCreate({ dir: testDir }, { from: ['spec:two-reqs:v1'] });
559
+ mockStdout = [];
560
+ const globalOpts = { dir: testDir, format: 'json' };
561
+ runPlanProgress(globalOpts, 'plan:two-reqs:v1', {});
562
+ const output = mockStdout.join('');
563
+ const result = JSON.parse(output);
564
+ expect(result.success).toBe(true);
565
+ expect(result.progress.totalSteps).toBe(2);
566
+ expect(result.progress.percentComplete).toBe(0);
567
+ });
568
+ });
569
+ //# sourceMappingURL=plan.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.test.js","sourceRoot":"","sources":["../../src/commands/plan.test.ts"],"names":[],"mappings":"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"}