@oaslananka/kicad-protocol-schemas 1.1.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/LICENSE +21 -0
- package/README.md +46 -0
- package/dist/index.d.ts +272 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +185 -0
- package/dist/index.js.map +1 -0
- package/package.json +45 -0
- package/schemas/bom-netlist-summary.schema.json +148 -0
- package/schemas/compatibility-manifest.schema.json +88 -0
- package/schemas/extension-active-context.schema.json +113 -0
- package/schemas/kicad-mcp-server-info.schema.json +385 -0
- package/schemas/mcp-server-health.schema.json +90 -0
- package/schemas/mcp-tool-capability.schema.json +81 -0
- package/schemas/mcp-tool-discovery.schema.json +102 -0
- package/schemas/normalized-diagnostic.schema.json +69 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Osman Aslan
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# KiCad Protocol Schemas
|
|
2
|
+
|
|
3
|
+
`@oaslananka/kicad-protocol-schemas` owns the product-neutral JSON Schema
|
|
4
|
+
contracts shared by the KiCad Studio extension and `kicad-mcp-pro`.
|
|
5
|
+
|
|
6
|
+
The package has no VS Code API dependency and no Python server runtime
|
|
7
|
+
dependency. TypeScript consumers can import the schema registry and Ajv-backed
|
|
8
|
+
validators. Python contract tests read the same `schemas/*.schema.json` files
|
|
9
|
+
directly with `jsonschema`.
|
|
10
|
+
|
|
11
|
+
## Included Contracts
|
|
12
|
+
|
|
13
|
+
- MCP tool discovery payloads returned by `tools/list`.
|
|
14
|
+
- Tool capability metadata advertised by `kicad-mcp-pro`.
|
|
15
|
+
- Extension-to-MCP active context payloads.
|
|
16
|
+
- Normalized DRC/ERC diagnostic records.
|
|
17
|
+
- BOM and netlist summary payloads.
|
|
18
|
+
- MCP server health/version payloads.
|
|
19
|
+
- Compatibility manifests for cross-product schema support.
|
|
20
|
+
- The existing KiCad MCP server-info contract.
|
|
21
|
+
|
|
22
|
+
## Schema versioning policy
|
|
23
|
+
|
|
24
|
+
Every schema file carries an `x-kicad-studio-kit.schemaVersion` value using
|
|
25
|
+
`MAJOR.MINOR.PATCH`. Breaking schema changes require a major version bump.
|
|
26
|
+
Backward-compatible field additions use a minor version bump, and documentation
|
|
27
|
+
or constraint-only fixes use a patch version bump.
|
|
28
|
+
|
|
29
|
+
The package version follows the highest schema major in the package. A consumer
|
|
30
|
+
that supports schema major `1` may accept any `1.x.y` payload after validation.
|
|
31
|
+
Consumers must reject unknown major versions unless the caller explicitly opts
|
|
32
|
+
into compatibility fallback behavior.
|
|
33
|
+
|
|
34
|
+
## Migration policy
|
|
35
|
+
|
|
36
|
+
Schema migrations are additive first. When a field must be renamed or removed,
|
|
37
|
+
the old field remains accepted for one minor line and the new field is documented
|
|
38
|
+
in this README and in the affected schema description. The next major version
|
|
39
|
+
may remove the deprecated field after extension and MCP contract tests both pass
|
|
40
|
+
against the replacement payload.
|
|
41
|
+
|
|
42
|
+
Run the schema package checks from the repository root:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
corepack pnpm run check:protocol-schemas
|
|
46
|
+
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
export declare const KICAD_PROTOCOL_SCHEMA_VERSION = "1.0.0";
|
|
2
|
+
export declare const PROTOCOL_SCHEMA_NAMES: readonly ["bom-netlist-summary", "compatibility-manifest", "extension-active-context", "kicad-mcp-server-info", "mcp-server-health", "mcp-tool-capability", "mcp-tool-discovery", "normalized-diagnostic"];
|
|
3
|
+
export type ProtocolSchemaName = (typeof PROTOCOL_SCHEMA_NAMES)[number];
|
|
4
|
+
export interface ProtocolJsonSchema {
|
|
5
|
+
$schema: string;
|
|
6
|
+
$id: string;
|
|
7
|
+
title: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
type: string;
|
|
10
|
+
[key: string]: unknown;
|
|
11
|
+
}
|
|
12
|
+
export interface ProtocolValidationError {
|
|
13
|
+
path: string;
|
|
14
|
+
message: string;
|
|
15
|
+
keyword: string;
|
|
16
|
+
}
|
|
17
|
+
export interface ProtocolValidationResult<T = unknown> {
|
|
18
|
+
schemaName: ProtocolSchemaName;
|
|
19
|
+
schemaVersion: string;
|
|
20
|
+
valid: boolean;
|
|
21
|
+
errors: ProtocolValidationError[];
|
|
22
|
+
data?: T;
|
|
23
|
+
}
|
|
24
|
+
export interface McpServerInfoCompatibilityRange {
|
|
25
|
+
kicadStudio: {
|
|
26
|
+
required: string;
|
|
27
|
+
recommended: string;
|
|
28
|
+
testedAgainst: string;
|
|
29
|
+
};
|
|
30
|
+
kicadMcpPro: {
|
|
31
|
+
required: string;
|
|
32
|
+
testedAgainst: string;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export type McpOperatingMode = "readonly" | "write" | "manufacturing" | "experimental";
|
|
36
|
+
export interface McpToolOperatingModeAvailability {
|
|
37
|
+
available: boolean;
|
|
38
|
+
requiredMode: McpOperatingMode;
|
|
39
|
+
reason: string | null;
|
|
40
|
+
}
|
|
41
|
+
export interface McpServerInfoContract {
|
|
42
|
+
schemaVersion: string;
|
|
43
|
+
server: "kicad-mcp-pro";
|
|
44
|
+
description?: string;
|
|
45
|
+
localizedDescriptions?: Record<string, string>;
|
|
46
|
+
version: string;
|
|
47
|
+
mcpProtocolVersion: string;
|
|
48
|
+
toolSchemaVersion: string;
|
|
49
|
+
compatibilityRange: McpServerInfoCompatibilityRange;
|
|
50
|
+
transport: {
|
|
51
|
+
type: "stdio" | "streamable-http" | "sse";
|
|
52
|
+
streamableHttp: boolean;
|
|
53
|
+
statelessHttp: boolean;
|
|
54
|
+
legacySse: boolean;
|
|
55
|
+
authRequired: boolean;
|
|
56
|
+
endpoint: string | null;
|
|
57
|
+
};
|
|
58
|
+
kicad: {
|
|
59
|
+
cliFound: boolean;
|
|
60
|
+
cliPath: string;
|
|
61
|
+
cliVersion: string | null;
|
|
62
|
+
ipcAvailable: boolean;
|
|
63
|
+
ipcVersion: string | null;
|
|
64
|
+
ipcApiVersion: string | null;
|
|
65
|
+
ipcMajorVersion: number | null;
|
|
66
|
+
ipcEndpointSource: "config" | "environment" | "default";
|
|
67
|
+
livePcbContext: boolean;
|
|
68
|
+
liveSchematicContext: boolean;
|
|
69
|
+
ipcDocumentLoaded: boolean;
|
|
70
|
+
};
|
|
71
|
+
operatingMode: {
|
|
72
|
+
active: McpOperatingMode;
|
|
73
|
+
default: McpOperatingMode;
|
|
74
|
+
available: McpOperatingMode[];
|
|
75
|
+
experimentalEnabled: boolean;
|
|
76
|
+
toolAvailability: Record<string, McpToolOperatingModeAvailability>;
|
|
77
|
+
};
|
|
78
|
+
capabilities: {
|
|
79
|
+
fileBackedDrc: boolean;
|
|
80
|
+
fileBackedErc: boolean;
|
|
81
|
+
fileBackedExports: boolean;
|
|
82
|
+
livePcbRead: boolean;
|
|
83
|
+
livePcbWrite: boolean;
|
|
84
|
+
liveSchematicRead: boolean;
|
|
85
|
+
liveSchematicWrite: boolean;
|
|
86
|
+
liveEditingTools: Record<string, {
|
|
87
|
+
available: boolean;
|
|
88
|
+
backend: "kicad-ipc" | "hybrid-file-ipc";
|
|
89
|
+
reason: string | null;
|
|
90
|
+
minimumKiCadMajor: number;
|
|
91
|
+
}>;
|
|
92
|
+
chatgptConnectorCompatible: boolean;
|
|
93
|
+
cliExports: {
|
|
94
|
+
ipc2581: boolean;
|
|
95
|
+
odb: boolean;
|
|
96
|
+
svg: boolean;
|
|
97
|
+
dxf: boolean;
|
|
98
|
+
step: boolean;
|
|
99
|
+
stepz?: boolean;
|
|
100
|
+
xao?: boolean;
|
|
101
|
+
render: boolean;
|
|
102
|
+
spiceNetlist: boolean;
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
diagnostics: string[];
|
|
106
|
+
}
|
|
107
|
+
export interface McpToolCapabilityMetadata {
|
|
108
|
+
schemaVersion: string;
|
|
109
|
+
name: string;
|
|
110
|
+
profiles: string[];
|
|
111
|
+
tier: "read" | "write" | "export" | "publish" | "human_only";
|
|
112
|
+
runtime: "none" | "kicad_cli" | "kicad_ipc" | "ngspice" | "freerouting" | "docker";
|
|
113
|
+
supports_dry_run: boolean;
|
|
114
|
+
human_gate_required: boolean;
|
|
115
|
+
description: string;
|
|
116
|
+
verification_level: "verified" | "experimental" | "planned";
|
|
117
|
+
inputSchema?: Record<string, unknown>;
|
|
118
|
+
annotations?: Record<string, unknown>;
|
|
119
|
+
}
|
|
120
|
+
export interface McpToolDiscoveryResponse {
|
|
121
|
+
schemaVersion?: string;
|
|
122
|
+
_meta?: Record<string, unknown>;
|
|
123
|
+
nextCursor?: string;
|
|
124
|
+
tools: Array<{
|
|
125
|
+
name: string;
|
|
126
|
+
description?: string;
|
|
127
|
+
inputSchema?: Record<string, unknown>;
|
|
128
|
+
annotations?: Record<string, unknown>;
|
|
129
|
+
}>;
|
|
130
|
+
resources?: Array<{
|
|
131
|
+
uri?: string;
|
|
132
|
+
name?: string;
|
|
133
|
+
description?: string;
|
|
134
|
+
}>;
|
|
135
|
+
prompts?: Array<{
|
|
136
|
+
name: string;
|
|
137
|
+
description?: string;
|
|
138
|
+
}>;
|
|
139
|
+
[key: string]: unknown;
|
|
140
|
+
}
|
|
141
|
+
export interface ExtensionActiveContextPayload {
|
|
142
|
+
schemaVersion?: string;
|
|
143
|
+
activeFile?: string | null;
|
|
144
|
+
fileType: "schematic" | "pcb" | "other";
|
|
145
|
+
drcErrors: string[];
|
|
146
|
+
projectId?: string;
|
|
147
|
+
projectName?: string;
|
|
148
|
+
projectRoot?: string;
|
|
149
|
+
projectFile?: string;
|
|
150
|
+
selectedNet?: string;
|
|
151
|
+
selectedReference?: string;
|
|
152
|
+
activeVariant?: string;
|
|
153
|
+
activeSheetPath?: string;
|
|
154
|
+
visibleLayers?: string[];
|
|
155
|
+
kicadVersion?: string;
|
|
156
|
+
designBlocks?: string[];
|
|
157
|
+
cursorPosition?: {
|
|
158
|
+
line: number;
|
|
159
|
+
character: number;
|
|
160
|
+
};
|
|
161
|
+
selectedArea?: {
|
|
162
|
+
x1: number;
|
|
163
|
+
y1: number;
|
|
164
|
+
x2: number;
|
|
165
|
+
y2: number;
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
export interface NormalizedDiagnostic {
|
|
169
|
+
schemaVersion: string;
|
|
170
|
+
source: "drc" | "erc" | "syntax";
|
|
171
|
+
severity: "error" | "warning" | "info";
|
|
172
|
+
message: string;
|
|
173
|
+
path: string;
|
|
174
|
+
code?: string;
|
|
175
|
+
line?: number;
|
|
176
|
+
column?: number;
|
|
177
|
+
reference?: string;
|
|
178
|
+
net?: string;
|
|
179
|
+
capturedAt: string;
|
|
180
|
+
}
|
|
181
|
+
export interface BomNetlistSummary {
|
|
182
|
+
schemaVersion: string;
|
|
183
|
+
project: {
|
|
184
|
+
name: string;
|
|
185
|
+
rootPath?: string;
|
|
186
|
+
projectFile?: string;
|
|
187
|
+
};
|
|
188
|
+
bom: {
|
|
189
|
+
totalComponents: number;
|
|
190
|
+
uniqueValues: number;
|
|
191
|
+
entries: Array<{
|
|
192
|
+
references: string[];
|
|
193
|
+
value: string;
|
|
194
|
+
footprint: string;
|
|
195
|
+
quantity: number;
|
|
196
|
+
mpn?: string;
|
|
197
|
+
manufacturer?: string;
|
|
198
|
+
lcsc?: string;
|
|
199
|
+
description?: string;
|
|
200
|
+
dnp?: boolean;
|
|
201
|
+
}>;
|
|
202
|
+
};
|
|
203
|
+
netlist: {
|
|
204
|
+
netCount: number;
|
|
205
|
+
nodes: Array<{
|
|
206
|
+
netName: string;
|
|
207
|
+
pins: Array<{
|
|
208
|
+
reference: string;
|
|
209
|
+
pin: string;
|
|
210
|
+
}>;
|
|
211
|
+
}>;
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
export interface McpServerHealth {
|
|
215
|
+
schemaVersion: string;
|
|
216
|
+
server: "kicad-mcp-pro";
|
|
217
|
+
version: string;
|
|
218
|
+
status: "ok" | "degraded" | "error";
|
|
219
|
+
mcpProtocolVersion: string;
|
|
220
|
+
toolSchemaVersion: string;
|
|
221
|
+
transport: {
|
|
222
|
+
type: "stdio" | "streamable-http" | "sse";
|
|
223
|
+
endpoint: string | null;
|
|
224
|
+
};
|
|
225
|
+
kicad: {
|
|
226
|
+
cliFound: boolean;
|
|
227
|
+
cliVersion: string | null;
|
|
228
|
+
ipcAvailable: boolean;
|
|
229
|
+
};
|
|
230
|
+
diagnostics: string[];
|
|
231
|
+
}
|
|
232
|
+
export interface CompatibilityManifest {
|
|
233
|
+
schemaVersion: string;
|
|
234
|
+
products: Record<string, {
|
|
235
|
+
version: string;
|
|
236
|
+
supportedSchemaMajors: number[];
|
|
237
|
+
}>;
|
|
238
|
+
schemas: Record<string, {
|
|
239
|
+
current: string;
|
|
240
|
+
compatibility: string;
|
|
241
|
+
}>;
|
|
242
|
+
policy: {
|
|
243
|
+
breakingChanges: "major";
|
|
244
|
+
additiveChanges: "minor";
|
|
245
|
+
documentationChanges: "patch";
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
export declare const PROTOCOL_SCHEMA_DEFINITIONS: Readonly<Record<ProtocolSchemaName, ProtocolJsonSchema>>;
|
|
249
|
+
export declare class ProtocolSchemaValidator {
|
|
250
|
+
private readonly schemas;
|
|
251
|
+
private readonly ajv;
|
|
252
|
+
private readonly validators;
|
|
253
|
+
constructor(schemas?: Readonly<Record<ProtocolSchemaName, ProtocolJsonSchema>>);
|
|
254
|
+
validate<T = unknown>(schemaName: ProtocolSchemaName, payload: unknown): ProtocolValidationResult<T>;
|
|
255
|
+
private validatorFor;
|
|
256
|
+
}
|
|
257
|
+
export declare function getProtocolSchemaValidator(): ProtocolSchemaValidator;
|
|
258
|
+
export declare function validateProtocolPayload<T = unknown>(schemaName: ProtocolSchemaName, payload: unknown): ProtocolValidationResult<T>;
|
|
259
|
+
export declare function validateMcpServerInfoContract(payload: unknown): ProtocolValidationResult<McpServerInfoContract>;
|
|
260
|
+
export declare function isMcpServerInfoContract(payload: unknown): payload is McpServerInfoContract;
|
|
261
|
+
export declare function validateMcpToolDiscovery(payload: unknown): ProtocolValidationResult<McpToolDiscoveryResponse>;
|
|
262
|
+
export declare function validateToolCapabilityMetadata(payload: unknown): ProtocolValidationResult<McpToolCapabilityMetadata>;
|
|
263
|
+
export declare function validateExtensionActiveContextPayload(payload: unknown): ProtocolValidationResult<ExtensionActiveContextPayload>;
|
|
264
|
+
export declare function validateNormalizedDiagnostic(payload: unknown): ProtocolValidationResult<NormalizedDiagnostic>;
|
|
265
|
+
export declare function validateBomNetlistSummary(payload: unknown): ProtocolValidationResult<BomNetlistSummary>;
|
|
266
|
+
export declare function validateMcpServerHealth(payload: unknown): ProtocolValidationResult<McpServerHealth>;
|
|
267
|
+
export declare function validateCompatibilityManifest(payload: unknown): ProtocolValidationResult<CompatibilityManifest>;
|
|
268
|
+
export declare function protocolSchemasRoot(startDir?: string): string;
|
|
269
|
+
export declare function protocolSchemaPath(schemaName: ProtocolSchemaName, startDir?: string): string;
|
|
270
|
+
export declare function findProtocolSchemasPackageRoot(startDir?: string): string;
|
|
271
|
+
export declare function protocolSchemaVersion(schemaName: ProtocolSchemaName): string;
|
|
272
|
+
//# 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,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.ProtocolSchemaValidator = exports.PROTOCOL_SCHEMA_DEFINITIONS = exports.PROTOCOL_SCHEMA_NAMES = exports.KICAD_PROTOCOL_SCHEMA_VERSION = void 0;
|
|
7
|
+
exports.getProtocolSchemaValidator = getProtocolSchemaValidator;
|
|
8
|
+
exports.validateProtocolPayload = validateProtocolPayload;
|
|
9
|
+
exports.validateMcpServerInfoContract = validateMcpServerInfoContract;
|
|
10
|
+
exports.isMcpServerInfoContract = isMcpServerInfoContract;
|
|
11
|
+
exports.validateMcpToolDiscovery = validateMcpToolDiscovery;
|
|
12
|
+
exports.validateToolCapabilityMetadata = validateToolCapabilityMetadata;
|
|
13
|
+
exports.validateExtensionActiveContextPayload = validateExtensionActiveContextPayload;
|
|
14
|
+
exports.validateNormalizedDiagnostic = validateNormalizedDiagnostic;
|
|
15
|
+
exports.validateBomNetlistSummary = validateBomNetlistSummary;
|
|
16
|
+
exports.validateMcpServerHealth = validateMcpServerHealth;
|
|
17
|
+
exports.validateCompatibilityManifest = validateCompatibilityManifest;
|
|
18
|
+
exports.protocolSchemasRoot = protocolSchemasRoot;
|
|
19
|
+
exports.protocolSchemaPath = protocolSchemaPath;
|
|
20
|
+
exports.findProtocolSchemasPackageRoot = findProtocolSchemasPackageRoot;
|
|
21
|
+
exports.protocolSchemaVersion = protocolSchemaVersion;
|
|
22
|
+
const _2020_1 = __importDefault(require("ajv/dist/2020"));
|
|
23
|
+
const node_fs_1 = require("node:fs");
|
|
24
|
+
const node_path_1 = require("node:path");
|
|
25
|
+
exports.KICAD_PROTOCOL_SCHEMA_VERSION = "1.0.0";
|
|
26
|
+
exports.PROTOCOL_SCHEMA_NAMES = [
|
|
27
|
+
"bom-netlist-summary",
|
|
28
|
+
"compatibility-manifest",
|
|
29
|
+
"extension-active-context",
|
|
30
|
+
"kicad-mcp-server-info",
|
|
31
|
+
"mcp-server-health",
|
|
32
|
+
"mcp-tool-capability",
|
|
33
|
+
"mcp-tool-discovery",
|
|
34
|
+
"normalized-diagnostic",
|
|
35
|
+
];
|
|
36
|
+
exports.PROTOCOL_SCHEMA_DEFINITIONS = Object.freeze({
|
|
37
|
+
"bom-netlist-summary": require("../schemas/bom-netlist-summary.schema.json"),
|
|
38
|
+
"compatibility-manifest": require("../schemas/compatibility-manifest.schema.json"),
|
|
39
|
+
"extension-active-context": require("../schemas/extension-active-context.schema.json"),
|
|
40
|
+
"kicad-mcp-server-info": require("../schemas/kicad-mcp-server-info.schema.json"),
|
|
41
|
+
"mcp-server-health": require("../schemas/mcp-server-health.schema.json"),
|
|
42
|
+
"mcp-tool-capability": require("../schemas/mcp-tool-capability.schema.json"),
|
|
43
|
+
"mcp-tool-discovery": require("../schemas/mcp-tool-discovery.schema.json"),
|
|
44
|
+
"normalized-diagnostic": require("../schemas/normalized-diagnostic.schema.json"),
|
|
45
|
+
});
|
|
46
|
+
class ProtocolSchemaValidator {
|
|
47
|
+
schemas;
|
|
48
|
+
ajv;
|
|
49
|
+
validators = new Map();
|
|
50
|
+
constructor(schemas = exports.PROTOCOL_SCHEMA_DEFINITIONS) {
|
|
51
|
+
this.schemas = schemas;
|
|
52
|
+
this.ajv = new _2020_1.default({ allErrors: true, strict: false });
|
|
53
|
+
for (const schemaName of exports.PROTOCOL_SCHEMA_NAMES) {
|
|
54
|
+
const schema = this.schemas[schemaName];
|
|
55
|
+
this.ajv.addSchema(schema, schema.$id);
|
|
56
|
+
this.validators.set(schemaName, this.ajv.compile(schema));
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
validate(schemaName, payload) {
|
|
60
|
+
const validate = this.validatorFor(schemaName);
|
|
61
|
+
const schemaVersion = protocolSchemaVersion(schemaName);
|
|
62
|
+
const schemaValid = Boolean(validate(payload));
|
|
63
|
+
const versionError = schemaValid
|
|
64
|
+
? validatePayloadSchemaMajor(schemaName, schemaVersion, payload)
|
|
65
|
+
: undefined;
|
|
66
|
+
const valid = schemaValid && versionError === undefined;
|
|
67
|
+
const result = {
|
|
68
|
+
schemaName,
|
|
69
|
+
schemaVersion,
|
|
70
|
+
valid,
|
|
71
|
+
errors: valid
|
|
72
|
+
? []
|
|
73
|
+
: (versionError ?? normalizeAjvErrors(validate.errors)),
|
|
74
|
+
};
|
|
75
|
+
if (valid) {
|
|
76
|
+
result.data = payload;
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
79
|
+
}
|
|
80
|
+
validatorFor(schemaName) {
|
|
81
|
+
const validate = this.validators.get(schemaName);
|
|
82
|
+
if (!validate) {
|
|
83
|
+
throw new Error(`Unknown protocol schema: ${schemaName}`);
|
|
84
|
+
}
|
|
85
|
+
return validate;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.ProtocolSchemaValidator = ProtocolSchemaValidator;
|
|
89
|
+
let defaultValidator;
|
|
90
|
+
function getProtocolSchemaValidator() {
|
|
91
|
+
defaultValidator ??= new ProtocolSchemaValidator();
|
|
92
|
+
return defaultValidator;
|
|
93
|
+
}
|
|
94
|
+
function validateProtocolPayload(schemaName, payload) {
|
|
95
|
+
return getProtocolSchemaValidator().validate(schemaName, payload);
|
|
96
|
+
}
|
|
97
|
+
function validateMcpServerInfoContract(payload) {
|
|
98
|
+
return validateProtocolPayload("kicad-mcp-server-info", payload);
|
|
99
|
+
}
|
|
100
|
+
function isMcpServerInfoContract(payload) {
|
|
101
|
+
return validateMcpServerInfoContract(payload).valid;
|
|
102
|
+
}
|
|
103
|
+
function validateMcpToolDiscovery(payload) {
|
|
104
|
+
return validateProtocolPayload("mcp-tool-discovery", payload);
|
|
105
|
+
}
|
|
106
|
+
function validateToolCapabilityMetadata(payload) {
|
|
107
|
+
return validateProtocolPayload("mcp-tool-capability", payload);
|
|
108
|
+
}
|
|
109
|
+
function validateExtensionActiveContextPayload(payload) {
|
|
110
|
+
return validateProtocolPayload("extension-active-context", payload);
|
|
111
|
+
}
|
|
112
|
+
function validateNormalizedDiagnostic(payload) {
|
|
113
|
+
return validateProtocolPayload("normalized-diagnostic", payload);
|
|
114
|
+
}
|
|
115
|
+
function validateBomNetlistSummary(payload) {
|
|
116
|
+
return validateProtocolPayload("bom-netlist-summary", payload);
|
|
117
|
+
}
|
|
118
|
+
function validateMcpServerHealth(payload) {
|
|
119
|
+
return validateProtocolPayload("mcp-server-health", payload);
|
|
120
|
+
}
|
|
121
|
+
function validateCompatibilityManifest(payload) {
|
|
122
|
+
return validateProtocolPayload("compatibility-manifest", payload);
|
|
123
|
+
}
|
|
124
|
+
function protocolSchemasRoot(startDir = __dirname) {
|
|
125
|
+
return (0, node_path_1.join)(findProtocolSchemasPackageRoot(startDir), "schemas");
|
|
126
|
+
}
|
|
127
|
+
function protocolSchemaPath(schemaName, startDir = __dirname) {
|
|
128
|
+
return (0, node_path_1.join)(protocolSchemasRoot(startDir), `${schemaName}.schema.json`);
|
|
129
|
+
}
|
|
130
|
+
function findProtocolSchemasPackageRoot(startDir = __dirname) {
|
|
131
|
+
let current = (0, node_path_1.resolve)(startDir);
|
|
132
|
+
for (;;) {
|
|
133
|
+
const packageJsonPath = (0, node_path_1.join)(current, "package.json");
|
|
134
|
+
if ((0, node_fs_1.existsSync)(packageJsonPath) && (0, node_fs_1.existsSync)((0, node_path_1.join)(current, "schemas"))) {
|
|
135
|
+
return current;
|
|
136
|
+
}
|
|
137
|
+
const parent = (0, node_path_1.dirname)(current);
|
|
138
|
+
if (parent === current) {
|
|
139
|
+
throw new Error(`Could not find @oaslananka/kicad-protocol-schemas package root from ${startDir}`);
|
|
140
|
+
}
|
|
141
|
+
current = parent;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
function protocolSchemaVersion(schemaName) {
|
|
145
|
+
const metadata = exports.PROTOCOL_SCHEMA_DEFINITIONS[schemaName]["x-kicad-studio-kit"];
|
|
146
|
+
if (isRecord(metadata) && typeof metadata["schemaVersion"] === "string") {
|
|
147
|
+
return metadata["schemaVersion"];
|
|
148
|
+
}
|
|
149
|
+
return exports.KICAD_PROTOCOL_SCHEMA_VERSION;
|
|
150
|
+
}
|
|
151
|
+
function normalizeAjvErrors(errors) {
|
|
152
|
+
return (errors ?? []).map((error) => ({
|
|
153
|
+
path: error.instancePath || "/",
|
|
154
|
+
message: error.message ?? "schema validation failed",
|
|
155
|
+
keyword: error.keyword,
|
|
156
|
+
}));
|
|
157
|
+
}
|
|
158
|
+
function validatePayloadSchemaMajor(schemaName, supportedVersion, payload) {
|
|
159
|
+
if (!isRecord(payload) || typeof payload["schemaVersion"] !== "string") {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
const payloadMajor = majorVersion(payload["schemaVersion"]);
|
|
163
|
+
const supportedMajor = majorVersion(supportedVersion);
|
|
164
|
+
if (payloadMajor === undefined || supportedMajor === undefined) {
|
|
165
|
+
return undefined;
|
|
166
|
+
}
|
|
167
|
+
if (payloadMajor === supportedMajor) {
|
|
168
|
+
return undefined;
|
|
169
|
+
}
|
|
170
|
+
return [
|
|
171
|
+
{
|
|
172
|
+
path: "/schemaVersion",
|
|
173
|
+
message: `${schemaName} payload declares unsupported schema major ${payloadMajor}; expected ${supportedMajor}.x`,
|
|
174
|
+
keyword: "schemaMajor",
|
|
175
|
+
},
|
|
176
|
+
];
|
|
177
|
+
}
|
|
178
|
+
function majorVersion(version) {
|
|
179
|
+
const match = /^([0-9]+)\.[0-9]+\.[0-9]+$/.exec(version);
|
|
180
|
+
return match ? Number(match[1]) : undefined;
|
|
181
|
+
}
|
|
182
|
+
function isRecord(value) {
|
|
183
|
+
return typeof value === "object" && value !== null;
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oaslananka/kicad-protocol-schemas",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Shared versioned protocol schemas and validators for KiCad Studio Kit extension/MCP compatibility contracts.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/oaslananka/kicad-mcp"
|
|
9
|
+
},
|
|
10
|
+
"main": "dist/index.js",
|
|
11
|
+
"types": "dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"default": "./dist/index.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist/",
|
|
20
|
+
"schemas/",
|
|
21
|
+
"README.md"
|
|
22
|
+
],
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=24.11.0 <25",
|
|
25
|
+
"pnpm": ">=11.0.0 <12"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"ajv": "8.20.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "24.12.3",
|
|
32
|
+
"prettier": "3.8.3",
|
|
33
|
+
"typescript": "6.0.3"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"format": "prettier --ignore-unknown --no-error-on-unmatched-pattern --write package.json README.md tsconfig*.json scripts/*.cjs src/**/*.ts test/**/*.ts schemas/**/*.json",
|
|
37
|
+
"format:check": "prettier --ignore-unknown --no-error-on-unmatched-pattern --check package.json README.md tsconfig*.json scripts/*.cjs src/**/*.ts test/**/*.ts schemas/**/*.json",
|
|
38
|
+
"lint": "tsc -p tsconfig.json --noEmit",
|
|
39
|
+
"typecheck": "tsc -p tsconfig.json --noEmit && pnpm run build && tsc -p tsconfig.test.json --noEmit",
|
|
40
|
+
"build": "tsc -p tsconfig.json",
|
|
41
|
+
"build:test": "tsc -p tsconfig.test.json",
|
|
42
|
+
"test": "pnpm run build && pnpm run build:test && node scripts/run-tests.cjs",
|
|
43
|
+
"check": "pnpm run format:check && pnpm run lint && pnpm run typecheck && pnpm run test && pnpm run build"
|
|
44
|
+
}
|
|
45
|
+
}
|