@rengler33/prov 0.1.5 → 0.1.6

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.
@@ -0,0 +1,384 @@
1
+ /**
2
+ * Tests for prov create commands.
3
+ *
4
+ * @see spec:declarative-creation:v1
5
+ * @see req:create:spec-basic
6
+ * @see req:create:constraint-basic
7
+ */
8
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
9
+ import { existsSync, rmSync, readFileSync, mkdirSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { tmpdir } from 'node:os';
12
+ import { runSpecCreate, runConstraintCreate } from './create.js';
13
+ import { runInit } from './init.js';
14
+ import { parseYaml } from '../hash.js';
15
+ describe('spec create command', () => {
16
+ let testDir;
17
+ let globalOpts;
18
+ let outputChunks;
19
+ beforeEach(() => {
20
+ // Create unique temp directory
21
+ testDir = join(tmpdir(), `prov-test-create-${Date.now()}-${Math.random().toString(36).slice(2)}`);
22
+ mkdirSync(testDir, { recursive: true });
23
+ globalOpts = {
24
+ dir: testDir,
25
+ format: 'json',
26
+ };
27
+ // Capture stdout BEFORE runInit to prevent console output
28
+ outputChunks = [];
29
+ vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
30
+ outputChunks.push(chunk.toString());
31
+ return true;
32
+ });
33
+ // Suppress stderr (warnings)
34
+ vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
35
+ // Mock exit to prevent process from actually exiting
36
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
37
+ throw new Error(`process.exit(${code})`);
38
+ });
39
+ // Initialize prov (output captured by mock)
40
+ runInit(globalOpts, {});
41
+ outputChunks = []; // Clear init output
42
+ });
43
+ afterEach(() => {
44
+ vi.restoreAllMocks();
45
+ if (existsSync(testDir)) {
46
+ rmSync(testDir, { recursive: true, force: true });
47
+ }
48
+ });
49
+ /**
50
+ * @see req:create:spec-basic
51
+ */
52
+ it('creates a spec with required fields', () => {
53
+ runSpecCreate(globalOpts, {
54
+ name: 'my-feature',
55
+ title: 'My Feature',
56
+ intent: 'A test feature for testing',
57
+ });
58
+ const output = outputChunks.join('');
59
+ const result = JSON.parse(output);
60
+ expect(result.success).toBe(true);
61
+ expect(result.specId).toBe('spec:my-feature:v1');
62
+ expect(result.requirementCount).toBe(0);
63
+ expect(result.outputFile).toContain('my-feature.spec.yaml');
64
+ // Verify file was created
65
+ const specFile = join(testDir, 'spec', 'my-feature.spec.yaml');
66
+ expect(existsSync(specFile)).toBe(true);
67
+ // Verify YAML content
68
+ const content = readFileSync(specFile, 'utf8');
69
+ const parsed = parseYaml(content);
70
+ expect(parsed?.id).toBe('spec:my-feature:v1');
71
+ expect(parsed?.title).toBe('My Feature');
72
+ expect(parsed?.intent).toBe('A test feature for testing');
73
+ expect(parsed?.status).toBe('draft');
74
+ expect(parsed?.version).toBe('1.0.0');
75
+ });
76
+ /**
77
+ * @see req:create:spec-requirements
78
+ */
79
+ it('creates a spec with requirements', () => {
80
+ runSpecCreate(globalOpts, {
81
+ name: 'auth',
82
+ title: 'Authentication',
83
+ intent: 'User authentication',
84
+ req: [
85
+ 'login:Users can log in:email works;OAuth works',
86
+ 'logout:Users can log out',
87
+ ],
88
+ });
89
+ const output = outputChunks.join('');
90
+ const result = JSON.parse(output);
91
+ expect(result.success).toBe(true);
92
+ expect(result.requirementCount).toBe(2);
93
+ // Verify YAML content
94
+ const specFile = join(testDir, 'spec', 'auth.spec.yaml');
95
+ const content = readFileSync(specFile, 'utf8');
96
+ const parsed = parseYaml(content);
97
+ expect(parsed?.requirements).toHaveLength(2);
98
+ expect(parsed?.requirements[0]?.id).toBe('req:auth:login');
99
+ expect(parsed?.requirements[0]?.description).toBe('Users can log in');
100
+ expect(parsed?.requirements[0]?.acceptance).toEqual(['email works', 'OAuth works']);
101
+ expect(parsed?.requirements[1]?.id).toBe('req:auth:logout');
102
+ });
103
+ /**
104
+ * @see req:create:spec-dependencies
105
+ */
106
+ it('creates a spec with requirement dependencies', () => {
107
+ runSpecCreate(globalOpts, {
108
+ name: 'auth',
109
+ intent: 'User authentication',
110
+ req: [
111
+ 'login:Users can log in',
112
+ 'logout:Users can log out',
113
+ 'session:Manage user session',
114
+ ],
115
+ dep: [
116
+ 'logout:login',
117
+ 'session:login',
118
+ ],
119
+ });
120
+ const output = outputChunks.join('');
121
+ const result = JSON.parse(output);
122
+ expect(result.success).toBe(true);
123
+ // Verify dependencies in YAML
124
+ const specFile = join(testDir, 'spec', 'auth.spec.yaml');
125
+ const content = readFileSync(specFile, 'utf8');
126
+ const parsed = parseYaml(content);
127
+ // Find logout and session requirements
128
+ const logout = parsed?.requirements.find(r => r.id === 'req:auth:logout');
129
+ const session = parsed?.requirements.find(r => r.id === 'req:auth:session');
130
+ expect(logout?.depends_on).toEqual(['req:auth:login']);
131
+ expect(session?.depends_on).toEqual(['req:auth:login']);
132
+ });
133
+ /**
134
+ * @see req:create:validation
135
+ */
136
+ it('validates name format', () => {
137
+ expect(() => {
138
+ runSpecCreate(globalOpts, {
139
+ name: 'Invalid Name',
140
+ intent: 'Test',
141
+ });
142
+ }).toThrow('process.exit(1)');
143
+ const output = outputChunks.join('');
144
+ const result = JSON.parse(output);
145
+ expect(result.success).toBe(false);
146
+ expect(result.error).toContain('Invalid name');
147
+ });
148
+ /**
149
+ * @see req:create:no-overwrite
150
+ */
151
+ it('prevents overwriting existing files without --force', () => {
152
+ // Create first spec
153
+ runSpecCreate(globalOpts, {
154
+ name: 'existing',
155
+ intent: 'First version',
156
+ });
157
+ outputChunks = [];
158
+ // Try to create again
159
+ expect(() => {
160
+ runSpecCreate(globalOpts, {
161
+ name: 'existing',
162
+ intent: 'Second version',
163
+ });
164
+ }).toThrow('process.exit(1)');
165
+ const output = outputChunks.join('');
166
+ const result = JSON.parse(output);
167
+ expect(result.success).toBe(false);
168
+ expect(result.error).toContain('already exists');
169
+ });
170
+ /**
171
+ * @see req:create:no-overwrite
172
+ */
173
+ it('allows overwriting with --force', () => {
174
+ // Create first spec
175
+ runSpecCreate(globalOpts, {
176
+ name: 'existing',
177
+ intent: 'First version',
178
+ });
179
+ outputChunks = [];
180
+ // Overwrite with --force
181
+ runSpecCreate(globalOpts, {
182
+ name: 'existing',
183
+ intent: 'Second version',
184
+ force: true,
185
+ });
186
+ const output = outputChunks.join('');
187
+ const result = JSON.parse(output);
188
+ expect(result.success).toBe(true);
189
+ // Verify new content
190
+ const specFile = join(testDir, 'spec', 'existing.spec.yaml');
191
+ const content = readFileSync(specFile, 'utf8');
192
+ const parsed = parseYaml(content);
193
+ expect(parsed?.intent).toBe('Second version');
194
+ });
195
+ /**
196
+ * @see req:create:spec-auto-register
197
+ */
198
+ it('auto-registers spec in graph by default', async () => {
199
+ runSpecCreate(globalOpts, {
200
+ name: 'registered',
201
+ intent: 'Should be in graph',
202
+ });
203
+ // Verify spec is in graph by listing
204
+ outputChunks = [];
205
+ const { runSpecList } = await import('./spec.js');
206
+ runSpecList(globalOpts, {});
207
+ const output = outputChunks.join('');
208
+ expect(output).toContain('spec:registered:v1');
209
+ });
210
+ /**
211
+ * @see req:create:spec-auto-register
212
+ */
213
+ it('skips registration with --no-register', () => {
214
+ runSpecCreate(globalOpts, {
215
+ name: 'unregistered',
216
+ intent: 'Should not be in graph',
217
+ noRegister: true,
218
+ });
219
+ const output = outputChunks.join('');
220
+ const result = JSON.parse(output);
221
+ expect(result.success).toBe(true);
222
+ // File should exist
223
+ const specFile = join(testDir, 'spec', 'unregistered.spec.yaml');
224
+ expect(existsSync(specFile)).toBe(true);
225
+ });
226
+ });
227
+ describe('constraint create command', () => {
228
+ let testDir;
229
+ let globalOpts;
230
+ let outputChunks;
231
+ beforeEach(() => {
232
+ // Create unique temp directory
233
+ testDir = join(tmpdir(), `prov-test-create-${Date.now()}-${Math.random().toString(36).slice(2)}`);
234
+ mkdirSync(testDir, { recursive: true });
235
+ globalOpts = {
236
+ dir: testDir,
237
+ format: 'json',
238
+ };
239
+ // Capture stdout BEFORE runInit to prevent console output
240
+ outputChunks = [];
241
+ vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
242
+ outputChunks.push(chunk.toString());
243
+ return true;
244
+ });
245
+ // Suppress stderr (warnings)
246
+ vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
247
+ // Mock exit to prevent process from actually exiting
248
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
249
+ throw new Error(`process.exit(${code})`);
250
+ });
251
+ // Initialize prov (output captured by mock)
252
+ runInit(globalOpts, {});
253
+ outputChunks = []; // Clear init output
254
+ });
255
+ afterEach(() => {
256
+ vi.restoreAllMocks();
257
+ if (existsSync(testDir)) {
258
+ rmSync(testDir, { recursive: true, force: true });
259
+ }
260
+ });
261
+ /**
262
+ * @see req:create:constraint-basic
263
+ */
264
+ it('creates a constraint with required fields', () => {
265
+ runConstraintCreate(globalOpts, {
266
+ name: 'security',
267
+ title: 'Security Constraints',
268
+ description: 'Security rules for the codebase',
269
+ });
270
+ const output = outputChunks.join('');
271
+ const result = JSON.parse(output);
272
+ expect(result.success).toBe(true);
273
+ expect(result.constraintId).toBe('constraint:security:v1');
274
+ expect(result.invariantCount).toBe(0);
275
+ expect(result.outputFile).toContain('security.constraints.yaml');
276
+ // Verify file was created
277
+ const constraintFile = join(testDir, 'constraints', 'security.constraints.yaml');
278
+ expect(existsSync(constraintFile)).toBe(true);
279
+ // Verify YAML content
280
+ const content = readFileSync(constraintFile, 'utf8');
281
+ const parsed = parseYaml(content);
282
+ expect(parsed?.id).toBe('constraint:security:v1');
283
+ expect(parsed?.title).toBe('Security Constraints');
284
+ expect(parsed?.description).toBe('Security rules for the codebase');
285
+ expect(parsed?.status).toBe('draft');
286
+ });
287
+ /**
288
+ * @see req:create:constraint-invariants
289
+ */
290
+ it('creates a constraint with invariants', () => {
291
+ runConstraintCreate(globalOpts, {
292
+ name: 'code-quality',
293
+ title: 'Code Quality',
294
+ description: 'Code quality rules',
295
+ inv: [
296
+ 'no-console:No console.log in production:command:grep -r "console.log" src/',
297
+ 'lint-pass:Code passes linting:command:npm run lint',
298
+ ],
299
+ });
300
+ const output = outputChunks.join('');
301
+ const result = JSON.parse(output);
302
+ expect(result.success).toBe(true);
303
+ expect(result.invariantCount).toBe(2);
304
+ // Verify YAML content
305
+ const constraintFile = join(testDir, 'constraints', 'code-quality.constraints.yaml');
306
+ const content = readFileSync(constraintFile, 'utf8');
307
+ const parsed = parseYaml(content);
308
+ expect(parsed?.invariants).toHaveLength(2);
309
+ expect(parsed?.invariants[0]?.id).toBe('inv:code-quality:no-console');
310
+ expect(parsed?.invariants[0]?.rule).toBe('No console.log in production');
311
+ expect(parsed?.invariants[0]?.verification.type).toBe('command');
312
+ expect(parsed?.invariants[0]?.verification.value).toBe('grep -r "console.log" src/');
313
+ expect(parsed?.invariants[0]?.blocking).toBe(true);
314
+ });
315
+ /**
316
+ * @see req:create:validation
317
+ */
318
+ it('validates name format', () => {
319
+ expect(() => {
320
+ runConstraintCreate(globalOpts, {
321
+ name: 'Invalid_Name!',
322
+ description: 'Test',
323
+ });
324
+ }).toThrow('process.exit(1)');
325
+ const output = outputChunks.join('');
326
+ const result = JSON.parse(output);
327
+ expect(result.success).toBe(false);
328
+ expect(result.error).toContain('Invalid name');
329
+ });
330
+ /**
331
+ * @see req:create:validation
332
+ */
333
+ it('validates invariant verification type', () => {
334
+ expect(() => {
335
+ runConstraintCreate(globalOpts, {
336
+ name: 'invalid-type',
337
+ description: 'Test',
338
+ inv: ['test:Test rule:invalid-type:some value'],
339
+ });
340
+ }).toThrow('process.exit(1)');
341
+ const output = outputChunks.join('');
342
+ const result = JSON.parse(output);
343
+ expect(result.success).toBe(false);
344
+ expect(result.error).toContain('Invalid verification type');
345
+ });
346
+ /**
347
+ * @see req:create:no-overwrite
348
+ */
349
+ it('prevents overwriting existing files without --force', () => {
350
+ // Create first constraint
351
+ runConstraintCreate(globalOpts, {
352
+ name: 'existing',
353
+ description: 'First version',
354
+ });
355
+ outputChunks = [];
356
+ // Try to create again
357
+ expect(() => {
358
+ runConstraintCreate(globalOpts, {
359
+ name: 'existing',
360
+ description: 'Second version',
361
+ });
362
+ }).toThrow('process.exit(1)');
363
+ const output = outputChunks.join('');
364
+ const result = JSON.parse(output);
365
+ expect(result.success).toBe(false);
366
+ expect(result.error).toContain('already exists');
367
+ });
368
+ /**
369
+ * @see req:create:constraint-auto-register
370
+ */
371
+ it('auto-registers constraint in graph by default', async () => {
372
+ runConstraintCreate(globalOpts, {
373
+ name: 'registered',
374
+ description: 'Should be in graph',
375
+ });
376
+ // Verify constraint is in graph by listing
377
+ outputChunks = [];
378
+ const { runConstraintList } = await import('./constraint.js');
379
+ runConstraintList(globalOpts, {});
380
+ const output = outputChunks.join('');
381
+ expect(output).toContain('constraint:registered:v1');
382
+ });
383
+ });
384
+ //# sourceMappingURL=create.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.test.js","sourceRoot":"","sources":["../../src/commands/create.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rengler33/prov",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Provenance-first planning CLI for AI agent workflows",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -14,8 +14,8 @@
14
14
  "build": "tsc",
15
15
  "build:bun": "bun build ./src/cli.ts --compile --outfile ./bin/prov",
16
16
  "dev": "tsc --watch",
17
- "test": "vitest",
18
- "test:run": "vitest run",
17
+ "test": "vitest run",
18
+ "testwatch": "vitest",
19
19
  "lint": "eslint src --ext .ts",
20
20
  "lint:fix": "eslint src --ext .ts --fix",
21
21
  "typecheck": "tsc --noEmit",