easyeda-mcp-pro 0.10.0 → 0.12.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.
@@ -17,12 +17,12 @@ export declare const EasyedaApiMethodSchema: z.ZodEnum<{
17
17
  "export.pickPlace": "export.pickPlace";
18
18
  "export.pdf": "export.pdf";
19
19
  "export.netlist": "export.netlist";
20
+ "pcb.modifyComponent": "pcb.modifyComponent";
20
21
  "pcb.placeComponent": "pcb.placeComponent";
21
22
  "pcb.addTrack": "pcb.addTrack";
22
23
  "pcb.addVia": "pcb.addVia";
23
24
  "pcb.addZone": "pcb.addZone";
24
25
  "pcb.deleteComponent": "pcb.deleteComponent";
25
- "pcb.modifyComponent": "pcb.modifyComponent";
26
26
  "schematic.searchDevice": "schematic.searchDevice";
27
27
  "schematic.listComponents": "schematic.listComponents";
28
28
  "schematic.getNetDetail": "schematic.getNetDetail";
@@ -3,35 +3,35 @@ export const PROFILE_DEFINITIONS = {
3
3
  name: 'core',
4
4
  label: 'Core',
5
5
  description: 'High-confidence tools: diagnostics, EasyEDA API inventory, schematic, BOM, DRC/ERC, board layers/stackup, Gerber export',
6
- approxToolCount: '40',
6
+ approxToolCount: '41',
7
7
  isDefault: true,
8
8
  },
9
9
  pro: {
10
10
  name: 'pro',
11
11
  label: 'Pro',
12
12
  description: 'Adds pick-and-place, PDF, netlist export for manufacturing workflows',
13
- approxToolCount: '43',
13
+ approxToolCount: '44',
14
14
  isDefault: false,
15
15
  },
16
16
  full: {
17
17
  name: 'full',
18
18
  label: 'Full',
19
19
  description: 'Adds controlled documented EasyEDA API method calls for full runtime control without raw JavaScript execution',
20
- approxToolCount: '50',
20
+ approxToolCount: '53',
21
21
  isDefault: false,
22
22
  },
23
23
  dev: {
24
24
  name: 'dev',
25
25
  label: 'Dev',
26
26
  description: 'Adds diagnostics probes for bridge methods and live component runtime shape inspection',
27
- approxToolCount: '54',
27
+ approxToolCount: '57',
28
28
  isDefault: false,
29
29
  },
30
30
  experimental: {
31
31
  name: 'experimental',
32
32
  label: 'Experimental',
33
33
  description: 'MCP Apps, Tasks, simulation, autorouter, AI action plans',
34
- approxToolCount: '52',
34
+ approxToolCount: '55',
35
35
  isDefault: false,
36
36
  },
37
37
  };
@@ -1 +1 @@
1
- export declare const SERVER_VERSION = "0.10.0";
1
+ export declare const SERVER_VERSION = "0.12.0";
@@ -1,2 +1,2 @@
1
- export const SERVER_VERSION = '0.10.0'; // x-release-please-version
1
+ export const SERVER_VERSION = '0.12.0'; // x-release-please-version
2
2
  //# sourceMappingURL=version.js.map
@@ -0,0 +1,2 @@
1
+ export { planComponentGroupPlacement, planRoutePath } from './planner.js';
2
+ export type * from './types.js';
@@ -0,0 +1,2 @@
1
+ export { planComponentGroupPlacement, planRoutePath } from './planner.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/pcb-layout/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { ComponentGroupPlacementInput, ComponentGroupPlacementPlan, RoutePathInput, RoutePathPlan } from './types.js';
2
+ /** Create a preview/apply plan for placing a group of components on a grid. */
3
+ export declare function planComponentGroupPlacement(input: ComponentGroupPlacementInput): ComponentGroupPlacementPlan;
4
+ /** Create a preview/apply plan for a constrained routed path. */
5
+ export declare function planRoutePath(input: RoutePathInput): RoutePathPlan;
@@ -0,0 +1,222 @@
1
+ import { createHash } from 'node:crypto';
2
+ function txId(prefix, payload) {
3
+ return `${prefix}_${createHash('sha256').update(JSON.stringify(payload)).digest('hex').slice(0, 16)}`;
4
+ }
5
+ function issue(code, severity, message, remediationHint, details) {
6
+ return { code, severity, message, remediationHint, details };
7
+ }
8
+ function rectsOverlap(a, b) {
9
+ return (a.x < b.x + b.widthMm &&
10
+ a.x + a.widthMm > b.x &&
11
+ a.y < b.y + b.heightMm &&
12
+ a.y + a.heightMm > b.y);
13
+ }
14
+ function pointInsideRect(point, rect) {
15
+ return (point.x >= rect.x &&
16
+ point.x <= rect.x + rect.widthMm &&
17
+ point.y >= rect.y &&
18
+ point.y <= rect.y + rect.heightMm);
19
+ }
20
+ function rectInsideBoard(rect, board) {
21
+ return (rect.x >= 0 &&
22
+ rect.y >= 0 &&
23
+ rect.x + rect.widthMm <= board.widthMm &&
24
+ rect.y + rect.heightMm <= board.heightMm);
25
+ }
26
+ function pointInsideBoard(point, board) {
27
+ return point.x >= 0 && point.y >= 0 && point.x <= board.widthMm && point.y <= board.heightMm;
28
+ }
29
+ function inflate(rect, amount) {
30
+ return {
31
+ x: rect.x - amount,
32
+ y: rect.y - amount,
33
+ widthMm: rect.widthMm + amount * 2,
34
+ heightMm: rect.heightMm + amount * 2,
35
+ name: rect.name,
36
+ };
37
+ }
38
+ function distance(a, b) {
39
+ return Math.hypot(a.x - b.x, a.y - b.y);
40
+ }
41
+ function routeLength(points) {
42
+ let total = 0;
43
+ for (let index = 1; index < points.length; index += 1) {
44
+ const previous = points[index - 1];
45
+ const current = points[index];
46
+ if (!previous || !current)
47
+ continue;
48
+ total += distance(previous, current);
49
+ }
50
+ return total;
51
+ }
52
+ function segmentIntersectsRect(a, b, rect) {
53
+ if (pointInsideRect(a, rect) || pointInsideRect(b, rect))
54
+ return true;
55
+ const steps = Math.max(2, Math.ceil(distance(a, b) / 0.5));
56
+ for (let i = 1; i < steps; i += 1) {
57
+ const t = i / steps;
58
+ const point = { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };
59
+ if (pointInsideRect(point, rect))
60
+ return true;
61
+ }
62
+ return false;
63
+ }
64
+ function invalidBoard(board) {
65
+ return board.widthMm <= 0 || board.heightMm <= 0;
66
+ }
67
+ /** Create a preview/apply plan for placing a group of components on a grid. */
68
+ export function planComponentGroupPlacement(input) {
69
+ const mode = input.mode ?? 'preview';
70
+ const layer = input.layer ?? 1;
71
+ const columns = Math.max(1, input.columns ?? input.components.length);
72
+ const spacing = input.spacingMm ?? 1.5;
73
+ const minSpacing = input.minSpacingMm ?? 0.25;
74
+ const issues = [];
75
+ const placements = [];
76
+ if (invalidBoard(input.board)) {
77
+ issues.push(issue('LAYOUT_INVALID_BOARD', 'error', 'Board dimensions must be positive', 'Provide valid board width and height before planning placement.', { board: input.board }));
78
+ }
79
+ input.components.forEach((component, index) => {
80
+ if (!component.ref || component.widthMm <= 0 || component.heightMm <= 0) {
81
+ issues.push(issue('LAYOUT_INVALID_COMPONENT', 'error', `Component ${component.ref || index} has invalid dimensions or reference`, 'Provide component ref, width, and height in millimeters.', { component }));
82
+ return;
83
+ }
84
+ const col = index % columns;
85
+ const row = Math.floor(index / columns);
86
+ const x = input.anchor.x + col * (component.widthMm + spacing);
87
+ const y = input.anchor.y + row * (component.heightMm + spacing);
88
+ const bbox = {
89
+ x: x - component.widthMm / 2,
90
+ y: y - component.heightMm / 2,
91
+ widthMm: component.widthMm,
92
+ heightMm: component.heightMm,
93
+ name: component.ref,
94
+ };
95
+ const placement = {
96
+ ref: component.ref,
97
+ primitiveId: component.primitiveId,
98
+ footprint: component.footprint,
99
+ x,
100
+ y,
101
+ rotation: component.rotation ?? 0,
102
+ layer,
103
+ widthMm: component.widthMm,
104
+ heightMm: component.heightMm,
105
+ bbox,
106
+ };
107
+ if (!rectInsideBoard(bbox, input.board)) {
108
+ issues.push(issue('LAYOUT_COMPONENT_OUTSIDE_BOARD', 'error', `Component ${component.ref} would be outside the board`, 'Move the anchor, reduce spacing, increase board size, or reduce the component group size.', { ref: component.ref, bbox, board: input.board }));
109
+ }
110
+ for (const keepout of input.keepouts ?? []) {
111
+ if (rectsOverlap(bbox, keepout)) {
112
+ issues.push(issue('LAYOUT_COMPONENT_IN_KEEPOUT', 'error', `Component ${component.ref} overlaps keepout ${keepout.name ?? ''}`.trim(), 'Move the component group away from keepout regions.', { ref: component.ref, keepout, bbox }));
113
+ }
114
+ }
115
+ for (const previous of placements) {
116
+ if (rectsOverlap(inflate(previous.bbox, minSpacing), inflate(bbox, minSpacing))) {
117
+ issues.push(issue('LAYOUT_COMPONENT_COLLISION', 'error', `Component ${component.ref} collides with ${previous.ref}`, 'Increase placement spacing or change grid columns/anchor.', { ref: component.ref, otherRef: previous.ref, minSpacingMm: minSpacing }));
118
+ }
119
+ }
120
+ placements.push(placement);
121
+ });
122
+ const operations = placements.map((placement) => ({
123
+ method: placement.primitiveId ? 'pcb.modifyComponent' : 'pcb.placeComponent',
124
+ params: placement.primitiveId
125
+ ? {
126
+ primitiveId: placement.primitiveId,
127
+ property: {
128
+ x: placement.x,
129
+ y: placement.y,
130
+ rotation: placement.rotation,
131
+ layer: placement.layer,
132
+ },
133
+ }
134
+ : {
135
+ footprint: placement.footprint ?? placement.ref,
136
+ x: placement.x,
137
+ y: placement.y,
138
+ rotation: placement.rotation,
139
+ layer: placement.layer,
140
+ },
141
+ }));
142
+ const blocked = issues.some((i) => i.severity === 'error');
143
+ return {
144
+ transactionId: txId('layout_place', { input, placements }),
145
+ projectId: input.projectId ?? '',
146
+ mode,
147
+ applied: false,
148
+ blocked,
149
+ placements,
150
+ operations,
151
+ issues,
152
+ summary: blocked
153
+ ? `Placement plan blocked by ${issues.filter((i) => i.severity === 'error').length} error(s).`
154
+ : `Placement plan ready for ${placements.length} component(s).`,
155
+ };
156
+ }
157
+ /** Create a preview/apply plan for a constrained routed path. */
158
+ export function planRoutePath(input) {
159
+ const mode = input.mode ?? 'preview';
160
+ const issues = [];
161
+ const length = routeLength(input.waypoints);
162
+ if (input.waypoints.length < 2) {
163
+ issues.push(issue('LAYOUT_PATH_TOO_SHORT', 'error', 'Route path requires at least two waypoints', 'Provide start and end waypoints for the route path.', { waypointCount: input.waypoints.length }));
164
+ }
165
+ if (input.widthMm <= 0) {
166
+ issues.push(issue('LAYOUT_TRACE_WIDTH_TOO_SMALL', 'error', 'Trace width must be positive', 'Provide a positive trace width in millimeters.', { widthMm: input.widthMm }));
167
+ }
168
+ else if (input.minWidthMm !== undefined && input.widthMm < input.minWidthMm) {
169
+ issues.push(issue('LAYOUT_TRACE_WIDTH_TOO_SMALL', 'error', `Trace width ${input.widthMm}mm is below required ${input.minWidthMm}mm`, 'Increase trace width or lower the constraint only after electrical/thermal review.', { widthMm: input.widthMm, minWidthMm: input.minWidthMm }));
170
+ }
171
+ if (input.maxLengthMm !== undefined && length > input.maxLengthMm) {
172
+ issues.push(issue('LAYOUT_PATH_TOO_LONG', 'warning', `Route length ${Number(length.toFixed(3))}mm exceeds maximum ${input.maxLengthMm}mm`, 'Shorten the route or relax the maximum length constraint if acceptable.', { pathLengthMm: length, maxLengthMm: input.maxLengthMm }));
173
+ }
174
+ if (input.board) {
175
+ for (const point of input.waypoints) {
176
+ if (!pointInsideBoard(point, input.board)) {
177
+ issues.push(issue('LAYOUT_PATH_OUTSIDE_BOARD', 'error', 'Route waypoint is outside the board', 'Move all route waypoints inside the board outline.', { point, board: input.board }));
178
+ }
179
+ }
180
+ }
181
+ for (let i = 1; i < input.waypoints.length; i += 1) {
182
+ const a = input.waypoints[i - 1];
183
+ const b = input.waypoints[i];
184
+ if (!a || !b)
185
+ continue;
186
+ for (const keepout of input.keepouts ?? []) {
187
+ if (segmentIntersectsRect(a, b, keepout)) {
188
+ issues.push(issue('LAYOUT_PATH_IN_KEEPOUT', 'error', `Route crosses keepout ${keepout.name ?? ''}`.trim(), 'Add waypoints around keepout regions or change the routing layer.', { keepout, segment: [a, b] }));
189
+ }
190
+ }
191
+ }
192
+ const flatPoints = input.waypoints.flatMap((point) => [point.x, point.y]);
193
+ const operations = [
194
+ {
195
+ method: 'pcb.addTrack',
196
+ params: {
197
+ points: flatPoints,
198
+ layer: input.layer,
199
+ width: input.widthMm,
200
+ netName: input.netName,
201
+ },
202
+ },
203
+ ];
204
+ const blocked = issues.some((i) => i.severity === 'error');
205
+ return {
206
+ transactionId: txId('layout_route', { input, length }),
207
+ projectId: input.projectId ?? '',
208
+ mode,
209
+ applied: false,
210
+ blocked,
211
+ netName: input.netName,
212
+ layer: input.layer,
213
+ widthMm: input.widthMm,
214
+ pathLengthMm: Number(length.toFixed(4)),
215
+ operations,
216
+ issues,
217
+ summary: blocked
218
+ ? `Route plan blocked by ${issues.filter((i) => i.severity === 'error').length} error(s).`
219
+ : `Route plan ready for net ${input.netName}; length ${Number(length.toFixed(3))}mm.`,
220
+ };
221
+ }
222
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../src/pcb-layout/planner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /** High-level PCB layout planning types. */
2
+ export type LayoutExecutionMode = 'preview' | 'apply';
3
+ export type LayoutSeverity = 'error' | 'warning' | 'info';
4
+ export type LayoutIssueCode = 'LAYOUT_COMPONENT_OUTSIDE_BOARD' | 'LAYOUT_COMPONENT_IN_KEEPOUT' | 'LAYOUT_COMPONENT_COLLISION' | 'LAYOUT_INVALID_COMPONENT' | 'LAYOUT_INVALID_BOARD' | 'LAYOUT_PATH_TOO_SHORT' | 'LAYOUT_PATH_OUTSIDE_BOARD' | 'LAYOUT_PATH_IN_KEEPOUT' | 'LAYOUT_PATH_TOO_LONG' | 'LAYOUT_TRACE_WIDTH_TOO_SMALL';
5
+ export interface PointMm {
6
+ x: number;
7
+ y: number;
8
+ }
9
+ export interface BoardBox {
10
+ widthMm: number;
11
+ heightMm: number;
12
+ }
13
+ export interface RectMm {
14
+ x: number;
15
+ y: number;
16
+ widthMm: number;
17
+ heightMm: number;
18
+ name?: string;
19
+ }
20
+ export interface LayoutIssue {
21
+ code: LayoutIssueCode;
22
+ severity: LayoutSeverity;
23
+ message: string;
24
+ remediationHint: string;
25
+ details?: Record<string, unknown>;
26
+ }
27
+ export interface ComponentPlacementInput {
28
+ ref: string;
29
+ primitiveId?: string;
30
+ footprint?: string;
31
+ widthMm: number;
32
+ heightMm: number;
33
+ rotation?: number;
34
+ fixed?: boolean;
35
+ }
36
+ export interface ComponentGroupPlacementInput {
37
+ projectId?: string;
38
+ mode?: LayoutExecutionMode;
39
+ board: BoardBox;
40
+ anchor: PointMm;
41
+ columns?: number;
42
+ spacingMm?: number;
43
+ layer?: number;
44
+ minSpacingMm?: number;
45
+ components: ComponentPlacementInput[];
46
+ keepouts?: RectMm[];
47
+ confirmWrite?: boolean;
48
+ }
49
+ export interface PlannedComponentPlacement {
50
+ ref: string;
51
+ primitiveId?: string;
52
+ footprint?: string;
53
+ x: number;
54
+ y: number;
55
+ rotation: number;
56
+ layer: number;
57
+ widthMm: number;
58
+ heightMm: number;
59
+ bbox: RectMm;
60
+ }
61
+ export interface ComponentGroupPlacementPlan {
62
+ transactionId: string;
63
+ projectId: string;
64
+ mode: LayoutExecutionMode;
65
+ applied: boolean;
66
+ blocked: boolean;
67
+ placements: PlannedComponentPlacement[];
68
+ operations: Array<{
69
+ method: string;
70
+ params: Record<string, unknown>;
71
+ }>;
72
+ issues: LayoutIssue[];
73
+ summary: string;
74
+ }
75
+ export interface RoutePathInput {
76
+ projectId?: string;
77
+ mode?: LayoutExecutionMode;
78
+ board?: BoardBox;
79
+ netName: string;
80
+ layer: number;
81
+ widthMm: number;
82
+ waypoints: PointMm[];
83
+ keepouts?: RectMm[];
84
+ maxLengthMm?: number;
85
+ minWidthMm?: number;
86
+ confirmWrite?: boolean;
87
+ }
88
+ export interface RoutePathPlan {
89
+ transactionId: string;
90
+ projectId: string;
91
+ mode: LayoutExecutionMode;
92
+ applied: boolean;
93
+ blocked: boolean;
94
+ netName: string;
95
+ layer: number;
96
+ widthMm: number;
97
+ pathLengthMm: number;
98
+ operations: Array<{
99
+ method: string;
100
+ params: Record<string, unknown>;
101
+ }>;
102
+ issues: LayoutIssue[];
103
+ summary: string;
104
+ }
@@ -0,0 +1,3 @@
1
+ /** High-level PCB layout planning types. */
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pcb-layout/types.ts"],"names":[],"mappings":"AAAA,4CAA4C"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Power-tree current budget and thermal analysis.
3
+ *
4
+ * @module
5
+ */
6
+ import type { PowerTreeInput, PowerTreeReport } from './types.js';
7
+ /** Analyze current budget, regulator dissipation, protection, and bulk capacitance. */
8
+ export declare function analyzePowerTree(input: PowerTreeInput): PowerTreeReport;