@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.
- package/README.md +314 -0
- package/dist/cli.d.ts +26 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +381 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/agent.d.ts +107 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +197 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/agent.test.d.ts +5 -0
- package/dist/commands/agent.test.d.ts.map +1 -0
- package/dist/commands/agent.test.js +199 -0
- package/dist/commands/agent.test.js.map +1 -0
- package/dist/commands/constraint.d.ts +100 -0
- package/dist/commands/constraint.d.ts.map +1 -0
- package/dist/commands/constraint.js +763 -0
- package/dist/commands/constraint.js.map +1 -0
- package/dist/commands/constraint.test.d.ts +9 -0
- package/dist/commands/constraint.test.d.ts.map +1 -0
- package/dist/commands/constraint.test.js +470 -0
- package/dist/commands/constraint.test.js.map +1 -0
- package/dist/commands/graph.d.ts +99 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +552 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/graph.test.d.ts +2 -0
- package/dist/commands/graph.test.d.ts.map +1 -0
- package/dist/commands/graph.test.js +258 -0
- package/dist/commands/graph.test.js.map +1 -0
- package/dist/commands/impact.d.ts +83 -0
- package/dist/commands/impact.d.ts.map +1 -0
- package/dist/commands/impact.js +319 -0
- package/dist/commands/impact.js.map +1 -0
- package/dist/commands/impact.test.d.ts +2 -0
- package/dist/commands/impact.test.d.ts.map +1 -0
- package/dist/commands/impact.test.js +234 -0
- package/dist/commands/impact.test.js.map +1 -0
- package/dist/commands/init.d.ts +45 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +94 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/init.test.d.ts +7 -0
- package/dist/commands/init.test.d.ts.map +1 -0
- package/dist/commands/init.test.js +174 -0
- package/dist/commands/init.test.js.map +1 -0
- package/dist/commands/integration.test.d.ts +10 -0
- package/dist/commands/integration.test.d.ts.map +1 -0
- package/dist/commands/integration.test.js +456 -0
- package/dist/commands/integration.test.js.map +1 -0
- package/dist/commands/mcp.d.ts +21 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +616 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/mcp.test.d.ts +7 -0
- package/dist/commands/mcp.test.d.ts.map +1 -0
- package/dist/commands/mcp.test.js +132 -0
- package/dist/commands/mcp.test.js.map +1 -0
- package/dist/commands/plan.d.ts +218 -0
- package/dist/commands/plan.d.ts.map +1 -0
- package/dist/commands/plan.js +1307 -0
- package/dist/commands/plan.js.map +1 -0
- package/dist/commands/plan.test.d.ts +9 -0
- package/dist/commands/plan.test.d.ts.map +1 -0
- package/dist/commands/plan.test.js +569 -0
- package/dist/commands/plan.test.js.map +1 -0
- package/dist/commands/spec.d.ts +94 -0
- package/dist/commands/spec.d.ts.map +1 -0
- package/dist/commands/spec.js +635 -0
- package/dist/commands/spec.js.map +1 -0
- package/dist/commands/spec.test.d.ts +9 -0
- package/dist/commands/spec.test.d.ts.map +1 -0
- package/dist/commands/spec.test.js +407 -0
- package/dist/commands/spec.test.js.map +1 -0
- package/dist/commands/trace.d.ts +157 -0
- package/dist/commands/trace.d.ts.map +1 -0
- package/dist/commands/trace.js +847 -0
- package/dist/commands/trace.js.map +1 -0
- package/dist/commands/trace.test.d.ts +9 -0
- package/dist/commands/trace.test.d.ts.map +1 -0
- package/dist/commands/trace.test.js +524 -0
- package/dist/commands/trace.test.js.map +1 -0
- package/dist/graph.d.ts +204 -0
- package/dist/graph.d.ts.map +1 -0
- package/dist/graph.js +496 -0
- package/dist/graph.js.map +1 -0
- package/dist/graph.test.d.ts +2 -0
- package/dist/graph.test.d.ts.map +1 -0
- package/dist/graph.test.js +382 -0
- package/dist/graph.test.js.map +1 -0
- package/dist/hash.d.ts +72 -0
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +137 -0
- package/dist/hash.js.map +1 -0
- package/dist/hash.test.d.ts +2 -0
- package/dist/hash.test.d.ts.map +1 -0
- package/dist/hash.test.js +227 -0
- package/dist/hash.test.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +11 -0
- package/dist/index.test.js.map +1 -0
- package/dist/output.d.ts +84 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +175 -0
- package/dist/output.js.map +1 -0
- package/dist/output.test.d.ts +7 -0
- package/dist/output.test.d.ts.map +1 -0
- package/dist/output.test.js +146 -0
- package/dist/output.test.js.map +1 -0
- package/dist/staleness.d.ts +162 -0
- package/dist/staleness.d.ts.map +1 -0
- package/dist/staleness.js +309 -0
- package/dist/staleness.js.map +1 -0
- package/dist/staleness.test.d.ts +2 -0
- package/dist/staleness.test.d.ts.map +1 -0
- package/dist/staleness.test.js +448 -0
- package/dist/staleness.test.js.map +1 -0
- package/dist/storage.d.ts +267 -0
- package/dist/storage.d.ts.map +1 -0
- package/dist/storage.js +623 -0
- package/dist/storage.js.map +1 -0
- package/dist/storage.test.d.ts +5 -0
- package/dist/storage.test.d.ts.map +1 -0
- package/dist/storage.test.js +434 -0
- package/dist/storage.test.js.map +1 -0
- package/dist/types.d.ts +270 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +12 -0
- package/dist/types.js.map +1 -0
- package/dist/types.test.d.ts +2 -0
- package/dist/types.test.d.ts.map +1 -0
- package/dist/types.test.js +232 -0
- package/dist/types.test.js.map +1 -0
- package/dist/watcher.d.ts +139 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +406 -0
- package/dist/watcher.js.map +1 -0
- package/dist/watcher.test.d.ts +5 -0
- package/dist/watcher.test.d.ts.map +1 -0
- package/dist/watcher.test.js +327 -0
- package/dist/watcher.test.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prov agent commands implementation.
|
|
3
|
+
*
|
|
4
|
+
* Commands for AI agent support:
|
|
5
|
+
* - agent context: Output structured context for AI agents
|
|
6
|
+
*
|
|
7
|
+
* @see req:agent:context-retrieval
|
|
8
|
+
*/
|
|
9
|
+
import { isInitialized, loadGraph } from '../storage.js';
|
|
10
|
+
import { output, error, resolveFormat } from '../output.js';
|
|
11
|
+
// ============================================================================
|
|
12
|
+
// agent context Command
|
|
13
|
+
// ============================================================================
|
|
14
|
+
/**
|
|
15
|
+
* Execute the agent context command.
|
|
16
|
+
*
|
|
17
|
+
* Outputs structured context for AI agent consumption, including specs,
|
|
18
|
+
* constraints, current plan state, and remaining work items.
|
|
19
|
+
*
|
|
20
|
+
* @see req:agent:context-retrieval
|
|
21
|
+
*/
|
|
22
|
+
export function runAgentContext(globalOpts, options) {
|
|
23
|
+
const projectRoot = globalOpts.dir ?? process.cwd();
|
|
24
|
+
const fmt = resolveFormat({ format: globalOpts.format });
|
|
25
|
+
// Check if prov is initialized
|
|
26
|
+
if (!isInitialized(projectRoot)) {
|
|
27
|
+
const result = {
|
|
28
|
+
success: false,
|
|
29
|
+
error: 'prov is not initialized. Run "prov init" first.',
|
|
30
|
+
};
|
|
31
|
+
if (fmt === 'json') {
|
|
32
|
+
output(result, { format: 'json' });
|
|
33
|
+
}
|
|
34
|
+
else if (fmt === 'yaml') {
|
|
35
|
+
output(result, { format: 'yaml' });
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
error(result.error);
|
|
39
|
+
}
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
// Load graph
|
|
43
|
+
const loadResult = loadGraph(projectRoot);
|
|
44
|
+
if (!loadResult.success || loadResult.data === undefined) {
|
|
45
|
+
const result = {
|
|
46
|
+
success: false,
|
|
47
|
+
error: loadResult.error ?? 'Failed to load graph',
|
|
48
|
+
};
|
|
49
|
+
if (fmt === 'json') {
|
|
50
|
+
output(result, { format: 'json' });
|
|
51
|
+
}
|
|
52
|
+
else if (fmt === 'yaml') {
|
|
53
|
+
output(result, { format: 'yaml' });
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
error(result.error);
|
|
57
|
+
}
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
const graph = loadResult.data;
|
|
61
|
+
// Collect specs (optionally filtered by scope)
|
|
62
|
+
const specNodes = graph.getNodesByType('spec');
|
|
63
|
+
const scopeSet = options.scope !== undefined ? new Set(options.scope) : null;
|
|
64
|
+
const specs = [];
|
|
65
|
+
const relevantSpecIds = new Set();
|
|
66
|
+
for (const node of specNodes) {
|
|
67
|
+
const spec = node.data;
|
|
68
|
+
// Filter by scope if specified
|
|
69
|
+
if (scopeSet !== null && !scopeSet.has(spec.id)) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
relevantSpecIds.add(spec.id);
|
|
73
|
+
const specSummary = {
|
|
74
|
+
id: spec.id,
|
|
75
|
+
title: spec.title,
|
|
76
|
+
status: spec.status,
|
|
77
|
+
intent: spec.intent,
|
|
78
|
+
requirements: spec.requirements.map((req) => ({
|
|
79
|
+
id: req.id,
|
|
80
|
+
description: req.description,
|
|
81
|
+
acceptance: req.acceptance.map((a) => typeof a === 'string' ? a : a.description),
|
|
82
|
+
})),
|
|
83
|
+
};
|
|
84
|
+
if (node.hash !== undefined) {
|
|
85
|
+
specSummary.hash = node.hash;
|
|
86
|
+
}
|
|
87
|
+
specs.push(specSummary);
|
|
88
|
+
}
|
|
89
|
+
// Collect constraints
|
|
90
|
+
const constraintNodes = graph.getNodesByType('constraint');
|
|
91
|
+
const constraints = [];
|
|
92
|
+
for (const node of constraintNodes) {
|
|
93
|
+
const constraint = node.data;
|
|
94
|
+
const constraintSummary = {
|
|
95
|
+
id: constraint.id,
|
|
96
|
+
title: constraint.title,
|
|
97
|
+
status: constraint.status,
|
|
98
|
+
description: constraint.description,
|
|
99
|
+
invariants: constraint.invariants.map((inv) => ({
|
|
100
|
+
id: inv.id,
|
|
101
|
+
rule: inv.rule,
|
|
102
|
+
verification: `${inv.verification.type}: ${inv.verification.value}`,
|
|
103
|
+
blocking: inv.blocking ?? false,
|
|
104
|
+
})),
|
|
105
|
+
};
|
|
106
|
+
if (node.hash !== undefined) {
|
|
107
|
+
constraintSummary.hash = node.hash;
|
|
108
|
+
}
|
|
109
|
+
constraints.push(constraintSummary);
|
|
110
|
+
}
|
|
111
|
+
// Collect plans (filter to those derived from relevant specs if scope is set)
|
|
112
|
+
const planNodes = graph.getNodesByType('plan');
|
|
113
|
+
const plans = [];
|
|
114
|
+
let totalSteps = 0;
|
|
115
|
+
let completedSteps = 0;
|
|
116
|
+
let pendingSteps = 0;
|
|
117
|
+
let nextStep;
|
|
118
|
+
for (const node of planNodes) {
|
|
119
|
+
const plan = node.data;
|
|
120
|
+
// If scope is set, only include plans that derive from relevant specs
|
|
121
|
+
if (scopeSet !== null) {
|
|
122
|
+
const planSpecIds = plan.sources
|
|
123
|
+
.map((s) => s.id)
|
|
124
|
+
.filter((id) => id.startsWith('spec:'));
|
|
125
|
+
const hasRelevantSpec = planSpecIds.some((id) => relevantSpecIds.has(id));
|
|
126
|
+
if (!hasRelevantSpec) {
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const planCompleted = plan.steps.filter((s) => s.status === 'completed').length;
|
|
131
|
+
const remaining = plan.steps.filter((s) => s.status !== 'completed');
|
|
132
|
+
totalSteps += plan.steps.length;
|
|
133
|
+
completedSteps += planCompleted;
|
|
134
|
+
pendingSteps += remaining.length;
|
|
135
|
+
const remainingSteps = remaining.map((s) => {
|
|
136
|
+
const stepSummary = {
|
|
137
|
+
id: s.id,
|
|
138
|
+
number: s.number,
|
|
139
|
+
action: s.action,
|
|
140
|
+
status: s.status ?? 'pending',
|
|
141
|
+
tracesTo: [...s.tracesTo],
|
|
142
|
+
};
|
|
143
|
+
if (s.description !== undefined) {
|
|
144
|
+
stepSummary.description = s.description;
|
|
145
|
+
}
|
|
146
|
+
return stepSummary;
|
|
147
|
+
});
|
|
148
|
+
// Track the first pending step as next step
|
|
149
|
+
if (nextStep === undefined && remainingSteps.length > 0) {
|
|
150
|
+
// Find first non-blocked step
|
|
151
|
+
const firstPending = remainingSteps.find((s) => s.status === 'pending' || s.status === 'in_progress');
|
|
152
|
+
if (firstPending !== undefined) {
|
|
153
|
+
nextStep = firstPending;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const planSummary = {
|
|
157
|
+
id: plan.id,
|
|
158
|
+
title: plan.title,
|
|
159
|
+
status: plan.status,
|
|
160
|
+
sources: plan.sources.map((s) => s.id),
|
|
161
|
+
totalSteps: plan.steps.length,
|
|
162
|
+
completedSteps: planCompleted,
|
|
163
|
+
remainingSteps,
|
|
164
|
+
};
|
|
165
|
+
if (node.hash !== undefined) {
|
|
166
|
+
planSummary.hash = node.hash;
|
|
167
|
+
}
|
|
168
|
+
plans.push(planSummary);
|
|
169
|
+
}
|
|
170
|
+
const remainingWork = {
|
|
171
|
+
totalSteps,
|
|
172
|
+
completedSteps,
|
|
173
|
+
pendingSteps,
|
|
174
|
+
};
|
|
175
|
+
if (nextStep !== undefined) {
|
|
176
|
+
remainingWork.nextStep = nextStep;
|
|
177
|
+
}
|
|
178
|
+
const result = {
|
|
179
|
+
success: true,
|
|
180
|
+
context: {
|
|
181
|
+
specs,
|
|
182
|
+
constraints,
|
|
183
|
+
plans,
|
|
184
|
+
remainingWork,
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
// Always output as YAML or JSON for agent consumption
|
|
188
|
+
// Table format doesn't make sense for complex nested data
|
|
189
|
+
if (fmt === 'json') {
|
|
190
|
+
output(result, { format: 'json' });
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
// Default to YAML for agent-friendly output
|
|
194
|
+
output(result, { format: 'yaml' });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test.d.ts","sourceRoot":"","sources":["../../src/commands/agent.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for prov agent commands.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
5
|
+
import { mkdtempSync, rmSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { tmpdir } from 'node:os';
|
|
8
|
+
import { runAgentContext } from './agent.js';
|
|
9
|
+
import { runInit } from './init.js';
|
|
10
|
+
import { runSpecAdd } from './spec.js';
|
|
11
|
+
import { runPlanCreate } from './plan.js';
|
|
12
|
+
describe('agent commands', () => {
|
|
13
|
+
let tempDir;
|
|
14
|
+
let stdoutOutput;
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
// Create temp directory
|
|
17
|
+
tempDir = mkdtempSync(join(tmpdir(), 'prov-agent-test-'));
|
|
18
|
+
// Mock stdout/stderr
|
|
19
|
+
stdoutOutput = '';
|
|
20
|
+
vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
21
|
+
stdoutOutput += String(chunk);
|
|
22
|
+
return true;
|
|
23
|
+
});
|
|
24
|
+
vi.spyOn(process.stderr, 'write').mockImplementation(() => {
|
|
25
|
+
return true;
|
|
26
|
+
});
|
|
27
|
+
// Mock process.exit
|
|
28
|
+
vi.spyOn(process, 'exit').mockImplementation(() => {
|
|
29
|
+
throw new Error('process.exit called');
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
// Clean up temp directory
|
|
34
|
+
rmSync(tempDir, { recursive: true, force: true });
|
|
35
|
+
vi.restoreAllMocks();
|
|
36
|
+
});
|
|
37
|
+
describe('agent context', () => {
|
|
38
|
+
it('should fail if prov is not initialized', () => {
|
|
39
|
+
const globalOpts = { dir: tempDir, format: 'json' };
|
|
40
|
+
expect(() => runAgentContext(globalOpts, {})).toThrow('process.exit called');
|
|
41
|
+
const result = JSON.parse(stdoutOutput);
|
|
42
|
+
expect(result.success).toBe(false);
|
|
43
|
+
expect(result.error).toContain('not initialized');
|
|
44
|
+
});
|
|
45
|
+
it('should return empty context for initialized project with no data', () => {
|
|
46
|
+
// Initialize prov
|
|
47
|
+
const globalOpts = { dir: tempDir, format: 'json' };
|
|
48
|
+
runInit(globalOpts, {});
|
|
49
|
+
stdoutOutput = '';
|
|
50
|
+
// Run agent context
|
|
51
|
+
runAgentContext(globalOpts, {});
|
|
52
|
+
const result = JSON.parse(stdoutOutput);
|
|
53
|
+
expect(result.success).toBe(true);
|
|
54
|
+
expect(result.context).toBeDefined();
|
|
55
|
+
expect(result.context.specs).toEqual([]);
|
|
56
|
+
expect(result.context.constraints).toEqual([]);
|
|
57
|
+
expect(result.context.plans).toEqual([]);
|
|
58
|
+
expect(result.context.remainingWork.totalSteps).toBe(0);
|
|
59
|
+
});
|
|
60
|
+
it('should return context with specs', () => {
|
|
61
|
+
// Initialize prov
|
|
62
|
+
const globalOpts = { dir: tempDir, format: 'json' };
|
|
63
|
+
runInit(globalOpts, {});
|
|
64
|
+
// Create spec directory and file
|
|
65
|
+
const specDir = join(tempDir, 'spec');
|
|
66
|
+
mkdirSync(specDir, { recursive: true });
|
|
67
|
+
const specContent = `
|
|
68
|
+
id: spec:test-feature:v1
|
|
69
|
+
version: 1.0.0
|
|
70
|
+
title: Test Feature Spec
|
|
71
|
+
status: active
|
|
72
|
+
|
|
73
|
+
intent: |
|
|
74
|
+
A test specification for the agent context command.
|
|
75
|
+
|
|
76
|
+
requirements:
|
|
77
|
+
- id: req:test-feature:basic
|
|
78
|
+
description: Basic feature requirement
|
|
79
|
+
acceptance:
|
|
80
|
+
- Basic functionality works
|
|
81
|
+
`;
|
|
82
|
+
writeFileSync(join(specDir, 'test-feature.spec.yaml'), specContent);
|
|
83
|
+
// Add the spec
|
|
84
|
+
stdoutOutput = '';
|
|
85
|
+
runSpecAdd(globalOpts, 'spec/test-feature.spec.yaml', {});
|
|
86
|
+
// Run agent context
|
|
87
|
+
stdoutOutput = '';
|
|
88
|
+
runAgentContext(globalOpts, {});
|
|
89
|
+
const result = JSON.parse(stdoutOutput);
|
|
90
|
+
expect(result.success).toBe(true);
|
|
91
|
+
expect(result.context.specs).toHaveLength(1);
|
|
92
|
+
expect(result.context.specs[0].id).toBe('spec:test-feature:v1');
|
|
93
|
+
expect(result.context.specs[0].title).toBe('Test Feature Spec');
|
|
94
|
+
expect(result.context.specs[0].requirements).toHaveLength(1);
|
|
95
|
+
expect(result.context.specs[0].requirements[0].id).toBe('req:test-feature:basic');
|
|
96
|
+
});
|
|
97
|
+
it('should filter specs by scope', () => {
|
|
98
|
+
// Initialize prov
|
|
99
|
+
const globalOpts = { dir: tempDir, format: 'json' };
|
|
100
|
+
runInit(globalOpts, {});
|
|
101
|
+
// Create spec directory
|
|
102
|
+
const specDir = join(tempDir, 'spec');
|
|
103
|
+
mkdirSync(specDir, { recursive: true });
|
|
104
|
+
// Create two specs
|
|
105
|
+
const spec1Content = `
|
|
106
|
+
id: spec:feature-one:v1
|
|
107
|
+
version: 1.0.0
|
|
108
|
+
title: Feature One
|
|
109
|
+
status: active
|
|
110
|
+
intent: First feature
|
|
111
|
+
requirements:
|
|
112
|
+
- id: req:feature-one:basic
|
|
113
|
+
description: Basic requirement
|
|
114
|
+
acceptance:
|
|
115
|
+
- Works
|
|
116
|
+
`;
|
|
117
|
+
const spec2Content = `
|
|
118
|
+
id: spec:feature-two:v1
|
|
119
|
+
version: 1.0.0
|
|
120
|
+
title: Feature Two
|
|
121
|
+
status: active
|
|
122
|
+
intent: Second feature
|
|
123
|
+
requirements:
|
|
124
|
+
- id: req:feature-two:basic
|
|
125
|
+
description: Basic requirement
|
|
126
|
+
acceptance:
|
|
127
|
+
- Works
|
|
128
|
+
`;
|
|
129
|
+
writeFileSync(join(specDir, 'feature-one.spec.yaml'), spec1Content);
|
|
130
|
+
writeFileSync(join(specDir, 'feature-two.spec.yaml'), spec2Content);
|
|
131
|
+
// Add both specs
|
|
132
|
+
runSpecAdd(globalOpts, 'spec/feature-one.spec.yaml', {});
|
|
133
|
+
runSpecAdd(globalOpts, 'spec/feature-two.spec.yaml', {});
|
|
134
|
+
// Run agent context with scope
|
|
135
|
+
stdoutOutput = '';
|
|
136
|
+
runAgentContext(globalOpts, { scope: ['spec:feature-one:v1'] });
|
|
137
|
+
const result = JSON.parse(stdoutOutput);
|
|
138
|
+
expect(result.success).toBe(true);
|
|
139
|
+
expect(result.context.specs).toHaveLength(1);
|
|
140
|
+
expect(result.context.specs[0].id).toBe('spec:feature-one:v1');
|
|
141
|
+
});
|
|
142
|
+
it('should include plan progress in context', () => {
|
|
143
|
+
// Initialize prov
|
|
144
|
+
const globalOpts = { dir: tempDir, format: 'json' };
|
|
145
|
+
runInit(globalOpts, {});
|
|
146
|
+
// Create spec
|
|
147
|
+
const specDir = join(tempDir, 'spec');
|
|
148
|
+
mkdirSync(specDir, { recursive: true });
|
|
149
|
+
const specContent = `
|
|
150
|
+
id: spec:test-plan:v1
|
|
151
|
+
version: 1.0.0
|
|
152
|
+
title: Test Plan Spec
|
|
153
|
+
status: active
|
|
154
|
+
intent: Testing plan context
|
|
155
|
+
requirements:
|
|
156
|
+
- id: req:test-plan:one
|
|
157
|
+
description: First requirement
|
|
158
|
+
acceptance:
|
|
159
|
+
- Passes
|
|
160
|
+
- id: req:test-plan:two
|
|
161
|
+
description: Second requirement
|
|
162
|
+
acceptance:
|
|
163
|
+
- Passes
|
|
164
|
+
`;
|
|
165
|
+
writeFileSync(join(specDir, 'test-plan.spec.yaml'), specContent);
|
|
166
|
+
// Add spec
|
|
167
|
+
runSpecAdd(globalOpts, 'spec/test-plan.spec.yaml', {});
|
|
168
|
+
// Create plan
|
|
169
|
+
stdoutOutput = '';
|
|
170
|
+
runPlanCreate(globalOpts, { from: ['spec:test-plan:v1'] });
|
|
171
|
+
// Run agent context
|
|
172
|
+
stdoutOutput = '';
|
|
173
|
+
runAgentContext(globalOpts, {});
|
|
174
|
+
const result = JSON.parse(stdoutOutput);
|
|
175
|
+
expect(result.success).toBe(true);
|
|
176
|
+
expect(result.context.plans).toHaveLength(1);
|
|
177
|
+
expect(result.context.plans[0].id).toBe('plan:test-plan:v1');
|
|
178
|
+
expect(result.context.plans[0].totalSteps).toBe(2);
|
|
179
|
+
expect(result.context.plans[0].completedSteps).toBe(0);
|
|
180
|
+
expect(result.context.plans[0].remainingSteps).toHaveLength(2);
|
|
181
|
+
expect(result.context.remainingWork.totalSteps).toBe(2);
|
|
182
|
+
expect(result.context.remainingWork.completedSteps).toBe(0);
|
|
183
|
+
expect(result.context.remainingWork.pendingSteps).toBe(2);
|
|
184
|
+
expect(result.context.remainingWork.nextStep).toBeDefined();
|
|
185
|
+
});
|
|
186
|
+
it('should output YAML by default', () => {
|
|
187
|
+
// Initialize prov
|
|
188
|
+
const globalOpts = { dir: tempDir };
|
|
189
|
+
runInit(globalOpts, {});
|
|
190
|
+
stdoutOutput = '';
|
|
191
|
+
// Run agent context without format (defaults to yaml for non-TTY)
|
|
192
|
+
runAgentContext(globalOpts, {});
|
|
193
|
+
// Should be valid YAML
|
|
194
|
+
expect(stdoutOutput).toContain('success: true');
|
|
195
|
+
expect(stdoutOutput).toContain('context:');
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
//# sourceMappingURL=agent.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.test.js","sourceRoot":"","sources":["../../src/commands/agent.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,eAAe,EAA2B,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG1C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAI,OAAe,CAAC;IACpB,IAAI,YAAoB,CAAC;IAEzB,UAAU,CAAC,GAAG,EAAE;QACd,wBAAwB;QACxB,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAC;QAE1D,qBAAqB;QACrB,YAAY,GAAG,EAAE,CAAC;QAClB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,CAAC,KAAc,EAAE,EAAE;YACtE,YAAY,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACxD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,oBAAoB;QACpB,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAChD,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,0BAA0B;QAC1B,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC7B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YAEnE,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;YAE7E,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAuB,CAAC;YAC9D,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,kEAAkE,EAAE,GAAG,EAAE;YAC1E,kBAAkB;YAClB,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YACnE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACxB,YAAY,GAAG,EAAE,CAAC;YAElB,oBAAoB;YACpB,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAuB,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;YACrC,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,kBAAkB;YAClB,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YACnE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAExB,iCAAiC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAExC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;CAczB,CAAC;YACI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,wBAAwB,CAAC,EAAE,WAAW,CAAC,CAAC;YAEpE,eAAe;YACf,YAAY,GAAG,EAAE,CAAC;YAClB,UAAU,CAAC,UAAU,EAAE,6BAA6B,EAAE,EAAE,CAAC,CAAC;YAE1D,oBAAoB;YACpB,YAAY,GAAG,EAAE,CAAC;YAClB,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAuB,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,YAAY,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,kBAAkB;YAClB,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YACnE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAExB,wBAAwB;YACxB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAExC,mBAAmB;YACnB,MAAM,YAAY,GAAG;;;;;;;;;;;CAW1B,CAAC;YACI,MAAM,YAAY,GAAG;;;;;;;;;;;CAW1B,CAAC;YACI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,EAAE,YAAY,CAAC,CAAC;YACpE,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,EAAE,YAAY,CAAC,CAAC;YAEpE,iBAAiB;YACjB,UAAU,CAAC,UAAU,EAAE,4BAA4B,EAAE,EAAE,CAAC,CAAC;YACzD,UAAU,CAAC,UAAU,EAAE,4BAA4B,EAAE,EAAE,CAAC,CAAC;YAEzD,+BAA+B;YAC/B,YAAY,GAAG,EAAE,CAAC;YAClB,eAAe,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;YAEhE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAuB,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,kBAAkB;YAClB,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;YACnE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAExB,cAAc;YACd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YACtC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAExC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;CAezB,CAAC;YACI,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,EAAE,WAAW,CAAC,CAAC;YAEjE,WAAW;YACX,UAAU,CAAC,UAAU,EAAE,0BAA0B,EAAE,EAAE,CAAC,CAAC;YAEvD,cAAc;YACd,YAAY,GAAG,EAAE,CAAC;YAClB,aAAa,CAAC,UAAU,EAAE,EAAE,IAAI,EAAE,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAE3D,oBAAoB;YACpB,YAAY,GAAG,EAAE,CAAC;YAClB,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEhC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAuB,CAAC;YAC9D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YAC/D,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAEjE,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC7D,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,OAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,kBAAkB;YAClB,MAAM,UAAU,GAAkB,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;YACnD,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACxB,YAAY,GAAG,EAAE,CAAC;YAElB,kEAAkE;YAClE,eAAe,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAEhC,uBAAuB;YACvB,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YAChD,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prov constraint commands implementation.
|
|
3
|
+
*
|
|
4
|
+
* Commands for managing constraints:
|
|
5
|
+
* - constraint add: Add a constraint to tracking
|
|
6
|
+
* - constraint list: List tracked constraints
|
|
7
|
+
* - constraint check: Run constraint verification
|
|
8
|
+
*
|
|
9
|
+
* @see req:cli:constraint-add
|
|
10
|
+
* @see req:cli:constraint-list
|
|
11
|
+
* @see req:cli:constraint-check
|
|
12
|
+
*/
|
|
13
|
+
import { type GlobalOptions } from '../cli.js';
|
|
14
|
+
import type { ConstraintId, InvariantId, Hash, EntityStatus } from '../types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Options for constraint add command.
|
|
17
|
+
*/
|
|
18
|
+
export interface ConstraintAddOptions {
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Result of constraint add command.
|
|
22
|
+
*/
|
|
23
|
+
export interface ConstraintAddResult {
|
|
24
|
+
success: boolean;
|
|
25
|
+
constraintId?: ConstraintId;
|
|
26
|
+
hash?: Hash;
|
|
27
|
+
invariantCount?: number;
|
|
28
|
+
error?: string;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Options for constraint list command.
|
|
32
|
+
*/
|
|
33
|
+
export interface ConstraintListOptions {
|
|
34
|
+
status?: string | undefined;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Constraint entry for list output.
|
|
38
|
+
*/
|
|
39
|
+
export interface ConstraintListEntry {
|
|
40
|
+
id: ConstraintId;
|
|
41
|
+
version: string;
|
|
42
|
+
title: string;
|
|
43
|
+
status: EntityStatus | 'stale' | 'missing';
|
|
44
|
+
hash: string;
|
|
45
|
+
invariants: number;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Result of constraint list command.
|
|
49
|
+
*/
|
|
50
|
+
export interface ConstraintListResult {
|
|
51
|
+
constraints: ConstraintListEntry[];
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Options for constraint check command.
|
|
55
|
+
*/
|
|
56
|
+
export interface ConstraintCheckOptions {
|
|
57
|
+
fix?: boolean | undefined;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Check result for a single invariant.
|
|
61
|
+
*/
|
|
62
|
+
export interface InvariantCheckResult {
|
|
63
|
+
invariantId: InvariantId;
|
|
64
|
+
rule: string;
|
|
65
|
+
passed: boolean;
|
|
66
|
+
blocking: boolean;
|
|
67
|
+
output?: string;
|
|
68
|
+
error?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Result of constraint check command.
|
|
72
|
+
*/
|
|
73
|
+
export interface ConstraintCheckResult {
|
|
74
|
+
success: boolean;
|
|
75
|
+
constraintId?: ConstraintId;
|
|
76
|
+
results: InvariantCheckResult[];
|
|
77
|
+
passed: number;
|
|
78
|
+
failed: number;
|
|
79
|
+
skipped: number;
|
|
80
|
+
error?: string;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Execute the constraint add command.
|
|
84
|
+
*
|
|
85
|
+
* @see req:cli:constraint-add
|
|
86
|
+
*/
|
|
87
|
+
export declare function runConstraintAdd(globalOpts: GlobalOptions, file: string, _options: ConstraintAddOptions): void;
|
|
88
|
+
/**
|
|
89
|
+
* Execute the constraint list command.
|
|
90
|
+
*
|
|
91
|
+
* @see req:cli:constraint-list
|
|
92
|
+
*/
|
|
93
|
+
export declare function runConstraintList(globalOpts: GlobalOptions, options: ConstraintListOptions): void;
|
|
94
|
+
/**
|
|
95
|
+
* Execute the constraint check command.
|
|
96
|
+
*
|
|
97
|
+
* @see req:cli:constraint-check
|
|
98
|
+
*/
|
|
99
|
+
export declare function runConstraintCheck(globalOpts: GlobalOptions, constraintId: string | undefined, _options: ConstraintCheckOptions): Promise<void>;
|
|
100
|
+
//# sourceMappingURL=constraint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constraint.d.ts","sourceRoot":"","sources":["../../src/commands/constraint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,WAAW,CAAC;AAK/C,OAAO,KAAK,EAEV,YAAY,EAEZ,WAAW,EACX,IAAI,EACJ,YAAY,EAEb,MAAM,aAAa,CAAC;AAMrB;;GAEG;AACH,MAAM,WAAW,oBAAoB;CAEpC;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,YAAY,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;IAC3C,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,mBAAmB,EAAE,CAAC;CACpC;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,OAAO,EAAE,oBAAoB,EAAE,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAgZD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,aAAa,EACzB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,oBAAoB,GAC7B,IAAI,CA+IN;AAMD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,aAAa,EACzB,OAAO,EAAE,qBAAqB,GAC7B,IAAI,CA+GN;AAMD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,aAAa,EACzB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,sBAAsB,GAC/B,OAAO,CAAC,IAAI,CAAC,CA2Jf"}
|