@rainbow-robotics/muscat-plugin-kit 0.1.2-dev.8 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -49
- package/cli/README.md +191 -5
- package/cli/bin/create-muscat-plugin.mjs +1 -1
- package/cli/bin/muscat-pk.mjs +25 -14
- package/cli/bundle-templates.mjs +28 -0
- package/cli/docker/Dockerfile.bridge +17 -0
- package/cli/docker/Dockerfile.cpp +22 -0
- package/cli/docker/Dockerfile.dev +1 -0
- package/cli/docker/Dockerfile.python +20 -0
- package/cli/docker/bridge-package.json +8 -0
- package/cli/prepack.mjs +10 -0
- package/cli/src/__pycache__/host_agent.cpython-37.pyc +0 -0
- package/cli/src/bridge.mjs +95 -0
- package/cli/src/build.mjs +345 -85
- package/cli/src/check-package.mjs +8 -23
- package/cli/src/cpp.mjs +61 -0
- package/cli/src/dev.mjs +156 -4
- package/cli/src/devBack.mjs +505 -57
- package/cli/src/devUi.mjs +167 -22
- package/cli/src/esbuild.mjs +27 -10
- package/cli/src/host_agent.py +162 -0
- package/cli/src/manifest.mjs +208 -0
- package/cli/src/mcp.mjs +617 -0
- package/cli/src/new.mjs +170 -67
- package/cli/src/pluginDevServer.mjs +112 -0
- package/cli/src/ports.mjs +160 -0
- package/cli/src/python.mjs +109 -0
- package/cli/src/ros2.mjs +43 -18
- package/cli/src/sdk.mjs +11 -9
- package/cli/src/socketBridge.mjs +133 -0
- package/cli/src/storybook.mjs +168 -0
- package/cli/src/type.mjs +52 -29
- package/cli/src/uninstall.mjs +98 -0
- package/cli/src/update.mjs +259 -30
- package/cli/src/util.mjs +123 -9
- package/cli/src/zenohDev.mjs +75 -0
- package/cli/storybook-dist/_design-tokens.css +4957 -0
- package/cli/storybook-dist/_stories-src/NxAvatar.stories.tsx +27 -0
- package/cli/storybook-dist/_stories-src/NxPagination.stories.tsx +28 -0
- package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordion.stories.tsx +46 -0
- package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordionGroup.stories.tsx +73 -0
- package/cli/storybook-dist/_stories-src/RBBadge/RBBadge.stories.tsx +93 -0
- package/cli/storybook-dist/_stories-src/RBBattery/RBBattery.stories.tsx +74 -0
- package/cli/storybook-dist/_stories-src/RBButton/RBCheckIconButton.stories.tsx +28 -0
- package/cli/storybook-dist/_stories-src/RBButton/RBCheckLabelButton.stories.tsx +84 -0
- package/cli/storybook-dist/_stories-src/RBButton/RBIconButton.stories.tsx +57 -0
- package/cli/storybook-dist/_stories-src/RBButton/RBInlineLabelButton.stories.tsx +41 -0
- package/cli/storybook-dist/_stories-src/RBButton/RBLabelButton.stories.tsx +60 -0
- package/cli/storybook-dist/_stories-src/RBDatePicker/RBDateInput.stories.tsx +44 -0
- package/cli/storybook-dist/_stories-src/RBDatePicker/RBRangeDateInput.stories.tsx +44 -0
- package/cli/storybook-dist/_stories-src/RBDialog/RBAlert.stories.tsx +51 -0
- package/cli/storybook-dist/_stories-src/RBDialog/RBConfirm.stories.tsx +55 -0
- package/cli/storybook-dist/_stories-src/RBDialog/RBPrompt.stories.tsx +52 -0
- package/cli/storybook-dist/_stories-src/RBDivider/RBDivider.stories.tsx +93 -0
- package/cli/storybook-dist/_stories-src/RBEmptyView/RBEmptyView.stories.tsx +49 -0
- package/cli/storybook-dist/_stories-src/RBIcons/RBColorIcons.stories.tsx +108 -0
- package/cli/storybook-dist/_stories-src/RBIcons/RBIcons.stories.tsx +106 -0
- package/cli/storybook-dist/_stories-src/RBIcons/RBMenuTreeIcons.stories.tsx +108 -0
- package/cli/storybook-dist/_stories-src/RBIcons/RBProgramIcons.stories.tsx +116 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBCheckBox.stories.tsx +89 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBMultiRangeInput.stories.tsx +64 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBRadioBox.stories.tsx +65 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBRadioButton.stories.tsx +68 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBSelectBox.stories.tsx +119 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBSideNumberInput.stories.tsx +90 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextArea.stories.tsx +45 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextInput.stories.tsx +50 -0
- package/cli/storybook-dist/_stories-src/RBInput/RBTextField.stories.tsx +102 -0
- package/cli/storybook-dist/_stories-src/RBJoyStick/RBJoyStick.stories.tsx +31 -0
- package/cli/storybook-dist/_stories-src/RBLight/RBLight.stories.tsx +36 -0
- package/cli/storybook-dist/_stories-src/RBPagination/RBPagination.stories.tsx +49 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBCard/RBCard.stories.tsx +89 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBCommand/RBCommand.stories.tsx +116 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDialog/RBDialog.stories.tsx +74 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDrawer/RBDrawer.stories.tsx +99 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDropdownMenu/RBDropdownMenu.stories.tsx +123 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBMenubar/RBMenubar.stories.tsx +135 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBPopover/RBPopover.stories.tsx +69 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBResizable/RBResizable.stories.tsx +49 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSheet/RBSheet.stories.tsx +91 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSlider/RBSlider.stories.tsx +38 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSwitch/RBSwitch.stories.tsx +112 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBTabs/RBTabs.stories.tsx +75 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBToggle/RBToggle.stories.tsx +51 -0
- package/cli/storybook-dist/_stories-src/RBShadcn/RBToggleGroup/RBToggleGroup.stories.tsx +84 -0
- package/cli/storybook-dist/_stories-src/RBTab/RBChipTab.stories.tsx +102 -0
- package/cli/storybook-dist/_stories-src/RBTab/RBChipsBoxTab.stories.tsx +78 -0
- package/cli/storybook-dist/_stories-src/RBTab/RBTab.stories.tsx +57 -0
- package/cli/storybook-dist/_stories-src/RBTable/RBTable.stories.tsx +177 -0
- package/cli/storybook-dist/_stories-src/RBTable/RBTableRow.stories.tsx +64 -0
- package/cli/storybook-dist/_stories-src/RBToast/RBToast.stories.tsx +117 -0
- package/cli/storybook-dist/_stories-src/RBTooltip/RBTooltip.stories.tsx +50 -0
- package/cli/storybook-dist/_stories-src/loading/RBSpinner.stories.tsx +30 -0
- package/cli/storybook-dist/_stories-src/nx-button/NxButton.stories.tsx +54 -0
- package/cli/storybook-dist/_stories-src/nx-button/NxPointerHoldButton.stories.tsx +57 -0
- package/cli/storybook-dist/_stories-src/nx-icons/NxIcons.stories.tsx +48 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxNumberInput.stories.tsx +103 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxRangeInput.stories.tsx +27 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSelectBox.stories.tsx +67 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSlideRange.stories.tsx +45 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSwitch.stories.tsx +27 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxTextArea.stories.tsx +48 -0
- package/cli/storybook-dist/_stories-src/nx-inputs/NxTextInput.stories.tsx +46 -0
- package/cli/storybook-dist/assets/Color-YHDXOIA2-ttZJDaKn.js +1 -0
- package/cli/storybook-dist/assets/Docs-B1jnlXHd.js +12 -0
- package/cli/storybook-dist/assets/Docs-B7dRsHh7.js +8 -0
- package/cli/storybook-dist/assets/Docs-C68t3mnn.js +20 -0
- package/cli/storybook-dist/assets/Docs-D7rPMMhK.js +7 -0
- package/cli/storybook-dist/assets/Docs-DM98U-ZG.js +7 -0
- package/cli/storybook-dist/assets/Docs-guWsANnn.js +8 -0
- package/cli/storybook-dist/assets/DocsRenderer-CFRXHY34-t12O9QfY.js +2 -0
- package/cli/storybook-dist/assets/NxAvatar.stories-ikdLTtys.js +13 -0
- package/cli/storybook-dist/assets/NxButton.stories-DL3S2KEV.js +20 -0
- package/cli/storybook-dist/assets/NxIcons.stories-Ca7qpAaO.js +3 -0
- package/cli/storybook-dist/assets/NxNumberInput.stories-D6NVMTos.js +26 -0
- package/cli/storybook-dist/assets/NxPagination.stories-BDKSlHiQ.js +11 -0
- package/cli/storybook-dist/assets/NxPointerHoldButton.stories-BI544zqB.js +14 -0
- package/cli/storybook-dist/assets/NxRangeInput.stories-BigBBkE7.js +17 -0
- package/cli/storybook-dist/assets/NxSelectBox.stories-Ci0IyUWd.js +17 -0
- package/cli/storybook-dist/assets/NxSlideRange.stories-sjnPAjFy.js +14 -0
- package/cli/storybook-dist/assets/NxSwitch.stories-CRxPDlJm.js +11 -0
- package/cli/storybook-dist/assets/NxTextArea.stories-Jh09n24O.js +11 -0
- package/cli/storybook-dist/assets/NxTextInput.stories-BeGCjxES.js +11 -0
- package/cli/storybook-dist/assets/PretendardVariable-CJuje-Rk.woff2 +0 -0
- package/cli/storybook-dist/assets/RBAccordion.stories-CnC95OwM.js +17 -0
- package/cli/storybook-dist/assets/RBAccordionGroup.stories-og-6ePox.js +33 -0
- package/cli/storybook-dist/assets/RBAlert.stories-BcE9-UOT.js +17 -0
- package/cli/storybook-dist/assets/RBBadge.stories-DYZMXb-e.js +1 -0
- package/cli/storybook-dist/assets/RBBattery.stories-B7YAUvlM.js +10 -0
- package/cli/storybook-dist/assets/RBCard.stories-DTL_7n6I.js +45 -0
- package/cli/storybook-dist/assets/RBCheckBox.stories-D9KC6hTg.js +1 -0
- package/cli/storybook-dist/assets/RBCheckIconButton.stories-BR8aIkOC.js +1 -0
- package/cli/storybook-dist/assets/RBCheckLabelButton.stories-C1ABYhEr.js +24 -0
- package/cli/storybook-dist/assets/RBChipTab.stories-Ceo_vnNi.js +21 -0
- package/cli/storybook-dist/assets/RBChipsBoxTab.stories-CB_bfK8M.js +1 -0
- package/cli/storybook-dist/assets/RBColorIcons.stories-DHZKezld.js +3 -0
- package/cli/storybook-dist/assets/RBCommand.stories-DjuCDn5h.js +73 -0
- package/cli/storybook-dist/assets/RBConfirm.stories-HMmUPkB1.js +20 -0
- package/cli/storybook-dist/assets/RBDateInput.stories-BRfpYtJ4.js +15 -0
- package/cli/storybook-dist/assets/RBDialog.stories-Ln23Gyhk.js +38 -0
- package/cli/storybook-dist/assets/RBDivider.stories-Bhc_D5Cm.js +1 -0
- package/cli/storybook-dist/assets/RBDrawer.stories-CEEhamr_.js +14 -0
- package/cli/storybook-dist/assets/RBDropdownMenu.stories-DBvwDCnf.js +86 -0
- package/cli/storybook-dist/assets/RBEmptyView.stories-BY5QtXVc.js +12 -0
- package/cli/storybook-dist/assets/RBIconButton.stories-DyMFWpIV.js +1 -0
- package/cli/storybook-dist/assets/RBIcons.stories-DisU8G0d.js +3 -0
- package/cli/storybook-dist/assets/RBInlineLabelButton.stories-Cx0KJqxD.js +1 -0
- package/cli/storybook-dist/assets/RBJoyStick.stories-D1THM1Du.js +11 -0
- package/cli/storybook-dist/assets/RBLabelButton.stories-BDktlyzc.js +1 -0
- package/cli/storybook-dist/assets/RBLight.stories-C5qpnM6J.js +1 -0
- package/cli/storybook-dist/assets/RBMenuTreeIcons.stories-DUCeQPKJ.js +3 -0
- package/cli/storybook-dist/assets/RBMenubar.stories-ClyM9v37.js +3 -0
- package/cli/storybook-dist/assets/RBMultiRangeInput.stories--xSn64ww.js +14 -0
- package/cli/storybook-dist/assets/RBPagination.stories-C_uTj83z.js +17 -0
- package/cli/storybook-dist/assets/RBPopover.stories-DWmb9Por.js +11 -0
- package/cli/storybook-dist/assets/RBProgramIcons.stories-B8ZjEtvw.js +3 -0
- package/cli/storybook-dist/assets/RBPrompt.stories-BFKfyYtl.js +20 -0
- package/cli/storybook-dist/assets/RBRadioBox.stories-DUz8a27t.js +1 -0
- package/cli/storybook-dist/assets/RBRadioButton.stories-DKF61xvC.js +11 -0
- package/cli/storybook-dist/assets/RBRangeDateInput.stories-GhMVDyMr.js +15 -0
- package/cli/storybook-dist/assets/RBResizable.stories-V0iisR-x.js +20 -0
- package/cli/storybook-dist/assets/RBSelectBox.stories-DhvooAcg.js +6 -0
- package/cli/storybook-dist/assets/RBSheet.stories-C93Hpmvn.js +39 -0
- package/cli/storybook-dist/assets/RBSideNumberInput.stories-Y547mUsB.js +5 -0
- package/cli/storybook-dist/assets/RBSlider.stories-BJZyHiLO.js +5 -0
- package/cli/storybook-dist/assets/RBSpinner.stories-6wkbu-bU.js +14 -0
- package/cli/storybook-dist/assets/RBSwitch.stories-T9InolEP.js +65 -0
- package/cli/storybook-dist/assets/RBTab.stories-CjGzZODx.js +1 -0
- package/cli/storybook-dist/assets/RBTable.stories-CaolKsVG.js +62 -0
- package/cli/storybook-dist/assets/RBTableRow.stories-D13urGfs.js +11 -0
- package/cli/storybook-dist/assets/RBTabs.stories-Cv2iIxvP.js +21 -0
- package/cli/storybook-dist/assets/RBTextArea.stories-CmrPeit2.js +5 -0
- package/cli/storybook-dist/assets/RBTextField.stories-ByW-EKCD.js +45 -0
- package/cli/storybook-dist/assets/RBTextInput.stories-DSPlr3uh.js +5 -0
- package/cli/storybook-dist/assets/RBToast.stories-DJNZ9tku.js +11 -0
- package/cli/storybook-dist/assets/RBToggle.stories-BDQW2WO1.js +12 -0
- package/cli/storybook-dist/assets/RBToggleGroup.stories-CjwH6YbI.js +17 -0
- package/cli/storybook-dist/assets/RBTooltip.stories-Cp1oL68L.js +9 -0
- package/cli/storybook-dist/assets/RainbowUiProvider-BYlbsa69.css +1 -0
- package/cli/storybook-dist/assets/RainbowUiProvider-B_piZBLb.js +31 -0
- package/cli/storybook-dist/assets/browserUtils-DeopUpDy.js +1 -0
- package/cli/storybook-dist/assets/chunk-XP5HYGXS-BHXC9YeQ.js +1 -0
- package/cli/storybook-dist/assets/client-DTf7SId2.js +1 -0
- package/cli/storybook-dist/assets/createConveyorBeltLayer-769P8deX.js +6257 -0
- package/cli/storybook-dist/assets/createConveyorBeltLayer-Ds5AOper.css +21 -0
- package/cli/storybook-dist/assets/entry-preview-CNdFC92L.js +2 -0
- package/cli/storybook-dist/assets/entry-preview-docs-b8bpVBXy.js +46 -0
- package/cli/storybook-dist/assets/iframe-CLUgOMp4.js +211 -0
- package/cli/storybook-dist/assets/index-B4FGfHer.js +1 -0
- package/cli/storybook-dist/assets/index-BRq5TIsn.js +24 -0
- package/cli/storybook-dist/assets/index-C1OzuK6-.js +240 -0
- package/cli/storybook-dist/assets/index-CT3U1fyk.js +1 -0
- package/cli/storybook-dist/assets/index-ChsGqxH_.js +9 -0
- package/cli/storybook-dist/assets/index-DKFBREX_.js +1 -0
- package/cli/storybook-dist/assets/index-DgH-xKnr.js +11 -0
- package/cli/storybook-dist/assets/index-Dmy2JGbm.js +1 -0
- package/cli/storybook-dist/assets/index-DrFu-skq.js +6 -0
- package/cli/storybook-dist/assets/index-mT46TdHs.js +575 -0
- package/cli/storybook-dist/assets/jsx-runtime-BTJTZTIL.js +9 -0
- package/cli/storybook-dist/assets/keymapTileIndex.worker-BsNYNbqs.js +1 -0
- package/cli/storybook-dist/assets/preview-B8lJiyuQ.js +34 -0
- package/cli/storybook-dist/assets/preview-BBWR9nbA.js +1 -0
- package/cli/storybook-dist/assets/preview-BWzBA1C2.js +396 -0
- package/cli/storybook-dist/assets/preview-CILRoSnB.js +1 -0
- package/cli/storybook-dist/assets/preview-CVgpLj3b.js +1 -0
- package/cli/storybook-dist/assets/preview-Com4scch.css +1 -0
- package/cli/storybook-dist/assets/preview-CvbIS5ZJ.js +1 -0
- package/cli/storybook-dist/assets/preview-CvycU0Br.js +2 -0
- package/cli/storybook-dist/assets/preview-CzhIqee1.js +3 -0
- package/cli/storybook-dist/assets/preview-DD_OYowb.js +1 -0
- package/cli/storybook-dist/assets/preview-DGUiP6tS.js +7 -0
- package/cli/storybook-dist/assets/preview-DHQbi4pV.js +1 -0
- package/cli/storybook-dist/assets/react-18-hB3smqWJ.js +1 -0
- package/cli/storybook-dist/assets/react-resizable-panels.browser-CvAJUcrm.js +72 -0
- package/cli/storybook-dist/assets/test-utils-BQudk2xt.js +9 -0
- package/cli/storybook-dist/favicon.svg +1 -0
- package/cli/storybook-dist/iframe.html +666 -0
- package/cli/storybook-dist/index.html +190 -0
- package/cli/storybook-dist/index.json +1 -0
- package/cli/storybook-dist/nunito-sans-bold-italic.woff2 +0 -0
- package/cli/storybook-dist/nunito-sans-bold.woff2 +0 -0
- package/cli/storybook-dist/nunito-sans-italic.woff2 +0 -0
- package/cli/storybook-dist/nunito-sans-regular.woff2 +0 -0
- package/cli/storybook-dist/project.json +1 -0
- package/cli/storybook-dist/sb-addons/chromatic-com-storybook-10/manager-bundle.js +331 -0
- package/cli/storybook-dist/sb-addons/chromatic-com-storybook-10/manager-bundle.js.LEGAL.txt +51 -0
- package/cli/storybook-dist/sb-addons/essentials-actions-3/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/essentials-backgrounds-5/manager-bundle.js +12 -0
- package/cli/storybook-dist/sb-addons/essentials-controls-2/manager-bundle.js +405 -0
- package/cli/storybook-dist/sb-addons/essentials-docs-4/manager-bundle.js +245 -0
- package/cli/storybook-dist/sb-addons/essentials-measure-8/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/essentials-outline-9/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/essentials-toolbars-7/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/essentials-viewport-6/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/links-1/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/storybook-13/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/storybook-core-core-server-presets-0/common-manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-addons/storybook-experimental-addon-test-12/manager-bundle.js +223 -0
- package/cli/storybook-dist/sb-addons/themes-11/manager-bundle.js +3 -0
- package/cli/storybook-dist/sb-common-assets/favicon.svg +1 -0
- package/cli/storybook-dist/sb-common-assets/nunito-sans-bold-italic.woff2 +0 -0
- package/cli/storybook-dist/sb-common-assets/nunito-sans-bold.woff2 +0 -0
- package/cli/storybook-dist/sb-common-assets/nunito-sans-italic.woff2 +0 -0
- package/cli/storybook-dist/sb-common-assets/nunito-sans-regular.woff2 +0 -0
- package/cli/storybook-dist/sb-manager/globals-module-info.js +1052 -0
- package/cli/storybook-dist/sb-manager/globals-runtime.js +41775 -0
- package/cli/storybook-dist/sb-manager/globals.js +48 -0
- package/cli/storybook-dist/sb-manager/runtime.js +12048 -0
- package/cli/templates/common/.mcp.json +8 -0
- package/cli/templates/common/README.md +644 -81
- package/cli/templates/common/assets/icon.svg +44 -2
- package/cli/templates/common/manifest.json +13 -13
- package/cli/templates/common/package.json +11 -4
- package/cli/templates/common/py/main.py +98 -0
- package/cli/templates/common/requirements.txt +4 -3
- package/cli/templates/common/tsconfig.json +1 -1
- package/cli/templates/common/ui/content.tsx +216 -0
- package/cli/templates/common/ui/style.css +6 -0
- package/cli/templates/common/vite.config.ts +6 -25
- package/cli/templates/cpp/cpp/CMakeLists.txt +14 -0
- package/cli/templates/cpp/cpp/main.cpp +26 -0
- package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/node.py +1 -1
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/CMakeLists.txt +17 -0
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/package.xml +11 -0
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/src/node.cpp +22 -0
- package/cli/vite.d.mts +25 -0
- package/cli/vite.mjs +292 -0
- package/package.json +32 -5
- package/cli/src/pack.mjs +0 -61
- package/cli/src/preview.mjs +0 -91
- package/cli/templates/common/main.py +0 -114
- package/cli/templates/common/src/content.tsx +0 -33
package/README.md
CHANGED
|
@@ -1,106 +1,170 @@
|
|
|
1
1
|
# @rainbow-robotics/muscat-plugin-kit
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
CLI for developing Muscat plugins. Provides scaffolding, build/pack, and dev servers (UI + backend).
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Install
|
|
6
6
|
|
|
7
|
-
###
|
|
7
|
+
### Option 1 — npm (requires Node.js 20+)
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
|
-
#
|
|
10
|
+
# latest stable
|
|
11
11
|
npm install -g @rainbow-robotics/muscat-plugin-kit
|
|
12
12
|
|
|
13
|
-
# dev
|
|
13
|
+
# dev channel (latest dev build)
|
|
14
14
|
npm install -g @rainbow-robotics/muscat-plugin-kit@dev
|
|
15
15
|
|
|
16
|
-
#
|
|
16
|
+
# specific version
|
|
17
17
|
npm install -g @rainbow-robotics/muscat-plugin-kit@1.2.3
|
|
18
18
|
```
|
|
19
19
|
|
|
20
|
-
###
|
|
20
|
+
### Option 2 — S3 install script (no Node.js required)
|
|
21
21
|
|
|
22
22
|
macOS / Linux / WSL:
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
#
|
|
26
|
-
curl -fsSL https://
|
|
25
|
+
# latest stable
|
|
26
|
+
curl -fsSL https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/install.sh | sh
|
|
27
27
|
|
|
28
|
-
# dev
|
|
29
|
-
|
|
28
|
+
# dev channel
|
|
29
|
+
curl -fsSL https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/install.sh | MUSCAT_PK_TAG=dev sh
|
|
30
30
|
|
|
31
|
-
#
|
|
32
|
-
|
|
31
|
+
# specific version
|
|
32
|
+
curl -fsSL https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/install.sh | MUSCAT_PK_TAG=1.2.3 sh
|
|
33
33
|
```
|
|
34
34
|
|
|
35
35
|
Windows PowerShell:
|
|
36
36
|
|
|
37
37
|
```powershell
|
|
38
|
-
#
|
|
39
|
-
irm https://
|
|
38
|
+
# latest stable
|
|
39
|
+
irm https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/install.ps1 | iex
|
|
40
40
|
|
|
41
|
-
# dev
|
|
42
|
-
$env:MUSCAT_PK_TAG="dev"; irm https://
|
|
41
|
+
# dev channel
|
|
42
|
+
$env:MUSCAT_PK_TAG="dev"; irm https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/install.ps1 | iex
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
-
>
|
|
45
|
+
> The install script uses npm when Node.js 20+ is present, otherwise it downloads a self-contained binary from S3.
|
|
46
46
|
|
|
47
|
-
###
|
|
47
|
+
### Option 3 — direct binary download
|
|
48
48
|
|
|
49
49
|
```
|
|
50
|
-
https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/v{
|
|
50
|
+
https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/v{version}/{binary}
|
|
51
|
+
https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/stable/{binary}
|
|
52
|
+
https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/dev/{binary}
|
|
51
53
|
```
|
|
52
54
|
|
|
53
|
-
| OS |
|
|
55
|
+
| OS | File |
|
|
54
56
|
|---|---|
|
|
55
57
|
| Linux x64 | `muscat-pk-linux-x64` |
|
|
56
58
|
| macOS ARM64 | `muscat-pk-darwin-arm64` |
|
|
59
|
+
| macOS x64 | `muscat-pk-darwin-x64` |
|
|
57
60
|
| Windows x64 | `muscat-pk-win-x64.exe` |
|
|
58
61
|
|
|
59
|
-
|
|
62
|
+
Channel pointers:
|
|
60
63
|
|
|
61
64
|
```
|
|
62
|
-
#
|
|
65
|
+
# latest stable version string
|
|
63
66
|
https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/latest-version.txt
|
|
64
67
|
|
|
65
|
-
#
|
|
68
|
+
# latest dev version string
|
|
66
69
|
https://rainbow-deploy.s3.ap-northeast-2.amazonaws.com/muscat-plugin-kit/dev-version.txt
|
|
67
70
|
```
|
|
68
71
|
|
|
72
|
+
### Uninstall
|
|
73
|
+
|
|
74
|
+
Regardless of how it was installed, `muscat-pk` can remove itself:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
muscat-pk uninstall
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Manual removal:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
# if installed via npm
|
|
84
|
+
npm uninstall -g @rainbow-robotics/muscat-plugin-kit
|
|
85
|
+
|
|
86
|
+
# if installed via the S3 binary (default macOS/Linux path)
|
|
87
|
+
sudo rm -f /usr/local/bin/muscat-pk
|
|
88
|
+
```
|
|
89
|
+
|
|
69
90
|
---
|
|
70
91
|
|
|
71
|
-
##
|
|
92
|
+
## Quick start
|
|
72
93
|
|
|
73
94
|
```bash
|
|
74
|
-
muscat-pk new my-plugin #
|
|
95
|
+
muscat-pk new my-plugin # scaffold a plugin project (choose python / cpp / ros2 / ros2-cpp)
|
|
75
96
|
cd my-plugin
|
|
76
97
|
|
|
77
|
-
muscat-pk dev # UI +
|
|
78
|
-
muscat-pk dev:ui # UI
|
|
79
|
-
muscat-pk dev:back #
|
|
98
|
+
muscat-pk dev # run UI + backend together
|
|
99
|
+
muscat-pk dev:ui # UI preview only
|
|
100
|
+
muscat-pk dev:back # backend only (Docker: python/cpp/ros2)
|
|
80
101
|
|
|
81
|
-
muscat-pk build # dist/
|
|
82
|
-
muscat-pk pack # 배포용 ZIP 생성
|
|
102
|
+
muscat-pk build # build dist/ and produce a distributable ZIP (skip the ZIP with --no-zip)
|
|
83
103
|
```
|
|
84
104
|
|
|
85
|
-
##
|
|
105
|
+
## Command list
|
|
86
106
|
|
|
87
|
-
|
|
|
107
|
+
| Command | Description |
|
|
88
108
|
|---|---|
|
|
89
|
-
| `muscat-pk new [dir]` |
|
|
90
|
-
| `muscat-pk type change` |
|
|
91
|
-
| `muscat-pk build` | `
|
|
92
|
-
| `muscat-pk
|
|
93
|
-
| `muscat-pk dev` |
|
|
94
|
-
| `muscat-pk dev:
|
|
95
|
-
| `muscat-pk
|
|
96
|
-
| `muscat-pk
|
|
97
|
-
| `muscat-pk
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
109
|
+
| `muscat-pk new [dir]` | Scaffold a plugin project (also creates an IDE-only python `.venv`) |
|
|
110
|
+
| `muscat-pk type change` | Switch backend type (`python` / `cpp` / `ros2` / `ros2-cpp`) |
|
|
111
|
+
| `muscat-pk build` | Build `ui/*.tsx` → `dist/*.js` (one per `contributes[].ui` entry in the manifest) and produce a distributable ZIP |
|
|
112
|
+
| `muscat-pk dev` | UI + backend dev server together |
|
|
113
|
+
| `muscat-pk dev:ui` | Mini-Muscat preview server |
|
|
114
|
+
| `muscat-pk dev:back` | Backend dev server (Docker, hot-reload) |
|
|
115
|
+
| `muscat-pk storybook` | Browse the bundled rb-components Storybook |
|
|
116
|
+
| `muscat-pk mcp` | Run an MCP server for AI coding agents (exposes rb-components/design-token/SDK docs) |
|
|
117
|
+
| `muscat-pk update` | Update the kit + plugin-ui to the latest version |
|
|
118
|
+
| `muscat-pk sdk <list\|update>` | Manage the Python `rainbow-rb-sdk` version |
|
|
119
|
+
|
|
120
|
+
## IDE support (Python)
|
|
121
|
+
|
|
122
|
+
`muscat-pk new` creates a `.venv` at the project root with `requirements.txt` installed. The real backend still runs in a Docker container — this `.venv` exists purely for editor linting (pylint/pyright).
|
|
123
|
+
|
|
124
|
+
If it can't be created (no local Python 3 or `uv` found), scaffolding prints a warning and continues — Docker-based dev still works without it:
|
|
125
|
+
|
|
126
|
+
```
|
|
127
|
+
Could not create .venv (no local Python/uv?) — skipping, Docker dev still works.
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Install `uv` (recommended) or a system Python 3.12, then re-run `muscat-pk new` (or `muscat-pk type change`) to create it.
|
|
131
|
+
|
|
132
|
+
## AI coding agent setup (`muscat-pk mcp`)
|
|
133
|
+
|
|
134
|
+
`muscat-pk mcp` runs an MCP server (stdio) that gives an AI coding agent grounded info about `rb-components`, design tokens, and the Python `rainbow-rb-sdk` — actual prop types, real Storybook examples, and live-introspected SDK signatures/docstrings, instead of the agent guessing from training data. Use it while working inside a plugin project scaffolded by `muscat-pk new`.
|
|
135
|
+
|
|
136
|
+
### Claude Code
|
|
137
|
+
|
|
138
|
+
Claude Code reads a project-scoped `.mcp.json` at the plugin's root:
|
|
139
|
+
|
|
140
|
+
```json
|
|
141
|
+
{
|
|
142
|
+
"mcpServers": {
|
|
143
|
+
"muscat": {
|
|
144
|
+
"command": "muscat-pk",
|
|
145
|
+
"args": ["mcp"]
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Codex
|
|
152
|
+
|
|
153
|
+
Codex has no project-scoped config file — it reads a single, per-user `~/.codex/config.toml`. Add:
|
|
154
|
+
|
|
155
|
+
```toml
|
|
156
|
+
[mcp_servers.muscat]
|
|
157
|
+
command = "muscat-pk"
|
|
158
|
+
args = ["mcp"]
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
You don't run `muscat-pk mcp` yourself either way — the agent spawns and manages it automatically once it's registered.
|
|
162
|
+
|
|
163
|
+
## Package roles
|
|
164
|
+
|
|
165
|
+
| Package | Role |
|
|
102
166
|
|---|---|
|
|
103
|
-
| `@rainbow-robotics/plugin-ui` | UI
|
|
104
|
-
| `@rainbow-robotics/muscat-plugin-kit` | CLI,
|
|
167
|
+
| `@rainbow-robotics/plugin-ui` | UI runtime contract: React direct mount, `useRb()` context, host services |
|
|
168
|
+
| `@rainbow-robotics/muscat-plugin-kit` | CLI, templates, build/pack, preview host |
|
|
105
169
|
|
|
106
|
-
|
|
170
|
+
A plugin ZIP only contains the plugin's own code and assets. `@rainbow-robotics/plugin-ui`, `react`, and `react-dom` are provided by the host's (Muscat/robot) import map.
|
package/cli/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @rainbow-robotics/muscat-plugin-kit (`muscat-pk`)
|
|
2
2
|
|
|
3
|
-
CLI to scaffold, build,
|
|
3
|
+
CLI to scaffold, build, and preview Muscat plugins.
|
|
4
4
|
|
|
5
5
|
Install/use it the same way an external plugin author will:
|
|
6
6
|
|
|
@@ -10,16 +10,202 @@ muscat-pk new my-plugin
|
|
|
10
10
|
```
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
muscat-pk new my-plugin [--type
|
|
14
|
-
muscat-pk build #
|
|
15
|
-
muscat-pk pack # build (minified) + distributable ZIP with a size report
|
|
13
|
+
muscat-pk new my-plugin [--type python|cpp|ros2|ros2-cpp] [--pm npm|yarn|pnpm|bun] [--yes]
|
|
14
|
+
muscat-pk build # ui/content.tsx -> dist/ (minified) + distributable ZIP (--no-zip to skip)
|
|
16
15
|
muscat-pk dev:ui # preview the plugin in a mini-Muscat (preview-host)
|
|
17
|
-
muscat-pk dev:back # run the back end
|
|
16
|
+
muscat-pk dev:back # run the back end in a Docker container (python / cpp / ros2)
|
|
18
17
|
muscat-pk dev # dev:ui + dev:back
|
|
18
|
+
muscat-pk storybook # browse the bundled rb-components Storybook subset
|
|
19
|
+
muscat-pk mcp # start an MCP server (stdio) exposing rb-components/design-token/SDK docs to AI agents
|
|
19
20
|
muscat-pk update # update @rainbow-robotics/muscat-plugin-kit and @rainbow-robotics/plugin-ui
|
|
21
|
+
muscat-pk uninstall # remove muscat-pk itself (npm global or S3 binary)
|
|
20
22
|
muscat-pk sdk list | sdk update [version] # manage rainbow-rb-sdk (python)
|
|
21
23
|
```
|
|
22
24
|
|
|
25
|
+
## Backend ports
|
|
26
|
+
|
|
27
|
+
If a plugin backend opens a TCP server, declare it in `manifest.json`:
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
{
|
|
31
|
+
"ports": [28600, 28601]
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
`ports` is optional and accepts only `number[]`; ranges or objects are not
|
|
36
|
+
accepted. External plugin backend ports are reserved for `28600-28999`.
|
|
37
|
+
`muscat-pk dev` and `muscat-pk dev:back` validate the manifest before start and
|
|
38
|
+
stop the backend if it opens an undeclared managed TCP listen port.
|
|
39
|
+
|
|
40
|
+
Known robot/industrial/internal ports such as `502`, `4840`, `5170-5179`,
|
|
41
|
+
`8000-8999`, `10000`, `2222`, `30004`, `34964`, `44818`, `50000-50005`,
|
|
42
|
+
and `50051` are reserved and must not be used by external plugins.
|
|
43
|
+
|
|
44
|
+
## Backend runtimes
|
|
45
|
+
|
|
46
|
+
`manifest.json` selects one runtime:
|
|
47
|
+
|
|
48
|
+
| runtime | source | notes |
|
|
49
|
+
|---|---|---|
|
|
50
|
+
| `{ "type": "none" }` | — | UI-only plugin; no backend container |
|
|
51
|
+
| `{ "type": "python", "entry": "main.py" }` | `py/` | Uses `rainbow.rb_sdk.RBPluginCall` for UI/backend messaging |
|
|
52
|
+
| `{ "type": "cpp", "entry": "<executable name>" }` | `cpp/` | Built with CMake in Docker; current template is a run skeleton |
|
|
53
|
+
| `{ "type": "ros2", "rosClient": "rclpy", ... }` | `ros2_ws/` | ROS2 Python node; may use Python SDK alongside ROS2 APIs |
|
|
54
|
+
| `{ "type": "ros2", "rosClient": "rclcpp", ... }` | `ros2_ws/` | ROS2 C++ node built with colcon/CMake |
|
|
55
|
+
|
|
56
|
+
All non-`none` runtimes run in Docker during `muscat-pk dev:back`, `muscat-pk
|
|
57
|
+
dev`, and build/export flows so development matches the robot environment.
|
|
58
|
+
|
|
59
|
+
## JavaScript dependencies
|
|
60
|
+
|
|
61
|
+
`muscat-pk build` runs the plugin project's own Vite build. Vite resolves imports
|
|
62
|
+
from installed `node_modules`; it does not care whether a package is listed under
|
|
63
|
+
`dependencies` or `devDependencies`, but the package must be installed.
|
|
64
|
+
|
|
65
|
+
Do not run a production-only install such as `npm install --omit=dev` before
|
|
66
|
+
building a plugin UI, because build tools like `vite`, `typescript`,
|
|
67
|
+
`tailwindcss`, `@tailwindcss/vite`, `sass`, or `less` are usually
|
|
68
|
+
`devDependencies`.
|
|
69
|
+
|
|
70
|
+
The scaffold keeps this split:
|
|
71
|
+
|
|
72
|
+
| package kind | examples | why |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| `dependencies` | `@rainbow-robotics/plugin-ui`, UI libraries imported by plugin source | Author-facing APIs used by `ui/*.tsx` |
|
|
75
|
+
| `devDependencies` | `vite`, `typescript`, `tailwindcss`, `@tailwindcss/vite`, `sass`, `less` | Build/dev tools needed before `dist/*.js` is produced |
|
|
76
|
+
|
|
77
|
+
The built plugin ZIP does not include `package.json` or `node_modules`. For
|
|
78
|
+
production, Muscat provides `@rainbow-robotics/plugin-ui`, React, and ReactDOM
|
|
79
|
+
through the host import map; plugin UI build output imports those as host
|
|
80
|
+
externals.
|
|
81
|
+
|
|
82
|
+
## Plugin styles
|
|
83
|
+
|
|
84
|
+
`muscat()` auto-loads plugin styles from `ui/style.{css,scss,sass,less}` or
|
|
85
|
+
`ui/styles.{css,scss,sass,less}` for every UI entry, and from
|
|
86
|
+
`ui/{entry}.{css,scss,sass,less}` for a matching entry-specific file. Authors do
|
|
87
|
+
not need to import CSS from every `.tsx` entry.
|
|
88
|
+
|
|
89
|
+
The scaffold enables Tailwind in the plugin's own `vite.config.ts`; those
|
|
90
|
+
Tailwind dependencies live in the plugin package, while `muscat()` injects the
|
|
91
|
+
generated CSS into the plugin JS bundle so dynamic host imports do not need a
|
|
92
|
+
separate CSS file.
|
|
93
|
+
|
|
94
|
+
Built CSS selectors are scoped under the current plugin id
|
|
95
|
+
(`[data-muscat-plugin-id="..."]`), so Tailwind utilities or plugin styles do not
|
|
96
|
+
rewrite the host page or another plugin. CSS-in-JS libraries are allowed too,
|
|
97
|
+
but global styles (for example Emotion `Global`) remain the author's
|
|
98
|
+
responsibility to scope.
|
|
99
|
+
|
|
100
|
+
### Tailwind
|
|
101
|
+
|
|
102
|
+
New plugins include Tailwind by default:
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
import { defineConfig } from "vite";
|
|
106
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
107
|
+
import { muscat } from "@rainbow-robotics/muscat-plugin-kit/vite";
|
|
108
|
+
|
|
109
|
+
export default defineConfig({
|
|
110
|
+
plugins: [tailwindcss(), muscat()],
|
|
111
|
+
});
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
The default `ui/style.css` uses Tailwind theme/utilities only, not preflight:
|
|
115
|
+
|
|
116
|
+
```css
|
|
117
|
+
@layer theme, utilities;
|
|
118
|
+
|
|
119
|
+
@import "tailwindcss/theme.css" layer(theme);
|
|
120
|
+
@import "tailwindcss/utilities.css" layer(utilities);
|
|
121
|
+
|
|
122
|
+
@source "./**/*.{ts,tsx}";
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### SCSS, Sass, and Less
|
|
126
|
+
|
|
127
|
+
Install the preprocessor package in the plugin project, then create one of the
|
|
128
|
+
auto-loaded style files.
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
npm i -D sass
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
```scss
|
|
135
|
+
/* ui/style.scss */
|
|
136
|
+
$accent: #3b82f6;
|
|
137
|
+
|
|
138
|
+
.panel {
|
|
139
|
+
border: 1px solid color-mix(in srgb, $accent 40%, transparent);
|
|
140
|
+
|
|
141
|
+
&__title {
|
|
142
|
+
color: $accent;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
For Less, install `less` and use `ui/style.less`.
|
|
148
|
+
|
|
149
|
+
### Emotion
|
|
150
|
+
|
|
151
|
+
Emotion dependencies may be in `dependencies` or `devDependencies`; Vite can
|
|
152
|
+
bundle them when they are installed and imported by the plugin.
|
|
153
|
+
|
|
154
|
+
For `styled`, no Vite config change is needed:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
npm i @emotion/react @emotion/styled
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
```tsx
|
|
161
|
+
import styled from "@emotion/styled";
|
|
162
|
+
|
|
163
|
+
const Panel = styled.div({
|
|
164
|
+
display: "grid",
|
|
165
|
+
gap: 12,
|
|
166
|
+
});
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
For Emotion's `css` prop, pass React plugin options through `muscat()` and add
|
|
170
|
+
`jsxImportSource` to `tsconfig.json`:
|
|
171
|
+
|
|
172
|
+
```bash
|
|
173
|
+
npm i @emotion/react @emotion/styled
|
|
174
|
+
npm i -D @emotion/babel-plugin
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
```ts
|
|
178
|
+
// vite.config.ts
|
|
179
|
+
import { defineConfig } from "vite";
|
|
180
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
181
|
+
import { muscat } from "@rainbow-robotics/muscat-plugin-kit/vite";
|
|
182
|
+
|
|
183
|
+
export default defineConfig({
|
|
184
|
+
plugins: [
|
|
185
|
+
tailwindcss(),
|
|
186
|
+
muscat({
|
|
187
|
+
react: {
|
|
188
|
+
jsxImportSource: "@emotion/react",
|
|
189
|
+
babel: {
|
|
190
|
+
plugins: ["@emotion/babel-plugin"],
|
|
191
|
+
},
|
|
192
|
+
},
|
|
193
|
+
}),
|
|
194
|
+
],
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
```json
|
|
199
|
+
{
|
|
200
|
+
"compilerOptions": {
|
|
201
|
+
"jsxImportSource": "@emotion/react"
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
Emotion `Global` writes global CSS at runtime, so scope it manually or avoid it
|
|
207
|
+
inside plugins.
|
|
208
|
+
|
|
23
209
|
## How it fits together
|
|
24
210
|
|
|
25
211
|
- **Install/CLI package** is `@rainbow-robotics/muscat-plugin-kit`.
|
package/cli/bin/muscat-pk.mjs
CHANGED
|
@@ -1,16 +1,21 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
// muscat-pk — Muscat plugin developer CLI.
|
|
3
|
-
// Subcommands: new, build,
|
|
3
|
+
// Subcommands: new, build, dev, dev:ui, dev:back, update, uninstall, sdk.
|
|
4
|
+
import { log } from "../src/util.mjs";
|
|
4
5
|
import { runNew } from "../src/new.mjs";
|
|
5
6
|
import { runBuild } from "../src/build.mjs";
|
|
6
|
-
import { runPack } from "../src/pack.mjs";
|
|
7
7
|
import { runDevUi } from "../src/devUi.mjs";
|
|
8
8
|
import { runDevBack } from "../src/devBack.mjs";
|
|
9
9
|
import { runDev } from "../src/dev.mjs";
|
|
10
10
|
import { runUpdate } from "../src/update.mjs";
|
|
11
|
+
import { runUninstall } from "../src/uninstall.mjs";
|
|
11
12
|
import { runSdk } from "../src/sdk.mjs";
|
|
12
13
|
import { runType } from "../src/type.mjs";
|
|
13
|
-
import {
|
|
14
|
+
import { runStorybook } from "../src/storybook.mjs";
|
|
15
|
+
// mcp.mjs is dynamically imported below — it pulls in the MCP SDK + a full
|
|
16
|
+
// TypeScript program, and every other command would pay that cold-start cost
|
|
17
|
+
// on every invocation otherwise (see ros2.mjs/python.mjs/cpp.mjs for the same
|
|
18
|
+
// pattern in build.mjs).
|
|
14
19
|
|
|
15
20
|
const [, , cmd, ...args] = process.argv;
|
|
16
21
|
|
|
@@ -19,15 +24,16 @@ const HELP = `muscat-pk — Muscat plugin kit
|
|
|
19
24
|
Usage: muscat-pk <command> [options]
|
|
20
25
|
|
|
21
26
|
Commands:
|
|
22
|
-
new [dir] Scaffold a new plugin project
|
|
23
|
-
type change Switch backend type (python
|
|
24
|
-
build Build
|
|
25
|
-
|
|
26
|
-
dev Run dev:ui and dev:back together
|
|
27
|
+
new [dir] Scaffold a new plugin project (prompts: author, email, description, type, front-package-manager)
|
|
28
|
+
type change Switch backend type (python | cpp | ros2-python | ros2-cpp)
|
|
29
|
+
build Build + lock deps + vendor wheels + zip (--no-zip: skip zip, --no-lock: skip python lock/vendor, --arch amd64|arm64|both)
|
|
30
|
+
dev Run Socket.IO bridge, dev:ui, and dev:back together
|
|
27
31
|
dev:ui Preview the plugin in a mini-Muscat (preview-host)
|
|
28
32
|
dev:back Run the plugin back end (python: watchfiles reload / ros2: Docker)
|
|
29
|
-
|
|
33
|
+
storybook Browse the bundled rb-components Storybook (--port <n>, --rebuild)
|
|
34
|
+
mcp Start an MCP server (stdio) exposing rb-components/rb SDK docs to AI agents
|
|
30
35
|
update Update @rainbow-robotics/muscat-plugin-kit and @rainbow-robotics/plugin-ui
|
|
36
|
+
uninstall Remove the installed muscat-pk CLI (npm global or S3 binary)
|
|
31
37
|
sdk <list|update [version]> Manage the python rainbow-rb-sdk version
|
|
32
38
|
|
|
33
39
|
Run "muscat-pk <command> --help" for details.`;
|
|
@@ -41,18 +47,22 @@ async function main() {
|
|
|
41
47
|
return await runType(args);
|
|
42
48
|
case "build":
|
|
43
49
|
return await runBuild(args);
|
|
44
|
-
case "pack":
|
|
45
|
-
return await runPack(args);
|
|
46
50
|
case "dev":
|
|
47
51
|
return await runDev(args);
|
|
48
52
|
case "dev:ui":
|
|
49
53
|
return await runDevUi(args);
|
|
50
54
|
case "dev:back":
|
|
51
55
|
return await runDevBack(args);
|
|
52
|
-
case "
|
|
53
|
-
return await
|
|
56
|
+
case "storybook":
|
|
57
|
+
return await runStorybook(args);
|
|
58
|
+
case "mcp": {
|
|
59
|
+
const { runMcp } = await import("../src/mcp.mjs");
|
|
60
|
+
return await runMcp(args);
|
|
61
|
+
}
|
|
54
62
|
case "update":
|
|
55
63
|
return await runUpdate(args);
|
|
64
|
+
case "uninstall":
|
|
65
|
+
return await runUninstall(args);
|
|
56
66
|
case "sdk":
|
|
57
67
|
return await runSdk(args);
|
|
58
68
|
case undefined:
|
|
@@ -67,7 +77,8 @@ async function main() {
|
|
|
67
77
|
process.exitCode = 1;
|
|
68
78
|
}
|
|
69
79
|
} catch (err) {
|
|
70
|
-
console.error(
|
|
80
|
+
console.error();
|
|
81
|
+
log.error(err?.message || String(err));
|
|
71
82
|
process.exitCode = 1;
|
|
72
83
|
}
|
|
73
84
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Pre-build step: serialise cli/templates/** into cli/src/templates-embedded.mjs
|
|
3
|
+
// so that `bun build --compile` can embed them without needing the filesystem.
|
|
4
|
+
import { readdirSync, readFileSync, writeFileSync, statSync } from "node:fs";
|
|
5
|
+
import { resolve, relative } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
|
|
8
|
+
const root = resolve(fileURLToPath(import.meta.url), "..");
|
|
9
|
+
const out = resolve(root, "src/templates-embedded.mjs");
|
|
10
|
+
|
|
11
|
+
const files = {};
|
|
12
|
+
function walk(baseDir, prefix) {
|
|
13
|
+
for (const name of readdirSync(baseDir)) {
|
|
14
|
+
const full = resolve(baseDir, name);
|
|
15
|
+
const key = prefix + name;
|
|
16
|
+
if (statSync(full).isDirectory()) { walk(full + "/", key + "/"); continue; }
|
|
17
|
+
files[key] = readFileSync(full, "base64");
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
walk(resolve(root, "templates") + "/", "");
|
|
21
|
+
walk(resolve(root, "docker") + "/", "docker/");
|
|
22
|
+
|
|
23
|
+
writeFileSync(out,
|
|
24
|
+
`// AUTO-GENERATED by cli/bundle-templates.mjs — do not edit.\n` +
|
|
25
|
+
`// ponytail: generated at publish time; not tracked in git.\n` +
|
|
26
|
+
`export const TEMPLATES = ${JSON.stringify(files)};\n`
|
|
27
|
+
);
|
|
28
|
+
console.log(`bundled ${Object.keys(files).length} template files → src/templates-embedded.mjs`);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Socket.IO bridge container — the frontend (preview-host) and the backend
|
|
2
|
+
# container rendezvous here during `muscat-pk dev`.
|
|
3
|
+
# - frontend (host) → published port localhost:10000
|
|
4
|
+
# - backend container → shares this container's netns (--network container:),
|
|
5
|
+
# so it reaches the bridge at localhost:10000 too
|
|
6
|
+
# Build context is the `cli/` dir so it can copy src/socketBridge.mjs.
|
|
7
|
+
FROM node:20-slim
|
|
8
|
+
LABEL com.rainbow-robotics.muscat-pk="true"
|
|
9
|
+
|
|
10
|
+
WORKDIR /bridge
|
|
11
|
+
COPY docker/bridge-package.json package.json
|
|
12
|
+
RUN npm install --omit=dev --no-audit --no-fund
|
|
13
|
+
|
|
14
|
+
COPY src/socketBridge.mjs ./socketBridge.mjs
|
|
15
|
+
|
|
16
|
+
EXPOSE 10000
|
|
17
|
+
CMD ["node", "socketBridge.mjs"]
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# Dev/build container for the pure C++ plugin back end.
|
|
2
|
+
# Matches the Muscat robot backend OS (Ubuntu 24.04) so the compiled binary
|
|
3
|
+
# is ABI-compatible with the robot. Used by `muscat-pk dev:back` and `build`
|
|
4
|
+
# — NOT shipped in the plugin ZIP.
|
|
5
|
+
FROM ubuntu:24.04
|
|
6
|
+
LABEL com.rainbow-robotics.muscat-pk="true"
|
|
7
|
+
|
|
8
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
9
|
+
build-essential \
|
|
10
|
+
cmake \
|
|
11
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
12
|
+
|
|
13
|
+
# TODO(cpp-sdk): install the rainbow cpp SDK (dev package) here, pinned to the
|
|
14
|
+
# robot's version, so plugins build/link against the same SDK as production.
|
|
15
|
+
# Plan: apt package + dynamic link (the robot provides the .so at runtime;
|
|
16
|
+
# we do NOT bundle it into the plugin binary). e.g.:
|
|
17
|
+
# RUN apt-get update && apt-get install -y rainbow-cpp-sdk-dev=<robot-version> \
|
|
18
|
+
# && rm -rf /var/lib/apt/lists/*
|
|
19
|
+
|
|
20
|
+
WORKDIR /plugin
|
|
21
|
+
|
|
22
|
+
CMD ["bash"]
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
# Matches the Muscat robot backend: ROS2 Jazzy + Python 3.12 (Ubuntu 24.04).
|
|
3
3
|
# Used by `muscat-pk dev:back` — NOT shipped in the plugin ZIP.
|
|
4
4
|
FROM ros:jazzy-ros-base
|
|
5
|
+
LABEL com.rainbow-robotics.muscat-pk="true"
|
|
5
6
|
|
|
6
7
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
7
8
|
python3-pip \
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Dev/build container for the Python plugin back end.
|
|
2
|
+
# Matches the Muscat robot backend: Ubuntu 24.04 + Python 3.12.
|
|
3
|
+
# Used by `muscat-pk dev:back` (hot-reload) and `muscat-pk build` (lock + wheel vendor).
|
|
4
|
+
# NOT shipped in the plugin ZIP — the robot installs deps from dist/wheels/ offline.
|
|
5
|
+
FROM ubuntu:24.04
|
|
6
|
+
LABEL com.rainbow-robotics.muscat-pk="true"
|
|
7
|
+
|
|
8
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
9
|
+
python3 \
|
|
10
|
+
python3-pip \
|
|
11
|
+
&& rm -rf /var/lib/apt/lists/* \
|
|
12
|
+
&& pip3 install uv==0.8.18 --break-system-packages
|
|
13
|
+
|
|
14
|
+
# TODO(cpp-sdk): the Python SDK is a pybind wrapper over the cpp SDK, so the
|
|
15
|
+
# cpp SDK shared lib must be present for the python module to load. Install the
|
|
16
|
+
# rainbow cpp SDK (apt, pinned to the robot's version) here once it exists.
|
|
17
|
+
|
|
18
|
+
WORKDIR /plugin
|
|
19
|
+
|
|
20
|
+
CMD ["bash"]
|
package/cli/prepack.mjs
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// Runs on `npm publish` / `yarn npm publish` (and `npm pack`) via the "prepack"
|
|
2
|
+
// lifecycle hook. Builds the bundled Storybook (foundations + muscat) and stages
|
|
3
|
+
// it into cli/storybook-dist so it ships inside the published muscat-pk and
|
|
4
|
+
// `muscat-pk storybook` works from an external install.
|
|
5
|
+
//
|
|
6
|
+
// In the monorepo this runs the real build; outside it (re-packing an already
|
|
7
|
+
// published copy) buildStorybook() no-ops and the pre-staged dist is used.
|
|
8
|
+
import { buildStorybook } from "./src/storybook.mjs";
|
|
9
|
+
|
|
10
|
+
buildStorybook();
|
|
Binary file
|