@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
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { execSync } from "node:child_process";
|
|
2
|
-
import { existsSync } from "node:fs";
|
|
3
|
-
import { dirname, resolve } from "node:path";
|
|
4
|
-
import { fileURLToPath } from "node:url";
|
|
5
|
-
|
|
6
|
-
const root = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
7
|
-
for (const dir of ["cli", "preview-host"]) {
|
|
8
|
-
if (!existsSync(resolve(root, dir))) continue;
|
|
9
|
-
execSync(
|
|
10
|
-
`find ${dir} -name '*.mjs' ! -path '*/dist/*' ! -path '*/runtime/*' ! -path '*/templates/*' -exec node --check {} +`,
|
|
11
|
-
{ cwd: root, stdio: "inherit" },
|
|
12
|
-
);
|
|
13
|
-
}
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { dirname, resolve } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
5
|
+
|
|
6
|
+
const root = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
|
|
7
|
+
for (const dir of ["cli", "preview-host"]) {
|
|
8
|
+
if (!existsSync(resolve(root, dir))) continue;
|
|
9
|
+
execSync(
|
|
10
|
+
`find ${dir} -name '*.mjs' ! -path '*/dist/*' ! -path '*/runtime/*' ! -path '*/templates/*' -exec node --check {} +`,
|
|
11
|
+
{ cwd: root, stdio: "inherit" },
|
|
12
|
+
);
|
|
13
|
+
}
|
package/cli/src/completion.mjs
CHANGED
|
@@ -1,166 +1,166 @@
|
|
|
1
|
-
// muscat-pk completion — print a shell completion script for bash / zsh / fish.
|
|
2
|
-
//
|
|
3
|
-
// muscat-pk completion zsh >> ~/.zshrc (or source it from there)
|
|
4
|
-
// muscat-pk completion bash >> ~/.bashrc
|
|
5
|
-
// muscat-pk completion fish > ~/.config/fish/completions/muscat-pk.fish
|
|
6
|
-
// muscat-pk completion powershell >> $PROFILE
|
|
7
|
-
//
|
|
8
|
-
// Keep COMMANDS in sync with the switch in bin/muscat-pk.mjs.
|
|
9
|
-
import { log } from "./util.mjs";
|
|
10
|
-
|
|
11
|
-
const COMMANDS = [
|
|
12
|
-
["new", "Scaffold a new plugin project"],
|
|
13
|
-
["type", "Switch backend type"],
|
|
14
|
-
["build", "Build + zip the plugin"],
|
|
15
|
-
["dev", "Bridge + dev:ui + dev:back"],
|
|
16
|
-
["dev:ui", "Preview the plugin in a mini-Muscat"],
|
|
17
|
-
["dev:back", "Run the plugin back end"],
|
|
18
|
-
["storybook", "Browse the bundled rb-components Storybook"],
|
|
19
|
-
["mcp", "Start an MCP server (stdio)"],
|
|
20
|
-
["update", "Update muscat-pk and plugin-ui"],
|
|
21
|
-
["uninstall", "Remove the installed muscat-pk CLI"],
|
|
22
|
-
["sdk", "Manage the rainbow-rb-sdk version (python: requirements.txt, C++: CMakeLists.txt)"],
|
|
23
|
-
["version", "Print the installed muscat-pk version"],
|
|
24
|
-
["completion", "Print a shell completion script"],
|
|
25
|
-
["help", "Show help"],
|
|
26
|
-
];
|
|
27
|
-
|
|
28
|
-
const SUBCOMMANDS = {
|
|
29
|
-
type: ["change"],
|
|
30
|
-
sdk: ["list", "update"],
|
|
31
|
-
completion: ["bash", "zsh", "fish", "powershell"],
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const names = COMMANDS.map(([name]) => name);
|
|
35
|
-
|
|
36
|
-
function bashScript() {
|
|
37
|
-
const subCases = Object.entries(SUBCOMMANDS)
|
|
38
|
-
.map(([cmd, subs]) => ` ${cmd}) COMPREPLY=( $(compgen -W "${subs.join(" ")}" -- "$cur") ); return ;;`)
|
|
39
|
-
.join("\n");
|
|
40
|
-
|
|
41
|
-
return `_muscat_pk() {
|
|
42
|
-
local cur prev
|
|
43
|
-
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
44
|
-
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
45
|
-
case "$prev" in
|
|
46
|
-
${subCases}
|
|
47
|
-
esac
|
|
48
|
-
if [ "$COMP_CWORD" -eq 1 ]; then
|
|
49
|
-
COMPREPLY=( $(compgen -W "${names.join(" ")}" -- "$cur") )
|
|
50
|
-
# bash treats ":" as a word break, so "dev:ui" would come back duplicated
|
|
51
|
-
if type __ltrim_colon_completions >/dev/null 2>&1; then
|
|
52
|
-
__ltrim_colon_completions "$cur"
|
|
53
|
-
fi
|
|
54
|
-
fi
|
|
55
|
-
}
|
|
56
|
-
complete -F _muscat_pk muscat-pk`;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
function zshScript() {
|
|
60
|
-
// _describe splits on ":", so a command name containing one (dev:ui) must escape it
|
|
61
|
-
const cmds = COMMANDS.map(
|
|
62
|
-
([name, desc]) => ` '${name.replace(/:/g, "\\:")}:${desc}'`,
|
|
63
|
-
).join("\n");
|
|
64
|
-
const subCases = Object.entries(SUBCOMMANDS)
|
|
65
|
-
.map(([cmd, subs]) => ` ${cmd}) _values 'subcommand' ${subs.join(" ")} ;;`)
|
|
66
|
-
.join("\n");
|
|
67
|
-
|
|
68
|
-
// Sourced from ~/.zshrc, compdef only exists once compinit has run — a bare
|
|
69
|
-
// zsh (no oh-my-zsh, no compinit) would error on every shell start otherwise.
|
|
70
|
-
return `#compdef muscat-pk
|
|
71
|
-
if ! whence compdef > /dev/null; then
|
|
72
|
-
autoload -Uz compinit && compinit
|
|
73
|
-
fi
|
|
74
|
-
_muscat_pk() {
|
|
75
|
-
local -a cmds
|
|
76
|
-
cmds=(
|
|
77
|
-
${cmds}
|
|
78
|
-
)
|
|
79
|
-
if (( CURRENT == 2 )); then
|
|
80
|
-
_describe 'command' cmds
|
|
81
|
-
else
|
|
82
|
-
case \${words[2]} in
|
|
83
|
-
${subCases}
|
|
84
|
-
esac
|
|
85
|
-
fi
|
|
86
|
-
}
|
|
87
|
-
if whence compdef > /dev/null; then
|
|
88
|
-
compdef _muscat_pk muscat-pk
|
|
89
|
-
fi`;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
function fishScript() {
|
|
93
|
-
const top = COMMANDS.map(
|
|
94
|
-
([name, desc]) =>
|
|
95
|
-
`complete -c muscat-pk -f -n __fish_use_subcommand -a ${name} -d ${JSON.stringify(desc)}`,
|
|
96
|
-
);
|
|
97
|
-
const subs = Object.entries(SUBCOMMANDS).flatMap(([cmd, list]) =>
|
|
98
|
-
list.map(
|
|
99
|
-
(sub) =>
|
|
100
|
-
`complete -c muscat-pk -f -n "__fish_seen_subcommand_from ${cmd}" -a ${sub}`,
|
|
101
|
-
),
|
|
102
|
-
);
|
|
103
|
-
return [...top, ...subs].join("\n");
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
function powershellScript() {
|
|
107
|
-
const subMap = Object.entries(SUBCOMMANDS)
|
|
108
|
-
.map(([cmd, subs]) => ` '${cmd}' = @(${subs.map((s) => `'${s}'`).join(", ")})`)
|
|
109
|
-
.join("\n");
|
|
110
|
-
|
|
111
|
-
return `Register-ArgumentCompleter -Native -CommandName muscat-pk -ScriptBlock {
|
|
112
|
-
param($wordToComplete, $commandAst, $cursorPosition)
|
|
113
|
-
$commands = @(${names.map((n) => `'${n}'`).join(", ")})
|
|
114
|
-
$subcommands = @{
|
|
115
|
-
${subMap}
|
|
116
|
-
}
|
|
117
|
-
$elements = @($commandAst.CommandElements | ForEach-Object { $_.ToString() })
|
|
118
|
-
# element 0 is "muscat-pk"; a trailing partial word is also in the list
|
|
119
|
-
$typedCommand = if ($elements.Count -gt 1) { $elements[1] } else { '' }
|
|
120
|
-
$candidates =
|
|
121
|
-
if ($elements.Count -gt 2 -or ($elements.Count -eq 2 -and $wordToComplete -eq '')) {
|
|
122
|
-
if ($subcommands.ContainsKey($typedCommand)) { $subcommands[$typedCommand] } else { @() }
|
|
123
|
-
} else { $commands }
|
|
124
|
-
$candidates |
|
|
125
|
-
Where-Object { $_ -like "$wordToComplete*" } |
|
|
126
|
-
ForEach-Object {
|
|
127
|
-
[System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
|
|
128
|
-
}
|
|
129
|
-
}`;
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
const GENERATORS = {
|
|
133
|
-
bash: bashScript,
|
|
134
|
-
zsh: zshScript,
|
|
135
|
-
fish: fishScript,
|
|
136
|
-
powershell: powershellScript,
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
const HINTS = {
|
|
140
|
-
bash: "muscat-pk completion bash >> ~/.bashrc → then: source ~/.bashrc",
|
|
141
|
-
zsh: "muscat-pk completion zsh >> ~/.zshrc → then: source ~/.zshrc",
|
|
142
|
-
fish: "muscat-pk completion fish > ~/.config/fish/completions/muscat-pk.fish",
|
|
143
|
-
powershell: "muscat-pk completion powershell >> $PROFILE → then: . $PROFILE",
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
/** Guess the user's shell from $SHELL; PowerShell on Windows, else bash. */
|
|
147
|
-
function detectShell() {
|
|
148
|
-
const shell = (process.env.SHELL || "").split(/[/\\]/).pop();
|
|
149
|
-
if (shell in GENERATORS) return shell;
|
|
150
|
-
return process.platform === "win32" ? "powershell" : "bash";
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
export async function runCompletion(args = []) {
|
|
154
|
-
const shell = args[0] ?? detectShell();
|
|
155
|
-
const generate = GENERATORS[shell];
|
|
156
|
-
|
|
157
|
-
if (!generate) {
|
|
158
|
-
throw new Error(
|
|
159
|
-
`Unsupported shell "${shell}" (supported: ${Object.keys(GENERATORS).join(", ")})`,
|
|
160
|
-
);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// Only the script goes to stdout, so `>> ~/.zshrc` stays valid.
|
|
164
|
-
console.log(generate());
|
|
165
|
-
if (process.stdout.isTTY) log.info(`\nInstall: ${HINTS[shell]}`);
|
|
166
|
-
}
|
|
1
|
+
// muscat-pk completion — print a shell completion script for bash / zsh / fish.
|
|
2
|
+
//
|
|
3
|
+
// muscat-pk completion zsh >> ~/.zshrc (or source it from there)
|
|
4
|
+
// muscat-pk completion bash >> ~/.bashrc
|
|
5
|
+
// muscat-pk completion fish > ~/.config/fish/completions/muscat-pk.fish
|
|
6
|
+
// muscat-pk completion powershell >> $PROFILE
|
|
7
|
+
//
|
|
8
|
+
// Keep COMMANDS in sync with the switch in bin/muscat-pk.mjs.
|
|
9
|
+
import { log } from "./util.mjs";
|
|
10
|
+
|
|
11
|
+
const COMMANDS = [
|
|
12
|
+
["new", "Scaffold a new plugin project"],
|
|
13
|
+
["type", "Switch backend type"],
|
|
14
|
+
["build", "Build + zip the plugin"],
|
|
15
|
+
["dev", "Bridge + dev:ui + dev:back"],
|
|
16
|
+
["dev:ui", "Preview the plugin in a mini-Muscat"],
|
|
17
|
+
["dev:back", "Run the plugin back end"],
|
|
18
|
+
["storybook", "Browse the bundled rb-components Storybook"],
|
|
19
|
+
["mcp", "Start an MCP server (stdio)"],
|
|
20
|
+
["update", "Update muscat-pk and plugin-ui"],
|
|
21
|
+
["uninstall", "Remove the installed muscat-pk CLI"],
|
|
22
|
+
["sdk", "Manage the rainbow-rb-sdk version (python: requirements.txt, C++: CMakeLists.txt)"],
|
|
23
|
+
["version", "Print the installed muscat-pk version"],
|
|
24
|
+
["completion", "Print a shell completion script"],
|
|
25
|
+
["help", "Show help"],
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
const SUBCOMMANDS = {
|
|
29
|
+
type: ["change"],
|
|
30
|
+
sdk: ["list", "update"],
|
|
31
|
+
completion: ["bash", "zsh", "fish", "powershell"],
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const names = COMMANDS.map(([name]) => name);
|
|
35
|
+
|
|
36
|
+
function bashScript() {
|
|
37
|
+
const subCases = Object.entries(SUBCOMMANDS)
|
|
38
|
+
.map(([cmd, subs]) => ` ${cmd}) COMPREPLY=( $(compgen -W "${subs.join(" ")}" -- "$cur") ); return ;;`)
|
|
39
|
+
.join("\n");
|
|
40
|
+
|
|
41
|
+
return `_muscat_pk() {
|
|
42
|
+
local cur prev
|
|
43
|
+
cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
44
|
+
prev="\${COMP_WORDS[COMP_CWORD-1]}"
|
|
45
|
+
case "$prev" in
|
|
46
|
+
${subCases}
|
|
47
|
+
esac
|
|
48
|
+
if [ "$COMP_CWORD" -eq 1 ]; then
|
|
49
|
+
COMPREPLY=( $(compgen -W "${names.join(" ")}" -- "$cur") )
|
|
50
|
+
# bash treats ":" as a word break, so "dev:ui" would come back duplicated
|
|
51
|
+
if type __ltrim_colon_completions >/dev/null 2>&1; then
|
|
52
|
+
__ltrim_colon_completions "$cur"
|
|
53
|
+
fi
|
|
54
|
+
fi
|
|
55
|
+
}
|
|
56
|
+
complete -F _muscat_pk muscat-pk`;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function zshScript() {
|
|
60
|
+
// _describe splits on ":", so a command name containing one (dev:ui) must escape it
|
|
61
|
+
const cmds = COMMANDS.map(
|
|
62
|
+
([name, desc]) => ` '${name.replace(/:/g, "\\:")}:${desc}'`,
|
|
63
|
+
).join("\n");
|
|
64
|
+
const subCases = Object.entries(SUBCOMMANDS)
|
|
65
|
+
.map(([cmd, subs]) => ` ${cmd}) _values 'subcommand' ${subs.join(" ")} ;;`)
|
|
66
|
+
.join("\n");
|
|
67
|
+
|
|
68
|
+
// Sourced from ~/.zshrc, compdef only exists once compinit has run — a bare
|
|
69
|
+
// zsh (no oh-my-zsh, no compinit) would error on every shell start otherwise.
|
|
70
|
+
return `#compdef muscat-pk
|
|
71
|
+
if ! whence compdef > /dev/null; then
|
|
72
|
+
autoload -Uz compinit && compinit
|
|
73
|
+
fi
|
|
74
|
+
_muscat_pk() {
|
|
75
|
+
local -a cmds
|
|
76
|
+
cmds=(
|
|
77
|
+
${cmds}
|
|
78
|
+
)
|
|
79
|
+
if (( CURRENT == 2 )); then
|
|
80
|
+
_describe 'command' cmds
|
|
81
|
+
else
|
|
82
|
+
case \${words[2]} in
|
|
83
|
+
${subCases}
|
|
84
|
+
esac
|
|
85
|
+
fi
|
|
86
|
+
}
|
|
87
|
+
if whence compdef > /dev/null; then
|
|
88
|
+
compdef _muscat_pk muscat-pk
|
|
89
|
+
fi`;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function fishScript() {
|
|
93
|
+
const top = COMMANDS.map(
|
|
94
|
+
([name, desc]) =>
|
|
95
|
+
`complete -c muscat-pk -f -n __fish_use_subcommand -a ${name} -d ${JSON.stringify(desc)}`,
|
|
96
|
+
);
|
|
97
|
+
const subs = Object.entries(SUBCOMMANDS).flatMap(([cmd, list]) =>
|
|
98
|
+
list.map(
|
|
99
|
+
(sub) =>
|
|
100
|
+
`complete -c muscat-pk -f -n "__fish_seen_subcommand_from ${cmd}" -a ${sub}`,
|
|
101
|
+
),
|
|
102
|
+
);
|
|
103
|
+
return [...top, ...subs].join("\n");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function powershellScript() {
|
|
107
|
+
const subMap = Object.entries(SUBCOMMANDS)
|
|
108
|
+
.map(([cmd, subs]) => ` '${cmd}' = @(${subs.map((s) => `'${s}'`).join(", ")})`)
|
|
109
|
+
.join("\n");
|
|
110
|
+
|
|
111
|
+
return `Register-ArgumentCompleter -Native -CommandName muscat-pk -ScriptBlock {
|
|
112
|
+
param($wordToComplete, $commandAst, $cursorPosition)
|
|
113
|
+
$commands = @(${names.map((n) => `'${n}'`).join(", ")})
|
|
114
|
+
$subcommands = @{
|
|
115
|
+
${subMap}
|
|
116
|
+
}
|
|
117
|
+
$elements = @($commandAst.CommandElements | ForEach-Object { $_.ToString() })
|
|
118
|
+
# element 0 is "muscat-pk"; a trailing partial word is also in the list
|
|
119
|
+
$typedCommand = if ($elements.Count -gt 1) { $elements[1] } else { '' }
|
|
120
|
+
$candidates =
|
|
121
|
+
if ($elements.Count -gt 2 -or ($elements.Count -eq 2 -and $wordToComplete -eq '')) {
|
|
122
|
+
if ($subcommands.ContainsKey($typedCommand)) { $subcommands[$typedCommand] } else { @() }
|
|
123
|
+
} else { $commands }
|
|
124
|
+
$candidates |
|
|
125
|
+
Where-Object { $_ -like "$wordToComplete*" } |
|
|
126
|
+
ForEach-Object {
|
|
127
|
+
[System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_)
|
|
128
|
+
}
|
|
129
|
+
}`;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const GENERATORS = {
|
|
133
|
+
bash: bashScript,
|
|
134
|
+
zsh: zshScript,
|
|
135
|
+
fish: fishScript,
|
|
136
|
+
powershell: powershellScript,
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
const HINTS = {
|
|
140
|
+
bash: "muscat-pk completion bash >> ~/.bashrc → then: source ~/.bashrc",
|
|
141
|
+
zsh: "muscat-pk completion zsh >> ~/.zshrc → then: source ~/.zshrc",
|
|
142
|
+
fish: "muscat-pk completion fish > ~/.config/fish/completions/muscat-pk.fish",
|
|
143
|
+
powershell: "muscat-pk completion powershell >> $PROFILE → then: . $PROFILE",
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
/** Guess the user's shell from $SHELL; PowerShell on Windows, else bash. */
|
|
147
|
+
function detectShell() {
|
|
148
|
+
const shell = (process.env.SHELL || "").split(/[/\\]/).pop();
|
|
149
|
+
if (shell in GENERATORS) return shell;
|
|
150
|
+
return process.platform === "win32" ? "powershell" : "bash";
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
export async function runCompletion(args = []) {
|
|
154
|
+
const shell = args[0] ?? detectShell();
|
|
155
|
+
const generate = GENERATORS[shell];
|
|
156
|
+
|
|
157
|
+
if (!generate) {
|
|
158
|
+
throw new Error(
|
|
159
|
+
`Unsupported shell "${shell}" (supported: ${Object.keys(GENERATORS).join(", ")})`,
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Only the script goes to stdout, so `>> ~/.zshrc` stays valid.
|
|
164
|
+
console.log(generate());
|
|
165
|
+
if (process.stdout.isTTY) log.info(`\nInstall: ${HINTS[shell]}`);
|
|
166
|
+
}
|
package/cli/src/cpp.mjs
CHANGED
|
@@ -1,78 +1,78 @@
|
|
|
1
|
-
// Shared C++ Docker helpers (Ubuntu 24.04 + build-essential + cmake).
|
|
2
|
-
// Matches the robot OS so the compiled binary is relocatable to the robot.
|
|
3
|
-
// Used by dev:back (interactive dev loop) and build (export the binary into the ZIP).
|
|
4
|
-
import { spawnSync } from "node:child_process";
|
|
5
|
-
import { dirname } from "node:path";
|
|
6
|
-
import { canSkipImageBuild, cppSdkVersion, pluginRootOrNull, imageKey, imageKeyLabel, dockerUserFlags, hasBin, log, pruneMuskatImages, resolveDockerfile, buildCacheFlags } from "./util.mjs";
|
|
7
|
-
import { syncCppIde } from "./cppIde.mjs";
|
|
8
|
-
|
|
9
|
-
export const CPP_DEV_IMAGE = "muscat-pk-cpp-dev";
|
|
10
|
-
|
|
11
|
-
export function assertDockerReady() {
|
|
12
|
-
if (!hasBin("docker")) {
|
|
13
|
-
throw new Error("Docker not found. C++ builds need Docker (Ubuntu 24.04 + cmake container).");
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/** Build the dev image from the kit's bundled Dockerfile (Docker layer-caches). */
|
|
18
|
-
export async function ensureImage(image = CPP_DEV_IMAGE, { platform = null, root = pluginRootOrNull() } = {}) {
|
|
19
|
-
await buildImage(image, platform, root);
|
|
20
|
-
// Dev images feed the editor's SDK headers: the native one (dev) or the host-arch one (build).
|
|
21
|
-
const hostArch = process.arch === "arm64" ? "arm64" : "amd64";
|
|
22
|
-
if (root && (image === CPP_DEV_IMAGE || image === `${CPP_DEV_IMAGE}-${hostArch}`)) syncCppIde(root, image);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async function buildImage(image, platform, root) {
|
|
26
|
-
const dockerfile = await resolveDockerfile("Dockerfile.cpp");
|
|
27
|
-
const sdkVer = cppSdkVersion(root);
|
|
28
|
-
const key = imageKey(dockerfile, sdkVer ?? "");
|
|
29
|
-
if (canSkipImageBuild(image, key)) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
log.step(`docker build -t ${image}${platform ? ` (${platform})` : ""} (first run is slow, then cached)…`);
|
|
33
|
-
const platformFlags = platform ? ["--platform", platform] : [];
|
|
34
|
-
const buildArgs = [...(sdkVer ? ["--build-arg", `RB_SDK_VERSION=${sdkVer}`] : []), ...imageKeyLabel(key)];
|
|
35
|
-
const r = spawnSync(
|
|
36
|
-
"docker",
|
|
37
|
-
["build", ...buildCacheFlags(), ...platformFlags, ...buildArgs, "-t", image, "-f", dockerfile, dirname(dockerfile)],
|
|
38
|
-
{ stdio: "inherit" },
|
|
39
|
-
);
|
|
40
|
-
if (r.status !== 0) throw new Error("docker build failed.");
|
|
41
|
-
pruneMuskatImages();
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Docker platform token for each target arch
|
|
45
|
-
export const ARCH_DOCKER_PLATFORM = {
|
|
46
|
-
amd64: "linux/amd64",
|
|
47
|
-
arm64: "linux/arm64",
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Configure + build cpp/ inside the container, producing cpp/build-{arch}/<entry>
|
|
52
|
-
* on the host (the workspace is mounted).
|
|
53
|
-
* - arch null → native (dev mode, uses cpp/build/)
|
|
54
|
-
* - arch "x86_64" / "aarch64" → cross via --platform (Release builds for ZIP)
|
|
55
|
-
* buildType "Debug" for dev, "Release" for export builds that ship in the ZIP.
|
|
56
|
-
*/
|
|
57
|
-
export function cmakeBuild(root, { image = CPP_DEV_IMAGE, buildType = "Debug", arch = null } = {}) {
|
|
58
|
-
const buildDir = arch ? `cpp/build-${arch}` : "cpp/build";
|
|
59
|
-
const dockerPlatform = arch ? ARCH_DOCKER_PLATFORM[arch] : null;
|
|
60
|
-
const platformFlags = dockerPlatform ? ["--platform", dockerPlatform] : [];
|
|
61
|
-
// arch 빌드 시 arch별 이미지 사용 (로컬 이미지와 platform 불일치 방지)
|
|
62
|
-
const actualImage = arch ? `${CPP_DEV_IMAGE}-${arch}` : image;
|
|
63
|
-
// Export builds ship lib/ next to the binary: librb_sdk.so (robot has no SDK) + any .so the
|
|
64
|
-
// plugin copied there itself. Found via RPATH $ORIGIN/lib.
|
|
65
|
-
const script = [
|
|
66
|
-
`cmake -S cpp -B ${buildDir} -DCMAKE_BUILD_TYPE=${buildType}` + (arch ? ` -DCMAKE_BUILD_RPATH='$ORIGIN/lib'` : ""),
|
|
67
|
-
`cmake --build ${buildDir} -j`,
|
|
68
|
-
...(arch ? [`rm -f ${buildDir}/lib/librb_sdk.so.* && if readelf -d $(find ${buildDir} -maxdepth 1 -type f -executable) 2>/dev/null | grep -q librb_sdk; then mkdir -p ${buildDir}/lib && cp -a $(dpkg -L rainbow-rb-sdk | grep -E '/librb_sdk[.]so[.][0-9]') ${buildDir}/lib/; fi`] : []),
|
|
69
|
-
].join(" && ");
|
|
70
|
-
const label = arch ? `cmake build (${buildType}, ${arch}, in container)…` : `cmake build (${buildType}, in container)…`;
|
|
71
|
-
log.step(label);
|
|
72
|
-
const r = spawnSync(
|
|
73
|
-
"docker",
|
|
74
|
-
["run", "--rm", ...dockerUserFlags(), ...platformFlags, "-v", `${root}:/plugin`, "-w", "/plugin", actualImage, "bash", "-lc", script],
|
|
75
|
-
{ cwd: root, stdio: "inherit" },
|
|
76
|
-
);
|
|
77
|
-
if (r.status !== 0) throw new Error(`cmake build failed${arch ? ` (${arch})` : ""}.`);
|
|
78
|
-
}
|
|
1
|
+
// Shared C++ Docker helpers (Ubuntu 24.04 + build-essential + cmake).
|
|
2
|
+
// Matches the robot OS so the compiled binary is relocatable to the robot.
|
|
3
|
+
// Used by dev:back (interactive dev loop) and build (export the binary into the ZIP).
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { dirname } from "node:path";
|
|
6
|
+
import { canSkipImageBuild, cppSdkVersion, pluginRootOrNull, imageKey, imageKeyLabel, dockerUserFlags, hasBin, log, pruneMuskatImages, resolveDockerfile, buildCacheFlags } from "./util.mjs";
|
|
7
|
+
import { syncCppIde } from "./cppIde.mjs";
|
|
8
|
+
|
|
9
|
+
export const CPP_DEV_IMAGE = "muscat-pk-cpp-dev";
|
|
10
|
+
|
|
11
|
+
export function assertDockerReady() {
|
|
12
|
+
if (!hasBin("docker")) {
|
|
13
|
+
throw new Error("Docker not found. C++ builds need Docker (Ubuntu 24.04 + cmake container).");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Build the dev image from the kit's bundled Dockerfile (Docker layer-caches). */
|
|
18
|
+
export async function ensureImage(image = CPP_DEV_IMAGE, { platform = null, root = pluginRootOrNull() } = {}) {
|
|
19
|
+
await buildImage(image, platform, root);
|
|
20
|
+
// Dev images feed the editor's SDK headers: the native one (dev) or the host-arch one (build).
|
|
21
|
+
const hostArch = process.arch === "arm64" ? "arm64" : "amd64";
|
|
22
|
+
if (root && (image === CPP_DEV_IMAGE || image === `${CPP_DEV_IMAGE}-${hostArch}`)) syncCppIde(root, image);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async function buildImage(image, platform, root) {
|
|
26
|
+
const dockerfile = await resolveDockerfile("Dockerfile.cpp");
|
|
27
|
+
const sdkVer = cppSdkVersion(root);
|
|
28
|
+
const key = imageKey(dockerfile, sdkVer ?? "");
|
|
29
|
+
if (canSkipImageBuild(image, key)) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
log.step(`docker build -t ${image}${platform ? ` (${platform})` : ""} (first run is slow, then cached)…`);
|
|
33
|
+
const platformFlags = platform ? ["--platform", platform] : [];
|
|
34
|
+
const buildArgs = [...(sdkVer ? ["--build-arg", `RB_SDK_VERSION=${sdkVer}`] : []), ...imageKeyLabel(key)];
|
|
35
|
+
const r = spawnSync(
|
|
36
|
+
"docker",
|
|
37
|
+
["build", ...buildCacheFlags(), ...platformFlags, ...buildArgs, "-t", image, "-f", dockerfile, dirname(dockerfile)],
|
|
38
|
+
{ stdio: "inherit" },
|
|
39
|
+
);
|
|
40
|
+
if (r.status !== 0) throw new Error("docker build failed.");
|
|
41
|
+
pruneMuskatImages();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Docker platform token for each target arch
|
|
45
|
+
export const ARCH_DOCKER_PLATFORM = {
|
|
46
|
+
amd64: "linux/amd64",
|
|
47
|
+
arm64: "linux/arm64",
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Configure + build cpp/ inside the container, producing cpp/build-{arch}/<entry>
|
|
52
|
+
* on the host (the workspace is mounted).
|
|
53
|
+
* - arch null → native (dev mode, uses cpp/build/)
|
|
54
|
+
* - arch "x86_64" / "aarch64" → cross via --platform (Release builds for ZIP)
|
|
55
|
+
* buildType "Debug" for dev, "Release" for export builds that ship in the ZIP.
|
|
56
|
+
*/
|
|
57
|
+
export function cmakeBuild(root, { image = CPP_DEV_IMAGE, buildType = "Debug", arch = null } = {}) {
|
|
58
|
+
const buildDir = arch ? `cpp/build-${arch}` : "cpp/build";
|
|
59
|
+
const dockerPlatform = arch ? ARCH_DOCKER_PLATFORM[arch] : null;
|
|
60
|
+
const platformFlags = dockerPlatform ? ["--platform", dockerPlatform] : [];
|
|
61
|
+
// arch 빌드 시 arch별 이미지 사용 (로컬 이미지와 platform 불일치 방지)
|
|
62
|
+
const actualImage = arch ? `${CPP_DEV_IMAGE}-${arch}` : image;
|
|
63
|
+
// Export builds ship lib/ next to the binary: librb_sdk.so (robot has no SDK) + any .so the
|
|
64
|
+
// plugin copied there itself. Found via RPATH $ORIGIN/lib.
|
|
65
|
+
const script = [
|
|
66
|
+
`cmake -S cpp -B ${buildDir} -DCMAKE_BUILD_TYPE=${buildType}` + (arch ? ` -DCMAKE_BUILD_RPATH='$ORIGIN/lib'` : ""),
|
|
67
|
+
`cmake --build ${buildDir} -j`,
|
|
68
|
+
...(arch ? [`rm -f ${buildDir}/lib/librb_sdk.so.* && if readelf -d $(find ${buildDir} -maxdepth 1 -type f -executable) 2>/dev/null | grep -q librb_sdk; then mkdir -p ${buildDir}/lib && cp -a $(dpkg -L rainbow-rb-sdk | grep -E '/librb_sdk[.]so[.][0-9]') ${buildDir}/lib/; fi`] : []),
|
|
69
|
+
].join(" && ");
|
|
70
|
+
const label = arch ? `cmake build (${buildType}, ${arch}, in container)…` : `cmake build (${buildType}, in container)…`;
|
|
71
|
+
log.step(label);
|
|
72
|
+
const r = spawnSync(
|
|
73
|
+
"docker",
|
|
74
|
+
["run", "--rm", ...dockerUserFlags(), ...platformFlags, "-v", `${root}:/plugin`, "-w", "/plugin", actualImage, "bash", "-lc", script],
|
|
75
|
+
{ cwd: root, stdio: "inherit" },
|
|
76
|
+
);
|
|
77
|
+
if (r.status !== 0) throw new Error(`cmake build failed${arch ? ` (${arch})` : ""}.`);
|
|
78
|
+
}
|