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,52 @@
1
+ import { resolve } from "node:path";
2
+ import { Worker } from "node:worker_threads";
3
+ export async function inspectExtension(modulePath, options = {}) {
4
+ const absolute = resolve(options.cwd ?? process.cwd(), modulePath);
5
+ const value = await workerCall(absolute, { kind: "inspect" }, options);
6
+ if (value.manifest)
7
+ validateManifest(value.manifest, options.permissions ?? []);
8
+ return { modulePath: absolute, ...value };
9
+ }
10
+ export async function callIsolatedFunction(modulePath, name, args, options = {}) {
11
+ const descriptor = await inspectExtension(modulePath, options);
12
+ if (!descriptor.functions.includes(name))
13
+ throw new Error(`MCP-EXT-102 Extension does not declare function “${name}”`);
14
+ return workerCall(descriptor.modulePath, { kind: "function", name, args }, options);
15
+ }
16
+ export async function callIsolatedProvider(modulePath, config, context, options = {}) {
17
+ const descriptor = await inspectExtension(modulePath, options);
18
+ if (!descriptor.provider)
19
+ throw new Error("MCP-EXT-103 Extension does not declare a data provider");
20
+ const value = await workerCall(descriptor.modulePath, { kind: "provider", config, context }, options);
21
+ if (!Array.isArray(value))
22
+ throw new Error("MCP-EXT-104 Provider result must be an array");
23
+ return value;
24
+ }
25
+ function validateManifest(manifest, granted) {
26
+ if (manifest.schemaVersion !== 1 || !manifest.name || !manifest.version)
27
+ throw new Error("MCP-EXT-100 Invalid extension manifest");
28
+ const denied = (manifest.permissions ?? []).filter((permission) => !granted.includes(permission));
29
+ if (denied.length)
30
+ throw new Error(`MCP-EXT-101 Extension “${manifest.name}” requires permissions not granted: ${denied.join(", ")}`);
31
+ }
32
+ function workerCall(modulePath, payload, options) {
33
+ return new Promise((resolvePromise, reject) => {
34
+ const built = new URL("./extension-worker.js", import.meta.url);
35
+ const source = new URL("./extension-worker.ts", import.meta.url);
36
+ const worker = new Worker(import.meta.url.endsWith(".ts") ? source : built, { execArgv: import.meta.url.endsWith(".ts") ? ["--import", "tsx"] : [], workerData: { modulePath, ...payload }, resourceLimits: { maxOldGenerationSizeMb: options.maxOldGenerationSizeMb ?? 64 } });
37
+ const timeout = setTimeout(() => { void worker.terminate(); reject(new Error(`MCP-EXT-105 Isolated extension exceeded ${options.timeoutMs ?? 5000}ms`)); }, options.timeoutMs ?? 5000);
38
+ worker.once("message", (message) => { clearTimeout(timeout); void worker.terminate(); if (message.ok) {
39
+ try {
40
+ JSON.stringify(message.value);
41
+ resolvePromise(message.value);
42
+ }
43
+ catch {
44
+ reject(new Error("MCP-EXT-106 Extension returned a non-JSON value"));
45
+ }
46
+ }
47
+ else
48
+ reject(new Error(`MCP-EXT-107 ${message.error?.message ?? "Extension failed"}`)); });
49
+ worker.once("error", (error) => { clearTimeout(timeout); reject(new Error(`MCP-EXT-108 Worker failed: ${error.message}`)); });
50
+ });
51
+ }
52
+ //# sourceMappingURL=extension-host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-host.js","sourceRoot":"","sources":["../src/extension-host.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type ExtensionPermission = "environment" | "filesystem-read" | "network";
2
+ export interface ExtensionManifest {
3
+ schemaVersion: 1;
4
+ name: string;
5
+ version: string;
6
+ permissions?: ExtensionPermission[];
7
+ functions?: string[];
8
+ provider?: boolean;
9
+ }
10
+ export interface ExtensionFunctionContext {
11
+ signal?: AbortSignal;
12
+ }
13
+ export type ExtensionFunction = (args: Record<string, unknown>, context?: ExtensionFunctionContext) => unknown | Promise<unknown>;
14
+ export interface ExtensionDataProvider {
15
+ load(config: Record<string, unknown>, context: {
16
+ cwd: string;
17
+ maxRows: number;
18
+ }): Promise<Record<string, unknown>[]>;
19
+ }
20
+ export declare function defineExtension<T extends Record<string, unknown>>(extension: T): T;
21
+ export declare function defineManifest(manifest: ExtensionManifest): ExtensionManifest;
22
+ //# sourceMappingURL=extension-sdk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-sdk.d.ts","sourceRoot":"","sources":["../src/extension-sdk.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,iBAAiB,GAAG,SAAS,CAAC;AAChF,MAAM,WAAW,iBAAiB;IAAG,aAAa,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE;AACrK,MAAM,WAAW,wBAAwB;IAAG,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE;AAClE,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,wBAAwB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAClI,MAAM,WAAW,qBAAqB;IAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;CAAE;AAC/J,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAAsB;AACzG,wBAAgB,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,iBAAiB,CAAqB"}
@@ -0,0 +1,3 @@
1
+ export function defineExtension(extension) { return extension; }
2
+ export function defineManifest(manifest) { return manifest; }
3
+ //# sourceMappingURL=extension-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-sdk.js","sourceRoot":"","sources":["../src/extension-sdk.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,eAAe,CAAoC,SAAY,IAAO,OAAO,SAAS,CAAC,CAAC,CAAC;AACzG,MAAM,UAAU,cAAc,CAAC,QAA2B,IAAuB,OAAO,QAAQ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=extension-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-worker.d.ts","sourceRoot":"","sources":["../src/extension-worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import { parentPort, workerData } from "node:worker_threads";
2
+ import { pathToFileURL } from "node:url";
3
+ const input = workerData;
4
+ try {
5
+ const imported = await import(pathToFileURL(input.modulePath).href);
6
+ const manifest = imported.manifest ?? imported.default?.manifest;
7
+ if (input.kind === "inspect") {
8
+ const functions = manifest?.functions ?? Object.entries(imported).filter(([name, value]) => name !== "manifest" && typeof value === "function").map(([name]) => name);
9
+ parentPort.postMessage({ ok: true, value: { manifest, functions, provider: Boolean(manifest?.provider || imported.provider?.load || imported.default?.load) } });
10
+ }
11
+ else if (input.kind === "function") {
12
+ const fn = imported[input.name] ?? imported.default?.functions?.[input.name];
13
+ if (typeof fn !== "function")
14
+ throw new Error(`Function “${input.name}” is not exported`);
15
+ parentPort.postMessage({ ok: true, value: await fn(input.args ?? {}) });
16
+ }
17
+ else {
18
+ const provider = imported.provider ?? imported.default;
19
+ if (!provider?.load)
20
+ throw new Error("Extension does not export a provider with load()");
21
+ parentPort.postMessage({ ok: true, value: await provider.load(input.config ?? {}, input.context ?? { cwd: ".", maxRows: 1000 }) });
22
+ }
23
+ }
24
+ catch (error) {
25
+ parentPort.postMessage({ ok: false, error: { name: error instanceof Error ? error.name : "Error", message: error instanceof Error ? error.message : String(error), stack: error instanceof Error ? error.stack : undefined } });
26
+ }
27
+ //# sourceMappingURL=extension-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension-worker.js","sourceRoot":"","sources":["../src/extension-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAGzC,MAAM,KAAK,GAAG,UAAmB,CAAC;AAClC,IAAI,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAwB,CAAC;IAC3F,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC;IACjE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,QAAQ,EAAE,SAAS,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;QACtK,UAAW,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EAAE,IAAI,IAAI,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IACpK,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAK,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,KAAK,CAAC,IAAK,CAAC,CAAC;QAC/E,IAAI,OAAO,EAAE,KAAK,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,aAAa,KAAK,CAAC,IAAI,mBAAmB,CAAC,CAAC;QAC1F,UAAW,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,CAAC;QACvD,IAAI,CAAC,QAAQ,EAAE,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACzF,UAAW,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACtI,CAAC;AACH,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,UAAW,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACnO,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ExtensionPermission } from "./extension-sdk.js";
2
+ export type UtilityFunction = (args: Record<string, unknown>) => unknown | Promise<unknown>;
3
+ export interface FunctionRegistryOptions {
4
+ modules?: string[];
5
+ allowCustomCode?: boolean;
6
+ timeoutMs?: number;
7
+ cwd?: string;
8
+ permissions?: ExtensionPermission[];
9
+ unsafeLegacy?: boolean;
10
+ allowlist?: string[];
11
+ }
12
+ export declare function createFunctionRegistry(options?: FunctionRegistryOptions): Promise<Map<string, UtilityFunction>>;
13
+ export declare function callUtility(registry: Map<string, UtilityFunction>, name: string, args: Record<string, unknown>, timeoutMs?: number): Promise<unknown>;
14
+ export declare function builtinNames(): string[];
15
+ //# sourceMappingURL=extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;AAkB5F,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACpC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAsB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAgBzH;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,SAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAUzJ;AAED,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAAyC"}
@@ -0,0 +1,60 @@
1
+ import { pathToFileURL } from "node:url";
2
+ import { createHash } from "node:crypto";
3
+ import { callIsolatedFunction, inspectExtension } from "./extension-host.js";
4
+ const builtins = {
5
+ lowercase: ({ value }) => String(value).toLowerCase(),
6
+ uppercase: ({ value }) => String(value).toUpperCase(),
7
+ trim: ({ value }) => String(value).trim(),
8
+ join: ({ values, separator = "" }) => (Array.isArray(values) ? values : []).join(String(separator)),
9
+ replace: ({ value, find, replacement = "" }) => String(value).split(String(find)).join(String(replacement)),
10
+ length: ({ value }) => typeof value === "string" || Array.isArray(value) ? value.length : value && typeof value === "object" ? Object.keys(value).length : 0,
11
+ number: ({ value }) => { const result = Number(value); if (!Number.isFinite(result))
12
+ throw new Error(`cannot convert ${String(value)} to a number`); return result; },
13
+ text: ({ value }) => typeof value === "string" ? value : JSON.stringify(value),
14
+ json: ({ value }) => typeof value === "string" ? JSON.parse(value) : value,
15
+ round: ({ value, digits = 0 }) => { const scale = 10 ** Number(digits); return Math.round(Number(value) * scale) / scale; },
16
+ urlEncode: ({ value }) => encodeURIComponent(String(value)),
17
+ base64: ({ value }) => Buffer.from(String(value)).toString("base64"),
18
+ hash: ({ value, algorithm = "sha256" }) => createHash(String(algorithm)).update(String(value)).digest("hex"),
19
+ };
20
+ export async function createFunctionRegistry(options = {}) {
21
+ const functions = new Map(Object.entries(builtins));
22
+ const modules = options.modules ?? [];
23
+ if (modules.length && !options.allowCustomCode)
24
+ throw new Error("MCP-EXT-001 Custom functions are configured but not enabled. Add --allow-custom-code after reviewing them.");
25
+ for (const modulePath of modules) {
26
+ if (options.allowlist && !options.allowlist.includes(modulePath))
27
+ throw new Error(`MCP-EXT-109 Extension “${modulePath}” is not in the reviewed allowlist`);
28
+ if (options.unsafeLegacy) {
29
+ const url = modulePath.startsWith("file:") ? modulePath : pathToFileURL(`${options.cwd ?? process.cwd()}/${modulePath}`.replace(/\/+/g, "/")).href;
30
+ const imported = await import(url);
31
+ for (const [name, value] of Object.entries(imported))
32
+ if (typeof value === "function")
33
+ functions.set(name, value);
34
+ continue;
35
+ }
36
+ const descriptor = await inspectExtension(modulePath, { cwd: options.cwd, timeoutMs: options.timeoutMs, permissions: options.permissions });
37
+ for (const name of descriptor.functions)
38
+ functions.set(name, (args) => callIsolatedFunction(modulePath, name, args, { cwd: options.cwd, timeoutMs: options.timeoutMs, permissions: options.permissions }));
39
+ }
40
+ return functions;
41
+ }
42
+ export async function callUtility(registry, name, args, timeoutMs = 5000) {
43
+ const fn = registry.get(name);
44
+ if (!fn)
45
+ throw new Error(`MCP-EXT-002 Unknown utility function “${name}”`);
46
+ return Promise.race([
47
+ Promise.resolve(fn(args)),
48
+ new Promise((_, reject) => setTimeout(() => reject(new Error(`MCP-EXT-003 Function “${name}” exceeded ${timeoutMs}ms`)), timeoutMs)),
49
+ ]).then((value) => {
50
+ try {
51
+ JSON.stringify(value);
52
+ }
53
+ catch {
54
+ throw new Error(`MCP-EXT-004 Function “${name}” returned a value that cannot be saved as JSON`);
55
+ }
56
+ return value;
57
+ });
58
+ }
59
+ export function builtinNames() { return Object.keys(builtins).sort(); }
60
+ //# sourceMappingURL=extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface ImportGraph {
2
+ source: string;
3
+ importedFiles: string[];
4
+ }
5
+ /** Resolve flow-library imports and inline declarations without executing imported tests. */
6
+ export declare function resolveFlowImports(source: string, entryFile: string, stack?: string[]): Promise<ImportGraph>;
7
+ //# sourceMappingURL=imports.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.d.ts","sourceRoot":"","sources":["../src/imports.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,WAAW;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE;AAExE,6FAA6F;AAC7F,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAiBtH"}
@@ -0,0 +1,41 @@
1
+ import { readFile, realpath } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ /** Resolve flow-library imports and inline declarations without executing imported tests. */
4
+ export async function resolveFlowImports(source, entryFile, stack = []) {
5
+ const canonical = await realpath(entryFile).catch(() => resolve(entryFile));
6
+ if (stack.includes(canonical))
7
+ throw new Error(`MCPLANG301 Import cycle: ${[...stack, canonical].join(" → ")}`);
8
+ const expression = /^Import flows from\s+["']([^"']+)["']\s*$/gim;
9
+ const importedFiles = [];
10
+ const chunks = [];
11
+ let match;
12
+ while ((match = expression.exec(source))) {
13
+ const imported = await realpath(resolve(dirname(canonical), match[1])).catch(() => resolve(dirname(canonical), match[1]));
14
+ let importedSource;
15
+ try {
16
+ importedSource = await readFile(imported, "utf8");
17
+ }
18
+ catch {
19
+ throw new Error(`MCPLANG302 Cannot import flow library ${match[1]} from ${entryFile}`);
20
+ }
21
+ const graph = await resolveFlowImports(importedSource, imported, [...stack, canonical]);
22
+ importedFiles.push(imported, ...graph.importedFiles);
23
+ chunks.push(flowDeclarationsOnly(graph.source));
24
+ }
25
+ return { source: `${chunks.join("\n")}\n${source.replace(expression, "")}`, importedFiles: [...new Set(importedFiles)] };
26
+ }
27
+ function flowDeclarationsOnly(source) {
28
+ const lines = source.replaceAll("\r\n", "\n").split("\n");
29
+ const output = [];
30
+ for (let index = 0; index < lines.length;) {
31
+ if (/^Flow:/i.test(lines[index].trim()) && !/^\s/.test(lines[index])) {
32
+ output.push(lines[index++]);
33
+ while (index < lines.length && (!lines[index].trim() || /^\s/.test(lines[index])))
34
+ output.push(lines[index++]);
35
+ }
36
+ else
37
+ index++;
38
+ }
39
+ return output.join("\n");
40
+ }
41
+ //# sourceMappingURL=imports.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"imports.js","sourceRoot":"","sources":["../src/imports.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export { assertError, assertResponse } from "./assertions.js";
2
+ export { authorTest, createReadlinePromptAdapter, flattenResponse, renderAuthoredTest, ScriptedPromptAdapter, type AuthoredTest, type PromptAdapter } from "./author.js";
3
+ export { canonicalize, canonicalJson, fingerprint } from "./canonical.js";
4
+ export { checkContract, compareContracts, contractMarkdown, contractReport, readContract, updateContract, type ContractChange, type ContractDiff, type DriftSeverity } from "./contract.js";
5
+ export { discoverTarget, generateSuite, writeGeneratedSuite, writeLock } from "./discovery.js";
6
+ export { clearDataCache, loadData, type DataProvider, type DataRow, type DataSet } from "./data.js";
7
+ export { builtinNames, callUtility, createFunctionRegistry, type UtilityFunction } from "./extensions.js";
8
+ export { resolveFlowImports, type ImportGraph } from "./imports.js";
9
+ export { LanguageDiagnostic, lexLanguage, validateLanguageDocument, type LanguageDocument, type LanguageNode, type SourceSpan } from "./language.js";
10
+ export { loadSuite, validateSuite } from "./loader.js";
11
+ export { readPath, replaceVariables } from "./path.js";
12
+ export { runParity, parityReport, parityMarkdown, type ParityResult, type ParityTargets, type ParityTestRow } from "./parity.js";
13
+ export { compileQaLanguage } from "./qa-language.js";
14
+ export { compileAdvancedQaLanguage, type QaCompileOptions } from "./qa-advanced.js";
15
+ export { loadTestFile } from "./qa-loader.js";
16
+ export { terminalReport, writeHtmlReport, writeJsonReport, writeJunitReport } from "./reporters.js";
17
+ export { starterTemplate, writeStarter } from "./starter.js";
18
+ export { replayReport, replayTrace, type ReplayOptions, type ReplayResult } from "./replay.js";
19
+ export { SnapshotStore, normalizeSnapshot, renderSemanticDiff, semanticDiff, type SemanticChange, type SnapshotFile, type SnapshotOptions } from "./snapshots.js";
20
+ export { readState, targetFingerprint, writeState, type PersistedState } from "./state.js";
21
+ export { compareEvidence, showEvidence, TraceRecorder, traceSession, writeEvidenceBundle, type EvidenceManifest, type NormalizedTraceEvent, type TraceEvent } from "./trace.js";
22
+ export { runSuite, type RunOptions } from "./runner.js";
23
+ export { createSession, installSignalCleanup, shutdownSessions } from "./session.js";
24
+ export { RigorError, FAILURE_CODES, classifyFailure, formatFailure, sanitizeTerminal, type FailureCategory, type FailureInfo } from "./errors.js";
25
+ export { defineExtension, defineManifest, type ExtensionDataProvider, type ExtensionFunction, type ExtensionManifest, type ExtensionPermission } from "./extension-sdk.js";
26
+ export { callIsolatedFunction, callIsolatedProvider, inspectExtension, type ExtensionDescriptor, type ExtensionHostOptions } from "./extension-host.js";
27
+ export { startWorkspace, type WorkspaceOptions } from "./workspace.js";
28
+ export type * from "./types.js";
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,28 @@
1
+ export { assertError, assertResponse } from "./assertions.js";
2
+ export { authorTest, createReadlinePromptAdapter, flattenResponse, renderAuthoredTest, ScriptedPromptAdapter } from "./author.js";
3
+ export { canonicalize, canonicalJson, fingerprint } from "./canonical.js";
4
+ export { checkContract, compareContracts, contractMarkdown, contractReport, readContract, updateContract } from "./contract.js";
5
+ export { discoverTarget, generateSuite, writeGeneratedSuite, writeLock } from "./discovery.js";
6
+ export { clearDataCache, loadData } from "./data.js";
7
+ export { builtinNames, callUtility, createFunctionRegistry } from "./extensions.js";
8
+ export { resolveFlowImports } from "./imports.js";
9
+ export { LanguageDiagnostic, lexLanguage, validateLanguageDocument } from "./language.js";
10
+ export { loadSuite, validateSuite } from "./loader.js";
11
+ export { readPath, replaceVariables } from "./path.js";
12
+ export { runParity, parityReport, parityMarkdown } from "./parity.js";
13
+ export { compileQaLanguage } from "./qa-language.js";
14
+ export { compileAdvancedQaLanguage } from "./qa-advanced.js";
15
+ export { loadTestFile } from "./qa-loader.js";
16
+ export { terminalReport, writeHtmlReport, writeJsonReport, writeJunitReport } from "./reporters.js";
17
+ export { starterTemplate, writeStarter } from "./starter.js";
18
+ export { replayReport, replayTrace } from "./replay.js";
19
+ export { SnapshotStore, normalizeSnapshot, renderSemanticDiff, semanticDiff } from "./snapshots.js";
20
+ export { readState, targetFingerprint, writeState } from "./state.js";
21
+ export { compareEvidence, showEvidence, TraceRecorder, traceSession, writeEvidenceBundle } from "./trace.js";
22
+ export { runSuite } from "./runner.js";
23
+ export { createSession, installSignalCleanup, shutdownSessions } from "./session.js";
24
+ export { RigorError, FAILURE_CODES, classifyFailure, formatFailure, sanitizeTerminal } from "./errors.js";
25
+ export { defineExtension, defineManifest } from "./extension-sdk.js";
26
+ export { callIsolatedFunction, callIsolatedProvider, inspectExtension } from "./extension-host.js";
27
+ export { startWorkspace } from "./workspace.js";
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,2BAA2B,EAAE,eAAe,EAAE,kBAAkB,EAAE,qBAAqB,EAAyC,MAAM,aAAa,CAAC;AACzK,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAA8D,MAAM,eAAe,CAAC;AAC5L,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAiD,MAAM,WAAW,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAwB,MAAM,iBAAiB,CAAC;AAC1G,OAAO,EAAE,kBAAkB,EAAoB,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,wBAAwB,EAA6D,MAAM,eAAe,CAAC;AACrJ,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAA6D,MAAM,aAAa,CAAC;AACjI,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAyB,MAAM,kBAAkB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACpG,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,WAAW,EAAyC,MAAM,aAAa,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,YAAY,EAAgE,MAAM,gBAAgB,CAAC;AAClK,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAuB,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAqE,MAAM,YAAY,CAAC;AAChL,OAAO,EAAE,QAAQ,EAAmB,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAA0C,MAAM,aAAa,CAAC;AAClJ,OAAO,EAAE,eAAe,EAAE,cAAc,EAAwG,MAAM,oBAAoB,CAAC;AAC3K,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,gBAAgB,EAAuD,MAAM,qBAAqB,CAAC;AACxJ,OAAO,EAAE,cAAc,EAAyB,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,34 @@
1
+ export interface SourcePosition {
2
+ line: number;
3
+ column: number;
4
+ offset: number;
5
+ }
6
+ export interface SourceSpan {
7
+ file: string;
8
+ start: SourcePosition;
9
+ end: SourcePosition;
10
+ }
11
+ export type LanguageNodeKind = "version" | "suite" | "server" | "import" | "flow" | "data" | "test" | "statement" | "blank" | "comment";
12
+ export interface LanguageNode {
13
+ kind: LanguageNodeKind;
14
+ text: string;
15
+ indent: number;
16
+ span: SourceSpan;
17
+ }
18
+ export interface LanguageDocument {
19
+ version: 1;
20
+ file: string;
21
+ source: string;
22
+ nodes: LanguageNode[];
23
+ }
24
+ export declare class LanguageDiagnostic extends Error {
25
+ readonly code: string;
26
+ readonly span: SourceSpan;
27
+ readonly reason: string;
28
+ readonly hint?: string | undefined;
29
+ constructor(code: string, span: SourceSpan, reason: string, hint?: string | undefined, source?: string);
30
+ }
31
+ /** Formal line lexer for MCP Test 1. It owns whitespace, spans, and declaration classification. */
32
+ export declare function lexLanguage(source: string, file?: string): LanguageDocument;
33
+ export declare function validateLanguageDocument(document: LanguageDocument): void;
34
+ //# sourceMappingURL=language.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../src/language.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAChF,MAAM,WAAW,UAAU;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,cAAc,CAAC;IAAC,GAAG,EAAE,cAAc,CAAA;CAAE;AACxF,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,CAAC;AACxI,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,gBAAgB,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE;AACxG,MAAM,WAAW,gBAAgB;IAAG,OAAO,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE;AAErG,qBAAa,kBAAmB,SAAQ,KAAK;aACf,IAAI,EAAE,MAAM;aAAkB,IAAI,EAAE,UAAU;aAAkB,MAAM,EAAE,MAAM;aAAkB,IAAI,CAAC,EAAE,MAAM;gBAA7G,IAAI,EAAE,MAAM,EAAkB,IAAI,EAAE,UAAU,EAAkB,MAAM,EAAE,MAAM,EAAkB,IAAI,CAAC,EAAE,MAAM,YAAA,EAAE,MAAM,CAAC,EAAE,MAAM;CAM3J;AAED,mGAAmG;AACnG,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,SAAc,GAAG,gBAAgB,CAqBhF;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAoBzE"}
@@ -0,0 +1,102 @@
1
+ export class LanguageDiagnostic extends Error {
2
+ code;
3
+ span;
4
+ reason;
5
+ hint;
6
+ constructor(code, span, reason, hint, source) {
7
+ const line = source?.split(/\r?\n/)[span.start.line - 1] ?? "";
8
+ const caret = `${" ".repeat(Math.max(0, span.start.column - 1))}${"^".repeat(Math.max(1, span.end.column - span.start.column))}`;
9
+ super(`${code} ${span.file}:${span.start.line}:${span.start.column}\n\n${line}\n${caret}\n\n${reason}${hint ? `\nTry: ${hint}` : ""}`);
10
+ this.code = code;
11
+ this.span = span;
12
+ this.reason = reason;
13
+ this.hint = hint;
14
+ this.name = "LanguageDiagnostic";
15
+ }
16
+ }
17
+ /** Formal line lexer for MCP Test 1. It owns whitespace, spans, and declaration classification. */
18
+ export function lexLanguage(source, file = "test.mcpr") {
19
+ const normalized = source.replaceAll("\r\n", "\n");
20
+ const lines = normalized.split("\n");
21
+ const nodes = [];
22
+ let offset = 0;
23
+ let version = 1;
24
+ for (let index = 0; index < lines.length; index++) {
25
+ const raw = lines[index];
26
+ if (raw.includes("\t"))
27
+ throw diagnostic("MCPLANG101", file, normalized, index + 1, raw.indexOf("\t") + 1, "Tabs are not allowed because their visual width is ambiguous.", "replace the tab with two spaces");
28
+ const indent = raw.match(/^ */)[0].length;
29
+ if (indent % 2 !== 0)
30
+ throw diagnostic("MCPLANG102", file, normalized, index + 1, 1, "Indentation must use multiples of two spaces.", "use 0, 2, 4, or 6 leading spaces");
31
+ const text = raw.trim();
32
+ const kind = classify(text);
33
+ if (/^MCP Test\s+/i.test(text)) {
34
+ if (text !== "MCP Test 1")
35
+ throw diagnostic("MCPLANG103", file, normalized, index + 1, indent + 1, `Unsupported language header “${text}”.`, "MCP Test 1");
36
+ version = 1;
37
+ }
38
+ nodes.push({ kind, text, indent, span: span(file, index + 1, indent + 1, Math.max(indent + 2, raw.length + 1), offset + indent, offset + raw.length) });
39
+ offset += raw.length + 1;
40
+ }
41
+ return { version, file, source: normalized, nodes };
42
+ }
43
+ export function validateLanguageDocument(document) {
44
+ const names = new Map();
45
+ const flowNames = new Map();
46
+ let currentTest = false;
47
+ let hasAction = false;
48
+ for (const node of document.nodes) {
49
+ if (node.kind === "test") {
50
+ if (currentTest && !hasAction)
51
+ throw new LanguageDiagnostic("MCPLANG202", node.span, "The previous test has no action.", "add Call tool, Read resource, Get prompt, or Send", document.source);
52
+ currentTest = true;
53
+ hasAction = false;
54
+ const name = quotedName(node.text);
55
+ if (name)
56
+ duplicate(names, name, node, document, "test");
57
+ }
58
+ if (node.kind === "flow") {
59
+ const name = quotedName(node.text);
60
+ if (name)
61
+ duplicate(flowNames, name, node, document, "flow");
62
+ }
63
+ if (/^(Call|When I call|Read|When I read|Get|When I get|Send|When I send|Use flow|For each row|Subscribe to|Unsubscribe from|Wait for notification|Set log level|List all|List tasks|Cancel task)\b/i.test(node.text))
64
+ hasAction = true;
65
+ if (/^(Expect|Then|Save|Remember|Export|Wait up to)\b/i.test(node.text) && !hasAction)
66
+ throw new LanguageDiagnostic("MCPLANG203", node.span, `“${node.text}” needs an action before it.`, "add Call tool, Read resource, Get prompt, or Send above it", document.source);
67
+ }
68
+ if (currentTest && !hasAction) {
69
+ const node = [...document.nodes].reverse().find((item) => item.kind === "test");
70
+ throw new LanguageDiagnostic("MCPLANG202", node.span, "This test has no action.", "add Call tool, Read resource, Get prompt, or Send", document.source);
71
+ }
72
+ }
73
+ function classify(text) {
74
+ if (!text)
75
+ return "blank";
76
+ if (text.startsWith("#"))
77
+ return "comment";
78
+ if (/^MCP Test\s+/i.test(text))
79
+ return "version";
80
+ if (/^Suite:/i.test(text))
81
+ return "suite";
82
+ if (/^(Server:|MCP URL:|Connect to:|Compare target\s+|Parity target\s+|Target options for\s+|Server options:)/i.test(text))
83
+ return "server";
84
+ if (/^Import flows from\s+/i.test(text))
85
+ return "import";
86
+ if (/^Flow:/i.test(text))
87
+ return "flow";
88
+ if (/^Data source:/i.test(text))
89
+ return "data";
90
+ if (/^(Test|Scenario):/i.test(text))
91
+ return "test";
92
+ return "statement";
93
+ }
94
+ function quotedName(text) { return text.match(/^[^:]+:\s*["']([^"']+)["']/)?.[1]; }
95
+ function duplicate(map, name, node, document, kind) {
96
+ if (map.has(name))
97
+ throw new LanguageDiagnostic("MCPLANG201", node.span, `Duplicate ${kind} name “${name}”.`, `rename one ${kind}; names must be unique`, document.source);
98
+ map.set(name, node);
99
+ }
100
+ function diagnostic(code, file, source, line, column, reason, hint) { return new LanguageDiagnostic(code, span(file, line, column, column + 1, 0, 0), reason, hint, source); }
101
+ function span(file, line, start, end, startOffset, endOffset) { return { file, start: { line, column: start, offset: startOffset }, end: { line, column: end, offset: endOffset } }; }
102
+ //# sourceMappingURL=language.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language.js","sourceRoot":"","sources":["../src/language.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IACf;IAA8B;IAAkC;IAAgC;IAA5H,YAA4B,IAAY,EAAkB,IAAgB,EAAkB,MAAc,EAAkB,IAAa,EAAE,MAAe;QACxJ,MAAM,IAAI,GAAG,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACjI,KAAK,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,OAAO,IAAI,KAAK,KAAK,OAAO,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAH7G,SAAI,GAAJ,IAAI,CAAQ;QAAkB,SAAI,GAAJ,IAAI,CAAY;QAAkB,WAAM,GAAN,MAAM,CAAQ;QAAkB,SAAI,GAAJ,IAAI,CAAS;QAIvI,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,mGAAmG;AACnG,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,IAAI,GAAG,WAAW;IAC5D,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAmB,EAAE,CAAC;IACjC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,OAAO,GAAM,CAAC,CAAC;IACnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,+DAA+D,EAAE,iCAAiC,CAAC,CAAC;QAC/M,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAC3C,IAAI,MAAM,GAAG,CAAC,KAAK,CAAC;YAAE,MAAM,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,+CAA+C,EAAE,kCAAkC,CAAC,CAAC;QAC1K,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,IAAI,IAAI,KAAK,YAAY;gBAAE,MAAM,UAAU,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,gCAAgC,IAAI,IAAI,EAAE,YAAY,CAAC,CAAC;YAC3J,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACxJ,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,QAA0B;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC9C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAwB,CAAC;IAClD,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACzB,IAAI,WAAW,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,kBAAkB,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,kCAAkC,EAAE,mDAAmD,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC/L,WAAW,GAAG,IAAI,CAAC;YAAC,SAAS,GAAG,KAAK,CAAC;YACtC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,IAAI;gBAAE,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAAC,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAC,IAAI,IAAI;gBAAE,SAAS,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAAC,CAAC;QAC/H,IAAI,iMAAiM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS,GAAG,IAAI,CAAC;QACxO,IAAI,mDAAmD,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,kBAAkB,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,8BAA8B,EAAE,4DAA4D,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3Q,CAAC;IACD,IAAI,WAAW,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAE,CAAC;QACjF,MAAM,IAAI,kBAAkB,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,0BAA0B,EAAE,mDAAmD,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1J,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC;IAC1B,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACjD,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1C,IAAI,2GAA2G,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC5I,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IACzD,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IAC/C,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACnD,OAAO,WAAW,CAAC;AACrB,CAAC;AACD,SAAS,UAAU,CAAC,IAAY,IAAwB,OAAO,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/G,SAAS,SAAS,CAAC,GAA8B,EAAE,IAAY,EAAE,IAAkB,EAAE,QAA0B,EAAE,IAAY;IAC3H,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,kBAAkB,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,EAAE,aAAa,IAAI,UAAU,IAAI,IAAI,EAAE,cAAc,IAAI,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC3K,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACtB,CAAC;AACD,SAAS,UAAU,CAAC,IAAY,EAAE,IAAY,EAAE,MAAc,EAAE,IAAY,EAAE,MAAc,EAAE,MAAc,EAAE,IAAY,IAAwB,OAAO,IAAI,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1P,SAAS,IAAI,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa,EAAE,GAAW,EAAE,WAAmB,EAAE,SAAiB,IAAgB,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Suite } from "./types.js";
2
+ export declare function loadSuite(file: string): Promise<Suite>;
3
+ export declare function validateSuite(value: unknown): asserts value is Suite;
4
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMxC,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAmB5D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAUpE"}
package/dist/loader.js ADDED
@@ -0,0 +1,51 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { extname } from "node:path";
3
+ import AjvModule from "ajv";
4
+ const Ajv = AjvModule;
5
+ import YAML from "yaml";
6
+ import { suiteSchema } from "./schema.js";
7
+ const MAX_SUITE_BYTES = 1024 * 1024;
8
+ const ajv = new Ajv({ allErrors: true, strict: false });
9
+ const validate = ajv.compile(suiteSchema);
10
+ export async function loadSuite(file) {
11
+ const source = await readFile(file, "utf8");
12
+ if (Buffer.byteLength(source) > MAX_SUITE_BYTES)
13
+ throw new Error("MCP-CONFIG-002 Suite exceeds the 1 MiB limit");
14
+ const extension = extname(file).toLowerCase();
15
+ let value;
16
+ try {
17
+ if (extension === ".json")
18
+ value = JSON.parse(source);
19
+ else {
20
+ const document = YAML.parseDocument(source, { uniqueKeys: true });
21
+ if (document.errors.length)
22
+ throw document.errors[0];
23
+ value = document.toJS({ maxAliasCount: 0 });
24
+ }
25
+ }
26
+ catch (error) {
27
+ throw new Error(`MCP-CONFIG-001 Unable to parse ${file}: ${messageOf(error)}`);
28
+ }
29
+ validateSuite(value);
30
+ return value;
31
+ }
32
+ export function validateSuite(value) {
33
+ if (!validate(value)) {
34
+ const detail = (validate.errors ?? []).map(formatError).join("; ");
35
+ throw new Error(`MCP-CONFIG-003 Invalid suite: ${detail}`);
36
+ }
37
+ const names = new Set();
38
+ for (const test of value.tests) {
39
+ if (names.has(test.name))
40
+ throw new Error(`MCP-CONFIG-004 Duplicate test name: ${test.name}`);
41
+ names.add(test.name);
42
+ }
43
+ }
44
+ function formatError(error) {
45
+ const path = error.instancePath || "$";
46
+ return `${path} ${error.message ?? "is invalid"}`;
47
+ }
48
+ function messageOf(error) {
49
+ return error instanceof Error ? error.message : String(error);
50
+ }
51
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}