@kryptosai/mcp-observatory 0.8.1 → 0.10.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kryptosai/mcp-observatory",
3
- "version": "0.8.1",
3
+ "version": "0.10.0",
4
4
  "description": "Test your MCP servers for breaking changes. Checks capabilities, invokes tools, detects schema drift between versions.",
5
5
  "mcpName": "io.github.KryptosAI/mcp-observatory",
6
6
  "license": "MIT",
@@ -1,14 +0,0 @@
1
- import type { Client } from "@modelcontextprotocol/sdk/client/index.js";
2
- import type { ServerCapabilities } from "@modelcontextprotocol/sdk/types.js";
3
- import type { TargetConfig } from "../types.js";
4
- export interface AdapterSession {
5
- client: Client;
6
- serverCapabilities?: ServerCapabilities;
7
- serverName?: string;
8
- serverVersion?: string;
9
- stderrLines: string[];
10
- close(): Promise<void>;
11
- }
12
- export interface TargetAdapter {
13
- connect(target: TargetConfig): Promise<AdapterSession>;
14
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=base.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/adapters/base.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- import { type CapabilityObservation, type ObservedCheck } from "./base.js";
2
- export declare function runSemanticsCheck(observations: CapabilityObservation[], stderrLines: string[]): ObservedCheck;
@@ -1,48 +0,0 @@
1
- import { performance } from "node:perf_hooks";
2
- import { makeCheckResult } from "./base.js";
3
- export function runSemanticsCheck(observations, stderrLines) {
4
- const startedAt = performance.now();
5
- const advertised = observations.filter((observation) => observation.advertised);
6
- const failingCapabilities = advertised
7
- .filter((observation) => !observation.responded)
8
- .map((observation) => observation.capability);
9
- const partialCapabilities = advertised
10
- .filter((observation) => observation.responded && !observation.minimalShapePresent)
11
- .map((observation) => observation.capability);
12
- const passingCapabilities = advertised
13
- .filter((observation) => observation.responded && observation.minimalShapePresent)
14
- .map((observation) => observation.capability);
15
- let status = "pass";
16
- let message = "Advertised capabilities responded and returned the minimal expected shape.";
17
- if (advertised.length === 0) {
18
- status = "unsupported";
19
- message = "No capabilities were advertised, so semantics could not be evaluated.";
20
- }
21
- else if (failingCapabilities.length > 0) {
22
- status = "fail";
23
- message = `Advertised capabilities that did not respond cleanly: ${failingCapabilities.join(", ")}.`;
24
- }
25
- else if (partialCapabilities.length > 0) {
26
- status = "partial";
27
- message =
28
- `Advertised capabilities responded with caveats: ${partialCapabilities.join(", ")}.`;
29
- }
30
- else if (passingCapabilities.length > 0) {
31
- message =
32
- `Advertised capabilities responded and returned the minimal expected shape: ${passingCapabilities.join(", ")}.`;
33
- }
34
- return {
35
- result: makeCheckResult("semantics", status, performance.now() - startedAt, message, observations.map((observation) => ({
36
- endpoint: observation.endpoint,
37
- advertised: observation.advertised,
38
- responded: observation.responded,
39
- minimalShapePresent: observation.minimalShapePresent,
40
- itemCount: observation.itemCount,
41
- identifiers: observation.identifiers,
42
- diagnostics: stderrLines.length > 0
43
- ? [...observation.diagnostics, ...stderrLines.slice(-5)]
44
- : observation.diagnostics
45
- })))
46
- };
47
- }
48
- //# sourceMappingURL=semantics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"semantics.js","sourceRoot":"","sources":["../../../src/checks/semantics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EACL,eAAe,EAGhB,MAAM,WAAW,CAAC;AAEnB,MAAM,UAAU,iBAAiB,CAC/B,YAAqC,EACrC,WAAqB;IAErB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAChF,MAAM,mBAAmB,GAAG,UAAU;SACnC,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC;SAC/C,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,mBAAmB,GAAG,UAAU;SACnC,MAAM,CACL,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAC5D;SACA,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAChD,MAAM,mBAAmB,GAAG,UAAU;SACnC,MAAM,CACL,CAAC,WAAW,EAAE,EAAE,CACd,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,mBAAmB,CAC3D;SACA,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,MAAM,GAAsC,MAAM,CAAC;IACvD,IAAI,OAAO,GACT,4EAA4E,CAAC;IAE/E,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,aAAa,CAAC;QACvB,OAAO,GAAG,uEAAuE,CAAC;IACpF,CAAC;SAAM,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,GAAG,MAAM,CAAC;QAChB,OAAO,GAAG,yDAAyD,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACvG,CAAC;SAAM,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,GAAG,SAAS,CAAC;QACnB,OAAO;YACL,mDAAmD,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACzF,CAAC;SAAM,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,OAAO;YACL,8EAA8E,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IACpH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,eAAe,CACrB,WAAW,EACX,MAAM,EACN,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,EAC7B,OAAO,EACP,YAAY,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YACjC,QAAQ,EAAE,WAAW,CAAC,QAAQ;YAC9B,UAAU,EAAE,WAAW,CAAC,UAAU;YAClC,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,mBAAmB,EAAE,WAAW,CAAC,mBAAmB;YACpD,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,WAAW,EACT,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,WAAW,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxD,CAAC,CAAC,WAAW,CAAC,WAAW;SAC9B,CAAC,CAAC,CACJ;KACF,CAAC;AACJ,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { DiffArtifact, RunArtifact } from "../types.js";
2
- export declare function diffArtifacts(base: RunArtifact, head: RunArtifact): DiffArtifact;
@@ -1,81 +0,0 @@
1
- import { SCHEMA_VERSION } from "../types.js";
2
- const STATUS_RANK = {
3
- pass: 6,
4
- partial: 5,
5
- flaky: 4,
6
- unsupported: 3,
7
- skipped: 2,
8
- fail: 1
9
- };
10
- function toEntry(base, head) {
11
- const source = head ?? base;
12
- if (source === undefined) {
13
- throw new Error("Expected at least one check result when building a diff entry.");
14
- }
15
- return {
16
- id: source.id,
17
- capability: source.capability,
18
- fromStatus: base?.status,
19
- toStatus: head?.status,
20
- message: head?.message ??
21
- base?.message ??
22
- "No additional diagnostic message was recorded."
23
- };
24
- }
25
- export function diffArtifacts(base, head) {
26
- const baseChecks = new Map(base.checks.map((check) => [check.id, check]));
27
- const headChecks = new Map(head.checks.map((check) => [check.id, check]));
28
- const checkIds = Array.from(new Set([...baseChecks.keys(), ...headChecks.keys()]));
29
- const regressions = [];
30
- const recoveries = [];
31
- const unchanged = [];
32
- const added = [];
33
- const removed = [];
34
- for (const checkId of checkIds) {
35
- const baseCheck = baseChecks.get(checkId);
36
- const headCheck = headChecks.get(checkId);
37
- if (baseCheck === undefined && headCheck !== undefined) {
38
- added.push(toEntry(undefined, headCheck));
39
- continue;
40
- }
41
- if (baseCheck !== undefined && headCheck === undefined) {
42
- removed.push(toEntry(baseCheck, undefined));
43
- continue;
44
- }
45
- if (baseCheck === undefined || headCheck === undefined) {
46
- continue;
47
- }
48
- if (baseCheck.status === headCheck.status) {
49
- unchanged.push(toEntry(baseCheck, headCheck));
50
- continue;
51
- }
52
- if (STATUS_RANK[headCheck.status] < STATUS_RANK[baseCheck.status]) {
53
- regressions.push(toEntry(baseCheck, headCheck));
54
- continue;
55
- }
56
- recoveries.push(toEntry(baseCheck, headCheck));
57
- }
58
- const summary = {
59
- regressions: regressions.length,
60
- recoveries: recoveries.length,
61
- unchanged: unchanged.length,
62
- added: added.length,
63
- removed: removed.length,
64
- gate: regressions.length > 0 ? "fail" : "pass"
65
- };
66
- return {
67
- artifactType: "diff",
68
- schemaVersion: SCHEMA_VERSION,
69
- gate: summary.gate,
70
- baseRunId: base.runId,
71
- headRunId: head.runId,
72
- createdAt: new Date().toISOString(),
73
- summary,
74
- regressions,
75
- recoveries,
76
- unchanged,
77
- added,
78
- removed
79
- };
80
- }
81
- //# sourceMappingURL=diff.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../../src/diff/diff.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import type { DiffArtifact, RunArtifact } from "../types.js";
2
- export declare function renderJson(artifact: RunArtifact | DiffArtifact): string;
@@ -1,4 +0,0 @@
1
- export function renderJson(artifact) {
2
- return JSON.stringify(artifact, null, 2);
3
- }
4
- //# sourceMappingURL=json.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/reporters/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,UAAU,CAAC,QAAoC;IAC7D,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -1,2 +0,0 @@
1
- import type { RunArtifact, TargetConfig } from "../types.js";
2
- export declare function runTarget(target: TargetConfig): Promise<RunArtifact>;
@@ -1,135 +0,0 @@
1
- import os from "node:os";
2
- import { AdapterConnectError, LocalProcessAdapter } from "../adapters/local-process.js";
3
- import { runPromptsCheck } from "../checks/prompts.js";
4
- import { runResourcesCheck } from "../checks/resources.js";
5
- import { runSemanticsCheck } from "../checks/semantics.js";
6
- import { runToolsCheck } from "../checks/tools.js";
7
- import { SCHEMA_VERSION } from "../types.js";
8
- import { buildRunId } from "../utils/ids.js";
9
- import { TOOL_VERSION } from "../version.js";
10
- function createEmptyCounts() {
11
- return {
12
- total: 0,
13
- pass: 0,
14
- fail: 0,
15
- partial: 0,
16
- unsupported: 0,
17
- flaky: 0,
18
- skipped: 0
19
- };
20
- }
21
- function buildSummary(checks, fatalError) {
22
- const counts = createEmptyCounts();
23
- for (const check of checks) {
24
- counts.total += 1;
25
- counts[check.status] += 1;
26
- }
27
- const gate = fatalError !== undefined || counts.fail > 0 ? "fail" : "pass";
28
- return {
29
- ...counts,
30
- gate
31
- };
32
- }
33
- export async function runTarget(target) {
34
- const adapter = new LocalProcessAdapter();
35
- const runId = buildRunId();
36
- const createdAt = new Date().toISOString();
37
- let checks = [];
38
- let fatalError;
39
- let serverName;
40
- let serverVersion;
41
- try {
42
- const session = await adapter.connect(target);
43
- serverName = session.serverName;
44
- serverVersion = session.serverVersion;
45
- try {
46
- const checkContext = {
47
- client: session.client,
48
- serverCapabilities: session.serverCapabilities,
49
- target,
50
- timeoutMs: target.timeoutMs ?? 10_000,
51
- stderrLines: session.stderrLines
52
- };
53
- const toolsCheck = await runToolsCheck(checkContext);
54
- const promptsCheck = await runPromptsCheck(checkContext);
55
- const resourcesCheck = await runResourcesCheck(checkContext);
56
- const semanticsCheck = runSemanticsCheck([toolsCheck.observation, promptsCheck.observation, resourcesCheck.observation].filter((observation) => observation !== undefined), session.stderrLines);
57
- checks = [
58
- toolsCheck.result,
59
- promptsCheck.result,
60
- resourcesCheck.result,
61
- semanticsCheck.result
62
- ];
63
- }
64
- finally {
65
- await session.close();
66
- }
67
- }
68
- catch (error) {
69
- fatalError = error instanceof Error ? error.message : String(error);
70
- const skippedMessage = error instanceof AdapterConnectError
71
- ? "Skipped because startup failed before the MCP session initialized. See the failure diagnosis."
72
- : "Skipped because the adapter never established a session.";
73
- checks = [
74
- {
75
- id: "tools",
76
- capability: "tools",
77
- status: "skipped",
78
- durationMs: 0,
79
- message: skippedMessage,
80
- evidence: []
81
- },
82
- {
83
- id: "prompts",
84
- capability: "prompts",
85
- status: "skipped",
86
- durationMs: 0,
87
- message: skippedMessage,
88
- evidence: []
89
- },
90
- {
91
- id: "resources",
92
- capability: "resources",
93
- status: "skipped",
94
- durationMs: 0,
95
- message: skippedMessage,
96
- evidence: []
97
- },
98
- {
99
- id: "semantics",
100
- capability: "semantics",
101
- status: "skipped",
102
- durationMs: 0,
103
- message: skippedMessage,
104
- evidence: []
105
- }
106
- ];
107
- }
108
- const summary = buildSummary(checks, fatalError);
109
- return {
110
- artifactType: "run",
111
- schemaVersion: SCHEMA_VERSION,
112
- gate: summary.gate,
113
- runId,
114
- createdAt,
115
- toolVersion: TOOL_VERSION,
116
- target: {
117
- targetId: target.targetId,
118
- adapter: target.adapter,
119
- command: target.command,
120
- args: target.args,
121
- cwd: target.cwd,
122
- metadata: target.metadata,
123
- serverName,
124
- serverVersion
125
- },
126
- environment: {
127
- platform: `${os.platform()} ${os.release()}`,
128
- nodeVersion: process.version
129
- },
130
- summary,
131
- checks,
132
- fatalError
133
- };
134
- }
135
- //# sourceMappingURL=runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/runner/runner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,SAAS,iBAAiB;IACxB,OAAO;QACL,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,CAAC;QACP,IAAI,EAAE,CAAC;QACP,OAAO,EAAE,CAAC;QACV,WAAW,EAAE,CAAC;QACd,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,CAAC;KACX,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,MAAqB,EAAE,UAAmB;IAC9D,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC;IACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAClB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,MAAM,IAAI,GACR,UAAU,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;IAChE,OAAO;QACL,GAAG,MAAM;QACT,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAoB;IAClD,MAAM,OAAO,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAC1C,MAAM,KAAK,GAAG,UAAU,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE3C,IAAI,MAAM,GAAkB,EAAE,CAAC;IAC/B,IAAI,UAA8B,CAAC;IACnC,IAAI,UAA8B,CAAC;IACnC,IAAI,aAAiC,CAAC;IAEtC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC9C,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QAChC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAEtC,IAAI,CAAC;YACH,MAAM,YAAY,GAAG;gBACnB,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;gBAC9C,MAAM;gBACN,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,MAAM;gBACrC,WAAW,EAAE,OAAO,CAAC,WAAW;aACjC,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,YAAY,CAAC,CAAC;YACrD,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC;YACzD,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAC7D,MAAM,cAAc,GAAG,iBAAiB,CACtC,CAAC,UAAU,CAAC,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE,cAAc,CAAC,WAAW,CAAC,CAAC,MAAM,CACnF,CAAC,WAAW,EAAkD,EAAE,CAC9D,WAAW,KAAK,SAAS,CAC5B,EACD,OAAO,CAAC,WAAW,CACpB,CAAC;YAEF,MAAM,GAAG;gBACP,UAAU,CAAC,MAAM;gBACjB,YAAY,CAAC,MAAM;gBACnB,cAAc,CAAC,MAAM;gBACrB,cAAc,CAAC,MAAM;aACtB,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpE,MAAM,cAAc,GAClB,KAAK,YAAY,mBAAmB;YAClC,CAAC,CAAC,+FAA+F;YACjG,CAAC,CAAC,0DAA0D,CAAC;QACjE,MAAM,GAAG;YACP;gBACE,EAAE,EAAE,OAAO;gBACX,UAAU,EAAE,OAAO;gBACnB,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,cAAc;gBACvB,QAAQ,EAAE,EAAE;aACb;YACD;gBACE,EAAE,EAAE,SAAS;gBACb,UAAU,EAAE,SAAS;gBACrB,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,cAAc;gBACvB,QAAQ,EAAE,EAAE;aACb;YACD;gBACE,EAAE,EAAE,WAAW;gBACf,UAAU,EAAE,WAAW;gBACvB,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,cAAc;gBACvB,QAAQ,EAAE,EAAE;aACb;YACD;gBACE,EAAE,EAAE,WAAW;gBACf,UAAU,EAAE,WAAW;gBACvB,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,CAAC;gBACb,OAAO,EAAE,cAAc;gBACvB,QAAQ,EAAE,EAAE;aACb;SACF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAEjD,OAAO;QACL,YAAY,EAAE,KAAK;QACnB,aAAa,EAAE,cAAc;QAC7B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK;QACL,SAAS;QACT,WAAW,EAAE,YAAY;QACzB,MAAM,EAAE;YACN,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,UAAU;YACV,aAAa;SACd;QACD,WAAW,EAAE;YACX,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE;YAC5C,WAAW,EAAE,OAAO,CAAC,OAAO;SAC7B;QACD,OAAO;QACP,MAAM;QACN,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -1,6 +0,0 @@
1
- import type { DiffArtifact, RunArtifact } from "../types.js";
2
- export type Artifact = RunArtifact | DiffArtifact;
3
- export declare function defaultRunsDirectory(cwd?: string): string;
4
- export declare function ensureDirectory(directoryPath: string): Promise<void>;
5
- export declare function writeRunArtifact(artifact: RunArtifact, outDir: string): Promise<string>;
6
- export declare function readArtifact(filePath: string): Promise<Artifact>;
@@ -1,21 +0,0 @@
1
- import { mkdir, readFile, writeFile } from "node:fs/promises";
2
- import path from "node:path";
3
- import { slugify } from "../utils/ids.js";
4
- export function defaultRunsDirectory(cwd = process.cwd()) {
5
- return path.join(cwd, ".mcp-observatory", "runs");
6
- }
7
- export async function ensureDirectory(directoryPath) {
8
- await mkdir(directoryPath, { recursive: true });
9
- }
10
- export async function writeRunArtifact(artifact, outDir) {
11
- await ensureDirectory(outDir);
12
- const fileName = `${artifact.createdAt.replaceAll(":", "-")}--${slugify(artifact.target.targetId)}.json`;
13
- const filePath = path.join(outDir, fileName);
14
- await writeFile(filePath, JSON.stringify(artifact, null, 2) + "\n", "utf8");
15
- return filePath;
16
- }
17
- export async function readArtifact(filePath) {
18
- const content = await readFile(filePath, "utf8");
19
- return JSON.parse(content);
20
- }
21
- //# sourceMappingURL=filesystem.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../../src/storage/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,IAAI,MAAM,WAAW,CAAC;AAG7B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAI1C,MAAM,UAAU,oBAAoB,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACtD,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,aAAqB;IACzD,MAAM,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAqB,EACrB,MAAc;IAEd,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;IAC9B,MAAM,QAAQ,GAAG,GAAG,QAAQ,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,OAAO,CACrE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CACzB,OAAO,CAAC;IACT,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAa,CAAC;AACzC,CAAC"}