@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/src/type.mjs
CHANGED
|
@@ -1,141 +1,141 @@
|
|
|
1
|
-
// muscat-pk type change — switch an existing plugin's backend type.
|
|
2
|
-
// python | cpp | ros2 (rclpy) | ros2-cpp (rclcpp).
|
|
3
|
-
// Adds the matching backend overlay; never deletes existing user code
|
|
4
|
-
// (e.g. ros2_ws/ or cpp/ are left in place when switching away).
|
|
5
|
-
import { copyFileSync, existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
6
|
-
import { tmpdir } from "node:os";
|
|
7
|
-
import { basename, join, resolve } from "node:path";
|
|
8
|
-
import { findPluginRoot, log, prompt, templatesDir } from "./util.mjs";
|
|
9
|
-
import {
|
|
10
|
-
TYPE_CHOICES,
|
|
11
|
-
applyTokens,
|
|
12
|
-
copyTemplate,
|
|
13
|
-
deriveNames,
|
|
14
|
-
overlayCpp,
|
|
15
|
-
overlayRos2,
|
|
16
|
-
prepareCppIde,
|
|
17
|
-
runtimeForChoice,
|
|
18
|
-
} from "./new.mjs";
|
|
19
|
-
|
|
20
|
-
const TYPES = Object.keys(TYPE_CHOICES);
|
|
21
|
-
|
|
22
|
-
function readManifest(root) {
|
|
23
|
-
const path = resolve(root, "manifest.json");
|
|
24
|
-
if (!existsSync(path)) throw new Error(`manifest.json not found in ${root}`);
|
|
25
|
-
return { path, json: JSON.parse(readFileSync(path, "utf8")) };
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Derive the current `--type`-style key from a manifest runtime block.
|
|
29
|
-
function currentTypeKey(runtime) {
|
|
30
|
-
if (runtime?.type === "ros2") return runtime.rosClient === "rclcpp" ? "ros2-cpp" : "ros2";
|
|
31
|
-
return runtime?.type ?? "python";
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const isCpp = (key) => key === "cpp" || key === "ros2-cpp";
|
|
35
|
-
|
|
36
|
-
async function offerReadme(root, toCpp, force, tokens) {
|
|
37
|
-
const lang = toCpp ? "C++" : "Python";
|
|
38
|
-
const answer = force ? "y" : await prompt(`Replace README.md with the ${lang} backend version? (current file kept as README.md.bak) [y/N]: `, "n");
|
|
39
|
-
if (!/^y/i.test(answer)) {
|
|
40
|
-
log.info(`README.md kept — to swap it later: muscat-pk type change --to <type> --readme`);
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
const tmp = mkdtempSync(join(tmpdir(), "muscat-pk-readme-"));
|
|
44
|
-
try {
|
|
45
|
-
await copyTemplate(resolve(templatesDir, toCpp ? "readme-cpp" : "common"), tmp);
|
|
46
|
-
applyTokens(tmp, tokens);
|
|
47
|
-
const readme = resolve(root, "README.md");
|
|
48
|
-
if (existsSync(readme)) copyFileSync(readme, resolve(root, "README.md.bak"));
|
|
49
|
-
copyFileSync(join(tmp, "README.md"), readme);
|
|
50
|
-
log.ok(`README.md → ${lang} version${existsSync(resolve(root, "README.md.bak")) ? " (previous file: README.md.bak)" : ""}`);
|
|
51
|
-
} finally {
|
|
52
|
-
rmSync(tmp, { recursive: true, force: true });
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
export async function runType(args) {
|
|
57
|
-
// accept `type change`, `type`, `type --to ros2-cpp`
|
|
58
|
-
const sub = args[0];
|
|
59
|
-
const toFlagIdx = args.indexOf("--to");
|
|
60
|
-
let to = toFlagIdx >= 0 ? args[toFlagIdx + 1] : undefined;
|
|
61
|
-
|
|
62
|
-
const root = findPluginRoot();
|
|
63
|
-
const { path, json } = readManifest(root);
|
|
64
|
-
const current = currentTypeKey(json.runtime);
|
|
65
|
-
|
|
66
|
-
if (sub && sub !== "change") {
|
|
67
|
-
log.warn(`unknown subcommand '${sub}'. Usage: muscat-pk type change [--to python|cpp|ros2|ros2-cpp] [--readme]`);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (!to) {
|
|
71
|
-
console.log(`\nCurrent type: ${current}`);
|
|
72
|
-
console.log("Select the new type:");
|
|
73
|
-
console.log(" 1) Python");
|
|
74
|
-
console.log(" 2) C++");
|
|
75
|
-
console.log(" 3) ROS2 (rclpy / Python)");
|
|
76
|
-
console.log(" 4) ROS2 (rclcpp / C++)");
|
|
77
|
-
const choice = await prompt("\nChoice [1/2/3/4]: ", "");
|
|
78
|
-
to = { "1": "python", "2": "cpp", "3": "ros2", "4": "ros2-cpp" }[choice];
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
if (!TYPES.includes(to)) {
|
|
82
|
-
throw new Error(`invalid type. choose python | cpp | ros2 | ros2-cpp.`);
|
|
83
|
-
}
|
|
84
|
-
if (to === current) {
|
|
85
|
-
log.info(`already '${current}' — nothing to change.`);
|
|
86
|
-
return;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const runtimeChoice = TYPE_CHOICES[to];
|
|
90
|
-
const { dir, slug, pluginName, pluginClass, pluginId } = deriveNames(root);
|
|
91
|
-
|
|
92
|
-
if (runtimeChoice.type === "ros2") {
|
|
93
|
-
if (existsSync(resolve(root, "ros2_ws"))) {
|
|
94
|
-
log.warn("ros2_ws/ already exists — keeping it, only flipping manifest type.");
|
|
95
|
-
} else {
|
|
96
|
-
log.step(`adding ros2_ws/ overlay (${runtimeChoice.rosClient})`);
|
|
97
|
-
await overlayRos2(root, slug, runtimeChoice.rosClient);
|
|
98
|
-
applyTokens(resolve(root, "ros2_ws"), {
|
|
99
|
-
__PLUGIN_ID__: pluginId,
|
|
100
|
-
__PLUGIN_NAME__: pluginName,
|
|
101
|
-
__PLUGIN_SLUG__: slug,
|
|
102
|
-
__PLUGIN_CLASS__: pluginClass,
|
|
103
|
-
__RUNTIME_TYPE__: "ros2",
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
} else if (runtimeChoice.type === "cpp") {
|
|
107
|
-
if (existsSync(resolve(root, "cpp"))) {
|
|
108
|
-
log.warn("cpp/ already exists — keeping it, only flipping manifest type.");
|
|
109
|
-
} else {
|
|
110
|
-
log.step("adding cpp/ overlay");
|
|
111
|
-
await overlayCpp(root);
|
|
112
|
-
applyTokens(resolve(root, "cpp"), {
|
|
113
|
-
__PLUGIN_ID__: pluginId,
|
|
114
|
-
__PLUGIN_NAME__: pluginName,
|
|
115
|
-
__PLUGIN_SLUG__: slug,
|
|
116
|
-
__PLUGIN_CLASS__: pluginClass,
|
|
117
|
-
__RUNTIME_TYPE__: "cpp",
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
} else {
|
|
121
|
-
// → python. Leave any ros2_ws/ or cpp/ in place (never delete user code).
|
|
122
|
-
if (existsSync(resolve(root, "ros2_ws")) || existsSync(resolve(root, "cpp"))) {
|
|
123
|
-
log.warn("existing backend dir left in place (not deleted). Remove it manually if unused.");
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
json.runtime = runtimeForChoice(runtimeChoice, slug);
|
|
128
|
-
writeFileSync(path, JSON.stringify(json, null, 2) + "\n");
|
|
129
|
-
log.ok(`${basename(root)} type: ${current} → ${to}`);
|
|
130
|
-
if (isCpp(to)) await prepareCppIde(root, runtimeChoice);
|
|
131
|
-
|
|
132
|
-
if (isCpp(current) !== isCpp(to)) {
|
|
133
|
-
await offerReadme(root, isCpp(to), args.includes("--readme"), {
|
|
134
|
-
__PLUGIN_ID__: pluginId,
|
|
135
|
-
__PLUGIN_NAME__: pluginName,
|
|
136
|
-
__PLUGIN_DIR__: dir,
|
|
137
|
-
__PLUGIN_SLUG__: slug,
|
|
138
|
-
__PLUGIN_CLASS__: pluginClass,
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
}
|
|
1
|
+
// muscat-pk type change — switch an existing plugin's backend type.
|
|
2
|
+
// python | cpp | ros2 (rclpy) | ros2-cpp (rclcpp).
|
|
3
|
+
// Adds the matching backend overlay; never deletes existing user code
|
|
4
|
+
// (e.g. ros2_ws/ or cpp/ are left in place when switching away).
|
|
5
|
+
import { copyFileSync, existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { basename, join, resolve } from "node:path";
|
|
8
|
+
import { findPluginRoot, log, prompt, templatesDir } from "./util.mjs";
|
|
9
|
+
import {
|
|
10
|
+
TYPE_CHOICES,
|
|
11
|
+
applyTokens,
|
|
12
|
+
copyTemplate,
|
|
13
|
+
deriveNames,
|
|
14
|
+
overlayCpp,
|
|
15
|
+
overlayRos2,
|
|
16
|
+
prepareCppIde,
|
|
17
|
+
runtimeForChoice,
|
|
18
|
+
} from "./new.mjs";
|
|
19
|
+
|
|
20
|
+
const TYPES = Object.keys(TYPE_CHOICES);
|
|
21
|
+
|
|
22
|
+
function readManifest(root) {
|
|
23
|
+
const path = resolve(root, "manifest.json");
|
|
24
|
+
if (!existsSync(path)) throw new Error(`manifest.json not found in ${root}`);
|
|
25
|
+
return { path, json: JSON.parse(readFileSync(path, "utf8")) };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Derive the current `--type`-style key from a manifest runtime block.
|
|
29
|
+
function currentTypeKey(runtime) {
|
|
30
|
+
if (runtime?.type === "ros2") return runtime.rosClient === "rclcpp" ? "ros2-cpp" : "ros2";
|
|
31
|
+
return runtime?.type ?? "python";
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const isCpp = (key) => key === "cpp" || key === "ros2-cpp";
|
|
35
|
+
|
|
36
|
+
async function offerReadme(root, toCpp, force, tokens) {
|
|
37
|
+
const lang = toCpp ? "C++" : "Python";
|
|
38
|
+
const answer = force ? "y" : await prompt(`Replace README.md with the ${lang} backend version? (current file kept as README.md.bak) [y/N]: `, "n");
|
|
39
|
+
if (!/^y/i.test(answer)) {
|
|
40
|
+
log.info(`README.md kept — to swap it later: muscat-pk type change --to <type> --readme`);
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const tmp = mkdtempSync(join(tmpdir(), "muscat-pk-readme-"));
|
|
44
|
+
try {
|
|
45
|
+
await copyTemplate(resolve(templatesDir, toCpp ? "readme-cpp" : "common"), tmp);
|
|
46
|
+
applyTokens(tmp, tokens);
|
|
47
|
+
const readme = resolve(root, "README.md");
|
|
48
|
+
if (existsSync(readme)) copyFileSync(readme, resolve(root, "README.md.bak"));
|
|
49
|
+
copyFileSync(join(tmp, "README.md"), readme);
|
|
50
|
+
log.ok(`README.md → ${lang} version${existsSync(resolve(root, "README.md.bak")) ? " (previous file: README.md.bak)" : ""}`);
|
|
51
|
+
} finally {
|
|
52
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export async function runType(args) {
|
|
57
|
+
// accept `type change`, `type`, `type --to ros2-cpp`
|
|
58
|
+
const sub = args[0];
|
|
59
|
+
const toFlagIdx = args.indexOf("--to");
|
|
60
|
+
let to = toFlagIdx >= 0 ? args[toFlagIdx + 1] : undefined;
|
|
61
|
+
|
|
62
|
+
const root = findPluginRoot();
|
|
63
|
+
const { path, json } = readManifest(root);
|
|
64
|
+
const current = currentTypeKey(json.runtime);
|
|
65
|
+
|
|
66
|
+
if (sub && sub !== "change") {
|
|
67
|
+
log.warn(`unknown subcommand '${sub}'. Usage: muscat-pk type change [--to python|cpp|ros2|ros2-cpp] [--readme]`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (!to) {
|
|
71
|
+
console.log(`\nCurrent type: ${current}`);
|
|
72
|
+
console.log("Select the new type:");
|
|
73
|
+
console.log(" 1) Python");
|
|
74
|
+
console.log(" 2) C++");
|
|
75
|
+
console.log(" 3) ROS2 (rclpy / Python)");
|
|
76
|
+
console.log(" 4) ROS2 (rclcpp / C++)");
|
|
77
|
+
const choice = await prompt("\nChoice [1/2/3/4]: ", "");
|
|
78
|
+
to = { "1": "python", "2": "cpp", "3": "ros2", "4": "ros2-cpp" }[choice];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (!TYPES.includes(to)) {
|
|
82
|
+
throw new Error(`invalid type. choose python | cpp | ros2 | ros2-cpp.`);
|
|
83
|
+
}
|
|
84
|
+
if (to === current) {
|
|
85
|
+
log.info(`already '${current}' — nothing to change.`);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const runtimeChoice = TYPE_CHOICES[to];
|
|
90
|
+
const { dir, slug, pluginName, pluginClass, pluginId } = deriveNames(root);
|
|
91
|
+
|
|
92
|
+
if (runtimeChoice.type === "ros2") {
|
|
93
|
+
if (existsSync(resolve(root, "ros2_ws"))) {
|
|
94
|
+
log.warn("ros2_ws/ already exists — keeping it, only flipping manifest type.");
|
|
95
|
+
} else {
|
|
96
|
+
log.step(`adding ros2_ws/ overlay (${runtimeChoice.rosClient})`);
|
|
97
|
+
await overlayRos2(root, slug, runtimeChoice.rosClient);
|
|
98
|
+
applyTokens(resolve(root, "ros2_ws"), {
|
|
99
|
+
__PLUGIN_ID__: pluginId,
|
|
100
|
+
__PLUGIN_NAME__: pluginName,
|
|
101
|
+
__PLUGIN_SLUG__: slug,
|
|
102
|
+
__PLUGIN_CLASS__: pluginClass,
|
|
103
|
+
__RUNTIME_TYPE__: "ros2",
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
} else if (runtimeChoice.type === "cpp") {
|
|
107
|
+
if (existsSync(resolve(root, "cpp"))) {
|
|
108
|
+
log.warn("cpp/ already exists — keeping it, only flipping manifest type.");
|
|
109
|
+
} else {
|
|
110
|
+
log.step("adding cpp/ overlay");
|
|
111
|
+
await overlayCpp(root);
|
|
112
|
+
applyTokens(resolve(root, "cpp"), {
|
|
113
|
+
__PLUGIN_ID__: pluginId,
|
|
114
|
+
__PLUGIN_NAME__: pluginName,
|
|
115
|
+
__PLUGIN_SLUG__: slug,
|
|
116
|
+
__PLUGIN_CLASS__: pluginClass,
|
|
117
|
+
__RUNTIME_TYPE__: "cpp",
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
} else {
|
|
121
|
+
// → python. Leave any ros2_ws/ or cpp/ in place (never delete user code).
|
|
122
|
+
if (existsSync(resolve(root, "ros2_ws")) || existsSync(resolve(root, "cpp"))) {
|
|
123
|
+
log.warn("existing backend dir left in place (not deleted). Remove it manually if unused.");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
json.runtime = runtimeForChoice(runtimeChoice, slug);
|
|
128
|
+
writeFileSync(path, JSON.stringify(json, null, 2) + "\n");
|
|
129
|
+
log.ok(`${basename(root)} type: ${current} → ${to}`);
|
|
130
|
+
if (isCpp(to)) await prepareCppIde(root, runtimeChoice);
|
|
131
|
+
|
|
132
|
+
if (isCpp(current) !== isCpp(to)) {
|
|
133
|
+
await offerReadme(root, isCpp(to), args.includes("--readme"), {
|
|
134
|
+
__PLUGIN_ID__: pluginId,
|
|
135
|
+
__PLUGIN_NAME__: pluginName,
|
|
136
|
+
__PLUGIN_DIR__: dir,
|
|
137
|
+
__PLUGIN_SLUG__: slug,
|
|
138
|
+
__PLUGIN_CLASS__: pluginClass,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
package/cli/src/uninstall.mjs
CHANGED
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
// muscat-pk uninstall - remove the installed CLI, whether npm-global or S3 binary.
|
|
2
|
-
import { execSync, spawn, spawnSync } from "node:child_process";
|
|
3
|
-
import { existsSync, rmSync } from "node:fs";
|
|
4
|
-
import { dirname, join } from "node:path";
|
|
5
|
-
import { KIT_PUBLISHED_NAME, isNpmGlobalInstall, log, parseArgs } from "./util.mjs";
|
|
6
|
-
|
|
7
|
-
const isBinaryMode = typeof Bun !== "undefined";
|
|
8
|
-
|
|
9
|
-
function uninstallNpmGlobal() {
|
|
10
|
-
log.step(`npm uninstall -g ${KIT_PUBLISHED_NAME}`);
|
|
11
|
-
execSync(`npm uninstall -g ${KIT_PUBLISHED_NAME}`, { stdio: "inherit" });
|
|
12
|
-
log.ok("Global npm package removed.");
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
function uninstallBinary() {
|
|
16
|
-
const execPath = process.execPath;
|
|
17
|
-
log.step(`Removing binary: ${execPath}`);
|
|
18
|
-
|
|
19
|
-
if (process.platform === "win32") {
|
|
20
|
-
const ps = `Start-Sleep -Milliseconds 500; Remove-Item -Force '${execPath}'`;
|
|
21
|
-
spawn("powershell", ["-NoProfile", "-Command", ps], {
|
|
22
|
-
detached: true,
|
|
23
|
-
stdio: "ignore",
|
|
24
|
-
}).unref();
|
|
25
|
-
log.ok("Binary will be removed after this process exits.");
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
try {
|
|
30
|
-
rmSync(execPath, { force: true });
|
|
31
|
-
} catch (err) {
|
|
32
|
-
if (err?.code !== "EACCES" && err?.code !== "EPERM") throw err;
|
|
33
|
-
log.info(" sudo is required...");
|
|
34
|
-
const result = spawnSync("sudo", ["rm", "-f", execPath], { stdio: "inherit" });
|
|
35
|
-
if (result.status !== 0) throw new Error(`sudo rm failed: ${execPath}`);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
const parent = dirname(execPath);
|
|
39
|
-
for (const shim of ["muscat-pk.cmd", "muscat-pk.ps1"]) {
|
|
40
|
-
rmSync(join(parent, shim), { force: true });
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
log.ok("Binary removed.");
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export async function runUninstall(args = []) {
|
|
47
|
-
const opts = parseArgs(args, { booleans: ["help"] });
|
|
48
|
-
|
|
49
|
-
if (opts.help) {
|
|
50
|
-
log.info(
|
|
51
|
-
[
|
|
52
|
-
"Usage: muscat-pk uninstall",
|
|
53
|
-
"",
|
|
54
|
-
"Removes the installed muscat-pk CLI.",
|
|
55
|
-
" npm global install -> npm uninstall -g @rainbow-robotics/muscat-plugin-kit",
|
|
56
|
-
" S3 binary install -> remove the muscat-pk executable",
|
|
57
|
-
].join("\n"),
|
|
58
|
-
);
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
if (isBinaryMode) {
|
|
63
|
-
uninstallBinary();
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
if (isNpmGlobalInstall()) {
|
|
68
|
-
uninstallNpmGlobal();
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
const localBin = process.argv[1] || "";
|
|
73
|
-
if (localBin.includes(`${join("node_modules", ".bin")}`) || existsSync(join(process.cwd(), "package.json"))) {
|
|
74
|
-
log.warn("This muscat-pk appears to be running from a project/local install.");
|
|
75
|
-
log.warn("Remove it from the project package manager instead, for example:");
|
|
76
|
-
log.warn(` npm uninstall ${KIT_PUBLISHED_NAME}`);
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
throw new Error("Could not determine install mode. Remove muscat-pk manually from your PATH.");
|
|
81
|
-
}
|
|
1
|
+
// muscat-pk uninstall - remove the installed CLI, whether npm-global or S3 binary.
|
|
2
|
+
import { execSync, spawn, spawnSync } from "node:child_process";
|
|
3
|
+
import { existsSync, rmSync } from "node:fs";
|
|
4
|
+
import { dirname, join } from "node:path";
|
|
5
|
+
import { KIT_PUBLISHED_NAME, isNpmGlobalInstall, log, parseArgs } from "./util.mjs";
|
|
6
|
+
|
|
7
|
+
const isBinaryMode = typeof Bun !== "undefined";
|
|
8
|
+
|
|
9
|
+
function uninstallNpmGlobal() {
|
|
10
|
+
log.step(`npm uninstall -g ${KIT_PUBLISHED_NAME}`);
|
|
11
|
+
execSync(`npm uninstall -g ${KIT_PUBLISHED_NAME}`, { stdio: "inherit" });
|
|
12
|
+
log.ok("Global npm package removed.");
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function uninstallBinary() {
|
|
16
|
+
const execPath = process.execPath;
|
|
17
|
+
log.step(`Removing binary: ${execPath}`);
|
|
18
|
+
|
|
19
|
+
if (process.platform === "win32") {
|
|
20
|
+
const ps = `Start-Sleep -Milliseconds 500; Remove-Item -Force '${execPath}'`;
|
|
21
|
+
spawn("powershell", ["-NoProfile", "-Command", ps], {
|
|
22
|
+
detached: true,
|
|
23
|
+
stdio: "ignore",
|
|
24
|
+
}).unref();
|
|
25
|
+
log.ok("Binary will be removed after this process exits.");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
rmSync(execPath, { force: true });
|
|
31
|
+
} catch (err) {
|
|
32
|
+
if (err?.code !== "EACCES" && err?.code !== "EPERM") throw err;
|
|
33
|
+
log.info(" sudo is required...");
|
|
34
|
+
const result = spawnSync("sudo", ["rm", "-f", execPath], { stdio: "inherit" });
|
|
35
|
+
if (result.status !== 0) throw new Error(`sudo rm failed: ${execPath}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const parent = dirname(execPath);
|
|
39
|
+
for (const shim of ["muscat-pk.cmd", "muscat-pk.ps1"]) {
|
|
40
|
+
rmSync(join(parent, shim), { force: true });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
log.ok("Binary removed.");
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function runUninstall(args = []) {
|
|
47
|
+
const opts = parseArgs(args, { booleans: ["help"] });
|
|
48
|
+
|
|
49
|
+
if (opts.help) {
|
|
50
|
+
log.info(
|
|
51
|
+
[
|
|
52
|
+
"Usage: muscat-pk uninstall",
|
|
53
|
+
"",
|
|
54
|
+
"Removes the installed muscat-pk CLI.",
|
|
55
|
+
" npm global install -> npm uninstall -g @rainbow-robotics/muscat-plugin-kit",
|
|
56
|
+
" S3 binary install -> remove the muscat-pk executable",
|
|
57
|
+
].join("\n"),
|
|
58
|
+
);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if (isBinaryMode) {
|
|
63
|
+
uninstallBinary();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (isNpmGlobalInstall()) {
|
|
68
|
+
uninstallNpmGlobal();
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const localBin = process.argv[1] || "";
|
|
73
|
+
if (localBin.includes(`${join("node_modules", ".bin")}`) || existsSync(join(process.cwd(), "package.json"))) {
|
|
74
|
+
log.warn("This muscat-pk appears to be running from a project/local install.");
|
|
75
|
+
log.warn("Remove it from the project package manager instead, for example:");
|
|
76
|
+
log.warn(` npm uninstall ${KIT_PUBLISHED_NAME}`);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
throw new Error("Could not determine install mode. Remove muscat-pk manually from your PATH.");
|
|
81
|
+
}
|