@rainbow-robotics/muscat-plugin-kit 1.10.1-dev.1 → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +282 -282
- package/cli/README.md +274 -274
- package/cli/bin/create-muscat-plugin.mjs +8 -8
- package/cli/bin/muscat-pk.mjs +155 -155
- package/cli/bundle-templates.mjs +31 -31
- package/cli/docker/Dockerfile.cpp +28 -28
- package/cli/docker/Dockerfile.dev +30 -30
- package/cli/docker/Dockerfile.python +21 -21
- package/cli/m5-e2e.mjs +69 -69
- package/cli/prepack.mjs +10 -10
- package/cli/src/ai-rules.mjs +70 -70
- package/cli/src/build.mjs +447 -447
- package/cli/src/check-package.mjs +13 -13
- package/cli/src/completion.mjs +166 -166
- package/cli/src/cpp.mjs +78 -78
- package/cli/src/cppIde.mjs +75 -75
- package/cli/src/dev.mjs +165 -165
- package/cli/src/devBack.mjs +734 -727
- package/cli/src/devUi.mjs +247 -243
- package/cli/src/esbuild.mjs +56 -56
- package/cli/src/host_agent.py +223 -223
- package/cli/src/manifest.mjs +287 -287
- package/cli/src/mcp.mjs +1071 -1071
- package/cli/src/muscatLocal.mjs +209 -209
- package/cli/src/new.mjs +343 -343
- package/cli/src/pluginDevServer.mjs +111 -111
- package/cli/src/ports.mjs +193 -193
- package/cli/src/python.mjs +112 -112
- package/cli/src/ros2.mjs +109 -109
- package/cli/src/sdk.mjs +117 -117
- package/cli/src/storybook.mjs +168 -168
- package/cli/src/type.mjs +141 -141
- package/cli/src/uninstall.mjs +81 -81
- package/cli/src/update.mjs +295 -295
- package/cli/src/util.mjs +441 -441
- package/cli/src/zenohDev.mjs +83 -81
- package/cli/storybook-dist/_design-tokens.css +4957 -4957
- package/cli/storybook-dist/_stories-src/NxAvatar.stories.tsx +27 -27
- package/cli/storybook-dist/_stories-src/NxPagination.stories.tsx +28 -28
- package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordion.stories.tsx +46 -46
- package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordionGroup.stories.tsx +73 -73
- package/cli/storybook-dist/_stories-src/RBBadge/RBBadge.stories.tsx +93 -93
- package/cli/storybook-dist/_stories-src/RBBattery/RBBattery.stories.tsx +74 -74
- package/cli/storybook-dist/_stories-src/RBButton/RBCheckIconButton.stories.tsx +28 -28
- package/cli/storybook-dist/_stories-src/RBButton/RBCheckLabelButton.stories.tsx +84 -84
- package/cli/storybook-dist/_stories-src/RBButton/RBIconButton.stories.tsx +57 -57
- package/cli/storybook-dist/_stories-src/RBButton/RBInlineLabelButton.stories.tsx +41 -41
- package/cli/storybook-dist/_stories-src/RBButton/RBLabelButton.stories.tsx +60 -60
- package/cli/storybook-dist/_stories-src/RBDatePicker/RBDateInput.stories.tsx +44 -44
- package/cli/storybook-dist/_stories-src/RBDatePicker/RBRangeDateInput.stories.tsx +56 -56
- package/cli/storybook-dist/_stories-src/RBDialog/RBAlert.stories.tsx +51 -51
- package/cli/storybook-dist/_stories-src/RBDialog/RBConfirm.stories.tsx +55 -55
- package/cli/storybook-dist/_stories-src/RBDialog/RBPrompt.stories.tsx +52 -52
- package/cli/storybook-dist/_stories-src/RBDivider/RBDivider.stories.tsx +93 -93
- package/cli/storybook-dist/_stories-src/RBEmptyView/RBEmptyView.stories.tsx +49 -49
- package/cli/storybook-dist/_stories-src/RBIcons/RBColorIcons.stories.tsx +108 -108
- package/cli/storybook-dist/_stories-src/RBIcons/RBIcons.stories.tsx +106 -106
- package/cli/storybook-dist/_stories-src/RBInput/RBCheckBox.stories.tsx +89 -89
- package/cli/storybook-dist/_stories-src/RBInput/RBMultiRangeInput.stories.tsx +64 -64
- package/cli/storybook-dist/_stories-src/RBInput/RBRadioBox.stories.tsx +65 -65
- package/cli/storybook-dist/_stories-src/RBInput/RBRadioButton.stories.tsx +68 -68
- package/cli/storybook-dist/_stories-src/RBInput/RBSelectBox.stories.tsx +216 -216
- package/cli/storybook-dist/_stories-src/RBInput/RBSideNumberInput.stories.tsx +90 -90
- package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextArea.stories.tsx +45 -45
- package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextInput.stories.tsx +50 -50
- package/cli/storybook-dist/_stories-src/RBInput/RBTextField.stories.tsx +102 -102
- package/cli/storybook-dist/_stories-src/RBJoyStick/RBJoyStick.stories.tsx +31 -31
- package/cli/storybook-dist/_stories-src/RBLight/RBLight.stories.tsx +36 -36
- package/cli/storybook-dist/_stories-src/RBPagination/RBPagination.stories.tsx +49 -49
- package/cli/storybook-dist/_stories-src/RBShadcn/RBCard/RBCard.stories.tsx +89 -89
- package/cli/storybook-dist/_stories-src/RBShadcn/RBCommand/RBCommand.stories.tsx +116 -116
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDialog/RBDialog.stories.tsx +74 -74
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDrawer/RBDrawer.stories.tsx +99 -99
- package/cli/storybook-dist/_stories-src/RBShadcn/RBDropdownMenu/RBDropdownMenu.stories.tsx +123 -123
- package/cli/storybook-dist/_stories-src/RBShadcn/RBMenubar/RBMenubar.stories.tsx +135 -135
- package/cli/storybook-dist/_stories-src/RBShadcn/RBPopover/RBPopover.stories.tsx +69 -69
- package/cli/storybook-dist/_stories-src/RBShadcn/RBResizable/RBResizable.stories.tsx +49 -49
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSheet/RBSheet.stories.tsx +91 -91
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSlider/RBSlider.stories.tsx +38 -38
- package/cli/storybook-dist/_stories-src/RBShadcn/RBSwitch/RBSwitch.stories.tsx +112 -112
- package/cli/storybook-dist/_stories-src/RBShadcn/RBTabs/RBTabs.stories.tsx +75 -75
- package/cli/storybook-dist/_stories-src/RBShadcn/RBToggle/RBToggle.stories.tsx +51 -51
- package/cli/storybook-dist/_stories-src/RBShadcn/RBToggleGroup/RBToggleGroup.stories.tsx +84 -84
- package/cli/storybook-dist/_stories-src/RBTab/RBChipTab.stories.tsx +102 -102
- package/cli/storybook-dist/_stories-src/RBTab/RBChipsBoxTab.stories.tsx +78 -78
- package/cli/storybook-dist/_stories-src/RBTab/RBTab.stories.tsx +57 -57
- package/cli/storybook-dist/_stories-src/RBTable/RBTable.stories.tsx +177 -177
- package/cli/storybook-dist/_stories-src/RBTable/RBTableRow.stories.tsx +64 -64
- package/cli/storybook-dist/_stories-src/RBToast/RBToast.stories.tsx +117 -117
- package/cli/storybook-dist/_stories-src/RBTooltip/RBTooltip.stories.tsx +50 -50
- package/cli/storybook-dist/_stories-src/loading/RBSpinner.stories.tsx +30 -30
- package/cli/storybook-dist/_stories-src/nx-button/NxButton.stories.tsx +54 -54
- package/cli/storybook-dist/_stories-src/nx-button/NxPointerHoldButton.stories.tsx +57 -57
- package/cli/storybook-dist/_stories-src/nx-icons/NxIcons.stories.tsx +48 -48
- package/cli/storybook-dist/_stories-src/nx-inputs/NxNumberInput.stories.tsx +103 -103
- package/cli/storybook-dist/_stories-src/nx-inputs/NxRangeInput.stories.tsx +27 -27
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSelectBox.stories.tsx +67 -67
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSlideRange.stories.tsx +45 -45
- package/cli/storybook-dist/_stories-src/nx-inputs/NxSwitch.stories.tsx +27 -27
- package/cli/storybook-dist/_stories-src/nx-inputs/NxTextArea.stories.tsx +48 -48
- package/cli/storybook-dist/_stories-src/nx-inputs/NxTextInput.stories.tsx +46 -46
- package/cli/storybook-dist/assets/{Color-YHDXOIA2-D6JqZzDJ.js → Color-YHDXOIA2-B4IER17l.js} +1 -1
- package/cli/storybook-dist/assets/{Docs-ESb7JAHg.js → Docs-C8GCHFtK.js} +3 -3
- package/cli/storybook-dist/assets/{Docs-6gD2kUo1.js → Docs-CgdEMPQP.js} +2 -2
- package/cli/storybook-dist/assets/{Docs-B9wd8Ok7.js → Docs-Ck3WHvk6.js} +3 -3
- package/cli/storybook-dist/assets/{Docs-CgFbWWXM.js → Docs-D9NHsoeZ.js} +2 -2
- package/cli/storybook-dist/assets/{Docs-DBQup8Bu.js → Docs-DNYQC7nl.js} +3 -3
- package/cli/storybook-dist/assets/{Docs-CMjovnSY.js → Docs-DUfeiM4I.js} +4 -4
- package/cli/storybook-dist/assets/{DocsRenderer-CFRXHY34-BOUI1AHi.js → DocsRenderer-CFRXHY34-C0WhyDoR.js} +1 -1
- package/cli/storybook-dist/assets/{NxAvatar.stories-DsYFMUh3.js → NxAvatar.stories-CwnK8AUF.js} +1 -1
- package/cli/storybook-dist/assets/{NxButton.stories-CHfNcqsc.js → NxButton.stories-ueYdosfQ.js} +8 -8
- package/cli/storybook-dist/assets/{NxNumberInput.stories-BFw_4vFE.js → NxNumberInput.stories-M5ZCLbrK.js} +1 -1
- package/cli/storybook-dist/assets/{NxPagination.stories-DVfxyw4M.js → NxPagination.stories-bxxUnHEL.js} +1 -1
- package/cli/storybook-dist/assets/{NxPointerHoldButton.stories-BzyxUWoZ.js → NxPointerHoldButton.stories-BHxB2kr5.js} +1 -1
- package/cli/storybook-dist/assets/{NxRangeInput.stories-DmRdzBc1.js → NxRangeInput.stories-BKfr-fp4.js} +6 -6
- package/cli/storybook-dist/assets/{NxSelectBox.stories-B1KkNUOf.js → NxSelectBox.stories-CG8FuTBq.js} +1 -1
- package/cli/storybook-dist/assets/{NxSlideRange.stories-CyOdvfQ6.js → NxSlideRange.stories-BRTFtMTL.js} +1 -1
- package/cli/storybook-dist/assets/{NxSwitch.stories-DrDBw0qp.js → NxSwitch.stories-Bwuyzn-R.js} +1 -1
- package/cli/storybook-dist/assets/{NxTextArea.stories-DTB2aqNS.js → NxTextArea.stories-COq2sGqu.js} +1 -1
- package/cli/storybook-dist/assets/{NxTextInput.stories-DU0rucmM.js → NxTextInput.stories-CjsBLz05.js} +1 -1
- package/cli/storybook-dist/assets/{RBAccordion.stories-DTfOtXtp.js → RBAccordion.stories-BARwuZ0Q.js} +3 -3
- package/cli/storybook-dist/assets/{RBAccordionGroup.stories-9y9BjrUe.js → RBAccordionGroup.stories-COrPxETW.js} +10 -10
- package/cli/storybook-dist/assets/{RBAlert.stories-DLTAv9fT.js → RBAlert.stories-BQrkjZPt.js} +3 -3
- package/cli/storybook-dist/assets/{RBBadge.stories-BNMACewA.js → RBBadge.stories-BTsLL-lK.js} +1 -1
- package/cli/storybook-dist/assets/{RBBattery.stories-B3kXMAt5.js → RBBattery.stories-DAeQdJbc.js} +1 -1
- package/cli/storybook-dist/assets/{RBCard.stories-Y-s8R2n7.js → RBCard.stories-HyhOE80R.js} +39 -39
- package/cli/storybook-dist/assets/{RBCheckBox.stories-DBuT9tL4.js → RBCheckBox.stories-KFk0WqX_.js} +1 -1
- package/cli/storybook-dist/assets/{RBCheckIconButton.stories-CWu1TL56.js → RBCheckIconButton.stories-CXbbktF5.js} +1 -1
- package/cli/storybook-dist/assets/{RBCheckLabelButton.stories-sCu2MGCX.js → RBCheckLabelButton.stories-DWfYz_9Z.js} +17 -17
- package/cli/storybook-dist/assets/{RBChipTab.stories-BX9qLJkR.js → RBChipTab.stories-JPEgVFAS.js} +5 -5
- package/cli/storybook-dist/assets/{RBChipsBoxTab.stories-35u1aJ-P.js → RBChipsBoxTab.stories-CTPuWXrQ.js} +1 -1
- package/cli/storybook-dist/assets/{RBColorIcons.stories-DAOZ5Ies.js → RBColorIcons.stories-DiFRZ5jk.js} +1 -1
- package/cli/storybook-dist/assets/RBCommand.stories-Pf1HAVIR.js +73 -0
- package/cli/storybook-dist/assets/{RBConfirm.stories-iMXcUh7Z.js → RBConfirm.stories-D1cEPUXk.js} +3 -3
- package/cli/storybook-dist/assets/{RBDateInput.stories-hK5rXECf.js → RBDateInput.stories-RPYpCjig.js} +1 -1
- package/cli/storybook-dist/assets/RBDialog.stories-DJH-0XSR.js +38 -0
- package/cli/storybook-dist/assets/{RBDivider.stories-BAK-iZ1Z.js → RBDivider.stories-uEj1vOgK.js} +1 -1
- package/cli/storybook-dist/assets/{RBDrawer.stories-B2nqf2Nh.js → RBDrawer.stories-BiMzElb2.js} +12 -12
- package/cli/storybook-dist/assets/RBDropdownMenu.stories-Da_TBkla.js +86 -0
- package/cli/storybook-dist/assets/{RBEmptyView.stories-nCenrgBh.js → RBEmptyView.stories-BHeKGfPS.js} +1 -1
- package/cli/storybook-dist/assets/{RBIconButton.stories-DRH7O3sp.js → RBIconButton.stories-NEsRFoYp.js} +1 -1
- package/cli/storybook-dist/assets/{RBIcons.stories-D3PyJXG8.js → RBIcons.stories-CcZ-TTLS.js} +1 -1
- package/cli/storybook-dist/assets/{RBInlineLabelButton.stories-modQbt10.js → RBInlineLabelButton.stories-B0wpdQyR.js} +1 -1
- package/cli/storybook-dist/assets/{RBJoyStick.stories-BY14qVgR.js → RBJoyStick.stories-DEgBou3K.js} +1 -1
- package/cli/storybook-dist/assets/{RBLabelButton.stories-DzF7vGwm.js → RBLabelButton.stories-DT8drIsF.js} +1 -1
- package/cli/storybook-dist/assets/{RBLight.stories-lF4FRmVh.js → RBLight.stories-Dh-aoeyG.js} +1 -1
- package/cli/storybook-dist/assets/{RBMenubar.stories-XhrI7bsV.js → RBMenubar.stories-D-H7UqVh.js} +1 -1
- package/cli/storybook-dist/assets/{RBMultiRangeInput.stories-DprllQDl.js → RBMultiRangeInput.stories-hlclv6jI.js} +1 -1
- package/cli/storybook-dist/assets/{RBPagination.stories-2v2gBJfC.js → RBPagination.stories-DWCeoZ_S.js} +1 -1
- package/cli/storybook-dist/assets/{RBPopover.stories-C8iLIZpv.js → RBPopover.stories-C514M09_.js} +1 -1
- package/cli/storybook-dist/assets/{RBPrompt.stories-Th_HrWHI.js → RBPrompt.stories-BSItvfiT.js} +1 -1
- package/cli/storybook-dist/assets/{RBRadioBox.stories-CoHuLaN3.js → RBRadioBox.stories-BBb4YbFU.js} +1 -1
- package/cli/storybook-dist/assets/{RBRadioButton.stories-DULxE_ff.js → RBRadioButton.stories-CXyOGJCv.js} +1 -1
- package/cli/storybook-dist/assets/{RBRangeDateInput.stories-D8A9KBSS.js → RBRangeDateInput.stories-qvhubu0e.js} +1 -1
- package/cli/storybook-dist/assets/{RBResizable.stories-C41QfrQ3.js → RBResizable.stories-CZKeyGjH.js} +14 -14
- package/cli/storybook-dist/assets/{RBSelectBox.stories-C1gNmwzw.js → RBSelectBox.stories-CRKP3ybf.js} +1 -1
- package/cli/storybook-dist/assets/RBSheet.stories-sCM3ZJUa.js +39 -0
- package/cli/storybook-dist/assets/{RBSideNumberInput.stories-9LlgQ8nh.js → RBSideNumberInput.stories-Bb7gw8RF.js} +3 -3
- package/cli/storybook-dist/assets/{RBSlider.stories-oUgo5K9d.js → RBSlider.stories-23OAQU5z.js} +3 -3
- package/cli/storybook-dist/assets/{RBSpinner.stories-DDpohbY2.js → RBSpinner.stories-2xcQdcmt.js} +1 -1
- package/cli/storybook-dist/assets/{RBSwitch.stories-gW-GN7QO.js → RBSwitch.stories-BACUaJm_.js} +7 -7
- package/cli/storybook-dist/assets/{RBTab.stories-CN-PV3HH.js → RBTab.stories-CDHE3sVs.js} +1 -1
- package/cli/storybook-dist/assets/{RBTable.stories-BAZLpxtM.js → RBTable.stories-C0Cfhfl7.js} +29 -29
- package/cli/storybook-dist/assets/{RBTableRow.stories-CwjVrszB.js → RBTableRow.stories-BF8kIkpp.js} +1 -1
- package/cli/storybook-dist/assets/{RBTabs.stories-JuEo2sUL.js → RBTabs.stories-BdJWRq1o.js} +7 -7
- package/cli/storybook-dist/assets/{RBTextArea.stories-D0_Pv4qZ.js → RBTextArea.stories-CGy2xeYH.js} +3 -3
- package/cli/storybook-dist/assets/{RBTextField.stories-CCsOvZqV.js → RBTextField.stories-IfUOzxCM.js} +15 -15
- package/cli/storybook-dist/assets/{RBTextInput.stories-Cccn3VNm.js → RBTextInput.stories-VjXNFo4R.js} +3 -3
- package/cli/storybook-dist/assets/{RBToast.stories-I5617t0K.js → RBToast.stories-BzcobblV.js} +1 -1
- package/cli/storybook-dist/assets/{RBToggle.stories-DsgKjGsJ.js → RBToggle.stories-DuLE5mKv.js} +4 -4
- package/cli/storybook-dist/assets/{RBToggleGroup.stories-BZEzSDuz.js → RBToggleGroup.stories-CuR0N0GJ.js} +5 -5
- package/cli/storybook-dist/assets/{RBTooltip.stories-4oSyAWsA.js → RBTooltip.stories--aAgNC8_.js} +1 -1
- package/cli/storybook-dist/assets/{SideNumberInput-DSKbd0bG.js → SideNumberInput-DyWQxYUj.js} +743 -743
- package/cli/storybook-dist/assets/{entry-preview-B35XREGs.js → entry-preview-D7IHsza_.js} +1 -1
- package/cli/storybook-dist/assets/{iframe-BB797lmL.js → iframe-CbaIp5I-.js} +2 -2
- package/cli/storybook-dist/assets/{index-BU2567EP.js → index-C6CBgMuG.js} +3 -3
- package/cli/storybook-dist/assets/{preview-C7DaSWyc.js → preview-B-iYLDuW.js} +2 -2
- package/cli/storybook-dist/assets/{preview-CbuRHit4.js → preview-CRWqc9DH.js} +1 -1
- package/cli/storybook-dist/assets/{react-resizable-panels.browser-ChIvlwo7.js → react-resizable-panels.browser-8hC8dr-6.js} +8 -8
- package/cli/storybook-dist/iframe.html +2 -2
- package/cli/storybook-dist/index.html +1 -1
- package/cli/storybook-dist/project.json +1 -1
- package/cli/templates/common/.mcp.json +8 -8
- package/cli/templates/common/README.md +1231 -1231
- package/cli/templates/common/assets/icon.svg +45 -45
- package/cli/templates/common/manifest.json +26 -26
- package/cli/templates/common/package.json +22 -22
- package/cli/templates/common/py/main.py +125 -125
- package/cli/templates/common/tsconfig.json +13 -13
- package/cli/templates/common/ui/content.tsx +216 -216
- package/cli/templates/common/ui/style.css +6 -6
- package/cli/templates/common/vite.config.ts +10 -10
- package/cli/templates/cpp/cpp/main.cpp +73 -73
- package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/node.py +25 -25
- package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/package.xml +10 -10
- package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/setup.py +18 -18
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/package.xml +11 -11
- package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/src/node.cpp +23 -23
- package/cli/vite.d.mts +25 -25
- package/cli/vite.mjs +292 -292
- package/package.json +3 -3
- package/cli/storybook-dist/assets/RBCommand.stories-BSqXDkKw.js +0 -73
- package/cli/storybook-dist/assets/RBDialog.stories-BAktz-ku.js +0 -38
- package/cli/storybook-dist/assets/RBDropdownMenu.stories-DbW2fWAj.js +0 -86
- package/cli/storybook-dist/assets/RBSheet.stories-_6VH-RUm.js +0 -39
package/cli/bin/muscat-pk.mjs
CHANGED
|
@@ -1,155 +1,155 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// muscat-pk — Muscat plugin developer CLI.
|
|
3
|
-
// Subcommands: new, build, dev, dev:ui, dev:back, storybook, mcp, update, uninstall, sdk, version.
|
|
4
|
-
import { readFileSync, realpathSync } from "node:fs";
|
|
5
|
-
import { resolve } from "node:path";
|
|
6
|
-
import { fileURLToPath } from "node:url";
|
|
7
|
-
import { spawnSync } from "node:child_process";
|
|
8
|
-
import { color, kitVersion, log, resolveLocalCliBin } from "../src/util.mjs";
|
|
9
|
-
import { runNew } from "../src/new.mjs";
|
|
10
|
-
import { runBuild } from "../src/build.mjs";
|
|
11
|
-
import { runDevUi } from "../src/devUi.mjs";
|
|
12
|
-
import { runDevBack } from "../src/devBack.mjs";
|
|
13
|
-
import { runDev } from "../src/dev.mjs";
|
|
14
|
-
import { runUpdate } from "../src/update.mjs";
|
|
15
|
-
import { runUninstall } from "../src/uninstall.mjs";
|
|
16
|
-
import { runSdk } from "../src/sdk.mjs";
|
|
17
|
-
import { runType } from "../src/type.mjs";
|
|
18
|
-
import { runStorybook } from "../src/storybook.mjs";
|
|
19
|
-
import { runCompletion } from "../src/completion.mjs";
|
|
20
|
-
// mcp.mjs is dynamically imported below — it pulls in the MCP SDK + a full
|
|
21
|
-
// TypeScript program, and every other command would pay that cold-start cost
|
|
22
|
-
// on every invocation otherwise (see ros2.mjs/python.mjs/cpp.mjs for the same
|
|
23
|
-
// pattern in build.mjs).
|
|
24
|
-
|
|
25
|
-
// 실행 중인 게 글로벌/바이너리인데 cwd 상위에 로컬 설치가 있으면 그쪽으로 넘긴다.
|
|
26
|
-
// vite preset / preview-host / manifest 검증이 항상 프로젝트가 고정한 버전과
|
|
27
|
-
// 맞아야 해서다 (버전이 안 맞으면 "module not found" 류 에러로 터진다).
|
|
28
|
-
function readVersion(binPath) {
|
|
29
|
-
try {
|
|
30
|
-
return JSON.parse(readFileSync(resolve(binPath, "../../../package.json"), "utf8")).version;
|
|
31
|
-
} catch {
|
|
32
|
-
return "";
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const isBinaryMode = typeof Bun !== "undefined";
|
|
37
|
-
|
|
38
|
-
// 바이너리에는 package.json 이 없다 — 컴파일 시 임베드한 버전을 쓴다.
|
|
39
|
-
if (isBinaryMode && !process.env.MUSCAT_PK_VERSION) {
|
|
40
|
-
process.env.MUSCAT_PK_VERSION = (await import("../src/templates-embedded.mjs")).KIT_VERSION;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
(function delegateToLocalInstall() {
|
|
44
|
-
try {
|
|
45
|
-
const localBin = resolveLocalCliBin();
|
|
46
|
-
if (!localBin) return;
|
|
47
|
-
// 바이너리는 node_modules 안의 mjs일 수 없으니 자기 자신 비교 생략.
|
|
48
|
-
// (import.meta.url이 /$bunfs/ 가상 경로라 realpath가 throw하기도 한다.)
|
|
49
|
-
if (!isBinaryMode && realpathSync(localBin) === realpathSync(fileURLToPath(import.meta.url))) return;
|
|
50
|
-
// Say so — otherwise an outdated local copy silently answers instead, and
|
|
51
|
-
// its missing/renamed subcommands look like the CLI is broken.
|
|
52
|
-
const localVersion = readVersion(localBin);
|
|
53
|
-
console.error(
|
|
54
|
-
color.dim(`[muscat-pk] using this project's local install${localVersion ? ` (v${localVersion})` : ""}: ${localBin}`),
|
|
55
|
-
);
|
|
56
|
-
// Bun 바이너리의 execPath는 스크립트 인자를 실행하지 않으니 PATH의 node로 넘긴다.
|
|
57
|
-
const runtime = isBinaryMode ? "node" : process.execPath;
|
|
58
|
-
const r = spawnSync(runtime, [localBin, ...process.argv.slice(2)], { stdio: "inherit" });
|
|
59
|
-
if (r.error) {
|
|
60
|
-
log.warn(`Failed to run local install via ${runtime} (${r.error.code}); continuing with this binary.`);
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
process.exit(r.status ?? 0);
|
|
64
|
-
} catch {
|
|
65
|
-
// realpath 실패 등 — 그냥 지금 프로세스로 계속.
|
|
66
|
-
}
|
|
67
|
-
})();
|
|
68
|
-
|
|
69
|
-
const [, , cmd, ...args] = process.argv;
|
|
70
|
-
|
|
71
|
-
const commandRow = (command, description) => ` ${color.cyan(command.padEnd(30))}${description}`;
|
|
72
|
-
const option = (text) => color.yellow(text);
|
|
73
|
-
|
|
74
|
-
function formatHelp() {
|
|
75
|
-
return [
|
|
76
|
-
`${color.bold("muscat-pk")} ${color.dim("— Muscat plugin kit")}`,
|
|
77
|
-
"",
|
|
78
|
-
`${color.bold("Usage:")} ${color.cyan("muscat-pk")} ${color.yellow("<command>")} ${color.dim("[options]")}`,
|
|
79
|
-
"",
|
|
80
|
-
color.bold("Commands:"),
|
|
81
|
-
commandRow("new [dir]", `Scaffold a new plugin project ${color.dim("(prompts: author, email, description, type, front-package-manager)")}`),
|
|
82
|
-
commandRow("type change", `Switch backend type ${color.dim("(python | cpp | ros2-python | ros2-cpp)")}`),
|
|
83
|
-
commandRow("build", `Build + lock deps + vendor wheels + zip ${color.dim(`(${option("--no-zip")}: skip zip, ${option("--no-lock")}: skip python lock/vendor, ${option("--arch")} amd64|arm64|both)`)}`),
|
|
84
|
-
commandRow("dev", "Run a local Muscat runtime, dev:ui, and dev:back together"),
|
|
85
|
-
commandRow("dev:ui", `Preview the plugin in a mini-Muscat ${color.dim("(preview-host)")}`),
|
|
86
|
-
commandRow("dev:back", `Run the plugin back end ${color.dim("(python: watchfiles reload / ros2: Docker)")}`),
|
|
87
|
-
commandRow("storybook", `Browse the bundled rb-components Storybook ${color.dim(`(${option("--port")} <n>, ${option("--rebuild")})`)}`),
|
|
88
|
-
commandRow("mcp", `Start an MCP server ${color.dim("(stdio)")} exposing rb-components/rb SDK docs to AI agents ${color.dim(`(${option("--install")} codex: register in ~/.codex/config.toml)`)}`),
|
|
89
|
-
commandRow("update", `Update ${color.magenta("@rainbow-robotics/muscat-plugin-kit")} and ${color.magenta("@rainbow-robotics/plugin-ui")} ${color.dim(`(local-only if run from a project's local install; ${option("--global")} also updates the global CLI)`)}`),
|
|
90
|
-
commandRow("uninstall", `Remove the installed ${color.cyan("muscat-pk")} CLI ${color.dim("(npm global or S3 binary)")}`),
|
|
91
|
-
commandRow("sdk <list|update [version]>", "Manage the python rainbow-rb-sdk version"),
|
|
92
|
-
commandRow("version", `Print the installed ${color.cyan("muscat-pk")} version`),
|
|
93
|
-
commandRow("completion [shell]", `Print a shell completion script ${color.dim("(bash | zsh | fish | powershell)")}`),
|
|
94
|
-
"",
|
|
95
|
-
`Run ${color.cyan("muscat-pk <command> --help")} for details.`,
|
|
96
|
-
].join("\n");
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
async function main() {
|
|
100
|
-
try {
|
|
101
|
-
switch (cmd) {
|
|
102
|
-
case "new":
|
|
103
|
-
return await runNew(args);
|
|
104
|
-
case "type":
|
|
105
|
-
return await runType(args);
|
|
106
|
-
case "build":
|
|
107
|
-
return await runBuild(args);
|
|
108
|
-
case "dev":
|
|
109
|
-
return await runDev(args);
|
|
110
|
-
case "dev:ui":
|
|
111
|
-
return await runDevUi(args);
|
|
112
|
-
case "dev:back":
|
|
113
|
-
return await runDevBack(args);
|
|
114
|
-
case "storybook":
|
|
115
|
-
return await runStorybook(args);
|
|
116
|
-
case "mcp": {
|
|
117
|
-
const { runMcp, installMcp } = await import("../src/mcp.mjs");
|
|
118
|
-
if (args[0] === "--install" || args[0] === "install")
|
|
119
|
-
return installMcp(args[1]);
|
|
120
|
-
return await runMcp(args);
|
|
121
|
-
}
|
|
122
|
-
case "update":
|
|
123
|
-
return await runUpdate(args);
|
|
124
|
-
case "uninstall":
|
|
125
|
-
return await runUninstall(args);
|
|
126
|
-
case "sdk":
|
|
127
|
-
return await runSdk(args);
|
|
128
|
-
case "completion":
|
|
129
|
-
return await runCompletion(args);
|
|
130
|
-
case "version":
|
|
131
|
-
case "-v":
|
|
132
|
-
case "--version":
|
|
133
|
-
console.log(kitVersion());
|
|
134
|
-
return;
|
|
135
|
-
case undefined:
|
|
136
|
-
case "-h":
|
|
137
|
-
case "--help":
|
|
138
|
-
case "help":
|
|
139
|
-
console.log(formatHelp());
|
|
140
|
-
return;
|
|
141
|
-
default:
|
|
142
|
-
console.error(`Unknown command: ${cmd}\n`);
|
|
143
|
-
console.log(formatHelp());
|
|
144
|
-
process.exitCode = 1;
|
|
145
|
-
}
|
|
146
|
-
} catch (err) {
|
|
147
|
-
console.error();
|
|
148
|
-
log.error(err?.message || String(err));
|
|
149
|
-
// exit, not exitCode: a failed dev:ui (e.g. Ctrl+C before vite was ready) leaves file watchers that
|
|
150
|
-
// would keep the process hanging.
|
|
151
|
-
process.exit(1);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
main();
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// muscat-pk — Muscat plugin developer CLI.
|
|
3
|
+
// Subcommands: new, build, dev, dev:ui, dev:back, storybook, mcp, update, uninstall, sdk, version.
|
|
4
|
+
import { readFileSync, realpathSync } from "node:fs";
|
|
5
|
+
import { resolve } from "node:path";
|
|
6
|
+
import { fileURLToPath } from "node:url";
|
|
7
|
+
import { spawnSync } from "node:child_process";
|
|
8
|
+
import { color, kitVersion, log, resolveLocalCliBin } from "../src/util.mjs";
|
|
9
|
+
import { runNew } from "../src/new.mjs";
|
|
10
|
+
import { runBuild } from "../src/build.mjs";
|
|
11
|
+
import { runDevUi } from "../src/devUi.mjs";
|
|
12
|
+
import { runDevBack } from "../src/devBack.mjs";
|
|
13
|
+
import { runDev } from "../src/dev.mjs";
|
|
14
|
+
import { runUpdate } from "../src/update.mjs";
|
|
15
|
+
import { runUninstall } from "../src/uninstall.mjs";
|
|
16
|
+
import { runSdk } from "../src/sdk.mjs";
|
|
17
|
+
import { runType } from "../src/type.mjs";
|
|
18
|
+
import { runStorybook } from "../src/storybook.mjs";
|
|
19
|
+
import { runCompletion } from "../src/completion.mjs";
|
|
20
|
+
// mcp.mjs is dynamically imported below — it pulls in the MCP SDK + a full
|
|
21
|
+
// TypeScript program, and every other command would pay that cold-start cost
|
|
22
|
+
// on every invocation otherwise (see ros2.mjs/python.mjs/cpp.mjs for the same
|
|
23
|
+
// pattern in build.mjs).
|
|
24
|
+
|
|
25
|
+
// 실행 중인 게 글로벌/바이너리인데 cwd 상위에 로컬 설치가 있으면 그쪽으로 넘긴다.
|
|
26
|
+
// vite preset / preview-host / manifest 검증이 항상 프로젝트가 고정한 버전과
|
|
27
|
+
// 맞아야 해서다 (버전이 안 맞으면 "module not found" 류 에러로 터진다).
|
|
28
|
+
function readVersion(binPath) {
|
|
29
|
+
try {
|
|
30
|
+
return JSON.parse(readFileSync(resolve(binPath, "../../../package.json"), "utf8")).version;
|
|
31
|
+
} catch {
|
|
32
|
+
return "";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const isBinaryMode = typeof Bun !== "undefined";
|
|
37
|
+
|
|
38
|
+
// 바이너리에는 package.json 이 없다 — 컴파일 시 임베드한 버전을 쓴다.
|
|
39
|
+
if (isBinaryMode && !process.env.MUSCAT_PK_VERSION) {
|
|
40
|
+
process.env.MUSCAT_PK_VERSION = (await import("../src/templates-embedded.mjs")).KIT_VERSION;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
(function delegateToLocalInstall() {
|
|
44
|
+
try {
|
|
45
|
+
const localBin = resolveLocalCliBin();
|
|
46
|
+
if (!localBin) return;
|
|
47
|
+
// 바이너리는 node_modules 안의 mjs일 수 없으니 자기 자신 비교 생략.
|
|
48
|
+
// (import.meta.url이 /$bunfs/ 가상 경로라 realpath가 throw하기도 한다.)
|
|
49
|
+
if (!isBinaryMode && realpathSync(localBin) === realpathSync(fileURLToPath(import.meta.url))) return;
|
|
50
|
+
// Say so — otherwise an outdated local copy silently answers instead, and
|
|
51
|
+
// its missing/renamed subcommands look like the CLI is broken.
|
|
52
|
+
const localVersion = readVersion(localBin);
|
|
53
|
+
console.error(
|
|
54
|
+
color.dim(`[muscat-pk] using this project's local install${localVersion ? ` (v${localVersion})` : ""}: ${localBin}`),
|
|
55
|
+
);
|
|
56
|
+
// Bun 바이너리의 execPath는 스크립트 인자를 실행하지 않으니 PATH의 node로 넘긴다.
|
|
57
|
+
const runtime = isBinaryMode ? "node" : process.execPath;
|
|
58
|
+
const r = spawnSync(runtime, [localBin, ...process.argv.slice(2)], { stdio: "inherit" });
|
|
59
|
+
if (r.error) {
|
|
60
|
+
log.warn(`Failed to run local install via ${runtime} (${r.error.code}); continuing with this binary.`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
process.exit(r.status ?? 0);
|
|
64
|
+
} catch {
|
|
65
|
+
// realpath 실패 등 — 그냥 지금 프로세스로 계속.
|
|
66
|
+
}
|
|
67
|
+
})();
|
|
68
|
+
|
|
69
|
+
const [, , cmd, ...args] = process.argv;
|
|
70
|
+
|
|
71
|
+
const commandRow = (command, description) => ` ${color.cyan(command.padEnd(30))}${description}`;
|
|
72
|
+
const option = (text) => color.yellow(text);
|
|
73
|
+
|
|
74
|
+
function formatHelp() {
|
|
75
|
+
return [
|
|
76
|
+
`${color.bold("muscat-pk")} ${color.dim("— Muscat plugin kit")}`,
|
|
77
|
+
"",
|
|
78
|
+
`${color.bold("Usage:")} ${color.cyan("muscat-pk")} ${color.yellow("<command>")} ${color.dim("[options]")}`,
|
|
79
|
+
"",
|
|
80
|
+
color.bold("Commands:"),
|
|
81
|
+
commandRow("new [dir]", `Scaffold a new plugin project ${color.dim("(prompts: author, email, description, type, front-package-manager)")}`),
|
|
82
|
+
commandRow("type change", `Switch backend type ${color.dim("(python | cpp | ros2-python | ros2-cpp)")}`),
|
|
83
|
+
commandRow("build", `Build + lock deps + vendor wheels + zip ${color.dim(`(${option("--no-zip")}: skip zip, ${option("--no-lock")}: skip python lock/vendor, ${option("--arch")} amd64|arm64|both)`)}`),
|
|
84
|
+
commandRow("dev", "Run a local Muscat runtime, dev:ui, and dev:back together"),
|
|
85
|
+
commandRow("dev:ui", `Preview the plugin in a mini-Muscat ${color.dim("(preview-host)")}`),
|
|
86
|
+
commandRow("dev:back", `Run the plugin back end ${color.dim("(python: watchfiles reload / ros2: Docker)")}`),
|
|
87
|
+
commandRow("storybook", `Browse the bundled rb-components Storybook ${color.dim(`(${option("--port")} <n>, ${option("--rebuild")})`)}`),
|
|
88
|
+
commandRow("mcp", `Start an MCP server ${color.dim("(stdio)")} exposing rb-components/rb SDK docs to AI agents ${color.dim(`(${option("--install")} codex: register in ~/.codex/config.toml)`)}`),
|
|
89
|
+
commandRow("update", `Update ${color.magenta("@rainbow-robotics/muscat-plugin-kit")} and ${color.magenta("@rainbow-robotics/plugin-ui")} ${color.dim(`(local-only if run from a project's local install; ${option("--global")} also updates the global CLI)`)}`),
|
|
90
|
+
commandRow("uninstall", `Remove the installed ${color.cyan("muscat-pk")} CLI ${color.dim("(npm global or S3 binary)")}`),
|
|
91
|
+
commandRow("sdk <list|update [version]>", "Manage the python rainbow-rb-sdk version"),
|
|
92
|
+
commandRow("version", `Print the installed ${color.cyan("muscat-pk")} version`),
|
|
93
|
+
commandRow("completion [shell]", `Print a shell completion script ${color.dim("(bash | zsh | fish | powershell)")}`),
|
|
94
|
+
"",
|
|
95
|
+
`Run ${color.cyan("muscat-pk <command> --help")} for details.`,
|
|
96
|
+
].join("\n");
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
async function main() {
|
|
100
|
+
try {
|
|
101
|
+
switch (cmd) {
|
|
102
|
+
case "new":
|
|
103
|
+
return await runNew(args);
|
|
104
|
+
case "type":
|
|
105
|
+
return await runType(args);
|
|
106
|
+
case "build":
|
|
107
|
+
return await runBuild(args);
|
|
108
|
+
case "dev":
|
|
109
|
+
return await runDev(args);
|
|
110
|
+
case "dev:ui":
|
|
111
|
+
return await runDevUi(args);
|
|
112
|
+
case "dev:back":
|
|
113
|
+
return await runDevBack(args);
|
|
114
|
+
case "storybook":
|
|
115
|
+
return await runStorybook(args);
|
|
116
|
+
case "mcp": {
|
|
117
|
+
const { runMcp, installMcp } = await import("../src/mcp.mjs");
|
|
118
|
+
if (args[0] === "--install" || args[0] === "install")
|
|
119
|
+
return installMcp(args[1]);
|
|
120
|
+
return await runMcp(args);
|
|
121
|
+
}
|
|
122
|
+
case "update":
|
|
123
|
+
return await runUpdate(args);
|
|
124
|
+
case "uninstall":
|
|
125
|
+
return await runUninstall(args);
|
|
126
|
+
case "sdk":
|
|
127
|
+
return await runSdk(args);
|
|
128
|
+
case "completion":
|
|
129
|
+
return await runCompletion(args);
|
|
130
|
+
case "version":
|
|
131
|
+
case "-v":
|
|
132
|
+
case "--version":
|
|
133
|
+
console.log(kitVersion());
|
|
134
|
+
return;
|
|
135
|
+
case undefined:
|
|
136
|
+
case "-h":
|
|
137
|
+
case "--help":
|
|
138
|
+
case "help":
|
|
139
|
+
console.log(formatHelp());
|
|
140
|
+
return;
|
|
141
|
+
default:
|
|
142
|
+
console.error(`Unknown command: ${cmd}\n`);
|
|
143
|
+
console.log(formatHelp());
|
|
144
|
+
process.exitCode = 1;
|
|
145
|
+
}
|
|
146
|
+
} catch (err) {
|
|
147
|
+
console.error();
|
|
148
|
+
log.error(err?.message || String(err));
|
|
149
|
+
// exit, not exitCode: a failed dev:ui (e.g. Ctrl+C before vite was ready) leaves file watchers that
|
|
150
|
+
// would keep the process hanging.
|
|
151
|
+
process.exit(1);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
main();
|
package/cli/bundle-templates.mjs
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
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 } 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
|
-
const { version } = JSON.parse(readFileSync(resolve(root, "../package.json"), "utf8"));
|
|
24
|
-
|
|
25
|
-
writeFileSync(out,
|
|
26
|
-
`// AUTO-GENERATED by cli/bundle-templates.mjs — do not edit.\n` +
|
|
27
|
-
`// ponytail: generated at publish time; not tracked in git.\n` +
|
|
28
|
-
`export const KIT_VERSION = ${JSON.stringify(version)};\n` +
|
|
29
|
-
`export const TEMPLATES = ${JSON.stringify(files)};\n`
|
|
30
|
-
);
|
|
31
|
-
console.log(`bundled ${Object.keys(files).length} template files → src/templates-embedded.mjs`);
|
|
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 } 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
|
+
const { version } = JSON.parse(readFileSync(resolve(root, "../package.json"), "utf8"));
|
|
24
|
+
|
|
25
|
+
writeFileSync(out,
|
|
26
|
+
`// AUTO-GENERATED by cli/bundle-templates.mjs — do not edit.\n` +
|
|
27
|
+
`// ponytail: generated at publish time; not tracked in git.\n` +
|
|
28
|
+
`export const KIT_VERSION = ${JSON.stringify(version)};\n` +
|
|
29
|
+
`export const TEMPLATES = ${JSON.stringify(files)};\n`
|
|
30
|
+
);
|
|
31
|
+
console.log(`bundled ${Object.keys(files).length} template files → src/templates-embedded.mjs`);
|
|
@@ -1,28 +1,28 @@
|
|
|
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
|
-
# Rainbow Robotics C++ SDK for find_package(rb_sdk). muscat-pk passes the version pinned in the
|
|
14
|
-
# project's CMakeLists.txt (find_package(rb_sdk <ver> EXACT)); without a pin (ROS 2 rclpy, `muscat-pk mcp`
|
|
15
|
-
# outside a project) the newest SDK is installed. Runtime and -dev are installed together at one version.
|
|
16
|
-
ARG RB_SDK_VERSION=
|
|
17
|
-
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl \
|
|
18
|
-
&& install -d /etc/apt/keyrings \
|
|
19
|
-
&& curl -fsSL https://rainbowrobotics.github.io/rb-sdk/rb-sdk-apt-repo.gpg.key -o /etc/apt/keyrings/rb-sdk.asc \
|
|
20
|
-
&& printf 'deb [signed-by=/etc/apt/keyrings/rb-sdk.asc] https://rainbowrobotics.github.io/rb-sdk %s main\n' stable dev > /etc/apt/sources.list.d/rb-sdk.list \
|
|
21
|
-
&& apt-get update \
|
|
22
|
-
&& apt-get install -y --no-install-recommends "rainbow-rb-sdk${RB_SDK_VERSION:+=$RB_SDK_VERSION}" "rainbow-rb-sdk-dev${RB_SDK_VERSION:+=$RB_SDK_VERSION}" \
|
|
23
|
-
&& rm -rf /var/lib/apt/lists/*
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
WORKDIR /plugin
|
|
27
|
-
|
|
28
|
-
CMD ["bash"]
|
|
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
|
+
# Rainbow Robotics C++ SDK for find_package(rb_sdk). muscat-pk passes the version pinned in the
|
|
14
|
+
# project's CMakeLists.txt (find_package(rb_sdk <ver> EXACT)); without a pin (ROS 2 rclpy, `muscat-pk mcp`
|
|
15
|
+
# outside a project) the newest SDK is installed. Runtime and -dev are installed together at one version.
|
|
16
|
+
ARG RB_SDK_VERSION=
|
|
17
|
+
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl \
|
|
18
|
+
&& install -d /etc/apt/keyrings \
|
|
19
|
+
&& curl -fsSL https://rainbowrobotics.github.io/rb-sdk/rb-sdk-apt-repo.gpg.key -o /etc/apt/keyrings/rb-sdk.asc \
|
|
20
|
+
&& printf 'deb [signed-by=/etc/apt/keyrings/rb-sdk.asc] https://rainbowrobotics.github.io/rb-sdk %s main\n' stable dev > /etc/apt/sources.list.d/rb-sdk.list \
|
|
21
|
+
&& apt-get update \
|
|
22
|
+
&& apt-get install -y --no-install-recommends "rainbow-rb-sdk${RB_SDK_VERSION:+=$RB_SDK_VERSION}" "rainbow-rb-sdk-dev${RB_SDK_VERSION:+=$RB_SDK_VERSION}" \
|
|
23
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
WORKDIR /plugin
|
|
27
|
+
|
|
28
|
+
CMD ["bash"]
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
# Dev-only container for the ROS2 plugin back end.
|
|
2
|
-
# Matches the Muscat robot backend: ROS2 Jazzy + Python 3.12 (Ubuntu 24.04).
|
|
3
|
-
# Used by `muscat-pk dev:back` — NOT shipped in the plugin ZIP.
|
|
4
|
-
FROM ros:jazzy-ros-base
|
|
5
|
-
LABEL com.rainbow-robotics.muscat-pk="true"
|
|
6
|
-
|
|
7
|
-
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
8
|
-
python3-pip \
|
|
9
|
-
python3-colcon-common-extensions \
|
|
10
|
-
&& rm -rf /var/lib/apt/lists/*
|
|
11
|
-
|
|
12
|
-
# Rainbow Robotics C++ SDK for find_package(rb_sdk). muscat-pk passes the version pinned in the
|
|
13
|
-
# project's CMakeLists.txt (find_package(rb_sdk <ver> EXACT)); without a pin (ROS 2 rclpy, `muscat-pk mcp`
|
|
14
|
-
# outside a project) the newest SDK is installed. Runtime and -dev are installed together at one version.
|
|
15
|
-
ARG RB_SDK_VERSION=
|
|
16
|
-
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl \
|
|
17
|
-
&& install -d /etc/apt/keyrings \
|
|
18
|
-
&& curl -fsSL https://rainbowrobotics.github.io/rb-sdk/rb-sdk-apt-repo.gpg.key -o /etc/apt/keyrings/rb-sdk.asc \
|
|
19
|
-
&& printf 'deb [signed-by=/etc/apt/keyrings/rb-sdk.asc] https://rainbowrobotics.github.io/rb-sdk %s main\n' stable dev > /etc/apt/sources.list.d/rb-sdk.list \
|
|
20
|
-
&& apt-get update \
|
|
21
|
-
&& apt-get install -y --no-install-recommends "rainbow-rb-sdk${RB_SDK_VERSION:+=$RB_SDK_VERSION}" "rainbow-rb-sdk-dev${RB_SDK_VERSION:+=$RB_SDK_VERSION}" \
|
|
22
|
-
&& rm -rf /var/lib/apt/lists/*
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# `docker exec` skips /ros_entrypoint.sh — source ROS for the login shells dev:back runs.
|
|
26
|
-
RUN echo ". /opt/ros/${ROS_DISTRO}/setup.sh" > /etc/profile.d/ros.sh
|
|
27
|
-
|
|
28
|
-
WORKDIR /plugin
|
|
29
|
-
|
|
30
|
-
CMD ["bash"]
|
|
1
|
+
# Dev-only container for the ROS2 plugin back end.
|
|
2
|
+
# Matches the Muscat robot backend: ROS2 Jazzy + Python 3.12 (Ubuntu 24.04).
|
|
3
|
+
# Used by `muscat-pk dev:back` — NOT shipped in the plugin ZIP.
|
|
4
|
+
FROM ros:jazzy-ros-base
|
|
5
|
+
LABEL com.rainbow-robotics.muscat-pk="true"
|
|
6
|
+
|
|
7
|
+
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
8
|
+
python3-pip \
|
|
9
|
+
python3-colcon-common-extensions \
|
|
10
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
11
|
+
|
|
12
|
+
# Rainbow Robotics C++ SDK for find_package(rb_sdk). muscat-pk passes the version pinned in the
|
|
13
|
+
# project's CMakeLists.txt (find_package(rb_sdk <ver> EXACT)); without a pin (ROS 2 rclpy, `muscat-pk mcp`
|
|
14
|
+
# outside a project) the newest SDK is installed. Runtime and -dev are installed together at one version.
|
|
15
|
+
ARG RB_SDK_VERSION=
|
|
16
|
+
RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates curl \
|
|
17
|
+
&& install -d /etc/apt/keyrings \
|
|
18
|
+
&& curl -fsSL https://rainbowrobotics.github.io/rb-sdk/rb-sdk-apt-repo.gpg.key -o /etc/apt/keyrings/rb-sdk.asc \
|
|
19
|
+
&& printf 'deb [signed-by=/etc/apt/keyrings/rb-sdk.asc] https://rainbowrobotics.github.io/rb-sdk %s main\n' stable dev > /etc/apt/sources.list.d/rb-sdk.list \
|
|
20
|
+
&& apt-get update \
|
|
21
|
+
&& apt-get install -y --no-install-recommends "rainbow-rb-sdk${RB_SDK_VERSION:+=$RB_SDK_VERSION}" "rainbow-rb-sdk-dev${RB_SDK_VERSION:+=$RB_SDK_VERSION}" \
|
|
22
|
+
&& rm -rf /var/lib/apt/lists/*
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# `docker exec` skips /ros_entrypoint.sh — source ROS for the login shells dev:back runs.
|
|
26
|
+
RUN echo ". /opt/ros/${ROS_DISTRO}/setup.sh" > /etc/profile.d/ros.sh
|
|
27
|
+
|
|
28
|
+
WORKDIR /plugin
|
|
29
|
+
|
|
30
|
+
CMD ["bash"]
|
|
@@ -1,21 +1,21 @@
|
|
|
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
|
-
|
|
19
|
-
WORKDIR /plugin
|
|
20
|
-
|
|
21
|
-
CMD ["bash"]
|
|
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
|
+
|
|
19
|
+
WORKDIR /plugin
|
|
20
|
+
|
|
21
|
+
CMD ["bash"]
|