dsh-eda-mcp 0.7.0 → 0.7.2
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/CHANGELOG.md +90 -0
- package/CONTRIBUTING.md +0 -1
- package/README.md +13 -6
- package/README.zh.md +13 -6
- package/docs/release.md +1 -1
- package/docs/schematic-workflow.md +152 -0
- package/docs/tools.md +13 -9
- package/dsh-eda-bridge-extension-0.4.0.zip +0 -0
- package/jlc-extension/api-bridge.js +1 -1
- package/lib/bridge.mjs +440 -133
- package/lib/client.js +17 -1
- package/lib/index.js +278 -8
- package/package.json +3 -4
- package/src/bridge/index.ts +436 -112
- package/src/bridge/workflow-guide.ts +45 -0
- package/src/client/EdaMcpSettingsCard.tsx +10 -1
- package/src/client/locales.ts +4 -0
- package/src/guidance.ts +4 -0
- package/src/index.ts +45 -2
- package/src/routes.ts +3 -1
- package/src/skills-content.ts +164 -0
- package/src/skills.ts +91 -0
- package/test/skills.test.ts +62 -0
- package/dsh-eda-bridge-extension.zip +0 -0
package/lib/client.js
CHANGED
|
@@ -1278,12 +1278,24 @@ function EdaMcpSettingsCard(props) {
|
|
|
1278
1278
|
}
|
|
1279
1279
|
}
|
|
1280
1280
|
),
|
|
1281
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
1282
|
+
BooleanField,
|
|
1283
|
+
{
|
|
1284
|
+
label: t("settings.allowAutoLayoutRouting"),
|
|
1285
|
+
hint: t("settings.allowAutoLayoutRoutingHint"),
|
|
1286
|
+
value: draft.allowAutoLayoutRouting ?? false,
|
|
1287
|
+
disabled,
|
|
1288
|
+
onChange: (value) => {
|
|
1289
|
+
clearNotice();
|
|
1290
|
+
update("allowAutoLayoutRouting", value);
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1293
|
+
),
|
|
1281
1294
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { style: { ...hintStyle, margin: "8px 0 0" }, children: t("settings.portLabel") }),
|
|
1282
1295
|
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Field, { label: t("settings.downloadExtension"), hint: t("settings.installHint"), children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
1283
1296
|
"a",
|
|
1284
1297
|
{
|
|
1285
1298
|
href: "/api/dsh-eda-mcp/extension.zip",
|
|
1286
|
-
download: "dsh-eda-bridge-extension.zip",
|
|
1287
1299
|
style: { ...secondaryButtonStyle, textDecoration: "none", display: "inline-flex", width: "fit-content" },
|
|
1288
1300
|
children: t("settings.downloadExtension")
|
|
1289
1301
|
}
|
|
@@ -1447,6 +1459,8 @@ var zh = {
|
|
|
1447
1459
|
"settings.toolCallTimeoutMsHint": "\u5355\u6B21 EDA API \u8C03\u7528\u8D85\u65F6\uFF0C\u9ED8\u8BA4 60000\u3002",
|
|
1448
1460
|
"settings.allowRawApi": "\u5141\u8BB8\u901A\u7528 eda_api_call",
|
|
1449
1461
|
"settings.allowRawApiHint": "\u5F00\u542F\u540E MCP \u5DE5\u5177 eda_api_call \u53EF\u8C03\u7528\u767D\u540D\u5355\u5185\u7684 JLCEDA \u6269\u5C55 API\u3002",
|
|
1462
|
+
"settings.allowAutoLayoutRouting": "\u5141\u8BB8\u539F\u7406\u56FE\u81EA\u52A8\u5E03\u5C40 / \u81EA\u52A8\u5E03\u7EBF",
|
|
1463
|
+
"settings.allowAutoLayoutRoutingHint": "\u9ED8\u8BA4\u5173\u95ED\uFF1A\u5E03\u5C40\u6309\u6805\u683C\u624B\u5DE5\u6446\u653E\u3001\u5E03\u7EBF\u624B\u5DE5\u8D70\uFF0C\u7248\u9762\u68C0\u67E5\u7528\u5BFC\u51FA\u56FE\u7247\u81EA\u884C\u8BC6\u522B\u3002\u5F00\u542F\u540E eda_auto_layout / eda_auto_route \u624D\u53EF\u7528\u3002",
|
|
1450
1464
|
"settings.edaExecutable": "\u5609\u7ACB\u521BEDA \u53EF\u6267\u884C\u6587\u4EF6\uFF08\u53EF\u9009\uFF09",
|
|
1451
1465
|
"settings.edaExecutableHint": "\u7559\u7A7A\u5373\u81EA\u52A8\u63A2\u6D4B\uFF1A\u73AF\u5883\u53D8\u91CF \u2192 \u6CE8\u518C\u8868\u767B\u8BB0\u7684\u6587\u4EF6\u5173\u8054 \u2192 \u5E38\u89C1\u5B89\u88C5\u76EE\u5F55 \u2192 PATH\u3002\u53EA\u6709\u81EA\u52A8\u63A2\u6D4B\u5931\u8D25\u65F6\u624D\u9700\u8981\u586B\u5B8C\u6574\u8DEF\u5F84\u3002",
|
|
1452
1466
|
"settings.save": "\u4FDD\u5B58",
|
|
@@ -1478,6 +1492,8 @@ var en = {
|
|
|
1478
1492
|
"settings.allowRawApi": "Allow generic eda_api_call",
|
|
1479
1493
|
"settings.allowRawApiHint": "Expose the eda_api_call tool restricted to the allow-listed JLCEDA APIs.",
|
|
1480
1494
|
"settings.edaExecutable": "JLCEDA Pro executable (optional)",
|
|
1495
|
+
"settings.allowAutoLayoutRouting": "Allow automatic schematic layout / routing",
|
|
1496
|
+
"settings.allowAutoLayoutRoutingHint": "Off by default: place parts on the grid, route by hand, and check the sheet by exporting an image. Only with this on do eda_auto_layout / eda_auto_route run.",
|
|
1481
1497
|
"settings.edaExecutableHint": "Leave empty to auto-detect: environment variable, the file-association command in the registry, conventional install directories, then PATH. Set a full path only when auto-detection fails.",
|
|
1482
1498
|
"settings.save": "Save",
|
|
1483
1499
|
"settings.saving": "Saving\u2026",
|
package/lib/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import * as mcpClient from "@deepseek-ai/dsh-mcp-client";
|
|
3
3
|
import z from "@deepseek-ai/schemastery";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
|
+
import { existsSync as existsSync2, readFileSync } from "node:fs";
|
|
5
6
|
import { dirname as dirname2 } from "node:path";
|
|
6
7
|
|
|
7
8
|
// src/guidance.ts
|
|
@@ -18,11 +19,252 @@ var EDA_MCP_GUIDANCE = [
|
|
|
18
19
|
"\u7ED8\u5236\u7EC6\u8282\uFF1A\u539F\u7406\u56FE\u5750\u6807\u4E3A 0.01inch\uFF0C\u539F\u70B9\u5728 A4 \u56FE\u6846\u5DE6\u4E0B\u89D2\uFF0Cy \u5411\u4E0A\uFF0C\u56FE\u6846 x 0~1170\u3001y 0~825\uFF0C\u6807\u9898\u680F x 460~1160\u3001y 10~190 \u5FC5\u987B\u907F\u8BA9\uFF08\u5148 eda_get_page_info\uFF09\u3002PCB \u5750\u6807\u4E3A mil\u3002\u677F\u6846\u7528 pcb_draw_board_outline\uFF08\u677F\u6846\u5C42 11 \u7684\u4E00\u6761 pcb_PrimitivePolyline\uFF0C\u7EBF\u5BBD\u9ED8\u8BA4 10mil\uFF09\uFF1B\u533A\u57DF\u53EA\u80FD\u7528\u94DC\u5C42 top/bottom/\u5185\u5C42(15\u201344)/MULTI(12)\u3002",
|
|
19
20
|
"\u957F\u4EFB\u52A1\uFF1Aeda_pcb_auto_route \u9ED8\u8BA4\u5F02\u6B65\u542F\u52A8\uFF08EDA \u81EA\u5DF1\u663E\u793A\u8FDB\u5EA6\u6761\uFF09\uFF0C\u5FC5\u987B\u7528 eda_pcb_job_status \u8F6E\u8BE2 running \u76F4\u5230 false\uFF0C\u4E0D\u8981\u52A0\u5927\u8D85\u65F6\uFF1Beda_pcb_clear_routing \u540C\u7406\uFF08\u65E7\u6269\u5C55\u81EA\u52A8\u5206\u6279\uFF0C\u6309 done \u7EE7\u7EED\u8C03\u7528\uFF09\u3002",
|
|
20
21
|
"\u539F\u7406\u56FE API\uFF08sch_Net.*\u3001\u7F51\u8868\u5BFC\u51FA\uFF09\u53EA\u4F5C\u7528\u4E8E\u5F53\u524D\u6D3B\u52A8\u6587\u6863\uFF1A\u8FD4\u56DE\u7A7A\u65F6\u5148\u7528 eda_get_active_document \u67E5\u3001eda_open_document \u5207\u5230\u539F\u7406\u56FE\u9875\u3002",
|
|
22
|
+
'\u539F\u7406\u56FE\u5DE5\u4F5C\u89C4\u8303\uFF08\u9ED8\u8BA4\u624B\u5DE5\uFF0C\u7981\u6B62\u4E3A\u7701\u4E8B\u7528\u81EA\u52A8\u5E03\u5C40/\u81EA\u52A8\u5E03\u7EBF\uFF09\uFF1A\u6309 10 \u5355\u4F4D\u6805\u683C\u5BF9\u9F50\uFF1B\u4FE1\u53F7\u5DE6\u2192\u53F3\u3001\u7535\u6E90\u5728\u4E0A\u3001\u5730\u5728\u4E0B\uFF1B\u5668\u4EF6\u95F4\u7559 \u226520 \u5355\u4F4D\u8D70\u7EBF\u4E0E\u6807\u7B7E\u7A7A\u95F4\uFF1B\u5148 eda_get_page_info \u770B\u5B89\u5168\u533A\u518D\u6446\u4F4D\uFF1B\u6446\u5B8C\u7528 eda_get_components \u68C0\u67E5\u5305\u56F4\u76D2\u4E0D\u91CD\u53E0\u3002eda_auto_layout / eda_auto_route \u9ED8\u8BA4\u88AB\u62D2\u7EDD\uFF08\u9700 force:true \u4E14\u8BBE\u7F6E\u91CC\u653E\u884C\uFF09\uFF0C\u4EC5\u5F53\u7528\u6237\u660E\u786E\u8981\u6C42\u65F6\u4F7F\u7528\uFF1B\u7248\u9762\u68C0\u67E5\u4F18\u5148"\u5BFC\u51FA\u56FE\u7247\u81EA\u884C\u8BC6\u522B"\u800C\u4E0D\u662F\u8BA9 EDA \u91CD\u6392\u3002',
|
|
23
|
+
'\u8DE8\u533A\u57DF\u540C\u540D\u7F51\u7EDC\u5FC5\u987B\u7528 eda_place_net_port / \u7F51\u7EDC\u6807\u7B7E\uFF1Aeda_draw_wire \u7684 net \u53EA\u5BF9\u60AC\u7A7A\u5BFC\u7EBF\u6709\u6548\uFF0C\u5BFC\u7EBF\u4E00\u65E6\u63A5\u89E6\u5F15\u811A\uFF0CEDA \u4F1A\u6309\u8FDE\u901A\u6027\u91CD\u7B97\u7F51\u7EDC\u540D\uFF08\u5B9E\u6D4B TESTNET \u88AB\u5E76\u5165 LED_A\uFF09\uFF0C\u6240\u4EE5"\u540C\u540D\u5BFC\u7EBF = \u540C\u540D\u7F51\u7EDC"\u4E0D\u6210\u7ACB\u3002',
|
|
24
|
+
"\u7F51\u7EDC\u6807\u7B7E\uFF1Aeda_place_net_label \u5148\u771F\u5B9E\u8C03 createNetLabel\uFF0C\u8BE5 API \u5728 3.2.186 \u4E0A\u4E0D\u54CD\u5E94 \u2192 \u63A2\u6D4B\u7ED3\u8BBA\u6309\u4F1A\u8BDD\u7F13\u5B58\u540E\u81EA\u52A8\u964D\u7EA7\u4E3A\u7EAF\u6587\u672C\u6807\u7B7E\uFF08\u65E0\u7535\u6C14\u8BED\u4E49\uFF0C\u9760 stub \u5BFC\u7EBF\u627F\u8F7D\u7F51\u7EDC\uFF09\uFF1B\u6279\u91CF\u52A1\u5FC5\u7528 eda_place_net_labels \u4E00\u6B21\u8C03\u7528\uFF0C\u4E0D\u8981\u4E32\u884C\u4E0A\u767E\u6B21\uFF08\u4F1A\u6253\u7206 run_code \u8D85\u65F6\u4E14\u6CA1\u6709\u8FDB\u5EA6\uFF09\u3002\u6807\u7B7E\u53EF\u679A\u4E3E/\u6E05\u7406\uFF1Aeda_get_net_labels + eda_delete_primitive(kind: netlabel|netport|netflag|text)\u3002",
|
|
25
|
+
"\u5F15\u811A\u8EAB\u4EFD\u7528 eda_get_pins \u4E00\u6B21\u62FF\u5168\uFF08\u542B pinName/pinNumber\uFF09\uFF0C\u4E0D\u8981\u9010\u811A\u8C03 raw sch_PrimitivePin.get\uFF1B\u539F\u7406\u56FE\u632A\u5668\u4EF6\u7528 eda_move_component\uFF08\u4FDD designator/value\uFF09\uFF0C\u4E0D\u8981\u5220\u4E86\u91CD\u653E\u3002\u5B8C\u6574\u5DE5\u4F5C\u624B\u518C\uFF1A\u8C03 eda_workflow_guide\u3002",
|
|
21
26
|
"\u8FDE\u63A5\u95EE\u9898\u5148\u8C03 eda_status\uFF1AconnectedClients=0 \u8868\u793A EDA \u672A\u8FDE\u63A5\uFF08\u786E\u8BA4 EDA \u5DF2\u6253\u5F00\u3001\u6269\u5C55\u5DF2\u5BFC\u5165\u5E76\u5F00\u542F\u300C\u5141\u8BB8\u5916\u90E8\u4EA4\u4E92\u300D\u3001\u7AEF\u53E3 39009 \u7A7A\u95F2\uFF09\uFF1BextensionVersion \u4E0E bridgeVersion \u4E0D\u4E00\u81F4\u6216\u62A5 API method not allowed \u8868\u793A\u6269\u5C55\u662F\u65E7\u7248\uFF0C\u9700\u8981\u91CD\u65B0\u5BFC\u5165 dsh-eda-bridge-extension.zip \u5E76\u91CD\u542F EDA\u3002"
|
|
22
27
|
].join("\n");
|
|
23
28
|
|
|
29
|
+
// src/skills-content.ts
|
|
30
|
+
var SKILL_PLAYBOOK_LINES = [
|
|
31
|
+
"# \u5609\u7ACB\u521BEDA \u9879\u76EE\u5168\u6D41\u7A0B\u624B\u518C\uFF08dsh-eda-mcp\uFF09",
|
|
32
|
+
"",
|
|
33
|
+
"\u8986\u76D6\u300C\u6253\u5F00/\u65B0\u5EFA\u5DE5\u7A0B \u2192 \u539F\u7406\u56FE \u2192 \u540C\u6B65\u5230 PCB \u2192 \u5E03\u5C40\u5E03\u7EBF \u2192 \u6821\u9A8C \u2192 \u51FA Gerber\u300D\u5168\u94FE\u8DEF\uFF0C",
|
|
34
|
+
"\u4EE5\u53CA\u6BCF\u4E00\u6B65\u5DF2\u7ECF\u8E29\u8FC7\u7684\u5751\u4E0E\u5904\u7F6E\u529E\u6CD5\u3002\u5DE5\u5177\u524D\u7F00\u7EDF\u4E00\u662F mcp__jlceda__\u3002",
|
|
35
|
+
"",
|
|
36
|
+
"## 0. \u9002\u7528\u8303\u56F4\u4E0E\u786C\u524D\u63D0",
|
|
37
|
+
"",
|
|
38
|
+
"- \u539F\u7406\u56FE\u5750\u6807\u5355\u4F4D 0.01 \u82F1\u5BF8\uFF0C\u539F\u70B9\u5728 A4 \u56FE\u6846\u5DE6\u4E0B\u89D2\uFF0Cy \u5411\u4E0A\uFF1B\u56FE\u6846 x 0~1170 / y 0~825\u3002",
|
|
39
|
+
"- \u6807\u9898\u680F\u5360 x 460~1160 / y 10~190\uFF0C\u5FC5\u987B\u907F\u8BA9\uFF1B\u5148 eda_get_page_info \u8BFB\u56FE\u6846\u4E0E\u5B89\u5168\u533A\u3002PCB \u5750\u6807\u5355\u4F4D mil\u3002",
|
|
40
|
+
"- \u7EDD\u5927\u591A\u6570\u539F\u7406\u56FE API \u53EA\u4F5C\u7528\u4E8E\u300C\u5F53\u524D\u6D3B\u52A8\u6587\u6863\u300D\uFF1A\u8FD4\u56DE\u7A7A\u5148 eda_get_active_document\uFF0C\u518D eda_open_document \u5207\u9875\u3002",
|
|
41
|
+
"- \u7EBF\u534F\u8BAE\u7248\u672C\u5FC5\u987B\u6865\u63A5\u4E0E\u6269\u5C55\u4E00\u81F4\uFF1Aeda_status \u7684 extensionVersions \u662F\u6BCF\u4E2A\u9875\u9762\u8FDE\u4E0A\u6765\u7684\u7248\u672C\uFF1B",
|
|
42
|
+
" \u4E0D\u4E00\u81F4\u8BF4\u660E\u88C5\u7684\u662F\u65E7\u6269\u5C55\uFF0C\u9700\u91CD\u65B0\u5BFC\u5165 dsh-eda-bridge-extension-<\u7248\u672C>.zip \u5E76\u91CD\u542F\u5E94\u7528\uFF08\u4E0D\u662F reload\uFF09\u3002",
|
|
43
|
+
"- \u9ED8\u8BA4\u7981\u6B62 eda_auto_layout / eda_auto_route\uFF08\u9700 force:true \u4E14\u8BBE\u7F6E\u91CC\u653E\u884C\uFF09\u3002",
|
|
44
|
+
" \u7248\u9762\u68C0\u67E5\u7528\u300C\u5BFC\u51FA\u56FE\u7247\u81EA\u884C\u8BC6\u522B\u300D\uFF0C\u4E0D\u8981\u8BA9 EDA \u81EA\u52A8\u91CD\u6392\u3002",
|
|
45
|
+
"",
|
|
46
|
+
"## 1. \u9879\u76EE\u5C42\uFF1A\u5217\u51FA / \u6253\u5F00 / \u65B0\u5EFA / \u4FDD\u5B58 / \u5BFC\u51FA",
|
|
47
|
+
"",
|
|
48
|
+
"- \u5217\u5DE5\u7A0B\uFF1Aeda_list_projects\u3002\u65E0\u8FC7\u6EE4\u65F6\u904D\u5386\u6240\u6709\u672C\u5730\u76EE\u5F55\u805A\u5408\uFF0C\u5B57\u6BB5 friendlyName / teamUuid / uuid\u3002",
|
|
49
|
+
" \u534A\u79BB\u7EBF\u6A21\u5F0F\u4E0B\u6BCF\u4E2A\u672C\u5730\u5DE5\u7A0B\u76EE\u5F55\u5C31\u662F\u4E00\u4E2A team\uFF0C\u5176 uuid \u5C31\u662F\u76EE\u5F55\u8DEF\u5F84\u3002",
|
|
50
|
+
"- \u6253\u5F00\u5DE5\u7A0B\uFF1Aeda_open_project({ name }) \u652F\u6301\u4E2D\u6587\u5DE5\u7A0B\u540D\uFF08\u7CBE\u786E\u4F18\u5148\uFF0C\u5176\u6B21\u5FFD\u7565\u5927\u5C0F\u5199\u5305\u542B\uFF09\u3002",
|
|
51
|
+
" \u8FD4\u56DE\u7684 opened \u662F\u300C\u5DF2\u89C2\u5BDF\u5230\u7684\u6D3B\u52A8\u5DE5\u7A0B\u300D\uFF0C\u53E6\u6709 openReturned \u53CD\u6620 API \u539F\u59CB\u5E03\u5C14\u3002",
|
|
52
|
+
"- \u65B0\u5EFA\u5DE5\u7A0B\uFF1AcreateProject \u5728\u672C\u673A\u6784\u5EFA\u4E0A\u65E0\u526F\u4F5C\u7528\uFF0C**\u7528 eda_import_project \u5BFC\u5165\u5DE5\u7A0B\u6587\u4EF6\u4EE3\u66FF**\uFF1A",
|
|
53
|
+
" eda_import_project({ path, teamUuid, friendlyName, open:true })\uFF0CteamUuid \u53D6 eda_list_teams \u7684\u76EE\u5F55\u8DEF\u5F84\u3002",
|
|
54
|
+
"- \u5BFC\u51FA\uFF1Aeda_export_project({ outPath }) \u843D\u76D8\u5E76\u8FD4\u56DE\u5B57\u8282\u6570\uFF1B\u4E0D\u7ED9 outPath \u53EA\u56DE\u5143\u6570\u636E\uFF0Cinline:true \u624D\u56DE base64\u3002",
|
|
55
|
+
"- \u4FDD\u5B58\uFF1Aeda_save_document\uFF08\u539F\u7406\u56FE\uFF09/ eda_pcb_save_document\uFF08PCB\uFF09\u3002\u5173\u5E94\u7528\u524D\u5148\u4FDD\u5B58\u3002",
|
|
56
|
+
"- \u4E0D\u53EF\u7528\uFF08\u5B9E\u6D4B\uFF09\uFF1AcreateProject / deleteProject / copyProject \u5BF9\u672C\u5730\u5DE5\u7A0B\u65E0\u6548\uFF1B",
|
|
57
|
+
" \u5220\u9664\u4E0E\u590D\u5236\u8BF7\u5728\u5E94\u7528\u5185\u5B8C\u6210\uFF0C\u590D\u5236\u4E5F\u53EF\u300C\u5BFC\u51FA + \u5BFC\u5165\u300D\u5F97\u5230\u72EC\u7ACB\u526F\u672C\u3002",
|
|
58
|
+
"",
|
|
59
|
+
"## 2. \u539F\u7406\u56FE\uFF1A\u5148\u8BFB\u6E05\u695A\u518D\u52A8\u624B",
|
|
60
|
+
"",
|
|
61
|
+
"- eda_get_active_document \u2192 \u786E\u8BA4 documentTypeName \u662F\u539F\u7406\u56FE\u9875\uFF08HOME / PCB \u90FD\u4E0D\u884C\uFF09\u3002",
|
|
62
|
+
"- eda_get_page_info \u2192 \u56FE\u6846\u3001\u6807\u9898\u680F\u3001\u5B89\u5168\u533A\uFF08main / lowerLeft\uFF09\u3002",
|
|
63
|
+
"- eda_get_components({ includeBounds:true }) \u2192 designator\u3001value\u3001x/y\u3001\u5305\u56F4\u76D2\uFF0C\u7528\u6765\u5224\u65AD\u91CD\u53E0\u3002",
|
|
64
|
+
"- eda_get_pins({ componentPrimitiveId }) \u2192 \u4E00\u6B21\u62FF\u5230 pinName / pinNumber / x / y / rotation / noConnected\uFF0C",
|
|
65
|
+
" \u4E0D\u8981\u9010\u811A\u8C03 raw sch_PrimitivePin.get\u3002",
|
|
66
|
+
"- eda_get_wires / eda_get_nets \u2192 \u73B0\u6709\u8FDE\u7EBF\u4E0E\u7F51\u7EDC\uFF1Beda_get_net_labels \u2192 \u6807\u7B7E\u3001\u7F51\u7EDC\u7AEF\u53E3\u3001\u65D7\u6807\u4E0E\u6587\u672C\u6807\u7B7E\u3002",
|
|
67
|
+
"- eda_get_project \u2192 \u5DE5\u7A0B\u7ED3\u6784\uFF08board \u2192 schematic / pcb \u7684 uuid\uFF09\uFF0C\u540E\u9762\u5207\u9875\u4E0E PCB \u540C\u6B65\u90FD\u8981\u7528\u3002",
|
|
68
|
+
"",
|
|
69
|
+
"## 3. \u539F\u7406\u56FE\uFF1A\u5E03\u5C40\u89C4\u8303",
|
|
70
|
+
"",
|
|
71
|
+
"- \u6805\u683C 10 \u5355\u4F4D\u5BF9\u9F50\uFF1B\u540C\u5757\u5185\u5668\u4EF6\u7B49\u95F4\u8DDD\uFF08\u5EFA\u8BAE \u226530 \u5355\u4F4D\uFF09\uFF0C\u5757\u95F4\u7559 \u226540 \u5355\u4F4D\u3002",
|
|
72
|
+
"- \u4FE1\u53F7\u6D41\u5DE6\u2192\u53F3\uFF1B\u7535\u6E90\u65D7\u6807\u671D\u4E0A\u3001\u5730\u65D7\u6807\u671D\u4E0B\uFF1B\u4E3B\u63A7\u5C45\u4E2D\uFF0C\u53BB\u8026\u7535\u5BB9\u8D34\u7535\u6E90\u811A\uFF08\u226420 \u5355\u4F4D\uFF09\uFF0C\u6676\u632F\u8D34\u82AF\u7247\u4E14\u5468\u56F4\u51C0\u7A7A\u3002",
|
|
73
|
+
"- \u5668\u4EF6\u4E4B\u95F4\u7559 \u226520 \u5355\u4F4D\u7528\u4E8E\u8D70\u7EBF\u4E0E\u6807\u7B7E\uFF0C\u907F\u514D\u6807\u7B7E\u538B\u4F4F\u7B26\u53F7\u6216\u5F15\u811A\u53F7\u3002",
|
|
74
|
+
"- \u5206\u533A\u7528 eda_draw_functional_box\uFF08\u865A\u7EBF\u6846 + \u6587\u672C\u6807\u6CE8\uFF09\uFF1A\u7535\u6E90 / \u4E3B\u63A7 / \u63A5\u53E3 / \u4FE1\u53F7\u5904\u7406\u3002",
|
|
75
|
+
"- \u632A\u5DF2\u6709\u5668\u4EF6\u7528 eda_move_component\uFF08\u4FDD designator/value\uFF09\uFF0C\u4E0D\u8981\u300C\u5220\u9664 + \u91CD\u653E\u300D\u3002",
|
|
76
|
+
"- \u6446\u5B8C\u4E00\u5C4F\u56DE\u8BFB eda_get_components \u68C0\u67E5\u5305\u56F4\u76D2\u76F8\u4EA4\uFF0C\u6709\u91CD\u53E0\u5148\u8C03\u5F00\u518D\u8FDE\u7EBF\u3002",
|
|
77
|
+
"- \u7248\u9762\u81EA\u67E5\uFF1A\u5BFC\u51FA\u753B\u5E03\u56FE\u7247\u4EA4\u7ED9\u6A21\u578B\u8BC6\u522B\uFF0C\u800C\u4E0D\u662F\u8BA9 EDA \u81EA\u52A8\u91CD\u6392\uFF08\u81EA\u52A8\u5E03\u5C40\u4F1A\u628A\u5206\u597D\u7684\u533A\u6253\u6563\uFF09\u3002",
|
|
78
|
+
"",
|
|
79
|
+
"## 4. \u539F\u7406\u56FE\uFF1A\u8FDE\u7EBF\u4E0E\u7F51\u7EDC",
|
|
80
|
+
"",
|
|
81
|
+
"- \u5C40\u90E8\u8FDE\u63A5\u7528 eda_draw_wire\uFF08\u76F4\u7EBF\u6216 45\xB0\uFF09\uFF0C\u4E0D\u8981\u7A7F\u8FC7\u5668\u4EF6\u7B26\u53F7\uFF0C\u4E0D\u8981\u4E0E\u5176\u5B83\u5BFC\u7EBF\u91CD\u53E0\u3002",
|
|
82
|
+
"- **\u8DE8\u533A\u57DF\u540C\u540D\u7F51\u7EDC\u5FC5\u987B\u7528 eda_place_net_port \u6216\u7F51\u7EDC\u6807\u7B7E**\uFF1Aeda_draw_wire \u7684 net \u53EA\u5BF9\u60AC\u7A7A\u5BFC\u7EBF\u6709\u6548\uFF0C",
|
|
83
|
+
" \u7AEF\u70B9\u4E00\u63A5\u89E6\u5F15\u811A\uFF0CEDA \u6309\u8FDE\u901A\u6027\u91CD\u7B97\u7F51\u7EDC\u540D\uFF08\u5B9E\u6D4B TESTNET \u88AB\u5E76\u5165 LED_A\uFF09\u3002\u300C\u4E24\u5904\u753B\u540C\u540D\u5BFC\u7EBF\u300D\u4E0D\u6210\u7ACB\u3002",
|
|
84
|
+
"- \u7F51\u7EDC\u6807\u7B7E\uFF1Aeda_place_net_label \u5148\u771F\u5B9E\u8C03 sch_PrimitiveAttribute.createNetLabel\uFF1B\u8BE5 API \u5728 3.2.186 \u4E0A\u4E0D\u54CD\u5E94\uFF0C",
|
|
85
|
+
" \u63D2\u4EF6\u6309\u4F1A\u8BDD\u7F13\u5B58\u63A2\u6D4B\u7ED3\u8BBA\u540E\u81EA\u52A8\u964D\u7EA7\u4E3A\u7EAF\u6587\u672C\u6807\u7B7E\uFF08\u65E0\u7535\u6C14\u8BED\u4E49\uFF09\uFF0C\u8FDE\u901A\u6027\u7531 stub \u5BFC\u7EBF\u627F\u62C5\u3002",
|
|
86
|
+
"- \u5F15\u811A\u4E0A\u653E\u6807\u7B7E/\u65D7\u6807\u4F18\u5148\u7528 *_at_pin \u53D8\u4F53\uFF1A\u6CBF\u5F15\u811A\u65B9\u5411\u5916\u63A8 stubLength\uFF08\u9ED8\u8BA4 20\uFF09\u518D\u653E\uFF0C\u907F\u514D\u538B\u4F4F\u7B26\u53F7\u3002",
|
|
87
|
+
"- \u5DEE\u5206\u5BF9\u5199\u6210 USB_DP / USB_DM \u4E24\u4E2A\u7F51\u7EDC\uFF0C\u4E0D\u8981\u5199 USB_DP/DM\uFF1B\u7F51\u7EDC\u540D\u53EA\u5141\u8BB8\u5B57\u6BCD\u6570\u5B57\u4E0B\u5212\u7EBF\u70B9\u52A0\u51CF\u53F7\u3002",
|
|
88
|
+
"- \u4E0D\u7528\u7684\u5F15\u811A\u6253\u672A\u8FDE\u63A5\u6807\u8BB0\uFF1Aeda_set_no_connect({ primitiveIds })\u3002",
|
|
89
|
+
"- \u5220\u9664\u56FE\u5143\uFF1Aeda_delete_primitive \u7684 kind \u652F\u6301 component / wire / text / netport / netflag / netlabel\uFF1B",
|
|
90
|
+
" \u7F51\u7EDC\u7AEF\u53E3\u4E0D\u51FA\u73B0\u5728 eda_get_components \u4E2D\uFF0C\u53EA\u80FD\u7528 eda_get_net_labels \u5BA1\u8BA1\u540E\u518D\u5220\u3002",
|
|
91
|
+
"",
|
|
92
|
+
"## 5. \u539F\u7406\u56FE\uFF1A\u6279\u91CF\u64CD\u4F5C\u4E0E\u8D85\u65F6\u63A7\u5236",
|
|
93
|
+
"",
|
|
94
|
+
"- \u6279\u91CF\u653E\u6807\u7B7E\u7528 eda_place_net_labels([{ pinPrimitiveId, net } | { x, y, net }])\uFF1A\u4E00\u6B21\u8C03\u7528\u3001\u9010\u6761 ok/error\u3001",
|
|
95
|
+
" \u8FD4\u56DE done / failed / total\u3002\u4E0D\u8981\u4E32\u884C\u4E0A\u767E\u6B21\uFF08\u4F1A\u6253\u7206\u8C03\u7528\u8D85\u65F6\u4E14\u6CA1\u6709\u8FDB\u5EA6\u53EF\u67E5\uFF09\u3002",
|
|
96
|
+
"- \u6279\u91CF\u672A\u8FDE\u63A5\u6807\u8BB0\u7528 eda_set_no_connect({ primitiveIds })\uFF0C\u5185\u90E8\u5E76\u53D1 8\u3002",
|
|
97
|
+
"- \u5355\u6B21\u8C03\u7528\u5EFA\u8BAE \u226420 \u4E2A\u53D8\u66F4\uFF0C\u4E2D\u95F4\u5939\u4E00\u6B21\u8BFB\u53D6\uFF08eda_get_net_labels / eda_get_components\uFF09\u4F5C\u4E3A\u8FDB\u5EA6\u951A\u70B9\uFF1B",
|
|
98
|
+
" \u8D85\u65F6\u540E\u51ED\u951A\u70B9\u77E5\u9053\u5B8C\u6210\u5230\u54EA\uFF0C\u800C\u4E0D\u662F\u5168\u91CF\u91CD\u6765\u3002",
|
|
99
|
+
"- \u63A2\u6D4B\u7C7B\u5931\u8D25\u53EA\u4ED8\u4E00\u6B21\u4EE3\u4EF7\uFF1Anet label \u80FD\u529B\u63A2\u6D4B\u7ED3\u679C\u6309\u4F1A\u8BDD\u7F13\u5B58\uFF0Cprobe:true \u624D\u91CD\u6D4B\u3002",
|
|
100
|
+
"",
|
|
101
|
+
"## 6. \u539F\u7406\u56FE\uFF1A\u6821\u9A8C\u4E0E\u4EA4\u4ED8",
|
|
102
|
+
"",
|
|
103
|
+
"- eda_export_netlist \u2192 \u5DF2\u89E3\u6790\u5BF9\u8C61\uFF08parsed:true, netlist\uFF09\u3002\u9010\u7F51\u7EDC\u68C0\u67E5\u7AEF\u70B9\u6570 \u22652\u3001\u65E0\u60AC\u7A7A\u5355\u811A\u7F51\u7EDC\u3002",
|
|
104
|
+
"- eda_run_drc \u2192 \u9010\u6761\u660E\u7EC6\uFF08type / message / primitiveId / x / y\uFF09\uFF0C\u6309 primitiveId \u56DE\u753B\u5E03\u5B9A\u4F4D\u540E\u4FEE\u3002",
|
|
105
|
+
"- eda_export_bom\uFF08csv \u5DF2\u81EA\u52A8\u4ECE UTF-16 \u89E3\u7801\uFF09\u2192 \u4F4D\u53F7\u8FDE\u7EED\u3001\u5C01\u88C5\u975E\u7A7A\u3001\u65E0 DUMMY\u3002",
|
|
106
|
+
"- \u4EA4\u4ED8\u524D\u628A\u7F51\u7EDC\u540D\u6E05\u5355\u4E0E\u9700\u6C42\u8868\u6BD4\u5BF9\uFF08\u547D\u540D\u4E00\u81F4\u6027\u6BD4 DRC \u66F4\u5BB9\u6613\u6F0F\uFF09\u3002",
|
|
107
|
+
"",
|
|
108
|
+
"## 7. PCB\uFF1A\u4ECE\u540C\u6B65\u5230\u51FA Gerber",
|
|
109
|
+
"",
|
|
110
|
+
"- \u540C\u6B65\uFF1Aeda_open_document \u5207\u5230 PCB \u9875 \u2192 pcb_import_changes\uFF08\u9ED8\u8BA4\u5F02\u6B65\uFF0C\u4F1A\u5F39\u5E94\u7528\u81EA\u5DF1\u7684\u786E\u8BA4\u5BF9\u8BDD\u6846\uFF09\u2192",
|
|
111
|
+
" eda_pcb_wait_for_components \u5224\u5B9A\u300C\u65B0\u5668\u4EF6\u51FA\u73B0\u4E86\u300D\uFF1B\u4E0D\u8981\u7528\u957F\u8D85\u65F6\u786C\u7B49\u5BF9\u8BDD\u6846\u3002",
|
|
112
|
+
"- \u8BFB\u73B0\u72B6\uFF1Apcb_get_layers\u3001pcb_get_nets({detail:true})\u3001pcb_get_components({includePins:true})\u3002",
|
|
113
|
+
"- \u677F\u6846\uFF1Apcb_draw_board_outline({ points }) \u751F\u6210 layer 11 \u7684\u95ED\u5408 polyline\u3002",
|
|
114
|
+
" \u4E0D\u8981\u7528 pcb_draw_track \u753B\u677F\u6846\uFF08\u94DC\u7EBF\uFF0Clayer 11 \u88AB\u62D2\uFF09\uFF0C\u4E5F\u4E0D\u8981\u7528 region\uFF08\u53EA\u652F\u6301\u94DC\u5C42/MULTI\uFF09\u3002",
|
|
115
|
+
"- \u5E03\u5C40\uFF1Apcb_place_component / pcb_move_component \u624B\u5DE5\u6446\u653E\uFF08\u5B89\u88C5\u5B54 \u2192 \u677F\u8FB9\u63A5\u53E3 \u2192 \u4E3B\u63A7 \u2192 \u914D\u5957\u5668\u4EF6\uFF09\uFF1B",
|
|
116
|
+
" \u53BB\u8026\u7535\u5BB9\u8DDD\u5F15\u811A \u22642mm\uFF0C\u6676\u632F\u9760\u82AF\u7247\u4E14\u4E0B\u65B9\u51C0\u7A7A\u3002",
|
|
117
|
+
"- \u8D70\u7EBF\uFF1Apcb_draw_track\uFF08\u4E0D\u4F20\u7EBF\u5BBD\u6309\u7F51\u7EDC\u89D2\u8272\u7ED9\u9ED8\u8BA4\u503C\uFF0C\u4F4E\u4E8E 6mil \u76F4\u63A5\u62D2\u7EDD\uFF09\uFF1B\u6539\u7EBF\u7528 pcb_modify_track\uFF1B",
|
|
118
|
+
" \u6574\u7F51\u52A0\u7C97\u7528 pcb_set_net_track_width\u3002",
|
|
119
|
+
"- \u8FC7\u5B54\uFF1Apcb_draw_via\uFF08\u9ED8\u8BA4\u5B54\u5F84\u6309\u89D2\u8272\u7ED9\u6807\u51C6\u503C\uFF1B\u710A\u73AF <0.2mm \u62D2\u7EDD\uFF0C\u5B54\u5F84 <0.3mm \u8B66\u544A\uFF09\u3002",
|
|
120
|
+
"- \u94FA\u94DC\uFF1Apcb_create_pour\uFF08points \u4E3A mil \u6241\u5E73\u6570\u7EC4\uFF0C\u81EA\u52A8\u95ED\u5408\uFF09\uFF1B\u5148\u786E\u8BA4\u8BBE\u8BA1\u89C4\u5219\u91CC\u94FA\u94DC\u95F4\u8DDD \u22656mil\uFF08\u5EFA\u8BAE 10mil\uFF09\u3002",
|
|
121
|
+
"- \u81EA\u52A8\u5E03\u7EBF\uFF1Aeda_pcb_auto_route \u9ED8\u8BA4\u4E0D\u7528\uFF1B\u786E\u9700\u4F7F\u7528\u624D wait:true \u6216\u540E\u53F0 + eda_pcb_job_status \u8F6E\u8BE2\u3002",
|
|
122
|
+
"- \u6821\u9A8C\uFF1Aeda_pcb_run_drc\uFF08includeVerboseError:true \u62FF\u9010\u6761\uFF09+ eda_design_audit\uFF08\u7EBF\u5BBD/\u8FC7\u5B54/\u7F51\u7EDC\u540D/\u677F\u6846/\u94FA\u94DC/DRC \u53EA\u8BFB\u4F53\u68C0\uFF09\u3002",
|
|
123
|
+
"- \u4EA4\u4ED8\uFF1Aeda_pcb_export_gerber\uFF08\u8FD4\u56DE zip \u7684 base64 data URL\uFF0C\u5927\u677F\u53EF\u80FD\u51E0 MB\uFF09\u3002",
|
|
124
|
+
"",
|
|
125
|
+
"## 8. \u8BBE\u8BA1\u89C4\u5219\u901F\u67E5\uFF08\u5DE5\u5177\u5DF2\u5F3A\u5236\uFF09",
|
|
126
|
+
"",
|
|
127
|
+
"- \u7F51\u7EDC\u540D\uFF1A\u5B57\u6BCD/\u6570\u5B57/\u4E0B\u5212\u7EBF/\u70B9/\u52A0\u53F7/\u51CF\u53F7\uFF0C\u2264255 \u5B57\u7B26\uFF1B\u7A7A\u683C\u3001\u659C\u6760\u3001\u62EC\u53F7\u3001\u4E2D\u6587\u4F1A\u88AB\u62D2\u7EDD\u3002",
|
|
128
|
+
"- \u7EBF\u5BBD\uFF1A\u666E\u901A\u4FE1\u53F7 \u22656mil(0.15mm)\u3001\u53BB\u8026\u5206\u652F 10mil\u3001\u4E3B\u5E72\u7535\u6E90 16mil\u3001>500mA \u6216 GND 20mil\u3002",
|
|
129
|
+
"- \u8FC7\u5B54\uFF1A\u4FE1\u53F7 0.2/0.4mm\u3001\u7535\u6E90/GND 0.3/0.6mm\u3001\u5927\u7535\u6D41 0.4/0.8mm\uFF1B\u710A\u73AF \u22650.2mm \u5F3A\u5236\u3002",
|
|
130
|
+
"- \u94FA\u94DC\uFF1A\u9876/\u5E95\u5C42\u94FA GND\uFF0C\u4E0E\u5176\u5B83\u7F51\u7EDC\u95F4\u8DDD \u22656mil\uFF08\u5EFA\u8BAE 10mil\uFF09\uFF0C\u5BFC\u51FA\u524D\u79FB\u9664\u5B64\u5C9B\u3002",
|
|
131
|
+
"- \u4E1D\u5370\uFF1A\u5B57\u7B26\u9AD8\u5EA6/\u5BBD\u5EA6\u6709\u6700\u5C0F\u503C\u9650\u5236\uFF08\u89C1 docs/design-rules.md\uFF09\uFF0C\u4E1D\u5370\u4E0D\u5F97\u538B\u710A\u76D8\u3002",
|
|
132
|
+
"",
|
|
133
|
+
"## 9. \u6545\u969C\u4E0E\u5904\u7F6E\uFF08\u73B0\u8C61 \u2192 \u539F\u56E0 \u2192 \u52A8\u4F5C\uFF09",
|
|
134
|
+
"",
|
|
135
|
+
"| \u73B0\u8C61 | \u539F\u56E0 | \u52A8\u4F5C |",
|
|
136
|
+
"|---|---|---|",
|
|
137
|
+
"| connectedClients=0 / \u62A5\u672A\u8FDE\u63A5 | EDA \u6CA1\u5F00\u3001\u6269\u5C55\u6CA1\u5BFC\u5165\u6216\u6CA1\u70B9\u300C\u8FDE\u63A5\u300D\u3001\u7AEF\u53E3\u88AB\u5360 | \u5148 eda_status \u770B hint\uFF1B\u5FC5\u8981\u65F6 eda_launch \u8D77\u5E94\u7528\u5E76\u7B49\u6269\u5C55\u8FDE\u4E0A |",
|
|
138
|
+
"| extensionVersions \u4E0E bridgeVersion \u4E0D\u4E00\u81F4 | \u88C5\u7684\u662F\u65E7\u6269\u5C55 | \u91CD\u65B0\u5BFC\u5165\u5BF9\u5E94\u7248\u672C zip\uFF08\u6587\u4EF6\u540D\u5E26\u7248\u672C\u53F7\uFF09\u5E76\u91CD\u542F\u5E94\u7528 |",
|
|
139
|
+
"| API method not allowed | \u8BE5 API \u4E0D\u5728\u6269\u5C55\u767D\u540D\u5355 | \u8C03 eda_list_api_methods \u770B\u6E05\u5355\uFF1B\u4F18\u5148\u7528\u5305\u88C5\u597D\u7684\u5DE5\u5177 |",
|
|
140
|
+
"| \u8C03\u7528 60s \u8D85\u65F6 | \u9875\u9762\u5207\u8D70\u7559\u4E0B\u50F5\u5C38 socket\uFF0C\u6216\u5355\u6B21\u6539\u592A\u591A | \u53EA\u8BFB\u8C03\u7528\u4F1A\u81EA\u52A8\u6362\u9875\u9762\u91CD\u8BD5\u4E00\u6B21\uFF1B\u628A\u6279\u91CF\u62C6\u5230 \u226420/\u6279 |",
|
|
141
|
+
"| \u8BFB\u56FE\u8FD4\u56DE\u7A7A / null | \u6D3B\u52A8\u6587\u6863\u4E0D\u662F\u539F\u7406\u56FE\u9875 | eda_get_active_document \u2192 eda_open_document \u5207\u9875 |",
|
|
142
|
+
"| createNetLabel \u65E0\u54CD\u5E94 | 3.2.186 \u8BE5 API \u4E0D resolve | \u81EA\u52A8\u964D\u7EA7\u6587\u672C\u6807\u7B7E + stub \u5BFC\u7EBF\uFF1B\u6279\u91CF\u7528 eda_place_net_labels |",
|
|
143
|
+
"| eda_get_net_labels \u66FE\u8FD4\u56DE 0 | \u4EE5\u524D\u53EA\u67E5\u5C5E\u6027\u56FE\u5143 | \u73B0\u5728\u540C\u65F6\u5217\u6587\u672C\u6807\u7B7E\uFF08kind:text\uFF09\uFF0C\u53EF\u76F4\u63A5\u5220 |",
|
|
144
|
+
"| \u5BFC\u7EBF net \u88AB\u6539\u6389 | \u8FDE\u901A\u6027\u91CD\u7B97\u8986\u76D6\u6307\u5B9A\u540D | \u8DE8\u533A\u57DF\u6539\u7528\u7F51\u7EDC\u7AEF\u53E3 / \u7F51\u7EDC\u6807\u7B7E |",
|
|
145
|
+
"| \u5668\u4EF6\u4F4D\u7F6E\u91CD\u53E0 | \u6CA1\u6309\u6805\u683C\u3001\u6CA1\u7559\u95F4\u8DDD | eda_move_component \u91CD\u6392\uFF1B\u6446\u5B8C\u56DE\u8BFB\u5305\u56F4\u76D2 |",
|
|
146
|
+
"| \u5BFC\u5165 .epro2 \u540E uuid \u51B2\u7A81 | \u5E94\u7528\u539F\u6837\u590D\u5236\u5185\u90E8 id | \u770B\u8FD4\u56DE collisions\uFF1B\u907F\u514D\u540C\u65F6\u6253\u5F00\u6E90\u5DE5\u7A0B\u4E0E\u65B0\u5DE5\u7A0B |",
|
|
147
|
+
"| createProject / copyProject / deleteProject \u7A7A\u6216 false | \u8BE5\u6784\u5EFA\u5BF9\u672C\u5730\u5DE5\u7A0B\u4E0D\u652F\u6301 | \u7528 eda_import_project \u5EFA\uFF1B\u5220\u9664/\u590D\u5236\u5728\u5E94\u7528\u5185\u505A |",
|
|
148
|
+
"| eda_launch \u5E26 project \u6CA1\u6253\u5F00\u5DE5\u7A0B | \u547D\u4EE4\u884C\u8DEF\u5F84\u88AB\u5E94\u7528\u5FFD\u7565 | \u7528 eda_open_project({ name }) \u6253\u5F00 |",
|
|
149
|
+
"| \u5173\u5E94\u7528\u540E\u6539\u52A8\u4E22\u5931 | eda_close \u8D70\u4E86\u5F3A\u5236\u8DEF\u5F84 | \u5173\u524D\u5148\u4FDD\u5B58\uFF1B\u770B\u8FD4\u56DE\u7684 forced |",
|
|
150
|
+
"| run_code \u8BFB\u5927 JSON \u88AB\u622A\u65AD | \u5BBF\u4E3B read \u6709\u5355\u884C\u4E0A\u9650 | \u7528 node:fs \u8BFB\u76D8\u6216\u5206\u7247\u8BFB |",
|
|
151
|
+
"",
|
|
152
|
+
"## 10. \u7AEF\u5230\u7AEF\u5267\u672C",
|
|
153
|
+
"",
|
|
154
|
+
"A. \u5728\u5DF2\u6709\u5DE5\u7A0B\u91CC\u6539\u539F\u7406\u56FE\uFF1A",
|
|
155
|
+
" eda_list_projects \u2192 eda_open_project({name}) \u2192 eda_get_project\uFF08\u53D6 schematic uuid\uFF09\u2192 eda_open_document",
|
|
156
|
+
" \u2192 eda_get_page_info \u2192 eda_get_components / eda_get_pins \u2192 \u6446\u4F4D\uFF08eda_place_component / eda_move_component\uFF09",
|
|
157
|
+
" \u2192 \u8FDE\u7EBF eda_draw_wire + \u8DE8\u533A\u57DF eda_place_net_labels \u2192 eda_export_netlist \u67E5\u7AEF\u70B9 \u2192 eda_run_drc \u770B\u660E\u7EC6",
|
|
158
|
+
" \u2192 eda_save_document\u3002",
|
|
159
|
+
"",
|
|
160
|
+
"B. \u65B0\u5EFA\u5DE5\u7A0B\u5E76\u51FA\u677F\uFF1A",
|
|
161
|
+
" \u51C6\u5907\u7A7A\u767D/\u6A21\u677F\u5DE5\u7A0B\u6587\u4EF6 \u2192 eda_import_project({ path, teamUuid, friendlyName, open:true })",
|
|
162
|
+
" \u2192 \u539F\u7406\u56FE\u6D41\u7A0B\uFF08\u540C A\uFF09\u2192 eda_get_project \u53D6 pcb uuid \u2192 eda_open_document(pcb) \u2192 pcb_import_changes",
|
|
163
|
+
" \u2192 eda_pcb_wait_for_components \u7B49\u786E\u8BA4 \u2192 \u677F\u6846/\u5E03\u5C40/\u8D70\u7EBF/\u8FC7\u5B54/\u94FA\u94DC \u2192 eda_pcb_run_drc + eda_design_audit",
|
|
164
|
+
" \u2192 eda_pcb_save_document \u2192 eda_pcb_export_gerber \u2192 eda_export_project \u5907\u4EFD\u3002",
|
|
165
|
+
"",
|
|
166
|
+
"C. \u53EA\u505A PCB\uFF1A",
|
|
167
|
+
" eda_open_project \u2192 eda_get_project \u2192 eda_open_document(pcb) \u2192 pcb_get_nets(detail) / pcb_get_components(includePins)",
|
|
168
|
+
" \u2192 \u677F\u6846\u4E0E\u5E03\u5C40 \u2192 \u8D70\u7EBF\uFF08\u6309\u89D2\u8272\u7EBF\u5BBD\uFF09\u2192 \u94FA\u94DC \u2192 eda_pcb_run_drc + eda_design_audit \u2192 Gerber\u3002",
|
|
169
|
+
"",
|
|
170
|
+
"## 11. \u4EA4\u4ED8\u524D\u68C0\u67E5\u6E05\u5355",
|
|
171
|
+
"",
|
|
172
|
+
"- [ ] eda_status\uFF1AconnectedClients \u22651 \u4E14\u7248\u672C\u4E00\u81F4\u3002",
|
|
173
|
+
"- [ ] \u7F51\u8868\uFF1A\u6BCF\u4E2A\u7F51\u7EDC \u22652 \u7AEF\u70B9\u3001\u65E0\u60AC\u7A7A\uFF1B\u5DEE\u5206\u5BF9\u6210\u5BF9\uFF1B\u7535\u6E90/\u5730\u547D\u540D\u7EDF\u4E00\u3002",
|
|
174
|
+
"- [ ] DRC\uFF1A\u539F\u7406\u56FE\u4E0E PCB \u90FD\u8DD1\u8FC7\uFF0C\u660E\u7EC6\u9010\u6761\u6E05\u96F6\u6216\u5DF2\u786E\u8BA4\u8C41\u514D\u3002",
|
|
175
|
+
"- [ ] \u8BBE\u8BA1\u89C4\u5219\uFF1A\u7EBF\u5BBD/\u8FC7\u5B54/\u94FA\u94DC\u95F4\u8DDD/\u4E1D\u5370\u7B26\u5408\u7B2C 8 \u8282\u3002",
|
|
176
|
+
"- [ ] BOM\uFF1A\u4F4D\u53F7\u8FDE\u7EED\u3001\u5C01\u88C5\u975E\u7A7A\u3001\u65E0 DUMMY\u3002",
|
|
177
|
+
"- [ ] \u89C6\u89C9\uFF1A\u5BFC\u51FA\u56FE\u7247\u81EA\u67E5\uFF0C\u6807\u7B7E\u4E0D\u538B\u7B26\u53F7\u3001\u5668\u4EF6\u4E0D\u91CD\u53E0\u3001\u529F\u80FD\u6846\u6E05\u6670\u3002",
|
|
178
|
+
"- [ ] \u4FDD\u5B58\uFF1A\u6587\u6863\u5DF2\u4FDD\u5B58\uFF0C\u5DE5\u7A0B\u5DF2 eda_export_project \u5907\u4EFD\u3002",
|
|
179
|
+
"- [ ] Gerber \u5DF2\u5BFC\u51FA\u4E14\u5C42\u6570\u4E0E\u677F\u5C42\u4E00\u81F4\u3002"
|
|
180
|
+
];
|
|
181
|
+
var SKILL_SECTIONS = SKILL_PLAYBOOK_LINES.filter((line) => line.startsWith("## "));
|
|
182
|
+
var SKILL_PLAYBOOK = SKILL_PLAYBOOK_LINES.join(String.fromCharCode(10));
|
|
183
|
+
|
|
184
|
+
// src/bridge/workflow-guide.ts
|
|
185
|
+
var WORKFLOW_SUMMARY = [
|
|
186
|
+
"\u539F\u7406\u56FE\u5DE5\u4F5C\u89C4\u8303\uFF08\u9ED8\u8BA4\u5168\u90E8\u624B\u5DE5\uFF0C\u7981\u6B62\u56FE\u7701\u4E8B\u7528\u81EA\u52A8\u5E03\u5C40/\u81EA\u52A8\u5E03\u7EBF\uFF09\uFF1A",
|
|
187
|
+
"1) \u5E03\u5C40\uFF1A\u6309 10 \u5355\u4F4D\u6805\u683C\u5BF9\u9F50\uFF1B\u4FE1\u53F7\u4ECE\u5DE6\u5230\u53F3\u3001\u7535\u6E90\u5728\u4E0A\u3001\u5730\u5728\u4E0B\uFF1B\u540C\u7EA7\u5668\u4EF6\u7B49\u95F4\u8DDD\uFF1B\u4E0D\u538B\u5B57\u3001\u4E0D\u538B\u6807\u9898\u680F\uFF1B\u5148\u770B eda_get_page_info \u7684\u5B89\u5168\u533A\u518D\u6446\u4F4D\u3002",
|
|
188
|
+
"2) \u8FDE\u7EBF\uFF1A\u53EA\u7528 eda_draw_wire \u8D70\u76F4\u7EBF/45 \u5EA6\uFF1B**\u8DE8\u533A\u57DF\u540C\u540D\u7F51\u7EDC\u5FC5\u987B\u7528\u7F51\u7EDC\u7AEF\u53E3\uFF08eda_place_net_port\uFF09\u6216\u7F51\u7EDC\u6807\u7B7E**\uFF0C\u4E0D\u80FD\u9760\u5728\u4E24\u5904\u753B\u4E00\u6761\u53EB\u540C\u540D\u7684\u5BFC\u7EBF\u2014\u2014\u5BFC\u7EBF\u4E00\u65E6\u63A5\u89E6\u5F15\u811A\uFF0Cnet \u4F1A\u88AB\u8FDE\u901A\u6027\u91CD\u7B97\uFF0C\u6307\u5B9A\u540D\u4F1A\u88AB\u8986\u76D6\u3002",
|
|
189
|
+
"3) \u7F51\u7EDC\u6807\u7B7E\uFF1A\u5148\u8BD5 eda_place_net_label\uFF1B\u82E5\u8BE5\u6784\u5EFA\u7684 createNetLabel \u4E0D\u54CD\u5E94\uFF0C\u4F1A\u81EA\u52A8\u964D\u7EA7\u4E3A\u7EAF\u6587\u672C\u6807\u7B7E\uFF08\u65E0\u7535\u6C14\u8BED\u4E49\uFF09\uFF0C\u6B64\u65F6\u9760 stub \u5BFC\u7EBF\u627F\u8F7D\u7F51\u7EDC\uFF1B\u6279\u91CF\u7528 eda_place_net_labels \u4E00\u6B21\u8C03\u7528\uFF0C\u4E0D\u8981\u4E32\u884C\u4E0A\u767E\u6B21\u3002",
|
|
190
|
+
"4) \u6821\u9A8C\uFF1Aeda_export_netlist \u770B\u6BCF\u4E2A\u7F51\u7EDC\u7684\u7AEF\u70B9\u662F\u5426 \u22652\uFF1Beda_run_drc \u770B\u9010\u6761 DRC \u660E\u7EC6\uFF1B\u89C6\u89C9\u68C0\u67E5\u4F18\u5148\u5BFC\u51FA PNG \u81EA\u884C\u8BC6\u522B\uFF0C\u800C\u4E0D\u662F\u8BA9 EDA \u91CD\u6392\u3002",
|
|
191
|
+
"5) \u53EA\u6709\u7528\u6237\u660E\u786E\u8981\u6C42\u65F6\u624D eda_auto_layout / eda_auto_route\uFF08\u9700 force:true \u4E14\u8BBE\u7F6E\u91CC\u653E\u884C\uFF09\u3002",
|
|
192
|
+
"6) \u5F15\u811A\u4FE1\u606F\u7528 eda_get_pins \u4E00\u6B21\u62FF\u5168\uFF08\u542B pinName/pinNumber\uFF09\uFF0C\u4E0D\u8981\u9010\u811A\u8C03 raw API\u3002"
|
|
193
|
+
].join("\n");
|
|
194
|
+
var WORKFLOW_GUIDE = WORKFLOW_SUMMARY + "\n\n" + [
|
|
195
|
+
"## \u5E03\u5C40\u7EC6\u5219\u662F\u600E\u4E48\u843D\u5730\u7684",
|
|
196
|
+
"",
|
|
197
|
+
"- \u5750\u6807\u5355\u4F4D\u662F 0.01 \u82F1\u5BF8\uFF08MCP \u5355\u4F4D\uFF09\uFF1BA4 \u56FE\u6846 0..1170 / 0..825\uFF0C\u6807\u9898\u680F\u5360 right 460..1160 / bottom 10..190\uFF0C\u5B89\u5168\u533A\u89C1 eda_get_page_info\u3002",
|
|
198
|
+
"- \u4E00\u9875\u53EA\u653E\u4E00\u4E2A\u529F\u80FD\u5757\uFF1B\u5668\u4EF6\u6309\u4FE1\u53F7\u6D41\u4ECE\u5DE6\u5230\u53F3\u6392\uFF0C\u53CD\u9988\u5143\u4EF6\u653E\u5728\u653E\u5927\u5668\u4E0B\u65B9\uFF0C\u53BB\u8026\u7535\u5BB9\u8D34\u8FD1\u7535\u6E90\u811A\u3002",
|
|
199
|
+
"- \u5668\u4EF6\u4E4B\u95F4\u7559\u51FA\u81F3\u5C11 20 \u5355\u4F4D\u7528\u4E8E\u8D70\u7EBF\u548C\u6807\u7B7E\uFF1B\u7F51\u7EDC\u7AEF\u53E3\u653E\u5728\u6A21\u5757\u8FB9\u7F18\uFF0C\u5DE6\u53F3\u5404\u4E00\u5217\u3002",
|
|
200
|
+
"- \u6446\u597D\u4E00\u4E2A\u6A21\u5757\u518D\u6446\u4E0B\u4E00\u4E2A\uFF1B\u6BCF\u6B21\u6446\u5B8C\u7528 eda_get_components \u68C0\u67E5\u6CA1\u6709\u91CD\u53E0\uFF08\u5305\u56F4\u76D2\u76F8\u4EA4\uFF09\u3002",
|
|
201
|
+
"",
|
|
202
|
+
"## \u7F51\u7EDC\u4E0E\u6807\u7B7E",
|
|
203
|
+
"",
|
|
204
|
+
"- eda_place_net_port \u4EA7\u751F\u771F\u6B63\u7684\u7F51\u7EDC\u7AEF\u53E3\u56FE\u5143\uFF0C\u662F\u8DE8\u533A\u57DF\u8FDE\u63A5\u7684\u9996\u9009\u3002",
|
|
205
|
+
"- eda_place_net_label \u4F18\u5148\u8C03 sch_PrimitiveAttribute.createNetLabel\uFF1B\u8BE5 API \u5728 3.2.186 \u4E0A\u4E0D\u54CD\u5E94\uFF0C\u63A2\u6D4B\u7ED3\u8BBA\u6309\u4F1A\u8BDD\u7F13\u5B58\uFF0C\u4E4B\u540E\u76F4\u63A5\u964D\u7EA7\u4E3A\u6587\u672C\u6807\u7B7E\uFF08\u4E0D\u518D\u6BCF\u6B21\u4ED8 4 \u79D2\u8D85\u65F6\uFF09\u3002",
|
|
206
|
+
"- \u964D\u7EA7\u540E\u7684\u6587\u672C\u6807\u7B7E\u6CA1\u6709\u7535\u6C14\u8BED\u4E49\uFF1A\u8FDE\u901A\u6027\u7531 eda_place_net_label_at_pin \u540C\u65F6\u753B\u7684 stub \u5BFC\u7EBF\u627F\u62C5\u3002",
|
|
207
|
+
"- eda_get_net_labels \u4F1A\u540C\u65F6\u5217\u51FA\u5C5E\u6027\u56FE\u5143\uFF08netlabel/netport/netflag\uFF09\u548C\u6587\u672C\u6807\u7B7E\uFF0C\u5220\u9664\u7528 eda_delete_primitive \u7684\u5BF9\u5E94 kind\u3002",
|
|
208
|
+
"- \u6279\u91CF\u653E\u7F6E\u7528 eda_place_net_labels([{pinPrimitiveId, net}, ...])\uFF0C\u4E00\u6B21\u8C03\u7528\u5B8C\u6210\u5E76\u9010\u6761\u56DE\u62A5\u6210\u8D25\u3002",
|
|
209
|
+
"",
|
|
210
|
+
"## \u5BFC\u7EBF net \u88AB\u8986\u76D6\uFF08\u52A1\u5FC5\u77E5\u9053\uFF09",
|
|
211
|
+
"",
|
|
212
|
+
"eda_draw_wire \u4F20\u7684 net \u53EA\u5BF9**\u60AC\u7A7A\u5BFC\u7EBF**\u6709\u6548\uFF1B\u5BFC\u7EBF\u7AEF\u70B9\u4E00\u65E6\u843D\u5728\u5F15\u811A/\u7F51\u7EDC\u4E0A\uFF0CEDA \u4F1A\u6309\u8FDE\u901A\u6027\u91CD\u7B97\u7F51\u7EDC\u540D\uFF08\u5B9E\u6D4B TESTNET \u5E76\u5165\u4E86 LED_A\uFF09\u3002\u6240\u4EE5\u201C\u540C\u540D\u5BFC\u7EBF = \u540C\u540D\u7F51\u7EDC\u201D\u4E0D\u6210\u7ACB\uFF0C\u8DE8\u533A\u57DF\u540C\u540D\u5FC5\u987B\u7528\u7F51\u7EDC\u6807\u7B7E\u6216\u7F51\u7EDC\u7AEF\u53E3\u3002",
|
|
213
|
+
"",
|
|
214
|
+
"## \u6821\u9A8C\u987A\u5E8F",
|
|
215
|
+
"",
|
|
216
|
+
"1. eda_get_active_document \u786E\u8BA4\u5728\u539F\u7406\u56FE\u9875\uFF08\u4E0D\u662F HOME/PCB\uFF09\u3002",
|
|
217
|
+
"2. eda_export_netlist\uFF08\u5DF2\u89E3\u6790\u6210\u5BF9\u8C61\uFF09\u68C0\u67E5\u6BCF\u4E2A\u7F51\u7EDC \u22652 \u7AEF\u70B9\u3001\u65E0\u60AC\u7A7A\u3002",
|
|
218
|
+
"3. eda_run_drc \u770B\u9010\u6761\u660E\u7EC6\uFF08\u542B primitiveId \u4E0E\u5750\u6807\uFF09\u3002",
|
|
219
|
+
"4. \u9700\u8981\u4EBA\u770B\u6548\u679C\u5C31\u5BFC\u51FA\u56FE\u7247\u81EA\u884C\u8BC6\u522B\uFF0C\u4E0D\u8981\u7528\u81EA\u52A8\u5E03\u5C40\u201C\u4FEE\u201D\u7248\u9762\u3002"
|
|
220
|
+
].join("\n");
|
|
221
|
+
|
|
222
|
+
// src/skills.ts
|
|
223
|
+
var EDA_SKILL_NAME = "jlceda-schematic-workflow";
|
|
224
|
+
var EDA_SKILL_PROVIDER = "dsh-eda-mcp";
|
|
225
|
+
var EDA_SKILL_RANK = 500;
|
|
226
|
+
var DESCRIPTION = "Draw or edit a JLCEDA Pro (EasyDraw Pro) schematic through the dsh-eda-mcp tools: grid-aligned manual placement, signal-flow layout, net ports/labels instead of same-named wires, batch net-label placement, and netlist/DRC verification. TRIGGER when: laying out or re-laying a schematic, connecting pins across a sheet, placing many net labels, checking a schematic (netlist endpoints, DRC detail), or moving parts without losing designators. DO NOT TRIGGER for PCB-only work (routing, copper pour, gerber) or for project/application control (launch, open, import, export).";
|
|
227
|
+
var WHEN_TO_USE = "Use before touching a schematic sheet, and again whenever a layout or connectivity decision has to be made.";
|
|
228
|
+
function skillBody() {
|
|
229
|
+
return [
|
|
230
|
+
SKILL_PLAYBOOK,
|
|
231
|
+
"",
|
|
232
|
+
"---",
|
|
233
|
+
"",
|
|
234
|
+
"## \u9644\uFF1A\u7CBE\u7B80\u7248\u89C4\u8303\uFF08\u4E0E eda_workflow_guide \u540C\u6E90\uFF09",
|
|
235
|
+
"",
|
|
236
|
+
WORKFLOW_SUMMARY,
|
|
237
|
+
"",
|
|
238
|
+
WORKFLOW_GUIDE
|
|
239
|
+
].join(String.fromCharCode(10));
|
|
240
|
+
}
|
|
241
|
+
function candidate() {
|
|
242
|
+
return {
|
|
243
|
+
name: EDA_SKILL_NAME,
|
|
244
|
+
description: DESCRIPTION,
|
|
245
|
+
whenToUse: WHEN_TO_USE,
|
|
246
|
+
invocation: { modelInvocable: true, userInvocable: true },
|
|
247
|
+
source: "custom",
|
|
248
|
+
provider: EDA_SKILL_PROVIDER,
|
|
249
|
+
rank: EDA_SKILL_RANK,
|
|
250
|
+
locator: { kind: "inline", skill: EDA_SKILL_NAME },
|
|
251
|
+
metadata: { plugin: "dsh-eda-mcp", area: "schematic" }
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function createEdaSkillProvider() {
|
|
255
|
+
return {
|
|
256
|
+
name: EDA_SKILL_PROVIDER,
|
|
257
|
+
list: async () => [candidate()],
|
|
258
|
+
get: async (input) => {
|
|
259
|
+
if (input?.name !== EDA_SKILL_NAME) return void 0;
|
|
260
|
+
return { ...candidate(), description: DESCRIPTION, content: skillBody() };
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
|
|
24
265
|
// src/routes.ts
|
|
25
266
|
import { createReadStream } from "node:fs";
|
|
267
|
+
import { basename } from "node:path";
|
|
26
268
|
import { SettingsConflictError } from "@deepseek-ai/dsh-settings";
|
|
27
269
|
|
|
28
270
|
// src/loopback.ts
|
|
@@ -196,7 +438,8 @@ function makeEdaMcpRoutes(deps) {
|
|
|
196
438
|
if (!isLoopbackRequest(req)) return json(res, 403, { ok: false, error: "forbidden" });
|
|
197
439
|
res.writeHead(200, {
|
|
198
440
|
"content-type": "application/zip",
|
|
199
|
-
|
|
441
|
+
// Keep the versioned file name the browser saves it as.
|
|
442
|
+
"content-disposition": 'attachment; filename="' + basename(deps.extensionZipPath) + '"',
|
|
200
443
|
"cache-control": "no-store"
|
|
201
444
|
});
|
|
202
445
|
const stream = createReadStream(deps.extensionZipPath);
|
|
@@ -291,16 +534,16 @@ function resolveBridgeRuntime(probe = {}) {
|
|
|
291
534
|
}
|
|
292
535
|
const root = dirname(execPath);
|
|
293
536
|
for (const parts of DESKTOP_NODE_CANDIDATES) {
|
|
294
|
-
const
|
|
295
|
-
if (exists(
|
|
537
|
+
const candidate2 = join(root, ...parts);
|
|
538
|
+
if (exists(candidate2)) return { command: candidate2, extraEnv: {}, source: "desktop runtime Node" };
|
|
296
539
|
}
|
|
297
540
|
const pathValue = env.PATH ?? env.Path ?? "";
|
|
298
541
|
for (const entry of pathValue.split(probe.pathDelimiter ?? delimiter)) {
|
|
299
542
|
const dir = entry.replace(/^"|"$/g, "").trim();
|
|
300
543
|
if (dir === "") continue;
|
|
301
544
|
for (const name of PATH_NODE_NAMES) {
|
|
302
|
-
const
|
|
303
|
-
if (exists(
|
|
545
|
+
const candidate2 = join(dir, name);
|
|
546
|
+
if (exists(candidate2)) return { command: candidate2, extraEnv: {}, source: "PATH Node" };
|
|
304
547
|
}
|
|
305
548
|
}
|
|
306
549
|
return {
|
|
@@ -494,7 +737,12 @@ var Config = z.object({
|
|
|
494
737
|
toolCallTimeoutMs: z.number().min(1e3).max(3e5).default(6e4).volatile(),
|
|
495
738
|
allowRawApi: z.boolean().default(true).volatile(),
|
|
496
739
|
/** Optional path to lceda-pro.exe; empty means "let eda_launch discover it". */
|
|
497
|
-
edaExecutable: z.string().default("").volatile()
|
|
740
|
+
edaExecutable: z.string().default("").volatile(),
|
|
741
|
+
/**
|
|
742
|
+
* Automatic schematic layout/routing stays off unless enabled here: the default
|
|
743
|
+
* working style is grid-aligned manual placement plus a visual check.
|
|
744
|
+
*/
|
|
745
|
+
allowAutoLayoutRouting: z.boolean().default(false).volatile()
|
|
498
746
|
});
|
|
499
747
|
var FIBER_DISPOSED = 4;
|
|
500
748
|
var FIBER_UNLOADING = 5;
|
|
@@ -532,11 +780,24 @@ function installSettingsSection(ctx, scoped, ns, schema, entry, hooks) {
|
|
|
532
780
|
}
|
|
533
781
|
var inject = ["webServer", "systemPrompt"];
|
|
534
782
|
var BRIDGE_URL = new URL("../lib/bridge.mjs", import.meta.url);
|
|
535
|
-
|
|
783
|
+
function resolveExtensionZipPath() {
|
|
784
|
+
const plain = fileURLToPath(new URL("../dsh-eda-bridge-extension.zip", import.meta.url));
|
|
785
|
+
try {
|
|
786
|
+
const manifest = JSON.parse(readFileSync(fileURLToPath(new URL("../jlc-extension/extension.json", import.meta.url)), "utf8"));
|
|
787
|
+
const version = typeof manifest.version === "string" ? manifest.version : "";
|
|
788
|
+
if (version !== "") {
|
|
789
|
+
const versioned = fileURLToPath(new URL("../dsh-eda-bridge-extension-" + version + ".zip", import.meta.url));
|
|
790
|
+
if (existsSync2(versioned)) return versioned;
|
|
791
|
+
}
|
|
792
|
+
} catch {
|
|
793
|
+
}
|
|
794
|
+
return plain;
|
|
795
|
+
}
|
|
536
796
|
var BRIDGE_PATH = fileURLToPath(BRIDGE_URL);
|
|
537
797
|
function bridgeLaunchFor(active) {
|
|
538
798
|
const runtime = resolveBridgeRuntime();
|
|
539
799
|
const allowRawApi = booleanField(active.allowRawApi, true);
|
|
800
|
+
const allowAutoLayoutRouting = booleanField(active.allowAutoLayoutRouting, false);
|
|
540
801
|
const toolCallTimeoutMs = numberField(active.toolCallTimeoutMs, 6e4);
|
|
541
802
|
return {
|
|
542
803
|
transport: "stdio",
|
|
@@ -546,6 +807,7 @@ function bridgeLaunchFor(active) {
|
|
|
546
807
|
env: {
|
|
547
808
|
...runtime.extraEnv,
|
|
548
809
|
DSH_EDA_MCP_ALLOW_RAW_API: allowRawApi ? "1" : "0",
|
|
810
|
+
DSH_EDA_ALLOW_AUTO_LAYOUT: allowAutoLayoutRouting ? "1" : "0",
|
|
549
811
|
DSH_EDA_MCP_TOOL_TIMEOUT_MS: String(toolCallTimeoutMs),
|
|
550
812
|
// eda_launch falls back to the registry / install dirs / PATH when empty.
|
|
551
813
|
DSH_EDA_EXECUTABLE: typeof active.edaExecutable === "string" ? active.edaExecutable : ""
|
|
@@ -614,7 +876,7 @@ function apply(ctx, config) {
|
|
|
614
876
|
ctx.effect(() => {
|
|
615
877
|
const disposers = makeEdaMcpRoutes({
|
|
616
878
|
getConfig: () => current(),
|
|
617
|
-
extensionZipPath:
|
|
879
|
+
extensionZipPath: resolveExtensionZipPath(),
|
|
618
880
|
reconnect: remountClient,
|
|
619
881
|
bridgeLaunch: describeBridgeLaunch,
|
|
620
882
|
diagnostics: () => diagnostics.liveSnapshot(),
|
|
@@ -636,6 +898,14 @@ function apply(ctx, config) {
|
|
|
636
898
|
};
|
|
637
899
|
}, "eda-mcp: settings bridge");
|
|
638
900
|
});
|
|
901
|
+
ctx.inject(["skills"], (sctx) => {
|
|
902
|
+
const register = sctx.skills?.registerProvider;
|
|
903
|
+
if (typeof register !== "function") return;
|
|
904
|
+
const dispose = register(() => createEdaSkillProvider());
|
|
905
|
+
return () => {
|
|
906
|
+
dispose();
|
|
907
|
+
};
|
|
908
|
+
});
|
|
639
909
|
const sync = () => {
|
|
640
910
|
if (disposeSection !== void 0) {
|
|
641
911
|
disposeSection();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-eda-mcp",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.2",
|
|
4
4
|
"description": "DeepSeek Harness (DSH) plugin — connects DSH to JLCEDA Pro (EasyEDA Pro) via a local MCP bridge and draws schematics through the JLCEDA extension API.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": {
|
|
@@ -50,7 +50,6 @@
|
|
|
50
50
|
"docs",
|
|
51
51
|
"jlc-extension",
|
|
52
52
|
"dsh-eda-bridge-extension-*.zip",
|
|
53
|
-
"dsh-eda-bridge-extension.zip",
|
|
54
53
|
"cordis.patch.yml",
|
|
55
54
|
"CHANGELOG.md",
|
|
56
55
|
"CONTRIBUTING.md",
|
|
@@ -73,11 +72,11 @@
|
|
|
73
72
|
"scripts": {
|
|
74
73
|
"build": "node build.mjs",
|
|
75
74
|
"typecheck": "tsc --noEmit",
|
|
76
|
-
"test": "node --experimental-strip-types test/node-runtime.test.ts && node --experimental-strip-types test/config-values.test.ts && node --experimental-strip-types test/design-rules.test.ts && node --experimental-strip-types test/seams.test.ts && node --experimental-strip-types test/eda-launch.test.ts",
|
|
75
|
+
"test": "node --experimental-strip-types test/node-runtime.test.ts && node --experimental-strip-types test/config-values.test.ts && node --experimental-strip-types test/design-rules.test.ts && node --experimental-strip-types test/seams.test.ts && node --experimental-strip-types test/eda-launch.test.ts && node --experimental-strip-types test/skills.test.ts",
|
|
77
76
|
"seam-check": "node scripts/seam-check.mjs",
|
|
78
77
|
"contract-check": "node scripts/contract-check.mjs",
|
|
79
78
|
"check": "pnpm typecheck && pnpm test && pnpm contract-check && pnpm build",
|
|
80
|
-
"docs": "node scripts/gen-tools-doc.mjs",
|
|
79
|
+
"docs": "node scripts/gen-tools-doc.mjs && node scripts/gen-skill-doc.mjs",
|
|
81
80
|
"prepublishOnly": "pnpm check",
|
|
82
81
|
"prepare": "pnpm build"
|
|
83
82
|
},
|