@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,635 @@
1
+ /**
2
+ * prov spec commands implementation.
3
+ *
4
+ * Commands for managing specifications:
5
+ * - spec add: Add a specification to tracking
6
+ * - spec list: List tracked specifications
7
+ * - spec validate: Validate specification consistency
8
+ *
9
+ * @see req:cli:spec-add
10
+ * @see req:cli:spec-list
11
+ * @see req:cli:spec-validate
12
+ */
13
+ import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
14
+ import { join, resolve, relative, extname } from 'node:path';
15
+ import { isInitialized, loadGraph, saveGraph } from '../storage.js';
16
+ import { addSpecToGraph } from '../graph.js';
17
+ import { parseYaml, computeHash } from '../hash.js';
18
+ import { output, error, success, warn, resolveFormat } from '../output.js';
19
+ // ============================================================================
20
+ // Validation Helpers
21
+ // ============================================================================
22
+ /**
23
+ * Validate spec ID format: spec:{name}:v{number}
24
+ */
25
+ function isValidSpecId(id) {
26
+ if (typeof id !== 'string')
27
+ return false;
28
+ return /^spec:[a-z0-9-]+:v\d+$/.test(id);
29
+ }
30
+ /**
31
+ * Validate requirement ID format: req:{name} or req:{spec}:{name}
32
+ * Allows both short (req:hashing) and full (req:entity:spec) formats.
33
+ */
34
+ function isValidRequirementId(id) {
35
+ if (typeof id !== 'string')
36
+ return false;
37
+ // Allow req:{name} or req:{spec}:{name} format
38
+ return /^req:[a-z0-9-]+(:[a-z0-9-]+)?$/.test(id);
39
+ }
40
+ /**
41
+ * Validate entity status.
42
+ */
43
+ function isValidStatus(status) {
44
+ return status === 'draft' || status === 'active' || status === 'deprecated' || status === 'archived';
45
+ }
46
+ /**
47
+ * Validate a raw spec object and convert to typed Spec.
48
+ */
49
+ function validateSpec(raw, _filePath) {
50
+ const errors = [];
51
+ // Required fields
52
+ if (raw.id === undefined || raw.id === null) {
53
+ errors.push('Missing required field: id');
54
+ }
55
+ else if (!isValidSpecId(raw.id)) {
56
+ errors.push(`Invalid spec ID format: ${String(raw.id)} (expected spec:{name}:v{number})`);
57
+ }
58
+ if (raw.version === undefined || raw.version === null) {
59
+ errors.push('Missing required field: version');
60
+ }
61
+ else if (typeof raw.version !== 'string') {
62
+ errors.push(`Invalid version type: expected string, got ${typeof raw.version}`);
63
+ }
64
+ if (raw.title === undefined || raw.title === null) {
65
+ errors.push('Missing required field: title');
66
+ }
67
+ else if (typeof raw.title !== 'string') {
68
+ errors.push(`Invalid title type: expected string, got ${typeof raw.title}`);
69
+ }
70
+ if (raw.status !== undefined && !isValidStatus(raw.status)) {
71
+ errors.push(`Invalid status: ${String(raw.status)} (expected draft|active|deprecated|archived)`);
72
+ }
73
+ if (raw.intent === undefined || raw.intent === null) {
74
+ errors.push('Missing required field: intent');
75
+ }
76
+ else if (typeof raw.intent !== 'string') {
77
+ errors.push(`Invalid intent type: expected string, got ${typeof raw.intent}`);
78
+ }
79
+ if (raw.requirements === undefined || raw.requirements === null) {
80
+ errors.push('Missing required field: requirements');
81
+ }
82
+ else if (!Array.isArray(raw.requirements)) {
83
+ errors.push(`Invalid requirements type: expected array, got ${typeof raw.requirements}`);
84
+ }
85
+ if (errors.length > 0) {
86
+ return { errors };
87
+ }
88
+ // Validate requirements
89
+ const requirements = [];
90
+ const reqIds = new Set();
91
+ for (let i = 0; i < raw.requirements.length; i++) {
92
+ const rawReq = raw.requirements[i];
93
+ if (rawReq.id === undefined || rawReq.id === null) {
94
+ errors.push(`Requirement ${i}: missing required field: id`);
95
+ continue;
96
+ }
97
+ if (!isValidRequirementId(rawReq.id)) {
98
+ errors.push(`Requirement ${i}: invalid ID format: ${String(rawReq.id)} (expected req:{spec}:{name})`);
99
+ continue;
100
+ }
101
+ if (reqIds.has(rawReq.id)) {
102
+ errors.push(`Requirement ${i}: duplicate ID: ${rawReq.id}`);
103
+ continue;
104
+ }
105
+ reqIds.add(rawReq.id);
106
+ if (rawReq.description === undefined || typeof rawReq.description !== 'string') {
107
+ errors.push(`Requirement ${rawReq.id}: missing or invalid description`);
108
+ continue;
109
+ }
110
+ if (rawReq.acceptance === undefined || !Array.isArray(rawReq.acceptance)) {
111
+ errors.push(`Requirement ${rawReq.id}: missing or invalid acceptance criteria`);
112
+ continue;
113
+ }
114
+ // Validate dependencies if present
115
+ let dependencies;
116
+ if (rawReq.depends_on !== undefined) {
117
+ if (!Array.isArray(rawReq.depends_on)) {
118
+ errors.push(`Requirement ${rawReq.id}: depends_on must be an array`);
119
+ }
120
+ else {
121
+ dependencies = [];
122
+ for (const dep of rawReq.depends_on) {
123
+ if (!isValidRequirementId(dep)) {
124
+ errors.push(`Requirement ${rawReq.id}: invalid dependency ID: ${dep}`);
125
+ }
126
+ else {
127
+ dependencies.push(dep);
128
+ }
129
+ }
130
+ }
131
+ }
132
+ const req = {
133
+ id: rawReq.id,
134
+ description: rawReq.description,
135
+ acceptance: rawReq.acceptance,
136
+ ...(dependencies !== undefined && dependencies.length > 0 ? { dependencies } : {}),
137
+ };
138
+ requirements.push(req);
139
+ }
140
+ if (errors.length > 0) {
141
+ return { errors };
142
+ }
143
+ const spec = {
144
+ id: raw.id,
145
+ version: raw.version,
146
+ title: raw.title,
147
+ status: raw.status ?? 'draft',
148
+ intent: raw.intent,
149
+ requirements,
150
+ };
151
+ return { spec, errors: [] };
152
+ }
153
+ // ============================================================================
154
+ // File Discovery
155
+ // ============================================================================
156
+ /**
157
+ * Find all spec files in the spec directory.
158
+ */
159
+ function findSpecFiles(projectRoot) {
160
+ const specDir = join(projectRoot, 'spec');
161
+ const files = [];
162
+ if (!existsSync(specDir)) {
163
+ return files;
164
+ }
165
+ function walkDir(dir) {
166
+ const entries = readdirSync(dir);
167
+ for (const entry of entries) {
168
+ const fullPath = join(dir, entry);
169
+ const stat = statSync(fullPath);
170
+ if (stat.isDirectory()) {
171
+ walkDir(fullPath);
172
+ }
173
+ else {
174
+ const ext = extname(entry).toLowerCase();
175
+ if (ext === '.yaml' || ext === '.yml') {
176
+ // Only include files with .spec. in the name or in spec directory
177
+ if (entry.includes('.spec.') || dir.includes('/spec')) {
178
+ files.push(fullPath);
179
+ }
180
+ }
181
+ }
182
+ }
183
+ }
184
+ walkDir(specDir);
185
+ return files.sort();
186
+ }
187
+ /**
188
+ * Load and parse a spec file.
189
+ */
190
+ function loadSpecFile(filePath) {
191
+ try {
192
+ const content = readFileSync(filePath, 'utf8');
193
+ const raw = parseYaml(content);
194
+ if (raw === null || typeof raw !== 'object') {
195
+ return { errors: ['File does not contain a valid YAML object'] };
196
+ }
197
+ return validateSpec(raw, filePath);
198
+ }
199
+ catch (err) {
200
+ return {
201
+ errors: [`Failed to parse YAML: ${err instanceof Error ? err.message : String(err)}`],
202
+ };
203
+ }
204
+ }
205
+ // ============================================================================
206
+ // spec add Command
207
+ // ============================================================================
208
+ /**
209
+ * Execute the spec add command.
210
+ *
211
+ * @see req:cli:spec-add
212
+ */
213
+ export function runSpecAdd(globalOpts, file, _options) {
214
+ const projectRoot = globalOpts.dir ?? process.cwd();
215
+ const fmt = resolveFormat({ format: globalOpts.format });
216
+ // Check if prov is initialized
217
+ if (!isInitialized(projectRoot)) {
218
+ const result = {
219
+ success: false,
220
+ error: 'prov is not initialized. Run "prov init" first.',
221
+ };
222
+ if (fmt === 'json') {
223
+ output(result, { format: 'json' });
224
+ }
225
+ else if (fmt === 'yaml') {
226
+ output(result, { format: 'yaml' });
227
+ }
228
+ else {
229
+ error(result.error);
230
+ }
231
+ process.exit(1);
232
+ }
233
+ // Resolve file path
234
+ const filePath = resolve(projectRoot, file);
235
+ if (!existsSync(filePath)) {
236
+ const result = {
237
+ success: false,
238
+ error: `File not found: ${file}`,
239
+ };
240
+ if (fmt === 'json') {
241
+ output(result, { format: 'json' });
242
+ }
243
+ else if (fmt === 'yaml') {
244
+ output(result, { format: 'yaml' });
245
+ }
246
+ else {
247
+ error(result.error);
248
+ }
249
+ process.exit(1);
250
+ }
251
+ // Load and validate spec file
252
+ const { spec, errors } = loadSpecFile(filePath);
253
+ if (errors.length > 0 || spec === undefined) {
254
+ const result = {
255
+ success: false,
256
+ error: `Invalid spec file:\n ${errors.join('\n ')}`,
257
+ };
258
+ if (fmt === 'json') {
259
+ output({ ...result, validationErrors: errors }, { format: 'json' });
260
+ }
261
+ else if (fmt === 'yaml') {
262
+ output({ ...result, validationErrors: errors }, { format: 'yaml' });
263
+ }
264
+ else {
265
+ error(result.error);
266
+ }
267
+ process.exit(1);
268
+ }
269
+ // Compute hash
270
+ const hash = computeHash(spec);
271
+ const specWithHash = { ...spec, hash };
272
+ // Load existing graph
273
+ const loadResult = loadGraph(projectRoot);
274
+ if (!loadResult.success || loadResult.data === undefined) {
275
+ const result = {
276
+ success: false,
277
+ error: loadResult.error ?? 'Failed to load graph',
278
+ };
279
+ if (fmt === 'json') {
280
+ output(result, { format: 'json' });
281
+ }
282
+ else if (fmt === 'yaml') {
283
+ output(result, { format: 'yaml' });
284
+ }
285
+ else {
286
+ error(result.error);
287
+ }
288
+ process.exit(1);
289
+ }
290
+ const graph = loadResult.data;
291
+ // Check if spec already exists
292
+ const existingNode = graph.getNode(spec.id);
293
+ if (existingNode !== undefined) {
294
+ const existingSpec = existingNode.data;
295
+ if (existingNode.hash === hash) {
296
+ // Same content, no update needed
297
+ const result = {
298
+ success: true,
299
+ specId: spec.id,
300
+ hash,
301
+ requirementCount: spec.requirements.length,
302
+ };
303
+ if (fmt === 'json') {
304
+ output({ ...result, unchanged: true }, { format: 'json' });
305
+ }
306
+ else if (fmt === 'yaml') {
307
+ output({ ...result, unchanged: true }, { format: 'yaml' });
308
+ }
309
+ else {
310
+ success(`Spec ${spec.id} is already tracked (unchanged)`);
311
+ }
312
+ return;
313
+ }
314
+ // Different content - update by removing old and adding new
315
+ // First remove old requirements
316
+ for (const req of existingSpec.requirements) {
317
+ graph.removeNode(req.id);
318
+ }
319
+ graph.removeNode(spec.id);
320
+ }
321
+ // Add spec to graph
322
+ addSpecToGraph(graph, specWithHash);
323
+ // Save graph
324
+ const saveResult = saveGraph(graph, projectRoot);
325
+ if (!saveResult.success) {
326
+ const result = {
327
+ success: false,
328
+ error: saveResult.error ?? 'Failed to save graph',
329
+ };
330
+ if (fmt === 'json') {
331
+ output(result, { format: 'json' });
332
+ }
333
+ else if (fmt === 'yaml') {
334
+ output(result, { format: 'yaml' });
335
+ }
336
+ else {
337
+ error(result.error);
338
+ }
339
+ process.exit(1);
340
+ }
341
+ const result = {
342
+ success: true,
343
+ specId: spec.id,
344
+ hash,
345
+ requirementCount: spec.requirements.length,
346
+ };
347
+ if (fmt === 'json') {
348
+ output(result, { format: 'json' });
349
+ }
350
+ else if (fmt === 'yaml') {
351
+ output(result, { format: 'yaml' });
352
+ }
353
+ else {
354
+ success(`Added spec ${spec.id} (${spec.requirements.length} requirements)`);
355
+ }
356
+ }
357
+ // ============================================================================
358
+ // spec list Command
359
+ // ============================================================================
360
+ /**
361
+ * Execute the spec list command.
362
+ *
363
+ * @see req:cli:spec-list
364
+ */
365
+ export function runSpecList(globalOpts, options) {
366
+ const projectRoot = globalOpts.dir ?? process.cwd();
367
+ const fmt = resolveFormat({ format: globalOpts.format });
368
+ // Check if prov is initialized
369
+ if (!isInitialized(projectRoot)) {
370
+ const result = {
371
+ success: false,
372
+ error: 'prov is not initialized. Run "prov init" first.',
373
+ };
374
+ if (fmt === 'json') {
375
+ output(result, { format: 'json' });
376
+ }
377
+ else if (fmt === 'yaml') {
378
+ output(result, { format: 'yaml' });
379
+ }
380
+ else {
381
+ error(result.error);
382
+ }
383
+ process.exit(1);
384
+ }
385
+ // Load graph
386
+ const loadResult = loadGraph(projectRoot);
387
+ if (!loadResult.success || loadResult.data === undefined) {
388
+ const result = {
389
+ success: false,
390
+ error: loadResult.error ?? 'Failed to load graph',
391
+ };
392
+ if (fmt === 'json') {
393
+ output(result, { format: 'json' });
394
+ }
395
+ else if (fmt === 'yaml') {
396
+ output(result, { format: 'yaml' });
397
+ }
398
+ else {
399
+ error(result.error);
400
+ }
401
+ process.exit(1);
402
+ }
403
+ const graph = loadResult.data;
404
+ // Get all spec nodes
405
+ const specNodes = graph.getNodesByType('spec');
406
+ // Build spec entries
407
+ const specs = [];
408
+ for (const node of specNodes) {
409
+ const spec = node.data;
410
+ // Determine status - check if spec file still exists and matches
411
+ let displayStatus = spec.status;
412
+ // Find matching spec file
413
+ const specFiles = findSpecFiles(projectRoot);
414
+ let fileMatch;
415
+ for (const filePath of specFiles) {
416
+ const { spec: fileSpec } = loadSpecFile(filePath);
417
+ if (fileSpec?.id === spec.id) {
418
+ fileMatch = filePath;
419
+ const fileHash = computeHash(fileSpec);
420
+ if (fileHash !== node.hash) {
421
+ displayStatus = 'stale';
422
+ }
423
+ break;
424
+ }
425
+ }
426
+ if (fileMatch === undefined) {
427
+ displayStatus = 'missing';
428
+ }
429
+ // Filter by status if specified
430
+ if (options.status !== undefined && displayStatus !== options.status) {
431
+ continue;
432
+ }
433
+ specs.push({
434
+ id: spec.id,
435
+ version: spec.version,
436
+ title: spec.title,
437
+ status: displayStatus,
438
+ hash: node.hash ?? '',
439
+ requirements: spec.requirements.length,
440
+ });
441
+ }
442
+ // Sort by ID
443
+ specs.sort((a, b) => a.id.localeCompare(b.id));
444
+ const result = { specs };
445
+ if (fmt === 'json') {
446
+ output(result, { format: 'json' });
447
+ }
448
+ else if (fmt === 'yaml') {
449
+ output(result, { format: 'yaml' });
450
+ }
451
+ else {
452
+ if (specs.length === 0) {
453
+ success('No specifications tracked');
454
+ return;
455
+ }
456
+ const columns = [
457
+ { header: 'ID', key: 'id', minWidth: 20 },
458
+ { header: 'Version', key: 'version', minWidth: 8 },
459
+ { header: 'Title', key: 'title', maxWidth: 30 },
460
+ { header: 'Status', key: 'status', minWidth: 8 },
461
+ { header: 'Reqs', key: 'requirements', minWidth: 4, align: 'right' },
462
+ { header: 'Hash', key: 'hash', minWidth: 16 },
463
+ ];
464
+ output(specs, { format: 'table', columns });
465
+ }
466
+ }
467
+ // ============================================================================
468
+ // spec validate Command
469
+ // ============================================================================
470
+ /**
471
+ * Execute the spec validate command.
472
+ *
473
+ * @see req:cli:spec-validate
474
+ */
475
+ export function runSpecValidate(globalOpts, _options) {
476
+ const projectRoot = globalOpts.dir ?? process.cwd();
477
+ const fmt = resolveFormat({ format: globalOpts.format });
478
+ const issues = [];
479
+ const specFiles = findSpecFiles(projectRoot);
480
+ if (specFiles.length === 0) {
481
+ const result = {
482
+ valid: true,
483
+ issues: [],
484
+ specsChecked: 0,
485
+ };
486
+ if (fmt === 'json') {
487
+ output(result, { format: 'json' });
488
+ }
489
+ else if (fmt === 'yaml') {
490
+ output(result, { format: 'yaml' });
491
+ }
492
+ else {
493
+ warn('No spec files found in spec/ directory');
494
+ }
495
+ return;
496
+ }
497
+ // Track all spec IDs and requirement IDs for cross-file validation
498
+ const allSpecIds = new Map(); // specId -> filePath
499
+ const allReqIds = new Map(); // reqId -> specId
500
+ const allSpecs = [];
501
+ // First pass: validate each file individually
502
+ for (const filePath of specFiles) {
503
+ const relPath = relative(projectRoot, filePath);
504
+ const { spec, errors } = loadSpecFile(filePath);
505
+ if (errors.length > 0) {
506
+ for (const err of errors) {
507
+ issues.push({
508
+ severity: 'error',
509
+ file: relPath,
510
+ message: err,
511
+ });
512
+ }
513
+ continue;
514
+ }
515
+ if (spec === undefined)
516
+ continue;
517
+ // Check for duplicate spec IDs across files
518
+ const existingFile = allSpecIds.get(spec.id);
519
+ if (existingFile !== undefined) {
520
+ issues.push({
521
+ severity: 'error',
522
+ file: relPath,
523
+ specId: spec.id,
524
+ message: `Duplicate spec ID: already defined in ${existingFile}`,
525
+ });
526
+ }
527
+ else {
528
+ allSpecIds.set(spec.id, relPath);
529
+ }
530
+ // Track requirement IDs
531
+ for (const req of spec.requirements) {
532
+ const existingSpec = allReqIds.get(req.id);
533
+ if (existingSpec !== undefined) {
534
+ issues.push({
535
+ severity: 'error',
536
+ file: relPath,
537
+ specId: spec.id,
538
+ message: `Duplicate requirement ID ${req.id}: already defined in ${existingSpec}`,
539
+ });
540
+ }
541
+ else {
542
+ allReqIds.set(req.id, spec.id);
543
+ }
544
+ }
545
+ allSpecs.push({ filePath, spec });
546
+ }
547
+ // Second pass: validate cross-references
548
+ for (const { filePath, spec } of allSpecs) {
549
+ const relPath = relative(projectRoot, filePath);
550
+ for (const req of spec.requirements) {
551
+ // Check that requirement ID prefix matches spec
552
+ const specName = spec.id.replace(/^spec:/, '').replace(/:v\d+$/, '');
553
+ const expectedPrefix = `req:${specName}:`;
554
+ if (!req.id.startsWith(expectedPrefix)) {
555
+ // Extract the spec name part from the requirement ID
556
+ const reqSpecPart = req.id.replace(/^req:/, '').split(':')[0];
557
+ if (reqSpecPart !== specName) {
558
+ issues.push({
559
+ severity: 'warning',
560
+ file: relPath,
561
+ specId: spec.id,
562
+ message: `Requirement ${req.id} spec prefix doesn't match parent spec (expected req:${specName}:*)`,
563
+ });
564
+ }
565
+ }
566
+ // Validate dependency references
567
+ if (req.dependencies !== undefined) {
568
+ for (const depId of req.dependencies) {
569
+ if (!allReqIds.has(depId)) {
570
+ issues.push({
571
+ severity: 'error',
572
+ file: relPath,
573
+ specId: spec.id,
574
+ message: `Requirement ${req.id} references unknown dependency: ${depId}`,
575
+ });
576
+ }
577
+ }
578
+ }
579
+ }
580
+ }
581
+ // Sort issues by severity (errors first) then file
582
+ issues.sort((a, b) => {
583
+ if (a.severity !== b.severity) {
584
+ return a.severity === 'error' ? -1 : 1;
585
+ }
586
+ return (a.file ?? '').localeCompare(b.file ?? '');
587
+ });
588
+ const hasErrors = issues.some((i) => i.severity === 'error');
589
+ const result = {
590
+ valid: !hasErrors,
591
+ issues,
592
+ specsChecked: allSpecs.length,
593
+ };
594
+ if (fmt === 'json') {
595
+ output(result, { format: 'json' });
596
+ }
597
+ else if (fmt === 'yaml') {
598
+ output(result, { format: 'yaml' });
599
+ }
600
+ else {
601
+ if (issues.length === 0) {
602
+ success(`Validated ${allSpecs.length} spec file(s) - no issues found`);
603
+ return;
604
+ }
605
+ // Group issues by file
606
+ const byFile = new Map();
607
+ for (const issue of issues) {
608
+ const file = issue.file ?? '(unknown)';
609
+ const existing = byFile.get(file) ?? [];
610
+ existing.push(issue);
611
+ byFile.set(file, existing);
612
+ }
613
+ for (const [file, fileIssues] of byFile) {
614
+ process.stdout.write(`\n${file}:\n`);
615
+ for (const issue of fileIssues) {
616
+ const prefix = issue.severity === 'error' ? 'ERROR' : 'WARN';
617
+ const specPart = issue.specId !== undefined ? ` [${issue.specId}]` : '';
618
+ process.stdout.write(` ${prefix}${specPart}: ${issue.message}\n`);
619
+ }
620
+ }
621
+ process.stdout.write('\n');
622
+ const errorCount = issues.filter((i) => i.severity === 'error').length;
623
+ const warnCount = issues.filter((i) => i.severity === 'warning').length;
624
+ if (errorCount > 0) {
625
+ error(`Found ${errorCount} error(s) and ${warnCount} warning(s)`);
626
+ }
627
+ else {
628
+ warn(`Found ${warnCount} warning(s)`);
629
+ }
630
+ }
631
+ if (hasErrors) {
632
+ process.exit(1);
633
+ }
634
+ }
635
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","sourceRoot":"","sources":["../../src/commands/spec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAoB,aAAa,EAAE,MAAM,cAAc,CAAC;AAwG7F,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,aAAa,CAAC,EAAW;IAChC,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,SAAS,oBAAoB,CAAC,EAAW;IACvC,IAAI,OAAO,EAAE,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzC,+CAA+C;IAC/C,OAAO,gCAAgC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACnD,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,MAAe;IACpC,OAAO,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,UAAU,CAAC;AACvG,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,GAAY,EAAE,SAAiB;IACnD,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,kBAAkB;IAClB,IAAI,GAAG,CAAC,EAAE,KAAK,SAAS,IAAI,GAAG,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC5C,CAAC;SAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,mCAAmC,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,8CAA8C,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,4CAA4C,OAAO,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,mBAAmB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAChD,CAAC;SAAM,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,6CAA6C,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,IAAI,GAAG,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;QAChE,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,kDAAkD,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,wBAAwB;IACxB,MAAM,YAAY,GAAkB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAI,GAAG,CAAC,YAAiC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvE,MAAM,MAAM,GAAI,GAAG,CAAC,YAAiC,CAAC,CAAC,CAAE,CAAC;QAE1D,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;YAClD,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,8BAA8B,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YACrC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,wBAAwB,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC;YACtG,SAAS;QACX,CAAC;QAED,IAAI,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAY,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,mBAAmB,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5D,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAY,CAAC,CAAC;QAEhC,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC/E,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,EAAE,kCAAkC,CAAC,CAAC;YACxE,SAAS;QACX,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YACzE,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,EAAE,0CAA0C,CAAC,CAAC;YAChF,SAAS;QACX,CAAC;QAED,mCAAmC;QACnC,IAAI,YAAyC,CAAC;QAC9C,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,EAAE,+BAA+B,CAAC,CAAC;YACvE,CAAC;iBAAM,CAAC;gBACN,YAAY,GAAG,EAAE,CAAC;gBAClB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;oBACpC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC/B,MAAM,CAAC,IAAI,CAAC,eAAe,MAAM,CAAC,EAAE,4BAA4B,GAAG,EAAE,CAAC,CAAC;oBACzE,CAAC;yBAAM,CAAC;wBACN,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAgB;YACvB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,UAAU,EAAE,MAAM,CAAC,UAAyE;YAC5F,GAAG,CAAC,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnF,CAAC;QACF,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,GAAS;QACjB,EAAE,EAAE,GAAG,CAAC,EAAY;QACpB,OAAO,EAAE,GAAG,CAAC,OAAiB;QAC9B,KAAK,EAAE,GAAG,CAAC,KAAe;QAC1B,MAAM,EAAG,GAAG,CAAC,MAAuB,IAAI,OAAO;QAC/C,MAAM,EAAE,GAAG,CAAC,MAAgB;QAC5B,YAAY;KACb,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAC9B,CAAC;AAED,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,aAAa,CAAC,WAAmB;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,SAAS,OAAO,CAAC,GAAW;QAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAEhC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,OAAO,CAAC,QAAQ,CAAC,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;gBACzC,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;oBACtC,kEAAkE;oBAClE,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBACtD,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACvB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,OAAO,CAAC,CAAC;IACjB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,SAAS,CAAU,OAAO,CAAC,CAAC;QAExC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5C,OAAO,EAAE,MAAM,EAAE,CAAC,2CAA2C,CAAC,EAAE,CAAC;QACnE,CAAC;QAED,OAAO,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACrC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,MAAM,EAAE,CAAC,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;SACtF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,UAAyB,EACzB,IAAY,EACZ,QAAwB;IAExB,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACpD,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAEzD,+BAA+B;IAC/B,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,iDAAiD;SACzD,CAAC;QACF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,oBAAoB;IACpB,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAE5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,mBAAmB,IAAI,EAAE;SACjC,CAAC;QACF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8BAA8B;IAC9B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IAEhD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,yBAAyB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;SACtD,CAAC;QACF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,eAAe;IACf,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,YAAY,GAAS,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;IAE7C,sBAAsB;IACtB,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzD,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,sBAAsB;SAClD,CAAC;QACF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;IAE9B,+BAA+B;IAC/B,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,MAAM,YAAY,GAAG,YAAY,CAAC,IAAY,CAAC;QAC/C,IAAI,YAAY,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC/B,iCAAiC;YACjC,MAAM,MAAM,GAAkB;gBAC5B,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,IAAI;gBACJ,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;aAC3C,CAAC;YACF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7D,CAAC;iBAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBAC1B,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,QAAQ,IAAI,CAAC,EAAE,iCAAiC,CAAC,CAAC;YAC5D,CAAC;YACD,OAAO;QACT,CAAC;QAED,4DAA4D;QAC5D,gCAAgC;QAChC,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;YAC5C,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5B,CAAC;IAED,oBAAoB;IACpB,cAAc,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAEpC,aAAa;IACb,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAkB;YAC5B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,sBAAsB;SAClD,CAAC;QACF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAkB;QAC5B,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,IAAI;QACJ,gBAAgB,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;KAC3C,CAAC;IAEF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,cAAc,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,YAAY,CAAC,MAAM,gBAAgB,CAAC,CAAC;IAC9E,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,UAAyB,EACzB,OAAwB;IAExB,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACpD,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAEzD,+BAA+B;IAC/B,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,iDAAiD;SACzD,CAAC;QACF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,aAAa;IACb,MAAM,UAAU,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACzD,MAAM,MAAM,GAAG;YACb,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,sBAAsB;SAClD,CAAC;QACF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;IAE9B,qBAAqB;IACrB,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAE/C,qBAAqB;IACrB,MAAM,KAAK,GAAoB,EAAE,CAAC;IAElC,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAY,CAAC;QAE/B,iEAAiE;QACjE,IAAI,aAAa,GAAuC,IAAI,CAAC,MAAM,CAAC;QAEpE,0BAA0B;QAC1B,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,SAA6B,CAAC;QAClC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC,EAAE,EAAE,CAAC;gBAC7B,SAAS,GAAG,QAAQ,CAAC;gBACrB,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;oBAC3B,aAAa,GAAG,OAAO,CAAC;gBAC1B,CAAC;gBACD,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,aAAa,GAAG,SAAS,CAAC;QAC5B,CAAC;QAED,gCAAgC;QAChC,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,aAAa,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;YACrE,SAAS;QACX,CAAC;QAED,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,aAAa;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,EAAE;YACrB,YAAY,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM;SACvC,CAAC,CAAC;IACL,CAAC;IAED,aAAa;IACb,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAmB,EAAE,KAAK,EAAE,CAAC;IAEzC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,2BAA2B,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAkB;YAC7B,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;YACzC,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,EAAE;YAClD,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC/C,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,EAAE;YAChD,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE;YACpE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;SAC9C,CAAC;QAEF,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAyB,EACzB,QAA6B;IAE7B,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACpD,MAAM,GAAG,GAAG,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAEzD,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE7C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAuB;YACjC,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,CAAC;SAChB,CAAC;QAEF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YACnB,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACjD,CAAC;QACD,OAAO;IACT,CAAC;IAED,mEAAmE;IACnE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,qBAAqB;IACnE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,kBAAkB;IAC/D,MAAM,QAAQ,GAAuC,EAAE,CAAC;IAExD,8CAA8C;IAC9C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAChD,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEhD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG;iBACb,CAAC,CAAC;YACL,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS;QAEjC,4CAA4C;QAC5C,MAAM,YAAY,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC7C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO,EAAE,yCAAyC,YAAY,EAAE;aACjE,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QACnC,CAAC;QAED,wBAAwB;QACxB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3C,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC;oBACV,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,OAAO;oBACb,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,OAAO,EAAE,4BAA4B,GAAG,CAAC,EAAE,wBAAwB,YAAY,EAAE;iBAClF,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,yCAAyC;IACzC,KAAK,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAEhD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,gDAAgD;YAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACrE,MAAM,cAAc,GAAG,OAAO,QAAQ,GAAG,CAAC;YAC1C,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;gBACvC,qDAAqD;gBACrD,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9D,IAAI,WAAW,KAAK,QAAQ,EAAE,CAAC;oBAC7B,MAAM,CAAC,IAAI,CAAC;wBACV,QAAQ,EAAE,SAAS;wBACnB,IAAI,EAAE,OAAO;wBACb,MAAM,EAAE,IAAI,CAAC,EAAE;wBACf,OAAO,EAAE,eAAe,GAAG,CAAC,EAAE,wDAAwD,QAAQ,KAAK;qBACpG,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,iCAAiC;YACjC,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACnC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;oBACrC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC1B,MAAM,CAAC,IAAI,CAAC;4BACV,QAAQ,EAAE,OAAO;4BACjB,IAAI,EAAE,OAAO;4BACb,MAAM,EAAE,IAAI,CAAC,EAAE;4BACf,OAAO,EAAE,eAAe,GAAG,CAAC,EAAE,mCAAmC,KAAK,EAAE;yBACzE,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC9B,OAAO,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC7D,MAAM,MAAM,GAAuB;QACjC,KAAK,EAAE,CAAC,SAAS;QACjB,MAAM;QACN,YAAY,EAAE,QAAQ,CAAC,MAAM;KAC9B,CAAC;IAEF,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACrC,CAAC;SAAM,CAAC;QACN,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,aAAa,QAAQ,CAAC,MAAM,iCAAiC,CAAC,CAAC;YACvE,OAAO;QACT,CAAC;QAED,uBAAuB;QACvB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA6B,CAAC;QACpD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7B,CAAC;QAED,KAAK,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,MAAM,EAAE,CAAC;YACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC;YACrC,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;gBAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,MAAM,GAAG,QAAQ,KAAK,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QACvE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAExE,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,KAAK,CAAC,SAAS,UAAU,iBAAiB,SAAS,aAAa,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,SAAS,SAAS,aAAa,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -0,0 +1,9 @@
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
+ export {};
9
+ //# sourceMappingURL=spec.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.test.d.ts","sourceRoot":"","sources":["../../src/commands/spec.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}