@windypro-rourou/dsh-eda 0.1.0 → 0.1.1

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 (407) hide show
  1. package/README.md +71 -119
  2. package/cordis.patch.yml +9 -7
  3. package/lib/board.js +80 -0
  4. package/lib/client.js +2 -2
  5. package/lib/index.js +339 -11
  6. package/lib/installer.js +4 -4
  7. package/lib/skill.js +138 -0
  8. package/package.json +12 -2
  9. package/skill/INDEX.md +193 -0
  10. package/skill/README.official.md +125 -0
  11. package/skill/README.zh-Hans.official.md +125 -0
  12. package/skill/SKILL.md +746 -0
  13. package/skill/format/index.md +152 -0
  14. package/skill/format/pcb/3d.md +166 -0
  15. package/skill/format/pcb/attr.md +63 -0
  16. package/skill/format/pcb/common.md +306 -0
  17. package/skill/format/pcb/component.md +132 -0
  18. package/skill/format/pcb/dimension.md +58 -0
  19. package/skill/format/pcb/index.md +17 -0
  20. package/skill/format/pcb/obj.md +43 -0
  21. package/skill/format/pcb/pad_via.md +151 -0
  22. package/skill/format/pcb/panel.md +64 -0
  23. package/skill/format/pcb/partition.md +43 -0
  24. package/skill/format/pcb/primitive.md +196 -0
  25. package/skill/format/pcb/rule.md +71 -0
  26. package/skill/format/pcb/shape.md +441 -0
  27. package/skill/format/pcb/text.md +62 -0
  28. package/skill/format/project/blob.md +30 -0
  29. package/skill/format/project/common.md +42 -0
  30. package/skill/format/project/group.md +62 -0
  31. package/skill/format/project/index.md +12 -0
  32. package/skill/format/project/instance.md +32 -0
  33. package/skill/format/project/meta.md +189 -0
  34. package/skill/format/project/variant.md +30 -0
  35. package/skill/format/schematic/attr.md +41 -0
  36. package/skill/format/schematic/common.md +47 -0
  37. package/skill/format/schematic/component.md +91 -0
  38. package/skill/format/schematic/index.md +14 -0
  39. package/skill/format/schematic/obj.md +41 -0
  40. package/skill/format/schematic/pin.md +59 -0
  41. package/skill/format/schematic/shape.md +231 -0
  42. package/skill/format/schematic/structure.md +53 -0
  43. package/skill/format/schematic/table.md +109 -0
  44. package/skill/format/schematic/text.md +47 -0
  45. package/skill/format/schematic/wire.md +132 -0
  46. package/skill/guide/ancillary-projects/pro-api-sdk.md +1 -0
  47. package/skill/guide/ancillary-projects/pro-api-types.md +5 -0
  48. package/skill/guide/ancillary-projects.md +10 -0
  49. package/skill/guide/error-handling.md +38 -0
  50. package/skill/guide/extension-json.md +135 -0
  51. package/skill/guide/extensions-marketplace.md +61 -0
  52. package/skill/guide/how-to-start.md +301 -0
  53. package/skill/guide/i18n.md +57 -0
  54. package/skill/guide/index.md +7 -0
  55. package/skill/guide/inline-frame.md +20 -0
  56. package/skill/guide/invoke-apis.md +81 -0
  57. package/skill/guide/stability.md +37 -0
  58. package/skill/references/_index.md +398 -0
  59. package/skill/references/_quick-reference.md +3028 -0
  60. package/skill/references/classes/DMT_Board.md +533 -0
  61. package/skill/references/classes/DMT_EditorControl.md +1736 -0
  62. package/skill/references/classes/DMT_Event.md +356 -0
  63. package/skill/references/classes/DMT_Folder.md +775 -0
  64. package/skill/references/classes/DMT_Panel.md +531 -0
  65. package/skill/references/classes/DMT_Pcb.md +575 -0
  66. package/skill/references/classes/DMT_Project.md +573 -0
  67. package/skill/references/classes/DMT_Schematic.md +1477 -0
  68. package/skill/references/classes/DMT_SelectControl.md +96 -0
  69. package/skill/references/classes/DMT_Team.md +172 -0
  70. package/skill/references/classes/DMT_Workspace.md +198 -0
  71. package/skill/references/classes/EDA.md +961 -0
  72. package/skill/references/classes/IPCB_ComplexPolygon.md +299 -0
  73. package/skill/references/classes/IPCB_Polygon.md +175 -0
  74. package/skill/references/classes/IPCB_PrimitiveArc.md +1901 -0
  75. package/skill/references/classes/IPCB_PrimitiveAttribute.md +2993 -0
  76. package/skill/references/classes/IPCB_PrimitiveComponent.md +2627 -0
  77. package/skill/references/classes/IPCB_PrimitiveComponentPad.md +410 -0
  78. package/skill/references/classes/IPCB_PrimitiveDimension.md +1419 -0
  79. package/skill/references/classes/IPCB_PrimitiveFill.md +1325 -0
  80. package/skill/references/classes/IPCB_PrimitiveImage.md +1461 -0
  81. package/skill/references/classes/IPCB_PrimitiveLine.md +1639 -0
  82. package/skill/references/classes/IPCB_PrimitiveObject.md +1700 -0
  83. package/skill/references/classes/IPCB_PrimitivePad.md +3155 -0
  84. package/skill/references/classes/IPCB_PrimitivePolyline.md +1193 -0
  85. package/skill/references/classes/IPCB_PrimitivePour.md +1858 -0
  86. package/skill/references/classes/IPCB_PrimitivePoured.md +556 -0
  87. package/skill/references/classes/IPCB_PrimitiveRegion.md +1332 -0
  88. package/skill/references/classes/IPCB_PrimitiveString.md +2315 -0
  89. package/skill/references/classes/IPCB_PrimitiveVia.md +1588 -0
  90. package/skill/references/classes/ISCH_PrimitiveArc.md +1676 -0
  91. package/skill/references/classes/ISCH_PrimitiveAttribute.md +2541 -0
  92. package/skill/references/classes/ISCH_PrimitiveBus.md +973 -0
  93. package/skill/references/classes/ISCH_PrimitiveCbbSymbolComponent.md +260 -0
  94. package/skill/references/classes/ISCH_PrimitiveCircle.md +1392 -0
  95. package/skill/references/classes/ISCH_PrimitiveComponent.md +2913 -0
  96. package/skill/references/classes/ISCH_PrimitiveComponentPin.md +155 -0
  97. package/skill/references/classes/ISCH_PrimitiveObject.md +960 -0
  98. package/skill/references/classes/ISCH_PrimitivePin.md +2402 -0
  99. package/skill/references/classes/ISCH_PrimitivePolygon.md +1028 -0
  100. package/skill/references/classes/ISCH_PrimitiveRectangle.md +1777 -0
  101. package/skill/references/classes/ISCH_PrimitiveText.md +1771 -0
  102. package/skill/references/classes/ISCH_PrimitiveWire.md +973 -0
  103. package/skill/references/classes/LIB_3DModel.md +780 -0
  104. package/skill/references/classes/LIB_Cbb.md +957 -0
  105. package/skill/references/classes/LIB_Classification.md +965 -0
  106. package/skill/references/classes/LIB_Device.md +1221 -0
  107. package/skill/references/classes/LIB_Footprint.md +1153 -0
  108. package/skill/references/classes/LIB_LibrariesList.md +329 -0
  109. package/skill/references/classes/LIB_PanelLibrary.md +855 -0
  110. package/skill/references/classes/LIB_SelectControl.md +89 -0
  111. package/skill/references/classes/LIB_SimulationModel.md +821 -0
  112. package/skill/references/classes/LIB_Symbol.md +1195 -0
  113. package/skill/references/classes/PCB_Document.md +1754 -0
  114. package/skill/references/classes/PCB_Drc.md +3375 -0
  115. package/skill/references/classes/PCB_Event.md +1081 -0
  116. package/skill/references/classes/PCB_Layer.md +1911 -0
  117. package/skill/references/classes/PCB_ManufactureData.md +2968 -0
  118. package/skill/references/classes/PCB_MathPolygon.md +785 -0
  119. package/skill/references/classes/PCB_Net.md +1128 -0
  120. package/skill/references/classes/PCB_Primitive.md +217 -0
  121. package/skill/references/classes/PCB_PrimitiveArc.md +894 -0
  122. package/skill/references/classes/PCB_PrimitiveAttribute.md +717 -0
  123. package/skill/references/classes/PCB_PrimitiveComponent.md +1050 -0
  124. package/skill/references/classes/PCB_PrimitiveDimension.md +833 -0
  125. package/skill/references/classes/PCB_PrimitiveFill.md +861 -0
  126. package/skill/references/classes/PCB_PrimitiveImage.md +875 -0
  127. package/skill/references/classes/PCB_PrimitiveLine.md +858 -0
  128. package/skill/references/classes/PCB_PrimitiveObject.md +800 -0
  129. package/skill/references/classes/PCB_PrimitivePad.md +944 -0
  130. package/skill/references/classes/PCB_PrimitivePolyline.md +819 -0
  131. package/skill/references/classes/PCB_PrimitivePour.md +845 -0
  132. package/skill/references/classes/PCB_PrimitivePoured.md +363 -0
  133. package/skill/references/classes/PCB_PrimitiveRegion.md +799 -0
  134. package/skill/references/classes/PCB_PrimitiveString.md +910 -0
  135. package/skill/references/classes/PCB_PrimitiveVia.md +765 -0
  136. package/skill/references/classes/PCB_RayTracerEngine.md +263 -0
  137. package/skill/references/classes/PCB_SelectControl.md +495 -0
  138. package/skill/references/classes/PNL_Document.md +83 -0
  139. package/skill/references/classes/SCH_Document.md +809 -0
  140. package/skill/references/classes/SCH_Drc.md +242 -0
  141. package/skill/references/classes/SCH_Event.md +583 -0
  142. package/skill/references/classes/SCH_ManufactureData.md +1205 -0
  143. package/skill/references/classes/SCH_Net.md +200 -0
  144. package/skill/references/classes/SCH_Netlist.md +191 -0
  145. package/skill/references/classes/SCH_Primitive.md +337 -0
  146. package/skill/references/classes/SCH_PrimitiveArc.md +692 -0
  147. package/skill/references/classes/SCH_PrimitiveAttribute.md +590 -0
  148. package/skill/references/classes/SCH_PrimitiveBus.md +624 -0
  149. package/skill/references/classes/SCH_PrimitiveCircle.md +683 -0
  150. package/skill/references/classes/SCH_PrimitiveComponent.md +2240 -0
  151. package/skill/references/classes/SCH_PrimitiveObject.md +666 -0
  152. package/skill/references/classes/SCH_PrimitivePin.md +754 -0
  153. package/skill/references/classes/SCH_PrimitivePolygon.md +627 -0
  154. package/skill/references/classes/SCH_PrimitiveRectangle.md +731 -0
  155. package/skill/references/classes/SCH_PrimitiveText.md +746 -0
  156. package/skill/references/classes/SCH_PrimitiveWire.md +703 -0
  157. package/skill/references/classes/SCH_SelectControl.md +520 -0
  158. package/skill/references/classes/SCH_SimulationEngine.md +133 -0
  159. package/skill/references/classes/SCH_Utils.md +121 -0
  160. package/skill/references/classes/SYS_ClientUrl.md +173 -0
  161. package/skill/references/classes/SYS_Dialog.md +825 -0
  162. package/skill/references/classes/SYS_Environment.md +502 -0
  163. package/skill/references/classes/SYS_FileManager.md +1686 -0
  164. package/skill/references/classes/SYS_FileSystem.md +1171 -0
  165. package/skill/references/classes/SYS_FontManager.md +224 -0
  166. package/skill/references/classes/SYS_FormatConversion.md +349 -0
  167. package/skill/references/classes/SYS_HeaderMenu.md +479 -0
  168. package/skill/references/classes/SYS_I18n.md +861 -0
  169. package/skill/references/classes/SYS_IFrame.md +535 -0
  170. package/skill/references/classes/SYS_LoadingAndProgressBar.md +246 -0
  171. package/skill/references/classes/SYS_Log.md +424 -0
  172. package/skill/references/classes/SYS_Math.md +1565 -0
  173. package/skill/references/classes/SYS_Message.md +363 -0
  174. package/skill/references/classes/SYS_MessageBox.md +285 -0
  175. package/skill/references/classes/SYS_MessageBus.md +1618 -0
  176. package/skill/references/classes/SYS_PanelControl.md +696 -0
  177. package/skill/references/classes/SYS_RightClickMenu.md +175 -0
  178. package/skill/references/classes/SYS_Setting.md +85 -0
  179. package/skill/references/classes/SYS_ShortcutKey.md +623 -0
  180. package/skill/references/classes/SYS_Storage.md +484 -0
  181. package/skill/references/classes/SYS_Timer.md +447 -0
  182. package/skill/references/classes/SYS_ToastMessage.md +194 -0
  183. package/skill/references/classes/SYS_Tool.md +241 -0
  184. package/skill/references/classes/SYS_Unit.md +594 -0
  185. package/skill/references/classes/SYS_WebSocket.md +401 -0
  186. package/skill/references/classes/SYS_Window.md +850 -0
  187. package/skill/references/enums/EDMT_EditorDocumentType.md +279 -0
  188. package/skill/references/enums/EDMT_EditorSplitScreenDirection.md +48 -0
  189. package/skill/references/enums/EDMT_EditorTabEventType.md +63 -0
  190. package/skill/references/enums/EDMT_IndicatorMarkerType.md +81 -0
  191. package/skill/references/enums/EDMT_ItemType.md +158 -0
  192. package/skill/references/enums/EDMT_ProjectCollaborationMode.md +48 -0
  193. package/skill/references/enums/ELIB_DeviceJlcLibraryCategory.md +48 -0
  194. package/skill/references/enums/ELIB_LibraryType.md +114 -0
  195. package/skill/references/enums/ELIB_PreviewType.md +70 -0
  196. package/skill/references/enums/ELIB_SimulationModelType.md +48 -0
  197. package/skill/references/enums/ELIB_SymbolType.md +125 -0
  198. package/skill/references/enums/EPCB_AutoRoutingCornerStyle.md +48 -0
  199. package/skill/references/enums/EPCB_AutoRoutingExistingPrimitiveMode.md +48 -0
  200. package/skill/references/enums/EPCB_AutoRoutingOptimization.md +48 -0
  201. package/skill/references/enums/EPCB_DocumentCanvasUpdateCalculationActiveStatus.md +48 -0
  202. package/skill/references/enums/EPCB_DocumentRatlineCalculatingActiveStatus.md +52 -0
  203. package/skill/references/enums/EPCB_InactiveLayerDisplayMode.md +59 -0
  204. package/skill/references/enums/EPCB_LayerColorConfiguration.md +81 -0
  205. package/skill/references/enums/EPCB_LayerId.md +882 -0
  206. package/skill/references/enums/EPCB_LayerStatus.md +59 -0
  207. package/skill/references/enums/EPCB_LayerType.md +114 -0
  208. package/skill/references/enums/EPCB_MouseEventType.md +59 -0
  209. package/skill/references/enums/EPCB_NetEventType.md +59 -0
  210. package/skill/references/enums/EPCB_PcbPlateType.md +48 -0
  211. package/skill/references/enums/EPCB_PdfOutputMethod.md +59 -0
  212. package/skill/references/enums/EPCB_PrimitiveArcInteractiveMode.md +48 -0
  213. package/skill/references/enums/EPCB_PrimitiveDimensionType.md +59 -0
  214. package/skill/references/enums/EPCB_PrimitiveEventType.md +59 -0
  215. package/skill/references/enums/EPCB_PrimitiveFillMode.md +63 -0
  216. package/skill/references/enums/EPCB_PrimitivePadHeatWeldingConnectionMethod.md +59 -0
  217. package/skill/references/enums/EPCB_PrimitivePadHoleType.md +59 -0
  218. package/skill/references/enums/EPCB_PrimitivePadShapeType.md +81 -0
  219. package/skill/references/enums/EPCB_PrimitivePadType.md +59 -0
  220. package/skill/references/enums/EPCB_PrimitivePourFillMethod.md +59 -0
  221. package/skill/references/enums/EPCB_PrimitiveRegionRuleType.md +96 -0
  222. package/skill/references/enums/EPCB_PrimitiveStringAlignMode.md +125 -0
  223. package/skill/references/enums/EPCB_PrimitiveType.md +202 -0
  224. package/skill/references/enums/EPCB_PrimitiveViaType.md +59 -0
  225. package/skill/references/enums/ESCH_DynamicSimulationEnginePullEventType.md +103 -0
  226. package/skill/references/enums/ESCH_DynamicSimulationEnginePushEventType.md +81 -0
  227. package/skill/references/enums/ESCH_ExportDocumentFileType.md +59 -0
  228. package/skill/references/enums/ESCH_MouseEventType.md +48 -0
  229. package/skill/references/enums/ESCH_PrimitiveComponentType.md +125 -0
  230. package/skill/references/enums/ESCH_PrimitiveEventType.md +70 -0
  231. package/skill/references/enums/ESCH_PrimitiveFillStyle.md +114 -0
  232. package/skill/references/enums/ESCH_PrimitiveLineType.md +70 -0
  233. package/skill/references/enums/ESCH_PrimitivePinShape.md +70 -0
  234. package/skill/references/enums/ESCH_PrimitivePinType.md +147 -0
  235. package/skill/references/enums/ESCH_PrimitiveTextAlignMode.md +125 -0
  236. package/skill/references/enums/ESCH_PrimitiveType.md +180 -0
  237. package/skill/references/enums/ESCH_SimulationNetlistType.md +37 -0
  238. package/skill/references/enums/ESCH_SpiceSimulationEnginePullEventType.md +48 -0
  239. package/skill/references/enums/ESCH_SpiceSimulationEnginePushEventType.md +70 -0
  240. package/skill/references/enums/ESYS_BottomPanelTab.md +81 -0
  241. package/skill/references/enums/ESYS_HeaderMenuEnvironment.md +158 -0
  242. package/skill/references/enums/ESYS_ImportProjectBoardOutlineSource.md +52 -0
  243. package/skill/references/enums/ESYS_ImportProjectImportOption.md +59 -0
  244. package/skill/references/enums/ESYS_ImportProjectSchematicObjectStyle.md +48 -0
  245. package/skill/references/enums/ESYS_ImportProjectViaSolderMaskExpansion.md +52 -0
  246. package/skill/references/enums/ESYS_LeftPanelTab.md +81 -0
  247. package/skill/references/enums/ESYS_LogType.md +103 -0
  248. package/skill/references/enums/ESYS_NetlistType.md +114 -0
  249. package/skill/references/enums/ESYS_RightPanelTab.md +202 -0
  250. package/skill/references/enums/ESYS_ShortcutKeyEffectiveEditorRange.md +191 -0
  251. package/skill/references/enums/ESYS_ShortcutKeyEffectiveEditorScene.md +92 -0
  252. package/skill/references/enums/ESYS_StartPageQuickStartItem.md +206 -0
  253. package/skill/references/enums/ESYS_Theme.md +48 -0
  254. package/skill/references/enums/ESYS_ToastMessageType.md +81 -0
  255. package/skill/references/enums/ESYS_Unit.md +103 -0
  256. package/skill/references/enums/ESYS_WindowEventType.md +48 -0
  257. package/skill/references/enums/ESYS_WindowOpenTarget.md +48 -0
  258. package/skill/references/enums/NetportDeviceName.md +147 -0
  259. package/skill/references/enums/SchToolBarDeviceName.md +279 -0
  260. package/skill/references/interfaces/BoardProps.md +169 -0
  261. package/skill/references/interfaces/ButtonProps.md +169 -0
  262. package/skill/references/interfaces/CheckBoxProps.md +196 -0
  263. package/skill/references/interfaces/ComponentPropsMap.md +448 -0
  264. package/skill/references/interfaces/DialogProps.md +385 -0
  265. package/skill/references/interfaces/FlexItemProps.md +116 -0
  266. package/skill/references/interfaces/FlexProps.md +224 -0
  267. package/skill/references/interfaces/GridItemProps.md +143 -0
  268. package/skill/references/interfaces/GridProps.md +143 -0
  269. package/skill/references/interfaces/IDMT_BoardItem.md +171 -0
  270. package/skill/references/interfaces/IDMT_BriefProjectItem.md +171 -0
  271. package/skill/references/interfaces/IDMT_EditorDocumentItem.md +169 -0
  272. package/skill/references/interfaces/IDMT_EditorSplitScreenItem.md +173 -0
  273. package/skill/references/interfaces/IDMT_EditorTabItem.md +169 -0
  274. package/skill/references/interfaces/IDMT_FolderItem.md +225 -0
  275. package/skill/references/interfaces/IDMT_IndicatorMarkerShape.md +393 -0
  276. package/skill/references/interfaces/IDMT_PanelItem.md +144 -0
  277. package/skill/references/interfaces/IDMT_PcbItem.md +171 -0
  278. package/skill/references/interfaces/IDMT_ProjectItem.md +143 -0
  279. package/skill/references/interfaces/IDMT_SchematicItem.md +225 -0
  280. package/skill/references/interfaces/IDMT_SchematicPageItem.md +198 -0
  281. package/skill/references/interfaces/IDMT_TeamItem.md +144 -0
  282. package/skill/references/interfaces/IDMT_WorkspaceItem.md +117 -0
  283. package/skill/references/interfaces/IDesignPortal.md +103 -0
  284. package/skill/references/interfaces/ILIB_3DModelItem.md +198 -0
  285. package/skill/references/interfaces/ILIB_3DModelSearchItem.md +277 -0
  286. package/skill/references/interfaces/ILIB_CbbItem.md +225 -0
  287. package/skill/references/interfaces/ILIB_CbbSearchItem.md +277 -0
  288. package/skill/references/interfaces/ILIB_ClassificationIndex.md +150 -0
  289. package/skill/references/interfaces/ILIB_DeviceAssociationItem.md +210 -0
  290. package/skill/references/interfaces/ILIB_DeviceExtendPropertyItem.md +304 -0
  291. package/skill/references/interfaces/ILIB_DeviceItem.md +279 -0
  292. package/skill/references/interfaces/ILIB_DevicePropertiesForSearch.md +250 -0
  293. package/skill/references/interfaces/ILIB_DeviceSearchItem.md +521 -0
  294. package/skill/references/interfaces/ILIB_ExtendLibrary3DModelFunctions.md +64 -0
  295. package/skill/references/interfaces/ILIB_ExtendLibraryCbbFunctions.md +99 -0
  296. package/skill/references/interfaces/ILIB_ExtendLibraryClassificationIndex.md +150 -0
  297. package/skill/references/interfaces/ILIB_ExtendLibraryDeviceFunctions.md +157 -0
  298. package/skill/references/interfaces/ILIB_ExtendLibraryFootprintFunctions.md +63 -0
  299. package/skill/references/interfaces/ILIB_ExtendLibraryFunctions.md +123 -0
  300. package/skill/references/interfaces/ILIB_ExtendLibraryItem.md +97 -0
  301. package/skill/references/interfaces/ILIB_ExtendLibraryItemIndex.md +98 -0
  302. package/skill/references/interfaces/ILIB_ExtendLibrarySearchProperty.md +115 -0
  303. package/skill/references/interfaces/ILIB_ExtendLibrarySearchResult.md +169 -0
  304. package/skill/references/interfaces/ILIB_ExtendLibrarySearchResultDataLine.md +234 -0
  305. package/skill/references/interfaces/ILIB_ExtendLibrarySymbolFunctions.md +105 -0
  306. package/skill/references/interfaces/ILIB_ExtendLibraryUserIndex.md +96 -0
  307. package/skill/references/interfaces/ILIB_FootprintItem.md +198 -0
  308. package/skill/references/interfaces/ILIB_FootprintPropertiesForSearch.md +61 -0
  309. package/skill/references/interfaces/ILIB_FootprintSearchItem.md +277 -0
  310. package/skill/references/interfaces/ILIB_LibraryInfo.md +92 -0
  311. package/skill/references/interfaces/ILIB_LibraryItem.md +115 -0
  312. package/skill/references/interfaces/ILIB_PanelLibraryItem.md +198 -0
  313. package/skill/references/interfaces/ILIB_PanelLibrarySearchItem.md +277 -0
  314. package/skill/references/interfaces/ILIB_SimulationModelItem.md +306 -0
  315. package/skill/references/interfaces/ILIB_SimulationModelSearchItem.md +304 -0
  316. package/skill/references/interfaces/ILIB_SymbolItem.md +279 -0
  317. package/skill/references/interfaces/ILIB_SymbolPropertiesForSearch.md +61 -0
  318. package/skill/references/interfaces/ILIB_SymbolSearchItem.md +304 -0
  319. package/skill/references/interfaces/IPCB_AutoLayoutResult.md +169 -0
  320. package/skill/references/interfaces/IPCB_AutoRoutingProps.md +220 -0
  321. package/skill/references/interfaces/IPCB_AutoRoutingResult.md +169 -0
  322. package/skill/references/interfaces/IPCB_BomPropertiesTableColumns.md +169 -0
  323. package/skill/references/interfaces/IPCB_DifferentialPairItem.md +115 -0
  324. package/skill/references/interfaces/IPCB_DiscretizeOptions.md +65 -0
  325. package/skill/references/interfaces/IPCB_DiscretizedPoint.md +88 -0
  326. package/skill/references/interfaces/IPCB_EqualLengthNetGroupItem.md +115 -0
  327. package/skill/references/interfaces/IPCB_LayerItem.md +277 -0
  328. package/skill/references/interfaces/IPCB_NetClassItem.md +115 -0
  329. package/skill/references/interfaces/IPCB_NetInfo.md +115 -0
  330. package/skill/references/interfaces/IPCB_PadPairGroupItem.md +88 -0
  331. package/skill/references/interfaces/IPCB_PadPairMinWireLengthItem.md +88 -0
  332. package/skill/references/interfaces/IPCB_PhysicalStackingConfiguration.md +115 -0
  333. package/skill/references/interfaces/IPCB_Primitive.md +218 -0
  334. package/skill/references/interfaces/IPCB_PrimitiveAPI.md +175 -0
  335. package/skill/references/interfaces/IPCB_PrimitivePadHeatWelding.md +151 -0
  336. package/skill/references/interfaces/IPCB_PrimitivePouredPourFill.md +142 -0
  337. package/skill/references/interfaces/IPCB_PrimitiveSolderMaskAndPasteMaskExpansion.md +154 -0
  338. package/skill/references/interfaces/IPCB_SubstratePhysicalProperties.md +88 -0
  339. package/skill/references/interfaces/IRawNet.md +103 -0
  340. package/skill/references/interfaces/IRawPureSchematic.md +80 -0
  341. package/skill/references/interfaces/IRawSchematic.md +103 -0
  342. package/skill/references/interfaces/IRawWire.md +149 -0
  343. package/skill/references/interfaces/ISCH_DrcError.md +142 -0
  344. package/skill/references/interfaces/ISCH_DrcErrorPrimitive.md +142 -0
  345. package/skill/references/interfaces/ISCH_ExportPngResolution.md +94 -0
  346. package/skill/references/interfaces/ISCH_NetInfo.md +88 -0
  347. package/skill/references/interfaces/ISCH_Primitive.md +219 -0
  348. package/skill/references/interfaces/ISCH_PrimitiveAPI.md +175 -0
  349. package/skill/references/interfaces/ISCH_ProjectNetInfo.md +142 -0
  350. package/skill/references/interfaces/ISCH_WireInfo.md +169 -0
  351. package/skill/references/interfaces/ISYS_FileSystemFileList.md +169 -0
  352. package/skill/references/interfaces/ISYS_HeaderMenuSub1MenuItem.md +174 -0
  353. package/skill/references/interfaces/ISYS_HeaderMenuSub2MenuItem.md +147 -0
  354. package/skill/references/interfaces/ISYS_HeaderMenuTopMenuItem.md +115 -0
  355. package/skill/references/interfaces/ISYS_HeaderMenus.md +408 -0
  356. package/skill/references/interfaces/ISYS_LogLine.md +115 -0
  357. package/skill/references/interfaces/ISYS_MathBBox.md +142 -0
  358. package/skill/references/interfaces/ISYS_MathPoint.md +88 -0
  359. package/skill/references/interfaces/ISYS_MathPolygonWithHoles.md +92 -0
  360. package/skill/references/interfaces/ISYS_MessageBusTask.md +115 -0
  361. package/skill/references/interfaces/ISYS_MultilingualLanguagesData.md +13 -0
  362. package/skill/references/interfaces/ISYS_PcbComparisonResponse.md +115 -0
  363. package/skill/references/interfaces/ISYS_RightClickMenuItem.md +174 -0
  364. package/skill/references/interfaces/ISYS_ShortcutKeyData.md +169 -0
  365. package/skill/references/interfaces/ISYS_ShortcutKeyDataWithCallFn.md +62 -0
  366. package/skill/references/interfaces/ISYS_ShortcutKeyDataWithUserDefinedShortcutKey.md +62 -0
  367. package/skill/references/interfaces/ISYS_WindowEventListenerRemovableObject.md +109 -0
  368. package/skill/references/interfaces/IconProps.md +88 -0
  369. package/skill/references/interfaces/ImageProps.md +115 -0
  370. package/skill/references/interfaces/InputProps.md +520 -0
  371. package/skill/references/interfaces/ListChildren.md +223 -0
  372. package/skill/references/interfaces/ListProps.md +223 -0
  373. package/skill/references/interfaces/ModalProps.md +358 -0
  374. package/skill/references/interfaces/RadioGroupProps.md +196 -0
  375. package/skill/references/interfaces/RadioItem.md +115 -0
  376. package/skill/references/interfaces/ScrollerProps.md +169 -0
  377. package/skill/references/interfaces/SelectListItem.md +142 -0
  378. package/skill/references/interfaces/SelectProps.md +169 -0
  379. package/skill/references/interfaces/SlotProps.md +88 -0
  380. package/skill/references/interfaces/StyleProps.md +385 -0
  381. package/skill/references/interfaces/TextAreaProps.md +196 -0
  382. package/skill/references/interfaces/TextProps.md +169 -0
  383. package/skill/references/types/ISYS_LanguageKeyValuePairs.md +13 -0
  384. package/skill/references/types/TPCB_LayerTypesOfInnerLayer.md +12 -0
  385. package/skill/references/types/TPCB_LayersInTheSelectable.md +43 -0
  386. package/skill/references/types/TPCB_LayersOfComponent.md +12 -0
  387. package/skill/references/types/TPCB_LayersOfCopper.md +16 -0
  388. package/skill/references/types/TPCB_LayersOfCustom.md +42 -0
  389. package/skill/references/types/TPCB_LayersOfDimension.md +17 -0
  390. package/skill/references/types/TPCB_LayersOfFill.md +29 -0
  391. package/skill/references/types/TPCB_LayersOfImage.md +23 -0
  392. package/skill/references/types/TPCB_LayersOfInner.md +42 -0
  393. package/skill/references/types/TPCB_LayersOfLine.md +26 -0
  394. package/skill/references/types/TPCB_LayersOfObject.md +13 -0
  395. package/skill/references/types/TPCB_LayersOfPad.md +12 -0
  396. package/skill/references/types/TPCB_LayersOfRegion.md +12 -0
  397. package/skill/references/types/TPCB_NumberOfCopperLayers.md +10 -0
  398. package/skill/references/types/TPCB_PolygonSourceArray.md +83 -0
  399. package/skill/references/types/TPCB_PrimitiveDimensionCoordinateSet.md +67 -0
  400. package/skill/references/types/TPCB_PrimitivePadHole.md +31 -0
  401. package/skill/references/types/TPCB_PrimitivePadShape.md +62 -0
  402. package/skill/references/types/TPCB_PrimitiveSpecialPadShape.md +20 -0
  403. package/skill/references/types/TSYS_MathPolygonGroup.md +16 -0
  404. package/skill/references/types/TSYS_MathPolygonInput.md +21 -0
  405. package/skill/references/types/TSYS_PcbComparisonErrorCode.md +10 -0
  406. package/skill/references/types/TSYS_ShortcutKeys.md +97 -0
  407. package/skill/user-guide/using-extension.md +47 -0
package/lib/index.js CHANGED
@@ -27,8 +27,10 @@ import { EdaBackend, OFFICIAL_CODES, BRIDGE_PORTS } from './backend.js'
27
27
  import { installOfficialBridge, isBridgeInstalled, bridgeDir, bridgeScriptPath, OFFICIAL_EXT_URL } from './installer.js'
28
28
  import { createSnapshot } from './snapshot.js'
29
29
  import { pickSpots } from './layout.js'
30
+ import { buildOverview, pickSpotsPcb, saveTrace } from './board.js'
30
31
  import { ActivityLog } from './activity.js'
31
32
  import { CAPABILITIES } from './capabilities.js'
33
+ import { readSkillDoc, listSkillDocs } from './skill.js'
32
34
  import { generateSchematic, wrapAsProject } from '../src/json-gen.js'
33
35
  import { validateSchematic, checkConnectivity, deriveNetlist } from '../src/validate.js'
34
36
  import { translateRequest, TEMPLATE_CATALOG, describeDesign } from '../src/nl-to-design.js'
@@ -61,6 +63,7 @@ export const EDA_GUIDANCE =
61
63
  '工具:eda_status(状态)、eda_bridge_install(一键装官方桥)、eda_backend_connect(启动/连接官方桥)、eda_exec(执行任意官方 eda.* 代码——云端实时生成的双手)、eda_pick_spot(**框内定位**:读页面尺寸+已有图元→返回互不冲突的框内网格空位;放元件前先调用)、eda_snapshot(**紧急保存**:画板现场 .epro2 + 预览 SVG + 网表/BOM + agent 动作日志 → ~/.dsh/eda/snapshots/,断连也能留档)、' +
62
64
  'eda_sch_drc / eda_get_netlist / eda_get_bom(校验/导出,需连接)、eda_generate_schematic_json(**离线兜底**:本地生成可导入的标准版 JSON,写入 ~/.dsh/eda/output/;仅在无法连接画板时使用,连接时一律走官方 API 云端实时)、' +
63
65
  'eda_template_list / eda_translate_request(模板与需求翻译,供离线/兜底使用)。' +
66
+ '**官方 Skill 全库已接入**:官方易达 skill 知识随插件 vendored(SKILL.md 总纲 / references/classes/*.md 逐类 API / guide、user-guide、format 教程与格式)。规划任何画板动作前先用 eda_skill_read 查阅(顺序:INDEX.md → 对应类文档 → eda_exec 落地);不确定 API 存在性也可先 eda_capabilities。' +
64
67
  '**放置定位(硬规则,禁止乱放)**:原理图坐标单位 10mil、图纸 A4≈1170×825,放置前必须先 `eda_exec` 读页面尺寸(dmt_Project.getCurrentProjectInfo()→titleBlockData.Width/Height)与已有图元位置(sch_PrimitiveComponent.getAll()+getState_X/Y 在代码内映射),只放**图框内边距≥80、网格 100 步进、与已有图元间距≥150**的空位(或直接调 eda_pick_spot);导线用 getAllPinsByPrimitiveId 取真实引脚坐标后画水平/垂直线段(只连引脚)。PCB 坐标单位 1mil,同样读已有焊盘(getAllPins)后居中布件、焊盘级走线。' +
65
68
  '**已知缺陷与技巧(实测,勿踩坑)**:`pcb_Document.importChanges` 与 `pcb_Net.setNetlist` 实测不可靠(勿用于网表同步);`sch_Netlist.getNetlist` 与 `pcb_Net.getNetlist("EasyEDA")` 会挂起(网表一律用 `sch_ManufactureData.getNetlistFile` 并 `await f.text()`);`getBomFile` 返回二进制 xlsx(arrayBuffer→base64 处理);DRC 用 `check(true,false,true)` 拿详情;`sch_PrimitiveComponent.getAll` 间歇失败需重试;PCB 板框(layer 11)官方无绘制 API(人工/导入)。' +
66
69
  '**主动协作(能力入口)**:你能主动为用户完成——读工程/文档、放任意大类元件(搜库→定位→放置)、引脚级连线、网络标志/端口、DRC、网表/BOM 导出、PCB 元件/过孔/走线、现场截图、紧急保存。规划任务时若不确定某个 API 是否存在或怎么调,先调 `eda_capabilities`(结构化能力清单+注意事项+实测片段),再用 `eda_exec` 落地;用户提到画板相关需求时主动提议并执行,不要等用户一字一句教。' +
@@ -169,7 +172,7 @@ function describeEdaAction(code) {
169
172
  return map[`${mod}.${fn}`] ?? `调用 ${mod}.${fn}()`
170
173
  }
171
174
 
172
- /** Loopback-only guard (simplified from dsh-logcat): refuses non-local callers. */
175
+ /** Loopback-only guard: refuses non-local callers (DSH web-server convention). */
173
176
  function isLoopbackRequest(req) {
174
177
  const address = req.socket?.remoteAddress ?? ''
175
178
  if (address === '') return true // no socket info (tests / some proxies) — allow
@@ -832,12 +835,14 @@ async function readSchLayout(backend) {
832
835
  function edaPickSpotTool(backend) {
833
836
  return defineTool({
834
837
  name: 'eda_pick_spot',
835
- description: 'Pick in-frame empty grid spots on the CURRENT schematic page (units 10mil; A4 ≈ 1170 x 825). ' +
836
- 'Reads the page size + existing primitives via the OFFICIAL API and returns collision-free points (frame margin 80, grid 100, min gap 150). ' +
837
- 'USE BEFORE placing any component: get spots, then sch_PrimitiveComponent.create(dev, spot.x, spot.y) — never place outside the frame. ' +
838
- 'Triggers: 在哪里放, where to place, 框内定位, pick a spot.',
838
+ description: 'Pick collision-free empty spots on the CURRENT document before placing components. ' +
839
+ 'kind=sch (default): reads the schematic page size (units 10mil; A4 ≈ 1170 x 825) + existing primitives, returns in-frame grid spots (margin 80, grid 100, gap 150). ' +
840
+ 'kind=pcb: reads existing PCB primitives (units 1mil) and returns spots around their bounding box (gap 600, grid 300). ' +
841
+ 'USE BEFORE placing any component: get spots, then sch_PrimitiveComponent.create / pcb_PrimitiveComponent.create — never place blind. ' +
842
+ 'Triggers: 在哪里放, where to place, 框内定位, pick a spot, PCB放哪里.',
839
843
  parameters: {
840
844
  count: { type: 'integer', description: '需要的空位数量(默认 1)' },
845
+ kind: { type: 'string', description: 'sch(默认,原理图图框内)| pcb(PCB 围绕已有图元)' },
841
846
  },
842
847
  output: {
843
848
  schema: {
@@ -876,22 +881,290 @@ function edaPickSpotTool(backend) {
876
881
  },
877
882
  async execute(args) {
878
883
  const count = Math.max(1, Math.min(50, Number(args?.count) || 1))
879
- const layout = await readSchLayout(backend)
880
- if (!layout.ok) return { ok: false, error: layout.error, page: '', size: '', usedCount: 0, spots: [], note: '', }
881
- const spots = pickSpots({ pageWidth: layout.width, pageHeight: layout.height, used: layout.used, count })
884
+ const kind = args?.kind === 'pcb' ? 'pcb' : 'sch'
885
+ if (kind === 'sch') {
886
+ const layout = await readSchLayout(backend)
887
+ if (!layout.ok) return { ok: false, error: layout.error, page: '', size: '', usedCount: 0, spots: [], note: '', }
888
+ const spots = pickSpots({ pageWidth: layout.width, pageHeight: layout.height, used: layout.used, count })
889
+ return {
890
+ ok: spots.length > 0,
891
+ page: layout.name,
892
+ size: `${layout.width} x ${layout.height} (10mil)`,
893
+ usedCount: layout.used.length,
894
+ spots,
895
+ note: spots.length < count ? `仅找到 ${spots.length} 个空位(页面空间不足,建议换一页或改用更小间距)` : `框内空位推荐(边距 80 / 网格 100 / 与已有图元间距 ≥150)`,
896
+ error: '',
897
+ }
898
+ }
899
+ const layout = await readPcbLayout(backend)
900
+ if (!layout.ok) return { ok: false, error: layout.error, page: 'PCB', size: '(1mil)', usedCount: 0, spots: [], note: '', }
901
+ const spots = pickSpotsPcb(layout.used, count)
882
902
  return {
883
903
  ok: spots.length > 0,
884
- page: layout.name,
885
- size: `${layout.width} x ${layout.height} (10mil)`,
904
+ page: 'PCB',
905
+ size: '(1mil · 围绕已有图元)',
886
906
  usedCount: layout.used.length,
887
907
  spots,
888
- note: spots.length < count ? `仅找到 ${spots.length} 个空位(页面空间不足,建议换一页或改用更小间距)` : `框内空位推荐(边距 80 / 网格 100 / 与已有图元间距 ≥150)`,
908
+ note: spots.length < count ? `仅找到 ${spots.length} 个空位` : `PCB 空位推荐(与已有图元间距 ≥600 / 网格 300)`,
889
909
  error: '',
890
910
  }
891
911
  },
892
912
  })
893
913
  }
894
914
 
915
+ /** 读 PCB 现有图元分布(元件/过孔/线),供 pcb 定位。 */
916
+ async function readPcbLayout(backend) {
917
+ const CODE = `return await (async () => {
918
+ const used = [];
919
+ const grab = async (api) => {
920
+ try { const all = await eda[api].getAll(); for (const x of (all || [])) { try { used.push({ x: x.getState_X(), y: x.getState_Y() }); } catch (e) {} } } catch (e) {}
921
+ };
922
+ await grab('pcb_PrimitiveComponent');
923
+ await grab('pcb_PrimitiveVia');
924
+ await grab('pcb_PrimitiveLine');
925
+ return { used, count: used.length };
926
+ })();`
927
+ const r = await backend.execute(CODE, 30000)
928
+ if (!r.ok) return { ok: false, error: r.error }
929
+ try { const j = JSON.parse(r.result); return { ok: true, used: j.used ?? [], count: j.count ?? 0 } } catch { return { ok: false, error: 'pcb layout read failed' } }
930
+ }
931
+
932
+ /** 画板全览:当前文档的图元/网络摘要(agent 的眼睛,避免盲画)。 */
933
+ function edaBoardOverviewTool(backend) {
934
+ return defineTool({
935
+ name: 'eda_board_overview',
936
+ description: 'Overview the CURRENT document (domain / doc info / page size / components / wires / vias / lines / nets — pin coords with full=true). ' +
937
+ 'The agent\'s eyes on the board: call BEFORE drawing to know what exists, and after changes to verify. ' +
938
+ 'Triggers: 画板上有什么, what is on the board, 看看画板, overview, 当前画板内容.',
939
+ parameters: {
940
+ full: { type: 'boolean', description: '默认 false(前 40 个元件 + 网络 + 统计);true 时返回全部元件清单(≤200)' },
941
+ },
942
+ output: {
943
+ schema: {
944
+ type: 'object',
945
+ additionalProperties: false,
946
+ properties: {
947
+ ok: { type: 'boolean', required: true },
948
+ domain: { type: 'string' },
949
+ doc: { type: 'string' },
950
+ pageSize: { type: 'string' },
951
+ componentCount: { type: 'integer' },
952
+ wireCount: { type: 'integer' },
953
+ viaCount: { type: 'integer' },
954
+ lineCount: { type: 'integer' },
955
+ nets: { type: 'array', items: { type: 'string' } },
956
+ componentsPreview: {
957
+ type: 'array',
958
+ items: {
959
+ type: 'object',
960
+ additionalProperties: false,
961
+ properties: {
962
+ designator: { type: 'string', required: true },
963
+ name: { type: 'string' },
964
+ type: { type: 'string' },
965
+ x: { type: 'number' },
966
+ y: { type: 'number' },
967
+ net: { type: 'string' },
968
+ },
969
+ },
970
+ },
971
+ truncated: { type: 'boolean' },
972
+ error: { type: 'string' },
973
+ },
974
+ },
975
+ render: (_args, value) => {
976
+ if (value?.ok !== true) return { type: 'text', text: `画板全览失败: ${value?.error ?? '?'}` }
977
+ const lines = [
978
+ `${value.domain === 'pcb' ? 'PCB' : '原理图'}(${value.doc ?? '?'})· ${value.pageSize ?? ''}`,
979
+ `元件 ${value.componentCount ?? 0} · 导线 ${value.wireCount ?? 0} · 过孔 ${value.viaCount ?? 0} · 走线 ${value.lineCount ?? 0}`,
980
+ `网络: ${(value.nets ?? []).join(', ') || '(无)'}`,
981
+ ]
982
+ if ((value.componentsPreview ?? []).length > 0) {
983
+ lines.push('元件清单:')
984
+ for (const c of value.componentsPreview.slice(0, 20)) lines.push(` ${c.designator} ${c.name} @(${c.x},${c.y})${c.net ? ` [${c.net}]` : ''}`)
985
+ if (value.truncated) lines.push(` …共 ${value.componentCount} 个(full=true 看全)`)
986
+ }
987
+ return { type: 'text', text: lines.join('\n') }
988
+ },
989
+ },
990
+ async execute(args) {
991
+ const full = args?.full === true
992
+ const r = await backend.execute(OVERVIEW_CODE, 40000)
993
+ if (!r.ok) return { ok: false, error: r.error, domain: 'sch', doc: '', pageSize: '', componentCount: 0, wireCount: 0, viaCount: 0, lineCount: 0, nets: [], componentsPreview: [], truncated: false }
994
+ let raw
995
+ try { raw = JSON.parse(r.result) } catch { return { ok: false, error: 'overview parse failed', domain: 'sch', doc: '', pageSize: '', componentCount: 0, wireCount: 0, viaCount: 0, lineCount: 0, nets: [], componentsPreview: [], truncated: false } }
996
+ const o = buildOverview(raw, { full })
997
+ return { ok: true, ...o, doc: raw?.doc?.name ?? raw?.doc?.uuid ?? '' }
998
+ },
999
+ })
1000
+ }
1001
+
1002
+ const OVERVIEW_CODE = `return await (async () => {
1003
+ const sleep = (ms) => new Promise(r => setTimeout(r, ms));
1004
+ let info = null;
1005
+ for (let i = 0; i < 3 && info == null; i++) {
1006
+ try { info = await eda.dmt_SelectControl.getCurrentDocumentInfo(); } catch (e) { info = null; }
1007
+ if (info == null) await sleep(700);
1008
+ }
1009
+ const domain = info?.documentType === 3 ? 'pcb' : 'sch';
1010
+ const out = { domain, doc: info };
1011
+ if (domain === 'sch') {
1012
+ try {
1013
+ const proj = await eda.dmt_Project.getCurrentProjectInfo();
1014
+ const page = proj?.data?.[0]?.schematic?.page?.[0];
1015
+ out.pageSize = { w: Number(page?.titleBlockData?.Width?.value ?? 1170), h: Number(page?.titleBlockData?.Height?.value ?? 825), unit: '10mil' };
1016
+ } catch (e) {}
1017
+ let comps = []; let wires = [];
1018
+ for (let i = 0; i < 3; i++) {
1019
+ try { comps = await eda.sch_PrimitiveComponent.getAll(); break; } catch (e) { await sleep(700); }
1020
+ }
1021
+ try { wires = await eda.sch_PrimitiveWire.getAll(); } catch (e) { wires = []; }
1022
+ const nets = new Set();
1023
+ out.components = (comps || []).map(c => {
1024
+ let d = ''; let t = ''; let n = ''; let x = 0; let y = 0;
1025
+ try { d = (c.getState_Designator ? c.getState_Designator() : '') || ''; } catch (e) {}
1026
+ try { t = (c.getState_ComponentType ? c.getState_ComponentType() : '') || ''; } catch (e) {}
1027
+ try { n = (c.getState_Net ? c.getState_Net() : '') || ''; if (n) nets.add(n); } catch (e) {}
1028
+ try { x = c.getState_X(); y = c.getState_Y(); } catch (e) {}
1029
+ return { id: c.getState_PrimitiveId ? c.getState_PrimitiveId() : '', d, n, t, x, y };
1030
+ });
1031
+ out.wireCount = (wires || []).length;
1032
+ try { for (const w of (wires || [])) { const n = w.getState_Net ? w.getState_Net() : ''; if (n) nets.add(n); } } catch (e) {}
1033
+ out.nets = [...nets];
1034
+ } else {
1035
+ const grab = async (api) => {
1036
+ try { const all = await eda[api].getAll(); return (all || []).map(x => {
1037
+ let d = ''; let n = ''; let x = 0; let y = 0;
1038
+ try { d = (x.getState_Designator ? x.getState_Designator() : '') || ''; } catch (e) {}
1039
+ try { n = (x.getState_Net ? x.getState_Net() : '') || ''; } catch (e) {}
1040
+ try { x = x.getState_X(); y = x.getState_Y(); } catch (e) {}
1041
+ return { id: x.getState_PrimitiveId ? x.getState_PrimitiveId() : '', d, n, t: 'part', x, y };
1042
+ }); } catch (e) { return []; }
1043
+ };
1044
+ const comps = await grab('pcb_PrimitiveComponent');
1045
+ const vias = await grab('pcb_PrimitiveVia');
1046
+ const lines = await grab('pcb_PrimitiveLine');
1047
+ out.components = comps; out.viaCount = vias.length; out.lineCount = lines.length; out.wireCount = 0;
1048
+ const nets = new Set();
1049
+ for (const x of [...comps, ...vias, ...lines]) if (x.n) nets.add(x.n);
1050
+ out.nets = [...nets];
1051
+ }
1052
+ return out;
1053
+ })();`
1054
+
1055
+ /** 现场截图:缩放适配 → 截图 → 存 ~/.dsh/eda/shots/,agent 与用户可查看。 */
1056
+ function edaTraceTool(backend) {
1057
+ return defineTool({
1058
+ name: 'eda_trace',
1059
+ description: 'Capture the CURRENT document as a PNG (zooms to all primitives first; saves to ~/.dsh/eda/shots/). ' +
1060
+ 'Use to show/review the board state or keep a visual record after drawing. ' +
1061
+ 'Triggers: 截图, screenshot, 看看效果, capture the board.',
1062
+ parameters: {
1063
+ name: { type: 'string', description: '可选:文件名前缀(默认 board)' },
1064
+ },
1065
+ output: {
1066
+ schema: {
1067
+ type: 'object',
1068
+ additionalProperties: false,
1069
+ properties: {
1070
+ ok: { type: 'boolean', required: true },
1071
+ path: { type: 'string' },
1072
+ file: { type: 'string' },
1073
+ size: { type: 'integer' },
1074
+ error: { type: 'string' },
1075
+ },
1076
+ },
1077
+ render: (_args, value) => ({ type: 'text', text: value?.ok ? `✅ 截图已保存: ${value.path}(${((value.size ?? 0) / 1024).toFixed(1)}KB)` : `截图失败: ${value?.error ?? '?'}` }),
1078
+ },
1079
+ async execute(args) {
1080
+ const r = await backend.execute(TRACE_CODE, 60000)
1081
+ if (!r.ok) return { ok: false, path: '', file: '', size: 0, error: r.error }
1082
+ let j
1083
+ try { j = JSON.parse(r.result) } catch { return { ok: false, path: '', file: '', size: 0, error: 'trace parse failed' } }
1084
+ if (!j?.b64) return { ok: false, path: '', file: '', size: 0, error: j?.error ?? '未取到截图(请确认当前文档已打开)' }
1085
+ const saved = await saveTrace(j.b64, { name: typeof args?.name === 'string' && args.name !== '' ? args.name : 'board' })
1086
+ return saved.ok ? { ok: true, path: saved.path, file: saved.file, size: saved.size } : { ok: false, path: '', file: '', size: 0, error: saved.error }
1087
+ },
1088
+ })
1089
+ }
1090
+
1091
+ const TRACE_CODE = `return await (async () => {
1092
+ try { await eda.dmt_EditorControl.zoomToAllPrimitives(); } catch (e) {}
1093
+ await new Promise(r => setTimeout(r, 1200));
1094
+ const info = await eda.dmt_SelectControl.getCurrentDocumentInfo();
1095
+ const blob = await eda.dmt_EditorControl.getCurrentRenderedAreaImage(info.tabId);
1096
+ if (!blob) return null;
1097
+ const bytes = new Uint8Array(await blob.arrayBuffer());
1098
+ let bin = ''; for (let i = 0; i < bytes.length; i += 0x8000) bin += String.fromCharCode.apply(null, bytes.subarray(i, i + 0x8000));
1099
+ return { type: blob.type, size: bytes.length, b64: btoa(bin) };
1100
+ })();`
1101
+
1102
+ /** 一键验收:连接状态下的 DRC + 网表 + BOM 组合校验(agent 一步拿结论)。 */
1103
+ function edaVerifyTool(handle, backend) {
1104
+ return defineTool({
1105
+ name: 'eda_verify',
1106
+ description: 'One-shot acceptance check on the connected board: schematic DRC (verbose) + netlist + BOM in one call. ' +
1107
+ 'Returns summaries so the agent can report pass/fail immediately. Use after finishing a drawing. ' +
1108
+ 'Triggers: 验收, 检查一下, verify, 看看行不行.',
1109
+ parameters: {},
1110
+ output: {
1111
+ schema: {
1112
+ type: 'object',
1113
+ additionalProperties: false,
1114
+ properties: {
1115
+ ok: { type: 'boolean', required: true },
1116
+ drc: { type: 'string' },
1117
+ netlist: { type: 'string' },
1118
+ bom: { type: 'string' },
1119
+ errors: { type: 'array', items: { type: 'string' } },
1120
+ note: { type: 'string' },
1121
+ },
1122
+ },
1123
+ render: (_args, value) => ({
1124
+ type: 'text',
1125
+ text: [
1126
+ `验收: ${value?.ok ? '完成' : '部分失败'}`,
1127
+ value?.drc ? `DRC: ${value.drc}` : '',
1128
+ value?.netlist ? `网表: ${value.netlist}` : '',
1129
+ value?.bom ? `BOM: ${value.bom}` : '',
1130
+ ...(value?.errors ?? []).map((e) => `⚠ ${e}`),
1131
+ value?.note ?? '',
1132
+ ].filter(Boolean).join('\n'),
1133
+ }),
1134
+ },
1135
+ async execute(_args, exec) {
1136
+ const sid = sessionIdOf(exec)
1137
+ const id = pushPendingActivity({ sid, tool: 'eda_verify', action: '一键验收(DRC+网表+BOM)' })
1138
+ await handle.backend.refresh()
1139
+ const st = statusOf(handle.backend)
1140
+ if (!st.connected) {
1141
+ updateActivity(id, { status: 'error', ok: false, error: '官方桥未连接(门控拦截)' })
1142
+ return { ok: false, drc: '', netlist: '', bom: '', errors: ['官方桥未连接'], note: '' }
1143
+ }
1144
+ const errors = []
1145
+ const out = { ok: false, drc: '', netlist: '', bom: '', errors, note: '' }
1146
+ const drc = await handle.backend.execute('return await eda.sch_Drc.check(true, false, true);', 40000)
1147
+ if (drc.ok) {
1148
+ let sum = drc.result
1149
+ try { const arr = JSON.parse(drc.result); sum = arr.map((x) => `${x.type}:${x.count}`).join(', ') || '通过(0)' } catch { /* raw */ }
1150
+ out.drc = sum
1151
+ } else errors.push(`DRC: ${drc.error}`)
1152
+ const net = await handle.backend.execute(`return await (async () => { const f = await eda.sch_ManufactureData.getNetlistFile(); if (!f) return null; const t = await f.text(); return { len: t.length, comps: (() => { try { return Object.keys(JSON.parse(t).components ?? {}).length; } catch { return -1; } })() }; })();`, 40000)
1153
+ if (net.ok) {
1154
+ try { const j = JSON.parse(net.result); out.netlist = `文件 ${j?.len ?? '?'} 字节 · 元件 ${j?.comps ?? '?'}` } catch { out.netlist = net.result.slice(0, 80) }
1155
+ } else errors.push(`网表: ${net.error}`)
1156
+ const bom = await handle.backend.execute(`return await (async () => { const f = await eda.sch_ManufactureData.getBomFile(); if (!f) return null; return { name: f.name, size: f.size }; })();`, 40000)
1157
+ if (bom.ok) {
1158
+ try { const j = JSON.parse(bom.result); out.bom = `${j?.name ?? 'Export_BOM.xlsx'}(${((j?.size ?? 0) / 1024).toFixed(1)}KB)` } catch { out.bom = bom.result.slice(0, 80) }
1159
+ } else errors.push(`BOM: ${bom.error}`)
1160
+ out.ok = errors.length === 0
1161
+ out.note = errors.length === 0 ? '三项全部返回(DRC 明细见 UI 面板;完整内容用 eda_get_netlist / eda_get_bom)' : `${errors.length} 项未完成`
1162
+ updateActivity(id, { status: out.ok ? 'done' : 'error', ok: out.ok, action: '一键验收(DRC+网表+BOM)', result: `${out.drc} · ${out.netlist} · ${out.bom}`, error: out.errors.join('; '), durationMs: 0 })
1163
+ return out
1164
+ },
1165
+ })
1166
+ }
1167
+
895
1168
  /** 官方 API 能力清单:agent 规划时主动查 -> 用 eda_exec 落地。 */
896
1169
  function edaCapabilitiesTool() {
897
1170
  return defineTool({
@@ -943,6 +1216,57 @@ function edaCapabilitiesTool() {
943
1216
  })
944
1217
  }
945
1218
 
1219
+ /** 官方 skill 全库查阅:直接在对话里读取 vendored 官方文档(SKILL.md / 类 / guide 等)。 */
1220
+ function edaSkillReadTool() {
1221
+ return defineTool({
1222
+ name: 'eda_skill_read',
1223
+ description: 'Read the OFFICIAL EasyEDA skill docs (SKILL.md / references/classes/*.md / guide / user-guide / format / INDEX.md) — the full official API knowledge, vendored in the package. ' +
1224
+ 'Call before writing any eda.* code: INDEX.md first, then the specific class doc, then eda_exec. ' +
1225
+ 'Triggers: 官方文档, official skill, 查API文档, read skill class, 怎么看这个API.',
1226
+ parameters: {
1227
+ doc: { type: 'string', description: '文档相对路径,默认 INDEX.md;例如 references/classes/SCH_PrimitiveComponent.md、SKILL.md、guide/using-extension.md' },
1228
+ offset: { type: 'integer', description: '分页偏移字符数(默认 0;truncated=true 时用 nextOffset 继续)' },
1229
+ },
1230
+ output: {
1231
+ schema: {
1232
+ type: 'object',
1233
+ additionalProperties: false,
1234
+ properties: {
1235
+ ok: { type: 'boolean', required: true },
1236
+ doc: { type: 'string' },
1237
+ path: { type: 'string' },
1238
+ len: { type: 'integer' },
1239
+ start: { type: 'integer' },
1240
+ content: { type: 'string' },
1241
+ truncated: { type: 'boolean' },
1242
+ nextOffset: { type: 'integer' },
1243
+ suggestions: { type: 'array', items: { type: 'string' } },
1244
+ error: { type: 'string' },
1245
+ },
1246
+ },
1247
+ render: (_args, value) => {
1248
+ if (value?.ok === false) {
1249
+ let text = `官方文档查阅失败: ${value?.error ?? '?'}`
1250
+ const sug = value?.suggestions ?? []
1251
+ if (sug.length > 0) text += `\n可尝试(前若干):${sug.slice(0, 10).join('、')}`
1252
+ return [{ type: 'text', text }]
1253
+ }
1254
+ const head = `📖 ${value?.doc ?? ''}(${value?.len ?? 0} 字符 · 从 ${value?.start ?? 0} 起)`
1255
+ let text = `${head}\n${value?.content ?? ''}`
1256
+ if (value?.truncated) text += `\n…已截断,继续读:再次调用 doc=…&offset=${value?.nextOffset ?? 0}`
1257
+ return [{ type: 'text', text }]
1258
+ },
1259
+ },
1260
+ async execute(args) {
1261
+ const r = readSkillDoc(args?.doc, { offset: args?.offset })
1262
+ if (r.ok === false && typeof r.error === 'string' && r.error.startsWith('未知文档')) {
1263
+ r.suggestions = listSkillDocs().files.slice(0, 60)
1264
+ }
1265
+ return r
1266
+ },
1267
+ })
1268
+ }
1269
+
946
1270
  /** 紧急保存:把 agent 在画板上做的内容抓到本地(断连也能保留最后步骤)。 */function edaSnapshotTool(handle, backend) {
947
1271
  return defineTool({
948
1272
  name: 'eda_snapshot',
@@ -1071,6 +1395,10 @@ export function apply(ctx, config) {
1071
1395
  edaExecTool(backend),
1072
1396
  edaPickSpotTool(backend),
1073
1397
  edaCapabilitiesTool(),
1398
+ edaSkillReadTool(),
1399
+ edaBoardOverviewTool(backend),
1400
+ edaTraceTool(backend),
1401
+ edaVerifyTool(edaHandle, backend),
1074
1402
  edaSnapshotTool(edaHandle, backend),
1075
1403
  bridgeTool(edaHandle, backend, {
1076
1404
  name: 'eda_sch_drc',
package/lib/installer.js CHANGED
@@ -70,10 +70,10 @@ async function copyDir(src, dst) {
70
70
  }
71
71
 
72
72
  /**
73
- * Locate an existing `ws` package on this machine (the DSH host ships it via
74
- * dsh-logcat's dependency) so we can vendor it WITHOUT npm — this machine has
75
- * PowerShell ExecutionPolicy blocking `npm.ps1`, and offline copy is faster
76
- * and never touches the registry.
73
+ * Locate an existing `ws` package on this machine (the DSH host ships it) so
74
+ * we can vendor it WITHOUT npm — this machine has PowerShell ExecutionPolicy
75
+ * blocking `npm.ps1`, and offline copy is faster and never touches the
76
+ * registry.
77
77
  */
78
78
  export async function findExistingWs() {
79
79
  const profiles = join(homedir(), '.dsh', 'profiles')
package/lib/skill.js ADDED
@@ -0,0 +1,138 @@
1
+ /**
2
+ * dsh-lichuang-eda — 官方 EasyEDA skill 知识库查阅(eda_skill_read 数据源)。
3
+ *
4
+ * 官方 skill 知识文档已完整 vendored 在 <包根>/skill/ 下(SKILL.md 总纲、
5
+ * README.official.md、README.zh-Hans.official.md、references/classes/*.md 逐类
6
+ * API、references/enums|types|interfaces、guide/、user-guide/、format/)。本模块提供
7
+ * 三类能力,让 agent 在对话里直接用工具读取任意官方文档(不依赖文件权限):
8
+ * - resolveDoc(doc):把用户给出的相对 doc 规范化并安全解析为 SKILL_ROOT 内的绝对路径;
9
+ * - readSkillDoc(doc, opts):读取文档全文并支持按字符偏移分页;
10
+ * - listSkillDocs():枚举全部可查阅文档(相对 SKILL_ROOT,按目录分组排序,上限 400)。
11
+ *
12
+ * 安全性:doc 会做正斜杠/去前导斜杠/normalize 规范化,拒绝含 '..' 或空字节的输入
13
+ * (防路径穿越),且最终绝对路径必须位于 SKILL_ROOT 内且是存在的文件。
14
+ */
15
+ import { readdirSync, readFileSync, statSync } from 'node:fs'
16
+ import { join, dirname, normalize, relative, isAbsolute, sep } from 'node:path'
17
+ import { fileURLToPath } from 'node:url'
18
+
19
+ /** 官方 skill 知识根目录(<包根>/skill),基于本文件位置计算,不硬编码盘符。 */
20
+ export const SKILL_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', 'skill')
21
+
22
+ /** listSkillDocs 返回的文件数上限。 */
23
+ const MAX_DOCS = 400
24
+
25
+ /** 默认总览文档名(无 INDEX.md 时列表里以实际顶层 md 为准)。 */
26
+ const DEFAULT_DOC = 'INDEX.md'
27
+
28
+ /** 把绝对路径转成相对 SKILL_ROOT 的、用正斜杠分隔的文档路径。 */
29
+ function toRelSlash(absPath) {
30
+ return relative(SKILL_ROOT, absPath).split(sep).join('/')
31
+ }
32
+
33
+ /**
34
+ * 规范化并安全解析一个文档相对路径 → 返回 SKILL_ROOT 内存在的文件绝对路径;否则 null。
35
+ * - 正斜杠、去前导斜杠、normalize;
36
+ * - 含 '..' 或空字节 → null(防路径穿越);
37
+ * - 最终路径必须位于 SKILL_ROOT 内且是存在的文件 → 否则 null。
38
+ */
39
+ export function resolveDoc(doc = DEFAULT_DOC) {
40
+ let d = typeof doc === 'string' ? doc : String(doc ?? '')
41
+ d = d.replace(/\\/g, '/').replace(/^\/+/, '')
42
+ if (d === '') return null // 显式空串无效(只有 undefined/缺省走 DEFAULT_DOC)
43
+ if (d.includes('\0')) return null
44
+ if (d.split('/').includes('..')) return null
45
+ const norm = normalize(d) // 在 Windows 上产生反斜杠分隔
46
+ if (norm.split(sep).includes('..')) return null
47
+ const full = join(SKILL_ROOT, norm)
48
+ const rel = relative(SKILL_ROOT, full)
49
+ if (rel === '' || rel.startsWith('..') || isAbsolute(rel)) return null
50
+ try {
51
+ return statSync(full).isFile() ? full : null
52
+ } catch {
53
+ return null
54
+ }
55
+ }
56
+
57
+ /**
58
+ * 读取一份官方 skill 文档,支持按字符偏移分页。
59
+ * - doc 未命中 → { ok:false, error:'未知文档: <doc>(INDEX.md 可看总览)' };
60
+ * - 命中 → { ok:true, doc, path, len, start, content, truncated, nextOffset }。
61
+ */
62
+ export function readSkillDoc(doc, { offset = 0, maxChars = 12000 } = {}) {
63
+ const effDoc = (typeof doc === 'string' && doc.trim() !== '') ? doc : DEFAULT_DOC
64
+ const resolved = resolveDoc(doc)
65
+ if (!resolved) {
66
+ return { ok: false, error: `未知文档: ${effDoc}(${DEFAULT_DOC} 可看总览)` }
67
+ }
68
+ let text
69
+ try {
70
+ text = readFileSync(resolved, 'utf8')
71
+ } catch (error) {
72
+ return { ok: false, error: `读取失败: ${error instanceof Error ? error.message : String(error)}` }
73
+ }
74
+ const len = text.length
75
+ const start = Number.isFinite(Number(offset)) && Number(offset) > 0 ? Math.floor(Number(offset)) : 0
76
+ const sliceLen = Number.isFinite(Number(maxChars)) && Number(maxChars) > 0 ? Math.floor(Number(maxChars)) : 12000
77
+ const end = Math.min(len, start + sliceLen)
78
+ const content = text.slice(start, end)
79
+ const truncated = end < len
80
+ return {
81
+ ok: true,
82
+ doc: toRelSlash(resolved),
83
+ path: resolved,
84
+ len,
85
+ start,
86
+ content,
87
+ truncated,
88
+ nextOffset: end,
89
+ }
90
+ }
91
+
92
+ /** 递归收集目录下的全部 .md(onlyTop=true 时仅列直接文件),返回相对 SKILL_ROOT 的数组。 */
93
+ function collectMd(dir, onlyTop) {
94
+ const out = []
95
+ let entries
96
+ try {
97
+ entries = readdirSync(dir, { withFileTypes: true })
98
+ } catch {
99
+ return out
100
+ }
101
+ for (const e of entries) {
102
+ const full = join(dir, e.name)
103
+ if (onlyTop) {
104
+ if (e.isFile() && e.name.endsWith('.md')) out.push(toRelSlash(full))
105
+ } else if (e.isDirectory()) {
106
+ out.push(...collectMd(full, false))
107
+ } else if (e.isFile() && e.name.endsWith('.md')) {
108
+ out.push(toRelSlash(full))
109
+ }
110
+ }
111
+ return out.sort()
112
+ }
113
+
114
+ /**
115
+ * 枚举全部可查阅的官方 skill 文档(相对 SKILL_ROOT)。
116
+ * 构成:顶层 .md(如 SKILL.md、README.official.md、README.zh-Hans.official.md)
117
+ * + references/classes/*.md 全部
118
+ * + references/enums、types、interfaces 下 md
119
+ * + references/ 下的索引(_index.md、_quick-reference.md)
120
+ * + guide、user-guide、format 下 md(含子目录)。
121
+ * 按目录分组排序,最多 MAX_DOCS 条。
122
+ */
123
+ export function listSkillDocs() {
124
+ const groups = [
125
+ { dir: SKILL_ROOT, onlyTop: true },
126
+ { dir: join(SKILL_ROOT, 'references', 'classes'), onlyTop: false },
127
+ { dir: join(SKILL_ROOT, 'references', 'enums'), onlyTop: false },
128
+ { dir: join(SKILL_ROOT, 'references', 'types'), onlyTop: false },
129
+ { dir: join(SKILL_ROOT, 'references', 'interfaces'), onlyTop: false },
130
+ { dir: join(SKILL_ROOT, 'references'), onlyTop: true },
131
+ { dir: join(SKILL_ROOT, 'guide'), onlyTop: false },
132
+ { dir: join(SKILL_ROOT, 'user-guide'), onlyTop: false },
133
+ { dir: join(SKILL_ROOT, 'format'), onlyTop: false },
134
+ ]
135
+ const files = []
136
+ for (const g of groups) files.push(...collectMd(g.dir, g.onlyTop))
137
+ return { count: Math.min(files.length, MAX_DOCS), files: files.slice(0, MAX_DOCS) }
138
+ }
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@windypro-rourou/dsh-eda",
3
- "description": "嘉立创 EDA 助手(dsh-lichuang-eda)——面向 0 基础开发者,在 DSH Web GUI 里自动生成嘉立创 EDA(专业版/标准版)原理图/PCB 草图的插件。当前为可加载的骨架版本:DSH 插件表面(提供服务、HTTP 路由、agent 工具、系统提示通告、浏览器面板)已接通,EDA 后端尚未接入(backend: not-wired)。Hot-pluggable — mounted via profile cordis.patch.yml + profile node_modules copy, no dsh source changes.",
4
- "version": "0.1.0",
3
+ "version": "0.1.1",
5
4
  "type": "module",
5
+ "description": "dsh-lichuang-eda (JCL-EDA): 嘉立创 EDA 助手 DSH 插件 —— 官方 eda.* API 云端实时生成(原理图/PCB)+ 离线标准版 JSON 兜底 + 面板记录式时间线(撤回/清空/紧急保存)。开箱即用:npm i 后 cordis.patch.yml insert 一行即挂载。",
6
6
  "packageManager": "pnpm@11.22.0",
7
7
  "engines": {
8
8
  "node": "^22.19.0 || >=24.0.0"
@@ -35,6 +35,7 @@
35
35
  "files": [
36
36
  "lib/**/*.js",
37
37
  "src/**/*.js",
38
+ "skill/**/*.md",
38
39
  "cordis.patch.yml",
39
40
  "README.md"
40
41
  ],
@@ -42,5 +43,14 @@
42
43
  "repository": {
43
44
  "type": "git",
44
45
  "url": "https://github.com/WindyPro-rourou/JCL-EDA.git"
46
+ },
47
+ "scripts": {
48
+ "gen": "node src/json-gen.js",
49
+ "test:json": "node --test --experimental-test-isolation=none src/json-gen.test.js",
50
+ "test:plugin": "node selfcheck.mjs && node --experimental-test-isolation=none --test \"test/*.test.mjs\"",
51
+ "test:all": "npm run test:json && npm run test:plugin",
52
+ "check": "node --check lib/index.js && node --check lib/client.js && node --check lib/backend.js",
53
+ "publish:dry": "node scripts/publish.mjs --dry",
54
+ "publish": "node scripts/publish.mjs"
45
55
  }
46
56
  }