mcprigor 1.0.0-rc.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 (164) hide show
  1. package/LICENSE +17 -0
  2. package/README.md +233 -0
  3. package/dist/assertions.d.ts +4 -0
  4. package/dist/assertions.d.ts.map +1 -0
  5. package/dist/assertions.js +101 -0
  6. package/dist/assertions.js.map +1 -0
  7. package/dist/author.d.ts +57 -0
  8. package/dist/author.d.ts.map +1 -0
  9. package/dist/author.js +134 -0
  10. package/dist/author.js.map +1 -0
  11. package/dist/canonical.d.ts +4 -0
  12. package/dist/canonical.d.ts.map +1 -0
  13. package/dist/canonical.js +17 -0
  14. package/dist/canonical.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +265 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/contract.d.ts +28 -0
  20. package/dist/contract.d.ts.map +1 -0
  21. package/dist/contract.js +138 -0
  22. package/dist/contract.js.map +1 -0
  23. package/dist/data.d.ts +24 -0
  24. package/dist/data.d.ts.map +1 -0
  25. package/dist/data.js +367 -0
  26. package/dist/data.js.map +1 -0
  27. package/dist/discovery.d.ts +6 -0
  28. package/dist/discovery.d.ts.map +1 -0
  29. package/dist/discovery.js +82 -0
  30. package/dist/discovery.js.map +1 -0
  31. package/dist/errors.d.ts +19 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +40 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/extension-host.d.ts +20 -0
  36. package/dist/extension-host.d.ts.map +1 -0
  37. package/dist/extension-host.js +52 -0
  38. package/dist/extension-host.js.map +1 -0
  39. package/dist/extension-sdk.d.ts +22 -0
  40. package/dist/extension-sdk.d.ts.map +1 -0
  41. package/dist/extension-sdk.js +3 -0
  42. package/dist/extension-sdk.js.map +1 -0
  43. package/dist/extension-worker.d.ts +2 -0
  44. package/dist/extension-worker.d.ts.map +1 -0
  45. package/dist/extension-worker.js +27 -0
  46. package/dist/extension-worker.js.map +1 -0
  47. package/dist/extensions.d.ts +15 -0
  48. package/dist/extensions.d.ts.map +1 -0
  49. package/dist/extensions.js +60 -0
  50. package/dist/extensions.js.map +1 -0
  51. package/dist/imports.d.ts +7 -0
  52. package/dist/imports.d.ts.map +1 -0
  53. package/dist/imports.js +41 -0
  54. package/dist/imports.js.map +1 -0
  55. package/dist/index.d.ts +29 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +28 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/language.d.ts +34 -0
  60. package/dist/language.d.ts.map +1 -0
  61. package/dist/language.js +102 -0
  62. package/dist/language.js.map +1 -0
  63. package/dist/loader.d.ts +4 -0
  64. package/dist/loader.d.ts.map +1 -0
  65. package/dist/loader.js +51 -0
  66. package/dist/loader.js.map +1 -0
  67. package/dist/parity.d.ts +23 -0
  68. package/dist/parity.d.ts.map +1 -0
  69. package/dist/parity.js +77 -0
  70. package/dist/parity.js.map +1 -0
  71. package/dist/path.d.ts +3 -0
  72. package/dist/path.d.ts.map +1 -0
  73. package/dist/path.js +71 -0
  74. package/dist/path.js.map +1 -0
  75. package/dist/qa-advanced.d.ts +8 -0
  76. package/dist/qa-advanced.d.ts.map +1 -0
  77. package/dist/qa-advanced.js +239 -0
  78. package/dist/qa-advanced.js.map +1 -0
  79. package/dist/qa-language.d.ts +4 -0
  80. package/dist/qa-language.d.ts.map +1 -0
  81. package/dist/qa-language.js +385 -0
  82. package/dist/qa-language.js.map +1 -0
  83. package/dist/qa-loader.d.ts +4 -0
  84. package/dist/qa-loader.d.ts.map +1 -0
  85. package/dist/qa-loader.js +22 -0
  86. package/dist/qa-loader.js.map +1 -0
  87. package/dist/redact.d.ts +7 -0
  88. package/dist/redact.d.ts.map +1 -0
  89. package/dist/redact.js +63 -0
  90. package/dist/redact.js.map +1 -0
  91. package/dist/replay.d.ts +17 -0
  92. package/dist/replay.d.ts.map +1 -0
  93. package/dist/replay.js +48 -0
  94. package/dist/replay.js.map +1 -0
  95. package/dist/reporters.d.ts +6 -0
  96. package/dist/reporters.d.ts.map +1 -0
  97. package/dist/reporters.js +52 -0
  98. package/dist/reporters.js.map +1 -0
  99. package/dist/runner.d.ts +16 -0
  100. package/dist/runner.d.ts.map +1 -0
  101. package/dist/runner.js +304 -0
  102. package/dist/runner.js.map +1 -0
  103. package/dist/schema.d.ts +446 -0
  104. package/dist/schema.d.ts.map +1 -0
  105. package/dist/schema.js +117 -0
  106. package/dist/schema.js.map +1 -0
  107. package/dist/session.d.ts +5 -0
  108. package/dist/session.d.ts.map +1 -0
  109. package/dist/session.js +111 -0
  110. package/dist/session.js.map +1 -0
  111. package/dist/snapshots.d.ts +28 -0
  112. package/dist/snapshots.d.ts.map +1 -0
  113. package/dist/snapshots.js +87 -0
  114. package/dist/snapshots.js.map +1 -0
  115. package/dist/starter.d.ts +3 -0
  116. package/dist/starter.d.ts.map +1 -0
  117. package/dist/starter.js +34 -0
  118. package/dist/starter.js.map +1 -0
  119. package/dist/state.d.ts +13 -0
  120. package/dist/state.d.ts.map +1 -0
  121. package/dist/state.js +29 -0
  122. package/dist/state.js.map +1 -0
  123. package/dist/trace.d.ts +57 -0
  124. package/dist/trace.d.ts.map +1 -0
  125. package/dist/trace.js +94 -0
  126. package/dist/trace.js.map +1 -0
  127. package/dist/types.d.ts +245 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +2 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/workspace.d.ts +10 -0
  132. package/dist/workspace.d.ts.map +1 -0
  133. package/dist/workspace.js +144 -0
  134. package/dist/workspace.js.map +1 -0
  135. package/docs/CLI-REFERENCE.md +167 -0
  136. package/docs/COMPATIBILITY.md +42 -0
  137. package/docs/CONTRACT-DRIFT.md +42 -0
  138. package/docs/DATA-AND-REUSE.md +213 -0
  139. package/docs/DATA-ENGINEERING.md +96 -0
  140. package/docs/ENGINEER-SETUP.md +176 -0
  141. package/docs/ERROR-MODEL.md +24 -0
  142. package/docs/EVIDENCE.md +58 -0
  143. package/docs/EXTENSION-SDK.md +76 -0
  144. package/docs/FILE-EXTENSION.md +52 -0
  145. package/docs/GETTING-STARTED.md +126 -0
  146. package/docs/GUIDED-AUTHORING.md +80 -0
  147. package/docs/LANDSCAPE.md +81 -0
  148. package/docs/LANGUAGE-SPEC.md +317 -0
  149. package/docs/MCP-NATIVE.md +111 -0
  150. package/docs/PLAIN-LANGUAGE-COOKBOOK.md +219 -0
  151. package/docs/QA-GUIDE.md +128 -0
  152. package/docs/QA-WORKSPACE.md +78 -0
  153. package/docs/README.md +55 -0
  154. package/docs/SECURITY-AND-RETENTION.md +37 -0
  155. package/docs/SNAPSHOTS-AND-REPLAY.md +85 -0
  156. package/docs/SPECIFICATION.md +178 -0
  157. package/docs/STATE-AND-DEPENDENCIES.md +106 -0
  158. package/docs/TRANSPORT-PARITY.md +98 -0
  159. package/docs/TROUBLESHOOTING.md +199 -0
  160. package/editors/mcpr-language.json +16 -0
  161. package/package.json +70 -0
  162. package/workspace-assets/app.js +1 -0
  163. package/workspace-assets/index.html +1 -0
  164. package/workspace-assets/style.css +1 -0
@@ -0,0 +1,245 @@
1
+ export interface StdioTarget {
2
+ transport: "stdio";
3
+ command: string;
4
+ args?: string[];
5
+ cwd?: string;
6
+ env?: Record<string, string>;
7
+ }
8
+ export interface HttpTarget {
9
+ transport: "streamable-http";
10
+ url: string;
11
+ headers?: Record<string, string>;
12
+ }
13
+ export type Target = StdioTarget | HttpTarget;
14
+ export interface JsonAssertion {
15
+ path?: string;
16
+ equals?: unknown;
17
+ notEquals?: unknown;
18
+ exists?: boolean;
19
+ type?: "string" | "number" | "boolean" | "object" | "array" | "null";
20
+ contains?: unknown;
21
+ length?: number;
22
+ matches?: string;
23
+ schema?: Record<string, unknown>;
24
+ snapshot?: {
25
+ name: string;
26
+ ignore?: string[];
27
+ };
28
+ }
29
+ export interface StepAssertion {
30
+ status?: "success" | "error";
31
+ error?: {
32
+ code?: number;
33
+ message?: string;
34
+ matches?: string;
35
+ };
36
+ json?: JsonAssertion | JsonAssertion[];
37
+ }
38
+ export interface StepLifecycle {
39
+ phase?: "setup" | "test" | "cleanup";
40
+ always?: boolean;
41
+ }
42
+ export interface RequestStep extends StepLifecycle {
43
+ name?: string;
44
+ request: {
45
+ method: string;
46
+ params?: unknown;
47
+ };
48
+ assert?: StepAssertion;
49
+ capture?: Record<string, string>;
50
+ export?: Record<string, {
51
+ path: string;
52
+ aggregate?: "single" | "list" | "map";
53
+ sensitive?: boolean;
54
+ }>;
55
+ timeoutMs?: number;
56
+ }
57
+ export interface ToolStep extends StepLifecycle {
58
+ name?: string;
59
+ tool: {
60
+ name: string;
61
+ arguments?: Record<string, unknown>;
62
+ };
63
+ assert?: StepAssertion;
64
+ capture?: Record<string, string>;
65
+ export?: Record<string, {
66
+ path: string;
67
+ aggregate?: "single" | "list" | "map";
68
+ sensitive?: boolean;
69
+ }>;
70
+ timeoutMs?: number;
71
+ }
72
+ export interface UtilityStep extends StepLifecycle {
73
+ name?: string;
74
+ set: {
75
+ variable: string;
76
+ function: string;
77
+ arguments?: Record<string, unknown>;
78
+ };
79
+ }
80
+ export interface NativeStep extends StepLifecycle {
81
+ name?: string;
82
+ native: {
83
+ action: "request" | "await-notification" | "subscribe" | "unsubscribe" | "set-log-level" | "list-all" | "task-get" | "task-list" | "task-cancel";
84
+ behavior?: ClientBehavior;
85
+ method?: string;
86
+ params?: unknown;
87
+ uri?: string;
88
+ level?: string;
89
+ field?: string;
90
+ timeoutMs?: number;
91
+ progress?: boolean;
92
+ cancelAfterMs?: number;
93
+ taskId?: string;
94
+ };
95
+ assert?: StepAssertion;
96
+ capture?: Record<string, string>;
97
+ }
98
+ export type TestStep = RequestStep | ToolStep | UtilityStep | NativeStep;
99
+ export interface TestCase {
100
+ name: string;
101
+ id?: string;
102
+ logicalName?: string;
103
+ skip?: boolean | string;
104
+ requires?: {
105
+ capabilities?: string[];
106
+ protocolVersions?: string[];
107
+ };
108
+ dependsOn?: string[];
109
+ variables?: Record<string, unknown>;
110
+ data?: {
111
+ source: string;
112
+ row: number;
113
+ id: string;
114
+ fingerprint: string;
115
+ };
116
+ steps: TestStep[];
117
+ }
118
+ export interface Suite {
119
+ version: 1;
120
+ name?: string;
121
+ target: Target;
122
+ targets?: Record<string, Target>;
123
+ defaults?: {
124
+ timeoutMs?: number;
125
+ };
126
+ redact?: string[];
127
+ extensions?: {
128
+ functions?: string[];
129
+ permissions?: Array<"environment" | "filesystem-read" | "network">;
130
+ allowlist?: string[];
131
+ unsafeLegacy?: boolean;
132
+ };
133
+ client?: ClientBehavior;
134
+ snapshots?: {
135
+ file?: string;
136
+ ignore?: string[];
137
+ };
138
+ tests: TestCase[];
139
+ }
140
+ export interface StepResult {
141
+ name: string;
142
+ method: string;
143
+ status: "passed" | "failed";
144
+ durationMs: number;
145
+ request?: unknown;
146
+ response?: unknown;
147
+ error?: string;
148
+ }
149
+ export interface TestResult {
150
+ name: string;
151
+ id?: string;
152
+ status: "passed" | "failed" | "skipped" | "blocked";
153
+ durationMs: number;
154
+ steps: StepResult[];
155
+ outputs?: Record<string, unknown>;
156
+ error?: string;
157
+ }
158
+ export interface ServerEvidence {
159
+ name?: string;
160
+ version?: string;
161
+ capabilities?: unknown;
162
+ }
163
+ export interface RunResult {
164
+ schemaVersion: 1;
165
+ suiteName: string;
166
+ status: "passed" | "failed";
167
+ startedAt: string;
168
+ durationMs: number;
169
+ protocolVersions: string[];
170
+ server?: ServerEvidence;
171
+ evidenceHash: string;
172
+ tests: TestResult[];
173
+ outputs: Record<string, unknown>;
174
+ summary: {
175
+ passed: number;
176
+ failed: number;
177
+ skipped: number;
178
+ blocked: number;
179
+ };
180
+ }
181
+ export interface SessionInfo {
182
+ protocolVersion?: string;
183
+ serverName?: string;
184
+ serverVersion?: string;
185
+ capabilities?: Record<string, unknown>;
186
+ }
187
+ export interface NativeEvent {
188
+ method: string;
189
+ params?: unknown;
190
+ sequence: number;
191
+ }
192
+ export interface NativeRequestOptions {
193
+ timeoutMs?: number;
194
+ progress?: boolean;
195
+ cancelAfterMs?: number;
196
+ task?: boolean;
197
+ }
198
+ export interface NativeRequestResult {
199
+ result: unknown;
200
+ progress: unknown[];
201
+ taskEvents: unknown[];
202
+ }
203
+ export interface ClientBehavior {
204
+ roots?: Array<{
205
+ uri: string;
206
+ name?: string;
207
+ }>;
208
+ sampling?: {
209
+ model: string;
210
+ text: string;
211
+ };
212
+ elicitation?: {
213
+ action: "accept" | "decline" | "cancel";
214
+ content?: Record<string, string | number | boolean | string[]>;
215
+ };
216
+ }
217
+ export interface TestSession {
218
+ connect(): Promise<SessionInfo>;
219
+ request(method: string, params?: unknown, timeoutMs?: number): Promise<unknown>;
220
+ nativeRequest?(method: string, params?: unknown, options?: NativeRequestOptions): Promise<NativeRequestResult>;
221
+ events?(): NativeEvent[];
222
+ awaitEvent?(method: string, timeoutMs?: number): Promise<NativeEvent>;
223
+ subscribe?(uri: string): Promise<unknown>;
224
+ unsubscribe?(uri: string): Promise<unknown>;
225
+ setLoggingLevel?(level: string): Promise<unknown>;
226
+ configureClient?(behavior: ClientBehavior): void;
227
+ close(): Promise<void>;
228
+ diagnostics(): string[];
229
+ }
230
+ export interface DiscoveryDocument {
231
+ schemaVersion: 1;
232
+ discoveredAt: string;
233
+ target: {
234
+ transport: Target["transport"];
235
+ };
236
+ server: ServerEvidence;
237
+ protocolVersion?: string;
238
+ tools: unknown[];
239
+ resources: unknown[];
240
+ resourceTemplates: unknown[];
241
+ prompts: unknown[];
242
+ fingerprint: string;
243
+ diagnostics: string[];
244
+ }
245
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ export interface WorkspaceOptions {
2
+ root?: string;
3
+ host?: string;
4
+ port?: number;
5
+ }
6
+ export declare function startWorkspace(options?: WorkspaceOptions): Promise<{
7
+ url: string;
8
+ close(): Promise<void>;
9
+ }>;
10
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,gBAAgB;IAAG,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAIjF,wBAAsB,cAAc,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAuBrH"}
@@ -0,0 +1,144 @@
1
+ import { createHash, randomBytes, timingSafeEqual } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { mkdir, readFile, readdir, realpath, rename, stat, writeFile } from "node:fs/promises";
4
+ import { basename, dirname, extname, join, relative, resolve, sep } from "node:path";
5
+ import { loadTestFile } from "./qa-loader.js";
6
+ import { parityReport, runParity } from "./parity.js";
7
+ import { terminalReport } from "./reporters.js";
8
+ import { runSuite } from "./runner.js";
9
+ const TEXT_EXTENSIONS = new Set([".mcpr", ".yaml", ".yml", ".json", ".csv"]);
10
+ export async function startWorkspace(options = {}) {
11
+ const root = await realpath(resolve(options.root ?? process.cwd()));
12
+ const host = options.host ?? "127.0.0.1";
13
+ if (!["127.0.0.1", "localhost", "::1"].includes(host))
14
+ throw new Error("MCP-WEB-001 QA workspace binds only to loopback addresses");
15
+ const csrf = randomBytes(32).toString("base64url");
16
+ const runs = new Map();
17
+ const assets = resolve(dirname(new URL(import.meta.url).pathname), "../workspace-assets");
18
+ const server = createServer(async (req, res) => { securityHeaders(res); try {
19
+ await route(req, res);
20
+ }
21
+ catch (error) {
22
+ json(res, 500, { error: { code: "MCP-WEB-500", message: error instanceof Error ? error.message : String(error) } });
23
+ } });
24
+ async function route(req, res) {
25
+ const url = new URL(req.url ?? "/", `http://${req.headers.host}`);
26
+ const method = req.method ?? "GET";
27
+ if (method !== "GET" && !authorized(req, csrf, `http://${req.headers.host}`))
28
+ return json(res, 403, { error: { code: "MCP-WEB-403", message: "Invalid workspace origin or CSRF token" } });
29
+ if (url.pathname === "/" || url.pathname === "/app.js" || url.pathname === "/style.css")
30
+ return asset(res, join(assets, url.pathname === "/" ? "index.html" : url.pathname.slice(1)));
31
+ if (url.pathname === "/api/v1/bootstrap")
32
+ return json(res, 200, { version: "1.0.0-rc.1", root: basename(root), csrf, capabilities: ["edit", "validate", "test", "parity", "evidence", "snapshots", "contracts"] });
33
+ if (url.pathname === "/api/v1/suites" && method === "GET")
34
+ return json(res, 200, { suites: await suites(root) });
35
+ if (url.pathname === "/api/v1/file" && method === "GET") {
36
+ const path = safePath(root, url.searchParams.get("path") ?? "");
37
+ const text = await limitedRead(path);
38
+ return json(res, 200, { path: relative(root, path), text, etag: etag(text) });
39
+ }
40
+ if (url.pathname === "/api/v1/file" && method === "PUT") {
41
+ const body = await bodyJson(req);
42
+ const path = safePath(root, body.path);
43
+ const current = await readFile(path, "utf8").catch(() => "");
44
+ if (body.etag && body.etag !== etag(current))
45
+ return json(res, 412, { error: { code: "MCP-WEB-412", message: "File changed since it was opened" } });
46
+ if (typeof body.text !== "string" || Buffer.byteLength(body.text) > 1024 * 1024)
47
+ return json(res, 400, { error: { code: "MCP-WEB-400", message: "Text must be under 1 MiB" } });
48
+ await atomicWrite(path, body.text);
49
+ return json(res, 200, { etag: etag(body.text) });
50
+ }
51
+ if (url.pathname === "/api/v1/validate" && method === "POST") {
52
+ const body = await bodyJson(req);
53
+ const path = safePath(root, body.path);
54
+ try {
55
+ const suite = await loadTestFile(path);
56
+ return json(res, 200, { valid: true, suite: { name: suite.name, tests: suite.tests.length, parityTargets: Object.keys(suite.targets ?? {}) } });
57
+ }
58
+ catch (error) {
59
+ return json(res, 200, { valid: false, diagnostics: [{ severity: "error", message: error instanceof Error ? error.message : String(error) }] });
60
+ }
61
+ }
62
+ if (url.pathname === "/api/v1/runs" && method === "POST") {
63
+ const body = await bodyJson(req);
64
+ if (!body || !["test", "parity"].includes(body.mode) || typeof body.path !== "string" || Object.keys(body).some((key) => !["path", "mode"].includes(key)))
65
+ return json(res, 400, { error: { code: "MCP-WEB-400", message: "Run accepts only saved path and test/parity mode" } });
66
+ const path = safePath(root, body.path);
67
+ const id = randomBytes(12).toString("hex");
68
+ const run = { id, suite: relative(root, path), mode: body.mode, status: "running", output: "Starting…" };
69
+ runs.set(id, run);
70
+ void execute(run, path);
71
+ return json(res, 202, { runId: id });
72
+ }
73
+ const runMatch = url.pathname.match(/^\/api\/v1\/runs\/([a-f0-9]+)$/);
74
+ if (runMatch && method === "GET") {
75
+ const run = runs.get(runMatch[1]);
76
+ return run ? json(res, 200, run) : json(res, 404, { error: { code: "MCP-WEB-404", message: "Run not found" } });
77
+ }
78
+ if (url.pathname === "/api/v1/evidence" && method === "GET")
79
+ return json(res, 200, { entries: await directoryEntries(join(root, ".mcprigor")) });
80
+ return json(res, 404, { error: { code: "MCP-WEB-404", message: "Not found" } });
81
+ }
82
+ async function execute(run, path) { try {
83
+ const suite = await loadTestFile(path);
84
+ if (run.mode === "parity") {
85
+ if (!suite.targets)
86
+ throw new Error("This suite has no Compare target declarations");
87
+ const result = await runParity(suite, suite.targets, { cwd: root });
88
+ run.result = result;
89
+ run.output = parityReport(result);
90
+ run.status = result.status;
91
+ }
92
+ else {
93
+ const result = await runSuite(suite, { cwd: root });
94
+ run.result = result;
95
+ run.output = terminalReport(result);
96
+ run.status = result.status;
97
+ }
98
+ }
99
+ catch (error) {
100
+ run.status = "failed";
101
+ run.error = error instanceof Error ? error.message : String(error);
102
+ run.output = run.error;
103
+ } }
104
+ await new Promise((resolveListen, reject) => { server.once("error", reject); server.listen(options.port ?? 0, host, () => resolveListen()); });
105
+ const address = server.address();
106
+ const port = typeof address === "object" && address ? address.port : options.port;
107
+ return { url: `http://${host}:${port}`, close: () => new Promise((resolveClose, reject) => server.close((error) => error ? reject(error) : resolveClose())) };
108
+ }
109
+ async function suites(root) { const files = []; async function walk(dir) { for (const item of await readdir(dir, { withFileTypes: true })) {
110
+ if (["node_modules", ".git", "dist"].includes(item.name))
111
+ continue;
112
+ const full = join(dir, item.name);
113
+ if (item.isDirectory())
114
+ await walk(full);
115
+ else if ([".mcpr", ".yaml", ".yml", ".json"].includes(extname(item.name)))
116
+ files.push(relative(root, full));
117
+ if (files.length >= 200)
118
+ return;
119
+ } } await walk(root); return files.sort().map((path) => ({ path, name: basename(path) })); }
120
+ function safePath(root, input) { if (!input || input.includes("\0") || input.includes("\\") || input.startsWith("/") || /^[A-Za-z]:/.test(input))
121
+ throw new Error("MCP-WEB-002 Invalid workspace path"); const output = resolve(root, input); if (output !== root && !output.startsWith(root + sep))
122
+ throw new Error("MCP-WEB-003 Path leaves workspace"); if (!TEXT_EXTENSIONS.has(extname(output)))
123
+ throw new Error("MCP-WEB-004 Unsupported file type"); return output; }
124
+ async function limitedRead(path) { const info = await stat(path); if (info.size > 1024 * 1024)
125
+ throw new Error("MCP-WEB-005 File exceeds 1 MiB"); return readFile(path, "utf8"); }
126
+ async function atomicWrite(path, text) { await mkdir(dirname(path), { recursive: true }); const temp = `${path}.${randomBytes(6).toString("hex")}.tmp`; await writeFile(temp, text, { mode: 0o600 }); await rename(temp, path); }
127
+ async function directoryEntries(path) { try {
128
+ return (await readdir(path)).slice(0, 200);
129
+ }
130
+ catch {
131
+ return [];
132
+ } }
133
+ function etag(text) { return `sha256:${createHash("sha256").update(text).digest("hex")}`; }
134
+ function authorized(req, token, origin) { const supplied = String(req.headers["x-mcp-csrf"] ?? ""); return req.headers.origin === origin && supplied.length === token.length && timingSafeEqual(Buffer.from(supplied), Buffer.from(token)); }
135
+ async function bodyJson(req) { const chunks = []; let size = 0; for await (const chunk of req) {
136
+ size += chunk.length;
137
+ if (size > 1024 * 1024)
138
+ throw new Error("Request body exceeds 1 MiB");
139
+ chunks.push(chunk);
140
+ } return JSON.parse(Buffer.concat(chunks).toString("utf8")); }
141
+ function securityHeaders(res) { res.setHeader("Content-Security-Policy", "default-src 'self'; script-src 'self'; style-src 'self'; connect-src 'self'; img-src 'self' data:; object-src 'none'; base-uri 'none'; frame-ancestors 'none'"); res.setHeader("X-Content-Type-Options", "nosniff"); res.setHeader("Referrer-Policy", "no-referrer"); res.setHeader("Cache-Control", "no-store"); }
142
+ async function asset(res, path) { const content = await readFile(path); res.statusCode = 200; res.setHeader("Content-Type", extname(path) === ".js" ? "text/javascript; charset=utf-8" : extname(path) === ".css" ? "text/css; charset=utf-8" : "text/html; charset=utf-8"); res.end(content); }
143
+ function json(res, status, value) { res.statusCode = status; res.setHeader("Content-Type", "application/json; charset=utf-8"); res.end(JSON.stringify(value)); }
144
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ # CLI reference
2
+
3
+ Use `npx mcprigor` when installed locally. Examples below use `mcprigor` for brevity.
4
+
5
+ ## Create and author tests
6
+
7
+ ### `init`
8
+
9
+ ```bash
10
+ mcprigor init tests/acceptance.mcpr
11
+ mcprigor init tests/acceptance.mcpr --force
12
+ ```
13
+
14
+ Creates an editable plain-language example. Existing files are protected unless `--force` is supplied.
15
+
16
+ ### `author`
17
+
18
+ ```bash
19
+ mcprigor author server.mcpr --out tests/customer.mcpr
20
+ ```
21
+
22
+ Connects to the target in `server.mcpr` and guides you through creating a test.
23
+
24
+ ## Validate and run
25
+
26
+ ### `check`
27
+
28
+ ```bash
29
+ mcprigor check tests/acceptance.mcpr
30
+ ```
31
+
32
+ Validates language and configuration without connecting to the server. Alias: `validate`.
33
+
34
+ ### `test`
35
+
36
+ ```bash
37
+ mcprigor test tests/acceptance.mcpr
38
+ ```
39
+
40
+ Aliases: `run`, for YAML/JSON compatibility.
41
+
42
+ Common options:
43
+
44
+ ```text
45
+ --test "pattern*" Run matching tests
46
+ --html report.html Write a readable HTML report
47
+ --json result.json Write structured JSON
48
+ --junit result.xml Write JUnit XML
49
+ --evidence DIRECTORY Save a sanitized evidence bundle
50
+ --snapshot FILE Verify semantic snapshots
51
+ --update-snapshots Explicitly create/update snapshots
52
+ --state-in FILE Load persisted successful outputs
53
+ --state-out FILE Save successful exported outputs
54
+ --max-rows NUMBER Limit expanded data rows
55
+ --allow-remote-data Enable REST and Google Sheets data
56
+ --allow-custom-code Enable reviewed isolated extensions
57
+ ```
58
+
59
+ Example CI run:
60
+
61
+ ```bash
62
+ mcprigor test tests/acceptance.mcpr \
63
+ --junit reports/mcp.xml \
64
+ --evidence .mcprigor/ci-run
65
+ ```
66
+
67
+ ## Browser workspace
68
+
69
+ ```bash
70
+ mcprigor workspace
71
+ mcprigor workspace ./acceptance-tests
72
+ mcprigor workspace ./acceptance-tests --port 4173
73
+ ```
74
+
75
+ Starts a loopback-only QA interface. Alias: `web`.
76
+
77
+ ## Transport parity
78
+
79
+ ```bash
80
+ mcprigor parity tests/parity.mcpr
81
+ mcprigor parity tests/parity.mcpr --markdown
82
+ mcprigor parity tests/parity.mcpr --markdown --out parity.md
83
+ ```
84
+
85
+ The suite must contain at least two `Compare target` declarations.
86
+
87
+ ## Discovery and contracts
88
+
89
+ ### Discover
90
+
91
+ ```bash
92
+ mcprigor discover server.mcpr --out mcp.lock.yaml
93
+ ```
94
+
95
+ Saves the server identity, capabilities, tools, resources, prompts, and fingerprint.
96
+
97
+ ### Generate contract tests
98
+
99
+ ```bash
100
+ mcprigor generate mcp.lock.yaml --target server.mcpr --out generated.yaml
101
+ ```
102
+
103
+ ### Check drift
104
+
105
+ ```bash
106
+ mcprigor contract-check mcp.lock.yaml --target server.mcpr
107
+ mcprigor contract-check mcp.lock.yaml --target server.mcpr --markdown --out drift.md
108
+ ```
109
+
110
+ Returns `1` when breaking drift exists.
111
+
112
+ ### Compare locks
113
+
114
+ ```bash
115
+ mcprigor contract-diff old.lock.yaml new.lock.yaml
116
+ mcprigor contract-diff old.lock.yaml new.lock.yaml --markdown
117
+ ```
118
+
119
+ ### Update a lock
120
+
121
+ ```bash
122
+ mcprigor contract-update mcp.lock.yaml --target server.mcpr
123
+ ```
124
+
125
+ Review the printed changes before committing the updated lock.
126
+
127
+ ## Evidence
128
+
129
+ ```bash
130
+ mcprigor evidence-show .mcprigor/run-001
131
+ mcprigor evidence-compare .mcprigor/run-001 .mcprigor/run-002
132
+ ```
133
+
134
+ ## Snapshots and replay
135
+
136
+ ```bash
137
+ mcprigor snapshot-diff old.json new.json
138
+ ```
139
+
140
+ ```bash
141
+ mcprigor replay .mcprigor/run-001/trace.normalized.jsonl \
142
+ --target server.mcpr
143
+ ```
144
+
145
+ Tool calls are denied during replay unless explicitly approved:
146
+
147
+ ```bash
148
+ mcprigor replay trace.normalized.jsonl \
149
+ --target server.mcpr \
150
+ --allow-tool find_customer
151
+ ```
152
+
153
+ `--allow-tool` may be repeated.
154
+
155
+ ## Exit codes
156
+
157
+ | Code | Meaning |
158
+ |---:|---|
159
+ | `0` | Success |
160
+ | `1` | Test, snapshot, parity, replay, or breaking-drift failure |
161
+ | `2` | Invalid usage, language, or configuration |
162
+ | `3` | Server, transport, extension, or internal failure |
163
+ | `130` | Interrupted by the user |
164
+
165
+ ## Safety flags
166
+
167
+ `--allow-remote-data` and `--allow-custom-code` are intentionally explicit. Do not add them automatically in shared scripts. Review the source and required permissions first.
@@ -0,0 +1,42 @@
1
+ # Compatibility Policy
2
+
3
+ ## Required release matrix
4
+
5
+ | Axis | Supported |
6
+ |---|---|
7
+ | Node.js | 20, 22 |
8
+ | Operating systems | Linux, macOS, Windows |
9
+ | MCP revisions | `2024-11-05`, `2025-03-26`, `2025-06-18` |
10
+ | Transports | stdio, Streamable HTTP |
11
+ | Fixtures | known-good server and intentionally broken startup servers |
12
+
13
+ Pull requests run the full test suite on Node 20/22 across Ubuntu, macOS, and Windows. A dedicated Linux compatibility job runs each advertised protocol revision against both transport models. Security and lifecycle fixtures run separately and production dependencies are audited.
14
+
15
+ The protocol matrix verifies gating, capability handling, and normalized runtime behavior. Real transport integration is covered by the known-good stdio fixture and existing Streamable HTTP SDK tests; parity behavior is tested independently.
16
+
17
+ ## Broken fixture coverage
18
+
19
+ - missing executable;
20
+ - process exits before initialization;
21
+ - initialization timeout/error classification;
22
+ - idempotent cleanup and parallel session registry;
23
+ - invalid/hostile YAML and CSV;
24
+ - remote private-network URLs;
25
+ - encoded credentials and terminal control sequences.
26
+
27
+ ## Third-party servers
28
+
29
+ Third-party compatibility should be pinned and reproducible, never a required CI dependency on a live public endpoint. Recommended release candidates:
30
+
31
+ 1. Pin a tagged server revision in a container or fixture lock.
32
+ 2. Run discovery, generated contract smoke tests, one domain scenario, and shutdown.
33
+ 3. Record the server name/version, SDK version, transport, protocol revision, and expected fingerprint.
34
+ 4. Keep “latest” dependency/server jobs advisory until triaged; supported pinned failures block release.
35
+
36
+ No third-party server is currently claimed as certified. Compatibility results demonstrate tested behavior only.
37
+
38
+ ## Process lifecycle guarantees
39
+
40
+ MCP Rigor tracks active sessions, installs SIGINT/SIGTERM cleanup in the CLI, closes clients/transports on initialization errors, and makes global shutdown idempotent. The pinned SDK escalates direct stdio children from stdin close to TERM and KILL.
41
+
42
+ Strict grandchild containment is platform-specific: POSIX process groups and Windows Job Objects are the desired final guarantee. The current SDK owns the direct child, so servers that spawn descendants must also implement responsible descendant shutdown. Release tests should continue to treat surviving descendants as a blocker.