@kryptosai/mcp-observatory 1.28.1 → 1.28.3

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 (134) hide show
  1. package/CONTRIBUTORS.md +4 -1
  2. package/README.md +109 -14
  3. package/README.zh-CN.md +654 -0
  4. package/dist/src/adapters/http.js +13 -4
  5. package/dist/src/adapters/http.js.map +1 -1
  6. package/dist/src/checks/runtime-profile.d.ts +5 -0
  7. package/dist/src/checks/runtime-profile.js +214 -0
  8. package/dist/src/checks/runtime-profile.js.map +1 -0
  9. package/dist/src/checks/security-rules.js +18 -0
  10. package/dist/src/checks/security-rules.js.map +1 -1
  11. package/dist/src/checks/security.js +33 -65
  12. package/dist/src/checks/security.js.map +1 -1
  13. package/dist/src/checks/skill-scan.d.ts +46 -0
  14. package/dist/src/checks/skill-scan.js +665 -0
  15. package/dist/src/checks/skill-scan.js.map +1 -0
  16. package/dist/src/cli.js +15 -2
  17. package/dist/src/cli.js.map +1 -1
  18. package/dist/src/commands/enforce.d.ts +12 -0
  19. package/dist/src/commands/enforce.js +187 -0
  20. package/dist/src/commands/enforce.js.map +1 -0
  21. package/dist/src/commands/helpers.d.ts +2 -1
  22. package/dist/src/commands/helpers.js +9 -1
  23. package/dist/src/commands/helpers.js.map +1 -1
  24. package/dist/src/commands/legacy.js +3 -0
  25. package/dist/src/commands/legacy.js.map +1 -1
  26. package/dist/src/commands/risk-graph.d.ts +2 -0
  27. package/dist/src/commands/risk-graph.js +64 -0
  28. package/dist/src/commands/risk-graph.js.map +1 -0
  29. package/dist/src/commands/scan.js +36 -9
  30. package/dist/src/commands/scan.js.map +1 -1
  31. package/dist/src/commands/score.js.map +1 -1
  32. package/dist/src/commands/skill-scan.d.ts +6 -0
  33. package/dist/src/commands/skill-scan.js +62 -0
  34. package/dist/src/commands/skill-scan.js.map +1 -0
  35. package/dist/src/commands/test.js +13 -0
  36. package/dist/src/commands/test.js.map +1 -1
  37. package/dist/src/commands/watch.js +13 -8
  38. package/dist/src/commands/watch.js.map +1 -1
  39. package/dist/src/discovery.d.ts +15 -1
  40. package/dist/src/discovery.js +251 -35
  41. package/dist/src/discovery.js.map +1 -1
  42. package/dist/src/index.d.ts +3 -1
  43. package/dist/src/index.js +3 -1
  44. package/dist/src/index.js.map +1 -1
  45. package/dist/src/receipt.d.ts +4 -1
  46. package/dist/src/receipt.js +85 -0
  47. package/dist/src/receipt.js.map +1 -1
  48. package/dist/src/reporters/markdown.js +39 -0
  49. package/dist/src/reporters/markdown.js.map +1 -1
  50. package/dist/src/reporters/terminal.d.ts +2 -0
  51. package/dist/src/reporters/terminal.js +55 -2
  52. package/dist/src/reporters/terminal.js.map +1 -1
  53. package/dist/src/risk-graph.d.ts +64 -0
  54. package/dist/src/risk-graph.js +452 -0
  55. package/dist/src/risk-graph.js.map +1 -0
  56. package/dist/src/runner.js +6 -0
  57. package/dist/src/runner.js.map +1 -1
  58. package/dist/src/server.d.ts +1 -3
  59. package/dist/src/server.js +29 -645
  60. package/dist/src/server.js.map +1 -1
  61. package/dist/src/storage.js +13 -9
  62. package/dist/src/storage.js.map +1 -1
  63. package/dist/src/telemetry.d.ts +7 -0
  64. package/dist/src/telemetry.js.map +1 -1
  65. package/dist/src/tools/check-server.d.ts +27 -0
  66. package/dist/src/tools/check-server.js +46 -0
  67. package/dist/src/tools/check-server.js.map +1 -0
  68. package/dist/src/tools/ci-report.d.ts +21 -0
  69. package/dist/src/tools/ci-report.js +38 -0
  70. package/dist/src/tools/ci-report.js.map +1 -0
  71. package/dist/src/tools/diff-runs.d.ts +28 -0
  72. package/dist/src/tools/diff-runs.js +39 -0
  73. package/dist/src/tools/diff-runs.js.map +1 -0
  74. package/dist/src/tools/get-history.d.ts +21 -0
  75. package/dist/src/tools/get-history.js +37 -0
  76. package/dist/src/tools/get-history.js.map +1 -0
  77. package/dist/src/tools/get-last-run.d.ts +21 -0
  78. package/dist/src/tools/get-last-run.js +47 -0
  79. package/dist/src/tools/get-last-run.js.map +1 -0
  80. package/dist/src/tools/helpers.d.ts +8 -0
  81. package/dist/src/tools/helpers.js +32 -0
  82. package/dist/src/tools/helpers.js.map +1 -0
  83. package/dist/src/tools/lock-verify.d.ts +21 -0
  84. package/dist/src/tools/lock-verify.js +47 -0
  85. package/dist/src/tools/lock-verify.js.map +1 -0
  86. package/dist/src/tools/record.d.ts +23 -0
  87. package/dist/src/tools/record.js +48 -0
  88. package/dist/src/tools/record.js.map +1 -0
  89. package/dist/src/tools/replay.d.ts +21 -0
  90. package/dist/src/tools/replay.js +54 -0
  91. package/dist/src/tools/replay.js.map +1 -0
  92. package/dist/src/tools/scan.d.ts +18 -0
  93. package/dist/src/tools/scan.js +43 -0
  94. package/dist/src/tools/scan.js.map +1 -0
  95. package/dist/src/tools/score-server.d.ts +23 -0
  96. package/dist/src/tools/score-server.js +53 -0
  97. package/dist/src/tools/score-server.js.map +1 -0
  98. package/dist/src/tools/suggest-servers.d.ts +21 -0
  99. package/dist/src/tools/suggest-servers.js +114 -0
  100. package/dist/src/tools/suggest-servers.js.map +1 -0
  101. package/dist/src/tools/verify-tool.d.ts +25 -0
  102. package/dist/src/tools/verify-tool.js +48 -0
  103. package/dist/src/tools/verify-tool.js.map +1 -0
  104. package/dist/src/tools/watch.d.ts +23 -0
  105. package/dist/src/tools/watch.js +67 -0
  106. package/dist/src/tools/watch.js.map +1 -0
  107. package/dist/src/types.d.ts +26 -1
  108. package/dist/src/utils/security.d.ts +3 -0
  109. package/dist/src/utils/security.js +37 -0
  110. package/dist/src/utils/security.js.map +1 -0
  111. package/dist/src/validate.d.ts +1 -0
  112. package/dist/src/validate.js +119 -35
  113. package/dist/src/validate.js.map +1 -1
  114. package/docs/agent-tasks.md +1 -1
  115. package/docs/commercial-boundary.md +9 -1
  116. package/docs/contributor-recognition.md +2 -0
  117. package/docs/demo.svg +1 -59
  118. package/docs/mcp-receipts.md +9 -0
  119. package/docs/mcp-server-safety-index.md +21 -16
  120. package/docs/metrics-dashboard.md +17 -1
  121. package/docs/private-mcp-fleet-risk-graph.md +69 -0
  122. package/docs/receipt-graph.md +118 -31
  123. package/docs/safety-index/artifacts/chrome-devtools-mcp-server.json +1745 -0
  124. package/docs/safety-index/artifacts/chrome-devtools-mcp-server.md +169 -0
  125. package/docs/safety-index/artifacts/filesystem-mcp-server.json +786 -0
  126. package/docs/safety-index/artifacts/filesystem-mcp-server.md +169 -0
  127. package/docs/safety-index/artifacts/github-mcp-server.json +1707 -0
  128. package/docs/safety-index/artifacts/github-mcp-server.md +169 -0
  129. package/docs/safety-index/mcp-risk-graph.html +167 -0
  130. package/docs/safety-index/mcp-risk-graph.json +669 -0
  131. package/docs/safety-index/mcp-risk-graph.md +47 -0
  132. package/docs/safety-index/targets.json +57 -0
  133. package/docs/sample-private-fleet-risk-graph.md +90 -0
  134. package/package.json +21 -11
@@ -0,0 +1,23 @@
1
+ import { z } from "zod";
2
+ export declare const name = "watch";
3
+ export declare const description = "Use this to check a server and see what changed since the last check. Runs all checks, saves the result, and diffs against the previous run for the same target. Shows regressions, recoveries, and schema drift in one call.";
4
+ export declare const schema: {
5
+ command: z.ZodString;
6
+ args: z.ZodOptional<z.ZodArray<z.ZodString>>;
7
+ };
8
+ export declare function handler({ command, args }: {
9
+ command: string;
10
+ args?: string[];
11
+ }): Promise<{
12
+ content: {
13
+ type: "text";
14
+ text: string;
15
+ }[];
16
+ isError?: undefined;
17
+ } | {
18
+ content: {
19
+ type: "text";
20
+ text: string;
21
+ }[];
22
+ isError: boolean;
23
+ }>;
@@ -0,0 +1,67 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { z } from "zod";
4
+ import { diffArtifacts } from "../diff.js";
5
+ import { renderMarkdown } from "../reporters/markdown.js";
6
+ import { runTarget } from "../runner.js";
7
+ import { defaultRunsDirectory, writeRunArtifact, readArtifact } from "../storage.js";
8
+ import { errorMessage } from "../utils/errors.js";
9
+ import { validateArgs, validateCommand } from "../utils/security.js";
10
+ import { formatRun, logRequest } from "./helpers.js";
11
+ export const name = "watch";
12
+ export const description = "Use this to check a server and see what changed since the last check. Runs all checks, saves the result, and diffs against the previous run for the same target. Shows regressions, recoveries, and schema drift in one call.";
13
+ export const schema = {
14
+ command: z.string().describe("The command to launch the MCP server."),
15
+ args: z.array(z.string()).optional().describe("Additional arguments for the command."),
16
+ };
17
+ export async function handler({ command, args }) {
18
+ const startMs = Date.now();
19
+ try {
20
+ validateCommand(command);
21
+ validateArgs(args ?? []);
22
+ const target = {
23
+ targetId: command,
24
+ adapter: "local-process",
25
+ command,
26
+ args: args ?? [],
27
+ timeoutMs: 15_000,
28
+ };
29
+ const artifact = await runTarget(target);
30
+ const outDir = defaultRunsDirectory();
31
+ const outPath = await writeRunArtifact(artifact, outDir);
32
+ let diffText = "";
33
+ try {
34
+ const files = await readdir(outDir);
35
+ const needle = target.targetId.toLowerCase();
36
+ const matching = files
37
+ .filter((f) => f.endsWith(".json") && f.toLowerCase().includes(needle) && path.join(outDir, f) !== outPath)
38
+ .sort()
39
+ .reverse();
40
+ if (matching.length > 0) {
41
+ const prevArtifact = await readArtifact(path.join(outDir, matching[0]));
42
+ if (prevArtifact.artifactType === "run") {
43
+ const diff = diffArtifacts(prevArtifact, artifact);
44
+ if (diff.summary.regressions > 0 || diff.summary.recoveries > 0 || diff.summary.added > 0 || diff.summary.removed > 0) {
45
+ diffText = `\n\nChanges since last run:\n${renderMarkdown(diff)}`;
46
+ }
47
+ else {
48
+ diffText = "\n\nNo changes since last run.";
49
+ }
50
+ }
51
+ }
52
+ }
53
+ catch {
54
+ // No previous run — that's fine
55
+ }
56
+ logRequest("watch", startMs);
57
+ return {
58
+ content: [{ type: "text", text: `${formatRun(artifact)}\n\nArtifact saved: ${outPath}${diffText}` }],
59
+ };
60
+ }
61
+ catch (error) {
62
+ const msg = errorMessage(error);
63
+ logRequest("watch", startMs, true);
64
+ return { content: [{ type: "text", text: `Error watching: ${msg}` }], isError: true };
65
+ }
66
+ }
67
+ //# sourceMappingURL=watch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch.js","sourceRoot":"","sources":["../../../src/tools/watch.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@ export declare const SCHEMA_VERSION = "1.0.0";
2
2
  export type ArtifactType = "run" | "diff";
3
3
  export type Gate = "pass" | "fail";
4
4
  export type CheckStatus = "pass" | "fail" | "partial" | "unsupported" | "flaky" | "skipped";
5
- export type CheckId = "tools" | "prompts" | "resources" | "tools-invoke" | "security" | "security-lite" | "attack-sim" | "conformance" | "schema-quality";
5
+ export type CheckId = "tools" | "prompts" | "resources" | "tools-invoke" | "security" | "security-lite" | "attack-sim" | "conformance" | "schema-quality" | "runtime-profile";
6
6
  export declare const STATUS_RANK: Record<CheckStatus, number>;
7
7
  export interface LocalProcessTargetConfig {
8
8
  targetId: string;
@@ -92,7 +92,9 @@ export interface RunArtifact {
92
92
  checks: CheckResult[];
93
93
  healthScore?: HealthScore;
94
94
  performanceMetrics?: PerformanceMetrics;
95
+ runtimeProfile?: RuntimeProfile;
95
96
  fatalError?: string;
97
+ notObserved?: NotObserved[];
96
98
  }
97
99
  export type HealthGrade = "A" | "B" | "C" | "D" | "F";
98
100
  export interface ScoreDimension {
@@ -106,6 +108,29 @@ export interface HealthScore {
106
108
  grade: HealthGrade;
107
109
  dimensions: ScoreDimension[];
108
110
  }
111
+ export interface NotObserved {
112
+ category: string;
113
+ detail: string;
114
+ severity: "info" | "warning";
115
+ }
116
+ export interface EgressEntry {
117
+ target: string;
118
+ protocol: string;
119
+ source: string;
120
+ confidence: "high" | "medium" | "low";
121
+ }
122
+ export interface StateMutation {
123
+ resource: string;
124
+ operation: string;
125
+ scope: string;
126
+ source: string;
127
+ }
128
+ export interface RuntimeProfile {
129
+ egress?: EgressEntry[];
130
+ stateMutations?: StateMutation[];
131
+ analyzedAt: string;
132
+ confidence: "high" | "medium" | "low";
133
+ }
109
134
  export interface PerformanceMetrics {
110
135
  connectMs: number;
111
136
  toolsListMs?: number;
@@ -0,0 +1,3 @@
1
+ export declare function validateArgs(args: string[]): void;
2
+ export declare function validateCommand(command: string): void;
3
+ export declare function validatePath(filePath: string, allowedRoot: string): string;
@@ -0,0 +1,37 @@
1
+ import path from "node:path";
2
+ const ALLOWED_COMMANDS = new Set([
3
+ "npx",
4
+ "node",
5
+ "python",
6
+ "python3",
7
+ "uvx",
8
+ "docker",
9
+ "deno",
10
+ "bun",
11
+ ]);
12
+ const DANGEROUS_ARG_PATTERN = /[;|`]|\$\(|&&|\|\|/;
13
+ export function validateArgs(args) {
14
+ for (const arg of args) {
15
+ if (DANGEROUS_ARG_PATTERN.test(arg)) {
16
+ throw new Error(`Argument "${arg}" contains shell metacharacters and was rejected. ` +
17
+ `Remove characters like ; | && || $() or backticks.`);
18
+ }
19
+ }
20
+ }
21
+ export function validateCommand(command) {
22
+ const base = path.basename(command.split(/\s+/)[0] ?? "");
23
+ if (!ALLOWED_COMMANDS.has(base)) {
24
+ throw new Error(`Command "${base}" is not in the MCP server allowlist. ` +
25
+ `Allowed executables: ${[...ALLOWED_COMMANDS].join(", ")}. ` +
26
+ `Use the CLI for arbitrary commands.`);
27
+ }
28
+ }
29
+ export function validatePath(filePath, allowedRoot) {
30
+ const resolved = path.resolve(filePath);
31
+ const root = path.resolve(allowedRoot);
32
+ if (!resolved.startsWith(root + path.sep) && resolved !== root) {
33
+ throw new Error(`Path "${filePath}" resolves outside allowed directory "${allowedRoot}".`);
34
+ }
35
+ return resolved;
36
+ }
37
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/utils/security.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,KAAK;IACL,MAAM;IACN,QAAQ;IACR,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,KAAK;CACN,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,oBAAoB,CAAC;AAEnD,MAAM,UAAU,YAAY,CAAC,IAAc;IACzC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CACb,aAAa,GAAG,oDAAoD;gBACpE,oDAAoD,CACrD,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,wCAAwC;YACxD,wBAAwB,CAAC,GAAG,gBAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI;YAC5D,qCAAqC,CACtC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,WAAmB;IAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CACb,SAAS,QAAQ,yCAAyC,WAAW,IAAI,CAC1E,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { DiffArtifact, RunArtifact, TargetConfig } from "./types.js";
2
+ export declare function isObject(value: unknown): value is Record<string, unknown>;
2
3
  export declare function validateTargetConfig(data: unknown): TargetConfig;
3
4
  export declare function validateRunArtifact(data: unknown): RunArtifact;
4
5
  export declare function validateDiffArtifact(data: unknown): DiffArtifact;
@@ -1,6 +1,9 @@
1
- function isObject(value) {
1
+ export function isObject(value) {
2
2
  return typeof value === "object" && value !== null && !Array.isArray(value);
3
3
  }
4
+ function isStringArray(value) {
5
+ return Array.isArray(value) && value.every((v) => typeof v === "string");
6
+ }
4
7
  function requireString(obj, field, label) {
5
8
  const value = obj[field];
6
9
  if (typeof value !== "string" || value.length === 0) {
@@ -31,39 +34,57 @@ function requireNumber(obj, field, label) {
31
34
  }
32
35
  return value;
33
36
  }
37
+ function requireGate(value, label) {
38
+ if (value !== "pass" && value !== "fail") {
39
+ throw new Error(`${label} has invalid gate '${String(value)}'.`);
40
+ }
41
+ return value;
42
+ }
34
43
  function requireStatus(value, label) {
35
44
  const statuses = new Set(["pass", "fail", "partial", "unsupported", "flaky", "skipped"]);
36
45
  if (typeof value !== "string" || !statuses.has(value)) {
37
46
  throw new Error(`${label} has invalid status '${String(value)}'.`);
38
47
  }
48
+ return value;
39
49
  }
40
50
  function requireCheckId(value, label) {
41
51
  const ids = new Set(["tools", "prompts", "resources", "tools-invoke", "security", "security-lite", "attack-sim", "conformance", "schema-quality"]);
42
52
  if (typeof value !== "string" || !ids.has(value)) {
43
53
  throw new Error(`${label} has invalid check id '${String(value)}'.`);
44
54
  }
55
+ return value;
45
56
  }
46
57
  function validateRunSummary(value) {
47
58
  if (!isObject(value)) {
48
59
  throw new Error("Run artifact is missing required field 'summary'.");
49
60
  }
50
- if (value["gate"] !== "pass" && value["gate"] !== "fail") {
51
- throw new Error("Run artifact summary has invalid gate.");
52
- }
53
- for (const field of ["total", "pass", "fail", "partial", "unsupported", "flaky", "skipped"]) {
54
- requireNumber(value, field, "Run artifact summary");
55
- }
61
+ const gate = requireGate(value["gate"], "Run artifact summary");
62
+ return {
63
+ gate,
64
+ total: requireNumber(value, "total", "Run artifact summary"),
65
+ pass: requireNumber(value, "pass", "Run artifact summary"),
66
+ fail: requireNumber(value, "fail", "Run artifact summary"),
67
+ partial: requireNumber(value, "partial", "Run artifact summary"),
68
+ unsupported: requireNumber(value, "unsupported", "Run artifact summary"),
69
+ flaky: requireNumber(value, "flaky", "Run artifact summary"),
70
+ skipped: requireNumber(value, "skipped", "Run artifact summary"),
71
+ };
56
72
  }
57
73
  function validateCheck(value, index) {
58
74
  if (!isObject(value)) {
59
75
  throw new Error(`Run artifact checks[${index}] must be an object.`);
60
76
  }
61
- requireCheckId(value["id"], `Run artifact checks[${index}]`);
62
- requireCheckId(value["capability"], `Run artifact checks[${index}] capability`);
63
- requireStatus(value["status"], `Run artifact checks[${index}]`);
64
- requireNumber(value, "durationMs", `Run artifact checks[${index}]`);
65
- requireString(value, "message", `Run artifact checks[${index}]`);
66
- requireArray(value, "evidence", `Run artifact checks[${index}]`);
77
+ const id = requireCheckId(value["id"], `Run artifact checks[${index}]`);
78
+ const capability = requireCheckId(value["capability"], `Run artifact checks[${index}] capability`);
79
+ const status = requireStatus(value["status"], `Run artifact checks[${index}]`);
80
+ return {
81
+ id: id,
82
+ capability: capability,
83
+ status,
84
+ durationMs: requireNumber(value, "durationMs", `Run artifact checks[${index}]`),
85
+ message: requireString(value, "message", `Run artifact checks[${index}]`),
86
+ evidence: (Array.isArray(value["evidence"]) ? value["evidence"].filter(isObject) : []),
87
+ };
67
88
  }
68
89
  function expandEnvValue(value, label) {
69
90
  const match = value.match(/^\$\{([A-Za-z_][A-Za-z0-9_]*)\}$/) ??
@@ -157,28 +178,57 @@ export function validateRunArtifact(data) {
157
178
  if (data["artifactType"] !== "run") {
158
179
  throw new Error(`Expected a run artifact but got artifactType='${String(data["artifactType"])}'.`);
159
180
  }
160
- requireString(data, "runId", "Run artifact");
161
- requireString(data, "createdAt", "Run artifact");
162
- requireString(data, "schemaVersion", "Run artifact");
163
- requireString(data, "toolVersion", "Run artifact");
164
- const checks = requireArray(data, "checks", "Run artifact");
181
+ const runId = requireString(data, "runId", "Run artifact");
182
+ const createdAt = requireString(data, "createdAt", "Run artifact");
183
+ const schemaVersion = requireString(data, "schemaVersion", "Run artifact");
184
+ const toolVersion = requireString(data, "toolVersion", "Run artifact");
185
+ const gate = requireGate(data["gate"], "Run artifact");
165
186
  if (!isObject(data["target"])) {
166
187
  throw new Error("Run artifact is missing required field 'target'.");
167
188
  }
168
- requireString(data["target"], "targetId", "Run artifact target");
169
- requireString(data["target"], "adapter", "Run artifact target");
189
+ const target = {
190
+ targetId: requireString(data["target"], "targetId", "Run artifact target"),
191
+ adapter: requireString(data["target"], "adapter", "Run artifact target"),
192
+ command: typeof data["target"]["command"] === "string" ? data["target"]["command"] : "",
193
+ args: isStringArray(data["target"]["args"]) ? data["target"]["args"].filter((a) => typeof a === "string") : [],
194
+ url: typeof data["target"]["url"] === "string" ? data["target"]["url"] : undefined,
195
+ cwd: typeof data["target"]["cwd"] === "string" ? data["target"]["cwd"] : undefined,
196
+ metadata: optionalStringRecord(data["target"]["metadata"], "Run artifact target metadata"),
197
+ serverVersion: typeof data["target"]["serverVersion"] === "string" ? data["target"]["serverVersion"] : undefined,
198
+ serverName: typeof data["target"]["serverName"] === "string" ? data["target"]["serverName"] : undefined,
199
+ };
170
200
  if (!isObject(data["environment"])) {
171
201
  throw new Error("Run artifact is missing required field 'environment'.");
172
202
  }
173
- requireString(data["environment"], "platform", "Run artifact environment");
174
- requireString(data["environment"], "nodeVersion", "Run artifact environment");
175
- validateRunSummary(data["summary"]);
176
- for (const [index, check] of checks.entries()) {
177
- validateCheck(check, index);
178
- }
179
- // Structure validated above. The intermediate unknown cast is required because
180
- // TypeScript can't narrow Record<string, unknown> to a specific interface.
181
- return data;
203
+ const environment = {
204
+ platform: requireString(data["environment"], "platform", "Run artifact environment"),
205
+ nodeVersion: requireString(data["environment"], "nodeVersion", "Run artifact environment"),
206
+ };
207
+ const summary = validateRunSummary(data["summary"]);
208
+ const checksRaw = requireArray(data, "checks", "Run artifact");
209
+ const checks = checksRaw.map((c, i) => validateCheck(c, i));
210
+ const healthScore = isObject(data["healthScore"])
211
+ ? data["healthScore"]
212
+ : undefined;
213
+ const performanceMetrics = isObject(data["performanceMetrics"])
214
+ ? data["performanceMetrics"]
215
+ : undefined;
216
+ const fatalError = typeof data["fatalError"] === "string" ? data["fatalError"] : undefined;
217
+ return {
218
+ artifactType: "run",
219
+ schemaVersion: schemaVersion,
220
+ gate,
221
+ runId,
222
+ createdAt,
223
+ toolVersion,
224
+ target,
225
+ environment,
226
+ summary,
227
+ checks,
228
+ healthScore,
229
+ performanceMetrics,
230
+ fatalError,
231
+ };
182
232
  }
183
233
  export function validateDiffArtifact(data) {
184
234
  if (!isObject(data)) {
@@ -187,13 +237,47 @@ export function validateDiffArtifact(data) {
187
237
  if (data["artifactType"] !== "diff") {
188
238
  throw new Error(`Expected a diff artifact but got artifactType='${String(data["artifactType"])}'.`);
189
239
  }
190
- requireString(data, "baseRunId", "Diff artifact");
191
- requireString(data, "headRunId", "Diff artifact");
192
- requireString(data, "createdAt", "Diff artifact");
193
- requireString(data, "schemaVersion", "Diff artifact");
194
- if (!isObject(data["summary"])) {
240
+ const baseRunId = requireString(data, "baseRunId", "Diff artifact");
241
+ const headRunId = requireString(data, "headRunId", "Diff artifact");
242
+ const createdAt = requireString(data, "createdAt", "Diff artifact");
243
+ const schemaVersion = requireString(data, "schemaVersion", "Diff artifact");
244
+ const gate = requireGate(data["gate"], "Diff artifact");
245
+ const summaryObj = data["summary"];
246
+ if (!isObject(summaryObj)) {
195
247
  throw new Error("Diff artifact is missing required field 'summary'.");
196
248
  }
197
- return data;
249
+ const summary = {
250
+ regressions: requireNumber(summaryObj, "regressions", "Diff artifact summary"),
251
+ recoveries: requireNumber(summaryObj, "recoveries", "Diff artifact summary"),
252
+ unchanged: requireNumber(summaryObj, "unchanged", "Diff artifact summary"),
253
+ added: requireNumber(summaryObj, "added", "Diff artifact summary"),
254
+ removed: requireNumber(summaryObj, "removed", "Diff artifact summary"),
255
+ schemaDriftCount: optionalNumber(summaryObj, "schemaDriftCount", "Diff artifact summary"),
256
+ responseChangeCount: optionalNumber(summaryObj, "responseChangeCount", "Diff artifact summary"),
257
+ gate: requireGate(summaryObj["gate"], "Diff artifact summary"),
258
+ };
259
+ const regressions = Array.isArray(data["regressions"]) ? data["regressions"] : [];
260
+ const recoveries = Array.isArray(data["recoveries"]) ? data["recoveries"] : [];
261
+ const unchanged = Array.isArray(data["unchanged"]) ? data["unchanged"] : [];
262
+ const added = Array.isArray(data["added"]) ? data["added"] : [];
263
+ const removed = Array.isArray(data["removed"]) ? data["removed"] : [];
264
+ const schemaDrift = Array.isArray(data["schemaDrift"]) ? data["schemaDrift"] : undefined;
265
+ const responseChanges = Array.isArray(data["responseChanges"]) ? data["responseChanges"] : undefined;
266
+ return {
267
+ artifactType: "diff",
268
+ schemaVersion: schemaVersion,
269
+ gate,
270
+ baseRunId,
271
+ headRunId,
272
+ createdAt,
273
+ summary,
274
+ regressions,
275
+ recoveries,
276
+ unchanged,
277
+ added,
278
+ removed,
279
+ schemaDrift,
280
+ responseChanges,
281
+ };
198
282
  }
199
283
  //# sourceMappingURL=validate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"AAoBA,MAAM,UAAU,QAAQ,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,GAA4B,EAAE,KAAa,EAAE,KAAa;IAC/E,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,KAAK,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,GAA4B,EAAE,KAAa,EAAE,KAAa;IAC9E,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,KAAK,wBAAwB,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,GAA4B,EAAE,KAAa,EAAE,KAAa;IAChF,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,KAAK,2BAA2B,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,GAA4B,EAAE,KAAa,EAAE,KAAa;IAC/E,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,KAAK,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,WAAW,CAAC,KAAc,EAAE,KAAa;IAChD,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QACzC,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,sBAAsB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IACzF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wBAAwB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,KAAoB,CAAC;AAC9B,CAAC;AAED,SAAS,cAAc,CAAC,KAAc,EAAE,KAAa;IACnD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,gBAAgB,CAAC,CAAC,CAAC;IACnJ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0BAA0B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC,CAAC;IAChE,OAAO;QACL,IAAI;QACJ,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,sBAAsB,CAAC;QAC5D,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,sBAAsB,CAAC;QAC1D,IAAI,EAAE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,sBAAsB,CAAC;QAC1D,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,sBAAsB,CAAC;QAChE,WAAW,EAAE,aAAa,CAAC,KAAK,EAAE,aAAa,EAAE,sBAAsB,CAAC;QACxE,KAAK,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,sBAAsB,CAAC;QAC5D,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,sBAAsB,CAAC;KACjE,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,KAAa;IAClD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,uBAAuB,KAAK,sBAAsB,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,uBAAuB,KAAK,GAAG,CAAC,CAAC;IACxE,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,uBAAuB,KAAK,cAAc,CAAC,CAAC;IACnG,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,uBAAuB,KAAK,GAAG,CAAC,CAAC;IAC/E,OAAO;QACL,EAAE,EAAE,EAAuB;QAC3B,UAAU,EAAE,UAAuC;QACnD,MAAM;QACN,UAAU,EAAE,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,uBAAuB,KAAK,GAAG,CAAC;QAC/E,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,uBAAuB,KAAK,GAAG,CAAC;QACzE,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAiC;KACvH,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa;IAClD,MAAM,KAAK,GACT,KAAK,CAAC,KAAK,CAAC,kCAAkC,CAAC;QAC/C,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC;QAC3C,KAAK,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,6CAA6C,IAAI,IAAI,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc,EAAE,KAAa,EAAE,MAAM,GAAG,KAAK;IACzE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,wCAAwC,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,GAAG,oBAAoB,CAAC,CAAC;QACvD,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACtE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc,EAAE,KAAa;IACxD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,+BAA+B,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAEhE,IAAI,OAAO,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QACxD,OAAO;YACL,QAAQ;YACR,OAAO,EAAE,MAAM;YACf,GAAG;YACH,SAAS,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC,SAAS;YAC3H,OAAO,EAAE,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,uBAAuB,EAAE,IAAI,CAAC;YAC7E,SAAS,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;YAChF,QAAQ,EAAE,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,wBAAwB,CAAC;YAC1E,oBAAoB,EAAE,mBAAmB,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,oCAAoC,CAAC;YAC7G,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;SAC3D,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CAAC,0CAA0C,OAAO,wCAAwC,CAAC,CAAC;IAC7G,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,SAAS,EAAE,eAAe,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QAClC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ;QACR,OAAO;QACP,OAAO;QACP,IAAI;QACJ,GAAG,EAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAC9D,GAAG,EAAE,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC;QACjE,SAAS,EAAE,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;QAChF,QAAQ,EAAE,oBAAoB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,wBAAwB,CAAC;QAC1E,oBAAoB,EAAE,mBAAmB,CAAC,IAAI,CAAC,sBAAsB,CAAC,EAAE,oCAAoC,CAAC;QAC7G,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;KAC3D,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,KAAK,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,iDAAiD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC;IACrG,CAAC;IAED,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC;IAEvD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,MAAM,GAAmB;QAC7B,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,qBAAqB,CAAC;QAC1E,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,qBAAqB,CAA8B;QACrG,OAAO,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;QACvF,IAAI,EAAE,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE;QAC3H,GAAG,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAClF,GAAG,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;QAClF,QAAQ,EAAE,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,8BAA8B,CAAC;QAC1F,aAAa,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;QAChH,UAAU,EAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS;KACxG,CAAC;IAEF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,WAAW,GAAwB;QACvC,QAAQ,EAAE,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,0BAA0B,CAAC;QACpF,WAAW,EAAE,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,0BAA0B,CAAC;KAC3F,CAAC;IAEF,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACpD,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAkB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3E,MAAM,WAAW,GAA4B,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC,aAAa,CAA2B;QAC/C,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,kBAAkB,GAAmC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC7F,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAkC;QAC7D,CAAC,CAAC,SAAS,CAAC;IAEd,MAAM,UAAU,GAAuB,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE/G,OAAO;QACL,YAAY,EAAE,KAAK;QACnB,aAAa,EAAE,aAAsC;QACrD,IAAI;QACJ,KAAK;QACL,SAAS;QACT,WAAW;QACX,MAAM;QACN,WAAW;QACX,OAAO;QACP,MAAM;QACN,WAAW;QACX,kBAAkB;QAClB,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAa;IAChD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,MAAM,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,kDAAkD,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IACpE,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC;IACpE,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,EAAE,eAAe,EAAE,eAAe,CAAC,CAAC;IAC5E,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,eAAe,CAAC,CAAC;IAExD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IACnC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,OAAO,GAAgB;QAC3B,WAAW,EAAE,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,uBAAuB,CAAC;QAC9E,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,YAAY,EAAE,uBAAuB,CAAC;QAC5E,SAAS,EAAE,aAAa,CAAC,UAAU,EAAE,WAAW,EAAE,uBAAuB,CAAC;QAC1E,KAAK,EAAE,aAAa,CAAC,UAAU,EAAE,OAAO,EAAE,uBAAuB,CAAC;QAClE,OAAO,EAAE,aAAa,CAAC,UAAU,EAAE,SAAS,EAAE,uBAAuB,CAAC;QACtE,gBAAgB,EAAE,cAAc,CAAC,UAAU,EAAE,kBAAkB,EAAE,uBAAuB,CAAC;QACzF,mBAAmB,EAAE,cAAc,CAAC,UAAU,EAAE,qBAAqB,EAAE,uBAAuB,CAAC;QAC/F,IAAI,EAAE,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAC;KAC/D,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,aAAa,CAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IACnG,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,YAAY,CAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IAChG,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,WAAW,CAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7F,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,OAAO,CAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,SAAS,CAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IACvF,MAAM,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,aAAa,CAAwB,CAAC,CAAC,CAAC,SAAS,CAAC;IACjH,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,iBAAiB,CAA2B,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhI,OAAO;QACL,YAAY,EAAE,MAAM;QACpB,aAAa,EAAE,aAAsC;QACrD,IAAI;QACJ,SAAS;QACT,SAAS;QACT,SAAS;QACT,OAAO;QACP,WAAW;QACX,UAAU;QACV,SAAS;QACT,KAAK;QACL,OAAO;QACP,WAAW;QACX,eAAe;KAChB,CAAC;AACJ,CAAC"}
@@ -6,7 +6,7 @@ Useful merged work can receive public credit through [MCP Observatory Contributo
6
6
 
7
7
  Rough agentic contribution ideas are welcome too. Use the [Agentic Contributor Outreach](./agentic-contributor-outreach.md) playbook or open an `Agentic contribution idea` issue when a task is promising but not ready for a focused PR.
8
8
 
9
- The core standard is a [tool-call receipt](./tool-call-receipts.md): public source, safe startup command, run artifact, attack-sim evidence, SARIF when useful, and a clear capability envelope showing what the run could not access. The public map is the [MCP Receipt Graph](./receipt-graph.md).
9
+ The core standard is a [tool-call receipt](./tool-call-receipts.md): public source, safe startup command, run artifact, attack-sim evidence, SARIF when useful, and a clear capability envelope showing what the run could not access. The public map is the [MCP Risk Graph](./receipt-graph.md).
10
10
 
11
11
  ## Task 1: Add MCP Observatory CI To A Repo
12
12
 
@@ -12,6 +12,7 @@ These surfaces are intentionally public because they increase trust, integration
12
12
  - safe `attack-sim` checks
13
13
  - `audit --profile nsa-mcp`
14
14
  - public artifact schemas
15
+ - public MCP risk graph JSON/Markdown/HTML generation
15
16
  - JSON, Markdown, HTML, JUnit, and SARIF reporters
16
17
  - GitHub Actions setup and generated CI workflows
17
18
  - public health scores and badges
@@ -27,6 +28,7 @@ These surfaces should remain private unless there is a deliberate licensing or c
27
28
  - private telemetry exports, raw events, emails, hostnames, and account identifiers
28
29
  - company/account intelligence derived from telemetry or usage patterns
29
30
  - proprietary Safety Index ranking weights, confidence models, and lead prioritization
31
+ - private fleet graph workflows, commercial scoring weights, and buyer-specific prioritization
30
32
  - commercial report templates beyond sanitized public samples
31
33
  - buyer-specific evidence packs, remediation notes, and procurement packets
32
34
  - hosted dashboard workflows, retention logic, and fleet visibility
@@ -60,6 +62,7 @@ Keep private:
60
62
  The paid product should package the same evidence into decisions a buyer can act on:
61
63
 
62
64
  - private MCP dependency inventory
65
+ - private MCP fleet risk graph
63
66
  - safe-mode attack simulation evidence pack
64
67
  - CI/SARIF gate rollout
65
68
  - drift and schema-change review
@@ -67,6 +70,12 @@ The paid product should package the same evidence into decisions a buyer can act
67
70
  - executive summary and procurement-friendly due diligence packet
68
71
  - recurring review cadence for production MCP fleets
69
72
 
73
+ Pricing anchors:
74
+
75
+ - `$2,500+` narrow readiness review
76
+ - `$15,000+` attack simulation evidence pack
77
+ - `$50,000+` private fleet risk graph pilot
78
+
70
79
  The open source project proves the method. The commercial product saves a team time, reduces review risk, and gives leadership a defensible record.
71
80
 
72
81
  ## Handling Clones
@@ -80,4 +89,3 @@ Assume visible CLI features can be copied. The moat should come from:
80
89
  - building trust with security teams through careful privacy and non-destructive defaults
81
90
 
82
91
  Do not respond to clones by hiding the core OSS loop. Respond by making the public evidence standard more useful and keeping the commercial intelligence layer private.
83
-
@@ -70,6 +70,8 @@ Replace the link target with the merged proof card or PR for your contribution.
70
70
  | Contributor | Role | Public Proof |
71
71
  | --- | --- | --- |
72
72
  | [William Weishuhn](https://github.com/KryptosAI) | Founding maintainer, CI Integrator, SARIF Fixer, Docs/Agent Prompt Contributor | [All Contributors entry](../CONTRIBUTORS.md), [Code Scanning demo](./code-scanning-demo.md), [Agent Task Pack](./agent-tasks.md) |
73
+ | [Lee Sang Hoon](https://github.com/leemeo3) | Target Verifier, Safety Index Contributor, Infrastructure Contributor | [PR #144](https://github.com/KryptosAI/mcp-observatory/pull/144), [PR #159](https://github.com/KryptosAI/mcp-observatory/pull/159), [PR #188](https://github.com/KryptosAI/mcp-observatory/pull/188) |
74
+ | [Tanish Kumar](https://github.com/tanishxdev) | Code Contributor (Legacy CLI deprecation warnings) | [PR #187](https://github.com/KryptosAI/mcp-observatory/pull/187) |
73
75
 
74
76
  External contributors are added after a merged PR, an accepted target artifact, or maintainer-confirmed upstream adoption.
75
77