@rainbow-robotics/muscat-plugin-kit 0.1.2-dev.5 → 0.1.2-dev.50

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.
Files changed (269) hide show
  1. package/README.md +82 -49
  2. package/cli/README.md +191 -5
  3. package/cli/bin/create-muscat-plugin.mjs +1 -1
  4. package/cli/bin/muscat-pk.mjs +25 -10
  5. package/cli/bundle-templates.mjs +28 -0
  6. package/cli/docker/Dockerfile.bridge +17 -0
  7. package/cli/docker/Dockerfile.cpp +22 -0
  8. package/cli/docker/Dockerfile.dev +1 -2
  9. package/cli/docker/Dockerfile.python +20 -0
  10. package/cli/docker/bridge-package.json +8 -0
  11. package/cli/prepack.mjs +10 -0
  12. package/cli/src/bridge.mjs +90 -0
  13. package/cli/src/build.mjs +377 -85
  14. package/cli/src/check-package.mjs +8 -23
  15. package/cli/src/cpp.mjs +61 -0
  16. package/cli/src/dev.mjs +40 -4
  17. package/cli/src/devBack.mjs +274 -49
  18. package/cli/src/devUi.mjs +198 -19
  19. package/cli/src/esbuild.mjs +27 -10
  20. package/cli/src/manifest.mjs +208 -0
  21. package/cli/src/mcp.mjs +592 -0
  22. package/cli/src/new.mjs +143 -43
  23. package/cli/src/pluginDevServer.mjs +112 -0
  24. package/cli/src/ports.mjs +160 -0
  25. package/cli/src/python.mjs +109 -0
  26. package/cli/src/ros2.mjs +43 -18
  27. package/cli/src/sdk.mjs +11 -9
  28. package/cli/src/socketBridge.mjs +129 -0
  29. package/cli/src/storybook.mjs +168 -0
  30. package/cli/src/templates-embedded.mjs +3 -0
  31. package/cli/src/type.mjs +52 -29
  32. package/cli/src/uninstall.mjs +98 -0
  33. package/cli/src/update.mjs +259 -30
  34. package/cli/src/util.mjs +114 -7
  35. package/cli/storybook-dist/_design-tokens.css +4957 -0
  36. package/cli/storybook-dist/_stories-src/NxAvatar.stories.tsx +27 -0
  37. package/cli/storybook-dist/_stories-src/NxPagination.stories.tsx +28 -0
  38. package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordion.stories.tsx +46 -0
  39. package/cli/storybook-dist/_stories-src/RBAccordion/RBAccordionGroup.stories.tsx +73 -0
  40. package/cli/storybook-dist/_stories-src/RBBadge/RBBadge.stories.tsx +93 -0
  41. package/cli/storybook-dist/_stories-src/RBBattery/RBBattery.stories.tsx +74 -0
  42. package/cli/storybook-dist/_stories-src/RBButton/RBCheckIconButton.stories.tsx +28 -0
  43. package/cli/storybook-dist/_stories-src/RBButton/RBCheckLabelButton.stories.tsx +84 -0
  44. package/cli/storybook-dist/_stories-src/RBButton/RBIconButton.stories.tsx +57 -0
  45. package/cli/storybook-dist/_stories-src/RBButton/RBInlineLabelButton.stories.tsx +41 -0
  46. package/cli/storybook-dist/_stories-src/RBButton/RBLabelButton.stories.tsx +60 -0
  47. package/cli/storybook-dist/_stories-src/RBDatePicker/RBDateInput.stories.tsx +44 -0
  48. package/cli/storybook-dist/_stories-src/RBDatePicker/RBRangeDateInput.stories.tsx +44 -0
  49. package/cli/storybook-dist/_stories-src/RBDialog/RBAlert.stories.tsx +51 -0
  50. package/cli/storybook-dist/_stories-src/RBDialog/RBConfirm.stories.tsx +55 -0
  51. package/cli/storybook-dist/_stories-src/RBDialog/RBPrompt.stories.tsx +52 -0
  52. package/cli/storybook-dist/_stories-src/RBDivider/RBDivider.stories.tsx +93 -0
  53. package/cli/storybook-dist/_stories-src/RBEmptyView/RBEmptyView.stories.tsx +49 -0
  54. package/cli/storybook-dist/_stories-src/RBIcons/RBColorIcons.stories.tsx +108 -0
  55. package/cli/storybook-dist/_stories-src/RBIcons/RBIcons.stories.tsx +106 -0
  56. package/cli/storybook-dist/_stories-src/RBIcons/RBMenuTreeIcons.stories.tsx +108 -0
  57. package/cli/storybook-dist/_stories-src/RBIcons/RBProgramIcons.stories.tsx +116 -0
  58. package/cli/storybook-dist/_stories-src/RBInput/RBCheckBox.stories.tsx +89 -0
  59. package/cli/storybook-dist/_stories-src/RBInput/RBMultiRangeInput.stories.tsx +64 -0
  60. package/cli/storybook-dist/_stories-src/RBInput/RBRadioBox.stories.tsx +65 -0
  61. package/cli/storybook-dist/_stories-src/RBInput/RBRadioButton.stories.tsx +68 -0
  62. package/cli/storybook-dist/_stories-src/RBInput/RBSelectBox.stories.tsx +119 -0
  63. package/cli/storybook-dist/_stories-src/RBInput/RBSideNumberInput.stories.tsx +90 -0
  64. package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextArea.stories.tsx +45 -0
  65. package/cli/storybook-dist/_stories-src/RBInput/RBText/RBTextInput.stories.tsx +50 -0
  66. package/cli/storybook-dist/_stories-src/RBInput/RBTextField.stories.tsx +102 -0
  67. package/cli/storybook-dist/_stories-src/RBJoyStick/RBJoyStick.stories.tsx +31 -0
  68. package/cli/storybook-dist/_stories-src/RBLight/RBLight.stories.tsx +36 -0
  69. package/cli/storybook-dist/_stories-src/RBPagination/RBPagination.stories.tsx +49 -0
  70. package/cli/storybook-dist/_stories-src/RBShadcn/RBCard/RBCard.stories.tsx +89 -0
  71. package/cli/storybook-dist/_stories-src/RBShadcn/RBCommand/RBCommand.stories.tsx +116 -0
  72. package/cli/storybook-dist/_stories-src/RBShadcn/RBDialog/RBDialog.stories.tsx +74 -0
  73. package/cli/storybook-dist/_stories-src/RBShadcn/RBDrawer/RBDrawer.stories.tsx +99 -0
  74. package/cli/storybook-dist/_stories-src/RBShadcn/RBDropdownMenu/RBDropdownMenu.stories.tsx +123 -0
  75. package/cli/storybook-dist/_stories-src/RBShadcn/RBMenubar/RBMenubar.stories.tsx +135 -0
  76. package/cli/storybook-dist/_stories-src/RBShadcn/RBPopover/RBPopover.stories.tsx +69 -0
  77. package/cli/storybook-dist/_stories-src/RBShadcn/RBResizable/RBResizable.stories.tsx +49 -0
  78. package/cli/storybook-dist/_stories-src/RBShadcn/RBSheet/RBSheet.stories.tsx +91 -0
  79. package/cli/storybook-dist/_stories-src/RBShadcn/RBSlider/RBSlider.stories.tsx +38 -0
  80. package/cli/storybook-dist/_stories-src/RBShadcn/RBSwitch/RBSwitch.stories.tsx +112 -0
  81. package/cli/storybook-dist/_stories-src/RBShadcn/RBTabs/RBTabs.stories.tsx +75 -0
  82. package/cli/storybook-dist/_stories-src/RBShadcn/RBToggle/RBToggle.stories.tsx +51 -0
  83. package/cli/storybook-dist/_stories-src/RBShadcn/RBToggleGroup/RBToggleGroup.stories.tsx +84 -0
  84. package/cli/storybook-dist/_stories-src/RBTab/RBChipTab.stories.tsx +102 -0
  85. package/cli/storybook-dist/_stories-src/RBTab/RBChipsBoxTab.stories.tsx +78 -0
  86. package/cli/storybook-dist/_stories-src/RBTab/RBTab.stories.tsx +57 -0
  87. package/cli/storybook-dist/_stories-src/RBTable/RBTable.stories.tsx +177 -0
  88. package/cli/storybook-dist/_stories-src/RBTable/RBTableRow.stories.tsx +64 -0
  89. package/cli/storybook-dist/_stories-src/RBToast/RBToast.stories.tsx +117 -0
  90. package/cli/storybook-dist/_stories-src/RBTooltip/RBTooltip.stories.tsx +50 -0
  91. package/cli/storybook-dist/_stories-src/loading/RBSpinner.stories.tsx +30 -0
  92. package/cli/storybook-dist/_stories-src/nx-button/NxButton.stories.tsx +54 -0
  93. package/cli/storybook-dist/_stories-src/nx-button/NxPointerHoldButton.stories.tsx +57 -0
  94. package/cli/storybook-dist/_stories-src/nx-icons/NxIcons.stories.tsx +48 -0
  95. package/cli/storybook-dist/_stories-src/nx-inputs/NxNumberInput.stories.tsx +103 -0
  96. package/cli/storybook-dist/_stories-src/nx-inputs/NxRangeInput.stories.tsx +27 -0
  97. package/cli/storybook-dist/_stories-src/nx-inputs/NxSelectBox.stories.tsx +67 -0
  98. package/cli/storybook-dist/_stories-src/nx-inputs/NxSlideRange.stories.tsx +45 -0
  99. package/cli/storybook-dist/_stories-src/nx-inputs/NxSwitch.stories.tsx +27 -0
  100. package/cli/storybook-dist/_stories-src/nx-inputs/NxTextArea.stories.tsx +48 -0
  101. package/cli/storybook-dist/_stories-src/nx-inputs/NxTextInput.stories.tsx +46 -0
  102. package/cli/storybook-dist/assets/Color-YHDXOIA2-BjuzF3Je.js +1 -0
  103. package/cli/storybook-dist/assets/Docs-BAFZYTMR.js +12 -0
  104. package/cli/storybook-dist/assets/Docs-BQesYW-Q.js +8 -0
  105. package/cli/storybook-dist/assets/Docs-BsMEe093.js +7 -0
  106. package/cli/storybook-dist/assets/Docs-By6k6vcM.js +20 -0
  107. package/cli/storybook-dist/assets/Docs-D1J63cJc.js +7 -0
  108. package/cli/storybook-dist/assets/Docs-GoNbntAU.js +8 -0
  109. package/cli/storybook-dist/assets/DocsRenderer-CFRXHY34-BwY_WiM7.js +2 -0
  110. package/cli/storybook-dist/assets/NxAvatar.stories-CvzBHfYa.js +13 -0
  111. package/cli/storybook-dist/assets/NxButton.stories-B83PesgN.js +20 -0
  112. package/cli/storybook-dist/assets/NxIcons.stories-Ca7qpAaO.js +3 -0
  113. package/cli/storybook-dist/assets/NxNumberInput.stories-DpNcCG6B.js +26 -0
  114. package/cli/storybook-dist/assets/NxPagination.stories-Xnvd3xhH.js +11 -0
  115. package/cli/storybook-dist/assets/NxPointerHoldButton.stories-C3YSIpM0.js +14 -0
  116. package/cli/storybook-dist/assets/NxRangeInput.stories-DIhaNZig.js +17 -0
  117. package/cli/storybook-dist/assets/NxSelectBox.stories-BGwO2mYJ.js +17 -0
  118. package/cli/storybook-dist/assets/NxSlideRange.stories-BXlt5Bgt.js +14 -0
  119. package/cli/storybook-dist/assets/NxSwitch.stories-C5ZqIRtw.js +11 -0
  120. package/cli/storybook-dist/assets/NxTextArea.stories-hm_ycALo.js +11 -0
  121. package/cli/storybook-dist/assets/NxTextInput.stories-DkZAySr_.js +11 -0
  122. package/cli/storybook-dist/assets/PretendardVariable-CJuje-Rk.woff2 +0 -0
  123. package/cli/storybook-dist/assets/RBAccordion.stories--bY36GZY.js +17 -0
  124. package/cli/storybook-dist/assets/RBAccordionGroup.stories-BVr1ccI4.js +33 -0
  125. package/cli/storybook-dist/assets/RBAlert.stories-CkjFBEkv.js +17 -0
  126. package/cli/storybook-dist/assets/RBBadge.stories-CNXILDPh.js +1 -0
  127. package/cli/storybook-dist/assets/RBBattery.stories-AokMv8ZY.js +10 -0
  128. package/cli/storybook-dist/assets/RBCard.stories-CX1sLKB2.js +45 -0
  129. package/cli/storybook-dist/assets/RBCheckBox.stories-By3QHBFm.js +1 -0
  130. package/cli/storybook-dist/assets/RBCheckIconButton.stories-Dud1uK3X.js +1 -0
  131. package/cli/storybook-dist/assets/RBCheckLabelButton.stories-C8iBkZxY.js +24 -0
  132. package/cli/storybook-dist/assets/RBChipTab.stories-DsgbiS2U.js +21 -0
  133. package/cli/storybook-dist/assets/RBChipsBoxTab.stories-C3DZGmq0.js +1 -0
  134. package/cli/storybook-dist/assets/RBColorIcons.stories-CusR20qk.js +3 -0
  135. package/cli/storybook-dist/assets/RBCommand.stories-DhJNgaLZ.js +73 -0
  136. package/cli/storybook-dist/assets/RBConfirm.stories-B6LKpCDa.js +20 -0
  137. package/cli/storybook-dist/assets/RBDateInput.stories-PEEhQ1wJ.js +15 -0
  138. package/cli/storybook-dist/assets/RBDialog.stories-CAtOdRen.js +38 -0
  139. package/cli/storybook-dist/assets/RBDivider.stories-0zpIUlXT.js +1 -0
  140. package/cli/storybook-dist/assets/RBDrawer.stories-CWMG4glY.js +14 -0
  141. package/cli/storybook-dist/assets/RBDropdownMenu.stories-6fbEYZfk.js +86 -0
  142. package/cli/storybook-dist/assets/RBEmptyView.stories-BRDZHjn4.js +12 -0
  143. package/cli/storybook-dist/assets/RBIconButton.stories-sYrRLYob.js +1 -0
  144. package/cli/storybook-dist/assets/RBIcons.stories-DFe8O1_g.js +3 -0
  145. package/cli/storybook-dist/assets/RBInlineLabelButton.stories-DX4VdUfk.js +1 -0
  146. package/cli/storybook-dist/assets/RBJoyStick.stories-SA2Foelf.js +11 -0
  147. package/cli/storybook-dist/assets/RBLabelButton.stories-CicBns_Y.js +1 -0
  148. package/cli/storybook-dist/assets/RBLight.stories-WlP3oEmY.js +1 -0
  149. package/cli/storybook-dist/assets/RBMenuTreeIcons.stories-CrWjPfxj.js +3 -0
  150. package/cli/storybook-dist/assets/RBMenubar.stories-Di4phWw7.js +3 -0
  151. package/cli/storybook-dist/assets/RBMultiRangeInput.stories-DS3wrR3l.js +14 -0
  152. package/cli/storybook-dist/assets/RBPagination.stories-BDVPAUVD.js +17 -0
  153. package/cli/storybook-dist/assets/RBPopover.stories-DL9b_iX9.js +11 -0
  154. package/cli/storybook-dist/assets/RBProgramIcons.stories-ByRVx-on.js +3 -0
  155. package/cli/storybook-dist/assets/RBPrompt.stories-vTmKWyA5.js +20 -0
  156. package/cli/storybook-dist/assets/RBRadioBox.stories-C9WHt4jb.js +1 -0
  157. package/cli/storybook-dist/assets/RBRadioButton.stories-D8KYq63j.js +11 -0
  158. package/cli/storybook-dist/assets/RBRangeDateInput.stories-Bvcf4Su7.js +15 -0
  159. package/cli/storybook-dist/assets/RBResizable.stories-3O2OMuH_.js +20 -0
  160. package/cli/storybook-dist/assets/RBSelectBox.stories-CKZLmPzX.js +6 -0
  161. package/cli/storybook-dist/assets/RBSheet.stories-Dko0It1W.js +39 -0
  162. package/cli/storybook-dist/assets/RBSideNumberInput.stories-CUvqVtId.js +5 -0
  163. package/cli/storybook-dist/assets/RBSlider.stories-CcbaKRYo.js +5 -0
  164. package/cli/storybook-dist/assets/RBSpinner.stories-D15e_JlE.js +14 -0
  165. package/cli/storybook-dist/assets/RBSwitch.stories-C4JRsYJ6.js +65 -0
  166. package/cli/storybook-dist/assets/RBTab.stories-BPvzQSM-.js +1 -0
  167. package/cli/storybook-dist/assets/RBTable.stories-nr8OS1mV.js +62 -0
  168. package/cli/storybook-dist/assets/RBTableRow.stories-rI0rK8Ci.js +11 -0
  169. package/cli/storybook-dist/assets/RBTabs.stories-CxMtHGWA.js +21 -0
  170. package/cli/storybook-dist/assets/RBTextArea.stories-Bru4AhJ3.js +5 -0
  171. package/cli/storybook-dist/assets/RBTextField.stories-Ah3D9lto.js +45 -0
  172. package/cli/storybook-dist/assets/RBTextInput.stories-C3qAVngJ.js +5 -0
  173. package/cli/storybook-dist/assets/RBToast.stories-C1occsvf.js +11 -0
  174. package/cli/storybook-dist/assets/RBToggle.stories-BNrNERc7.js +12 -0
  175. package/cli/storybook-dist/assets/RBToggleGroup.stories-D_RRBwxY.js +17 -0
  176. package/cli/storybook-dist/assets/RBTooltip.stories-DuyOQqrB.js +9 -0
  177. package/cli/storybook-dist/assets/RainbowUiProvider-BYlbsa69.css +1 -0
  178. package/cli/storybook-dist/assets/RainbowUiProvider-B_piZBLb.js +31 -0
  179. package/cli/storybook-dist/assets/browserUtils-DeopUpDy.js +1 -0
  180. package/cli/storybook-dist/assets/chunk-XP5HYGXS-BHXC9YeQ.js +1 -0
  181. package/cli/storybook-dist/assets/client-DTf7SId2.js +1 -0
  182. package/cli/storybook-dist/assets/createConveyorBeltLayer-Cn41pFRH.js +6210 -0
  183. package/cli/storybook-dist/assets/createConveyorBeltLayer-Ds5AOper.css +21 -0
  184. package/cli/storybook-dist/assets/entry-preview-D-mLV0cS.js +2 -0
  185. package/cli/storybook-dist/assets/entry-preview-docs-b8bpVBXy.js +46 -0
  186. package/cli/storybook-dist/assets/iframe-DNru2eN7.js +211 -0
  187. package/cli/storybook-dist/assets/index-B4FGfHer.js +1 -0
  188. package/cli/storybook-dist/assets/index-BRq5TIsn.js +24 -0
  189. package/cli/storybook-dist/assets/index-C1OzuK6-.js +240 -0
  190. package/cli/storybook-dist/assets/index-CT3U1fyk.js +1 -0
  191. package/cli/storybook-dist/assets/index-ChsGqxH_.js +9 -0
  192. package/cli/storybook-dist/assets/index-Cwr2bQOB.js +575 -0
  193. package/cli/storybook-dist/assets/index-DKFBREX_.js +1 -0
  194. package/cli/storybook-dist/assets/index-DgH-xKnr.js +11 -0
  195. package/cli/storybook-dist/assets/index-Dmy2JGbm.js +1 -0
  196. package/cli/storybook-dist/assets/index-DrFu-skq.js +6 -0
  197. package/cli/storybook-dist/assets/jsx-runtime-BTJTZTIL.js +9 -0
  198. package/cli/storybook-dist/assets/keymapTileIndex.worker-BsNYNbqs.js +1 -0
  199. package/cli/storybook-dist/assets/preview-B8lJiyuQ.js +34 -0
  200. package/cli/storybook-dist/assets/preview-BBWR9nbA.js +1 -0
  201. package/cli/storybook-dist/assets/preview-BWzBA1C2.js +396 -0
  202. package/cli/storybook-dist/assets/preview-CILRoSnB.js +1 -0
  203. package/cli/storybook-dist/assets/preview-CVgpLj3b.js +1 -0
  204. package/cli/storybook-dist/assets/preview-CvbIS5ZJ.js +1 -0
  205. package/cli/storybook-dist/assets/preview-DD_OYowb.js +1 -0
  206. package/cli/storybook-dist/assets/preview-DGUiP6tS.js +7 -0
  207. package/cli/storybook-dist/assets/preview-DHQbi4pV.js +1 -0
  208. package/cli/storybook-dist/assets/preview-DUTcCPBe.css +1 -0
  209. package/cli/storybook-dist/assets/preview-QAsoD6Sa.js +2 -0
  210. package/cli/storybook-dist/assets/preview-rcRMbKPr.js +3 -0
  211. package/cli/storybook-dist/assets/react-18-hB3smqWJ.js +1 -0
  212. package/cli/storybook-dist/assets/react-resizable-panels.browser-CvAJUcrm.js +72 -0
  213. package/cli/storybook-dist/assets/test-utils-BQudk2xt.js +9 -0
  214. package/cli/storybook-dist/favicon.svg +1 -0
  215. package/cli/storybook-dist/iframe.html +666 -0
  216. package/cli/storybook-dist/index.html +190 -0
  217. package/cli/storybook-dist/index.json +1 -0
  218. package/cli/storybook-dist/nunito-sans-bold-italic.woff2 +0 -0
  219. package/cli/storybook-dist/nunito-sans-bold.woff2 +0 -0
  220. package/cli/storybook-dist/nunito-sans-italic.woff2 +0 -0
  221. package/cli/storybook-dist/nunito-sans-regular.woff2 +0 -0
  222. package/cli/storybook-dist/project.json +1 -0
  223. package/cli/storybook-dist/sb-addons/chromatic-com-storybook-10/manager-bundle.js +331 -0
  224. package/cli/storybook-dist/sb-addons/chromatic-com-storybook-10/manager-bundle.js.LEGAL.txt +51 -0
  225. package/cli/storybook-dist/sb-addons/essentials-actions-3/manager-bundle.js +3 -0
  226. package/cli/storybook-dist/sb-addons/essentials-backgrounds-5/manager-bundle.js +12 -0
  227. package/cli/storybook-dist/sb-addons/essentials-controls-2/manager-bundle.js +405 -0
  228. package/cli/storybook-dist/sb-addons/essentials-docs-4/manager-bundle.js +245 -0
  229. package/cli/storybook-dist/sb-addons/essentials-measure-8/manager-bundle.js +3 -0
  230. package/cli/storybook-dist/sb-addons/essentials-outline-9/manager-bundle.js +3 -0
  231. package/cli/storybook-dist/sb-addons/essentials-toolbars-7/manager-bundle.js +3 -0
  232. package/cli/storybook-dist/sb-addons/essentials-viewport-6/manager-bundle.js +3 -0
  233. package/cli/storybook-dist/sb-addons/links-1/manager-bundle.js +3 -0
  234. package/cli/storybook-dist/sb-addons/storybook-13/manager-bundle.js +3 -0
  235. package/cli/storybook-dist/sb-addons/storybook-core-core-server-presets-0/common-manager-bundle.js +3 -0
  236. package/cli/storybook-dist/sb-addons/storybook-experimental-addon-test-12/manager-bundle.js +223 -0
  237. package/cli/storybook-dist/sb-addons/themes-11/manager-bundle.js +3 -0
  238. package/cli/storybook-dist/sb-common-assets/favicon.svg +1 -0
  239. package/cli/storybook-dist/sb-common-assets/nunito-sans-bold-italic.woff2 +0 -0
  240. package/cli/storybook-dist/sb-common-assets/nunito-sans-bold.woff2 +0 -0
  241. package/cli/storybook-dist/sb-common-assets/nunito-sans-italic.woff2 +0 -0
  242. package/cli/storybook-dist/sb-common-assets/nunito-sans-regular.woff2 +0 -0
  243. package/cli/storybook-dist/sb-manager/globals-module-info.js +1052 -0
  244. package/cli/storybook-dist/sb-manager/globals-runtime.js +41775 -0
  245. package/cli/storybook-dist/sb-manager/globals.js +48 -0
  246. package/cli/storybook-dist/sb-manager/runtime.js +12048 -0
  247. package/cli/templates/common/.mcp.json +8 -0
  248. package/cli/templates/common/README.md +817 -9
  249. package/cli/templates/common/assets/icon.svg +44 -2
  250. package/cli/templates/common/manifest.json +13 -13
  251. package/cli/templates/common/package.json +9 -11
  252. package/cli/templates/common/py/main.py +98 -0
  253. package/cli/templates/common/requirements.txt +4 -3
  254. package/cli/templates/common/tsconfig.json +1 -1
  255. package/cli/templates/common/ui/content.tsx +216 -0
  256. package/cli/templates/common/ui/style.css +6 -0
  257. package/cli/templates/common/vite.config.ts +6 -25
  258. package/cli/templates/cpp/cpp/CMakeLists.txt +14 -0
  259. package/cli/templates/cpp/cpp/main.cpp +26 -0
  260. package/cli/templates/ros2/ros2_ws/src/__PLUGIN_SLUG__/__PLUGIN_SLUG__/node.py +5 -0
  261. package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/CMakeLists.txt +17 -0
  262. package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/package.xml +11 -0
  263. package/cli/templates/ros2-cpp/ros2_ws/src/__PLUGIN_SLUG__/src/node.cpp +22 -0
  264. package/cli/vite.d.mts +25 -0
  265. package/cli/vite.mjs +281 -0
  266. package/package.json +32 -5
  267. package/cli/src/pack.mjs +0 -61
  268. package/cli/templates/common/main.py +0 -21
  269. package/cli/templates/common/src/content.tsx +0 -32
package/cli/vite.mjs ADDED
@@ -0,0 +1,281 @@
1
+ import react from "@vitejs/plugin-react";
2
+ import cssInjectedByJsPlugin from "vite-plugin-css-injected-by-js";
3
+ import postcss from "postcss";
4
+ import { createRequire } from "node:module";
5
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
6
+ import { basename, extname, resolve } from "node:path";
7
+
8
+
9
+ const HOST_PROVIDED_EXTERNALS = [
10
+ /^react(\/.*)?$/,
11
+ /^react-dom(\/.*)?$/,
12
+ /^@rainbow-robotics\/plugin-ui(\/.*)?$/,
13
+ /^@repo\/rb-components(\/.*)?$/,
14
+ ];
15
+
16
+ const UI_ENTRY_PREFIX = "muscat-ui-entry:";
17
+ const RESOLVED_UI_ENTRY_PREFIX = "\0" + UI_ENTRY_PREFIX;
18
+ const SHARED_RUNTIME_PREFIX = "muscat-shared-runtime:";
19
+ const RESOLVED_SHARED_RUNTIME_PREFIX = "\0" + SHARED_RUNTIME_PREFIX;
20
+ const STYLE_EXTENSIONS = [".css", ".scss", ".sass", ".less"];
21
+ // `@rainbow-robotics/plugin-ui/react` ships transpiled-only (see
22
+ // build-dist.mjs: `bundle: false, // consumers resolve deps themselves") — its
23
+ // `export * from "@repo/rb-components/new_components"` is a monorepo-private
24
+ // package no external plugin can npm-install. So a "dev" plugin can't use its
25
+ // own local copy of plugin-ui/react (or /sdk, whose RbContext must stay one
26
+ // singleton with host.tsx's Provider) — these, plus react/react-dom itself
27
+ // (so elements created by rb-components match the instance rendering them)
28
+ // and host-ui (the plain-function toast/alert/confirm/prompt channel), all
29
+ // redirect to the host's already-loaded instances instead.
30
+ const SHARED_RUNTIME_FILES = {
31
+ react: "react",
32
+ "react/jsx-runtime": "react_jsx-runtime",
33
+ "react/jsx-dev-runtime": "react_jsx-dev-runtime",
34
+ "react-dom": "react-dom",
35
+ "react-dom/client": "react-dom_client",
36
+ "@rainbow-robotics/plugin-ui/react": "plugin-ui_react",
37
+ "@rainbow-robotics/plugin-ui/sdk": "plugin-ui_sdk",
38
+ "@rainbow-robotics/plugin-ui/host-ui": "plugin-ui_host-ui",
39
+ "@rainbow-robotics/plugin-ui/ws": "plugin-ui_ws",
40
+ };
41
+
42
+ function cssString(value) {
43
+ return String(value).replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\a ");
44
+ }
45
+
46
+ function readPluginId(root) {
47
+ try {
48
+ const manifest = JSON.parse(readFileSync(resolve(root, "manifest.json"), "utf8"));
49
+ return typeof manifest.id === "string" && manifest.id ? manifest.id : null;
50
+ } catch {
51
+ return null;
52
+ }
53
+ }
54
+
55
+ function pluginScopeSelector(pluginId) {
56
+ if (!pluginId) return ":where([data-muscat-plugin-root])";
57
+ return `:where([data-muscat-plugin-id="${cssString(pluginId)}"])`;
58
+ }
59
+
60
+ function discoverUiEntries(uiDir) {
61
+ return Object.fromEntries(
62
+ readdirSync(uiDir)
63
+ .filter((f) => /\.(tsx?|jsx?)$/.test(f))
64
+ .map((f) => [basename(f, extname(f)), resolve(uiDir, f)]),
65
+ );
66
+ }
67
+
68
+ function discoverUiStyles(uiDir, entryName) {
69
+ return STYLE_EXTENSIONS.flatMap((ext) => [
70
+ resolve(uiDir, `style${ext}`),
71
+ resolve(uiDir, `styles${ext}`),
72
+ resolve(uiDir, `${entryName}${ext}`),
73
+ ]).filter((file, index, files) => existsSync(file) && files.indexOf(file) === index);
74
+ }
75
+
76
+ function isKeyframesRule(rule) {
77
+ for (let node = rule.parent; node; node = node.parent) {
78
+ if (node.type === "atrule" && /keyframes$/i.test(node.name)) return true;
79
+ }
80
+ return false;
81
+ }
82
+
83
+ function scopeSelector(selector, rootSelector) {
84
+ const trimmed = selector.trim();
85
+ if (
86
+ !trimmed ||
87
+ trimmed.includes("[data-muscat-plugin-root]") ||
88
+ trimmed.includes("[data-muscat-plugin-id")
89
+ ) {
90
+ return selector;
91
+ }
92
+ if (/^(:root|:host)\b/.test(trimmed)) {
93
+ return trimmed.replace(/^(:root|:host)\b/, rootSelector);
94
+ }
95
+ if (/^(html|body)\b/.test(trimmed)) {
96
+ return trimmed.replace(/^(html|body)\b/, rootSelector);
97
+ }
98
+ return `${rootSelector} ${trimmed}`;
99
+ }
100
+
101
+ function scopePluginCss(css, rootSelector) {
102
+ if (!css.trim()) return css;
103
+ const root = postcss.parse(css);
104
+ root.walkRules((rule) => {
105
+ if (isKeyframesRule(rule)) return;
106
+ rule.selectors = rule.selectors.map((selector) => scopeSelector(selector, rootSelector));
107
+ });
108
+ return root.toString();
109
+ }
110
+
111
+ function createUiEntryPlugin(uiDir, entries) {
112
+ return {
113
+ name: "muscat-ui-entry",
114
+ enforce: "pre",
115
+ resolveId(id) {
116
+ if (id.startsWith(UI_ENTRY_PREFIX)) return "\0" + id;
117
+ },
118
+ load(id) {
119
+ if (!id.startsWith(RESOLVED_UI_ENTRY_PREFIX)) return;
120
+ const entryName = id.slice(RESOLVED_UI_ENTRY_PREFIX.length);
121
+ const entry = entries[entryName];
122
+ if (!entry) throw new Error(`Unknown Muscat UI entry: ${entryName}`);
123
+
124
+ const styleImports = discoverUiStyles(uiDir, entryName)
125
+ .map((file) => {
126
+ this.addWatchFile(file);
127
+ return `import ${JSON.stringify(file)};`;
128
+ })
129
+ .join("\n");
130
+
131
+ return `${styleImports}\nexport { default } from ${JSON.stringify(entry)};\n`;
132
+ },
133
+ };
134
+ }
135
+
136
+ function resolveFromPlugin(root, specifier) {
137
+ try {
138
+ return createRequire(resolve(root, "package.json")).resolve(specifier);
139
+ } catch {
140
+ return null;
141
+ }
142
+ }
143
+
144
+ function exactSpecifier(specifier) {
145
+ return new RegExp(`^${specifier.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}$`);
146
+ }
147
+
148
+ function reactAliases(root) {
149
+ return [
150
+ "react",
151
+ "react/jsx-runtime",
152
+ "react/jsx-dev-runtime",
153
+ "react-dom",
154
+ "react-dom/client",
155
+ ].flatMap((specifier) => {
156
+ const resolved = resolveFromPlugin(root, specifier);
157
+ return resolved ? [{ find: exactSpecifier(specifier), replacement: resolved }] : [];
158
+ });
159
+ }
160
+
161
+ function createSharedRuntimePlugin(baseUrl) {
162
+ const base = baseUrl.replace(/\/$/, "");
163
+
164
+ return {
165
+ name: "muscat-shared-runtime",
166
+ enforce: "pre",
167
+ resolveId(id) {
168
+ if (id in SHARED_RUNTIME_FILES) return "\0" + SHARED_RUNTIME_PREFIX + id;
169
+ },
170
+ load(id) {
171
+ if (!id.startsWith(RESOLVED_SHARED_RUNTIME_PREFIX)) return;
172
+ const specifier = id.slice(RESOLVED_SHARED_RUNTIME_PREFIX.length);
173
+ const file = SHARED_RUNTIME_FILES[specifier];
174
+ if (!file) throw new Error(`Unknown Muscat shared runtime module: ${specifier}`);
175
+
176
+ const url = JSON.stringify(`${base}/${file}.js`);
177
+ if (specifier === "react" || specifier === "react-dom") {
178
+ return `export * from ${url};\nimport sharedDefault from ${url};\nexport default sharedDefault;\n`;
179
+ }
180
+ return `export * from ${url};\n`;
181
+ },
182
+ };
183
+ }
184
+
185
+ const REACT_REFRESH_ACCEPT_MARKER =
186
+ "\nif (import.meta.hot && !inWebWorker) {\n RefreshRuntime.__hmr_import(import.meta.url).then((currentExports) => {";
187
+
188
+ function createManualHmrBoundaryPlugin(uiDir) {
189
+ const normalizedUiDir = uiDir.replace(/\/$/, "");
190
+
191
+ return {
192
+ name: "muscat-manual-hmr-boundary",
193
+ apply: "serve",
194
+ enforce: "post",
195
+ transform(code, id) {
196
+ const [file] = id.split("?");
197
+ if (!file.startsWith(`${normalizedUiDir}/`) || !/\.[jt]sx?$/.test(file)) return null;
198
+
199
+ const markerIndex = code.lastIndexOf(REACT_REFRESH_ACCEPT_MARKER);
200
+ if (markerIndex === -1) return null;
201
+
202
+ // preview-host provides the same production ReactDOM as Nexus. Vite's
203
+ // React Fast Refresh receives updates but cannot drive that renderer, so
204
+ // let the bootstrap module handle HMR by re-rendering the updated entry.
205
+ return { code: code.slice(0, markerIndex), map: null };
206
+ },
207
+ };
208
+ }
209
+
210
+ export function muscat(options = {}) {
211
+ const pluginRoot = process.cwd();
212
+ const uiDir = resolve(pluginRoot, "ui");
213
+ const entries = discoverUiEntries(uiDir);
214
+ const rootSelector = pluginScopeSelector(readPluginId(pluginRoot));
215
+ const sharedRuntimeBase = process.env.MUSCAT_PLUGIN_SHARED_RUNTIME_BASE;
216
+ const wrappedEntries = Object.fromEntries(
217
+ Object.keys(entries).map((name) => [name, `${UI_ENTRY_PREFIX}${name}`]),
218
+ );
219
+ const reactPlugins = options.react === false ? [] : [react(options.react)];
220
+
221
+ return [
222
+ ...reactPlugins,
223
+ createUiEntryPlugin(uiDir, entries),
224
+ ...(sharedRuntimeBase ? [createSharedRuntimePlugin(sharedRuntimeBase)] : []),
225
+ ...(sharedRuntimeBase ? [createManualHmrBoundaryPlugin(uiDir)] : []),
226
+ cssInjectedByJsPlugin({
227
+ relativeCSSInjection: true,
228
+ preRenderCSSCode: (css) => scopePluginCss(css, rootSelector),
229
+ }),
230
+ {
231
+ name: "muscat-plugin-build",
232
+ apply: "build",
233
+ config: () => ({
234
+ build: {
235
+ target: "esnext",
236
+ outDir: "dist",
237
+ emptyOutDir: false,
238
+ rollupOptions: {
239
+ input: wrappedEntries,
240
+ external: HOST_PROVIDED_EXTERNALS,
241
+ // Entries only `export default App` (the host mounts it). Without
242
+ // this, Vite treats entries as self-executing apps and tree-shakes
243
+ // the unused default export away.
244
+ preserveEntrySignatures: "strict",
245
+ output: {
246
+ format: "es",
247
+ entryFileNames: "[name].js",
248
+ chunkFileNames: "chunks/[name]-[hash].js",
249
+ assetFileNames: "assets/[name]-[hash][extname]",
250
+ },
251
+ },
252
+ },
253
+ }),
254
+ },
255
+ {
256
+ name: "muscat-plugin-dev",
257
+ apply: "serve",
258
+ config: () => {
259
+ return {
260
+ resolve: {
261
+ alias: sharedRuntimeBase ? [] : reactAliases(pluginRoot),
262
+ dedupe: ["react", "react-dom"],
263
+ },
264
+ optimizeDeps: sharedRuntimeBase
265
+ ? { noDiscovery: true, include: [] }
266
+ : {
267
+ include: [
268
+ "react",
269
+ "react-dom",
270
+ "react-dom/client",
271
+ "@rainbow-robotics/plugin-ui/react",
272
+ "@rainbow-robotics/plugin-ui/sdk",
273
+ "@rainbow-robotics/plugin-ui/host-ui",
274
+ "@rainbow-robotics/plugin-ui/ws",
275
+ ],
276
+ },
277
+ };
278
+ },
279
+ },
280
+ ];
281
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rainbow-robotics/muscat-plugin-kit",
3
- "version": "0.1.2-dev.5",
3
+ "version": "0.1.2-dev.50",
4
4
  "type": "module",
5
5
  "engines": {
6
6
  "node": ">=20"
@@ -13,6 +13,25 @@
13
13
  "create-muscat-plugin": "./cli/bin/create-muscat-plugin.mjs",
14
14
  "muscat-pk": "./cli/bin/muscat-pk.mjs"
15
15
  },
16
+ "exports": {
17
+ "./vite": {
18
+ "types": "./cli/vite.d.mts",
19
+ "default": "./cli/vite.mjs"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "peerDependencies": {
24
+ "@vitejs/plugin-react": ">=4",
25
+ "vite": ">=5"
26
+ },
27
+ "peerDependenciesMeta": {
28
+ "@vitejs/plugin-react": {
29
+ "optional": true
30
+ },
31
+ "vite": {
32
+ "optional": true
33
+ }
34
+ },
16
35
  "files": [
17
36
  "cli",
18
37
  "package.json"
@@ -20,7 +39,9 @@
20
39
  "scripts": {
21
40
  "lint": "node cli/src/check-package.mjs",
22
41
  "check": "node cli/src/check-package.mjs",
23
- "check-types": "node cli/src/check-package.mjs"
42
+ "check-types": "node cli/src/check-package.mjs",
43
+ "storybook:build": "node cli/prepack.mjs",
44
+ "prepack": "node cli/prepack.mjs"
24
45
  },
25
46
  "devDependencies": {
26
47
  "@eslint/js": "^9.22.0",
@@ -31,10 +52,16 @@
31
52
  "@types/react-dom": "^19.0.4"
32
53
  },
33
54
  "dependencies": {
34
- "@rainbow-robotics/preview-host": "*",
35
- "esbuild": "^0.25.0"
55
+ "@modelcontextprotocol/sdk": "^1.29.0",
56
+ "@rainbow-robotics/plugin-ui": "0.1.2-dev.50",
57
+ "@rainbow-robotics/preview-host": "0.1.2-dev.50",
58
+ "postcss": "^8.5.8",
59
+ "socket.io": "^4.8.1",
60
+ "typescript": "^5.8.0",
61
+ "vite-plugin-css-injected-by-js": "^3.5.2",
62
+ "zod": "^3.25.0"
36
63
  },
37
64
  "optionalDependencies": {
38
65
  "esbuild-wasm": "^0.25.0"
39
66
  }
40
- }
67
+ }
package/cli/src/pack.mjs DELETED
@@ -1,61 +0,0 @@
1
- // muscat-pk pack — build, then create a distributable ZIP with a size report.
2
- import { execSync } from "node:child_process";
3
- import { existsSync, readFileSync, readdirSync, rmSync, statSync } from "node:fs";
4
- import { basename, resolve } from "node:path";
5
- import { buildPlugin, exportRos2Build, pinRequirements } from "./build.mjs";
6
- import { findPluginRoot, humanSize, log } from "./util.mjs";
7
-
8
- function dirSize(dir) {
9
- let total = 0;
10
- for (const entry of readdirSync(dir)) {
11
- const full = resolve(dir, entry);
12
- const st = statSync(full);
13
- total += st.isDirectory() ? dirSize(full) : st.size;
14
- }
15
- return total;
16
- }
17
-
18
- export async function runPack() {
19
- const pluginRoot = findPluginRoot();
20
- log.step("pinning requirements.txt to latest PyPI versions");
21
- await pinRequirements(pluginRoot);
22
- await buildPlugin({ root: pluginRoot, minify: true });
23
- await exportRos2Build(pluginRoot);
24
-
25
- const manifest = JSON.parse(
26
- readFileSync(resolve(pluginRoot, "manifest.json"), "utf8"),
27
- );
28
- const zipName = `${basename(pluginRoot)}-${manifest.version || "0.0.0"}.zip`;
29
- const zipPath = resolve(pluginRoot, zipName);
30
- rmSync(zipPath, { force: true });
31
-
32
- // Contents: dist/ + back-end files if present.
33
- const entries = ["dist"];
34
- for (const f of ["main.py", "requirements.txt"]) {
35
- if (existsSync(resolve(pluginRoot, f))) entries.push(f);
36
- }
37
- if (existsSync(resolve(pluginRoot, "ros2_ws/install"))) {
38
- entries.push("ros2_ws/install");
39
- }
40
-
41
- log.step(`packing ${entries.join(", ")} → ${zipName}`);
42
- try {
43
- execSync(`zip -r -q "${zipPath}" ${entries.map((e) => `"${e}"`).join(" ")}`, {
44
- cwd: pluginRoot,
45
- stdio: "inherit",
46
- });
47
- } catch {
48
- throw new Error("`zip` not found. Install zip or pack manually.");
49
- }
50
-
51
- const zipBytes = statSync(zipPath).size;
52
- log.ok(`${zipName} ${humanSize(zipBytes)}`);
53
- for (const e of entries) {
54
- const full = resolve(pluginRoot, e);
55
- const size = statSync(full).isDirectory() ? dirSize(full) : statSync(full).size;
56
- log.info(` ├─ ${e} ${humanSize(size)}`);
57
- }
58
- log.warn(
59
- "robot install checks free space via GET /plugin/capacity (507 if low).",
60
- );
61
- }
@@ -1,21 +0,0 @@
1
- import asyncio
2
-
3
- from rb_sdk import RBManipulateSDK # PyPI: rainbow-rb-sdk
4
-
5
- sdk = RBManipulateSDK()
6
-
7
-
8
- async def on_action(payload: dict):
9
- # Matches manifest.actions[].topic — handle the "grip" action here.
10
- width = payload.get("width")
11
- print(f"[__PLUGIN_NAME__] grip width={width}")
12
- # TODO: drive the robot via the SDK.
13
-
14
-
15
- async def main():
16
- await sdk.subscribe("rby2/plugin/__PLUGIN_ID__/grip", on_action)
17
- await sdk.spin()
18
-
19
-
20
- if __name__ == "__main__":
21
- asyncio.run(main())
@@ -1,32 +0,0 @@
1
- import { useState } from "react";
2
- import { connect } from "@rainbow-robotics/plugin-ui/connect";
3
- import { Slider, Button, Text, Switch, useRb } from "@rainbow-robotics/plugin-ui/react";
4
-
5
- function App() {
6
- const rb = useRb();
7
- const [width, setWidth] = useState(20);
8
- const [open, setOpen] = useState(false);
9
-
10
- return (
11
- <>
12
- <Text>__PLUGIN_NAME__ width: {width}</Text>
13
- <Slider
14
- value={width}
15
- min={0}
16
- max={100}
17
- onChange={(event: { detail?: number }) => setWidth(event.detail ?? 0)}
18
- />
19
- <Button label="Grip" onPress={() => rb.action("grip", { width })} />
20
- <Switch
21
- checked={open}
22
- onChange={(event: { detail?: boolean }) => {
23
- const next = event.detail ?? false;
24
- setOpen(next);
25
- rb.notify(next ? "opened" : "closed", "info");
26
- }}
27
- />
28
- </>
29
- );
30
- }
31
-
32
- connect(App);