@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,407 @@
1
+ /**
2
+ * Tests for prov spec commands.
3
+ *
4
+ * @see req:cli:spec-add
5
+ * @see req:cli:spec-list
6
+ * @see req:cli:spec-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 { runSpecAdd, runSpecList, runSpecValidate } from './spec.js';
13
+ import { runInit } from './init.js';
14
+ import { PROV_DIR, GRAPH_FILE } from '../storage.js';
15
+ // Sample valid spec YAML
16
+ const VALID_SPEC = `id: spec:test-feature:v1
17
+ version: 1.0.0
18
+ title: Test Feature Specification
19
+ status: draft
20
+
21
+ intent: |
22
+ A test specification for unit testing.
23
+
24
+ requirements:
25
+ - id: req:test-feature:init
26
+ description: Initialize the test feature
27
+ acceptance:
28
+ - Feature can be initialized
29
+ - Initialization is idempotent
30
+ depends_on: []
31
+
32
+ - id: req:test-feature:run
33
+ description: Run the test feature
34
+ acceptance:
35
+ - Feature can be executed
36
+ depends_on:
37
+ - req:test-feature:init
38
+ `;
39
+ // Sample spec with validation errors
40
+ const INVALID_SPEC_NO_ID = `version: 1.0.0
41
+ title: Missing ID Spec
42
+ status: draft
43
+ intent: A spec without an id field
44
+ requirements: []
45
+ `;
46
+ const INVALID_SPEC_BAD_REQ_ID = `id: spec:bad-req:v1
47
+ version: 1.0.0
48
+ title: Bad Requirement ID
49
+ status: draft
50
+ intent: A spec with invalid requirement id format
51
+ requirements:
52
+ - id: invalid-req-format
53
+ description: This has bad ID format
54
+ acceptance:
55
+ - Some acceptance criteria
56
+ `;
57
+ const VALID_SPEC_2 = `id: spec:another-feature:v1
58
+ version: 1.0.0
59
+ title: Another Feature Specification
60
+ status: active
61
+
62
+ intent: |
63
+ Another test specification.
64
+
65
+ requirements:
66
+ - id: req:another-feature:setup
67
+ description: Setup the feature
68
+ acceptance:
69
+ - Feature is properly configured
70
+ `;
71
+ describe('spec add command', () => {
72
+ let testDir;
73
+ let mockStdout;
74
+ let mockStderr;
75
+ beforeEach(() => {
76
+ // Create a unique test directory
77
+ testDir = join(tmpdir(), `prov-spec-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
78
+ mkdirSync(testDir, { recursive: true });
79
+ mkdirSync(join(testDir, 'spec'), { recursive: true });
80
+ // Capture stdout/stderr
81
+ mockStdout = [];
82
+ mockStderr = [];
83
+ vi.spyOn(process.stdout, 'write').mockImplementation((msg) => {
84
+ mockStdout.push(String(msg));
85
+ return true;
86
+ });
87
+ vi.spyOn(process.stderr, 'write').mockImplementation((msg) => {
88
+ mockStderr.push(String(msg));
89
+ return true;
90
+ });
91
+ // Mock process.exit to throw instead of exiting
92
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
93
+ throw new Error(`Process exited with code ${String(code)}`);
94
+ });
95
+ // Initialize prov
96
+ runInit({ dir: testDir }, {});
97
+ mockStdout = [];
98
+ mockStderr = [];
99
+ });
100
+ afterEach(() => {
101
+ // Clean up test directory
102
+ if (existsSync(testDir)) {
103
+ rmSync(testDir, { recursive: true, force: true });
104
+ }
105
+ vi.restoreAllMocks();
106
+ });
107
+ describe('adding a valid spec', () => {
108
+ it('should add spec to graph', () => {
109
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
110
+ writeFileSync(specPath, VALID_SPEC);
111
+ const globalOpts = { dir: testDir, format: 'json' };
112
+ runSpecAdd(globalOpts, 'spec/test.spec.yaml', {});
113
+ const output = mockStdout.join('');
114
+ const result = JSON.parse(output);
115
+ expect(result.success).toBe(true);
116
+ expect(result.specId).toBe('spec:test-feature:v1');
117
+ });
118
+ it('should store spec and requirements in graph', () => {
119
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
120
+ writeFileSync(specPath, VALID_SPEC);
121
+ const globalOpts = { dir: testDir };
122
+ runSpecAdd(globalOpts, 'spec/test.spec.yaml', {});
123
+ // Verify graph contains spec and requirements
124
+ const graphPath = join(testDir, PROV_DIR, GRAPH_FILE);
125
+ const graph = JSON.parse(readFileSync(graphPath, 'utf8'));
126
+ expect(graph.nodes['spec:test-feature:v1']).toBeDefined();
127
+ expect(graph.nodes['req:test-feature:init']).toBeDefined();
128
+ expect(graph.nodes['req:test-feature:run']).toBeDefined();
129
+ // Verify edges exist
130
+ expect(graph.edges).toContainEqual({
131
+ from: 'spec:test-feature:v1',
132
+ to: 'req:test-feature:init',
133
+ type: 'contains',
134
+ });
135
+ });
136
+ it('should output JSON when format is json', () => {
137
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
138
+ writeFileSync(specPath, VALID_SPEC);
139
+ const globalOpts = { dir: testDir, format: 'json' };
140
+ runSpecAdd(globalOpts, 'spec/test.spec.yaml', {});
141
+ const output = mockStdout.join('');
142
+ const result = JSON.parse(output);
143
+ expect(result.success).toBe(true);
144
+ expect(result.specId).toBe('spec:test-feature:v1');
145
+ expect(result.requirementCount).toBe(2);
146
+ expect(result.hash).toMatch(/^sha256:/);
147
+ });
148
+ it('should be idempotent - adding same spec twice', () => {
149
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
150
+ writeFileSync(specPath, VALID_SPEC);
151
+ const globalOpts = { dir: testDir };
152
+ runSpecAdd(globalOpts, 'spec/test.spec.yaml', {});
153
+ mockStdout = [];
154
+ runSpecAdd(globalOpts, 'spec/test.spec.yaml', {});
155
+ const output = mockStdout.join('');
156
+ expect(output).toContain('unchanged');
157
+ });
158
+ });
159
+ describe('error handling', () => {
160
+ it('should fail if prov not initialized', () => {
161
+ // Use a directory without prov initialized
162
+ const uninitDir = join(testDir, 'uninit');
163
+ mkdirSync(uninitDir, { recursive: true });
164
+ mkdirSync(join(uninitDir, 'spec'), { recursive: true });
165
+ const specPath = join(uninitDir, 'spec', 'test.spec.yaml');
166
+ writeFileSync(specPath, VALID_SPEC);
167
+ const globalOpts = { dir: uninitDir, format: 'json' };
168
+ expect(() => {
169
+ runSpecAdd(globalOpts, 'spec/test.spec.yaml', {});
170
+ }).toThrow('Process exited with code 1');
171
+ const output = mockStdout.join('');
172
+ const result = JSON.parse(output);
173
+ expect(result.success).toBe(false);
174
+ expect(result.error).toContain('not initialized');
175
+ });
176
+ it('should fail if file not found', () => {
177
+ const globalOpts = { dir: testDir, format: 'json' };
178
+ expect(() => {
179
+ runSpecAdd(globalOpts, 'spec/nonexistent.yaml', {});
180
+ }).toThrow('Process exited with code 1');
181
+ const output = mockStdout.join('');
182
+ const result = JSON.parse(output);
183
+ expect(result.success).toBe(false);
184
+ expect(result.error).toContain('File not found');
185
+ });
186
+ it('should fail if spec has validation errors', () => {
187
+ const specPath = join(testDir, 'spec', 'invalid.spec.yaml');
188
+ writeFileSync(specPath, INVALID_SPEC_NO_ID);
189
+ const globalOpts = { dir: testDir, format: 'json' };
190
+ expect(() => {
191
+ runSpecAdd(globalOpts, 'spec/invalid.spec.yaml', {});
192
+ }).toThrow('Process exited with code 1');
193
+ const output = mockStdout.join('');
194
+ const result = JSON.parse(output);
195
+ expect(result.success).toBe(false);
196
+ expect(result.validationErrors).toContain('Missing required field: id');
197
+ });
198
+ });
199
+ });
200
+ describe('spec list command', () => {
201
+ let testDir;
202
+ let mockStdout;
203
+ let mockStderr;
204
+ beforeEach(() => {
205
+ testDir = join(tmpdir(), `prov-spec-list-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
206
+ mkdirSync(testDir, { recursive: true });
207
+ mkdirSync(join(testDir, 'spec'), { recursive: true });
208
+ mockStdout = [];
209
+ mockStderr = [];
210
+ vi.spyOn(process.stdout, 'write').mockImplementation((msg) => {
211
+ mockStdout.push(String(msg));
212
+ return true;
213
+ });
214
+ vi.spyOn(process.stderr, 'write').mockImplementation((msg) => {
215
+ mockStderr.push(String(msg));
216
+ return true;
217
+ });
218
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
219
+ throw new Error(`Process exited with code ${String(code)}`);
220
+ });
221
+ // Initialize prov
222
+ runInit({ dir: testDir }, {});
223
+ mockStdout = [];
224
+ mockStderr = [];
225
+ });
226
+ afterEach(() => {
227
+ if (existsSync(testDir)) {
228
+ rmSync(testDir, { recursive: true, force: true });
229
+ }
230
+ vi.restoreAllMocks();
231
+ });
232
+ it('should list no specs when none added', () => {
233
+ const globalOpts = { dir: testDir, format: 'json' };
234
+ runSpecList(globalOpts, {});
235
+ const output = mockStdout.join('');
236
+ const result = JSON.parse(output);
237
+ expect(result.specs).toHaveLength(0);
238
+ });
239
+ it('should list added specs in table format', () => {
240
+ // Add a spec first
241
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
242
+ writeFileSync(specPath, VALID_SPEC);
243
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
244
+ mockStdout = [];
245
+ const globalOpts = { dir: testDir };
246
+ runSpecList(globalOpts, {});
247
+ const output = mockStdout.join('');
248
+ expect(output).toContain('spec:test-feature:v1');
249
+ expect(output).toContain('Test Feature Specification');
250
+ });
251
+ it('should list multiple specs', () => {
252
+ // Add two specs
253
+ writeFileSync(join(testDir, 'spec', 'test1.spec.yaml'), VALID_SPEC);
254
+ writeFileSync(join(testDir, 'spec', 'test2.spec.yaml'), VALID_SPEC_2);
255
+ runSpecAdd({ dir: testDir }, 'spec/test1.spec.yaml', {});
256
+ runSpecAdd({ dir: testDir }, 'spec/test2.spec.yaml', {});
257
+ mockStdout = [];
258
+ const globalOpts = { dir: testDir, format: 'json' };
259
+ runSpecList(globalOpts, {});
260
+ const output = mockStdout.join('');
261
+ const result = JSON.parse(output);
262
+ expect(result.specs).toHaveLength(2);
263
+ const specIds = result.specs.map((s) => s.id);
264
+ expect(specIds).toContain('spec:test-feature:v1');
265
+ expect(specIds).toContain('spec:another-feature:v1');
266
+ });
267
+ it('should detect stale specs', () => {
268
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
269
+ writeFileSync(specPath, VALID_SPEC);
270
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
271
+ // Modify the spec file
272
+ const modifiedSpec = VALID_SPEC.replace('A test specification', 'A modified test specification');
273
+ writeFileSync(specPath, modifiedSpec);
274
+ mockStdout = [];
275
+ const globalOpts = { dir: testDir, format: 'json' };
276
+ runSpecList(globalOpts, {});
277
+ const output = mockStdout.join('');
278
+ const result = JSON.parse(output);
279
+ expect(result.specs[0].status).toBe('stale');
280
+ });
281
+ it('should detect missing spec files', () => {
282
+ const specPath = join(testDir, 'spec', 'test.spec.yaml');
283
+ writeFileSync(specPath, VALID_SPEC);
284
+ runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
285
+ // Delete the spec file
286
+ rmSync(specPath);
287
+ mockStdout = [];
288
+ const globalOpts = { dir: testDir, format: 'json' };
289
+ runSpecList(globalOpts, {});
290
+ const output = mockStdout.join('');
291
+ const result = JSON.parse(output);
292
+ expect(result.specs[0].status).toBe('missing');
293
+ });
294
+ });
295
+ describe('spec validate command', () => {
296
+ let testDir;
297
+ let mockStdout;
298
+ let mockStderr;
299
+ beforeEach(() => {
300
+ testDir = join(tmpdir(), `prov-spec-validate-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
301
+ mkdirSync(testDir, { recursive: true });
302
+ mkdirSync(join(testDir, 'spec'), { recursive: true });
303
+ mockStdout = [];
304
+ mockStderr = [];
305
+ vi.spyOn(process.stdout, 'write').mockImplementation((msg) => {
306
+ mockStdout.push(String(msg));
307
+ return true;
308
+ });
309
+ vi.spyOn(process.stderr, 'write').mockImplementation((msg) => {
310
+ mockStderr.push(String(msg));
311
+ return true;
312
+ });
313
+ vi.spyOn(process, 'exit').mockImplementation((code) => {
314
+ throw new Error(`Process exited with code ${String(code)}`);
315
+ });
316
+ });
317
+ afterEach(() => {
318
+ if (existsSync(testDir)) {
319
+ rmSync(testDir, { recursive: true, force: true });
320
+ }
321
+ vi.restoreAllMocks();
322
+ });
323
+ it('should validate with no errors for valid specs', () => {
324
+ writeFileSync(join(testDir, 'spec', 'test.spec.yaml'), VALID_SPEC);
325
+ const globalOpts = { dir: testDir, format: 'json' };
326
+ runSpecValidate(globalOpts, {});
327
+ const output = mockStdout.join('');
328
+ const result = JSON.parse(output);
329
+ expect(result.valid).toBe(true);
330
+ expect(result.issues).toHaveLength(0);
331
+ expect(result.specsChecked).toBe(1);
332
+ });
333
+ it('should report errors for invalid specs', () => {
334
+ writeFileSync(join(testDir, 'spec', 'invalid.spec.yaml'), INVALID_SPEC_NO_ID);
335
+ const globalOpts = { dir: testDir, format: 'json' };
336
+ expect(() => {
337
+ runSpecValidate(globalOpts, {});
338
+ }).toThrow('Process exited with code 1');
339
+ const output = mockStdout.join('');
340
+ const result = JSON.parse(output);
341
+ expect(result.valid).toBe(false);
342
+ expect(result.issues.some((i) => i.message.includes('Missing required field: id'))).toBe(true);
343
+ });
344
+ it('should report invalid requirement ID format', () => {
345
+ writeFileSync(join(testDir, 'spec', 'bad-req.spec.yaml'), INVALID_SPEC_BAD_REQ_ID);
346
+ const globalOpts = { dir: testDir, format: 'json' };
347
+ expect(() => {
348
+ runSpecValidate(globalOpts, {});
349
+ }).toThrow('Process exited with code 1');
350
+ const output = mockStdout.join('');
351
+ const result = JSON.parse(output);
352
+ expect(result.valid).toBe(false);
353
+ expect(result.issues.some((i) => i.message.includes('invalid ID format'))).toBe(true);
354
+ });
355
+ it('should detect duplicate spec IDs across files', () => {
356
+ writeFileSync(join(testDir, 'spec', 'spec1.yaml'), VALID_SPEC);
357
+ writeFileSync(join(testDir, 'spec', 'spec2.yaml'), VALID_SPEC); // Same spec ID!
358
+ const globalOpts = { dir: testDir };
359
+ expect(() => {
360
+ runSpecValidate(globalOpts, {});
361
+ }).toThrow('Process exited with code 1');
362
+ const output = mockStdout.join('') + mockStderr.join('');
363
+ expect(output).toContain('Duplicate spec ID');
364
+ });
365
+ it('should output JSON when format is json', () => {
366
+ writeFileSync(join(testDir, 'spec', 'test.spec.yaml'), VALID_SPEC);
367
+ const globalOpts = { dir: testDir, format: 'json' };
368
+ runSpecValidate(globalOpts, {});
369
+ const output = mockStdout.join('');
370
+ const result = JSON.parse(output);
371
+ expect(result.valid).toBe(true);
372
+ expect(result.issues).toHaveLength(0);
373
+ expect(result.specsChecked).toBe(1);
374
+ });
375
+ it('should report missing dependency references', () => {
376
+ const specWithMissingDep = `id: spec:missing-dep:v1
377
+ version: 1.0.0
378
+ title: Spec with Missing Dependency
379
+ status: draft
380
+ intent: Tests dependency validation
381
+ requirements:
382
+ - id: req:missing-dep:main
383
+ description: Has a missing dependency
384
+ acceptance:
385
+ - Something
386
+ depends_on:
387
+ - req:nonexistent:feature
388
+ `;
389
+ writeFileSync(join(testDir, 'spec', 'missing-dep.spec.yaml'), specWithMissingDep);
390
+ const globalOpts = { dir: testDir };
391
+ expect(() => {
392
+ runSpecValidate(globalOpts, {});
393
+ }).toThrow('Process exited with code 1');
394
+ const output = mockStdout.join('') + mockStderr.join('');
395
+ expect(output).toContain('unknown dependency');
396
+ });
397
+ it('should report empty result when no spec files found', () => {
398
+ // Empty spec directory
399
+ const globalOpts = { dir: testDir, format: 'json' };
400
+ runSpecValidate(globalOpts, {});
401
+ const output = mockStdout.join('');
402
+ const result = JSON.parse(output);
403
+ expect(result.valid).toBe(true);
404
+ expect(result.specsChecked).toBe(0);
405
+ });
406
+ });
407
+ //# sourceMappingURL=spec.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.test.js","sourceRoot":"","sources":["../../src/commands/spec.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACrF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAmCrD,yBAAyB;AACzB,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;CAsBlB,CAAC;AAEF,qCAAqC;AACrC,MAAM,kBAAkB,GAAG;;;;;CAK1B,CAAC;AAEF,MAAM,uBAAuB,GAAG;;;;;;;;;;CAU/B,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;;;;;CAapB,CAAC;AAEF,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAI,OAAe,CAAC;IACpB,IAAI,UAAoB,CAAC;IACzB,IAAI,UAAoB,CAAC;IAEzB,UAAU,CAAC,GAAG,EAAE;QACd,iCAAiC;QACjC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAChG,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,wBAAwB;QACxB,UAAU,GAAG,EAAE,CAAC;QAChB,UAAU,GAAG,EAAE,CAAC;QAEhB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAwB,EAAE,EAAE;YAChF,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAwB,EAAE,EAAE;YAChF,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,gDAAgD;QAChD,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAA6B,EAAE,EAAE;YAC7E,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,kBAAkB;QAClB,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,UAAU,GAAG,EAAE,CAAC;QAChB,UAAU,GAAG,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,0BAA0B;QAC1B,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACzD,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAEpC,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YACnE,UAAU,CAAC,UAAU,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;YAElD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAsB,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACzD,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAEpC,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;YACnD,UAAU,CAAC,UAAU,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;YAElD,8CAA8C;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YACtD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAkB,CAAC;YAE3E,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC1D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAC3D,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAE1D,qBAAqB;YACrB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC;gBACjC,IAAI,EAAE,sBAAsB;gBAC5B,EAAE,EAAE,uBAAuB;gBAC3B,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACzD,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAEpC,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YACnE,UAAU,CAAC,UAAU,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;YAElD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAsB,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACnD,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;YACzD,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAEpC,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;YACnD,UAAU,CAAC,UAAU,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;YAClD,UAAU,GAAG,EAAE,CAAC;YAEhB,UAAU,CAAC,UAAU,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;YAElD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,2CAA2C;YAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC1C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAExD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;YAC3D,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YAEpC,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAErE,MAAM,CAAC,GAAG,EAAE;gBACV,UAAU,CAAC,UAAU,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;YACpD,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YAEzC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAsB,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAEnE,MAAM,CAAC,GAAG,EAAE;gBACV,UAAU,CAAC,UAAU,EAAE,uBAAuB,EAAE,EAAE,CAAC,CAAC;YACtD,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YAEzC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAsB,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;YAC5D,aAAa,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;YAE5C,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAEnE,MAAM,CAAC,GAAG,EAAE;gBACV,UAAU,CAAC,UAAU,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;YAEzC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAsB,CAAC;YACvD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,OAAe,CAAC;IACpB,IAAI,UAAoB,CAAC;IACzB,IAAI,UAAoB,CAAC;IAEzB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,uBAAuB,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACrG,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,UAAU,GAAG,EAAE,CAAC;QAChB,UAAU,GAAG,EAAE,CAAC;QAEhB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAwB,EAAE,EAAE;YAChF,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAwB,EAAE,EAAE;YAChF,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAA6B,EAAE,EAAE;YAC7E,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,kBAAkB;QAClB,OAAO,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QAC9B,UAAU,GAAG,EAAE,CAAC;QAChB,UAAU,GAAG,EAAE,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnE,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAuB,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,mBAAmB;QACnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACzD,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpC,UAAU,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;QACxD,UAAU,GAAG,EAAE,CAAC;QAEhB,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QACnD,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,gBAAgB;QAChB,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,UAAU,CAAC,CAAC;QACpE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,YAAY,CAAC,CAAC;QAEtE,UAAU,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;QACzD,UAAU,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,sBAAsB,EAAE,EAAE,CAAC,CAAC;QACzD,UAAU,GAAG,EAAE,CAAC;QAEhB,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnE,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAuB,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAClD,MAAM,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACzD,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpC,UAAU,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAExD,uBAAuB;QACvB,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,sBAAsB,EAAE,+BAA+B,CAAC,CAAC;QACjG,aAAa,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAEtC,UAAU,GAAG,EAAE,CAAC;QAChB,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnE,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAuB,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC;QACzD,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACpC,UAAU,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,qBAAqB,EAAE,EAAE,CAAC,CAAC;QAExD,uBAAuB;QACvB,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEjB,UAAU,GAAG,EAAE,CAAC;QAChB,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnE,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAE5B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAuB,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,OAAe,CAAC;IACpB,IAAI,UAAoB,CAAC;IACzB,IAAI,UAAoB,CAAC;IAEzB,UAAU,CAAC,GAAG,EAAE;QACd,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,2BAA2B,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACzG,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEtD,UAAU,GAAG,EAAE,CAAC;QAChB,UAAU,GAAG,EAAE,CAAC;QAEhB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAwB,EAAE,EAAE;YAChF,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,GAAwB,EAAE,EAAE;YAChF,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC,IAA6B,EAAE,EAAE;YAC7E,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,UAAU,CAAC,CAAC;QAEnE,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnE,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA2B,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAE9E,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAEnE,MAAM,CAAC,GAAG,EAAE;YACV,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA2B,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,uBAAuB,CAAC,CAAC;QAEnF,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAEnE,MAAM,CAAC,GAAG,EAAE;YACV,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA2B,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;QAC/D,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,gBAAgB;QAEhF,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QAEnD,MAAM,CAAC,GAAG,EAAE;YACV,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,UAAU,CAAC,CAAC;QAEnE,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnE,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA2B,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,kBAAkB,GAAG;;;;;;;;;;;;CAY9B,CAAC;QACE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,uBAAuB,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAElF,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QAEnD,MAAM,CAAC,GAAG,EAAE;YACV,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAEzC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,uBAAuB;QACvB,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACnE,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA2B,CAAC;QAC5D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,157 @@
1
+ /**
2
+ * prov trace commands implementation.
3
+ *
4
+ * Commands for managing artifact traces:
5
+ * - trace add: Link an artifact to a plan step
6
+ * - trace show: Show provenance for an artifact
7
+ * - trace why: Show implementations of a requirement
8
+ *
9
+ * @see req:cli:trace-add
10
+ * @see req:cli:trace-show
11
+ * @see req:cli:trace-why
12
+ */
13
+ import { type GlobalOptions } from '../cli.js';
14
+ import type { TraceId, StepId, RequirementId, Hash } from '../types.js';
15
+ /**
16
+ * Options for trace add command.
17
+ */
18
+ export interface TraceAddOptions {
19
+ to: string;
20
+ autoHash?: boolean;
21
+ }
22
+ /**
23
+ * Result of trace add command.
24
+ */
25
+ export interface TraceAddResult {
26
+ success: boolean;
27
+ traceId?: TraceId;
28
+ artifactPath?: string;
29
+ stepId?: StepId;
30
+ artifactHash?: Hash;
31
+ error?: string;
32
+ }
33
+ /**
34
+ * Options for trace show command.
35
+ */
36
+ export interface TraceShowOptions {
37
+ format?: string;
38
+ }
39
+ /**
40
+ * Provenance chain entry.
41
+ */
42
+ export interface ProvenanceEntry {
43
+ type: 'artifact' | 'step' | 'decision' | 'requirement' | 'spec';
44
+ id: string;
45
+ description?: string;
46
+ }
47
+ /**
48
+ * Result of trace show command.
49
+ */
50
+ export interface TraceShowResult {
51
+ success: boolean;
52
+ artifact?: {
53
+ path: string;
54
+ hash: Hash;
55
+ stale: boolean;
56
+ };
57
+ trace?: {
58
+ id: TraceId;
59
+ stepId: StepId;
60
+ createdAt: string;
61
+ };
62
+ provenance?: ProvenanceEntry[];
63
+ error?: string;
64
+ }
65
+ /**
66
+ * Options for trace why command.
67
+ */
68
+ export interface TraceWhyOptions {
69
+ format?: string;
70
+ }
71
+ /**
72
+ * Implementation entry for why command.
73
+ */
74
+ export interface ImplementationEntry {
75
+ artifactPath: string;
76
+ stepId: StepId;
77
+ stepAction: string;
78
+ traceId: TraceId;
79
+ stale: boolean;
80
+ }
81
+ /**
82
+ * Result of trace why command.
83
+ */
84
+ export interface TraceWhyResult {
85
+ success: boolean;
86
+ requirementId?: RequirementId;
87
+ requirement?: {
88
+ id: RequirementId;
89
+ description: string;
90
+ };
91
+ implementations?: ImplementationEntry[];
92
+ error?: string;
93
+ }
94
+ /**
95
+ * Execute the trace add command.
96
+ *
97
+ * Links an artifact (file) to a plan step, recording the current hash
98
+ * for staleness detection.
99
+ *
100
+ * @see req:cli:trace-add
101
+ */
102
+ export declare function runTraceAdd(globalOpts: GlobalOptions, artifactPath: string, options: TraceAddOptions): void;
103
+ /**
104
+ * Execute the trace show command.
105
+ *
106
+ * Shows the provenance chain for an artifact: artifact -> step -> decision/requirement -> spec.
107
+ *
108
+ * @see req:cli:trace-show
109
+ */
110
+ export declare function runTraceShow(globalOpts: GlobalOptions, artifactPath: string, _options: TraceShowOptions): void;
111
+ /**
112
+ * Execute the trace why command.
113
+ *
114
+ * Shows all artifacts that implement a requirement, traversing:
115
+ * requirement <- step <- artifact
116
+ *
117
+ * @see req:cli:trace-why
118
+ */
119
+ export declare function runTraceWhy(globalOpts: GlobalOptions, reqIdStr: string, _options: TraceWhyOptions): void;
120
+ /**
121
+ * Options for trace scan command.
122
+ */
123
+ export interface TraceScanOptions {
124
+ dirs?: string[];
125
+ format?: string;
126
+ }
127
+ /**
128
+ * A scanned trace marker found in source code.
129
+ */
130
+ export interface ScannedTrace {
131
+ file: string;
132
+ line: number;
133
+ stepId: StepId;
134
+ comment: string;
135
+ }
136
+ /**
137
+ * Result of trace scan command.
138
+ */
139
+ export interface TraceScanResult {
140
+ success: boolean;
141
+ scannedFiles?: number;
142
+ tracesFound?: number;
143
+ tracesAdded?: number;
144
+ tracesUpdated?: number;
145
+ traces?: ScannedTrace[];
146
+ error?: string;
147
+ }
148
+ /**
149
+ * Execute the trace scan command.
150
+ *
151
+ * Scans source files for inline trace markers (// prov:step:xxx)
152
+ * and creates/updates traces automatically.
153
+ *
154
+ * @see req:agent:inline-tracing
155
+ */
156
+ export declare function runTraceScan(globalOpts: GlobalOptions, options: TraceScanOptions): void;
157
+ //# sourceMappingURL=trace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/commands/trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAK/C,OAAO,KAAK,EAEV,OAAO,EACP,MAAM,EACN,aAAa,EACb,IAAI,EAIL,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,MAAM,CAAC;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,IAAI,CAAC;QACX,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,KAAK,CAAC,EAAE;QACN,EAAE,EAAE,OAAO,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,WAAW,CAAC,EAAE;QACZ,EAAE,EAAE,aAAa,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IACF,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AA4CD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,aAAa,EACzB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,eAAe,GACvB,IAAI,CA4LN;AAMD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,aAAa,EACzB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,gBAAgB,GACzB,IAAI,CAkLN;AAMD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,aAAa,EACzB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,eAAe,GACxB,IAAI,CA6JN;AAMD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAsFD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,UAAU,EAAE,aAAa,EACzB,OAAO,EAAE,gBAAgB,GACxB,IAAI,CAmLN"}