@rainbow-robotics/muscat-plugin-kit 0.1.2-dev.9 → 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
|
@@ -1,3 +1,45 @@
|
|
|
1
|
-
<svg
|
|
2
|
-
<
|
|
1
|
+
<svg width="256" height="256" viewBox="0 0 256 256" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="36" y1="28" x2="220" y2="228" gradientUnits="userSpaceOnUse">
|
|
4
|
+
<stop stop-color="#8B5CF6"/>
|
|
5
|
+
<stop offset="1" stop-color="#5B21B6"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="grape" x1="92" y1="74" x2="168" y2="178" gradientUnits="userSpaceOnUse">
|
|
8
|
+
<stop stop-color="#D8B4FE"/>
|
|
9
|
+
<stop offset="1" stop-color="#A855F7"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
|
|
13
|
+
<rect x="16" y="16" width="224" height="224" rx="52" fill="url(#bg)"/>
|
|
14
|
+
|
|
15
|
+
<!-- plugin brackets -->
|
|
16
|
+
<path d="M72 84H56C47.1634 84 40 91.1634 40 100V116" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
17
|
+
<path d="M184 84H200C208.837 84 216 91.1634 216 100V116" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
18
|
+
<path d="M72 172H56C47.1634 172 40 164.837 40 156V140" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
19
|
+
<path d="M184 172H200C208.837 172 216 164.837 216 156V140" stroke="white" stroke-width="12" stroke-linecap="round"/>
|
|
20
|
+
|
|
21
|
+
<!-- grape stem + leaf -->
|
|
22
|
+
<path d="M128 73C128 59 137 48 151 44" stroke="#F3E8FF" stroke-width="10" stroke-linecap="round"/>
|
|
23
|
+
<path d="M142 51C151 39 169 39 179 50C165 60 151 62 142 51Z" fill="#C4B5FD"/>
|
|
24
|
+
|
|
25
|
+
<!-- muscat grape cluster -->
|
|
26
|
+
<circle cx="106" cy="91" r="18" fill="url(#grape)"/>
|
|
27
|
+
<circle cx="132" cy="88" r="18" fill="url(#grape)"/>
|
|
28
|
+
<circle cx="158" cy="91" r="18" fill="url(#grape)"/>
|
|
29
|
+
<circle cx="94" cy="119" r="18" fill="url(#grape)"/>
|
|
30
|
+
<circle cx="120" cy="116" r="18" fill="url(#grape)"/>
|
|
31
|
+
<circle cx="146" cy="116" r="18" fill="url(#grape)"/>
|
|
32
|
+
<circle cx="172" cy="119" r="18" fill="url(#grape)"/>
|
|
33
|
+
<circle cx="107" cy="145" r="18" fill="url(#grape)"/>
|
|
34
|
+
<circle cx="133" cy="144" r="18" fill="url(#grape)"/>
|
|
35
|
+
<circle cx="159" cy="145" r="18" fill="url(#grape)"/>
|
|
36
|
+
<circle cx="120" cy="170" r="18" fill="url(#grape)"/>
|
|
37
|
+
<circle cx="146" cy="170" r="18" fill="url(#grape)"/>
|
|
38
|
+
<circle cx="133" cy="193" r="18" fill="url(#grape)"/>
|
|
39
|
+
|
|
40
|
+
<!-- center plugin glyph -->
|
|
41
|
+
<path d="M122 119V109C122 103.477 126.477 99 132 99H136C141.523 99 146 103.477 146 109V119" stroke="white" stroke-width="8" stroke-linecap="round"/>
|
|
42
|
+
<rect x="116" y="118" width="36" height="34" rx="10" fill="white"/>
|
|
43
|
+
<path d="M127 152V163" stroke="white" stroke-width="8" stroke-linecap="round"/>
|
|
44
|
+
<path d="M141 152V163" stroke="white" stroke-width="8" stroke-linecap="round"/>
|
|
3
45
|
</svg>
|
|
@@ -2,24 +2,24 @@
|
|
|
2
2
|
"id": "__PLUGIN_ID__",
|
|
3
3
|
"name": "__PLUGIN_NAME__",
|
|
4
4
|
"version": "1.0.0",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
5
|
+
"minMuscatVersion": "1.0.0",
|
|
6
|
+
"author": "__PLUGIN_AUTHOR__",
|
|
7
|
+
"email": "__PLUGIN_EMAIL__",
|
|
8
|
+
"description": {
|
|
9
|
+
"ko": "",
|
|
10
|
+
"en": ""
|
|
11
|
+
},
|
|
12
|
+
"icons": "assets/icon.svg",
|
|
13
|
+
"targetModels": "all",
|
|
14
|
+
"targetCategorys": "all",
|
|
7
15
|
"contributes": [
|
|
8
|
-
{ "point": "program.panel", "label": "__PLUGIN_NAME__", "icon": "assets/icon.svg" },
|
|
9
|
-
{ "point": "lnb", "label": "__PLUGIN_NAME__", "icon": "assets/icon.svg" },
|
|
10
16
|
{
|
|
11
|
-
"point": "
|
|
12
|
-
"label": "__PLUGIN_NAME__",
|
|
17
|
+
"point": "toolbar",
|
|
13
18
|
"icon": "assets/icon.svg",
|
|
19
|
+
"label": { "ko": "__PLUGIN_NAME__", "en": "__PLUGIN_NAME__" },
|
|
20
|
+
"ui": "content",
|
|
14
21
|
"opens": "popover"
|
|
15
22
|
}
|
|
16
23
|
],
|
|
17
|
-
"actions": [
|
|
18
|
-
{
|
|
19
|
-
"id": "grip",
|
|
20
|
-
"topic": "rby2/plugin/__PLUGIN_ID__/grip",
|
|
21
|
-
"schema": { "width": "number" }
|
|
22
|
-
}
|
|
23
|
-
],
|
|
24
24
|
"runtime": { "type": "__RUNTIME_TYPE__", "entry": "main.py" }
|
|
25
25
|
}
|
|
@@ -4,12 +4,19 @@
|
|
|
4
4
|
"private": true,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@rainbow-robotics/plugin-ui": "
|
|
7
|
+
"@rainbow-robotics/plugin-ui": "__RB_VERSION__"
|
|
8
8
|
},
|
|
9
9
|
"devDependencies": {
|
|
10
|
-
"@
|
|
11
|
-
"@rainbow-robotics/
|
|
10
|
+
"@tailwindcss/vite": "^4.1.0",
|
|
11
|
+
"@rainbow-robotics/muscat-plugin-kit": "__RB_VERSION__",
|
|
12
|
+
"@rainbow-robotics/preview-host": "__RB_VERSION__",
|
|
13
|
+
"@types/react": "^19.0.10",
|
|
14
|
+
"@types/react-dom": "^19.0.4",
|
|
15
|
+
"@vitejs/plugin-react": "^4.0.0",
|
|
16
|
+
"react": "^19.0.0",
|
|
17
|
+
"react-dom": "^19.0.0",
|
|
18
|
+
"tailwindcss": "^4.1.0",
|
|
12
19
|
"typescript": "^5.8.0",
|
|
13
|
-
"vite": "^6.
|
|
20
|
+
"vite": "^6.0.0"
|
|
14
21
|
}
|
|
15
22
|
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Muscat plugin backend — __PLUGIN_NAME__
|
|
3
|
+
|
|
4
|
+
On-robot (default):
|
|
5
|
+
muscat-pk dev:back
|
|
6
|
+
python main.py
|
|
7
|
+
|
|
8
|
+
Remote dev (from your laptop):
|
|
9
|
+
Set env vars before running:
|
|
10
|
+
MUSCAT_ROBOT_HOST=192.168.1.100
|
|
11
|
+
MUSCAT_ROBOT_TOKEN=<service token>
|
|
12
|
+
Then: muscat-pk dev:back
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
import asyncio
|
|
16
|
+
import os
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
from rainbow.rb_sdk import RBManipulateSDK, RBPluginCall
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
PLUGIN_NAME = "__PLUGIN_NAME__"
|
|
23
|
+
|
|
24
|
+
plugin = RBPluginCall()
|
|
25
|
+
manipulate = RBManipulateSDK()
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def register_handlers():
|
|
29
|
+
# Register handlers here — called after connect() so subscriptions survive
|
|
30
|
+
# session reconnection in remote-dev mode.
|
|
31
|
+
|
|
32
|
+
@plugin.subscribe("event")
|
|
33
|
+
def on_ui_event(payload: dict[str, Any] | None = None):
|
|
34
|
+
"""Handle messages published from the plugin UI with rb.pub("event", ...)."""
|
|
35
|
+
print(f"[{PLUGIN_NAME}] event:", payload)
|
|
36
|
+
|
|
37
|
+
@plugin.serve("grip")
|
|
38
|
+
def grip(payload: dict[str, Any] | None = None):
|
|
39
|
+
"""Handle the default UI button: rb.action("grip", { width })."""
|
|
40
|
+
width = (payload or {}).get("width", 20)
|
|
41
|
+
print(f"[{PLUGIN_NAME}] grip requested: width={width}")
|
|
42
|
+
plugin.publish("state", {"ready": True, "last_grip_width": width})
|
|
43
|
+
return {"ok": True, "width": width}
|
|
44
|
+
|
|
45
|
+
@plugin.serve("tool/echo")
|
|
46
|
+
def echo(payload: dict[str, Any] | None = None):
|
|
47
|
+
"""Small query example callable from the UI with rb.action("tool/echo", ...)."""
|
|
48
|
+
return {"echo": payload, "plugin": PLUGIN_NAME}
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def move_j_example():
|
|
52
|
+
"""
|
|
53
|
+
Example: use other robot SDKs from the same backend.
|
|
54
|
+
|
|
55
|
+
This function is not called automatically. Add safety checks and call it
|
|
56
|
+
from your own handler when the robot is ready.
|
|
57
|
+
"""
|
|
58
|
+
return manipulate.move.call_move_j(
|
|
59
|
+
robot_model="C500920",
|
|
60
|
+
target={
|
|
61
|
+
"tar_values": [0, 0, 0, 0, 0, 0],
|
|
62
|
+
"tar_frame": 0,
|
|
63
|
+
"tar_unit": 0,
|
|
64
|
+
},
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
async def main():
|
|
69
|
+
robot_host = os.getenv("MUSCAT_ROBOT_HOST")
|
|
70
|
+
robot_token = os.getenv("MUSCAT_ROBOT_TOKEN")
|
|
71
|
+
|
|
72
|
+
if robot_host and robot_token:
|
|
73
|
+
# Remote dev: connect to the robot before registering any handlers.
|
|
74
|
+
# connect() closes and reopens the Zenoh session, so handlers registered
|
|
75
|
+
# before this call would be lost.
|
|
76
|
+
await manipulate.connect(token=robot_token, host=robot_host)
|
|
77
|
+
|
|
78
|
+
register_handlers()
|
|
79
|
+
|
|
80
|
+
plugin.publish("state", {"ready": True, "plugin": PLUGIN_NAME})
|
|
81
|
+
print(f"[{PLUGIN_NAME}] backend ready")
|
|
82
|
+
|
|
83
|
+
try:
|
|
84
|
+
while True:
|
|
85
|
+
await asyncio.sleep(1)
|
|
86
|
+
except (KeyboardInterrupt, asyncio.CancelledError):
|
|
87
|
+
pass
|
|
88
|
+
finally:
|
|
89
|
+
if robot_host and robot_token:
|
|
90
|
+
await manipulate.disconnect()
|
|
91
|
+
print(f"[{PLUGIN_NAME}] stopped")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
if __name__ == "__main__":
|
|
95
|
+
try:
|
|
96
|
+
asyncio.run(main())
|
|
97
|
+
except KeyboardInterrupt:
|
|
98
|
+
pass
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
rainbow-rb-sdk
|
|
2
|
-
rainbow-rb-flat-buffers
|
|
3
|
-
|
|
1
|
+
rainbow-rb-sdk==0.0.9.dev44
|
|
2
|
+
rainbow-rb-flat-buffers==0.0.9.dev44
|
|
3
|
+
rainbow-rb-zenoh==0.0.9.dev44
|
|
4
|
+
requests==2.34.2
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { useMemo, useState } from "react";
|
|
2
|
+
import {
|
|
3
|
+
RBCheckBox,
|
|
4
|
+
RBLabelButton,
|
|
5
|
+
RBRadioBox,
|
|
6
|
+
RBSelectBox,
|
|
7
|
+
RBSlider,
|
|
8
|
+
RBSwitch,
|
|
9
|
+
RBTextArea,
|
|
10
|
+
RBTextField,
|
|
11
|
+
RBTextInput,
|
|
12
|
+
Option
|
|
13
|
+
} from "@rainbow-robotics/plugin-ui/react";
|
|
14
|
+
import { useRb } from "@rainbow-robotics/plugin-ui/sdk";
|
|
15
|
+
|
|
16
|
+
type RunMode = "inspect" | "assist" | "auto";
|
|
17
|
+
|
|
18
|
+
const MODE_OPTIONS: Array<{ label: string; value: RunMode }> = [
|
|
19
|
+
{ label: "Inspect", value: "inspect" },
|
|
20
|
+
{ label: "Assist", value: "assist" },
|
|
21
|
+
{ label: "Auto", value: "auto" },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const TASK_OPTIONS = [
|
|
25
|
+
{ label: "Publish status", value: "publish" },
|
|
26
|
+
{ label: "Run grip action", value: "grip" },
|
|
27
|
+
{ label: "Save snapshot", value: "snapshot" },
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
// Export your UI as the default. The host mounts it (dev: with HMR).
|
|
31
|
+
export default function App() {
|
|
32
|
+
const rb = useRb();
|
|
33
|
+
const [targetName, setTargetName] = useState("demo_target");
|
|
34
|
+
const [gripType, setGripType] = useState<string>();
|
|
35
|
+
const [gripWidth, setGripWidth] = useState(24);
|
|
36
|
+
const [speed, setSpeed] = useState(45);
|
|
37
|
+
const [mode, setMode] = useState<RunMode>("assist");
|
|
38
|
+
const [enabled, setEnabled] = useState(true);
|
|
39
|
+
const [tasks, setTasks] = useState<Array<string>>(["publish", "grip"]);
|
|
40
|
+
const [memo, setMemo] = useState("Use this area for operator notes.");
|
|
41
|
+
|
|
42
|
+
const payload = useMemo(
|
|
43
|
+
() => ({
|
|
44
|
+
targetName,
|
|
45
|
+
gripWidth,
|
|
46
|
+
speed,
|
|
47
|
+
mode,
|
|
48
|
+
enabled,
|
|
49
|
+
tasks,
|
|
50
|
+
memo,
|
|
51
|
+
}),
|
|
52
|
+
[targetName, gripWidth, speed, mode, enabled, tasks, memo],
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
const showRequestError = (error: unknown) => {
|
|
56
|
+
const message = error instanceof Error ? error.message : "Request failed";
|
|
57
|
+
rb.toast({ type: "danger", message });
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const runAction = async () => {
|
|
61
|
+
try {
|
|
62
|
+
await rb.action("grip", payload);
|
|
63
|
+
rb.toast({ type: "success", message: `Sent ${targetName}` });
|
|
64
|
+
} catch (error) {
|
|
65
|
+
showRequestError(error);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const publishPreview = async () => {
|
|
70
|
+
try {
|
|
71
|
+
const isConfirm = await rb.confirm({
|
|
72
|
+
message: "Are you sure publish?",
|
|
73
|
+
buttonText: { yes: "confirm", no: "cancel" },
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
if (isConfirm) {
|
|
77
|
+
await rb.pub("event", payload);
|
|
78
|
+
}
|
|
79
|
+
} catch (error) {
|
|
80
|
+
showRequestError(error);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
return (
|
|
85
|
+
<div className="max-h-[70vh] w-[420px] p-4 max-w-full overflow-y-auto bg-bg-elevated text-fg-default">
|
|
86
|
+
<div className="flex flex-col gap-5">
|
|
87
|
+
<header>
|
|
88
|
+
<div className="flex items-center justify-between gap-12">
|
|
89
|
+
<div>
|
|
90
|
+
<h2 className="typo-heading-xs-semibold">Demo Control</h2>
|
|
91
|
+
<p className="typo-body-xs2-normal text-fg-subtle">
|
|
92
|
+
Input patterns for Muscat plugin UIs
|
|
93
|
+
</p>
|
|
94
|
+
</div>
|
|
95
|
+
<RBSwitch
|
|
96
|
+
checked={enabled}
|
|
97
|
+
onCheckedChange={(next: boolean) => {
|
|
98
|
+
setEnabled(next);
|
|
99
|
+
rb.toast({message: next ? "Plugin enabled" : "Plugin paused"});
|
|
100
|
+
}}
|
|
101
|
+
/>
|
|
102
|
+
</div>
|
|
103
|
+
</header>
|
|
104
|
+
|
|
105
|
+
<section className="flex flex-col gap-4">
|
|
106
|
+
<RBTextField
|
|
107
|
+
label="Target name"
|
|
108
|
+
required
|
|
109
|
+
helperText="Used as the backend action target."
|
|
110
|
+
>
|
|
111
|
+
<RBTextInput
|
|
112
|
+
name="targetName"
|
|
113
|
+
value={targetName}
|
|
114
|
+
placeholder="target id"
|
|
115
|
+
handleChange={(value) => setTargetName(String(value))}
|
|
116
|
+
/>
|
|
117
|
+
</RBTextField>
|
|
118
|
+
|
|
119
|
+
<RBTextField label="Select Grip">
|
|
120
|
+
<RBSelectBox className="w-full" value={gripType} handleChange={setGripType}>
|
|
121
|
+
<Option value="A">A Grip</Option>
|
|
122
|
+
<Option value="B">B Grip</Option>
|
|
123
|
+
</RBSelectBox>
|
|
124
|
+
</RBTextField>
|
|
125
|
+
|
|
126
|
+
<div className="flex gap-4">
|
|
127
|
+
<RBTextField className="flex-1" label="Grip width" helperText="0-100 mm">
|
|
128
|
+
<RBTextInput
|
|
129
|
+
className="w-full"
|
|
130
|
+
name="gripWidth"
|
|
131
|
+
type="number"
|
|
132
|
+
value={gripWidth}
|
|
133
|
+
validate={(value: number) =>
|
|
134
|
+
Math.max(0, Math.min(100, Number(value) || 0))
|
|
135
|
+
}
|
|
136
|
+
handleChange={(value) => setGripWidth(Number(value) || 0)}
|
|
137
|
+
/>
|
|
138
|
+
</RBTextField>
|
|
139
|
+
|
|
140
|
+
<RBTextField className="flex-1" label="Speed" helperText={`${speed}%`}>
|
|
141
|
+
<div className="flex items-center px-2">
|
|
142
|
+
<RBSlider
|
|
143
|
+
value={[speed]}
|
|
144
|
+
min={0}
|
|
145
|
+
max={100}
|
|
146
|
+
step={5}
|
|
147
|
+
onValueChange={(values: number[]) =>
|
|
148
|
+
setSpeed(values[0] ?? 0)
|
|
149
|
+
}
|
|
150
|
+
/>
|
|
151
|
+
</div>
|
|
152
|
+
</RBTextField>
|
|
153
|
+
</div>
|
|
154
|
+
</section>
|
|
155
|
+
|
|
156
|
+
<section className="mb-4">
|
|
157
|
+
<RBTextField label="Run mode">
|
|
158
|
+
<div className="flex justify-between border-1 border-border-subtle rounded-sm p-2">
|
|
159
|
+
{MODE_OPTIONS.map((item) => (
|
|
160
|
+
<RBRadioBox
|
|
161
|
+
key={item.value}
|
|
162
|
+
name="mode"
|
|
163
|
+
checkValue={item.value}
|
|
164
|
+
value={mode}
|
|
165
|
+
handleChange={(value) => setMode(value as RunMode)}
|
|
166
|
+
>
|
|
167
|
+
{item.label}
|
|
168
|
+
</RBRadioBox>
|
|
169
|
+
))}
|
|
170
|
+
</div>
|
|
171
|
+
</RBTextField>
|
|
172
|
+
</section>
|
|
173
|
+
|
|
174
|
+
<section className="mb-4">
|
|
175
|
+
<RBTextField label="Tasks">
|
|
176
|
+
<div className="flex justify-between border-1 border-border-subtle rounded-sm p-2">
|
|
177
|
+
{TASK_OPTIONS.map((item) => (
|
|
178
|
+
<RBCheckBox
|
|
179
|
+
key={item.value}
|
|
180
|
+
name="tasks"
|
|
181
|
+
checkValue={item.value}
|
|
182
|
+
value={tasks}
|
|
183
|
+
handleChange={(value) =>
|
|
184
|
+
setTasks(Array.isArray(value) ? value.map(String) : [])
|
|
185
|
+
}
|
|
186
|
+
>
|
|
187
|
+
{item.label}
|
|
188
|
+
</RBCheckBox>
|
|
189
|
+
))}
|
|
190
|
+
</div>
|
|
191
|
+
</RBTextField>
|
|
192
|
+
|
|
193
|
+
</section>
|
|
194
|
+
|
|
195
|
+
<RBTextField label="Memo">
|
|
196
|
+
<RBTextArea
|
|
197
|
+
name="memo"
|
|
198
|
+
value={memo}
|
|
199
|
+
maxLength={120}
|
|
200
|
+
rows={4}
|
|
201
|
+
handleChange={setMemo}
|
|
202
|
+
/>
|
|
203
|
+
</RBTextField>
|
|
204
|
+
|
|
205
|
+
<footer className="grid grid-cols-2 gap-8 pt-4">
|
|
206
|
+
<RBLabelButton variant="outlined" onClick={publishPreview}>
|
|
207
|
+
Publish
|
|
208
|
+
</RBLabelButton>
|
|
209
|
+
<RBLabelButton onClick={runAction} disabled={!enabled}>
|
|
210
|
+
Run Action
|
|
211
|
+
</RBLabelButton>
|
|
212
|
+
</footer>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
);
|
|
216
|
+
}
|
|
@@ -1,29 +1,10 @@
|
|
|
1
1
|
import { defineConfig } from "vite";
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
// Plugin UI and React are provided by Muscat/preview-host via import map.
|
|
5
|
-
// They must NOT be bundled into the plugin ZIP.
|
|
6
|
-
const HOST_PROVIDED_EXTERNALS = [
|
|
7
|
-
"@rainbow-robotics/plugin-ui",
|
|
8
|
-
/^@rainbow\/plugin-ui\//,
|
|
9
|
-
"react",
|
|
10
|
-
"react/jsx-runtime",
|
|
11
|
-
"react/jsx-dev-runtime",
|
|
12
|
-
"react-dom",
|
|
13
|
-
/^react-dom\//,
|
|
14
|
-
];
|
|
2
|
+
import tailwindcss from "@tailwindcss/vite";
|
|
3
|
+
import { muscat } from "@rainbow-robotics/muscat-plugin-kit/vite";
|
|
15
4
|
|
|
5
|
+
// The muscat() preset wires react-refresh, ui/ entry discovery, and marks the
|
|
6
|
+
// host-provided runtime (plugin-ui, react) as external. Add your own plugins or
|
|
7
|
+
// overrides here as needed.
|
|
16
8
|
export default defineConfig({
|
|
17
|
-
plugins: [
|
|
18
|
-
build: {
|
|
19
|
-
lib: {
|
|
20
|
-
entry: "src/content.tsx",
|
|
21
|
-
formats: ["es"],
|
|
22
|
-
fileName: "content",
|
|
23
|
-
},
|
|
24
|
-
outDir: "dist",
|
|
25
|
-
rollupOptions: {
|
|
26
|
-
external: HOST_PROVIDED_EXTERNALS,
|
|
27
|
-
},
|
|
28
|
-
},
|
|
9
|
+
plugins: [tailwindcss(), muscat()],
|
|
29
10
|
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.16)
|
|
2
|
+
project(__PLUGIN_SLUG__ CXX)
|
|
3
|
+
|
|
4
|
+
set(CMAKE_CXX_STANDARD 17)
|
|
5
|
+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
6
|
+
|
|
7
|
+
# The executable name must match runtime.entry in manifest.json.
|
|
8
|
+
add_executable(__PLUGIN_SLUG__ main.cpp)
|
|
9
|
+
|
|
10
|
+
# TODO(cpp-sdk): link the rainbow cpp SDK dynamically (the robot provides the
|
|
11
|
+
# .so at runtime — do NOT bundle/static-link it). Once the SDK ships an apt
|
|
12
|
+
# package with CMake config, enable:
|
|
13
|
+
# find_package(rainbow_cpp_sdk REQUIRED)
|
|
14
|
+
# target_link_libraries(__PLUGIN_SLUG__ PRIVATE rainbow::cpp_sdk)
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// __PLUGIN_NAME__ — C++ plugin back end.
|
|
2
|
+
//
|
|
3
|
+
// The C++ plugin SDK is not available yet, so this is a build/run skeleton.
|
|
4
|
+
// Once the SDK lands, connect to the plugin gateway here (the host exposes it
|
|
5
|
+
// at the RB_PLUGIN_GATEWAY / RB_PLUGIN_ID environment variables) and wire up
|
|
6
|
+
// pub / sub / serve, mirroring the Python rainbow.rb_sdk.RBPluginCall API.
|
|
7
|
+
|
|
8
|
+
#include <chrono>
|
|
9
|
+
#include <cstdlib>
|
|
10
|
+
#include <iostream>
|
|
11
|
+
#include <string>
|
|
12
|
+
#include <thread>
|
|
13
|
+
|
|
14
|
+
int main() {
|
|
15
|
+
const char* plugin_id = std::getenv("RB_PLUGIN_ID");
|
|
16
|
+
std::cout << "[__PLUGIN_NAME__] backend ready"
|
|
17
|
+
<< (plugin_id ? std::string(" (id=") + plugin_id + ")" : "")
|
|
18
|
+
<< std::endl;
|
|
19
|
+
|
|
20
|
+
// TODO: connect to the plugin gateway and register handlers once the
|
|
21
|
+
// C++ SDK is available. For now, just keep the process alive.
|
|
22
|
+
while (true) {
|
|
23
|
+
std::this_thread::sleep_for(std::chrono::seconds(1));
|
|
24
|
+
}
|
|
25
|
+
return 0;
|
|
26
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
cmake_minimum_required(VERSION 3.16)
|
|
2
|
+
project(__PLUGIN_SLUG__)
|
|
3
|
+
|
|
4
|
+
if(NOT CMAKE_CXX_STANDARD)
|
|
5
|
+
set(CMAKE_CXX_STANDARD 17)
|
|
6
|
+
endif()
|
|
7
|
+
|
|
8
|
+
find_package(ament_cmake REQUIRED)
|
|
9
|
+
find_package(rclcpp REQUIRED)
|
|
10
|
+
|
|
11
|
+
add_executable(__PLUGIN_SLUG___node src/node.cpp)
|
|
12
|
+
ament_target_dependencies(__PLUGIN_SLUG___node rclcpp)
|
|
13
|
+
|
|
14
|
+
install(TARGETS __PLUGIN_SLUG___node
|
|
15
|
+
DESTINATION lib/${PROJECT_NAME})
|
|
16
|
+
|
|
17
|
+
ament_package()
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
<?xml version="1.0"?>
|
|
2
|
+
<package format="3">
|
|
3
|
+
<name>__PLUGIN_SLUG__</name>
|
|
4
|
+
<version>0.0.1</version>
|
|
5
|
+
<description>__PLUGIN_NAME__ ROS2 node (rclcpp)</description>
|
|
6
|
+
<maintainer email="todo@example.com">maintainer</maintainer>
|
|
7
|
+
<license>Proprietary</license>
|
|
8
|
+
<buildtool_depend>ament_cmake</buildtool_depend>
|
|
9
|
+
<depend>rclcpp</depend>
|
|
10
|
+
<export><build_type>ament_cmake</build_type></export>
|
|
11
|
+
</package>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// __PLUGIN_NAME__ — ROS2 node (rclcpp).
|
|
2
|
+
//
|
|
3
|
+
// The node is launched with `--ros-args -r __ns:=/{slug}` automatically by
|
|
4
|
+
// dev:back. ROS2 topics are bridged to the plugin communication layer, so a
|
|
5
|
+
// plain rclcpp node is all you need — relative topic names get the namespace
|
|
6
|
+
// prefix applied automatically.
|
|
7
|
+
#include "rclcpp/rclcpp.hpp"
|
|
8
|
+
|
|
9
|
+
class __PLUGIN_CLASS__Node : public rclcpp::Node {
|
|
10
|
+
public:
|
|
11
|
+
__PLUGIN_CLASS__Node() : Node("__PLUGIN_SLUG___node") {
|
|
12
|
+
RCLCPP_INFO(this->get_logger(), "__PLUGIN_NAME__ node started");
|
|
13
|
+
// create publishers / subscribers / services here
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
int main(int argc, char** argv) {
|
|
18
|
+
rclcpp::init(argc, argv);
|
|
19
|
+
rclcpp::spin(std::make_shared<__PLUGIN_CLASS__Node>());
|
|
20
|
+
rclcpp::shutdown();
|
|
21
|
+
return 0;
|
|
22
|
+
}
|
package/cli/vite.d.mts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface MuscatVitePlugin {
|
|
2
|
+
name: string;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export type MuscatVitePluginOption =
|
|
6
|
+
| MuscatVitePlugin
|
|
7
|
+
| false
|
|
8
|
+
| null
|
|
9
|
+
| undefined
|
|
10
|
+
| MuscatVitePluginOption[];
|
|
11
|
+
|
|
12
|
+
export interface MuscatReactOptions {
|
|
13
|
+
jsxImportSource?: string;
|
|
14
|
+
babel?: {
|
|
15
|
+
plugins?: unknown[];
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
};
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface MuscatOptions {
|
|
22
|
+
react?: false | MuscatReactOptions;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export declare function muscat(options?: MuscatOptions): MuscatVitePluginOption[];
|