proofscan 0.10.22 → 0.10.23

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 (92) hide show
  1. package/dist/cli-shell.d.ts +7 -0
  2. package/dist/cli-shell.d.ts.map +1 -0
  3. package/dist/cli-shell.js +34 -0
  4. package/dist/cli-shell.js.map +1 -0
  5. package/dist/cli.js +4 -2
  6. package/dist/cli.js.map +1 -1
  7. package/dist/commands/doctor.d.ts.map +1 -1
  8. package/dist/commands/doctor.js +112 -57
  9. package/dist/commands/doctor.js.map +1 -1
  10. package/dist/commands/index.d.ts +1 -0
  11. package/dist/commands/index.d.ts.map +1 -1
  12. package/dist/commands/index.js +2 -0
  13. package/dist/commands/index.js.map +1 -1
  14. package/dist/commands/plans.d.ts +7 -0
  15. package/dist/commands/plans.d.ts.map +1 -0
  16. package/dist/commands/plans.js +486 -0
  17. package/dist/commands/plans.js.map +1 -0
  18. package/dist/commands/scan.d.ts.map +1 -1
  19. package/dist/commands/scan.js +7 -2
  20. package/dist/commands/scan.js.map +1 -1
  21. package/dist/db/connection.d.ts +22 -0
  22. package/dist/db/connection.d.ts.map +1 -1
  23. package/dist/db/connection.js +141 -8
  24. package/dist/db/connection.js.map +1 -1
  25. package/dist/db/schema.d.ts +10 -5
  26. package/dist/db/schema.d.ts.map +1 -1
  27. package/dist/db/schema.js +85 -6
  28. package/dist/db/schema.js.map +1 -1
  29. package/dist/db/types.d.ts +1 -1
  30. package/dist/db/types.d.ts.map +1 -1
  31. package/dist/help/categories.d.ts.map +1 -1
  32. package/dist/help/categories.js +15 -0
  33. package/dist/help/categories.js.map +1 -1
  34. package/dist/i18n/locales/en.d.ts +31 -0
  35. package/dist/i18n/locales/en.d.ts.map +1 -1
  36. package/dist/i18n/locales/en.js +32 -0
  37. package/dist/i18n/locales/en.js.map +1 -1
  38. package/dist/i18n/locales/ja.d.ts.map +1 -1
  39. package/dist/i18n/locales/ja.js +32 -0
  40. package/dist/i18n/locales/ja.js.map +1 -1
  41. package/dist/plans/artifacts.d.ts +53 -0
  42. package/dist/plans/artifacts.d.ts.map +1 -0
  43. package/dist/plans/artifacts.js +186 -0
  44. package/dist/plans/artifacts.js.map +1 -0
  45. package/dist/plans/builtin.d.ts +40 -0
  46. package/dist/plans/builtin.d.ts.map +1 -0
  47. package/dist/plans/builtin.js +75 -0
  48. package/dist/plans/builtin.js.map +1 -0
  49. package/dist/plans/digest.d.ts +24 -0
  50. package/dist/plans/digest.d.ts.map +1 -0
  51. package/dist/plans/digest.js +49 -0
  52. package/dist/plans/digest.js.map +1 -0
  53. package/dist/plans/index.d.ts +11 -0
  54. package/dist/plans/index.d.ts.map +1 -0
  55. package/dist/plans/index.js +11 -0
  56. package/dist/plans/index.js.map +1 -0
  57. package/dist/plans/runner.d.ts +47 -0
  58. package/dist/plans/runner.d.ts.map +1 -0
  59. package/dist/plans/runner.js +360 -0
  60. package/dist/plans/runner.js.map +1 -0
  61. package/dist/plans/schema.d.ts +192 -0
  62. package/dist/plans/schema.d.ts.map +1 -0
  63. package/dist/plans/schema.js +81 -0
  64. package/dist/plans/schema.js.map +1 -0
  65. package/dist/plans/store.d.ts +111 -0
  66. package/dist/plans/store.d.ts.map +1 -0
  67. package/dist/plans/store.js +350 -0
  68. package/dist/plans/store.js.map +1 -0
  69. package/dist/popl/index.d.ts +1 -1
  70. package/dist/popl/index.d.ts.map +1 -1
  71. package/dist/popl/index.js +1 -1
  72. package/dist/popl/index.js.map +1 -1
  73. package/dist/popl/service.d.ts +12 -0
  74. package/dist/popl/service.d.ts.map +1 -1
  75. package/dist/popl/service.js +213 -0
  76. package/dist/popl/service.js.map +1 -1
  77. package/dist/popl/types.d.ts +5 -1
  78. package/dist/popl/types.d.ts.map +1 -1
  79. package/dist/shell/context-applicator.d.ts.map +1 -1
  80. package/dist/shell/context-applicator.js +7 -0
  81. package/dist/shell/context-applicator.js.map +1 -1
  82. package/dist/shell/ref-resolver.d.ts +34 -3
  83. package/dist/shell/ref-resolver.d.ts.map +1 -1
  84. package/dist/shell/ref-resolver.js +128 -1
  85. package/dist/shell/ref-resolver.js.map +1 -1
  86. package/dist/shell/router-commands.d.ts.map +1 -1
  87. package/dist/shell/router-commands.js +108 -25
  88. package/dist/shell/router-commands.js.map +1 -1
  89. package/dist/shell/types.d.ts.map +1 -1
  90. package/dist/shell/types.js +12 -0
  91. package/dist/shell/types.js.map +1 -1
  92. package/package.json +4 -2
@@ -0,0 +1,360 @@
1
+ /**
2
+ * Plan runner - executes validation plans against MCP servers
3
+ * Phase 5.2: MCP validation scenario execution
4
+ * Phase 5.3: Unified session recording (events.db + proofs.db)
5
+ */
6
+ import { ulid } from 'ulid';
7
+ import { StdioConnection } from '../transports/stdio.js';
8
+ import { PlansStore } from './store.js';
9
+ import { EventsStore } from '../db/events-store.js';
10
+ import { writeAllArtifacts } from './artifacts.js';
11
+ export class PlanRunner {
12
+ configDir;
13
+ store;
14
+ eventsStore;
15
+ constructor(configDir) {
16
+ this.configDir = configDir;
17
+ this.store = new PlansStore(configDir);
18
+ this.eventsStore = new EventsStore(configDir);
19
+ }
20
+ /**
21
+ * Run a plan against a connector
22
+ * Records session in both proofs.db (runs table) and events.db (sessions/events)
23
+ */
24
+ async run(plan, connector, options = {}) {
25
+ const timeout = (options.timeout || 30) * 1000;
26
+ const dryRun = options.dryRun || false;
27
+ const runId = ulid();
28
+ const startedAt = new Date().toISOString();
29
+ // Parse plan definition
30
+ const def = JSON.parse(JSON.stringify(await import('yaml').then(yaml => yaml.parse(plan.content_yaml))));
31
+ // Create run record in proofs.db (unless dry run)
32
+ if (!dryRun) {
33
+ this.store.createRun({
34
+ runId,
35
+ planName: plan.name,
36
+ planDigest: plan.digest_sha256,
37
+ connectorId: connector.id,
38
+ artifactPath: `artifacts/${runId}`,
39
+ });
40
+ }
41
+ // Create session in events.db (unless dry run)
42
+ const session = dryRun
43
+ ? { session_id: `dry-run-${Date.now()}` }
44
+ : this.eventsStore.createSession(connector.id);
45
+ const sessionId = session.session_id;
46
+ // Track RPC calls for events.db
47
+ const rpcIdMap = new Map();
48
+ const steps = [];
49
+ const inventory = {};
50
+ let finalStatus = 'completed';
51
+ // Check transport type
52
+ if (connector.transport.type !== 'stdio') {
53
+ const endedAt = new Date().toISOString();
54
+ if (!dryRun) {
55
+ this.eventsStore.saveEvent(sessionId, 'client_to_server', 'transport_event', {
56
+ rawJson: JSON.stringify({ type: 'error', message: `Unsupported transport type: ${connector.transport.type}` }),
57
+ });
58
+ this.eventsStore.endSession(sessionId, 'error');
59
+ }
60
+ const errorResult = {
61
+ runId,
62
+ planName: plan.name,
63
+ planDigest: plan.digest_sha256,
64
+ connectorId: connector.id,
65
+ status: 'failed',
66
+ steps: [],
67
+ inventory,
68
+ startedAt,
69
+ endedAt,
70
+ sessionId: dryRun ? undefined : sessionId,
71
+ };
72
+ if (!dryRun) {
73
+ this.store.completeRun(runId, 'failed');
74
+ writeAllArtifacts(options.outDir || this.configDir, errorResult, def, plan.content_yaml, plan.content_normalized);
75
+ }
76
+ return errorResult;
77
+ }
78
+ const transport = connector.transport;
79
+ const connection = new StdioConnection(transport);
80
+ try {
81
+ // Log connection attempt
82
+ if (!dryRun) {
83
+ this.eventsStore.saveEvent(sessionId, 'client_to_server', 'transport_event', {
84
+ rawJson: JSON.stringify({
85
+ type: 'connect_attempt',
86
+ command: transport.command,
87
+ args: transport.args,
88
+ plan: plan.name,
89
+ runId,
90
+ }),
91
+ });
92
+ }
93
+ // Set up message logging for events.db
94
+ connection.on('message', (msg, raw) => {
95
+ if (dryRun)
96
+ return;
97
+ const isRequest = 'method' in msg && 'id' in msg && msg.id !== null;
98
+ const isNotification = 'method' in msg && !('id' in msg);
99
+ const isResponse = 'id' in msg && !('method' in msg);
100
+ const direction = isResponse ? 'server_to_client' :
101
+ (isRequest || isNotification) && !('id' in msg && 'result' in msg) ? 'client_to_server' : 'server_to_client';
102
+ let kind;
103
+ if (isRequest)
104
+ kind = 'request';
105
+ else if (isNotification)
106
+ kind = 'notification';
107
+ else if (isResponse)
108
+ kind = 'response';
109
+ else
110
+ kind = 'transport_event';
111
+ let rpcId;
112
+ // Handle RPC tracking
113
+ if (isRequest && 'id' in msg && msg.id !== null && 'method' in msg) {
114
+ const rpcCall = this.eventsStore.saveRpcCall(sessionId, String(msg.id), msg.method);
115
+ rpcIdMap.set(msg.id, rpcCall.rpc_id);
116
+ rpcId = rpcCall.rpc_id;
117
+ }
118
+ else if (isResponse && 'id' in msg && msg.id !== null) {
119
+ rpcId = rpcIdMap.get(msg.id);
120
+ if (rpcId) {
121
+ const resp = msg;
122
+ this.eventsStore.completeRpcCall(sessionId, String(msg.id), !resp.error, resp.error?.code);
123
+ }
124
+ }
125
+ this.eventsStore.saveEvent(sessionId, direction, kind, {
126
+ rpcId: rpcId || (('id' in msg && msg.id !== null) ? String(msg.id) : undefined),
127
+ rawJson: raw,
128
+ });
129
+ });
130
+ connection.on('stderr', (data) => {
131
+ if (!dryRun) {
132
+ this.eventsStore.saveEvent(sessionId, 'server_to_client', 'transport_event', {
133
+ rawJson: JSON.stringify({ type: 'stderr', data: data.trim() }),
134
+ });
135
+ }
136
+ });
137
+ connection.on('error', (error) => {
138
+ if (!dryRun) {
139
+ this.eventsStore.saveEvent(sessionId, 'server_to_client', 'transport_event', {
140
+ rawJson: JSON.stringify({ type: 'error', message: error.message }),
141
+ });
142
+ }
143
+ });
144
+ // Connect to MCP server
145
+ await connection.connect();
146
+ if (!dryRun) {
147
+ this.eventsStore.saveEvent(sessionId, 'server_to_client', 'transport_event', {
148
+ rawJson: JSON.stringify({ type: 'connected' }),
149
+ });
150
+ }
151
+ // Execute each step
152
+ for (let i = 0; i < def.steps.length; i++) {
153
+ const step = def.steps[i];
154
+ const stepResult = await this.executeStep(connection, step, i, inventory, timeout);
155
+ steps.push(stepResult);
156
+ // Update inventory based on response
157
+ if (!stepResult.skipped && stepResult.response?.result) {
158
+ this.updateInventory(inventory, step.mcp, stepResult.response.result);
159
+ }
160
+ // Track failures
161
+ if (!stepResult.skipped && stepResult.response?.error) {
162
+ if (finalStatus === 'completed') {
163
+ finalStatus = 'partial';
164
+ }
165
+ }
166
+ }
167
+ // Check if all non-skipped steps failed
168
+ const executed = steps.filter(s => !s.skipped);
169
+ const failed = executed.filter(s => s.response?.error);
170
+ if (executed.length > 0 && failed.length === executed.length) {
171
+ finalStatus = 'failed';
172
+ }
173
+ }
174
+ catch (err) {
175
+ // Fatal error during execution
176
+ finalStatus = 'failed';
177
+ const errorStep = {
178
+ stepIndex: steps.length,
179
+ method: 'execution_error',
180
+ skipped: false,
181
+ request: { method: 'execution_error', params: {} },
182
+ response: { error: { message: err instanceof Error ? err.message : String(err) } },
183
+ startedAt: new Date().toISOString(),
184
+ endedAt: new Date().toISOString(),
185
+ durationMs: 0,
186
+ };
187
+ steps.push(errorStep);
188
+ if (!dryRun) {
189
+ this.eventsStore.saveEvent(sessionId, 'client_to_server', 'transport_event', {
190
+ rawJson: JSON.stringify({ type: 'execution_error', error: err instanceof Error ? err.message : String(err) }),
191
+ });
192
+ }
193
+ }
194
+ finally {
195
+ connection.close();
196
+ }
197
+ const endedAt = new Date().toISOString();
198
+ // End session in events.db
199
+ if (!dryRun) {
200
+ this.eventsStore.saveEvent(sessionId, 'client_to_server', 'transport_event', {
201
+ rawJson: JSON.stringify({ type: 'disconnected', plan: plan.name, runId, status: finalStatus }),
202
+ });
203
+ this.eventsStore.endSession(sessionId, finalStatus === 'failed' ? 'error' : 'normal');
204
+ }
205
+ const result = {
206
+ runId,
207
+ planName: plan.name,
208
+ planDigest: plan.digest_sha256,
209
+ connectorId: connector.id,
210
+ status: finalStatus,
211
+ steps,
212
+ inventory,
213
+ startedAt,
214
+ endedAt,
215
+ sessionId: dryRun ? undefined : sessionId,
216
+ };
217
+ // Complete run in proofs.db and write artifacts (unless dry run)
218
+ if (!dryRun) {
219
+ this.store.completeRun(runId, finalStatus);
220
+ writeAllArtifacts(options.outDir || this.configDir, result, def, plan.content_yaml, plan.content_normalized);
221
+ }
222
+ return result;
223
+ }
224
+ /**
225
+ * Execute a single plan step
226
+ */
227
+ async executeStep(connection, step, index, inventory, timeout) {
228
+ const startedAt = new Date().toISOString();
229
+ // Check when condition
230
+ if (step.when) {
231
+ const shouldExecute = this.evaluateWhenCondition(step.when, inventory);
232
+ if (!shouldExecute) {
233
+ const endedAt = new Date().toISOString();
234
+ return {
235
+ stepIndex: index,
236
+ method: step.mcp,
237
+ skipped: true,
238
+ skipReason: `Condition not met: ${step.when}`,
239
+ request: { method: step.mcp, params: {} },
240
+ startedAt,
241
+ endedAt,
242
+ durationMs: new Date(endedAt).getTime() - new Date(startedAt).getTime(),
243
+ };
244
+ }
245
+ }
246
+ // Build request params based on method
247
+ const params = this.buildRequestParams(step.mcp);
248
+ try {
249
+ const response = await connection.sendRequest(step.mcp, params, timeout);
250
+ const endedAt = new Date().toISOString();
251
+ return {
252
+ stepIndex: index,
253
+ method: step.mcp,
254
+ skipped: false,
255
+ request: { method: step.mcp, params },
256
+ response: {
257
+ result: response.result,
258
+ error: response.error,
259
+ },
260
+ startedAt,
261
+ endedAt,
262
+ durationMs: new Date(endedAt).getTime() - new Date(startedAt).getTime(),
263
+ };
264
+ }
265
+ catch (err) {
266
+ const endedAt = new Date().toISOString();
267
+ return {
268
+ stepIndex: index,
269
+ method: step.mcp,
270
+ skipped: false,
271
+ request: { method: step.mcp, params },
272
+ response: {
273
+ error: {
274
+ code: -1,
275
+ message: err instanceof Error ? err.message : String(err),
276
+ },
277
+ },
278
+ startedAt,
279
+ endedAt,
280
+ durationMs: new Date(endedAt).getTime() - new Date(startedAt).getTime(),
281
+ };
282
+ }
283
+ }
284
+ /**
285
+ * Build request params for MCP method
286
+ */
287
+ buildRequestParams(method) {
288
+ switch (method) {
289
+ case 'initialize':
290
+ return {
291
+ protocolVersion: '2024-11-05',
292
+ capabilities: {},
293
+ clientInfo: {
294
+ name: 'proofscan',
295
+ version: '1.0.0',
296
+ },
297
+ };
298
+ case 'tools/list':
299
+ case 'resources/list':
300
+ case 'prompts/list':
301
+ return {};
302
+ default:
303
+ return {};
304
+ }
305
+ }
306
+ /**
307
+ * Evaluate a when condition against current inventory
308
+ */
309
+ evaluateWhenCondition(condition, inventory) {
310
+ // Parse condition: capabilities.<field>
311
+ const match = condition.match(/^capabilities\.(\w+)$/);
312
+ if (!match) {
313
+ return false;
314
+ }
315
+ const field = match[1];
316
+ const capabilities = inventory.capabilities;
317
+ if (!capabilities) {
318
+ return false;
319
+ }
320
+ // Check if field exists and is truthy
321
+ const value = capabilities[field];
322
+ return value !== undefined && value !== null && value !== false;
323
+ }
324
+ /**
325
+ * Update inventory based on response
326
+ */
327
+ updateInventory(inventory, method, result) {
328
+ switch (method) {
329
+ case 'initialize': {
330
+ const initResult = result;
331
+ if (initResult.capabilities) {
332
+ inventory.capabilities = initResult.capabilities;
333
+ }
334
+ break;
335
+ }
336
+ case 'tools/list': {
337
+ const toolsResult = result;
338
+ if (toolsResult.tools) {
339
+ inventory.tools = toolsResult.tools;
340
+ }
341
+ break;
342
+ }
343
+ case 'resources/list': {
344
+ const resourcesResult = result;
345
+ if (resourcesResult.resources) {
346
+ inventory.resources = resourcesResult.resources;
347
+ }
348
+ break;
349
+ }
350
+ case 'prompts/list': {
351
+ const promptsResult = result;
352
+ if (promptsResult.prompts) {
353
+ inventory.prompts = promptsResult.prompts;
354
+ }
355
+ break;
356
+ }
357
+ }
358
+ }
359
+ }
360
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/plans/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Plans schema definitions
3
+ * Phase 5.2: Validation plans for MCP servers
4
+ */
5
+ /**
6
+ * Plan step definition - a single MCP method call
7
+ */
8
+ export interface PlanStep {
9
+ /** MCP method to call: 'initialize' | 'tools/list' | 'resources/list' | 'prompts/list' */
10
+ mcp: string;
11
+ /** Conditional execution: 'capabilities.tools' | 'capabilities.resources' | 'capabilities.prompts' */
12
+ when?: string;
13
+ }
14
+ /**
15
+ * Plan definition as parsed from YAML
16
+ */
17
+ export interface PlanDefinition {
18
+ /** Schema version (must be 1) */
19
+ version: 1;
20
+ /** Optional plan name (overridden by DB record name) */
21
+ name?: string;
22
+ /** Optional description */
23
+ description?: string;
24
+ /** Validation steps to execute */
25
+ steps: PlanStep[];
26
+ }
27
+ /**
28
+ * Plan record stored in database
29
+ */
30
+ export interface Plan {
31
+ /** Unique plan name (identifier) */
32
+ name: string;
33
+ /** Schema version */
34
+ schema_version: number;
35
+ /** Original YAML content */
36
+ content_yaml: string;
37
+ /** Normalized YAML/JSON for digest calculation */
38
+ content_normalized: string;
39
+ /** SHA-256 digest of normalized content */
40
+ digest_sha256: string;
41
+ /** Optional description */
42
+ description: string | null;
43
+ /** Default connector ID */
44
+ default_connector: string | null;
45
+ /** Source of the plan: 'manual' | 'import' | 'builtin' */
46
+ source: 'manual' | 'import' | 'builtin';
47
+ /** Creation timestamp (ISO) */
48
+ created_at: string;
49
+ /** Last update timestamp (ISO) */
50
+ updated_at: string;
51
+ }
52
+ /**
53
+ * Run status
54
+ */
55
+ export type RunStatus = 'running' | 'completed' | 'failed' | 'partial' | 'crashed';
56
+ /**
57
+ * Run record stored in database
58
+ */
59
+ export interface Run {
60
+ /** Unique run ID (ULID) */
61
+ run_id: string;
62
+ /** Plan name (may be null if plan was deleted) */
63
+ plan_name: string | null;
64
+ /** Plan digest at time of execution */
65
+ plan_digest: string;
66
+ /** Connector ID used for execution */
67
+ connector_id: string;
68
+ /** Run status */
69
+ status: RunStatus;
70
+ /** Relative path to artifacts directory */
71
+ artifact_path: string;
72
+ /** Start timestamp (ISO) */
73
+ started_at: string;
74
+ /** End timestamp (ISO) - null if still running */
75
+ ended_at: string | null;
76
+ /** Record creation timestamp (ISO) */
77
+ created_at: string;
78
+ }
79
+ /**
80
+ * Step result from plan execution
81
+ */
82
+ export interface StepResult {
83
+ /** Step index (0-based) */
84
+ stepIndex: number;
85
+ /** MCP method called */
86
+ method: string;
87
+ /** Whether step was skipped due to when condition */
88
+ skipped: boolean;
89
+ /** Reason for skipping (if skipped) */
90
+ skipReason?: string;
91
+ /** Request sent */
92
+ request: {
93
+ method: string;
94
+ params: unknown;
95
+ };
96
+ /** Response received (if not skipped) */
97
+ response?: {
98
+ result?: unknown;
99
+ error?: unknown;
100
+ };
101
+ /** Start timestamp (ISO) */
102
+ startedAt: string;
103
+ /** End timestamp (ISO) */
104
+ endedAt: string;
105
+ /** Duration in milliseconds */
106
+ durationMs: number;
107
+ }
108
+ /**
109
+ * Inventory collected during plan execution
110
+ */
111
+ export interface RunInventory {
112
+ /** Capabilities from initialize response */
113
+ capabilities?: unknown;
114
+ /** Tools from tools/list response */
115
+ tools?: unknown[];
116
+ /** Resources from resources/list response */
117
+ resources?: unknown[];
118
+ /** Prompts from prompts/list response */
119
+ prompts?: unknown[];
120
+ }
121
+ /**
122
+ * Complete run result
123
+ */
124
+ export interface RunResult {
125
+ /** Run ID */
126
+ runId: string;
127
+ /** Plan name */
128
+ planName: string;
129
+ /** Plan digest */
130
+ planDigest: string;
131
+ /** Connector ID */
132
+ connectorId: string;
133
+ /** Final status */
134
+ status: 'completed' | 'failed' | 'partial';
135
+ /** Step results */
136
+ steps: StepResult[];
137
+ /** Collected inventory */
138
+ inventory: RunInventory;
139
+ /** Start timestamp */
140
+ startedAt: string;
141
+ /** End timestamp */
142
+ endedAt: string;
143
+ }
144
+ /**
145
+ * Run metadata written to meta.json
146
+ */
147
+ export interface RunMeta {
148
+ /** Run ID */
149
+ runId: string;
150
+ /** Plan name */
151
+ planName: string;
152
+ /** Plan digest at time of run */
153
+ planDigest: string;
154
+ /** Connector ID */
155
+ connectorId: string;
156
+ /** Run status */
157
+ status: RunStatus;
158
+ /** Start timestamp */
159
+ startedAt: string;
160
+ /** End timestamp */
161
+ endedAt?: string;
162
+ /** Total steps count */
163
+ totalSteps: number;
164
+ /** Passed steps count */
165
+ passedSteps: number;
166
+ /** Failed steps count */
167
+ failedSteps: number;
168
+ /** Skipped steps count */
169
+ skippedSteps: number;
170
+ /** Relative artifact path */
171
+ artifactPath: string;
172
+ }
173
+ /**
174
+ * Supported MCP methods in plans
175
+ */
176
+ export declare const SUPPORTED_MCP_METHODS: readonly ["initialize", "tools/list", "resources/list", "prompts/list"];
177
+ /**
178
+ * Supported when conditions
179
+ */
180
+ export declare const SUPPORTED_WHEN_CONDITIONS: readonly ["capabilities.tools", "capabilities.resources", "capabilities.prompts"];
181
+ /**
182
+ * Validate plan name format
183
+ */
184
+ export declare function isValidPlanName(name: string): boolean;
185
+ /**
186
+ * Validate plan definition
187
+ */
188
+ export declare function validatePlanDefinition(def: unknown): {
189
+ valid: boolean;
190
+ errors: string[];
191
+ };
192
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/plans/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Plans schema definitions
3
+ * Phase 5.2: Validation plans for MCP servers
4
+ */
5
+ /**
6
+ * Supported MCP methods in plans
7
+ */
8
+ export const SUPPORTED_MCP_METHODS = [
9
+ 'initialize',
10
+ 'tools/list',
11
+ 'resources/list',
12
+ 'prompts/list',
13
+ ];
14
+ /**
15
+ * Supported when conditions
16
+ */
17
+ export const SUPPORTED_WHEN_CONDITIONS = [
18
+ 'capabilities.tools',
19
+ 'capabilities.resources',
20
+ 'capabilities.prompts',
21
+ ];
22
+ /**
23
+ * Validate plan name format
24
+ */
25
+ export function isValidPlanName(name) {
26
+ return /^[a-z0-9_-]+$/.test(name);
27
+ }
28
+ /**
29
+ * Validate plan definition
30
+ */
31
+ export function validatePlanDefinition(def) {
32
+ const errors = [];
33
+ if (!def || typeof def !== 'object') {
34
+ return { valid: false, errors: ['Plan must be an object'] };
35
+ }
36
+ const plan = def;
37
+ // Check version
38
+ if (plan.version !== 1) {
39
+ errors.push(`Invalid version: expected 1, got ${plan.version}`);
40
+ }
41
+ // Check steps
42
+ if (!Array.isArray(plan.steps)) {
43
+ errors.push('steps must be an array');
44
+ return { valid: false, errors };
45
+ }
46
+ if (plan.steps.length === 0) {
47
+ errors.push('steps array cannot be empty');
48
+ }
49
+ // Validate each step
50
+ for (let i = 0; i < plan.steps.length; i++) {
51
+ const step = plan.steps[i];
52
+ if (!step || typeof step !== 'object') {
53
+ errors.push(`Step ${i}: must be an object`);
54
+ continue;
55
+ }
56
+ if (typeof step.mcp !== 'string') {
57
+ errors.push(`Step ${i}: mcp must be a string`);
58
+ continue;
59
+ }
60
+ if (!SUPPORTED_MCP_METHODS.includes(step.mcp)) {
61
+ errors.push(`Step ${i}: unsupported mcp method '${step.mcp}'`);
62
+ }
63
+ if (step.when !== undefined) {
64
+ if (typeof step.when !== 'string') {
65
+ errors.push(`Step ${i}: when must be a string`);
66
+ }
67
+ else if (!SUPPORTED_WHEN_CONDITIONS.includes(step.when)) {
68
+ errors.push(`Step ${i}: unsupported when condition '${step.when}'`);
69
+ }
70
+ }
71
+ }
72
+ // Check that initialize is first step (if present)
73
+ if (plan.steps.length > 0) {
74
+ const firstStep = plan.steps[0];
75
+ if (firstStep.mcp !== 'initialize') {
76
+ errors.push('First step must be "initialize"');
77
+ }
78
+ }
79
+ return { valid: errors.length === 0, errors };
80
+ }
81
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/plans/schema.ts"],"names":[],"mappings":"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"}