@windypro-rourou/dsh-eda 0.1.0 → 0.1.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/README.md +71 -119
- package/cordis.patch.yml +9 -7
- package/lib/board.js +80 -0
- package/lib/client.js +2 -2
- package/lib/index.js +339 -11
- package/lib/installer.js +4 -4
- package/lib/skill.js +138 -0
- package/package.json +3 -2
- package/skill/INDEX.md +193 -0
- package/skill/README.official.md +125 -0
- package/skill/README.zh-Hans.official.md +125 -0
- package/skill/SKILL.md +746 -0
- package/skill/format/index.md +152 -0
- package/skill/format/pcb/3d.md +166 -0
- package/skill/format/pcb/attr.md +63 -0
- package/skill/format/pcb/common.md +306 -0
- package/skill/format/pcb/component.md +132 -0
- package/skill/format/pcb/dimension.md +58 -0
- package/skill/format/pcb/index.md +17 -0
- package/skill/format/pcb/obj.md +43 -0
- package/skill/format/pcb/pad_via.md +151 -0
- package/skill/format/pcb/panel.md +64 -0
- package/skill/format/pcb/partition.md +43 -0
- package/skill/format/pcb/primitive.md +196 -0
- package/skill/format/pcb/rule.md +71 -0
- package/skill/format/pcb/shape.md +441 -0
- package/skill/format/pcb/text.md +62 -0
- package/skill/format/project/blob.md +30 -0
- package/skill/format/project/common.md +42 -0
- package/skill/format/project/group.md +62 -0
- package/skill/format/project/index.md +12 -0
- package/skill/format/project/instance.md +32 -0
- package/skill/format/project/meta.md +189 -0
- package/skill/format/project/variant.md +30 -0
- package/skill/format/schematic/attr.md +41 -0
- package/skill/format/schematic/common.md +47 -0
- package/skill/format/schematic/component.md +91 -0
- package/skill/format/schematic/index.md +14 -0
- package/skill/format/schematic/obj.md +41 -0
- package/skill/format/schematic/pin.md +59 -0
- package/skill/format/schematic/shape.md +231 -0
- package/skill/format/schematic/structure.md +53 -0
- package/skill/format/schematic/table.md +109 -0
- package/skill/format/schematic/text.md +47 -0
- package/skill/format/schematic/wire.md +132 -0
- package/skill/guide/ancillary-projects/pro-api-sdk.md +1 -0
- package/skill/guide/ancillary-projects/pro-api-types.md +5 -0
- package/skill/guide/ancillary-projects.md +10 -0
- package/skill/guide/error-handling.md +38 -0
- package/skill/guide/extension-json.md +135 -0
- package/skill/guide/extensions-marketplace.md +61 -0
- package/skill/guide/how-to-start.md +301 -0
- package/skill/guide/i18n.md +57 -0
- package/skill/guide/index.md +7 -0
- package/skill/guide/inline-frame.md +20 -0
- package/skill/guide/invoke-apis.md +81 -0
- package/skill/guide/stability.md +37 -0
- package/skill/references/_index.md +398 -0
- package/skill/references/_quick-reference.md +3028 -0
- package/skill/references/classes/DMT_Board.md +533 -0
- package/skill/references/classes/DMT_EditorControl.md +1736 -0
- package/skill/references/classes/DMT_Event.md +356 -0
- package/skill/references/classes/DMT_Folder.md +775 -0
- package/skill/references/classes/DMT_Panel.md +531 -0
- package/skill/references/classes/DMT_Pcb.md +575 -0
- package/skill/references/classes/DMT_Project.md +573 -0
- package/skill/references/classes/DMT_Schematic.md +1477 -0
- package/skill/references/classes/DMT_SelectControl.md +96 -0
- package/skill/references/classes/DMT_Team.md +172 -0
- package/skill/references/classes/DMT_Workspace.md +198 -0
- package/skill/references/classes/EDA.md +961 -0
- package/skill/references/classes/IPCB_ComplexPolygon.md +299 -0
- package/skill/references/classes/IPCB_Polygon.md +175 -0
- package/skill/references/classes/IPCB_PrimitiveArc.md +1901 -0
- package/skill/references/classes/IPCB_PrimitiveAttribute.md +2993 -0
- package/skill/references/classes/IPCB_PrimitiveComponent.md +2627 -0
- package/skill/references/classes/IPCB_PrimitiveComponentPad.md +410 -0
- package/skill/references/classes/IPCB_PrimitiveDimension.md +1419 -0
- package/skill/references/classes/IPCB_PrimitiveFill.md +1325 -0
- package/skill/references/classes/IPCB_PrimitiveImage.md +1461 -0
- package/skill/references/classes/IPCB_PrimitiveLine.md +1639 -0
- package/skill/references/classes/IPCB_PrimitiveObject.md +1700 -0
- package/skill/references/classes/IPCB_PrimitivePad.md +3155 -0
- package/skill/references/classes/IPCB_PrimitivePolyline.md +1193 -0
- package/skill/references/classes/IPCB_PrimitivePour.md +1858 -0
- package/skill/references/classes/IPCB_PrimitivePoured.md +556 -0
- package/skill/references/classes/IPCB_PrimitiveRegion.md +1332 -0
- package/skill/references/classes/IPCB_PrimitiveString.md +2315 -0
- package/skill/references/classes/IPCB_PrimitiveVia.md +1588 -0
- package/skill/references/classes/ISCH_PrimitiveArc.md +1676 -0
- package/skill/references/classes/ISCH_PrimitiveAttribute.md +2541 -0
- package/skill/references/classes/ISCH_PrimitiveBus.md +973 -0
- package/skill/references/classes/ISCH_PrimitiveCbbSymbolComponent.md +260 -0
- package/skill/references/classes/ISCH_PrimitiveCircle.md +1392 -0
- package/skill/references/classes/ISCH_PrimitiveComponent.md +2913 -0
- package/skill/references/classes/ISCH_PrimitiveComponentPin.md +155 -0
- package/skill/references/classes/ISCH_PrimitiveObject.md +960 -0
- package/skill/references/classes/ISCH_PrimitivePin.md +2402 -0
- package/skill/references/classes/ISCH_PrimitivePolygon.md +1028 -0
- package/skill/references/classes/ISCH_PrimitiveRectangle.md +1777 -0
- package/skill/references/classes/ISCH_PrimitiveText.md +1771 -0
- package/skill/references/classes/ISCH_PrimitiveWire.md +973 -0
- package/skill/references/classes/LIB_3DModel.md +780 -0
- package/skill/references/classes/LIB_Cbb.md +957 -0
- package/skill/references/classes/LIB_Classification.md +965 -0
- package/skill/references/classes/LIB_Device.md +1221 -0
- package/skill/references/classes/LIB_Footprint.md +1153 -0
- package/skill/references/classes/LIB_LibrariesList.md +329 -0
- package/skill/references/classes/LIB_PanelLibrary.md +855 -0
- package/skill/references/classes/LIB_SelectControl.md +89 -0
- package/skill/references/classes/LIB_SimulationModel.md +821 -0
- package/skill/references/classes/LIB_Symbol.md +1195 -0
- package/skill/references/classes/PCB_Document.md +1754 -0
- package/skill/references/classes/PCB_Drc.md +3375 -0
- package/skill/references/classes/PCB_Event.md +1081 -0
- package/skill/references/classes/PCB_Layer.md +1911 -0
- package/skill/references/classes/PCB_ManufactureData.md +2968 -0
- package/skill/references/classes/PCB_MathPolygon.md +785 -0
- package/skill/references/classes/PCB_Net.md +1128 -0
- package/skill/references/classes/PCB_Primitive.md +217 -0
- package/skill/references/classes/PCB_PrimitiveArc.md +894 -0
- package/skill/references/classes/PCB_PrimitiveAttribute.md +717 -0
- package/skill/references/classes/PCB_PrimitiveComponent.md +1050 -0
- package/skill/references/classes/PCB_PrimitiveDimension.md +833 -0
- package/skill/references/classes/PCB_PrimitiveFill.md +861 -0
- package/skill/references/classes/PCB_PrimitiveImage.md +875 -0
- package/skill/references/classes/PCB_PrimitiveLine.md +858 -0
- package/skill/references/classes/PCB_PrimitiveObject.md +800 -0
- package/skill/references/classes/PCB_PrimitivePad.md +944 -0
- package/skill/references/classes/PCB_PrimitivePolyline.md +819 -0
- package/skill/references/classes/PCB_PrimitivePour.md +845 -0
- package/skill/references/classes/PCB_PrimitivePoured.md +363 -0
- package/skill/references/classes/PCB_PrimitiveRegion.md +799 -0
- package/skill/references/classes/PCB_PrimitiveString.md +910 -0
- package/skill/references/classes/PCB_PrimitiveVia.md +765 -0
- package/skill/references/classes/PCB_RayTracerEngine.md +263 -0
- package/skill/references/classes/PCB_SelectControl.md +495 -0
- package/skill/references/classes/PNL_Document.md +83 -0
- package/skill/references/classes/SCH_Document.md +809 -0
- package/skill/references/classes/SCH_Drc.md +242 -0
- package/skill/references/classes/SCH_Event.md +583 -0
- package/skill/references/classes/SCH_ManufactureData.md +1205 -0
- package/skill/references/classes/SCH_Net.md +200 -0
- package/skill/references/classes/SCH_Netlist.md +191 -0
- package/skill/references/classes/SCH_Primitive.md +337 -0
- package/skill/references/classes/SCH_PrimitiveArc.md +692 -0
- package/skill/references/classes/SCH_PrimitiveAttribute.md +590 -0
- package/skill/references/classes/SCH_PrimitiveBus.md +624 -0
- package/skill/references/classes/SCH_PrimitiveCircle.md +683 -0
- package/skill/references/classes/SCH_PrimitiveComponent.md +2240 -0
- package/skill/references/classes/SCH_PrimitiveObject.md +666 -0
- package/skill/references/classes/SCH_PrimitivePin.md +754 -0
- package/skill/references/classes/SCH_PrimitivePolygon.md +627 -0
- package/skill/references/classes/SCH_PrimitiveRectangle.md +731 -0
- package/skill/references/classes/SCH_PrimitiveText.md +746 -0
- package/skill/references/classes/SCH_PrimitiveWire.md +703 -0
- package/skill/references/classes/SCH_SelectControl.md +520 -0
- package/skill/references/classes/SCH_SimulationEngine.md +133 -0
- package/skill/references/classes/SCH_Utils.md +121 -0
- package/skill/references/classes/SYS_ClientUrl.md +173 -0
- package/skill/references/classes/SYS_Dialog.md +825 -0
- package/skill/references/classes/SYS_Environment.md +502 -0
- package/skill/references/classes/SYS_FileManager.md +1686 -0
- package/skill/references/classes/SYS_FileSystem.md +1171 -0
- package/skill/references/classes/SYS_FontManager.md +224 -0
- package/skill/references/classes/SYS_FormatConversion.md +349 -0
- package/skill/references/classes/SYS_HeaderMenu.md +479 -0
- package/skill/references/classes/SYS_I18n.md +861 -0
- package/skill/references/classes/SYS_IFrame.md +535 -0
- package/skill/references/classes/SYS_LoadingAndProgressBar.md +246 -0
- package/skill/references/classes/SYS_Log.md +424 -0
- package/skill/references/classes/SYS_Math.md +1565 -0
- package/skill/references/classes/SYS_Message.md +363 -0
- package/skill/references/classes/SYS_MessageBox.md +285 -0
- package/skill/references/classes/SYS_MessageBus.md +1618 -0
- package/skill/references/classes/SYS_PanelControl.md +696 -0
- package/skill/references/classes/SYS_RightClickMenu.md +175 -0
- package/skill/references/classes/SYS_Setting.md +85 -0
- package/skill/references/classes/SYS_ShortcutKey.md +623 -0
- package/skill/references/classes/SYS_Storage.md +484 -0
- package/skill/references/classes/SYS_Timer.md +447 -0
- package/skill/references/classes/SYS_ToastMessage.md +194 -0
- package/skill/references/classes/SYS_Tool.md +241 -0
- package/skill/references/classes/SYS_Unit.md +594 -0
- package/skill/references/classes/SYS_WebSocket.md +401 -0
- package/skill/references/classes/SYS_Window.md +850 -0
- package/skill/references/enums/EDMT_EditorDocumentType.md +279 -0
- package/skill/references/enums/EDMT_EditorSplitScreenDirection.md +48 -0
- package/skill/references/enums/EDMT_EditorTabEventType.md +63 -0
- package/skill/references/enums/EDMT_IndicatorMarkerType.md +81 -0
- package/skill/references/enums/EDMT_ItemType.md +158 -0
- package/skill/references/enums/EDMT_ProjectCollaborationMode.md +48 -0
- package/skill/references/enums/ELIB_DeviceJlcLibraryCategory.md +48 -0
- package/skill/references/enums/ELIB_LibraryType.md +114 -0
- package/skill/references/enums/ELIB_PreviewType.md +70 -0
- package/skill/references/enums/ELIB_SimulationModelType.md +48 -0
- package/skill/references/enums/ELIB_SymbolType.md +125 -0
- package/skill/references/enums/EPCB_AutoRoutingCornerStyle.md +48 -0
- package/skill/references/enums/EPCB_AutoRoutingExistingPrimitiveMode.md +48 -0
- package/skill/references/enums/EPCB_AutoRoutingOptimization.md +48 -0
- package/skill/references/enums/EPCB_DocumentCanvasUpdateCalculationActiveStatus.md +48 -0
- package/skill/references/enums/EPCB_DocumentRatlineCalculatingActiveStatus.md +52 -0
- package/skill/references/enums/EPCB_InactiveLayerDisplayMode.md +59 -0
- package/skill/references/enums/EPCB_LayerColorConfiguration.md +81 -0
- package/skill/references/enums/EPCB_LayerId.md +882 -0
- package/skill/references/enums/EPCB_LayerStatus.md +59 -0
- package/skill/references/enums/EPCB_LayerType.md +114 -0
- package/skill/references/enums/EPCB_MouseEventType.md +59 -0
- package/skill/references/enums/EPCB_NetEventType.md +59 -0
- package/skill/references/enums/EPCB_PcbPlateType.md +48 -0
- package/skill/references/enums/EPCB_PdfOutputMethod.md +59 -0
- package/skill/references/enums/EPCB_PrimitiveArcInteractiveMode.md +48 -0
- package/skill/references/enums/EPCB_PrimitiveDimensionType.md +59 -0
- package/skill/references/enums/EPCB_PrimitiveEventType.md +59 -0
- package/skill/references/enums/EPCB_PrimitiveFillMode.md +63 -0
- package/skill/references/enums/EPCB_PrimitivePadHeatWeldingConnectionMethod.md +59 -0
- package/skill/references/enums/EPCB_PrimitivePadHoleType.md +59 -0
- package/skill/references/enums/EPCB_PrimitivePadShapeType.md +81 -0
- package/skill/references/enums/EPCB_PrimitivePadType.md +59 -0
- package/skill/references/enums/EPCB_PrimitivePourFillMethod.md +59 -0
- package/skill/references/enums/EPCB_PrimitiveRegionRuleType.md +96 -0
- package/skill/references/enums/EPCB_PrimitiveStringAlignMode.md +125 -0
- package/skill/references/enums/EPCB_PrimitiveType.md +202 -0
- package/skill/references/enums/EPCB_PrimitiveViaType.md +59 -0
- package/skill/references/enums/ESCH_DynamicSimulationEnginePullEventType.md +103 -0
- package/skill/references/enums/ESCH_DynamicSimulationEnginePushEventType.md +81 -0
- package/skill/references/enums/ESCH_ExportDocumentFileType.md +59 -0
- package/skill/references/enums/ESCH_MouseEventType.md +48 -0
- package/skill/references/enums/ESCH_PrimitiveComponentType.md +125 -0
- package/skill/references/enums/ESCH_PrimitiveEventType.md +70 -0
- package/skill/references/enums/ESCH_PrimitiveFillStyle.md +114 -0
- package/skill/references/enums/ESCH_PrimitiveLineType.md +70 -0
- package/skill/references/enums/ESCH_PrimitivePinShape.md +70 -0
- package/skill/references/enums/ESCH_PrimitivePinType.md +147 -0
- package/skill/references/enums/ESCH_PrimitiveTextAlignMode.md +125 -0
- package/skill/references/enums/ESCH_PrimitiveType.md +180 -0
- package/skill/references/enums/ESCH_SimulationNetlistType.md +37 -0
- package/skill/references/enums/ESCH_SpiceSimulationEnginePullEventType.md +48 -0
- package/skill/references/enums/ESCH_SpiceSimulationEnginePushEventType.md +70 -0
- package/skill/references/enums/ESYS_BottomPanelTab.md +81 -0
- package/skill/references/enums/ESYS_HeaderMenuEnvironment.md +158 -0
- package/skill/references/enums/ESYS_ImportProjectBoardOutlineSource.md +52 -0
- package/skill/references/enums/ESYS_ImportProjectImportOption.md +59 -0
- package/skill/references/enums/ESYS_ImportProjectSchematicObjectStyle.md +48 -0
- package/skill/references/enums/ESYS_ImportProjectViaSolderMaskExpansion.md +52 -0
- package/skill/references/enums/ESYS_LeftPanelTab.md +81 -0
- package/skill/references/enums/ESYS_LogType.md +103 -0
- package/skill/references/enums/ESYS_NetlistType.md +114 -0
- package/skill/references/enums/ESYS_RightPanelTab.md +202 -0
- package/skill/references/enums/ESYS_ShortcutKeyEffectiveEditorRange.md +191 -0
- package/skill/references/enums/ESYS_ShortcutKeyEffectiveEditorScene.md +92 -0
- package/skill/references/enums/ESYS_StartPageQuickStartItem.md +206 -0
- package/skill/references/enums/ESYS_Theme.md +48 -0
- package/skill/references/enums/ESYS_ToastMessageType.md +81 -0
- package/skill/references/enums/ESYS_Unit.md +103 -0
- package/skill/references/enums/ESYS_WindowEventType.md +48 -0
- package/skill/references/enums/ESYS_WindowOpenTarget.md +48 -0
- package/skill/references/enums/NetportDeviceName.md +147 -0
- package/skill/references/enums/SchToolBarDeviceName.md +279 -0
- package/skill/references/interfaces/BoardProps.md +169 -0
- package/skill/references/interfaces/ButtonProps.md +169 -0
- package/skill/references/interfaces/CheckBoxProps.md +196 -0
- package/skill/references/interfaces/ComponentPropsMap.md +448 -0
- package/skill/references/interfaces/DialogProps.md +385 -0
- package/skill/references/interfaces/FlexItemProps.md +116 -0
- package/skill/references/interfaces/FlexProps.md +224 -0
- package/skill/references/interfaces/GridItemProps.md +143 -0
- package/skill/references/interfaces/GridProps.md +143 -0
- package/skill/references/interfaces/IDMT_BoardItem.md +171 -0
- package/skill/references/interfaces/IDMT_BriefProjectItem.md +171 -0
- package/skill/references/interfaces/IDMT_EditorDocumentItem.md +169 -0
- package/skill/references/interfaces/IDMT_EditorSplitScreenItem.md +173 -0
- package/skill/references/interfaces/IDMT_EditorTabItem.md +169 -0
- package/skill/references/interfaces/IDMT_FolderItem.md +225 -0
- package/skill/references/interfaces/IDMT_IndicatorMarkerShape.md +393 -0
- package/skill/references/interfaces/IDMT_PanelItem.md +144 -0
- package/skill/references/interfaces/IDMT_PcbItem.md +171 -0
- package/skill/references/interfaces/IDMT_ProjectItem.md +143 -0
- package/skill/references/interfaces/IDMT_SchematicItem.md +225 -0
- package/skill/references/interfaces/IDMT_SchematicPageItem.md +198 -0
- package/skill/references/interfaces/IDMT_TeamItem.md +144 -0
- package/skill/references/interfaces/IDMT_WorkspaceItem.md +117 -0
- package/skill/references/interfaces/IDesignPortal.md +103 -0
- package/skill/references/interfaces/ILIB_3DModelItem.md +198 -0
- package/skill/references/interfaces/ILIB_3DModelSearchItem.md +277 -0
- package/skill/references/interfaces/ILIB_CbbItem.md +225 -0
- package/skill/references/interfaces/ILIB_CbbSearchItem.md +277 -0
- package/skill/references/interfaces/ILIB_ClassificationIndex.md +150 -0
- package/skill/references/interfaces/ILIB_DeviceAssociationItem.md +210 -0
- package/skill/references/interfaces/ILIB_DeviceExtendPropertyItem.md +304 -0
- package/skill/references/interfaces/ILIB_DeviceItem.md +279 -0
- package/skill/references/interfaces/ILIB_DevicePropertiesForSearch.md +250 -0
- package/skill/references/interfaces/ILIB_DeviceSearchItem.md +521 -0
- package/skill/references/interfaces/ILIB_ExtendLibrary3DModelFunctions.md +64 -0
- package/skill/references/interfaces/ILIB_ExtendLibraryCbbFunctions.md +99 -0
- package/skill/references/interfaces/ILIB_ExtendLibraryClassificationIndex.md +150 -0
- package/skill/references/interfaces/ILIB_ExtendLibraryDeviceFunctions.md +157 -0
- package/skill/references/interfaces/ILIB_ExtendLibraryFootprintFunctions.md +63 -0
- package/skill/references/interfaces/ILIB_ExtendLibraryFunctions.md +123 -0
- package/skill/references/interfaces/ILIB_ExtendLibraryItem.md +97 -0
- package/skill/references/interfaces/ILIB_ExtendLibraryItemIndex.md +98 -0
- package/skill/references/interfaces/ILIB_ExtendLibrarySearchProperty.md +115 -0
- package/skill/references/interfaces/ILIB_ExtendLibrarySearchResult.md +169 -0
- package/skill/references/interfaces/ILIB_ExtendLibrarySearchResultDataLine.md +234 -0
- package/skill/references/interfaces/ILIB_ExtendLibrarySymbolFunctions.md +105 -0
- package/skill/references/interfaces/ILIB_ExtendLibraryUserIndex.md +96 -0
- package/skill/references/interfaces/ILIB_FootprintItem.md +198 -0
- package/skill/references/interfaces/ILIB_FootprintPropertiesForSearch.md +61 -0
- package/skill/references/interfaces/ILIB_FootprintSearchItem.md +277 -0
- package/skill/references/interfaces/ILIB_LibraryInfo.md +92 -0
- package/skill/references/interfaces/ILIB_LibraryItem.md +115 -0
- package/skill/references/interfaces/ILIB_PanelLibraryItem.md +198 -0
- package/skill/references/interfaces/ILIB_PanelLibrarySearchItem.md +277 -0
- package/skill/references/interfaces/ILIB_SimulationModelItem.md +306 -0
- package/skill/references/interfaces/ILIB_SimulationModelSearchItem.md +304 -0
- package/skill/references/interfaces/ILIB_SymbolItem.md +279 -0
- package/skill/references/interfaces/ILIB_SymbolPropertiesForSearch.md +61 -0
- package/skill/references/interfaces/ILIB_SymbolSearchItem.md +304 -0
- package/skill/references/interfaces/IPCB_AutoLayoutResult.md +169 -0
- package/skill/references/interfaces/IPCB_AutoRoutingProps.md +220 -0
- package/skill/references/interfaces/IPCB_AutoRoutingResult.md +169 -0
- package/skill/references/interfaces/IPCB_BomPropertiesTableColumns.md +169 -0
- package/skill/references/interfaces/IPCB_DifferentialPairItem.md +115 -0
- package/skill/references/interfaces/IPCB_DiscretizeOptions.md +65 -0
- package/skill/references/interfaces/IPCB_DiscretizedPoint.md +88 -0
- package/skill/references/interfaces/IPCB_EqualLengthNetGroupItem.md +115 -0
- package/skill/references/interfaces/IPCB_LayerItem.md +277 -0
- package/skill/references/interfaces/IPCB_NetClassItem.md +115 -0
- package/skill/references/interfaces/IPCB_NetInfo.md +115 -0
- package/skill/references/interfaces/IPCB_PadPairGroupItem.md +88 -0
- package/skill/references/interfaces/IPCB_PadPairMinWireLengthItem.md +88 -0
- package/skill/references/interfaces/IPCB_PhysicalStackingConfiguration.md +115 -0
- package/skill/references/interfaces/IPCB_Primitive.md +218 -0
- package/skill/references/interfaces/IPCB_PrimitiveAPI.md +175 -0
- package/skill/references/interfaces/IPCB_PrimitivePadHeatWelding.md +151 -0
- package/skill/references/interfaces/IPCB_PrimitivePouredPourFill.md +142 -0
- package/skill/references/interfaces/IPCB_PrimitiveSolderMaskAndPasteMaskExpansion.md +154 -0
- package/skill/references/interfaces/IPCB_SubstratePhysicalProperties.md +88 -0
- package/skill/references/interfaces/IRawNet.md +103 -0
- package/skill/references/interfaces/IRawPureSchematic.md +80 -0
- package/skill/references/interfaces/IRawSchematic.md +103 -0
- package/skill/references/interfaces/IRawWire.md +149 -0
- package/skill/references/interfaces/ISCH_DrcError.md +142 -0
- package/skill/references/interfaces/ISCH_DrcErrorPrimitive.md +142 -0
- package/skill/references/interfaces/ISCH_ExportPngResolution.md +94 -0
- package/skill/references/interfaces/ISCH_NetInfo.md +88 -0
- package/skill/references/interfaces/ISCH_Primitive.md +219 -0
- package/skill/references/interfaces/ISCH_PrimitiveAPI.md +175 -0
- package/skill/references/interfaces/ISCH_ProjectNetInfo.md +142 -0
- package/skill/references/interfaces/ISCH_WireInfo.md +169 -0
- package/skill/references/interfaces/ISYS_FileSystemFileList.md +169 -0
- package/skill/references/interfaces/ISYS_HeaderMenuSub1MenuItem.md +174 -0
- package/skill/references/interfaces/ISYS_HeaderMenuSub2MenuItem.md +147 -0
- package/skill/references/interfaces/ISYS_HeaderMenuTopMenuItem.md +115 -0
- package/skill/references/interfaces/ISYS_HeaderMenus.md +408 -0
- package/skill/references/interfaces/ISYS_LogLine.md +115 -0
- package/skill/references/interfaces/ISYS_MathBBox.md +142 -0
- package/skill/references/interfaces/ISYS_MathPoint.md +88 -0
- package/skill/references/interfaces/ISYS_MathPolygonWithHoles.md +92 -0
- package/skill/references/interfaces/ISYS_MessageBusTask.md +115 -0
- package/skill/references/interfaces/ISYS_MultilingualLanguagesData.md +13 -0
- package/skill/references/interfaces/ISYS_PcbComparisonResponse.md +115 -0
- package/skill/references/interfaces/ISYS_RightClickMenuItem.md +174 -0
- package/skill/references/interfaces/ISYS_ShortcutKeyData.md +169 -0
- package/skill/references/interfaces/ISYS_ShortcutKeyDataWithCallFn.md +62 -0
- package/skill/references/interfaces/ISYS_ShortcutKeyDataWithUserDefinedShortcutKey.md +62 -0
- package/skill/references/interfaces/ISYS_WindowEventListenerRemovableObject.md +109 -0
- package/skill/references/interfaces/IconProps.md +88 -0
- package/skill/references/interfaces/ImageProps.md +115 -0
- package/skill/references/interfaces/InputProps.md +520 -0
- package/skill/references/interfaces/ListChildren.md +223 -0
- package/skill/references/interfaces/ListProps.md +223 -0
- package/skill/references/interfaces/ModalProps.md +358 -0
- package/skill/references/interfaces/RadioGroupProps.md +196 -0
- package/skill/references/interfaces/RadioItem.md +115 -0
- package/skill/references/interfaces/ScrollerProps.md +169 -0
- package/skill/references/interfaces/SelectListItem.md +142 -0
- package/skill/references/interfaces/SelectProps.md +169 -0
- package/skill/references/interfaces/SlotProps.md +88 -0
- package/skill/references/interfaces/StyleProps.md +385 -0
- package/skill/references/interfaces/TextAreaProps.md +196 -0
- package/skill/references/interfaces/TextProps.md +169 -0
- package/skill/references/types/ISYS_LanguageKeyValuePairs.md +13 -0
- package/skill/references/types/TPCB_LayerTypesOfInnerLayer.md +12 -0
- package/skill/references/types/TPCB_LayersInTheSelectable.md +43 -0
- package/skill/references/types/TPCB_LayersOfComponent.md +12 -0
- package/skill/references/types/TPCB_LayersOfCopper.md +16 -0
- package/skill/references/types/TPCB_LayersOfCustom.md +42 -0
- package/skill/references/types/TPCB_LayersOfDimension.md +17 -0
- package/skill/references/types/TPCB_LayersOfFill.md +29 -0
- package/skill/references/types/TPCB_LayersOfImage.md +23 -0
- package/skill/references/types/TPCB_LayersOfInner.md +42 -0
- package/skill/references/types/TPCB_LayersOfLine.md +26 -0
- package/skill/references/types/TPCB_LayersOfObject.md +13 -0
- package/skill/references/types/TPCB_LayersOfPad.md +12 -0
- package/skill/references/types/TPCB_LayersOfRegion.md +12 -0
- package/skill/references/types/TPCB_NumberOfCopperLayers.md +10 -0
- package/skill/references/types/TPCB_PolygonSourceArray.md +83 -0
- package/skill/references/types/TPCB_PrimitiveDimensionCoordinateSet.md +67 -0
- package/skill/references/types/TPCB_PrimitivePadHole.md +31 -0
- package/skill/references/types/TPCB_PrimitivePadShape.md +62 -0
- package/skill/references/types/TPCB_PrimitiveSpecialPadShape.md +20 -0
- package/skill/references/types/TSYS_MathPolygonGroup.md +16 -0
- package/skill/references/types/TSYS_MathPolygonInput.md +21 -0
- package/skill/references/types/TSYS_PcbComparisonErrorCode.md +10 -0
- package/skill/references/types/TSYS_ShortcutKeys.md +97 -0
- 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
|
|
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
|
|
836
|
-
'
|
|
837
|
-
'
|
|
838
|
-
'
|
|
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
|
|
880
|
-
if (
|
|
881
|
-
|
|
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:
|
|
885
|
-
size:
|
|
904
|
+
page: 'PCB',
|
|
905
|
+
size: '(1mil · 围绕已有图元)',
|
|
886
906
|
usedCount: layout.used.length,
|
|
887
907
|
spots,
|
|
888
|
-
note: spots.length < count ? `仅找到 ${spots.length}
|
|
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
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
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
|
-
"
|
|
4
|
-
"version": "0.1.0",
|
|
3
|
+
"version": "0.1.2",
|
|
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
|
],
|