@rainbow-robotics/muscat-plugin-kit 0.1.2-dev.8 → 0.10.1-dev.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.ko.md +1186 -0
- package/README.md +1137 -57
- package/cli/README.md +239 -7
- package/cli/bin/create-muscat-plugin.mjs +1 -1
- package/cli/bin/muscat-pk.mjs +123 -27
- package/cli/bundle-templates.mjs +31 -0
- package/cli/docker/Dockerfile.cpp +28 -0
- package/cli/docker/Dockerfile.dev +17 -0
- package/cli/docker/Dockerfile.python +21 -0
- package/cli/prepack.mjs +10 -0
- package/cli/src/__pycache__/host_agent.cpython-37.pyc +0 -0
- package/cli/src/ai-rules.mjs +107 -0
- package/cli/src/build.mjs +333 -93
- package/cli/src/check-package.mjs +8 -23
- package/cli/src/completion.mjs +168 -0
- package/cli/src/cpp.mjs +78 -0
- package/cli/src/cppIde.mjs +76 -0
- package/cli/src/dev.mjs +195 -6
- package/cli/src/devBack.mjs +671 -60
- package/cli/src/devId.mjs +54 -0
- package/cli/src/devSession.mjs +67 -0
- package/cli/src/devUi.mjs +214 -25
- package/cli/src/esbuild.mjs +27 -10
- package/cli/src/host_agent.py +223 -0
- package/cli/src/manifest.mjs +288 -0
- package/cli/src/mcp.mjs +1153 -0
- package/cli/src/mcpProxy.mjs +110 -0
- package/cli/src/muscatLocal.mjs +292 -0
- package/cli/src/new.mjs +205 -68
- package/cli/src/pluginDevServer.mjs +111 -0
- package/cli/src/ports.mjs +193 -0
- package/cli/src/projectCheck.mjs +102 -0
- package/cli/src/python.mjs +112 -0
- package/cli/src/ros2.mjs +62 -18
- package/cli/src/sdk.mjs +74 -24
- package/cli/src/sim.mjs +177 -0
- package/cli/src/storybook.mjs +150 -0
- package/cli/src/templates-embedded.mjs +4 -0
- package/cli/src/type.mjs +93 -34
- package/cli/src/uninstall.mjs +81 -0
- package/cli/src/update.mjs +364 -35
- package/cli/src/util.mjs +341 -11
- package/cli/src/zenohDev.mjs +83 -0
- package/cli/src/zip.mjs +121 -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 +56 -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/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 +216 -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-pCKrjUal.js +1 -0
- package/cli/storybook-dist/assets/Docs-B-Y7I1GA.js +7 -0
- package/cli/storybook-dist/assets/Docs-BFJcE_VS.js +8 -0
- package/cli/storybook-dist/assets/Docs-B_QaTtz8.js +8 -0
- package/cli/storybook-dist/assets/Docs-CryDGmfh.js +20 -0
- package/cli/storybook-dist/assets/Docs-Cw2AVNKx.js +7 -0
- package/cli/storybook-dist/assets/Docs-Q6r1fBeL.js +12 -0
- package/cli/storybook-dist/assets/DocsRenderer-CFRXHY34-_OmZBCn8.js +2 -0
- package/cli/storybook-dist/assets/NxAvatar.stories-Ctf5G2FQ.js +13 -0
- package/cli/storybook-dist/assets/NxButton.stories-DeLObVSj.js +20 -0
- package/cli/storybook-dist/assets/NxIcons.stories-DeqrVzVs.js +3 -0
- package/cli/storybook-dist/assets/NxNumberInput.stories-LqoY0ed1.js +26 -0
- package/cli/storybook-dist/assets/NxPagination.stories-DI6bXuJM.js +11 -0
- package/cli/storybook-dist/assets/NxPointerHoldButton.stories-3HSV1XmN.js +14 -0
- package/cli/storybook-dist/assets/NxRangeInput.stories-1pjgQVaG.js +17 -0
- package/cli/storybook-dist/assets/NxSelectBox.stories-bcQPZEuF.js +17 -0
- package/cli/storybook-dist/assets/NxSlideRange.stories-BosX4axk.js +14 -0
- package/cli/storybook-dist/assets/NxSwitch.stories-DxV6dS33.js +11 -0
- package/cli/storybook-dist/assets/NxTextArea.stories-CO545-LP.js +11 -0
- package/cli/storybook-dist/assets/NxTextInput.stories-BP0npai1.js +11 -0
- package/cli/storybook-dist/assets/PretendardVariable-CJuje-Rk.woff2 +0 -0
- package/cli/storybook-dist/assets/RBAccordion.stories-fVR4Va2a.js +17 -0
- package/cli/storybook-dist/assets/RBAccordionGroup.stories-Du5bsckD.js +33 -0
- package/cli/storybook-dist/assets/RBAlert.stories-DNkMXUu6.js +17 -0
- package/cli/storybook-dist/assets/RBBadge.stories-C44pXt8D.js +1 -0
- package/cli/storybook-dist/assets/RBBattery.stories-DE2JHvfL.js +10 -0
- package/cli/storybook-dist/assets/RBCard.stories-CuIda7NI.js +45 -0
- package/cli/storybook-dist/assets/RBCheckBox.stories-D1qM1ayr.js +1 -0
- package/cli/storybook-dist/assets/RBCheckIconButton.stories-e4gkliBO.js +1 -0
- package/cli/storybook-dist/assets/RBCheckLabelButton.stories-CDzCtsMI.js +24 -0
- package/cli/storybook-dist/assets/RBChipTab.stories-DBrc_3Mp.js +21 -0
- package/cli/storybook-dist/assets/RBChipsBoxTab.stories-hlrsHjKY.js +1 -0
- package/cli/storybook-dist/assets/RBColorIcons.stories-BHUvpkdu.js +3 -0
- package/cli/storybook-dist/assets/RBCommand.stories-azAF41NP.js +73 -0
- package/cli/storybook-dist/assets/RBConfirm.stories-BMNjwbmT.js +20 -0
- package/cli/storybook-dist/assets/RBDateInput.stories-D0VezDzv.js +15 -0
- package/cli/storybook-dist/assets/RBDialog.stories-AOJ975Fy.js +38 -0
- package/cli/storybook-dist/assets/RBDivider.stories-NSvnj43Z.js +1 -0
- package/cli/storybook-dist/assets/RBDrawer.stories-Du0oTvD1.js +14 -0
- package/cli/storybook-dist/assets/RBDropdownMenu.stories-Hsxve4PW.js +86 -0
- package/cli/storybook-dist/assets/RBEmptyView.stories-BlwHx3zp.js +12 -0
- package/cli/storybook-dist/assets/RBIconButton.stories-DAPDY63x.js +1 -0
- package/cli/storybook-dist/assets/RBIcons.stories-W5ZUV2L1.js +3 -0
- package/cli/storybook-dist/assets/RBInlineLabelButton.stories-C99j0Y3g.js +1 -0
- package/cli/storybook-dist/assets/RBJoyStick.stories-Du0H1iAS.js +11 -0
- package/cli/storybook-dist/assets/RBLabelButton.stories-BlvHaU_Z.js +1 -0
- package/cli/storybook-dist/assets/RBLight.stories-BY6DKrre.js +1 -0
- package/cli/storybook-dist/assets/RBMenubar.stories-D2PEGpM9.js +3 -0
- package/cli/storybook-dist/assets/RBMultiRangeInput.stories-Bm2qSmjq.js +14 -0
- package/cli/storybook-dist/assets/RBPagination.stories-DDleJa5N.js +17 -0
- package/cli/storybook-dist/assets/RBPopover.stories-27YxPSFG.js +11 -0
- package/cli/storybook-dist/assets/RBPrompt.stories-BFaIOctr.js +20 -0
- package/cli/storybook-dist/assets/RBRadioBox.stories-BroDar0t.js +1 -0
- package/cli/storybook-dist/assets/RBRadioButton.stories-M3O-wX7V.js +11 -0
- package/cli/storybook-dist/assets/RBRangeDateInput.stories-CWlM_D5X.js +15 -0
- package/cli/storybook-dist/assets/RBResizable.stories-ui8X1qnc.js +20 -0
- package/cli/storybook-dist/assets/RBSelectBox.stories-C8T6cfA0.js +74 -0
- package/cli/storybook-dist/assets/RBSheet.stories-BCOo_Zcc.js +39 -0
- package/cli/storybook-dist/assets/RBSideNumberInput.stories-CU2_MVlJ.js +5 -0
- package/cli/storybook-dist/assets/RBSlider.stories-DgOp1TFc.js +5 -0
- package/cli/storybook-dist/assets/RBSpinner.stories-qLScY3zZ.js +14 -0
- package/cli/storybook-dist/assets/RBSwitch.stories-SXSY1QMb.js +65 -0
- package/cli/storybook-dist/assets/RBTab.stories-BzXXTsXP.js +1 -0
- package/cli/storybook-dist/assets/RBTable.stories-DHTeRNVk.js +62 -0
- package/cli/storybook-dist/assets/RBTableRow.stories-DRNRsd15.js +11 -0
- package/cli/storybook-dist/assets/RBTabs.stories-DP0noBLp.js +21 -0
- package/cli/storybook-dist/assets/RBTextArea.stories-TkaejfxJ.js +5 -0
- package/cli/storybook-dist/assets/RBTextField.stories-B6VpCGyt.js +45 -0
- package/cli/storybook-dist/assets/RBTextInput.stories-D3hZ08e-.js +5 -0
- package/cli/storybook-dist/assets/RBToast.stories-BQ2wS2U0.js +11 -0
- package/cli/storybook-dist/assets/RBToggle.stories-GVOjGqo3.js +12 -0
- package/cli/storybook-dist/assets/RBToggleGroup.stories-pzx0btOD.js +17 -0
- package/cli/storybook-dist/assets/RBTooltip.stories-jufB6fa1.js +9 -0
- package/cli/storybook-dist/assets/SideNumberInput-BYlmNHEw.js +1109 -0
- package/cli/storybook-dist/assets/SideNumberInput-SAkhydsn.css +21 -0
- package/cli/storybook-dist/assets/browserUtils-CQM9Za7e.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/entry-preview-CAkU-e0D.js +2 -0
- package/cli/storybook-dist/assets/entry-preview-docs-b8bpVBXy.js +46 -0
- package/cli/storybook-dist/assets/iframe-B-BmTsxV.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-CT3U1fyk.js +1 -0
- package/cli/storybook-dist/assets/index-ChsGqxH_.js +9 -0
- package/cli/storybook-dist/assets/index-CkB0GfaI.js +575 -0
- package/cli/storybook-dist/assets/index-ClAc6FBW.js +240 -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/jsx-runtime-BTJTZTIL.js +9 -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-BVJwlGUF.js +1 -0
- package/cli/storybook-dist/assets/preview-BWzBA1C2.js +396 -0
- package/cli/storybook-dist/assets/preview-CVgpLj3b.js +1 -0
- package/cli/storybook-dist/assets/preview-CvbIS5ZJ.js +1 -0
- package/cli/storybook-dist/assets/preview-CznQwwbo.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/preview-M77JRg1A.js +2 -0
- package/cli/storybook-dist/assets/preview-kTZPgP6D.css +1 -0
- package/cli/storybook-dist/assets/react-18-hB3smqWJ.js +1 -0
- package/cli/storybook-dist/assets/react-resizable-panels-HsFbxPbn.css +1 -0
- package/cli/storybook-dist/assets/react-resizable-panels.browser-DuxpZLkF.js +120 -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/README.md +1070 -83
- package/cli/templates/common/assets/icon.svg +44 -2
- package/cli/templates/common/manifest.json +14 -13
- package/cli/templates/common/package.json +11 -4
- package/cli/templates/common/py/main.py +125 -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 +73 -0
- package/cli/templates/readme-cpp/README.md +1012 -0
- package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/node.py +12 -1
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/CMakeLists.txt +22 -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 +41 -0
- package/cli/vite.d.mts +25 -0
- package/cli/vite.mjs +292 -0
- package/package.json +34 -7
- 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/cli/src/sim.mjs
ADDED
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// `dev --sim <model>`: robot simulators next to the local Muscat, for developing without a robot.
|
|
2
|
+
// Cobot: coreSW (rainbowroboticsofficial/cobot-sim) per component, joined to common's Zenoh.
|
|
3
|
+
// RB-Y1: rby1-sim + Xvfb built locally (it needs a GLFW window; there is no headless mode yet).
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { canSkipImageBuild, log } from "./util.mjs";
|
|
6
|
+
import { MUSCAT_NETWORK } from "./muscatLocal.mjs";
|
|
7
|
+
|
|
8
|
+
const COBOT_IMAGE = "rainbowroboticsofficial/cobot-sim";
|
|
9
|
+
const RBY1_IMAGE = "rainbowroboticsofficial/rby1-sim";
|
|
10
|
+
const RBY1_LOCAL = "muscat-pk-rby1-sim";
|
|
11
|
+
const RBY1_CONTAINER = "muscat-pk-sim-rby1";
|
|
12
|
+
const SIM_LABEL = "com.rainbow-robotics.muscat-pk.sim";
|
|
13
|
+
|
|
14
|
+
// ponytail: model table in code; move to S3 version.json when sims are versioned with Muscat (amr: no sim yet)
|
|
15
|
+
// sim name → coreSW RB_MODEL per component, and the Muscat robot model it registers as.
|
|
16
|
+
const COBOT_MODELS = {
|
|
17
|
+
"500920": { robotModel: "C500920", models: ["500920"] },
|
|
18
|
+
RBY2: { robotModel: "RBY2", models: ["C500880", "C501880", "C502880"] },
|
|
19
|
+
};
|
|
20
|
+
const RBY1_TYPES = ["a", "m", "ub"];
|
|
21
|
+
|
|
22
|
+
// rby1-sim renders MuJoCo with software GL every frame; one GL thread and a tiny screen cut it from
|
|
23
|
+
// ~3.5 cores to ~1. The cap keeps a busy Mac usable; the image already skips RT-loop timeouts.
|
|
24
|
+
const RBY1_DOCKERFILE = `ARG BASE=0.10.6-m_v1.3
|
|
25
|
+
FROM ${RBY1_IMAGE}:\${BASE}
|
|
26
|
+
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends xvfb && rm -rf /var/lib/apt/lists/*
|
|
27
|
+
ENV LP_NUM_THREADS=0 DISPLAY=:99
|
|
28
|
+
CMD ["sh", "-c", "Xvfb :99 -screen 0 320x240x16 -nolisten tcp & sleep 1; exec ./app_main"]
|
|
29
|
+
`;
|
|
30
|
+
|
|
31
|
+
export const SIM_NAMES = [...Object.keys(COBOT_MODELS), ...RBY1_TYPES.map((t) => `rby1-${t}`)];
|
|
32
|
+
|
|
33
|
+
/** `muscat-pk sim list`: "<name>\t<what runs>" per line, for scripts and the VS Code Dev picker. */
|
|
34
|
+
export function runSimList() {
|
|
35
|
+
for (const [name, { robotModel, models }] of Object.entries(COBOT_MODELS))
|
|
36
|
+
console.log(`${name}\tcobot · ${robotModel}${models.length > 1 ? ` (${models.join(", ")})` : ""}`);
|
|
37
|
+
for (const t of RBY1_TYPES) console.log(`rby1-${t}\tRB-Y1 ${t.toUpperCase()}`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** "500920" | "RBY2" | "rby1-m" | "rby1-m_v1.2" → { services, env, ... } or null. */
|
|
41
|
+
export function parseSim(name) {
|
|
42
|
+
if (COBOT_MODELS[name]) return { name, kind: "cobot", services: ["log", "manipulate"], env: {}, ...COBOT_MODELS[name] };
|
|
43
|
+
const m = /^rby1-(a|m|ub)(?:_(v[\d.]+))?$/.exec(name ?? "");
|
|
44
|
+
if (m) return { name, kind: "rby1", services: ["log", "rby1"], env: { RBY1_HOST: RBY1_CONTAINER }, robotModel: m[1], type: m[1], version: m[2] };
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Only an explicit --sim <name> runs a simulator. */
|
|
49
|
+
export function resolveSim(simArg, manifest) {
|
|
50
|
+
if (simArg === undefined) return null;
|
|
51
|
+
const sim = typeof simArg === "string" ? parseSim(simArg) : null;
|
|
52
|
+
if (!sim) throw new Error(`--sim takes one of: ${SIM_NAMES.join(", ")} (rby1 also takes rby1-m_v1.2)`);
|
|
53
|
+
const models = Array.isArray(manifest.targetModels) ? manifest.targetModels : null;
|
|
54
|
+
if (models && !models.includes(simArg)) log.warn(`--sim ${simArg} is not in manifest targetModels (${models.join(", ")})`);
|
|
55
|
+
return sim;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async function hubTags(repo) {
|
|
59
|
+
const res = await fetch(`https://hub.docker.com/v2/repositories/${repo}/tags?page_size=100&ordering=last_updated`, {
|
|
60
|
+
signal: AbortSignal.timeout(10_000),
|
|
61
|
+
});
|
|
62
|
+
if (!res.ok) throw new Error(`Docker Hub ${repo}: HTTP ${res.status}`);
|
|
63
|
+
return (await res.json()).results.map((t) => t.name);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// "0.10.6-m_v1.3" → [0, 10, 6, 1, 3]
|
|
67
|
+
const semver = (v) => v.split(/[._v-]/).map(Number).filter((n) => !Number.isNaN(n));
|
|
68
|
+
const newer = (a, b) => {
|
|
69
|
+
const [x, y] = [semver(a), semver(b)];
|
|
70
|
+
for (let i = 0; i < Math.max(x.length, y.length); i++) if ((x[i] ?? 0) !== (y[i] ?? 0)) return (x[i] ?? 0) - (y[i] ?? 0);
|
|
71
|
+
return 0;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// Latest published tag; offline falls back to whatever was pulled before.
|
|
75
|
+
async function latestTag(repo, pattern) {
|
|
76
|
+
try {
|
|
77
|
+
const tags = (await hubTags(repo)).filter((t) => pattern.test(t));
|
|
78
|
+
if (tags.length) return tags.sort(newer).at(-1);
|
|
79
|
+
} catch (e) {
|
|
80
|
+
log.warn(`${e.message} — using a local image`);
|
|
81
|
+
}
|
|
82
|
+
const tags = localTags(repo).filter((t) => pattern.test(t));
|
|
83
|
+
if (!tags.length) throw new Error(`no ${repo} image matching ${pattern} (offline and nothing pulled yet)`);
|
|
84
|
+
return tags.sort(newer).at(-1);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function localTags(repo) {
|
|
88
|
+
const out = spawnSync("docker", ["images", repo, "--format", "{{.Tag}}"], { encoding: "utf8" }).stdout ?? "";
|
|
89
|
+
return out.split("\n").map((t) => t.trim()).filter(Boolean);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// A new sim release replaces the previous one (100–700MB each); other model types' tags stay.
|
|
93
|
+
function removeOldTags(repo, pattern, keep) {
|
|
94
|
+
for (const tag of localTags(repo).filter((t) => t !== keep && pattern.test(t)))
|
|
95
|
+
spawnSync("docker", ["rmi", `${repo}:${tag}`], { stdio: "ignore" });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function pull(image) {
|
|
99
|
+
if (spawnSync("docker", ["image", "inspect", image], { stdio: "ignore" }).status === 0) return;
|
|
100
|
+
log.step(`docker pull ${image}…`);
|
|
101
|
+
if (spawnSync("docker", ["pull", image], { stdio: "inherit" }).status !== 0) throw new Error(`docker pull ${image} failed`);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function run(name, args) {
|
|
105
|
+
spawnSync("docker", ["rm", "-f", name], { stdio: "ignore" });
|
|
106
|
+
const r = spawnSync("docker", [
|
|
107
|
+
// --ipc host like the robot: the cobot coreSWs share one shm segment (RB_MESSAGE_SHM, a slot per model).
|
|
108
|
+
"run", "-d", "--name", name, "--network", MUSCAT_NETWORK, "--ipc", "host",
|
|
109
|
+
"--label", "com.rainbow-robotics.muscat-pk=true", "--label", `${SIM_LABEL}=true`,
|
|
110
|
+
...args,
|
|
111
|
+
], { stdio: ["ignore", "ignore", "inherit"] });
|
|
112
|
+
if (r.status !== 0) throw new Error(`failed to start ${name}`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// The Muscat UI (robot info, components, connection state) follows the registered robot model.
|
|
116
|
+
async function registerRobot(robotModel) {
|
|
117
|
+
const res = await fetch("http://127.0.0.1:3000/common/upsert-robot-info", {
|
|
118
|
+
method: "POST",
|
|
119
|
+
headers: { "Content-Type": "application/json" },
|
|
120
|
+
body: JSON.stringify({ robotModel }),
|
|
121
|
+
});
|
|
122
|
+
if (!res.ok) throw new Error(`upsert-robot-info ${robotModel}: HTTP ${res.status}`);
|
|
123
|
+
log.step(`robot model ${robotModel} registered in the local Muscat`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** Start the simulator containers and register the robot model; returns the container names. */
|
|
127
|
+
export async function startSim(sim) {
|
|
128
|
+
const names = await startContainers(sim);
|
|
129
|
+
await registerRobot(sim.robotModel);
|
|
130
|
+
return names;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Needs the local Muscat on MUSCAT_NETWORK.
|
|
134
|
+
async function startContainers(sim) {
|
|
135
|
+
stopSims();
|
|
136
|
+
if (sim.kind === "cobot") {
|
|
137
|
+
const pattern = /^\d+\.\d+\.\d+$/;
|
|
138
|
+
const tag = await latestTag(COBOT_IMAGE, pattern);
|
|
139
|
+
const image = `${COBOT_IMAGE}:${tag}`;
|
|
140
|
+
pull(image);
|
|
141
|
+
removeOldTags(COBOT_IMAGE, pattern, tag);
|
|
142
|
+
const names = sim.models.map((model) => `muscat-pk-sim-${model}`);
|
|
143
|
+
sim.models.forEach((model, i) => run(names[i], [
|
|
144
|
+
"--cap-add", "SYS_NICE", "--ulimit", "rtprio=99",
|
|
145
|
+
"-e", `RB_MODEL=${model}`,
|
|
146
|
+
"-e", "RB_ZENOH_CONNECT=tcp/muscat-pk-muscat:7447",
|
|
147
|
+
image,
|
|
148
|
+
]));
|
|
149
|
+
log.step(`cobot sim ${sim.name} (${image}) → ${sim.models.join(", ")}`);
|
|
150
|
+
return names;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const pattern = sim.version ? new RegExp(`^\\d+\\.\\d+\\.\\d+-${sim.type}_${sim.version.replace(/\./g, "\\.")}$`) : new RegExp(`^\\d+\\.\\d+\\.\\d+-${sim.type}_v[\\d.]+$`);
|
|
154
|
+
const base = await latestTag(RBY1_IMAGE, pattern);
|
|
155
|
+
const image = `${RBY1_LOCAL}:${base}`;
|
|
156
|
+
if (!canSkipImageBuild(image)) {
|
|
157
|
+
log.step(`building ${image} (rby1-sim + Xvfb, first run pulls ~150MB)…`);
|
|
158
|
+
const r = spawnSync("docker", ["build", "-t", image, "--build-arg", `BASE=${base}`, "--label", "com.rainbow-robotics.muscat-pk=true", "-"], {
|
|
159
|
+
input: RBY1_DOCKERFILE,
|
|
160
|
+
stdio: ["pipe", "inherit", "inherit"],
|
|
161
|
+
});
|
|
162
|
+
if (r.status !== 0) throw new Error(`docker build ${image} failed`);
|
|
163
|
+
}
|
|
164
|
+
removeOldTags(RBY1_LOCAL, pattern, base);
|
|
165
|
+
removeOldTags(RBY1_IMAGE, pattern, base);
|
|
166
|
+
run(RBY1_CONTAINER, ["--cpus", process.env.MUSCAT_PK_RBY1_CPUS || "1.5", image]);
|
|
167
|
+
log.step(`rby1 sim ${base} → ${RBY1_CONTAINER}:50051`);
|
|
168
|
+
return [RBY1_CONTAINER];
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export function stopSims() {
|
|
172
|
+
const ids = (spawnSync("docker", ["ps", "-aq", "--filter", `label=${SIM_LABEL}=true`], { encoding: "utf8" }).stdout ?? "").split("\n").filter(Boolean);
|
|
173
|
+
if (!ids.length) return;
|
|
174
|
+
// The cobot coreSWs share these under --ipc host; drop them so the next run starts from a fresh segment.
|
|
175
|
+
spawnSync("docker", ["exec", ids[0], "sh", "-c", "rm -f /dev/shm/RB_COBOT_SHM /dev/shm/RB_MESSAGE_SHM"], { stdio: "ignore" });
|
|
176
|
+
spawnSync("docker", ["rm", "-f", ...ids], { stdio: "ignore" });
|
|
177
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// muscat-pk storybook — serve the bundled Storybook (foundations + muscat) so
|
|
2
|
+
// plugin authors can browse the real rb-components UI while developing.
|
|
3
|
+
//
|
|
4
|
+
// The static build is produced from apps/storybook (MUSCAT_STORYBOOK=true → only
|
|
5
|
+
// the 1.foundations + 4.muscat sections, ordering-number prefixes stripped) and
|
|
6
|
+
// staged into cli/storybook-dist so it ships inside the published muscat-pk.
|
|
7
|
+
// In the monorepo it's built on demand if missing (or with --rebuild).
|
|
8
|
+
import { createServer } from "node:http";
|
|
9
|
+
import {
|
|
10
|
+
cpSync,
|
|
11
|
+
createReadStream,
|
|
12
|
+
existsSync,
|
|
13
|
+
mkdirSync,
|
|
14
|
+
rmSync,
|
|
15
|
+
statSync,
|
|
16
|
+
} from "node:fs";
|
|
17
|
+
import { execSync } from "node:child_process";
|
|
18
|
+
import { copyFileSync } from "node:fs";
|
|
19
|
+
import { extname, join, resolve } from "node:path";
|
|
20
|
+
import { kitRoot, log, openBrowser, parseArgs } from "./util.mjs";
|
|
21
|
+
|
|
22
|
+
// Shipped location (under cli/ → included in the npm "files" list).
|
|
23
|
+
const SHIPPED_DIST = resolve(kitRoot, "cli/storybook-dist");
|
|
24
|
+
// Raw .stories.tsx sources, staged alongside the compiled build — the `mcp`
|
|
25
|
+
// command's get_component_example tool reads these directly (real usage
|
|
26
|
+
// code, not just prop types) without needing a Storybook runtime.
|
|
27
|
+
export const SHIPPED_STORIES_SRC = resolve(SHIPPED_DIST, "_stories-src");
|
|
28
|
+
// Monorepo source (absent in an external install).
|
|
29
|
+
const REPO_ROOT = resolve(kitRoot, "../..");
|
|
30
|
+
const REPO_STORYBOOK = resolve(REPO_ROOT, "apps/storybook");
|
|
31
|
+
const REPO_BUILD_OUT = resolve(REPO_STORYBOOK, "storybook-static-muscat");
|
|
32
|
+
const REPO_MUSCAT_STORIES = resolve(REPO_STORYBOOK, "stories/4.muscat");
|
|
33
|
+
const REPO_DESIGN_TOKENS = resolve(
|
|
34
|
+
REPO_ROOT,
|
|
35
|
+
"packages/rb-styles/css/output/rb-token.css",
|
|
36
|
+
);
|
|
37
|
+
// Generated Tailwind v4 token file (@theme colors + @utility typo-*), staged so
|
|
38
|
+
// the `mcp` command's *_design_tokens tools work in an external install too.
|
|
39
|
+
export const SHIPPED_DESIGN_TOKENS = resolve(SHIPPED_DIST, "_design-tokens.css");
|
|
40
|
+
|
|
41
|
+
const CONTENT_TYPE = {
|
|
42
|
+
".html": "text/html; charset=utf-8",
|
|
43
|
+
".js": "text/javascript; charset=utf-8",
|
|
44
|
+
".mjs": "text/javascript; charset=utf-8",
|
|
45
|
+
".css": "text/css; charset=utf-8",
|
|
46
|
+
".json": "application/json; charset=utf-8",
|
|
47
|
+
".map": "application/json; charset=utf-8",
|
|
48
|
+
".svg": "image/svg+xml",
|
|
49
|
+
".png": "image/png",
|
|
50
|
+
".jpg": "image/jpeg",
|
|
51
|
+
".jpeg": "image/jpeg",
|
|
52
|
+
".webp": "image/webp",
|
|
53
|
+
".gif": "image/gif",
|
|
54
|
+
".ico": "image/x-icon",
|
|
55
|
+
".woff": "font/woff",
|
|
56
|
+
".woff2": "font/woff2",
|
|
57
|
+
".ttf": "font/ttf",
|
|
58
|
+
".wasm": "application/wasm",
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// Build apps/storybook (muscat subset) and stage it into cli/storybook-dist.
|
|
62
|
+
// Monorepo only. Outside the monorepo (e.g. re-packing an already-published
|
|
63
|
+
// copy) it's a no-op — the shipped cli/storybook-dist is already in place.
|
|
64
|
+
export function buildStorybook() {
|
|
65
|
+
if (!existsSync(REPO_STORYBOOK)) {
|
|
66
|
+
log.info("apps/storybook not found — using the pre-staged storybook-dist.");
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
log.step("building Storybook (foundations + muscat)…");
|
|
70
|
+
execSync("yarn workspace storybook storybook:build:muscat", {
|
|
71
|
+
cwd: REPO_ROOT,
|
|
72
|
+
stdio: "inherit",
|
|
73
|
+
env: { ...process.env, MUSCAT_STORYBOOK: "true" },
|
|
74
|
+
});
|
|
75
|
+
rmSync(SHIPPED_DIST, { recursive: true, force: true });
|
|
76
|
+
mkdirSync(SHIPPED_DIST, { recursive: true });
|
|
77
|
+
cpSync(REPO_BUILD_OUT, SHIPPED_DIST, { recursive: true });
|
|
78
|
+
|
|
79
|
+
// Stage raw .stories.tsx sources (not just the compiled JS bundle) for the
|
|
80
|
+
// `mcp` command's get_component_example tool.
|
|
81
|
+
if (existsSync(REPO_MUSCAT_STORIES)) {
|
|
82
|
+
cpSync(REPO_MUSCAT_STORIES, SHIPPED_STORIES_SRC, {
|
|
83
|
+
recursive: true,
|
|
84
|
+
filter: (src) => statSync(src).isDirectory() || src.endsWith(".stories.tsx"),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Stage the design-token CSS for the `mcp` command's *_design_tokens tools.
|
|
89
|
+
if (existsSync(REPO_DESIGN_TOKENS)) {
|
|
90
|
+
copyFileSync(REPO_DESIGN_TOKENS, SHIPPED_DESIGN_TOKENS);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
log.ok(`storybook → ${SHIPPED_DIST}`);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function serve(distDir, port) {
|
|
97
|
+
const server = createServer((req, res) => {
|
|
98
|
+
const url = decodeURIComponent((req.url || "/").split("?")[0]);
|
|
99
|
+
const rel = url === "/" ? "/index.html" : url;
|
|
100
|
+
const filePath = resolve(distDir, `.${rel}`);
|
|
101
|
+
|
|
102
|
+
// Serve the file if it's inside distDir and exists; otherwise fall back to
|
|
103
|
+
// index.html (Storybook is a single-page app).
|
|
104
|
+
if (
|
|
105
|
+
filePath.startsWith(distDir) &&
|
|
106
|
+
existsSync(filePath) &&
|
|
107
|
+
statSync(filePath).isFile()
|
|
108
|
+
) {
|
|
109
|
+
const type = CONTENT_TYPE[extname(filePath)];
|
|
110
|
+
if (type) res.setHeader("Content-Type", type);
|
|
111
|
+
res.setHeader("Access-Control-Allow-Origin", "*");
|
|
112
|
+
createReadStream(filePath).pipe(res);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
116
|
+
createReadStream(join(distDir, "index.html")).pipe(res);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
server.on("error", (err) => {
|
|
120
|
+
if (err.code === "EADDRINUSE") {
|
|
121
|
+
log.error(`port ${port} is in use — pass a free one with --port <n>.`);
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
throw err;
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
server.listen(port, () => {
|
|
128
|
+
const url = `http://localhost:${port}`;
|
|
129
|
+
log.ok(`Storybook → ${url}`);
|
|
130
|
+
openBrowser(url);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export async function runStorybook(args = []) {
|
|
135
|
+
const { port = "6007", rebuild } = parseArgs(args, { booleans: ["rebuild"] });
|
|
136
|
+
|
|
137
|
+
const staged = existsSync(join(SHIPPED_DIST, "index.html"));
|
|
138
|
+
if (rebuild || !staged) {
|
|
139
|
+
if (existsSync(REPO_STORYBOOK)) {
|
|
140
|
+
buildStorybook();
|
|
141
|
+
} else if (!staged) {
|
|
142
|
+
throw new Error(
|
|
143
|
+
`Storybook build not found at ${SHIPPED_DIST}.\n` +
|
|
144
|
+
" This build of muscat-pk was published without the bundled Storybook.",
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
serve(SHIPPED_DIST, Number(port));
|
|
150
|
+
}
|