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.
- package/LICENSE +17 -0
- package/README.md +233 -0
- package/dist/assertions.d.ts +4 -0
- package/dist/assertions.d.ts.map +1 -0
- package/dist/assertions.js +101 -0
- package/dist/assertions.js.map +1 -0
- package/dist/author.d.ts +57 -0
- package/dist/author.d.ts.map +1 -0
- package/dist/author.js +134 -0
- package/dist/author.js.map +1 -0
- package/dist/canonical.d.ts +4 -0
- package/dist/canonical.d.ts.map +1 -0
- package/dist/canonical.js +17 -0
- package/dist/canonical.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +265 -0
- package/dist/cli.js.map +1 -0
- package/dist/contract.d.ts +28 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +138 -0
- package/dist/contract.js.map +1 -0
- package/dist/data.d.ts +24 -0
- package/dist/data.d.ts.map +1 -0
- package/dist/data.js +367 -0
- package/dist/data.js.map +1 -0
- package/dist/discovery.d.ts +6 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +82 -0
- package/dist/discovery.js.map +1 -0
- package/dist/errors.d.ts +19 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +40 -0
- package/dist/errors.js.map +1 -0
- package/dist/extension-host.d.ts +20 -0
- package/dist/extension-host.d.ts.map +1 -0
- package/dist/extension-host.js +52 -0
- package/dist/extension-host.js.map +1 -0
- package/dist/extension-sdk.d.ts +22 -0
- package/dist/extension-sdk.d.ts.map +1 -0
- package/dist/extension-sdk.js +3 -0
- package/dist/extension-sdk.js.map +1 -0
- package/dist/extension-worker.d.ts +2 -0
- package/dist/extension-worker.d.ts.map +1 -0
- package/dist/extension-worker.js +27 -0
- package/dist/extension-worker.js.map +1 -0
- package/dist/extensions.d.ts +15 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +60 -0
- package/dist/extensions.js.map +1 -0
- package/dist/imports.d.ts +7 -0
- package/dist/imports.d.ts.map +1 -0
- package/dist/imports.js +41 -0
- package/dist/imports.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/language.d.ts +34 -0
- package/dist/language.d.ts.map +1 -0
- package/dist/language.js +102 -0
- package/dist/language.js.map +1 -0
- package/dist/loader.d.ts +4 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +51 -0
- package/dist/loader.js.map +1 -0
- package/dist/parity.d.ts +23 -0
- package/dist/parity.d.ts.map +1 -0
- package/dist/parity.js +77 -0
- package/dist/parity.js.map +1 -0
- package/dist/path.d.ts +3 -0
- package/dist/path.d.ts.map +1 -0
- package/dist/path.js +71 -0
- package/dist/path.js.map +1 -0
- package/dist/qa-advanced.d.ts +8 -0
- package/dist/qa-advanced.d.ts.map +1 -0
- package/dist/qa-advanced.js +239 -0
- package/dist/qa-advanced.js.map +1 -0
- package/dist/qa-language.d.ts +4 -0
- package/dist/qa-language.d.ts.map +1 -0
- package/dist/qa-language.js +385 -0
- package/dist/qa-language.js.map +1 -0
- package/dist/qa-loader.d.ts +4 -0
- package/dist/qa-loader.d.ts.map +1 -0
- package/dist/qa-loader.js +22 -0
- package/dist/qa-loader.js.map +1 -0
- package/dist/redact.d.ts +7 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +63 -0
- package/dist/redact.js.map +1 -0
- package/dist/replay.d.ts +17 -0
- package/dist/replay.d.ts.map +1 -0
- package/dist/replay.js +48 -0
- package/dist/replay.js.map +1 -0
- package/dist/reporters.d.ts +6 -0
- package/dist/reporters.d.ts.map +1 -0
- package/dist/reporters.js +52 -0
- package/dist/reporters.js.map +1 -0
- package/dist/runner.d.ts +16 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +304 -0
- package/dist/runner.js.map +1 -0
- package/dist/schema.d.ts +446 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +117 -0
- package/dist/schema.js.map +1 -0
- package/dist/session.d.ts +5 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +111 -0
- package/dist/session.js.map +1 -0
- package/dist/snapshots.d.ts +28 -0
- package/dist/snapshots.d.ts.map +1 -0
- package/dist/snapshots.js +87 -0
- package/dist/snapshots.js.map +1 -0
- package/dist/starter.d.ts +3 -0
- package/dist/starter.d.ts.map +1 -0
- package/dist/starter.js +34 -0
- package/dist/starter.js.map +1 -0
- package/dist/state.d.ts +13 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +29 -0
- package/dist/state.js.map +1 -0
- package/dist/trace.d.ts +57 -0
- package/dist/trace.d.ts.map +1 -0
- package/dist/trace.js +94 -0
- package/dist/trace.js.map +1 -0
- package/dist/types.d.ts +245 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/workspace.d.ts +10 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +144 -0
- package/dist/workspace.js.map +1 -0
- package/docs/CLI-REFERENCE.md +167 -0
- package/docs/COMPATIBILITY.md +42 -0
- package/docs/CONTRACT-DRIFT.md +42 -0
- package/docs/DATA-AND-REUSE.md +213 -0
- package/docs/DATA-ENGINEERING.md +96 -0
- package/docs/ENGINEER-SETUP.md +176 -0
- package/docs/ERROR-MODEL.md +24 -0
- package/docs/EVIDENCE.md +58 -0
- package/docs/EXTENSION-SDK.md +76 -0
- package/docs/FILE-EXTENSION.md +52 -0
- package/docs/GETTING-STARTED.md +126 -0
- package/docs/GUIDED-AUTHORING.md +80 -0
- package/docs/LANDSCAPE.md +81 -0
- package/docs/LANGUAGE-SPEC.md +317 -0
- package/docs/MCP-NATIVE.md +111 -0
- package/docs/PLAIN-LANGUAGE-COOKBOOK.md +219 -0
- package/docs/QA-GUIDE.md +128 -0
- package/docs/QA-WORKSPACE.md +78 -0
- package/docs/README.md +55 -0
- package/docs/SECURITY-AND-RETENTION.md +37 -0
- package/docs/SNAPSHOTS-AND-REPLAY.md +85 -0
- package/docs/SPECIFICATION.md +178 -0
- package/docs/STATE-AND-DEPENDENCIES.md +106 -0
- package/docs/TRANSPORT-PARITY.md +98 -0
- package/docs/TROUBLESHOOTING.md +199 -0
- package/editors/mcpr-language.json +16 -0
- package/package.json +70 -0
- package/workspace-assets/app.js +1 -0
- package/workspace-assets/index.html +1 -0
- package/workspace-assets/style.css +1 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
import YAML from "yaml";
|
|
5
|
+
import { authorTest, createReadlinePromptAdapter } from "./author.js";
|
|
6
|
+
import { checkContract, compareContracts, contractMarkdown, contractReport, readContract, updateContract } from "./contract.js";
|
|
7
|
+
import { discoverTarget, generateSuite, writeGeneratedSuite, writeLock } from "./discovery.js";
|
|
8
|
+
import { loadTestFile } from "./qa-loader.js";
|
|
9
|
+
import { parityMarkdown, parityReport, runParity } from "./parity.js";
|
|
10
|
+
import { terminalReport, writeHtmlReport, writeJsonReport, writeJunitReport } from "./reporters.js";
|
|
11
|
+
import { runSuite } from "./runner.js";
|
|
12
|
+
import { replayReport, replayTrace } from "./replay.js";
|
|
13
|
+
import { readState, writeState } from "./state.js";
|
|
14
|
+
import { compareEvidence, showEvidence, TraceRecorder, writeEvidenceBundle } from "./trace.js";
|
|
15
|
+
import { collectTargetSecrets, createRedactor } from "./redact.js";
|
|
16
|
+
import { writeStarter } from "./starter.js";
|
|
17
|
+
import { startWorkspace } from "./workspace.js";
|
|
18
|
+
import { installSignalCleanup } from "./session.js";
|
|
19
|
+
import { formatFailure } from "./errors.js";
|
|
20
|
+
const removeSignalCleanup = installSignalCleanup();
|
|
21
|
+
async function main() {
|
|
22
|
+
const [command, file, ...flags] = process.argv.slice(2);
|
|
23
|
+
if (!command || command === "--help" || command === "-h")
|
|
24
|
+
return help();
|
|
25
|
+
if (command === "workspace" || command === "web") {
|
|
26
|
+
const workspace = await startWorkspace({ root: file && !file.startsWith("--") ? file : process.cwd(), port: numericFlag([file ?? "", ...flags], "--port") });
|
|
27
|
+
console.log(`MCP Rigor QA Workspace\n${workspace.url}\n\nPress Ctrl+C to stop.`);
|
|
28
|
+
return new Promise(() => { });
|
|
29
|
+
}
|
|
30
|
+
const compileOptions = { allowRemoteData: flags.includes("--allow-remote-data"), allowCustomCode: flags.includes("--allow-custom-code"), maxRows: numericFlag(flags, "--max-rows") };
|
|
31
|
+
if (command === "snapshot-diff") {
|
|
32
|
+
if (!file || !flags[0])
|
|
33
|
+
throw new UsageError("snapshot-diff requires two JSON files");
|
|
34
|
+
const { semanticDiff, renderSemanticDiff } = await import("./snapshots.js");
|
|
35
|
+
const changes = semanticDiff(JSON.parse(await readFile(file, "utf8")), JSON.parse(await readFile(flags[0], "utf8")));
|
|
36
|
+
console.log(changes.length ? renderSemanticDiff(changes) : "Snapshots are semantically identical.");
|
|
37
|
+
process.exitCode = changes.length ? 1 : 0;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (command === "evidence-show") {
|
|
41
|
+
if (!file)
|
|
42
|
+
throw new UsageError("evidence-show requires a bundle directory");
|
|
43
|
+
console.log(await showEvidence(file));
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
if (command === "evidence-compare") {
|
|
47
|
+
if (!file)
|
|
48
|
+
throw new UsageError("evidence-compare requires two bundle directories");
|
|
49
|
+
const second = flags[0];
|
|
50
|
+
if (!second)
|
|
51
|
+
throw new UsageError("evidence-compare requires two bundle directories");
|
|
52
|
+
console.log(await compareEvidence(file, second));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (command === "replay") {
|
|
56
|
+
if (!file)
|
|
57
|
+
throw new UsageError("replay requires a trace JSONL file");
|
|
58
|
+
const targetFile = requiredFlag(flags, "--target");
|
|
59
|
+
const suite = await loadTestFile(resolve(targetFile), compileOptions);
|
|
60
|
+
const result = await replayTrace(resolve(file), suite.target, { allowTools: repeatedFlag(flags, "--allow-tool"), timeoutMs: numericFlag(flags, "--timeout") });
|
|
61
|
+
console.log(replayReport(result));
|
|
62
|
+
process.exitCode = result.status === "passed" ? 0 : 1;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
if (command === "contract-diff") {
|
|
66
|
+
if (!file || !flags[0])
|
|
67
|
+
throw new UsageError("contract-diff requires OLD and NEW lock files");
|
|
68
|
+
const diff = compareContracts(await readContract(file), await readContract(flags[0]));
|
|
69
|
+
console.log(flags.includes("--markdown") ? contractMarkdown(diff) : contractReport(diff));
|
|
70
|
+
process.exitCode = diff.breaking ? 1 : 0;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (command === "init") {
|
|
74
|
+
const output = file ?? "my-mcp-tests.mcpr";
|
|
75
|
+
await writeStarter(output, flags.includes("--force"));
|
|
76
|
+
console.log(`✓ Created ${output}\n\nNext:\n 1. Open the file and set your server command or URL.\n 2. Change the example tool and expected result.\n 3. Run: mcprigor test ${output}`);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (!file)
|
|
80
|
+
throw new UsageError(`The ${command} command requires a test file`);
|
|
81
|
+
if (command === "author" || command === "create") {
|
|
82
|
+
const targetSuite = await loadTestFile(resolve(file), compileOptions);
|
|
83
|
+
const output = flag(flags, "--out") ?? "authored-test.mcpr";
|
|
84
|
+
const prompts = createReadlinePromptAdapter();
|
|
85
|
+
try {
|
|
86
|
+
await authorTest(targetSuite.target, prompts, output);
|
|
87
|
+
console.log(`\n✓ Created ${output}\nRun it with: mcprigor test ${output}`);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await prompts.close();
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (command === "parity") {
|
|
95
|
+
const suite = await loadTestFile(resolve(file), compileOptions);
|
|
96
|
+
if (!suite.targets)
|
|
97
|
+
throw new UsageError("parity requires at least two named targets in the suite's targets section");
|
|
98
|
+
const result = await runParity(suite, suite.targets, { allowCustomCode: compileOptions.allowCustomCode, cwd: process.cwd() });
|
|
99
|
+
const report = flags.includes("--markdown") ? parityMarkdown(result) : parityReport(result);
|
|
100
|
+
const out = flag(flags, "--out");
|
|
101
|
+
if (out)
|
|
102
|
+
await writeFile(out, report, "utf8");
|
|
103
|
+
else
|
|
104
|
+
console.log(report);
|
|
105
|
+
process.exitCode = result.status === "passed" ? 0 : 1;
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
if (command === "validate" || command === "check") {
|
|
109
|
+
await loadTestFile(resolve(file), compileOptions);
|
|
110
|
+
console.log(`✓ ${file} looks good and is ready to run`);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (command === "contract-check") {
|
|
114
|
+
const suite = await loadTestFile(resolve(requiredFlag(flags, "--target")), compileOptions);
|
|
115
|
+
const checked = await checkContract(resolve(file), suite.target);
|
|
116
|
+
const report = flags.includes("--markdown") ? contractMarkdown(checked.diff) : contractReport(checked.diff);
|
|
117
|
+
const out = flag(flags, "--out");
|
|
118
|
+
if (out)
|
|
119
|
+
await writeFile(out, report + "\n", "utf8");
|
|
120
|
+
else
|
|
121
|
+
console.log(report);
|
|
122
|
+
process.exitCode = checked.diff.breaking ? 1 : 0;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
if (command === "contract-update") {
|
|
126
|
+
const suite = await loadTestFile(resolve(requiredFlag(flags, "--target")), compileOptions);
|
|
127
|
+
const diff = await updateContract(resolve(file), suite.target);
|
|
128
|
+
console.log(contractReport(diff));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
if (command === "discover") {
|
|
132
|
+
const suite = await loadTestFile(resolve(file), compileOptions);
|
|
133
|
+
const output = flag(flags, "--out") ?? "mcp.lock.yaml";
|
|
134
|
+
const lock = await discoverTarget(suite.target);
|
|
135
|
+
await writeLock(lock, output);
|
|
136
|
+
console.log(`✓ Found ${lock.tools.length} tools, ${lock.resources.length} resources, and ${lock.prompts.length} prompts`);
|
|
137
|
+
console.log(` Saved the server contract to ${output}`);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
if (command === "generate") {
|
|
141
|
+
const lock = YAML.parse(await readFile(resolve(file), "utf8"));
|
|
142
|
+
const targetFile = requiredFlag(flags, "--target");
|
|
143
|
+
const target = (await loadTestFile(resolve(targetFile))).target;
|
|
144
|
+
const output = flag(flags, "--out") ?? "mcp.generated.yaml";
|
|
145
|
+
await writeGeneratedSuite(generateSuite(lock, target), output);
|
|
146
|
+
console.log(`✓ Created ready-to-run contract tests in ${output}`);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (command !== "run" && command !== "test")
|
|
150
|
+
throw new UsageError(`Unknown command: ${command}. Try: mcprigor --help`);
|
|
151
|
+
const suite = await loadTestFile(resolve(file), compileOptions);
|
|
152
|
+
const filter = flag(flags, "--test");
|
|
153
|
+
const stateIn = flag(flags, "--state-in");
|
|
154
|
+
const loadedState = stateIn ? await readState(resolve(stateIn), suite.target, flags.includes("--allow-state-target-mismatch")) : undefined;
|
|
155
|
+
const evidenceDirectory = flag(flags, "--evidence");
|
|
156
|
+
const trace = evidenceDirectory ? new TraceRecorder(createRedactor([...(suite.redact ?? []), ...collectTargetSecrets(suite.target)])) : undefined;
|
|
157
|
+
const snapshotFile = flag(flags, "--snapshot");
|
|
158
|
+
if (flags.includes("--update-snapshots") && !snapshotFile && !suite.snapshots?.file)
|
|
159
|
+
throw new UsageError("--update-snapshots requires --snapshot FILE or suite snapshot configuration");
|
|
160
|
+
const result = await runSuite(suite, { ...(filter ? { filter } : {}), allowCustomCode: compileOptions.allowCustomCode, cwd: process.cwd(), state: loadedState?.outputs, trace, snapshotFile, updateSnapshots: flags.includes("--update-snapshots") });
|
|
161
|
+
console.log(terminalReport(result));
|
|
162
|
+
const json = flag(flags, "--json");
|
|
163
|
+
const junit = flag(flags, "--junit");
|
|
164
|
+
const html = flag(flags, "--html");
|
|
165
|
+
if (json)
|
|
166
|
+
await writeJsonReport(result, json);
|
|
167
|
+
if (junit)
|
|
168
|
+
await writeJunitReport(result, junit);
|
|
169
|
+
if (html) {
|
|
170
|
+
await writeHtmlReport(result, html);
|
|
171
|
+
console.log(`\nReadable report: ${html}`);
|
|
172
|
+
}
|
|
173
|
+
if (evidenceDirectory && trace) {
|
|
174
|
+
const manifest = await writeEvidenceBundle(evidenceDirectory, result, suite.target, trace);
|
|
175
|
+
console.log(`\nEvidence bundle: ${evidenceDirectory}\nNormalized trace: ${manifest.normalizedTraceHash}`);
|
|
176
|
+
}
|
|
177
|
+
const stateOut = flag(flags, "--state-out");
|
|
178
|
+
if (stateOut && result.status === "passed") {
|
|
179
|
+
await writeState(resolve(stateOut), suite.target, suite, result.outputs);
|
|
180
|
+
console.log(`\nSaved reusable outputs: ${stateOut}`);
|
|
181
|
+
}
|
|
182
|
+
else if (stateOut)
|
|
183
|
+
console.log("\nState was not saved because the run did not pass.");
|
|
184
|
+
process.exitCode = result.status === "passed" ? 0 : 1;
|
|
185
|
+
}
|
|
186
|
+
function flag(args, name) {
|
|
187
|
+
const index = args.indexOf(name);
|
|
188
|
+
return index >= 0 ? args[index + 1] : undefined;
|
|
189
|
+
}
|
|
190
|
+
function repeatedFlag(args, name) { return args.flatMap((value, index) => value === name && args[index + 1] ? [args[index + 1]] : []); }
|
|
191
|
+
function numericFlag(args, name) {
|
|
192
|
+
const value = flag(args, name);
|
|
193
|
+
if (value === undefined)
|
|
194
|
+
return undefined;
|
|
195
|
+
const parsed = Number(value);
|
|
196
|
+
if (!Number.isSafeInteger(parsed) || parsed < 1)
|
|
197
|
+
throw new UsageError(`${name} must be a positive whole number`);
|
|
198
|
+
return parsed;
|
|
199
|
+
}
|
|
200
|
+
function requiredFlag(args, name) {
|
|
201
|
+
const value = flag(args, name);
|
|
202
|
+
if (!value)
|
|
203
|
+
throw new UsageError(`${name} is required`);
|
|
204
|
+
return value;
|
|
205
|
+
}
|
|
206
|
+
function help() {
|
|
207
|
+
console.log(`MCP Rigor — acceptance testing for everyone
|
|
208
|
+
|
|
209
|
+
Start here:
|
|
210
|
+
mcprigor workspace [DIRECTORY] [--port 4173]
|
|
211
|
+
Open the local QA web workspace
|
|
212
|
+
mcprigor init my-tests.mcpr Create an editable example
|
|
213
|
+
mcprigor check my-tests.mcpr Check the wording before running
|
|
214
|
+
mcprigor test my-tests.mcpr Run the tests
|
|
215
|
+
mcprigor test my-tests.mcpr --html report.html
|
|
216
|
+
mcprigor author server.mcpr --out new-test.mcpr
|
|
217
|
+
Guided no-code test creation
|
|
218
|
+
|
|
219
|
+
Transport parity:
|
|
220
|
+
mcprigor parity suite.mcpr [--markdown] [--out parity.md]
|
|
221
|
+
In .mcpr: Compare target "Local": node server.js
|
|
222
|
+
Compare target "QA": https://qa.example.com/mcp
|
|
223
|
+
|
|
224
|
+
Data engineering:
|
|
225
|
+
Typed columns, validation, filters, derived values, joins, deterministic samples
|
|
226
|
+
--max-rows 1000 Limit expanded data rows
|
|
227
|
+
--allow-remote-data Allow REST and Google Sheets
|
|
228
|
+
--allow-custom-code Allow reviewed function/provider modules
|
|
229
|
+
|
|
230
|
+
Cross-test and cross-run state:
|
|
231
|
+
--state-in state.json Load read-only values as \${state.name}
|
|
232
|
+
--state-out state.json Save successful exported outputs
|
|
233
|
+
--allow-state-target-mismatch Accept reviewed state from another target
|
|
234
|
+
|
|
235
|
+
Contract drift:
|
|
236
|
+
mcprigor contract-check mcp.lock.yaml --target server.mcpr [--markdown]
|
|
237
|
+
mcprigor contract-diff old.lock.yaml new.lock.yaml [--markdown]
|
|
238
|
+
mcprigor contract-update mcp.lock.yaml --target server.mcpr
|
|
239
|
+
|
|
240
|
+
Snapshots and replay:
|
|
241
|
+
mcprigor test tests.mcpr --snapshot expected.snap.json
|
|
242
|
+
mcprigor test tests.mcpr --snapshot expected.snap.json --update-snapshots
|
|
243
|
+
mcprigor snapshot-diff OLD.json NEW.json
|
|
244
|
+
mcprigor replay trace.normalized.jsonl --target server.mcpr [--allow-tool NAME]
|
|
245
|
+
|
|
246
|
+
Evidence:
|
|
247
|
+
mcprigor test tests.mcpr --evidence .mcprigor/run-1
|
|
248
|
+
mcprigor evidence-show .mcprigor/run-1
|
|
249
|
+
mcprigor evidence-compare RUN-A RUN-B
|
|
250
|
+
|
|
251
|
+
Advanced:
|
|
252
|
+
mcprigor discover <test-file> [--out mcp.lock.yaml]
|
|
253
|
+
mcprigor generate <lock-file> --target <test-file>
|
|
254
|
+
mcprigor run <yaml-or-json> [--json result.json] [--junit result.xml]
|
|
255
|
+
|
|
256
|
+
Test files can use friendly .mcpr language or YAML/JSON. No AI or coding is required.`);
|
|
257
|
+
}
|
|
258
|
+
class UsageError extends Error {
|
|
259
|
+
}
|
|
260
|
+
main().catch((error) => {
|
|
261
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
262
|
+
console.error(`\nMCP Rigor could not continue\n${formatFailure(error)}\n\nTip: run 'mcprigor check <your-file>' to check the test wording.`);
|
|
263
|
+
process.exitCode = error instanceof UsageError || /MCP-CONFIG|QA-LANG|QA-INIT|required/.test(message) ? 2 : 3;
|
|
264
|
+
}).finally(() => removeSignalCleanup());
|
|
265
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { DiscoveryDocument, Target } from "./types.js";
|
|
2
|
+
export type DriftSeverity = "breaking" | "potentially-breaking" | "non-breaking";
|
|
3
|
+
export interface ContractChange {
|
|
4
|
+
severity: DriftSeverity;
|
|
5
|
+
code: string;
|
|
6
|
+
path: string;
|
|
7
|
+
message: string;
|
|
8
|
+
before?: unknown;
|
|
9
|
+
after?: unknown;
|
|
10
|
+
}
|
|
11
|
+
export interface ContractDiff {
|
|
12
|
+
status: "unchanged" | "changed";
|
|
13
|
+
breaking: number;
|
|
14
|
+
potentiallyBreaking: number;
|
|
15
|
+
nonBreaking: number;
|
|
16
|
+
changes: ContractChange[];
|
|
17
|
+
}
|
|
18
|
+
export declare function compareContracts(before: DiscoveryDocument, after: DiscoveryDocument): ContractDiff;
|
|
19
|
+
export declare function checkContract(lockFile: string, target: Target): Promise<{
|
|
20
|
+
lock: DiscoveryDocument;
|
|
21
|
+
current: DiscoveryDocument;
|
|
22
|
+
diff: ContractDiff;
|
|
23
|
+
}>;
|
|
24
|
+
export declare function updateContract(lockFile: string, target: Target): Promise<ContractDiff>;
|
|
25
|
+
export declare function readContract(file: string): Promise<DiscoveryDocument>;
|
|
26
|
+
export declare function contractReport(diff: ContractDiff): string;
|
|
27
|
+
export declare function contractMarkdown(diff: ContractDiff): string;
|
|
28
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAG5D,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,sBAAsB,GAAG,cAAc,CAAC;AACjF,MAAM,WAAW,cAAc;IAAG,QAAQ,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE;AAC3I,MAAM,WAAW,YAAY;IAAG,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,mBAAmB,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE;AAEhK,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,EAAE,iBAAiB,GAAG,YAAY,CAUlG;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAC;IAAC,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC,CAG1J;AACD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAE5F;AACD,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAE3E;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CASzD;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAG3D"}
|
package/dist/contract.js
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import YAML from "yaml";
|
|
3
|
+
import { discoverTarget, writeLock } from "./discovery.js";
|
|
4
|
+
export function compareContracts(before, after) {
|
|
5
|
+
const changes = [];
|
|
6
|
+
if (before.protocolVersion !== after.protocolVersion)
|
|
7
|
+
changes.push(change("potentially-breaking", "MCP-DRIFT-001", "protocolVersion", `Protocol version changed from ${before.protocolVersion ?? "unknown"} to ${after.protocolVersion ?? "unknown"}`, before.protocolVersion, after.protocolVersion));
|
|
8
|
+
diffCapabilities(before.server.capabilities, after.server.capabilities, changes);
|
|
9
|
+
diffNamed("tool", before.tools, after.tools, "name", changes);
|
|
10
|
+
diffNamed("resource", before.resources, after.resources, "uri", changes);
|
|
11
|
+
diffNamed("resource template", before.resourceTemplates, after.resourceTemplates, "uriTemplate", changes);
|
|
12
|
+
diffNamed("prompt", before.prompts, after.prompts, "name", changes);
|
|
13
|
+
changes.sort((a, b) => rank(a.severity) - rank(b.severity) || a.path.localeCompare(b.path) || a.code.localeCompare(b.code));
|
|
14
|
+
return { status: changes.length ? "changed" : "unchanged", breaking: changes.filter((x) => x.severity === "breaking").length, potentiallyBreaking: changes.filter((x) => x.severity === "potentially-breaking").length, nonBreaking: changes.filter((x) => x.severity === "non-breaking").length, changes };
|
|
15
|
+
}
|
|
16
|
+
export async function checkContract(lockFile, target) {
|
|
17
|
+
const lock = await readContract(lockFile);
|
|
18
|
+
const current = await discoverTarget(target);
|
|
19
|
+
return { lock, current, diff: compareContracts(lock, current) };
|
|
20
|
+
}
|
|
21
|
+
export async function updateContract(lockFile, target) {
|
|
22
|
+
const previous = await readContract(lockFile);
|
|
23
|
+
const current = await discoverTarget(target);
|
|
24
|
+
const diff = compareContracts(previous, current);
|
|
25
|
+
await writeLock(current, lockFile);
|
|
26
|
+
return diff;
|
|
27
|
+
}
|
|
28
|
+
export async function readContract(file) {
|
|
29
|
+
const source = await readFile(file, "utf8");
|
|
30
|
+
return (file.endsWith(".json") ? JSON.parse(source) : YAML.parse(source));
|
|
31
|
+
}
|
|
32
|
+
export function contractReport(diff) {
|
|
33
|
+
if (!diff.changes.length)
|
|
34
|
+
return "No MCP contract changes detected.";
|
|
35
|
+
const lines = [`${diff.breaking} breaking, ${diff.potentiallyBreaking} potentially breaking, ${diff.nonBreaking} non-breaking changes`];
|
|
36
|
+
for (const severity of ["breaking", "potentially-breaking", "non-breaking"]) {
|
|
37
|
+
const group = diff.changes.filter((item) => item.severity === severity);
|
|
38
|
+
if (!group.length)
|
|
39
|
+
continue;
|
|
40
|
+
lines.push("", severity === "breaking" ? "Breaking" : severity === "potentially-breaking" ? "Potentially breaking" : "Non-breaking");
|
|
41
|
+
for (const item of group)
|
|
42
|
+
lines.push(`${severity === "breaking" ? "✗" : severity === "potentially-breaking" ? "!" : "✓"} ${item.message} [${item.code}]`);
|
|
43
|
+
}
|
|
44
|
+
return lines.join("\n");
|
|
45
|
+
}
|
|
46
|
+
export function contractMarkdown(diff) {
|
|
47
|
+
const icon = (severity) => severity === "breaking" ? "❌" : severity === "potentially-breaking" ? "⚠️" : "✅";
|
|
48
|
+
return [`# MCP Contract Drift`, "", `**${diff.breaking} breaking · ${diff.potentiallyBreaking} potentially breaking · ${diff.nonBreaking} non-breaking**`, "", ...diff.changes.map((item) => `- ${icon(item.severity)} **${item.code}** — ${item.message} \`${item.path}\``), ""].join("\n");
|
|
49
|
+
}
|
|
50
|
+
function diffCapabilities(before, after, changes) {
|
|
51
|
+
const oldKeys = keys(before);
|
|
52
|
+
const newKeys = keys(after);
|
|
53
|
+
for (const key of oldKeys)
|
|
54
|
+
if (!newKeys.has(key))
|
|
55
|
+
changes.push(change("breaking", "MCP-DRIFT-010", `capabilities.${key}`, `Capability “${key}” was removed`));
|
|
56
|
+
for (const key of newKeys)
|
|
57
|
+
if (!oldKeys.has(key))
|
|
58
|
+
changes.push(change("non-breaking", "MCP-DRIFT-011", `capabilities.${key}`, `Capability “${key}” was added`));
|
|
59
|
+
}
|
|
60
|
+
function diffNamed(kind, before, after, key, changes) {
|
|
61
|
+
const oldMap = index(before, key);
|
|
62
|
+
const newMap = index(after, key);
|
|
63
|
+
for (const [name] of oldMap)
|
|
64
|
+
if (!newMap.has(name))
|
|
65
|
+
changes.push(change("breaking", "MCP-DRIFT-100", `${kind}.${name}`, `${capitalize(kind)} “${name}” was removed`));
|
|
66
|
+
for (const [name] of newMap)
|
|
67
|
+
if (!oldMap.has(name))
|
|
68
|
+
changes.push(change("non-breaking", "MCP-DRIFT-101", `${kind}.${name}`, `${capitalize(kind)} “${name}” was added`));
|
|
69
|
+
for (const [name, oldItem] of oldMap) {
|
|
70
|
+
const next = newMap.get(name);
|
|
71
|
+
if (!next)
|
|
72
|
+
continue;
|
|
73
|
+
if (kind === "tool")
|
|
74
|
+
diffSchema(oldItem.inputSchema, next.inputSchema, `tools.${name}.inputSchema`, changes);
|
|
75
|
+
if (kind === "tool")
|
|
76
|
+
diffSchema(oldItem.outputSchema, next.outputSchema, `tools.${name}.outputSchema`, changes, true);
|
|
77
|
+
if (kind === "prompt")
|
|
78
|
+
diffPromptArgs(name, oldItem, next, changes);
|
|
79
|
+
if (JSON.stringify(oldItem.description) !== JSON.stringify(next.description))
|
|
80
|
+
changes.push(change("potentially-breaking", "MCP-DRIFT-120", `${kind}.${name}.description`, `${capitalize(kind)} “${name}” description changed`));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function diffSchema(before, after, path, changes, output = false) {
|
|
84
|
+
if (!before && after) {
|
|
85
|
+
changes.push(change(output ? "potentially-breaking" : "non-breaking", "MCP-DRIFT-200", path, `${output ? "Output" : "Input"} schema was added`));
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (before && !after) {
|
|
89
|
+
changes.push(change("potentially-breaking", "MCP-DRIFT-201", path, `${output ? "Output" : "Input"} schema was removed`));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!before || !after)
|
|
93
|
+
return;
|
|
94
|
+
if (before.type !== after.type)
|
|
95
|
+
changes.push(change("breaking", "MCP-DRIFT-202", `${path}.type`, `Schema type changed from ${String(before.type)} to ${String(after.type)}`));
|
|
96
|
+
const oldRequired = new Set(before.required ?? []);
|
|
97
|
+
const newRequired = new Set(after.required ?? []);
|
|
98
|
+
for (const name of newRequired)
|
|
99
|
+
if (!oldRequired.has(name))
|
|
100
|
+
changes.push(change("breaking", "MCP-DRIFT-203", `${path}.required.${name}`, `Required input “${name}” was added`));
|
|
101
|
+
for (const name of oldRequired)
|
|
102
|
+
if (!newRequired.has(name))
|
|
103
|
+
changes.push(change("non-breaking", "MCP-DRIFT-204", `${path}.required.${name}`, `Input “${name}” is no longer required`));
|
|
104
|
+
const oldProps = before.properties ?? {};
|
|
105
|
+
const newProps = after.properties ?? {};
|
|
106
|
+
for (const name of Object.keys(oldProps))
|
|
107
|
+
if (!(name in newProps))
|
|
108
|
+
changes.push(change("breaking", "MCP-DRIFT-205", `${path}.properties.${name}`, `Schema property “${name}” was removed`));
|
|
109
|
+
for (const name of Object.keys(newProps))
|
|
110
|
+
if (!(name in oldProps))
|
|
111
|
+
changes.push(change(newRequired.has(name) ? "breaking" : "non-breaking", "MCP-DRIFT-206", `${path}.properties.${name}`, `${newRequired.has(name) ? "Required" : "Optional"} schema property “${name}” was added`));
|
|
112
|
+
for (const name of Object.keys(oldProps))
|
|
113
|
+
if (name in newProps) {
|
|
114
|
+
if (oldProps[name]?.type !== newProps[name]?.type)
|
|
115
|
+
changes.push(change("breaking", "MCP-DRIFT-207", `${path}.properties.${name}.type`, `Property “${name}” type changed from ${String(oldProps[name]?.type)} to ${String(newProps[name]?.type)}`));
|
|
116
|
+
const oldEnum = oldProps[name]?.enum;
|
|
117
|
+
const newEnum = newProps[name]?.enum;
|
|
118
|
+
if (oldEnum && newEnum) {
|
|
119
|
+
for (const value of oldEnum)
|
|
120
|
+
if (!newEnum.some((x) => JSON.stringify(x) === JSON.stringify(value)))
|
|
121
|
+
changes.push(change("breaking", "MCP-DRIFT-208", `${path}.properties.${name}.enum`, `Enum value ${JSON.stringify(value)} was removed from “${name}”`));
|
|
122
|
+
for (const value of newEnum)
|
|
123
|
+
if (!oldEnum.some((x) => JSON.stringify(x) === JSON.stringify(value)))
|
|
124
|
+
changes.push(change("non-breaking", "MCP-DRIFT-209", `${path}.properties.${name}.enum`, `Enum value ${JSON.stringify(value)} was added to “${name}”`));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function diffPromptArgs(name, before, after, changes) { const oldMap = index(before.arguments ?? [], "name"); const newMap = index(after.arguments ?? [], "name"); for (const [arg, value] of oldMap)
|
|
129
|
+
if (!newMap.has(arg))
|
|
130
|
+
changes.push(change(value.required ? "breaking" : "potentially-breaking", "MCP-DRIFT-300", `prompts.${name}.arguments.${arg}`, `Prompt argument “${arg}” was removed from “${name}”`)); for (const [arg, value] of newMap)
|
|
131
|
+
if (!oldMap.has(arg))
|
|
132
|
+
changes.push(change(value.required ? "breaking" : "non-breaking", "MCP-DRIFT-301", `prompts.${name}.arguments.${arg}`, `${value.required ? "Required" : "Optional"} prompt argument “${arg}” was added to “${name}”`)); }
|
|
133
|
+
function index(items, key) { return new Map(items.filter((item) => typeof item === "object" && item !== null && typeof item[key] === "string").map((item) => [String(item[key]), item])); }
|
|
134
|
+
function keys(value) { return new Set(typeof value === "object" && value ? Object.keys(value) : []); }
|
|
135
|
+
function change(severity, code, path, message, before, after) { return { severity, code, path, message, before, after }; }
|
|
136
|
+
function rank(value) { return value === "breaking" ? 0 : value === "potentially-breaking" ? 1 : 2; }
|
|
137
|
+
function capitalize(value) { return value.charAt(0).toUpperCase() + value.slice(1); }
|
|
138
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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"}
|
package/dist/data.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface DataRow {
|
|
2
|
+
id: string;
|
|
3
|
+
values: Record<string, unknown>;
|
|
4
|
+
index: number;
|
|
5
|
+
source: string;
|
|
6
|
+
}
|
|
7
|
+
export interface DataSet {
|
|
8
|
+
rows: DataRow[];
|
|
9
|
+
fingerprint: string;
|
|
10
|
+
source: string;
|
|
11
|
+
}
|
|
12
|
+
export interface DataContext {
|
|
13
|
+
cwd: string;
|
|
14
|
+
maxRows: number;
|
|
15
|
+
allowRemote: boolean;
|
|
16
|
+
allowCustomCode: boolean;
|
|
17
|
+
headers?: Record<string, string>;
|
|
18
|
+
}
|
|
19
|
+
export interface DataProvider {
|
|
20
|
+
load(config: Record<string, unknown>, context: DataContext): Promise<Record<string, unknown>[]>;
|
|
21
|
+
}
|
|
22
|
+
export declare function clearDataCache(): void;
|
|
23
|
+
export declare function loadData(config: Record<string, unknown>, context?: Partial<DataContext>): Promise<DataSet>;
|
|
24
|
+
//# sourceMappingURL=data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../src/data.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,OAAO;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACvG,MAAM,WAAW,OAAO;IAAG,IAAI,EAAE,OAAO,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACjF,MAAM,WAAW,WAAW;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE;AAC/I,MAAM,WAAW,YAAY;IAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE;AAGjI,wBAAgB,cAAc,IAAI,IAAI,CAA2B;AAEjE,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAE,OAAO,CAAC,WAAW,CAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYpH"}
|