@rengler33/prov 0.1.1 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +71 -10
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +55 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/create.d.ts +83 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +550 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/create.test.d.ts +9 -0
- package/dist/commands/create.test.d.ts.map +1 -0
- package/dist/commands/create.test.js +384 -0
- package/dist/commands/create.test.js.map +1 -0
- package/package.json +7 -3
|
@@ -0,0 +1,550 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prov create commands implementation.
|
|
3
|
+
*
|
|
4
|
+
* Commands for declarative creation of specs and constraints:
|
|
5
|
+
* - spec create: Create a specification via CLI flags
|
|
6
|
+
* - constraint create: Create a constraint via CLI flags
|
|
7
|
+
*
|
|
8
|
+
* @see spec:declarative-creation:v1
|
|
9
|
+
* @see req:create:spec-basic
|
|
10
|
+
* @see req:create:constraint-basic
|
|
11
|
+
*/
|
|
12
|
+
import { existsSync, mkdirSync, writeFileSync } from 'node:fs';
|
|
13
|
+
import { join, resolve, dirname } from 'node:path';
|
|
14
|
+
import { isInitialized, loadGraph, saveGraph } from '../storage.js';
|
|
15
|
+
import { addSpecToGraph, addConstraintToGraph } from '../graph.js';
|
|
16
|
+
import { computeHash, toYaml } from '../hash.js';
|
|
17
|
+
import { output, error, success, warn, resolveFormat } from '../output.js';
|
|
18
|
+
// ============================================================================
|
|
19
|
+
// Validation Helpers
|
|
20
|
+
// ============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Validate a name for use in IDs.
|
|
23
|
+
* Must be lowercase alphanumeric with hyphens.
|
|
24
|
+
* @see req:create:validation
|
|
25
|
+
*/
|
|
26
|
+
function isValidName(name) {
|
|
27
|
+
return /^[a-z0-9]+(-[a-z0-9]+)*$/.test(name);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate entity status.
|
|
31
|
+
*/
|
|
32
|
+
function isValidStatus(status) {
|
|
33
|
+
return status === 'draft' || status === 'active' || status === 'deprecated' || status === 'archived';
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Validate verification type.
|
|
37
|
+
*/
|
|
38
|
+
function isValidVerificationType(type) {
|
|
39
|
+
return type === 'command' || type === 'test' || type === 'assertion' || type === 'manual';
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Parse a requirement string in format "id:description" or "id:description:acceptance1;acceptance2"
|
|
43
|
+
* @see req:create:spec-requirements
|
|
44
|
+
*/
|
|
45
|
+
function parseRequirement(reqStr, specName) {
|
|
46
|
+
const parts = reqStr.split(':');
|
|
47
|
+
if (parts.length < 2) {
|
|
48
|
+
return { error: `Invalid requirement format: ${reqStr}. Expected "id:description" or "id:description:acceptance1;acceptance2"` };
|
|
49
|
+
}
|
|
50
|
+
const [id, description, ...rest] = parts;
|
|
51
|
+
if (id === undefined || id === '' || !isValidName(id)) {
|
|
52
|
+
return { error: `Invalid requirement ID: ${id}. Must be lowercase alphanumeric with hyphens.` };
|
|
53
|
+
}
|
|
54
|
+
if (description === undefined || description === '') {
|
|
55
|
+
return { error: `Missing description for requirement: ${id}` };
|
|
56
|
+
}
|
|
57
|
+
const reqId = `req:${specName}:${id}`;
|
|
58
|
+
// Parse acceptance criteria (remaining parts joined back, then split by semicolon)
|
|
59
|
+
const acceptanceStr = rest.join(':');
|
|
60
|
+
const acceptance = acceptanceStr
|
|
61
|
+
? acceptanceStr.split(';').map(a => a.trim()).filter(a => a.length > 0)
|
|
62
|
+
: [`${description} is implemented`];
|
|
63
|
+
const req = {
|
|
64
|
+
id: reqId,
|
|
65
|
+
description,
|
|
66
|
+
acceptance,
|
|
67
|
+
};
|
|
68
|
+
return { req };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse a dependency string in format "req-id:depends-on-id"
|
|
72
|
+
* @see req:create:spec-dependencies
|
|
73
|
+
*/
|
|
74
|
+
function parseDependency(depStr) {
|
|
75
|
+
const parts = depStr.split(':');
|
|
76
|
+
// Handle req:spec:name:req:spec:name format
|
|
77
|
+
if (parts.length === 6 && parts[0] === 'req' && parts[3] === 'req') {
|
|
78
|
+
return { from: `req:${parts[1]}:${parts[2]}`, to: `req:${parts[4]}:${parts[5]}` };
|
|
79
|
+
}
|
|
80
|
+
// Handle short format: local-id:depends-on-local-id
|
|
81
|
+
if (parts.length === 2 && parts[0] !== undefined && parts[0] !== '' && parts[1] !== undefined && parts[1] !== '') {
|
|
82
|
+
return { from: parts[0], to: parts[1] };
|
|
83
|
+
}
|
|
84
|
+
return { error: `Invalid dependency format: ${depStr}. Expected "req-id:depends-on-id"` };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parse an invariant string in format "id:rule:type:value" or "id:rule:type:value:expect"
|
|
88
|
+
* @see req:create:constraint-invariants
|
|
89
|
+
*/
|
|
90
|
+
function parseInvariant(invStr, constraintName) {
|
|
91
|
+
const parts = invStr.split(':');
|
|
92
|
+
if (parts.length < 4) {
|
|
93
|
+
return { error: `Invalid invariant format: ${invStr}. Expected "id:rule:type:value" or "id:rule:type:value:expect"` };
|
|
94
|
+
}
|
|
95
|
+
const [id, rule, type, ...rest] = parts;
|
|
96
|
+
if (id === undefined || id === '' || !isValidName(id)) {
|
|
97
|
+
return { error: `Invalid invariant ID: ${id}. Must be lowercase alphanumeric with hyphens.` };
|
|
98
|
+
}
|
|
99
|
+
if (rule === undefined || rule === '') {
|
|
100
|
+
return { error: `Missing rule for invariant: ${id}` };
|
|
101
|
+
}
|
|
102
|
+
if (type === undefined || type === '' || !isValidVerificationType(type)) {
|
|
103
|
+
return { error: `Invalid verification type: ${type}. Must be command|test|assertion|manual.` };
|
|
104
|
+
}
|
|
105
|
+
// Value and optional expect (rejoin remaining parts)
|
|
106
|
+
const valueAndExpect = rest.join(':');
|
|
107
|
+
if (!valueAndExpect) {
|
|
108
|
+
return { error: `Missing verification value for invariant: ${id}` };
|
|
109
|
+
}
|
|
110
|
+
// Try to split off expect (last segment after last colon if type is command)
|
|
111
|
+
let value = valueAndExpect;
|
|
112
|
+
let expect;
|
|
113
|
+
// For command type, check if last segment looks like an expect value
|
|
114
|
+
// This is a heuristic - if the value contains spaces and ends with success/failure, treat it as expect
|
|
115
|
+
if (type === 'command') {
|
|
116
|
+
const lastColonIdx = valueAndExpect.lastIndexOf(':');
|
|
117
|
+
if (lastColonIdx > 0) {
|
|
118
|
+
const possibleExpect = valueAndExpect.slice(lastColonIdx + 1);
|
|
119
|
+
if (possibleExpect === 'success' || possibleExpect === 'failure' || possibleExpect.length < 20) {
|
|
120
|
+
// Looks like an expect value
|
|
121
|
+
value = valueAndExpect.slice(0, lastColonIdx);
|
|
122
|
+
expect = possibleExpect;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const invId = `inv:${constraintName}:${id}`;
|
|
127
|
+
const verification = {
|
|
128
|
+
type,
|
|
129
|
+
value,
|
|
130
|
+
...(expect !== undefined ? { expect } : {}),
|
|
131
|
+
};
|
|
132
|
+
const inv = {
|
|
133
|
+
id: invId,
|
|
134
|
+
rule,
|
|
135
|
+
verification,
|
|
136
|
+
blocking: true,
|
|
137
|
+
};
|
|
138
|
+
return { inv };
|
|
139
|
+
}
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// spec create Command
|
|
142
|
+
// ============================================================================
|
|
143
|
+
/**
|
|
144
|
+
* Execute the spec create command.
|
|
145
|
+
*
|
|
146
|
+
* @see req:create:spec-basic
|
|
147
|
+
* @see req:create:spec-requirements
|
|
148
|
+
* @see req:create:spec-auto-register
|
|
149
|
+
*/
|
|
150
|
+
export function runSpecCreate(globalOpts, options) {
|
|
151
|
+
const projectRoot = globalOpts.dir ?? process.cwd();
|
|
152
|
+
const fmt = resolveFormat({ format: globalOpts.format });
|
|
153
|
+
// Check if prov is initialized (unless --no-register)
|
|
154
|
+
if (options.noRegister !== true && !isInitialized(projectRoot)) {
|
|
155
|
+
const result = {
|
|
156
|
+
success: false,
|
|
157
|
+
error: 'prov is not initialized. Run "prov init" first.',
|
|
158
|
+
};
|
|
159
|
+
outputResult(result, fmt);
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
// Validate name
|
|
163
|
+
if (!isValidName(options.name)) {
|
|
164
|
+
const result = {
|
|
165
|
+
success: false,
|
|
166
|
+
error: `Invalid name: ${options.name}. Must be lowercase alphanumeric with hyphens (e.g., "my-spec").`,
|
|
167
|
+
};
|
|
168
|
+
outputResult(result, fmt);
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
// Validate status if provided
|
|
172
|
+
const status = options.status ?? 'draft';
|
|
173
|
+
if (options.status !== undefined && !isValidStatus(options.status)) {
|
|
174
|
+
const result = {
|
|
175
|
+
success: false,
|
|
176
|
+
error: `Invalid status: ${options.status}. Must be draft|active|deprecated|archived.`,
|
|
177
|
+
};
|
|
178
|
+
outputResult(result, fmt);
|
|
179
|
+
process.exit(1);
|
|
180
|
+
}
|
|
181
|
+
// Parse requirements (first pass - without dependencies)
|
|
182
|
+
const parsedReqs = [];
|
|
183
|
+
const reqErrors = [];
|
|
184
|
+
if (options.req !== undefined) {
|
|
185
|
+
for (const reqStr of options.req) {
|
|
186
|
+
const { req, error: parseError } = parseRequirement(reqStr, options.name);
|
|
187
|
+
if (parseError !== undefined) {
|
|
188
|
+
reqErrors.push(parseError);
|
|
189
|
+
}
|
|
190
|
+
else if (req !== undefined) {
|
|
191
|
+
const shortId = req.id.split(':').pop();
|
|
192
|
+
parsedReqs.push({
|
|
193
|
+
id: req.id,
|
|
194
|
+
shortId,
|
|
195
|
+
description: req.description,
|
|
196
|
+
acceptance: [...req.acceptance],
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
if (reqErrors.length > 0) {
|
|
202
|
+
const result = {
|
|
203
|
+
success: false,
|
|
204
|
+
error: `Requirement parsing errors:\n ${reqErrors.join('\n ')}`,
|
|
205
|
+
};
|
|
206
|
+
outputResult(result, fmt);
|
|
207
|
+
process.exit(1);
|
|
208
|
+
}
|
|
209
|
+
// Parse dependencies and collect them per requirement
|
|
210
|
+
const dependenciesMap = new Map();
|
|
211
|
+
if (options.dep !== undefined) {
|
|
212
|
+
for (const depStr of options.dep) {
|
|
213
|
+
const parseResult = parseDependency(depStr);
|
|
214
|
+
if ('error' in parseResult) {
|
|
215
|
+
reqErrors.push(parseResult.error);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
const { from, to } = parseResult;
|
|
219
|
+
// Find the requirement
|
|
220
|
+
const reqInfo = parsedReqs.find(r => r.shortId === from || r.id === from || r.id.endsWith(`:${from}`));
|
|
221
|
+
if (reqInfo === undefined) {
|
|
222
|
+
reqErrors.push(`Dependency references unknown requirement: ${from}`);
|
|
223
|
+
}
|
|
224
|
+
else {
|
|
225
|
+
// Resolve target
|
|
226
|
+
const targetReq = parsedReqs.find(r => r.shortId === to || r.id === to);
|
|
227
|
+
const targetId = targetReq !== undefined
|
|
228
|
+
? targetReq.id
|
|
229
|
+
: (to.startsWith('req:') ? to : `req:${options.name}:${to}`);
|
|
230
|
+
const deps = dependenciesMap.get(reqInfo.id) ?? [];
|
|
231
|
+
deps.push(targetId);
|
|
232
|
+
dependenciesMap.set(reqInfo.id, deps);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (reqErrors.length > 0) {
|
|
238
|
+
const result = {
|
|
239
|
+
success: false,
|
|
240
|
+
error: `Dependency parsing errors:\n ${reqErrors.join('\n ')}`,
|
|
241
|
+
};
|
|
242
|
+
outputResult(result, fmt);
|
|
243
|
+
process.exit(1);
|
|
244
|
+
}
|
|
245
|
+
// Build final requirements with dependencies
|
|
246
|
+
const requirements = parsedReqs.map(r => {
|
|
247
|
+
const deps = dependenciesMap.get(r.id);
|
|
248
|
+
const req = {
|
|
249
|
+
id: r.id,
|
|
250
|
+
description: r.description,
|
|
251
|
+
acceptance: r.acceptance,
|
|
252
|
+
...(deps !== undefined && deps.length > 0 ? { dependencies: deps } : {}),
|
|
253
|
+
};
|
|
254
|
+
return req;
|
|
255
|
+
});
|
|
256
|
+
// Build spec
|
|
257
|
+
const specId = `spec:${options.name}:v1`;
|
|
258
|
+
const spec = {
|
|
259
|
+
id: specId,
|
|
260
|
+
version: options.version ?? '1.0.0',
|
|
261
|
+
title: options.title ?? `${options.name} specification`,
|
|
262
|
+
status,
|
|
263
|
+
intent: options.intent ?? `Specification for ${options.name}`,
|
|
264
|
+
requirements,
|
|
265
|
+
};
|
|
266
|
+
// Determine output file
|
|
267
|
+
let outputFile = options.output;
|
|
268
|
+
if (outputFile === undefined) {
|
|
269
|
+
const specDir = join(projectRoot, 'spec');
|
|
270
|
+
if (!existsSync(specDir)) {
|
|
271
|
+
mkdirSync(specDir, { recursive: true });
|
|
272
|
+
}
|
|
273
|
+
outputFile = join(specDir, `${options.name}.spec.yaml`);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
outputFile = resolve(projectRoot, outputFile);
|
|
277
|
+
const dir = dirname(outputFile);
|
|
278
|
+
if (!existsSync(dir)) {
|
|
279
|
+
mkdirSync(dir, { recursive: true });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// Check for existing file
|
|
283
|
+
if (existsSync(outputFile) && options.force !== true) {
|
|
284
|
+
const result = {
|
|
285
|
+
success: false,
|
|
286
|
+
error: `File already exists: ${outputFile}. Use --force to overwrite.`,
|
|
287
|
+
};
|
|
288
|
+
outputResult(result, fmt);
|
|
289
|
+
process.exit(1);
|
|
290
|
+
}
|
|
291
|
+
// Generate YAML
|
|
292
|
+
const yamlContent = toYaml({
|
|
293
|
+
id: spec.id,
|
|
294
|
+
version: spec.version,
|
|
295
|
+
title: spec.title,
|
|
296
|
+
status: spec.status,
|
|
297
|
+
intent: spec.intent,
|
|
298
|
+
requirements: spec.requirements.map(r => ({
|
|
299
|
+
id: r.id,
|
|
300
|
+
description: r.description,
|
|
301
|
+
acceptance: r.acceptance,
|
|
302
|
+
...(r.dependencies !== undefined && r.dependencies.length > 0 ? { depends_on: r.dependencies } : {}),
|
|
303
|
+
})),
|
|
304
|
+
});
|
|
305
|
+
// Write file
|
|
306
|
+
writeFileSync(outputFile, yamlContent, 'utf8');
|
|
307
|
+
if (options.force === true && existsSync(outputFile)) {
|
|
308
|
+
warn(`Overwrote existing file: ${outputFile}`);
|
|
309
|
+
}
|
|
310
|
+
// Compute hash and register in graph
|
|
311
|
+
const hash = computeHash(spec);
|
|
312
|
+
const specWithHash = { ...spec, hash };
|
|
313
|
+
if (options.noRegister !== true) {
|
|
314
|
+
const loadResult = loadGraph(projectRoot);
|
|
315
|
+
if (!loadResult.success || loadResult.data === undefined) {
|
|
316
|
+
const result = {
|
|
317
|
+
success: false,
|
|
318
|
+
error: loadResult.error ?? 'Failed to load graph',
|
|
319
|
+
};
|
|
320
|
+
outputResult(result, fmt);
|
|
321
|
+
process.exit(1);
|
|
322
|
+
}
|
|
323
|
+
const graph = loadResult.data;
|
|
324
|
+
// Remove existing if present
|
|
325
|
+
const existingNode = graph.getNode(spec.id);
|
|
326
|
+
if (existingNode !== undefined) {
|
|
327
|
+
const existingSpec = existingNode.data;
|
|
328
|
+
for (const req of existingSpec.requirements) {
|
|
329
|
+
graph.removeNode(req.id);
|
|
330
|
+
}
|
|
331
|
+
graph.removeNode(spec.id);
|
|
332
|
+
}
|
|
333
|
+
addSpecToGraph(graph, specWithHash);
|
|
334
|
+
const saveResult = saveGraph(graph, projectRoot);
|
|
335
|
+
if (!saveResult.success) {
|
|
336
|
+
const result = {
|
|
337
|
+
success: false,
|
|
338
|
+
error: saveResult.error ?? 'Failed to save graph',
|
|
339
|
+
};
|
|
340
|
+
outputResult(result, fmt);
|
|
341
|
+
process.exit(1);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
const result = {
|
|
345
|
+
success: true,
|
|
346
|
+
specId: spec.id,
|
|
347
|
+
hash,
|
|
348
|
+
requirementCount: spec.requirements.length,
|
|
349
|
+
outputFile,
|
|
350
|
+
};
|
|
351
|
+
outputResult(result, fmt);
|
|
352
|
+
if (fmt === 'table') {
|
|
353
|
+
success(`Created spec ${spec.id} (${spec.requirements.length} requirements)`);
|
|
354
|
+
process.stdout.write(` Output: ${outputFile}\n`);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
// ============================================================================
|
|
358
|
+
// constraint create Command
|
|
359
|
+
// ============================================================================
|
|
360
|
+
/**
|
|
361
|
+
* Execute the constraint create command.
|
|
362
|
+
*
|
|
363
|
+
* @see req:create:constraint-basic
|
|
364
|
+
* @see req:create:constraint-invariants
|
|
365
|
+
* @see req:create:constraint-auto-register
|
|
366
|
+
*/
|
|
367
|
+
export function runConstraintCreate(globalOpts, options) {
|
|
368
|
+
const projectRoot = globalOpts.dir ?? process.cwd();
|
|
369
|
+
const fmt = resolveFormat({ format: globalOpts.format });
|
|
370
|
+
// Check if prov is initialized (unless --no-register)
|
|
371
|
+
if (options.noRegister !== true && !isInitialized(projectRoot)) {
|
|
372
|
+
const result = {
|
|
373
|
+
success: false,
|
|
374
|
+
error: 'prov is not initialized. Run "prov init" first.',
|
|
375
|
+
};
|
|
376
|
+
outputConstraintResult(result, fmt);
|
|
377
|
+
process.exit(1);
|
|
378
|
+
}
|
|
379
|
+
// Validate name
|
|
380
|
+
if (!isValidName(options.name)) {
|
|
381
|
+
const result = {
|
|
382
|
+
success: false,
|
|
383
|
+
error: `Invalid name: ${options.name}. Must be lowercase alphanumeric with hyphens (e.g., "my-constraint").`,
|
|
384
|
+
};
|
|
385
|
+
outputConstraintResult(result, fmt);
|
|
386
|
+
process.exit(1);
|
|
387
|
+
}
|
|
388
|
+
// Validate status if provided
|
|
389
|
+
const status = options.status ?? 'draft';
|
|
390
|
+
if (options.status !== undefined && !isValidStatus(options.status)) {
|
|
391
|
+
const result = {
|
|
392
|
+
success: false,
|
|
393
|
+
error: `Invalid status: ${options.status}. Must be draft|active|deprecated|archived.`,
|
|
394
|
+
};
|
|
395
|
+
outputConstraintResult(result, fmt);
|
|
396
|
+
process.exit(1);
|
|
397
|
+
}
|
|
398
|
+
// Parse invariants
|
|
399
|
+
const invariants = [];
|
|
400
|
+
const invErrors = [];
|
|
401
|
+
if (options.inv !== undefined) {
|
|
402
|
+
for (const invStr of options.inv) {
|
|
403
|
+
const { inv, error: parseError } = parseInvariant(invStr, options.name);
|
|
404
|
+
if (parseError !== undefined) {
|
|
405
|
+
invErrors.push(parseError);
|
|
406
|
+
}
|
|
407
|
+
else if (inv !== undefined) {
|
|
408
|
+
invariants.push(inv);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
if (invErrors.length > 0) {
|
|
413
|
+
const result = {
|
|
414
|
+
success: false,
|
|
415
|
+
error: `Invariant parsing errors:\n ${invErrors.join('\n ')}`,
|
|
416
|
+
};
|
|
417
|
+
outputConstraintResult(result, fmt);
|
|
418
|
+
process.exit(1);
|
|
419
|
+
}
|
|
420
|
+
// Build constraint
|
|
421
|
+
const constraintId = `constraint:${options.name}:v1`;
|
|
422
|
+
const constraint = {
|
|
423
|
+
id: constraintId,
|
|
424
|
+
version: options.version ?? '1.0.0',
|
|
425
|
+
title: options.title ?? `${options.name} constraints`,
|
|
426
|
+
status,
|
|
427
|
+
description: options.description ?? `Constraints for ${options.name}`,
|
|
428
|
+
invariants,
|
|
429
|
+
};
|
|
430
|
+
// Determine output file
|
|
431
|
+
let outputFile = options.output;
|
|
432
|
+
if (outputFile === undefined) {
|
|
433
|
+
const constraintDir = join(projectRoot, 'constraints');
|
|
434
|
+
if (!existsSync(constraintDir)) {
|
|
435
|
+
mkdirSync(constraintDir, { recursive: true });
|
|
436
|
+
}
|
|
437
|
+
outputFile = join(constraintDir, `${options.name}.constraints.yaml`);
|
|
438
|
+
}
|
|
439
|
+
else {
|
|
440
|
+
outputFile = resolve(projectRoot, outputFile);
|
|
441
|
+
const dir = dirname(outputFile);
|
|
442
|
+
if (!existsSync(dir)) {
|
|
443
|
+
mkdirSync(dir, { recursive: true });
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
// Check for existing file
|
|
447
|
+
if (existsSync(outputFile) && options.force !== true) {
|
|
448
|
+
const result = {
|
|
449
|
+
success: false,
|
|
450
|
+
error: `File already exists: ${outputFile}. Use --force to overwrite.`,
|
|
451
|
+
};
|
|
452
|
+
outputConstraintResult(result, fmt);
|
|
453
|
+
process.exit(1);
|
|
454
|
+
}
|
|
455
|
+
// Generate YAML
|
|
456
|
+
const yamlContent = toYaml({
|
|
457
|
+
id: constraint.id,
|
|
458
|
+
version: constraint.version,
|
|
459
|
+
title: constraint.title,
|
|
460
|
+
status: constraint.status,
|
|
461
|
+
description: constraint.description,
|
|
462
|
+
invariants: constraint.invariants.map(i => ({
|
|
463
|
+
id: i.id,
|
|
464
|
+
rule: i.rule,
|
|
465
|
+
blocking: i.blocking ?? true,
|
|
466
|
+
verification: {
|
|
467
|
+
type: i.verification.type,
|
|
468
|
+
value: i.verification.value,
|
|
469
|
+
...(i.verification.expect !== undefined ? { expect: i.verification.expect } : {}),
|
|
470
|
+
},
|
|
471
|
+
})),
|
|
472
|
+
});
|
|
473
|
+
// Write file
|
|
474
|
+
writeFileSync(outputFile, yamlContent, 'utf8');
|
|
475
|
+
if (options.force === true && existsSync(outputFile)) {
|
|
476
|
+
warn(`Overwrote existing file: ${outputFile}`);
|
|
477
|
+
}
|
|
478
|
+
// Compute hash and register in graph
|
|
479
|
+
const hash = computeHash(constraint);
|
|
480
|
+
const constraintWithHash = { ...constraint, hash };
|
|
481
|
+
if (options.noRegister !== true) {
|
|
482
|
+
const loadResult = loadGraph(projectRoot);
|
|
483
|
+
if (!loadResult.success || loadResult.data === undefined) {
|
|
484
|
+
const result = {
|
|
485
|
+
success: false,
|
|
486
|
+
error: loadResult.error ?? 'Failed to load graph',
|
|
487
|
+
};
|
|
488
|
+
outputConstraintResult(result, fmt);
|
|
489
|
+
process.exit(1);
|
|
490
|
+
}
|
|
491
|
+
const graph = loadResult.data;
|
|
492
|
+
// Remove existing if present
|
|
493
|
+
const existingNode = graph.getNode(constraint.id);
|
|
494
|
+
if (existingNode !== undefined) {
|
|
495
|
+
const existingConstraint = existingNode.data;
|
|
496
|
+
for (const inv of existingConstraint.invariants) {
|
|
497
|
+
graph.removeNode(inv.id);
|
|
498
|
+
}
|
|
499
|
+
graph.removeNode(constraint.id);
|
|
500
|
+
}
|
|
501
|
+
addConstraintToGraph(graph, constraintWithHash);
|
|
502
|
+
const saveResult = saveGraph(graph, projectRoot);
|
|
503
|
+
if (!saveResult.success) {
|
|
504
|
+
const result = {
|
|
505
|
+
success: false,
|
|
506
|
+
error: saveResult.error ?? 'Failed to save graph',
|
|
507
|
+
};
|
|
508
|
+
outputConstraintResult(result, fmt);
|
|
509
|
+
process.exit(1);
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
const result = {
|
|
513
|
+
success: true,
|
|
514
|
+
constraintId: constraint.id,
|
|
515
|
+
hash,
|
|
516
|
+
invariantCount: constraint.invariants.length,
|
|
517
|
+
outputFile,
|
|
518
|
+
};
|
|
519
|
+
outputConstraintResult(result, fmt);
|
|
520
|
+
if (fmt === 'table') {
|
|
521
|
+
success(`Created constraint ${constraint.id} (${constraint.invariants.length} invariants)`);
|
|
522
|
+
process.stdout.write(` Output: ${outputFile}\n`);
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
// ============================================================================
|
|
526
|
+
// Output Helpers
|
|
527
|
+
// ============================================================================
|
|
528
|
+
function outputResult(result, fmt) {
|
|
529
|
+
if (fmt === 'json') {
|
|
530
|
+
output(result, { format: 'json' });
|
|
531
|
+
}
|
|
532
|
+
else if (fmt === 'yaml') {
|
|
533
|
+
output(result, { format: 'yaml' });
|
|
534
|
+
}
|
|
535
|
+
else if (!result.success && result.error !== undefined) {
|
|
536
|
+
error(result.error);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
function outputConstraintResult(result, fmt) {
|
|
540
|
+
if (fmt === 'json') {
|
|
541
|
+
output(result, { format: 'json' });
|
|
542
|
+
}
|
|
543
|
+
else if (fmt === 'yaml') {
|
|
544
|
+
output(result, { format: 'yaml' });
|
|
545
|
+
}
|
|
546
|
+
else if (!result.success && result.error !== undefined) {
|
|
547
|
+
error(result.error);
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.test.d.ts","sourceRoot":"","sources":["../../src/commands/create.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
|