@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,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,5 @@
1
+ /**
2
+ * Tests for prov agent commands.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=agent.test.d.ts.map
@@ -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":"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"}
@@ -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"}