@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/m5-e2e.mjs
CHANGED
|
@@ -1,69 +1,69 @@
|
|
|
1
|
-
// M5 e2e: full developer loop. Verifies a plugin scaffolded by `muscat-pk new`,
|
|
2
|
-
// built by `muscat-pk build`, and served by `muscat-pk dev:ui` renders inside the
|
|
3
|
-
// preview-host mini-Muscat. Requires `muscat-pk dev:ui` running on :4180 for a
|
|
4
|
-
// plugin whose name is "Mpk Test".
|
|
5
|
-
// Run from repo root: node packages/rb-plugin-kit/cli/m5-e2e.mjs
|
|
6
|
-
import { chromium } from "playwright-core";
|
|
7
|
-
import { homedir } from "node:os";
|
|
8
|
-
import { join } from "node:path";
|
|
9
|
-
|
|
10
|
-
const EXEC = join(
|
|
11
|
-
homedir(),
|
|
12
|
-
"Library/Caches/ms-playwright/chromium-1223/chrome-mac-arm64",
|
|
13
|
-
"Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",
|
|
14
|
-
);
|
|
15
|
-
const BASE = "http://localhost:4180";
|
|
16
|
-
const PLUGIN_NAME = "Mpk Test";
|
|
17
|
-
|
|
18
|
-
const R = [];
|
|
19
|
-
const ok = (n, c, e = "") => R.push({ n, c: !!c, e });
|
|
20
|
-
|
|
21
|
-
const b = await chromium.launch({ executablePath: EXEC });
|
|
22
|
-
const p = await b.newPage({ viewport: { width: 1280, height: 800 } });
|
|
23
|
-
const errs = [];
|
|
24
|
-
p.on("pageerror", (e) => errs.push(e.message));
|
|
25
|
-
const logs = [];
|
|
26
|
-
p.on("console", (m) => logs.push(m.text()));
|
|
27
|
-
const wait = (t, to = 40000) =>
|
|
28
|
-
p.waitForFunction(
|
|
29
|
-
(x) => document.body && document.body.innerText.includes(x),
|
|
30
|
-
t,
|
|
31
|
-
{ timeout: to },
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
await p.goto(`${BASE}/muscat/plugin`, { waitUntil: "commit" });
|
|
36
|
-
await wait("D.Board");
|
|
37
|
-
ok("mini-Muscat shell renders", true);
|
|
38
|
-
await wait(PLUGIN_NAME, 20000);
|
|
39
|
-
ok("scaffolded plugin loaded (LNB/content)", true);
|
|
40
|
-
await wait(`${PLUGIN_NAME} width`, 30000);
|
|
41
|
-
ok("scaffolded plugin content renders via rb-components", true);
|
|
42
|
-
|
|
43
|
-
// Grip action round-trips to the preview SDK
|
|
44
|
-
logs.length = 0;
|
|
45
|
-
await p.locator("button", { hasText: "Grip" }).first().click();
|
|
46
|
-
await p.waitForTimeout(1500);
|
|
47
|
-
ok(
|
|
48
|
-
"Grip action round-trips to host SDK",
|
|
49
|
-
logs.some((l) => l.includes("action") && l.includes("grip")),
|
|
50
|
-
logs.join(" | "),
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
const body = await p.evaluate(() => document.body.innerText);
|
|
54
|
-
ok("no API-failure toast", !body.includes("API Request Failed"));
|
|
55
|
-
ok("no page errors", errs.length === 0, errs.slice(0, 2).join(" | "));
|
|
56
|
-
await p.screenshot({ path: "/tmp/m5-built.png" });
|
|
57
|
-
} catch (e) {
|
|
58
|
-
ok("e2e completed", false, String(e));
|
|
59
|
-
} finally {
|
|
60
|
-
await b.close();
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
let pass = true;
|
|
64
|
-
for (const r of R) {
|
|
65
|
-
console.log(`${r.c ? "PASS" : "FAIL"} ${r.n}${!r.c && r.e ? " :: " + r.e : ""}`);
|
|
66
|
-
if (!r.c) pass = false;
|
|
67
|
-
}
|
|
68
|
-
console.log(pass ? "\nALL CHECKS PASSED" : "\nSOME CHECKS FAILED");
|
|
69
|
-
process.exit(pass ? 0 : 1);
|
|
1
|
+
// M5 e2e: full developer loop. Verifies a plugin scaffolded by `muscat-pk new`,
|
|
2
|
+
// built by `muscat-pk build`, and served by `muscat-pk dev:ui` renders inside the
|
|
3
|
+
// preview-host mini-Muscat. Requires `muscat-pk dev:ui` running on :4180 for a
|
|
4
|
+
// plugin whose name is "Mpk Test".
|
|
5
|
+
// Run from repo root: node packages/rb-plugin-kit/cli/m5-e2e.mjs
|
|
6
|
+
import { chromium } from "playwright-core";
|
|
7
|
+
import { homedir } from "node:os";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
|
|
10
|
+
const EXEC = join(
|
|
11
|
+
homedir(),
|
|
12
|
+
"Library/Caches/ms-playwright/chromium-1223/chrome-mac-arm64",
|
|
13
|
+
"Google Chrome for Testing.app/Contents/MacOS/Google Chrome for Testing",
|
|
14
|
+
);
|
|
15
|
+
const BASE = "http://localhost:4180";
|
|
16
|
+
const PLUGIN_NAME = "Mpk Test";
|
|
17
|
+
|
|
18
|
+
const R = [];
|
|
19
|
+
const ok = (n, c, e = "") => R.push({ n, c: !!c, e });
|
|
20
|
+
|
|
21
|
+
const b = await chromium.launch({ executablePath: EXEC });
|
|
22
|
+
const p = await b.newPage({ viewport: { width: 1280, height: 800 } });
|
|
23
|
+
const errs = [];
|
|
24
|
+
p.on("pageerror", (e) => errs.push(e.message));
|
|
25
|
+
const logs = [];
|
|
26
|
+
p.on("console", (m) => logs.push(m.text()));
|
|
27
|
+
const wait = (t, to = 40000) =>
|
|
28
|
+
p.waitForFunction(
|
|
29
|
+
(x) => document.body && document.body.innerText.includes(x),
|
|
30
|
+
t,
|
|
31
|
+
{ timeout: to },
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
await p.goto(`${BASE}/muscat/plugin`, { waitUntil: "commit" });
|
|
36
|
+
await wait("D.Board");
|
|
37
|
+
ok("mini-Muscat shell renders", true);
|
|
38
|
+
await wait(PLUGIN_NAME, 20000);
|
|
39
|
+
ok("scaffolded plugin loaded (LNB/content)", true);
|
|
40
|
+
await wait(`${PLUGIN_NAME} width`, 30000);
|
|
41
|
+
ok("scaffolded plugin content renders via rb-components", true);
|
|
42
|
+
|
|
43
|
+
// Grip action round-trips to the preview SDK
|
|
44
|
+
logs.length = 0;
|
|
45
|
+
await p.locator("button", { hasText: "Grip" }).first().click();
|
|
46
|
+
await p.waitForTimeout(1500);
|
|
47
|
+
ok(
|
|
48
|
+
"Grip action round-trips to host SDK",
|
|
49
|
+
logs.some((l) => l.includes("action") && l.includes("grip")),
|
|
50
|
+
logs.join(" | "),
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const body = await p.evaluate(() => document.body.innerText);
|
|
54
|
+
ok("no API-failure toast", !body.includes("API Request Failed"));
|
|
55
|
+
ok("no page errors", errs.length === 0, errs.slice(0, 2).join(" | "));
|
|
56
|
+
await p.screenshot({ path: "/tmp/m5-built.png" });
|
|
57
|
+
} catch (e) {
|
|
58
|
+
ok("e2e completed", false, String(e));
|
|
59
|
+
} finally {
|
|
60
|
+
await b.close();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
let pass = true;
|
|
64
|
+
for (const r of R) {
|
|
65
|
+
console.log(`${r.c ? "PASS" : "FAIL"} ${r.n}${!r.c && r.e ? " :: " + r.e : ""}`);
|
|
66
|
+
if (!r.c) pass = false;
|
|
67
|
+
}
|
|
68
|
+
console.log(pass ? "\nALL CHECKS PASSED" : "\nSOME CHECKS FAILED");
|
|
69
|
+
process.exit(pass ? 0 : 1);
|
package/cli/prepack.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// Runs on `npm publish` / `yarn npm publish` (and `npm pack`) via the "prepack"
|
|
2
|
-
// lifecycle hook. Builds the bundled Storybook (foundations + muscat) and stages
|
|
3
|
-
// it into cli/storybook-dist so it ships inside the published muscat-pk and
|
|
4
|
-
// `muscat-pk storybook` works from an external install.
|
|
5
|
-
//
|
|
6
|
-
// In the monorepo this runs the real build; outside it (re-packing an already
|
|
7
|
-
// published copy) buildStorybook() no-ops and the pre-staged dist is used.
|
|
8
|
-
import { buildStorybook } from "./src/storybook.mjs";
|
|
9
|
-
|
|
10
|
-
buildStorybook();
|
|
1
|
+
// Runs on `npm publish` / `yarn npm publish` (and `npm pack`) via the "prepack"
|
|
2
|
+
// lifecycle hook. Builds the bundled Storybook (foundations + muscat) and stages
|
|
3
|
+
// it into cli/storybook-dist so it ships inside the published muscat-pk and
|
|
4
|
+
// `muscat-pk storybook` works from an external install.
|
|
5
|
+
//
|
|
6
|
+
// In the monorepo this runs the real build; outside it (re-packing an already
|
|
7
|
+
// published copy) buildStorybook() no-ops and the pre-staged dist is used.
|
|
8
|
+
import { buildStorybook } from "./src/storybook.mjs";
|
|
9
|
+
|
|
10
|
+
buildStorybook();
|
package/cli/src/ai-rules.mjs
CHANGED
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
// Rules for AI coding agents working on a Muscat plugin. One source for both the MCP server's
|
|
2
|
-
// instructions (mcp.mjs) and the AGENTS.md / CLAUDE.md that `muscat-pk new` scaffolds, so the
|
|
3
|
-
// two never drift. Kept free of heavy imports: `new` loads it too.
|
|
4
|
-
|
|
5
|
-
// Native elements and the plugin-ui component to use instead.
|
|
6
|
-
export const NATIVE_TO_RB = [
|
|
7
|
-
["select / dropdown", "RBSelectBox + Option (children)"],
|
|
8
|
-
["input type=text", "RBTextInput (RBTextField for label + helper text)"],
|
|
9
|
-
["input type=number", "RBSideNumberInput"],
|
|
10
|
-
["input type=range", "RBSlider (RBMultiRangeInput for a range)"],
|
|
11
|
-
["input type=checkbox", "RBCheckBox"],
|
|
12
|
-
["input type=radio", "RBRadioButton / RBRadioBox"],
|
|
13
|
-
["toggle / switch", "RBSwitch (RBSwitchField with a label)"],
|
|
14
|
-
["input type=date", "RBDateInput / RBRangeDateInput"],
|
|
15
|
-
["textarea", "RBTextArea"],
|
|
16
|
-
["button", "RBLabelButton (text), RBIconButton (icon only)"],
|
|
17
|
-
["label", "RBTextLabel"],
|
|
18
|
-
["table", "RBTable + RBTableRow + RBTdColumn"],
|
|
19
|
-
["dialog / modal", "RBDialog… / RBModal; rb.confirm() / rb.alert() / rb.prompt() for simple prompts"],
|
|
20
|
-
["tabs", "RBTabs + RBTabsList + RBTabsTrigger + RBTabsContent"],
|
|
21
|
-
["tooltip (title=)", "RBTooltip"],
|
|
22
|
-
["hr", "RBDivider"],
|
|
23
|
-
["loading spinner", "RBSpinner"],
|
|
24
|
-
];
|
|
25
|
-
|
|
26
|
-
const UI_RULES = [
|
|
27
|
-
"Use plugin-ui components, never native form/control elements (<select>, <input>, <button>, <textarea>, <table>, <dialog>) or another UI library. Layout-only elements (<div>, <span>, <p>) are fine; prefer HStack/VStack for stacks.",
|
|
28
|
-
"Before writing a component, call get_component_example (working usage) or get_component_props (its type). Names are exact; when one is not found, use the suggestion returned, not a native element.",
|
|
29
|
-
"Colors and type come from tokens (bg-bg-*, text-fg-*, typo-*), not hex values or arbitrary Tailwind colors.",
|
|
30
|
-
];
|
|
31
|
-
|
|
32
|
-
const nativeTable = () => NATIVE_TO_RB.map(([el, rb]) => `- ${el}: ${rb}`).join("\n");
|
|
33
|
-
|
|
34
|
-
export const SERVER_INSTRUCTIONS = `Muscat plugin UI (ui/*.tsx) is built only from @rainbow-robotics/plugin-ui/react, styled with the design-token Tailwind classes (list_design_tokens).
|
|
35
|
-
|
|
36
|
-
Rules for UI work:
|
|
37
|
-
${UI_RULES.map((r) => `- ${r}`).join("\n")}
|
|
38
|
-
|
|
39
|
-
Native element -> plugin-ui component:
|
|
40
|
-
${nativeTable()}
|
|
41
|
-
|
|
42
|
-
Backend, manifest and SDK questions: search_rb_sdk, list_rb_sdk, get_rb_sdk_api.`;
|
|
43
|
-
|
|
44
|
-
// AGENTS.md (Codex, Cursor, Gemini CLI, Copilot …). CLAUDE.md imports it with `@AGENTS.md`.
|
|
45
|
-
// The backend type is not named: `muscat-pk type change` would leave it stale.
|
|
46
|
-
export function agentsMd({ pluginName }) {
|
|
47
|
-
return `# ${pluginName} — Muscat plugin
|
|
48
|
-
|
|
49
|
-
A Muscat plugin: \`manifest.json\`, a React UI in \`ui/*.tsx\`, and a backend whose type is \`runtime\` in \`manifest.json\`.
|
|
50
|
-
\`README.md\` is the full plugin-author guide. The \`muscat\` MCP server (\`.mcp.json\`, \`muscat-pk mcp\`) looks up
|
|
51
|
-
components, design tokens and the SDK: use it instead of guessing names or props.
|
|
52
|
-
|
|
53
|
-
## Commands
|
|
54
|
-
|
|
55
|
-
- \`muscat-pk dev\`: UI preview + backend with hot reload (\`dev:ui\` / \`dev:back\` for one side)
|
|
56
|
-
- \`muscat-pk build\`: validates \`manifest.json\`, builds \`dist/\` and the distributable ZIP
|
|
57
|
-
|
|
58
|
-
## UI rules
|
|
59
|
-
|
|
60
|
-
UI is built only from \`@rainbow-robotics/plugin-ui/react\`, styled with design-token Tailwind classes.
|
|
61
|
-
|
|
62
|
-
${UI_RULES.map((r) => `- ${r}`).join("\n")}
|
|
63
|
-
|
|
64
|
-
Native element → plugin-ui component:
|
|
65
|
-
|
|
66
|
-
${nativeTable()}
|
|
67
|
-
`;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
export const CLAUDE_MD = "@AGENTS.md\n";
|
|
1
|
+
// Rules for AI coding agents working on a Muscat plugin. One source for both the MCP server's
|
|
2
|
+
// instructions (mcp.mjs) and the AGENTS.md / CLAUDE.md that `muscat-pk new` scaffolds, so the
|
|
3
|
+
// two never drift. Kept free of heavy imports: `new` loads it too.
|
|
4
|
+
|
|
5
|
+
// Native elements and the plugin-ui component to use instead.
|
|
6
|
+
export const NATIVE_TO_RB = [
|
|
7
|
+
["select / dropdown", "RBSelectBox + Option (children)"],
|
|
8
|
+
["input type=text", "RBTextInput (RBTextField for label + helper text)"],
|
|
9
|
+
["input type=number", "RBSideNumberInput"],
|
|
10
|
+
["input type=range", "RBSlider (RBMultiRangeInput for a range)"],
|
|
11
|
+
["input type=checkbox", "RBCheckBox"],
|
|
12
|
+
["input type=radio", "RBRadioButton / RBRadioBox"],
|
|
13
|
+
["toggle / switch", "RBSwitch (RBSwitchField with a label)"],
|
|
14
|
+
["input type=date", "RBDateInput / RBRangeDateInput"],
|
|
15
|
+
["textarea", "RBTextArea"],
|
|
16
|
+
["button", "RBLabelButton (text), RBIconButton (icon only)"],
|
|
17
|
+
["label", "RBTextLabel"],
|
|
18
|
+
["table", "RBTable + RBTableRow + RBTdColumn"],
|
|
19
|
+
["dialog / modal", "RBDialog… / RBModal; rb.confirm() / rb.alert() / rb.prompt() for simple prompts"],
|
|
20
|
+
["tabs", "RBTabs + RBTabsList + RBTabsTrigger + RBTabsContent"],
|
|
21
|
+
["tooltip (title=)", "RBTooltip"],
|
|
22
|
+
["hr", "RBDivider"],
|
|
23
|
+
["loading spinner", "RBSpinner"],
|
|
24
|
+
];
|
|
25
|
+
|
|
26
|
+
const UI_RULES = [
|
|
27
|
+
"Use plugin-ui components, never native form/control elements (<select>, <input>, <button>, <textarea>, <table>, <dialog>) or another UI library. Layout-only elements (<div>, <span>, <p>) are fine; prefer HStack/VStack for stacks.",
|
|
28
|
+
"Before writing a component, call get_component_example (working usage) or get_component_props (its type). Names are exact; when one is not found, use the suggestion returned, not a native element.",
|
|
29
|
+
"Colors and type come from tokens (bg-bg-*, text-fg-*, typo-*), not hex values or arbitrary Tailwind colors.",
|
|
30
|
+
];
|
|
31
|
+
|
|
32
|
+
const nativeTable = () => NATIVE_TO_RB.map(([el, rb]) => `- ${el}: ${rb}`).join("\n");
|
|
33
|
+
|
|
34
|
+
export const SERVER_INSTRUCTIONS = `Muscat plugin UI (ui/*.tsx) is built only from @rainbow-robotics/plugin-ui/react, styled with the design-token Tailwind classes (list_design_tokens).
|
|
35
|
+
|
|
36
|
+
Rules for UI work:
|
|
37
|
+
${UI_RULES.map((r) => `- ${r}`).join("\n")}
|
|
38
|
+
|
|
39
|
+
Native element -> plugin-ui component:
|
|
40
|
+
${nativeTable()}
|
|
41
|
+
|
|
42
|
+
Backend, manifest and SDK questions: search_rb_sdk, list_rb_sdk, get_rb_sdk_api.`;
|
|
43
|
+
|
|
44
|
+
// AGENTS.md (Codex, Cursor, Gemini CLI, Copilot …). CLAUDE.md imports it with `@AGENTS.md`.
|
|
45
|
+
// The backend type is not named: `muscat-pk type change` would leave it stale.
|
|
46
|
+
export function agentsMd({ pluginName }) {
|
|
47
|
+
return `# ${pluginName} — Muscat plugin
|
|
48
|
+
|
|
49
|
+
A Muscat plugin: \`manifest.json\`, a React UI in \`ui/*.tsx\`, and a backend whose type is \`runtime\` in \`manifest.json\`.
|
|
50
|
+
\`README.md\` is the full plugin-author guide. The \`muscat\` MCP server (\`.mcp.json\`, \`muscat-pk mcp\`) looks up
|
|
51
|
+
components, design tokens and the SDK: use it instead of guessing names or props.
|
|
52
|
+
|
|
53
|
+
## Commands
|
|
54
|
+
|
|
55
|
+
- \`muscat-pk dev\`: UI preview + backend with hot reload (\`dev:ui\` / \`dev:back\` for one side)
|
|
56
|
+
- \`muscat-pk build\`: validates \`manifest.json\`, builds \`dist/\` and the distributable ZIP
|
|
57
|
+
|
|
58
|
+
## UI rules
|
|
59
|
+
|
|
60
|
+
UI is built only from \`@rainbow-robotics/plugin-ui/react\`, styled with design-token Tailwind classes.
|
|
61
|
+
|
|
62
|
+
${UI_RULES.map((r) => `- ${r}`).join("\n")}
|
|
63
|
+
|
|
64
|
+
Native element → plugin-ui component:
|
|
65
|
+
|
|
66
|
+
${nativeTable()}
|
|
67
|
+
`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export const CLAUDE_MD = "@AGENTS.md\n";
|