@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,456 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration tests for agent workflows.
|
|
3
|
+
*
|
|
4
|
+
* These tests simulate end-to-end agent interactions with the prov system,
|
|
5
|
+
* covering the complete workflow from initialization through trace completion.
|
|
6
|
+
*
|
|
7
|
+
* @see prov-4c9 Phase 6: Polish - Write integration tests covering agent workflows
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
10
|
+
import { mkdtempSync, rmSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { tmpdir } from 'node:os';
|
|
13
|
+
import { runInit } from './init.js';
|
|
14
|
+
import { runSpecAdd } from './spec.js';
|
|
15
|
+
import { runConstraintAdd } from './constraint.js';
|
|
16
|
+
import { runPlanCreate, runPlanNext, runPlanProgress, runPlanRemaining } from './plan.js';
|
|
17
|
+
import { runTraceAdd, runTraceShow, runTraceWhy } from './trace.js';
|
|
18
|
+
import { runAgentContext } from './agent.js';
|
|
19
|
+
import { runImpact, runStale } from './impact.js';
|
|
20
|
+
import { createMcpServer, setProjectRoot } from './mcp.js';
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Test Data
|
|
23
|
+
// ============================================================================
|
|
24
|
+
const FEATURE_SPEC = `id: spec:user-auth:v1
|
|
25
|
+
version: 1.0.0
|
|
26
|
+
title: User Authentication Feature
|
|
27
|
+
status: active
|
|
28
|
+
|
|
29
|
+
intent: |
|
|
30
|
+
Implement secure user authentication with login, logout, and session management.
|
|
31
|
+
|
|
32
|
+
requirements:
|
|
33
|
+
- id: req:user-auth:login
|
|
34
|
+
description: Users can log in with email and password
|
|
35
|
+
acceptance:
|
|
36
|
+
- Login form accepts email and password
|
|
37
|
+
- Valid credentials create a session
|
|
38
|
+
- Invalid credentials show error message
|
|
39
|
+
|
|
40
|
+
- id: req:user-auth:logout
|
|
41
|
+
description: Users can log out and end their session
|
|
42
|
+
acceptance:
|
|
43
|
+
- Logout button ends the session
|
|
44
|
+
- User is redirected to login page
|
|
45
|
+
|
|
46
|
+
- id: req:user-auth:session
|
|
47
|
+
description: Sessions persist across page reloads
|
|
48
|
+
acceptance:
|
|
49
|
+
- Session survives browser refresh
|
|
50
|
+
- Session expires after 24 hours
|
|
51
|
+
`;
|
|
52
|
+
const SECURITY_CONSTRAINT = `id: constraint:security:v1
|
|
53
|
+
version: 1.0.0
|
|
54
|
+
title: Security Constraints
|
|
55
|
+
status: active
|
|
56
|
+
|
|
57
|
+
description: |
|
|
58
|
+
Security requirements for all authentication-related features.
|
|
59
|
+
|
|
60
|
+
invariants:
|
|
61
|
+
- id: inv:security:password-hash
|
|
62
|
+
rule: Passwords must be hashed using bcrypt with cost factor >= 12
|
|
63
|
+
blocking: true
|
|
64
|
+
verification:
|
|
65
|
+
type: command
|
|
66
|
+
value: echo "checking bcrypt"
|
|
67
|
+
expect: success
|
|
68
|
+
|
|
69
|
+
- id: inv:security:no-plain-passwords
|
|
70
|
+
rule: Plain text passwords must never be stored or logged
|
|
71
|
+
blocking: true
|
|
72
|
+
verification:
|
|
73
|
+
type: command
|
|
74
|
+
value: echo "checking passwords"
|
|
75
|
+
expect: success
|
|
76
|
+
`;
|
|
77
|
+
const API_SPEC = `id: spec:api-endpoints:v1
|
|
78
|
+
version: 1.0.0
|
|
79
|
+
title: API Endpoints Specification
|
|
80
|
+
status: active
|
|
81
|
+
|
|
82
|
+
intent: |
|
|
83
|
+
Define REST API endpoints for user management.
|
|
84
|
+
|
|
85
|
+
requirements:
|
|
86
|
+
- id: req:api-endpoints:user-create
|
|
87
|
+
description: POST /api/users creates a new user
|
|
88
|
+
acceptance:
|
|
89
|
+
- Returns 201 on success
|
|
90
|
+
- Returns 400 on validation error
|
|
91
|
+
|
|
92
|
+
- id: req:api-endpoints:user-get
|
|
93
|
+
description: GET /api/users/:id retrieves user details
|
|
94
|
+
acceptance:
|
|
95
|
+
- Returns 200 with user data
|
|
96
|
+
- Returns 404 for unknown users
|
|
97
|
+
`;
|
|
98
|
+
function createTestContext() {
|
|
99
|
+
const tempDir = mkdtempSync(join(tmpdir(), 'prov-integration-test-'));
|
|
100
|
+
return {
|
|
101
|
+
tempDir,
|
|
102
|
+
stdoutOutput: '',
|
|
103
|
+
stderrOutput: '',
|
|
104
|
+
globalOpts: { dir: tempDir, format: 'json' },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function setupMocks(ctx) {
|
|
108
|
+
vi.spyOn(process.stdout, 'write').mockImplementation((chunk) => {
|
|
109
|
+
ctx.stdoutOutput += String(chunk);
|
|
110
|
+
return true;
|
|
111
|
+
});
|
|
112
|
+
vi.spyOn(process.stderr, 'write').mockImplementation((chunk) => {
|
|
113
|
+
ctx.stderrOutput += String(chunk);
|
|
114
|
+
return true;
|
|
115
|
+
});
|
|
116
|
+
vi.spyOn(process, 'exit').mockImplementation(() => {
|
|
117
|
+
throw new Error('process.exit called');
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function cleanupTestContext(ctx) {
|
|
121
|
+
rmSync(ctx.tempDir, { recursive: true, force: true });
|
|
122
|
+
vi.restoreAllMocks();
|
|
123
|
+
}
|
|
124
|
+
function clearOutput(ctx) {
|
|
125
|
+
ctx.stdoutOutput = '';
|
|
126
|
+
ctx.stderrOutput = '';
|
|
127
|
+
}
|
|
128
|
+
function parseJsonOutput(ctx) {
|
|
129
|
+
return JSON.parse(ctx.stdoutOutput);
|
|
130
|
+
}
|
|
131
|
+
// ============================================================================
|
|
132
|
+
// Integration Tests
|
|
133
|
+
// ============================================================================
|
|
134
|
+
describe('Agent Workflow Integration Tests', () => {
|
|
135
|
+
let ctx;
|
|
136
|
+
beforeEach(() => {
|
|
137
|
+
ctx = createTestContext();
|
|
138
|
+
setupMocks(ctx);
|
|
139
|
+
});
|
|
140
|
+
afterEach(() => {
|
|
141
|
+
cleanupTestContext(ctx);
|
|
142
|
+
});
|
|
143
|
+
describe('Complete Agent Workflow', () => {
|
|
144
|
+
it('should support full spec-to-trace workflow', () => {
|
|
145
|
+
// Step 1: Initialize prov
|
|
146
|
+
runInit(ctx.globalOpts, {});
|
|
147
|
+
clearOutput(ctx);
|
|
148
|
+
// Step 2: Create spec file and add to tracking
|
|
149
|
+
const specDir = join(ctx.tempDir, 'spec');
|
|
150
|
+
mkdirSync(specDir, { recursive: true });
|
|
151
|
+
writeFileSync(join(specDir, 'user-auth.spec.yaml'), FEATURE_SPEC);
|
|
152
|
+
runSpecAdd(ctx.globalOpts, 'spec/user-auth.spec.yaml', {});
|
|
153
|
+
clearOutput(ctx);
|
|
154
|
+
// Step 3: Get agent context to understand current state
|
|
155
|
+
runAgentContext(ctx.globalOpts, {});
|
|
156
|
+
let result = parseJsonOutput(ctx);
|
|
157
|
+
expect(result.success).toBe(true);
|
|
158
|
+
expect(result.context?.specs).toHaveLength(1);
|
|
159
|
+
expect(result.context?.specs[0]?.id).toBe('spec:user-auth:v1');
|
|
160
|
+
expect(result.context?.specs[0]?.requirements).toHaveLength(3);
|
|
161
|
+
clearOutput(ctx);
|
|
162
|
+
// Step 4: Create a plan from the spec
|
|
163
|
+
runPlanCreate(ctx.globalOpts, { from: ['spec:user-auth:v1'] });
|
|
164
|
+
clearOutput(ctx);
|
|
165
|
+
// Step 5: Get agent context again to see plan
|
|
166
|
+
runAgentContext(ctx.globalOpts, {});
|
|
167
|
+
result = parseJsonOutput(ctx);
|
|
168
|
+
expect(result.success).toBe(true);
|
|
169
|
+
expect(result.context?.plans).toHaveLength(1);
|
|
170
|
+
expect(result.context?.plans[0]?.id).toBe('plan:user-auth:v1');
|
|
171
|
+
expect(result.context?.plans[0]?.totalSteps).toBe(3);
|
|
172
|
+
expect(result.context?.plans[0]?.completedSteps).toBe(0);
|
|
173
|
+
expect(result.context?.remainingWork.nextStep).toBeDefined();
|
|
174
|
+
clearOutput(ctx);
|
|
175
|
+
// Step 6: Create an artifact and trace it
|
|
176
|
+
const srcDir = join(ctx.tempDir, 'src');
|
|
177
|
+
mkdirSync(srcDir, { recursive: true });
|
|
178
|
+
writeFileSync(join(srcDir, 'auth.ts'), '// @see req:user-auth:login\nexport function login() { /* login implementation */ }');
|
|
179
|
+
runTraceAdd(ctx.globalOpts, 'src/auth.ts', { to: 'step:user-auth:1' });
|
|
180
|
+
clearOutput(ctx);
|
|
181
|
+
// Step 7: Show trace for the artifact
|
|
182
|
+
runTraceShow(ctx.globalOpts, 'src/auth.ts', {});
|
|
183
|
+
const traceResult = parseJsonOutput(ctx);
|
|
184
|
+
expect(traceResult.trace.stepId).toBe('step:user-auth:1');
|
|
185
|
+
clearOutput(ctx);
|
|
186
|
+
// Step 8: Get updated progress
|
|
187
|
+
runPlanProgress(ctx.globalOpts, 'plan:user-auth:v1', {});
|
|
188
|
+
const progressResult = parseJsonOutput(ctx);
|
|
189
|
+
// Note: trace alone doesn't mark step complete, but we can verify tracking works
|
|
190
|
+
expect(progressResult.progress.totalSteps).toBe(3);
|
|
191
|
+
});
|
|
192
|
+
it('should handle multi-spec workflow with constraints', () => {
|
|
193
|
+
// Initialize
|
|
194
|
+
runInit(ctx.globalOpts, {});
|
|
195
|
+
clearOutput(ctx);
|
|
196
|
+
// Create spec and constraint directories
|
|
197
|
+
const specDir = join(ctx.tempDir, 'spec');
|
|
198
|
+
const constraintDir = join(ctx.tempDir, 'constraint');
|
|
199
|
+
mkdirSync(specDir, { recursive: true });
|
|
200
|
+
mkdirSync(constraintDir, { recursive: true });
|
|
201
|
+
// Add multiple specs
|
|
202
|
+
writeFileSync(join(specDir, 'user-auth.spec.yaml'), FEATURE_SPEC);
|
|
203
|
+
writeFileSync(join(specDir, 'api-endpoints.spec.yaml'), API_SPEC);
|
|
204
|
+
writeFileSync(join(constraintDir, 'security.constraint.yaml'), SECURITY_CONSTRAINT);
|
|
205
|
+
runSpecAdd(ctx.globalOpts, 'spec/user-auth.spec.yaml', {});
|
|
206
|
+
runSpecAdd(ctx.globalOpts, 'spec/api-endpoints.spec.yaml', {});
|
|
207
|
+
runConstraintAdd(ctx.globalOpts, 'constraint/security.constraint.yaml', {});
|
|
208
|
+
clearOutput(ctx);
|
|
209
|
+
// Get agent context with scope
|
|
210
|
+
runAgentContext(ctx.globalOpts, { scope: ['spec:user-auth:v1'] });
|
|
211
|
+
const scopedResult = parseJsonOutput(ctx);
|
|
212
|
+
expect(scopedResult.success).toBe(true);
|
|
213
|
+
expect(scopedResult.context?.specs).toHaveLength(1);
|
|
214
|
+
expect(scopedResult.context?.specs[0]?.id).toBe('spec:user-auth:v1');
|
|
215
|
+
// Constraints should still be included (not filtered by scope)
|
|
216
|
+
expect(scopedResult.context?.constraints).toHaveLength(1);
|
|
217
|
+
clearOutput(ctx);
|
|
218
|
+
// Get full context
|
|
219
|
+
runAgentContext(ctx.globalOpts, {});
|
|
220
|
+
const fullResult = parseJsonOutput(ctx);
|
|
221
|
+
expect(fullResult.context?.specs).toHaveLength(2);
|
|
222
|
+
expect(fullResult.context?.constraints).toHaveLength(1);
|
|
223
|
+
});
|
|
224
|
+
it('should support plan next step workflow', () => {
|
|
225
|
+
// Setup project with spec and plan
|
|
226
|
+
runInit(ctx.globalOpts, {});
|
|
227
|
+
const specDir = join(ctx.tempDir, 'spec');
|
|
228
|
+
mkdirSync(specDir, { recursive: true });
|
|
229
|
+
writeFileSync(join(specDir, 'user-auth.spec.yaml'), FEATURE_SPEC);
|
|
230
|
+
runSpecAdd(ctx.globalOpts, 'spec/user-auth.spec.yaml', {});
|
|
231
|
+
runPlanCreate(ctx.globalOpts, { from: ['spec:user-auth:v1'] });
|
|
232
|
+
clearOutput(ctx);
|
|
233
|
+
// Get next step
|
|
234
|
+
runPlanNext(ctx.globalOpts, 'plan:user-auth:v1', {});
|
|
235
|
+
const nextResult = parseJsonOutput(ctx);
|
|
236
|
+
expect(nextResult.step).toBeDefined();
|
|
237
|
+
expect(nextResult.step.number).toBe(1);
|
|
238
|
+
expect(nextResult.step.id).toBe('step:user-auth:1');
|
|
239
|
+
clearOutput(ctx);
|
|
240
|
+
// Get remaining steps
|
|
241
|
+
runPlanRemaining(ctx.globalOpts, 'plan:user-auth:v1', {});
|
|
242
|
+
const remainingResult = parseJsonOutput(ctx);
|
|
243
|
+
expect(remainingResult.success).toBe(true);
|
|
244
|
+
expect(remainingResult.totalSteps).toBe(3);
|
|
245
|
+
expect(remainingResult.remainingSteps).toHaveLength(3);
|
|
246
|
+
});
|
|
247
|
+
});
|
|
248
|
+
describe('Trace Why Workflow', () => {
|
|
249
|
+
it('should trace requirements to implementations', () => {
|
|
250
|
+
// Setup
|
|
251
|
+
runInit(ctx.globalOpts, {});
|
|
252
|
+
const specDir = join(ctx.tempDir, 'spec');
|
|
253
|
+
const srcDir = join(ctx.tempDir, 'src');
|
|
254
|
+
mkdirSync(specDir, { recursive: true });
|
|
255
|
+
mkdirSync(srcDir, { recursive: true });
|
|
256
|
+
writeFileSync(join(specDir, 'user-auth.spec.yaml'), FEATURE_SPEC);
|
|
257
|
+
runSpecAdd(ctx.globalOpts, 'spec/user-auth.spec.yaml', {});
|
|
258
|
+
runPlanCreate(ctx.globalOpts, { from: ['spec:user-auth:v1'] });
|
|
259
|
+
// Create implementation file with trace marker
|
|
260
|
+
writeFileSync(join(srcDir, 'login.ts'), '// @see req:user-auth:login\nexport function login(email: string, password: string) {}');
|
|
261
|
+
runTraceAdd(ctx.globalOpts, 'src/login.ts', { to: 'step:user-auth:1' });
|
|
262
|
+
clearOutput(ctx);
|
|
263
|
+
// Trace why requirement is implemented
|
|
264
|
+
runTraceWhy(ctx.globalOpts, 'req:user-auth:login', {});
|
|
265
|
+
const whyResult = parseJsonOutput(ctx);
|
|
266
|
+
expect(whyResult.requirement.id).toBe('req:user-auth:login');
|
|
267
|
+
expect(whyResult.implementations).toBeDefined();
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
describe('Impact Analysis Workflow', () => {
|
|
271
|
+
it('should analyze impact when spec changes', () => {
|
|
272
|
+
// Setup with spec, plan, and trace
|
|
273
|
+
runInit(ctx.globalOpts, {});
|
|
274
|
+
const specDir = join(ctx.tempDir, 'spec');
|
|
275
|
+
const srcDir = join(ctx.tempDir, 'src');
|
|
276
|
+
mkdirSync(specDir, { recursive: true });
|
|
277
|
+
mkdirSync(srcDir, { recursive: true });
|
|
278
|
+
writeFileSync(join(specDir, 'user-auth.spec.yaml'), FEATURE_SPEC);
|
|
279
|
+
runSpecAdd(ctx.globalOpts, 'spec/user-auth.spec.yaml', {});
|
|
280
|
+
runPlanCreate(ctx.globalOpts, { from: ['spec:user-auth:v1'] });
|
|
281
|
+
writeFileSync(join(srcDir, 'auth.ts'), '// Auth implementation');
|
|
282
|
+
runTraceAdd(ctx.globalOpts, 'src/auth.ts', { to: 'step:user-auth:1' });
|
|
283
|
+
clearOutput(ctx);
|
|
284
|
+
// Run impact analysis
|
|
285
|
+
runImpact(ctx.globalOpts, 'spec:user-auth:v1', {});
|
|
286
|
+
const impactResult = parseJsonOutput(ctx);
|
|
287
|
+
expect(impactResult.success).toBe(true);
|
|
288
|
+
expect(impactResult.sourceId).toBe('spec:user-auth:v1');
|
|
289
|
+
// Impact should include at least the requirements from the spec
|
|
290
|
+
expect(impactResult.impactedCount).toBeGreaterThan(0);
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
describe('Stale Detection Workflow', () => {
|
|
294
|
+
it('should detect stale artifacts after spec modification', () => {
|
|
295
|
+
// Setup
|
|
296
|
+
runInit(ctx.globalOpts, {});
|
|
297
|
+
const specDir = join(ctx.tempDir, 'spec');
|
|
298
|
+
const srcDir = join(ctx.tempDir, 'src');
|
|
299
|
+
mkdirSync(specDir, { recursive: true });
|
|
300
|
+
mkdirSync(srcDir, { recursive: true });
|
|
301
|
+
writeFileSync(join(specDir, 'user-auth.spec.yaml'), FEATURE_SPEC);
|
|
302
|
+
runSpecAdd(ctx.globalOpts, 'spec/user-auth.spec.yaml', {});
|
|
303
|
+
runPlanCreate(ctx.globalOpts, { from: ['spec:user-auth:v1'] });
|
|
304
|
+
writeFileSync(join(srcDir, 'auth.ts'), '// Auth implementation');
|
|
305
|
+
runTraceAdd(ctx.globalOpts, 'src/auth.ts', { to: 'step:user-auth:1' });
|
|
306
|
+
clearOutput(ctx);
|
|
307
|
+
// Run stale detection
|
|
308
|
+
runStale(ctx.globalOpts, {});
|
|
309
|
+
// Should complete without error - stale detection is available
|
|
310
|
+
// The actual staleness depends on whether source files have changed
|
|
311
|
+
});
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
describe('MCP Server Integration Tests', () => {
|
|
315
|
+
let testDir;
|
|
316
|
+
beforeEach(() => {
|
|
317
|
+
testDir = join(tmpdir(), `prov-mcp-integration-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
318
|
+
mkdirSync(testDir, { recursive: true });
|
|
319
|
+
mkdirSync(join(testDir, 'spec'), { recursive: true });
|
|
320
|
+
mkdirSync(join(testDir, 'src'), { recursive: true });
|
|
321
|
+
setProjectRoot(testDir);
|
|
322
|
+
vi.spyOn(process.stdout, 'write').mockImplementation(() => true);
|
|
323
|
+
vi.spyOn(process.stderr, 'write').mockImplementation(() => true);
|
|
324
|
+
vi.spyOn(process, 'exit').mockImplementation(() => {
|
|
325
|
+
throw new Error('process.exit called');
|
|
326
|
+
});
|
|
327
|
+
runInit({ dir: testDir }, {});
|
|
328
|
+
});
|
|
329
|
+
afterEach(() => {
|
|
330
|
+
setProjectRoot(undefined);
|
|
331
|
+
if (existsSync(testDir)) {
|
|
332
|
+
rmSync(testDir, { recursive: true, force: true });
|
|
333
|
+
}
|
|
334
|
+
vi.restoreAllMocks();
|
|
335
|
+
});
|
|
336
|
+
describe('MCP Server Tool Availability', () => {
|
|
337
|
+
it('should expose all required agent tools', () => {
|
|
338
|
+
// Setup data
|
|
339
|
+
writeFileSync(join(testDir, 'spec', 'test.spec.yaml'), FEATURE_SPEC);
|
|
340
|
+
runSpecAdd({ dir: testDir }, 'spec/test.spec.yaml', {});
|
|
341
|
+
runPlanCreate({ dir: testDir }, { from: ['spec:user-auth:v1'] });
|
|
342
|
+
const server = createMcpServer();
|
|
343
|
+
expect(server).toBeDefined();
|
|
344
|
+
// Verify server has expected methods
|
|
345
|
+
expect(typeof server.setRequestHandler).toBe('function');
|
|
346
|
+
expect(typeof server.connect).toBe('function');
|
|
347
|
+
expect(typeof server.close).toBe('function');
|
|
348
|
+
});
|
|
349
|
+
it('should work with complete project setup', () => {
|
|
350
|
+
// Setup complete project
|
|
351
|
+
writeFileSync(join(testDir, 'spec', 'auth.spec.yaml'), FEATURE_SPEC);
|
|
352
|
+
writeFileSync(join(testDir, 'spec', 'api.spec.yaml'), API_SPEC);
|
|
353
|
+
const constraintDir = join(testDir, 'constraint');
|
|
354
|
+
mkdirSync(constraintDir, { recursive: true });
|
|
355
|
+
writeFileSync(join(constraintDir, 'security.constraint.yaml'), SECURITY_CONSTRAINT);
|
|
356
|
+
runSpecAdd({ dir: testDir }, 'spec/auth.spec.yaml', {});
|
|
357
|
+
runSpecAdd({ dir: testDir }, 'spec/api.spec.yaml', {});
|
|
358
|
+
runConstraintAdd({ dir: testDir }, 'constraint/security.constraint.yaml', {});
|
|
359
|
+
runPlanCreate({ dir: testDir }, { from: ['spec:user-auth:v1'] });
|
|
360
|
+
// Create artifact
|
|
361
|
+
writeFileSync(join(testDir, 'src', 'auth.ts'), 'export function login() {}');
|
|
362
|
+
const server = createMcpServer();
|
|
363
|
+
expect(server).toBeDefined();
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
describe('MCP Workflow Simulation', () => {
|
|
367
|
+
it('should support simulated agent session', () => {
|
|
368
|
+
// This simulates what an AI agent would do via MCP:
|
|
369
|
+
// 1. List specs
|
|
370
|
+
// 2. Create plan
|
|
371
|
+
// 3. Get next step
|
|
372
|
+
// 4. Implement and trace
|
|
373
|
+
// 5. Check progress
|
|
374
|
+
// Setup initial state
|
|
375
|
+
writeFileSync(join(testDir, 'spec', 'feature.spec.yaml'), FEATURE_SPEC);
|
|
376
|
+
runSpecAdd({ dir: testDir }, 'spec/feature.spec.yaml', {});
|
|
377
|
+
// Agent would call prov_spec_list first
|
|
378
|
+
// Then prov_plan_create (not exposed yet, agent uses CLI)
|
|
379
|
+
runPlanCreate({ dir: testDir }, { from: ['spec:user-auth:v1'] });
|
|
380
|
+
// Create MCP server for subsequent operations
|
|
381
|
+
const server = createMcpServer();
|
|
382
|
+
expect(server).toBeDefined();
|
|
383
|
+
// Agent would:
|
|
384
|
+
// - prov_plan_next to get step
|
|
385
|
+
// - prov_context to understand full state
|
|
386
|
+
// - prov_trace_add after implementing
|
|
387
|
+
// - prov_plan_progress to check status
|
|
388
|
+
// Verify server is ready for these operations
|
|
389
|
+
expect(typeof server.setRequestHandler).toBe('function');
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
});
|
|
393
|
+
describe('Error Handling Integration Tests', () => {
|
|
394
|
+
let ctx;
|
|
395
|
+
beforeEach(() => {
|
|
396
|
+
ctx = createTestContext();
|
|
397
|
+
setupMocks(ctx);
|
|
398
|
+
});
|
|
399
|
+
afterEach(() => {
|
|
400
|
+
cleanupTestContext(ctx);
|
|
401
|
+
});
|
|
402
|
+
describe('Graceful Error Handling', () => {
|
|
403
|
+
it('should handle uninitialized project gracefully', () => {
|
|
404
|
+
// Try to get context without initializing
|
|
405
|
+
expect(() => runAgentContext(ctx.globalOpts, {})).toThrow('process.exit called');
|
|
406
|
+
const result = parseJsonOutput(ctx);
|
|
407
|
+
expect(result.success).toBe(false);
|
|
408
|
+
expect(result.error).toContain('not initialized');
|
|
409
|
+
});
|
|
410
|
+
it('should handle missing spec file gracefully', () => {
|
|
411
|
+
runInit(ctx.globalOpts, {});
|
|
412
|
+
clearOutput(ctx);
|
|
413
|
+
// Try to add non-existent spec
|
|
414
|
+
expect(() => runSpecAdd(ctx.globalOpts, 'nonexistent.spec.yaml', {})).toThrow('process.exit called');
|
|
415
|
+
});
|
|
416
|
+
it('should handle invalid plan ID gracefully', () => {
|
|
417
|
+
runInit(ctx.globalOpts, {});
|
|
418
|
+
clearOutput(ctx);
|
|
419
|
+
// Try to get progress for non-existent plan
|
|
420
|
+
expect(() => runPlanProgress(ctx.globalOpts, 'plan:nonexistent:v1', {})).toThrow('process.exit called');
|
|
421
|
+
});
|
|
422
|
+
it('should handle trace to non-existent step gracefully', () => {
|
|
423
|
+
runInit(ctx.globalOpts, {});
|
|
424
|
+
const srcDir = join(ctx.tempDir, 'src');
|
|
425
|
+
mkdirSync(srcDir, { recursive: true });
|
|
426
|
+
writeFileSync(join(srcDir, 'test.ts'), 'export const x = 1;');
|
|
427
|
+
clearOutput(ctx);
|
|
428
|
+
// Try to trace to non-existent step
|
|
429
|
+
expect(() => runTraceAdd(ctx.globalOpts, 'src/test.ts', { to: 'step:fake:1' })).toThrow('process.exit called');
|
|
430
|
+
});
|
|
431
|
+
});
|
|
432
|
+
describe('Recovery Scenarios', () => {
|
|
433
|
+
it('should allow re-initialization with --force', () => {
|
|
434
|
+
// Initialize first time
|
|
435
|
+
runInit(ctx.globalOpts, {});
|
|
436
|
+
clearOutput(ctx);
|
|
437
|
+
// Initialize again with force
|
|
438
|
+
runInit(ctx.globalOpts, { force: true });
|
|
439
|
+
// Should succeed (no error thrown)
|
|
440
|
+
const result = parseJsonOutput(ctx);
|
|
441
|
+
expect(result.success).toBe(true);
|
|
442
|
+
});
|
|
443
|
+
it('should handle empty project state correctly', () => {
|
|
444
|
+
runInit(ctx.globalOpts, {});
|
|
445
|
+
clearOutput(ctx);
|
|
446
|
+
// Get context for empty project
|
|
447
|
+
runAgentContext(ctx.globalOpts, {});
|
|
448
|
+
const result = parseJsonOutput(ctx);
|
|
449
|
+
expect(result.success).toBe(true);
|
|
450
|
+
expect(result.context?.specs).toEqual([]);
|
|
451
|
+
expect(result.context?.plans).toEqual([]);
|
|
452
|
+
expect(result.context?.remainingWork.totalSteps).toBe(0);
|
|
453
|
+
});
|
|
454
|
+
});
|
|
455
|
+
});
|
|
456
|
+
//# sourceMappingURL=integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integration.test.js","sourceRoot":"","sources":["../../src/commands/integration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* prov MCP server implementation.
|
|
3
|
+
*
|
|
4
|
+
* Exposes prov operations as Model Context Protocol tools for AI agent integration.
|
|
5
|
+
*
|
|
6
|
+
* @see req:agent:mcp-integration
|
|
7
|
+
*/
|
|
8
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* Set the project root for testing purposes.
|
|
11
|
+
*/
|
|
12
|
+
export declare function setProjectRoot(root: string | undefined): void;
|
|
13
|
+
/**
|
|
14
|
+
* Create and configure the MCP server.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createMcpServer(): Server;
|
|
17
|
+
/**
|
|
18
|
+
* Run the MCP server with stdio transport.
|
|
19
|
+
*/
|
|
20
|
+
export declare function runMcpServe(): Promise<void>;
|
|
21
|
+
//# sourceMappingURL=mcp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../src/commands/mcp.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAmEnE;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAE7D;AA0dD;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CA6KxC;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAYjD"}
|