@1agh/maude 0.28.1 → 0.29.0

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 (339) hide show
  1. package/README.md +2 -2
  2. package/{plugins/design/dev-server → apps/studio}/ai-banner.tsx +1 -1
  3. package/{plugins/design/dev-server → apps/studio}/annotations-context-toolbar.tsx +285 -5
  4. package/{plugins/design/dev-server → apps/studio}/annotations-layer.tsx +1206 -119
  5. package/{plugins/design/dev-server → apps/studio}/api.ts +486 -32
  6. package/{plugins/design/dev-server → apps/studio}/artboard-activity-overlay.tsx +1 -1
  7. package/{plugins/design/dev-server → apps/studio}/artboard-marquee.tsx +1 -1
  8. package/apps/studio/bin/_motion-sample-playwright.mjs +129 -0
  9. package/{plugins/design/dev-server → apps/studio}/bin/canvas-edit.sh +1 -1
  10. package/{plugins/design/dev-server → apps/studio}/bin/draw-proof.sh +37 -2
  11. package/{plugins/design/dev-server → apps/studio}/bin/preflight.sh +1 -1
  12. package/apps/studio/bin/read-annotations.mjs +438 -0
  13. package/apps/studio/bin/read-annotations.sh +11 -0
  14. package/{plugins/design/dev-server → apps/studio}/bin/runtime-health.sh +1 -1
  15. package/{plugins/design/dev-server → apps/studio}/bin/screenshot.sh +62 -2
  16. package/{plugins/design/dev-server → apps/studio}/bin/server-up.sh +9 -3
  17. package/apps/studio/bin/to-lottie-verify.html +68 -0
  18. package/apps/studio/bin/to-lottie.sh +128 -0
  19. package/{plugins/design/dev-server → apps/studio}/build.ts +5 -3
  20. package/{plugins/design/dev-server → apps/studio}/canvas-arrowheads.ts +1 -1
  21. package/{plugins/design/dev-server → apps/studio}/canvas-comment-mount.tsx +1 -1
  22. package/apps/studio/canvas-create.ts +104 -0
  23. package/{plugins/design/dev-server → apps/studio}/canvas-cursors.ts +46 -12
  24. package/{plugins/design/dev-server → apps/studio}/canvas-icons.tsx +60 -1
  25. package/{plugins/design/dev-server → apps/studio}/canvas-lib-inline.ts +1 -1
  26. package/{plugins/design/dev-server → apps/studio}/canvas-lib-resolver.ts +1 -1
  27. package/{plugins/design/dev-server → apps/studio}/canvas-lib.tsx +31 -12
  28. package/{plugins/design/dev-server → apps/studio}/canvas-shell.tsx +56 -41
  29. package/{plugins/design/dev-server → apps/studio}/client/app.jsx +1713 -530
  30. package/apps/studio/client/canvas-url.js +81 -0
  31. package/{plugins/design/dev-server → apps/studio}/client/comments-overlay.css +41 -27
  32. package/{plugins/design/dev-server → apps/studio}/client/index.html +2 -1
  33. package/apps/studio/client/styles/1-tokens-maude.css +296 -0
  34. package/apps/studio/client/styles/3-shell-maude.css +459 -0
  35. package/{plugins/design/dev-server → apps/studio}/client/styles/3-shell.css +129 -0
  36. package/apps/studio/client/styles/4-components-maude.css +74 -0
  37. package/{plugins/design/dev-server → apps/studio}/client/styles/4-components.css +357 -34
  38. package/apps/studio/client/styles/5-maude-overrides.css +123 -0
  39. package/{plugins/design/dev-server → apps/studio}/client/styles/_index.css +9 -0
  40. package/{plugins/design/dev-server → apps/studio}/client/styles.css +1 -1
  41. package/apps/studio/client/tour/overlay.jsx +191 -0
  42. package/apps/studio/client/tour/usage-tour.js +35 -0
  43. package/apps/studio/client/whats-new-seen.js +52 -0
  44. package/apps/studio/client/whats-new.jsx +250 -0
  45. package/{plugins/design/dev-server → apps/studio}/commands/annotation-strokes-command.ts +1 -1
  46. package/{plugins/design/dev-server → apps/studio}/commands/equal-spacing-command.ts +1 -1
  47. package/{plugins/design/dev-server → apps/studio}/commands/move-artboards-command.ts +1 -1
  48. package/{plugins/design/dev-server → apps/studio}/comments-overlay.tsx +25 -6
  49. package/{plugins/design/dev-server → apps/studio}/context-menu.tsx +1 -1
  50. package/{plugins/design/dev-server → apps/studio}/contextual-toolbar.tsx +4 -7
  51. package/{plugins/design/dev-server → apps/studio}/cursors-overlay.tsx +1 -1
  52. package/apps/studio/dist/client.bundle.js +22825 -0
  53. package/apps/studio/dist/comment-mount.js +1960 -0
  54. package/apps/studio/dist/styles.css +5695 -0
  55. package/{plugins/design/dev-server → apps/studio}/dom-selection.ts +75 -4
  56. package/apps/studio/draw/animate.ts +333 -0
  57. package/{plugins/design/dev-server → apps/studio}/draw/brush.ts +1 -1
  58. package/{plugins/design/dev-server → apps/studio}/draw/composition.ts +1 -1
  59. package/{plugins/design/dev-server → apps/studio}/draw/geometry.ts +1 -1
  60. package/{plugins/design/dev-server → apps/studio}/draw/index.ts +4 -1
  61. package/{plugins/design/dev-server → apps/studio}/draw/layout.ts +1 -1
  62. package/apps/studio/draw/morph.ts +204 -0
  63. package/{plugins/design/dev-server → apps/studio}/draw/optimize.ts +1 -1
  64. package/{plugins/design/dev-server → apps/studio}/draw/palette.ts +1 -1
  65. package/{plugins/design/dev-server → apps/studio}/draw/primitives.ts +1 -1
  66. package/apps/studio/draw/serialize-animate.ts +324 -0
  67. package/{plugins/design/dev-server → apps/studio}/draw/serialize.ts +9 -3
  68. package/apps/studio/draw/test/animate.test.ts +172 -0
  69. package/apps/studio/draw/test/morph.test.ts +107 -0
  70. package/apps/studio/draw/test/serialize-animate.test.ts +142 -0
  71. package/{plugins/design/dev-server → apps/studio}/equal-spacing-detector.ts +1 -1
  72. package/{plugins/design/dev-server → apps/studio}/equal-spacing-handles.tsx +7 -29
  73. package/{plugins/design/dev-server → apps/studio}/export-dialog.tsx +13 -1
  74. package/{plugins/design/dev-server → apps/studio}/http.ts +102 -1
  75. package/{plugins/design/dev-server → apps/studio}/input-router.tsx +8 -1
  76. package/{plugins/design/dev-server → apps/studio}/inspect.ts +20 -3
  77. package/{plugins/design/dev-server → apps/studio}/marquee-overlay.tsx +5 -2
  78. package/{plugins/design/dev-server → apps/studio}/participants-chrome.tsx +1 -1
  79. package/{plugins/design/dev-server → apps/studio}/paths.ts +15 -11
  80. package/{plugins/design/dev-server → apps/studio}/server.ts +18 -0
  81. package/{plugins/design/dev-server → apps/studio}/sync/index.ts +1 -1
  82. package/{plugins/design/dev-server → apps/studio}/test/annotations-layer.test.ts +63 -0
  83. package/{plugins/design/dev-server → apps/studio}/test/annotations-roundtrip.test.ts +97 -0
  84. package/apps/studio/test/annotations-text-format.test.ts +396 -0
  85. package/apps/studio/test/asset-api.test.ts +149 -0
  86. package/apps/studio/test/canvas-create-api.test.ts +361 -0
  87. package/{plugins/design/dev-server → apps/studio}/test/canvas-cursors.test.ts +2 -0
  88. package/{plugins/design/dev-server → apps/studio}/test/canvas-lib-resolver.test.ts +1 -1
  89. package/apps/studio/test/canvas-media-drop.test.ts +158 -0
  90. package/{plugins/design/dev-server → apps/studio}/test/canvas-origin-gate.test.ts +17 -1
  91. package/apps/studio/test/canvas-url.test.ts +99 -0
  92. package/apps/studio/test/index-data-canvas-ds.test.ts +97 -0
  93. package/apps/studio/test/motion-sample.test.ts +35 -0
  94. package/{plugins/design/dev-server → apps/studio}/test/perf-harness.ts +1 -1
  95. package/{plugins/design/dev-server → apps/studio}/test/phase-3.6-smoke.test.ts +3 -1
  96. package/apps/studio/test/read-annotations.test.ts +409 -0
  97. package/{plugins/design/dev-server → apps/studio}/test/sanitize-annotation-svg.test.ts +108 -2
  98. package/{plugins/design/dev-server → apps/studio}/test/shared-doc-convergence.test.ts +1 -1
  99. package/apps/studio/test/tour-overlay.test.tsx +56 -0
  100. package/{plugins/design/dev-server → apps/studio}/test/use-annotation-resize.test.ts +43 -0
  101. package/{plugins/design/dev-server → apps/studio}/test/use-tool-mode.test.tsx +4 -1
  102. package/apps/studio/test/whats-new.test.ts +101 -0
  103. package/apps/studio/text-imports.d.ts +9 -0
  104. package/{plugins/design/dev-server → apps/studio}/tool-palette.tsx +4 -69
  105. package/{plugins/design/dev-server → apps/studio}/undo-hud.tsx +1 -1
  106. package/{plugins/design/dev-server → apps/studio}/undo-stack.ts +1 -1
  107. package/{plugins/design/dev-server → apps/studio}/use-agent-presence.tsx +1 -1
  108. package/{plugins/design/dev-server → apps/studio}/use-annotation-resize.tsx +40 -7
  109. package/{plugins/design/dev-server → apps/studio}/use-annotation-selection.tsx +1 -1
  110. package/{plugins/design/dev-server → apps/studio}/use-annotations-visibility.tsx +1 -1
  111. package/{plugins/design/dev-server → apps/studio}/use-artboard-drag.tsx +1 -1
  112. package/{plugins/design/dev-server → apps/studio}/use-canvas-activity.tsx +1 -1
  113. package/apps/studio/use-canvas-media-drop.tsx +343 -0
  114. package/{plugins/design/dev-server → apps/studio}/use-collab.tsx +1 -1
  115. package/{plugins/design/dev-server → apps/studio}/use-cursor-modifiers.tsx +1 -1
  116. package/{plugins/design/dev-server → apps/studio}/use-keyboard-discipline.tsx +5 -2
  117. package/{plugins/design/dev-server → apps/studio}/use-selection-set.tsx +9 -1
  118. package/{plugins/design/dev-server → apps/studio}/use-snap-guides.tsx +1 -1
  119. package/{plugins/design/dev-server → apps/studio}/use-tool-mode.tsx +3 -1
  120. package/{plugins/design/dev-server → apps/studio}/use-undo-stack.tsx +1 -1
  121. package/apps/studio/whats-new.json +139 -0
  122. package/apps/studio/whats-new.schema.json +70 -0
  123. package/apps/studio/whats-new.ts +87 -0
  124. package/cli/bin/maude.mjs +10 -0
  125. package/cli/commands/design.mjs +15 -7
  126. package/cli/commands/design.test.mjs +36 -0
  127. package/cli/commands/help.mjs +8 -2
  128. package/cli/commands/hub.mjs +3 -3
  129. package/cli/commands/hub.test.mjs +1 -1
  130. package/cli/commands/scenario-report.mjs +2 -9
  131. package/cli/lib/flow-design-integration.test.mjs +1 -1
  132. package/cli/lib/gitignore-block.mjs +1 -0
  133. package/cli/lib/plugin-cli-reachability.test.mjs +8 -7
  134. package/cli/lib/preflight.mjs +1 -1
  135. package/package.json +15 -15
  136. package/plugins/design/templates/brief-board.tsx.template +61 -0
  137. package/plugins/design/templates/canvas.tsx.template +1 -1
  138. package/plugins/design/templates/design-system-inspiration/core/config.json.tpl +1 -1
  139. package/plugins/design/templates/design-system-inspiration/core/preview/_motion-readme.md.tpl +1 -1
  140. package/plugins/flow/.claude-plugin/config.schema.json +16 -0
  141. package/plugins/design/dev-server/dist/client.bundle.js +0 -20692
  142. package/plugins/design/dev-server/dist/comment-mount.js +0 -1924
  143. package/plugins/design/dev-server/dist/styles.css +0 -2710
  144. /package/{plugins/design/dev-server → apps/studio}/activity.ts +0 -0
  145. /package/{plugins/design/dev-server → apps/studio}/bin/_enumerate-artboards-playwright.mjs +0 -0
  146. /package/{plugins/design/dev-server → apps/studio}/bin/_html-playwright.mjs +0 -0
  147. /package/{plugins/design/dev-server → apps/studio}/bin/_pdf-playwright.mjs +0 -0
  148. /package/{plugins/design/dev-server → apps/studio}/bin/_png-playwright.mjs +0 -0
  149. /package/{plugins/design/dev-server → apps/studio}/bin/_pptx-playwright.mjs +0 -0
  150. /package/{plugins/design/dev-server → apps/studio}/bin/_pw-launch.mjs +0 -0
  151. /package/{plugins/design/dev-server → apps/studio}/bin/_screenshot-playwright.mjs +0 -0
  152. /package/{plugins/design/dev-server → apps/studio}/bin/_svg-optimize.mjs +0 -0
  153. /package/{plugins/design/dev-server → apps/studio}/bin/_svg-playwright.mjs +0 -0
  154. /package/{plugins/design/dev-server → apps/studio}/bin/asset-sweep.sh +0 -0
  155. /package/{plugins/design/dev-server → apps/studio}/bin/bootstrap-check.sh +0 -0
  156. /package/{plugins/design/dev-server → apps/studio}/bin/check-runtime-bundles.sh +0 -0
  157. /package/{plugins/design/dev-server → apps/studio}/bin/draw-build.sh +0 -0
  158. /package/{plugins/design/dev-server → apps/studio}/bin/handoff.sh +0 -0
  159. /package/{plugins/design/dev-server → apps/studio}/bin/prep.sh +0 -0
  160. /package/{plugins/design/dev-server → apps/studio}/bin/scenario-report.mjs +0 -0
  161. /package/{plugins/design/dev-server → apps/studio}/bin/slug.sh +0 -0
  162. /package/{plugins/design/dev-server → apps/studio}/bin/smoke.sh +0 -0
  163. /package/{plugins/design/dev-server → apps/studio}/bin/svg-optimize.sh +0 -0
  164. /package/{plugins/design/dev-server → apps/studio}/bin/visual-sanity.sh +0 -0
  165. /package/{plugins/design/dev-server → apps/studio}/boot-self-heal.ts +0 -0
  166. /package/{plugins/design/dev-server → apps/studio}/canvas-build.ts +0 -0
  167. /package/{plugins/design/dev-server → apps/studio}/canvas-edit.ts +0 -0
  168. /package/{plugins/design/dev-server → apps/studio}/canvas-header.ts +0 -0
  169. /package/{plugins/design/dev-server → apps/studio}/canvas-meta.schema.json +0 -0
  170. /package/{plugins/design/dev-server → apps/studio}/canvas-pipeline.ts +0 -0
  171. /package/{plugins/design/dev-server → apps/studio}/client/hmr.mjs +0 -0
  172. /package/{plugins/design/dev-server → apps/studio}/client/iframe-lazy.mjs +0 -0
  173. /package/{plugins/design/dev-server → apps/studio}/client/styles/0-reset.css +0 -0
  174. /package/{plugins/design/dev-server → apps/studio}/client/styles/1-tokens.css +0 -0
  175. /package/{plugins/design/dev-server → apps/studio}/client/styles/2-layout.css +0 -0
  176. /package/{plugins/design/dev-server → apps/studio}/client/styles/5-utilities.css +0 -0
  177. /package/{plugins/design/dev-server → apps/studio}/collab/ai-activity.ts +0 -0
  178. /package/{plugins/design/dev-server → apps/studio}/collab/awareness-bridge.ts +0 -0
  179. /package/{plugins/design/dev-server → apps/studio}/collab/git-lifecycle.ts +0 -0
  180. /package/{plugins/design/dev-server → apps/studio}/collab/index.ts +0 -0
  181. /package/{plugins/design/dev-server → apps/studio}/collab/persistence.ts +0 -0
  182. /package/{plugins/design/dev-server → apps/studio}/collab/protocol.ts +0 -0
  183. /package/{plugins/design/dev-server → apps/studio}/collab/registry.ts +0 -0
  184. /package/{plugins/design/dev-server → apps/studio}/collab/room.ts +0 -0
  185. /package/{plugins/design/dev-server → apps/studio}/config.schema.json +0 -0
  186. /package/{plugins/design/dev-server → apps/studio}/context.ts +0 -0
  187. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/.min-sizes.json +0 -0
  188. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/lib0_decoding.js +0 -0
  189. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/lib0_encoding.js +0 -0
  190. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/motion.js +0 -0
  191. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/motion_react.js +0 -0
  192. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/pixi-js.js +0 -0
  193. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react-dom.js +0 -0
  194. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react-dom_client.js +0 -0
  195. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react.js +0 -0
  196. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react_jsx-dev-runtime.js +0 -0
  197. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react_jsx-runtime.js +0 -0
  198. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/y-protocols_awareness.js +0 -0
  199. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/y-protocols_sync.js +0 -0
  200. /package/{plugins/design/dev-server → apps/studio}/dist/runtime/yjs.js +0 -0
  201. /package/{plugins/design/dev-server → apps/studio}/draw/test/brush.test.ts +0 -0
  202. /package/{plugins/design/dev-server → apps/studio}/draw/test/composition.test.ts +0 -0
  203. /package/{plugins/design/dev-server → apps/studio}/draw/test/geometry.test.ts +0 -0
  204. /package/{plugins/design/dev-server → apps/studio}/draw/test/gradient.test.ts +0 -0
  205. /package/{plugins/design/dev-server → apps/studio}/draw/test/layout.test.ts +0 -0
  206. /package/{plugins/design/dev-server → apps/studio}/draw/test/optimize.test.ts +0 -0
  207. /package/{plugins/design/dev-server → apps/studio}/draw/test/palette.test.ts +0 -0
  208. /package/{plugins/design/dev-server → apps/studio}/draw/test/primitives.test.ts +0 -0
  209. /package/{plugins/design/dev-server → apps/studio}/draw/test/serialize.test.ts +0 -0
  210. /package/{plugins/design/dev-server → apps/studio}/examples/README.md +0 -0
  211. /package/{plugins/design/dev-server → apps/studio}/examples/perf-100-artboards.tsx +0 -0
  212. /package/{plugins/design/dev-server → apps/studio}/exporters/_browser-bundles.ts +0 -0
  213. /package/{plugins/design/dev-server → apps/studio}/exporters/canva-handoff-prompt.ts +0 -0
  214. /package/{plugins/design/dev-server → apps/studio}/exporters/canva.ts +0 -0
  215. /package/{plugins/design/dev-server → apps/studio}/exporters/html.ts +0 -0
  216. /package/{plugins/design/dev-server → apps/studio}/exporters/index.ts +0 -0
  217. /package/{plugins/design/dev-server → apps/studio}/exporters/pdf.ts +0 -0
  218. /package/{plugins/design/dev-server → apps/studio}/exporters/png.ts +0 -0
  219. /package/{plugins/design/dev-server → apps/studio}/exporters/pptx.ts +0 -0
  220. /package/{plugins/design/dev-server → apps/studio}/exporters/scope.ts +0 -0
  221. /package/{plugins/design/dev-server → apps/studio}/exporters/svg.ts +0 -0
  222. /package/{plugins/design/dev-server → apps/studio}/exporters/zip.ts +0 -0
  223. /package/{plugins/design/dev-server → apps/studio}/fs-watch.ts +0 -0
  224. /package/{plugins/design/dev-server → apps/studio}/handoff.ts +0 -0
  225. /package/{plugins/design/dev-server → apps/studio}/history.ts +0 -0
  226. /package/{plugins/design/dev-server → apps/studio}/hmr-broadcast.ts +0 -0
  227. /package/{plugins/design/dev-server → apps/studio}/locator.ts +0 -0
  228. /package/{plugins/design/dev-server → apps/studio}/mem.ts +0 -0
  229. /package/{plugins/design/dev-server → apps/studio}/runtime-bundle.ts +0 -0
  230. /package/{plugins/design/dev-server → apps/studio}/server.mjs +0 -0
  231. /package/{plugins/design/dev-server → apps/studio}/sync/agent.ts +0 -0
  232. /package/{plugins/design/dev-server → apps/studio}/sync/atomic-write.ts +0 -0
  233. /package/{plugins/design/dev-server → apps/studio}/sync/codec.ts +0 -0
  234. /package/{plugins/design/dev-server → apps/studio}/sync/connection-state.ts +0 -0
  235. /package/{plugins/design/dev-server → apps/studio}/sync/echo-guard.ts +0 -0
  236. /package/{plugins/design/dev-server → apps/studio}/sync/fs-mirror.ts +0 -0
  237. /package/{plugins/design/dev-server → apps/studio}/sync/hubs-config.ts +0 -0
  238. /package/{plugins/design/dev-server → apps/studio}/sync/materialize.ts +0 -0
  239. /package/{plugins/design/dev-server → apps/studio}/sync/migrate-seed.ts +0 -0
  240. /package/{plugins/design/dev-server → apps/studio}/sync/origins.ts +0 -0
  241. /package/{plugins/design/dev-server → apps/studio}/sync/projection.ts +0 -0
  242. /package/{plugins/design/dev-server → apps/studio}/sync/status.ts +0 -0
  243. /package/{plugins/design/dev-server → apps/studio}/sync/untrusted.ts +0 -0
  244. /package/{plugins/design/dev-server → apps/studio}/test/_helpers.ts +0 -0
  245. /package/{plugins/design/dev-server → apps/studio}/test/active-state.test.ts +0 -0
  246. /package/{plugins/design/dev-server → apps/studio}/test/activity.test.ts +0 -0
  247. /package/{plugins/design/dev-server → apps/studio}/test/ai-activity.test.ts +0 -0
  248. /package/{plugins/design/dev-server → apps/studio}/test/annotation-strokes-command.test.ts +0 -0
  249. /package/{plugins/design/dev-server → apps/studio}/test/annotations-api.test.ts +0 -0
  250. /package/{plugins/design/dev-server → apps/studio}/test/annotations-draw-modifiers.test.ts +0 -0
  251. /package/{plugins/design/dev-server → apps/studio}/test/artboard-activity-overlay.test.tsx +0 -0
  252. /package/{plugins/design/dev-server → apps/studio}/test/binary-smoke.test.ts +0 -0
  253. /package/{plugins/design/dev-server → apps/studio}/test/boot-self-heal.test.ts +0 -0
  254. /package/{plugins/design/dev-server → apps/studio}/test/bundle-smoke.test.ts +0 -0
  255. /package/{plugins/design/dev-server → apps/studio}/test/canvas-build.test.ts +0 -0
  256. /package/{plugins/design/dev-server → apps/studio}/test/canvas-edit.test.ts +0 -0
  257. /package/{plugins/design/dev-server → apps/studio}/test/canvas-header.test.ts +0 -0
  258. /package/{plugins/design/dev-server → apps/studio}/test/canvas-hmr-runtime.test.tsx +0 -0
  259. /package/{plugins/design/dev-server → apps/studio}/test/canvas-lib-inline.test.ts +0 -0
  260. /package/{plugins/design/dev-server → apps/studio}/test/canvas-lib-motion.test.ts +0 -0
  261. /package/{plugins/design/dev-server → apps/studio}/test/canvas-meta-api.test.ts +0 -0
  262. /package/{plugins/design/dev-server → apps/studio}/test/canvas-pipeline.test.ts +0 -0
  263. /package/{plugins/design/dev-server → apps/studio}/test/canvas-route.test.ts +0 -0
  264. /package/{plugins/design/dev-server → apps/studio}/test/collab-annotations-bridge.test.ts +0 -0
  265. /package/{plugins/design/dev-server → apps/studio}/test/collab-awareness-bridge.test.ts +0 -0
  266. /package/{plugins/design/dev-server → apps/studio}/test/collab-bridge.test.ts +0 -0
  267. /package/{plugins/design/dev-server → apps/studio}/test/collab-loopback.test.ts +0 -0
  268. /package/{plugins/design/dev-server → apps/studio}/test/collab-protocol.test.ts +0 -0
  269. /package/{plugins/design/dev-server → apps/studio}/test/collab-reseed-guard.test.ts +0 -0
  270. /package/{plugins/design/dev-server → apps/studio}/test/collab-room.test.ts +0 -0
  271. /package/{plugins/design/dev-server → apps/studio}/test/collab-stress.test.ts +0 -0
  272. /package/{plugins/design/dev-server → apps/studio}/test/comment-mount.test.ts +0 -0
  273. /package/{plugins/design/dev-server → apps/studio}/test/comments-api.test.ts +0 -0
  274. /package/{plugins/design/dev-server → apps/studio}/test/compile-entry.test.ts +0 -0
  275. /package/{plugins/design/dev-server → apps/studio}/test/context-resolve-tokens.test.ts +0 -0
  276. /package/{plugins/design/dev-server → apps/studio}/test/csp-canvas-shell.test.ts +0 -0
  277. /package/{plugins/design/dev-server → apps/studio}/test/equal-spacing-detector.test.ts +0 -0
  278. /package/{plugins/design/dev-server → apps/studio}/test/exporters/canva.test.ts +0 -0
  279. /package/{plugins/design/dev-server → apps/studio}/test/exporters/endpoint.test.ts +0 -0
  280. /package/{plugins/design/dev-server → apps/studio}/test/exporters/history.test.ts +0 -0
  281. /package/{plugins/design/dev-server → apps/studio}/test/exporters/html.test.ts +0 -0
  282. /package/{plugins/design/dev-server → apps/studio}/test/exporters/pdf.test.ts +0 -0
  283. /package/{plugins/design/dev-server → apps/studio}/test/exporters/png.test.ts +0 -0
  284. /package/{plugins/design/dev-server → apps/studio}/test/exporters/pptx-deck.test.ts +0 -0
  285. /package/{plugins/design/dev-server → apps/studio}/test/exporters/pptx.test.ts +0 -0
  286. /package/{plugins/design/dev-server → apps/studio}/test/exporters/pw-launch.test.ts +0 -0
  287. /package/{plugins/design/dev-server → apps/studio}/test/exporters/scope.test.ts +0 -0
  288. /package/{plugins/design/dev-server → apps/studio}/test/exporters/svg.test.ts +0 -0
  289. /package/{plugins/design/dev-server → apps/studio}/test/exporters/zip.test.ts +0 -0
  290. /package/{plugins/design/dev-server → apps/studio}/test/fixtures/phase-20-annotations.svg +0 -0
  291. /package/{plugins/design/dev-server → apps/studio}/test/fixtures/phase-21-annotations.svg +0 -0
  292. /package/{plugins/design/dev-server → apps/studio}/test/fs-watch.test.ts +0 -0
  293. /package/{plugins/design/dev-server → apps/studio}/test/git-lifecycle.test.ts +0 -0
  294. /package/{plugins/design/dev-server → apps/studio}/test/handoff-static-frames.test.ts +0 -0
  295. /package/{plugins/design/dev-server → apps/studio}/test/handoff.test.ts +0 -0
  296. /package/{plugins/design/dev-server → apps/studio}/test/history-rollback.test.ts +0 -0
  297. /package/{plugins/design/dev-server → apps/studio}/test/hmr-broadcast.test.ts +0 -0
  298. /package/{plugins/design/dev-server → apps/studio}/test/hmr-classify.test.ts +0 -0
  299. /package/{plugins/design/dev-server → apps/studio}/test/input-router.test.ts +0 -0
  300. /package/{plugins/design/dev-server → apps/studio}/test/locator.test.ts +0 -0
  301. /package/{plugins/design/dev-server → apps/studio}/test/marquee-overlay.test.ts +0 -0
  302. /package/{plugins/design/dev-server → apps/studio}/test/move-artboards-command.test.ts +0 -0
  303. /package/{plugins/design/dev-server → apps/studio}/test/participants-chrome.test.ts +0 -0
  304. /package/{plugins/design/dev-server → apps/studio}/test/paths.test.ts +0 -0
  305. /package/{plugins/design/dev-server → apps/studio}/test/runtime-bundle-error-mapping.test.ts +0 -0
  306. /package/{plugins/design/dev-server → apps/studio}/test/runtime-bundle.test.ts +0 -0
  307. /package/{plugins/design/dev-server → apps/studio}/test/server-lifecycle.test.ts +0 -0
  308. /package/{plugins/design/dev-server → apps/studio}/test/shared-doc-foundation.test.ts +0 -0
  309. /package/{plugins/design/dev-server → apps/studio}/test/shared-doc-migrate.test.ts +0 -0
  310. /package/{plugins/design/dev-server → apps/studio}/test/shared-doc-projection.test.ts +0 -0
  311. /package/{plugins/design/dev-server → apps/studio}/test/snap-distance-pill.test.ts +0 -0
  312. /package/{plugins/design/dev-server → apps/studio}/test/sync-agent.test.ts +0 -0
  313. /package/{plugins/design/dev-server → apps/studio}/test/sync-atomic-write.test.ts +0 -0
  314. /package/{plugins/design/dev-server → apps/studio}/test/sync-codec.test.ts +0 -0
  315. /package/{plugins/design/dev-server → apps/studio}/test/sync-connection-state.test.ts +0 -0
  316. /package/{plugins/design/dev-server → apps/studio}/test/sync-echo-guard.test.ts +0 -0
  317. /package/{plugins/design/dev-server → apps/studio}/test/sync-fs-mirror.test.ts +0 -0
  318. /package/{plugins/design/dev-server → apps/studio}/test/sync-hardening.test.ts +0 -0
  319. /package/{plugins/design/dev-server → apps/studio}/test/sync-hubs-config.test.ts +0 -0
  320. /package/{plugins/design/dev-server → apps/studio}/test/sync-meta-codec.test.ts +0 -0
  321. /package/{plugins/design/dev-server → apps/studio}/test/sync-runtime.test.ts +0 -0
  322. /package/{plugins/design/dev-server → apps/studio}/test/sync-status.test.ts +0 -0
  323. /package/{plugins/design/dev-server → apps/studio}/test/sync-untrusted.test.ts +0 -0
  324. /package/{plugins/design/dev-server → apps/studio}/test/system-endpoint.test.ts +0 -0
  325. /package/{plugins/design/dev-server → apps/studio}/test/tool-palette.test.tsx +0 -0
  326. /package/{plugins/design/dev-server → apps/studio}/test/undo-stack.test.ts +0 -0
  327. /package/{plugins/design/dev-server → apps/studio}/test/use-agent-presence.test.tsx +0 -0
  328. /package/{plugins/design/dev-server → apps/studio}/test/use-annotation-selection.test.tsx +0 -0
  329. /package/{plugins/design/dev-server → apps/studio}/test/use-artboard-drag.test.ts +0 -0
  330. /package/{plugins/design/dev-server → apps/studio}/test/use-canvas-activity.test.tsx +0 -0
  331. /package/{plugins/design/dev-server → apps/studio}/test/use-collab.test.ts +0 -0
  332. /package/{plugins/design/dev-server → apps/studio}/test/use-cursor-modifiers.test.ts +0 -0
  333. /package/{plugins/design/dev-server → apps/studio}/test/use-keyboard-discipline.test.ts +0 -0
  334. /package/{plugins/design/dev-server → apps/studio}/test/use-selection-set.test.tsx +0 -0
  335. /package/{plugins/design/dev-server → apps/studio}/test/use-snap-guides.test.ts +0 -0
  336. /package/{plugins/design/dev-server → apps/studio}/test/use-undo-stack.test.tsx +0 -0
  337. /package/{plugins/design/dev-server → apps/studio}/test/ws-handshake.test.ts +0 -0
  338. /package/{plugins/design/dev-server → apps/studio}/tsconfig.json +0 -0
  339. /package/{plugins/design/dev-server → apps/studio}/ws.ts +0 -0
@@ -0,0 +1,87 @@
1
+ // whats-new.ts — server-side loader for the Maude "What's New" feed.
2
+ //
3
+ // Single source of truth: `<DEV_SERVER_ROOT>/whats-new.json` (DDR-A). The feed
4
+ // describes **Maude's own product** updates — it is resolved from the maude
5
+ // package root (via paths.ts, NOT cwd), so the dev-server surfaces the same
6
+ // product news whether it runs in this repo or a downstream user's project.
7
+ //
8
+ // Disk paths MUST come from paths.ts (DDR-045) — never
9
+ // `dirname(fileURLToPath(import.meta.url))`, which is the virtual `/$bunfs/root`
10
+ // inside a `bun --compile` standalone binary.
11
+
12
+ import { existsSync, readFileSync } from 'node:fs';
13
+ import { join } from 'node:path';
14
+ import { DEV_SERVER_ROOT } from './paths.ts';
15
+
16
+ export type WhatsNewKind = 'feature' | 'improvement' | 'usage' | 'fix';
17
+
18
+ export interface WhatsNewTourStep {
19
+ target: string;
20
+ title: string;
21
+ body: string;
22
+ placement?: 'top' | 'bottom' | 'left' | 'right' | 'auto';
23
+ }
24
+
25
+ export interface WhatsNewEntry {
26
+ id: string;
27
+ version: string | null;
28
+ date: string | null;
29
+ kind: WhatsNewKind;
30
+ title: string;
31
+ summary: string;
32
+ learnMore?: string;
33
+ surface?: string;
34
+ tour?: WhatsNewTourStep[];
35
+ }
36
+
37
+ export interface WhatsNewFeed {
38
+ /** The installed maude version (key the client compares "seen" against). */
39
+ version: string;
40
+ entries: WhatsNewEntry[];
41
+ }
42
+
43
+ let cache: WhatsNewFeed | null = null;
44
+
45
+ /**
46
+ * Read the installed maude version from the design plugin manifest.
47
+ * `apps/studio/` → `plugins/design/.claude-plugin/plugin.json`.
48
+ * That manifest ships in BOTH npm installs and marketplace-cache clones
49
+ * (same rationale as build.ts `readPluginVersion`). Falls back to `dev`.
50
+ */
51
+ export function resolveMaudeVersion(root: string = DEV_SERVER_ROOT): string {
52
+ const manifest = join(root, '..', '..', 'plugins', 'design', '.claude-plugin', 'plugin.json');
53
+ try {
54
+ const parsed = JSON.parse(readFileSync(manifest, 'utf8')) as { version?: unknown };
55
+ if (typeof parsed.version === 'string') return parsed.version;
56
+ } catch {
57
+ /* fall through */
58
+ }
59
+ return 'dev';
60
+ }
61
+
62
+ /**
63
+ * Load `<root>/whats-new.json`. Fails soft to an empty entry list — a missing
64
+ * or malformed feed must never 500 the dev-server (it's a non-critical chrome
65
+ * surface). Caches the default-root result; pass `{ root }` for an uncached
66
+ * read (tests) and `{ fresh: true }` to bypass the cache.
67
+ */
68
+ export function loadWhatsNew(opts: { root?: string; fresh?: boolean } = {}): WhatsNewFeed {
69
+ const usingDefaultRoot = opts.root === undefined;
70
+ if (cache && usingDefaultRoot && !opts.fresh) return cache;
71
+
72
+ const root = opts.root ?? DEV_SERVER_ROOT;
73
+ const file = join(root, 'whats-new.json');
74
+ let entries: WhatsNewEntry[] = [];
75
+ try {
76
+ if (existsSync(file)) {
77
+ const parsed = JSON.parse(readFileSync(file, 'utf8')) as { entries?: unknown };
78
+ if (Array.isArray(parsed.entries)) entries = parsed.entries as WhatsNewEntry[];
79
+ }
80
+ } catch {
81
+ /* malformed feed → empty, never throw */
82
+ }
83
+
84
+ const feed: WhatsNewFeed = { version: resolveMaudeVersion(root), entries };
85
+ if (usingDefaultRoot) cache = feed;
86
+ return feed;
87
+ }
package/cli/bin/maude.mjs CHANGED
@@ -50,6 +50,16 @@ async function main(argv) {
50
50
  return run({ args: [], pkgRoot: PKG_ROOT });
51
51
  }
52
52
 
53
+ // `maude studio [...]` — top-level alias for `maude design serve` (DDR-095:
54
+ // the verb now matches the apps/studio home). Checked BEFORE the COMMANDS map
55
+ // so it never falls through to the unknown-command branch; it is deliberately
56
+ // NOT a COMMANDS entry (that would dispatch design.run with positional[0]
57
+ // wrong). `maude design serve` keeps working unchanged.
58
+ if (cmd === 'studio') {
59
+ const { run } = await COMMANDS.design();
60
+ return run({ args: ['serve', ...args.slice(1)], pkgRoot: PKG_ROOT });
61
+ }
62
+
53
63
  const loader = COMMANDS[cmd];
54
64
  if (!loader) {
55
65
  process.stderr.write(
@@ -40,6 +40,8 @@ const BIN_VERBS = new Set([
40
40
  'draw-build',
41
41
  'draw-proof',
42
42
  'svg-optimize',
43
+ 'to-lottie',
44
+ 'read-annotations',
43
45
  ]);
44
46
 
45
47
  // Bin verbs that boot the dev-server (directly, or by shelling into server-up.sh).
@@ -86,11 +88,16 @@ function runBinDispatch(verb, { args, pkgRoot }) {
86
88
  process.stderr.write(`maude design: "${verb}" is not a dev-tooling verb.\n${usage()}`);
87
89
  process.exit(2);
88
90
  }
91
+ // CLAUDE_PLUGIN_ROOT stays the design *plugin* dir (plugins/design) — that's
92
+ // its true meaning, and it remains 2 levels under pkgRoot so the helpers'
93
+ // `$PLUGIN_ROOT/../../cli` side-channel + `$PLUGIN_ROOT/../..` pkg-root math
94
+ // still resolve. The bin scripts themselves now live under apps/studio/bin
95
+ // (DDR-095) and resolve the dev-server tree via $SCRIPT_DIR/.. regardless.
89
96
  const pluginRoot = join(pkgRoot, 'plugins', 'design');
90
- const script = join(pluginRoot, 'dev-server', 'bin', `${verb}.sh`);
97
+ const script = join(pkgRoot, 'apps', 'studio', 'bin', `${verb}.sh`);
91
98
  if (!existsSync(script)) {
92
99
  process.stderr.write(
93
- `maude design ${verb}: helper not found at ${script}. Reinstall maude (the dev-server bin ships in the npm package).\n`
100
+ `maude design ${verb}: helper not found at ${script}. Reinstall maude (the studio bin ships in the npm package).\n`
94
101
  );
95
102
  process.exit(1);
96
103
  }
@@ -127,7 +134,7 @@ Lifecycle:
127
134
  Dev-tooling (dispatch to the dev-server bash helpers — DDR-062):
128
135
  screenshot · server-up · prep · slug · bootstrap-check · runtime-health
129
136
  smoke · canvas-edit · handoff · asset-sweep · visual-sanity
130
- draw-build · draw-proof · svg-optimize
137
+ draw-build · draw-proof · svg-optimize · to-lottie · read-annotations
131
138
  Invoke the bundled helper of the same name. maude resolves it from its
132
139
  own package root and sets CLAUDE_PLUGIN_ROOT for the child; stdout,
133
140
  stderr, and exit code pass straight through (so command-substitution
@@ -140,7 +147,8 @@ Dev-tooling (dispatch to the dev-server bash helpers — DDR-062):
140
147
 
141
148
  serve [--port N] [--root PATH]
142
149
  Start the design plugin's dev server in the current repo. Equivalent
143
- to invoking 'claude-design-server'. Forwards all remaining args.
150
+ to 'maude studio' (top-level alias) or invoking 'claude-design-server'.
151
+ Forwards all remaining args.
144
152
 
145
153
  init [--name <slug>] [--ds <name>] [--force] [--dry-run]
146
154
  [--no-discovery | --discovery-payload <path>]
@@ -259,8 +267,8 @@ async function runServe({ args, pkgRoot }) {
259
267
  process.exit(1);
260
268
  }
261
269
 
262
- const tsEntry = resolve(pkgRoot, 'plugins', 'design', 'dev-server', 'server.ts');
263
- const mjsEntry = resolve(pkgRoot, 'plugins', 'design', 'dev-server', 'server.mjs');
270
+ const tsEntry = resolve(pkgRoot, 'apps', 'studio', 'server.ts');
271
+ const mjsEntry = resolve(pkgRoot, 'apps', 'studio', 'server.mjs');
264
272
 
265
273
  const hasBun = await new Promise((res) => {
266
274
  const probe = spawn('bun', ['--version'], { stdio: 'ignore' });
@@ -414,7 +422,7 @@ function checkDevDeps({ pkgRoot }) {
414
422
  // with a less actionable error.
415
423
  const required = ['magic-string', 'oxc-parser'];
416
424
  const missing = [];
417
- const paths = [resolve(pkgRoot, 'plugins', 'design', 'dev-server'), resolve(pkgRoot)];
425
+ const paths = [resolve(pkgRoot, 'apps', 'studio'), resolve(pkgRoot)];
418
426
  for (const dep of required) {
419
427
  try {
420
428
  require.resolve(dep, { paths });
@@ -150,3 +150,39 @@ test('isPlausiblePlatformBinary — accepts maude-<slug>/maude, rejects everythi
150
150
  assert.equal(isPlausiblePlatformBinary(''), false);
151
151
  assert.equal(isPlausiblePlatformBinary(null), false);
152
152
  });
153
+
154
+ // DDR-095 — `maude studio` is a top-level alias for `maude design serve`. Both
155
+ // must resolve the same server-entry path. We prove parity by booting each
156
+ // against a temp dir with no .design/: the dev-server fails loud (exit 1) with
157
+ // an identical first-line signature, which only happens if `studio` routed
158
+ // through design-serve resolution (`apps/studio/server.{ts,mjs}` / the binary).
159
+ test('`maude studio` aliases `maude design serve` (identical boot resolution)', () => {
160
+ const BIN_PATH = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'bin', 'maude.mjs');
161
+ function bootAgainstEmpty(argv) {
162
+ const cwd = mkdtempSync(join(tmpdir(), 'maude-studio-'));
163
+ try {
164
+ const r = spawnSync(process.execPath, [BIN_PATH, ...argv, '--root', cwd], {
165
+ encoding: 'utf8',
166
+ timeout: 30000,
167
+ });
168
+ return { status: r.status, firstErr: (r.stderr || '').split('\n').find(Boolean) ?? '' };
169
+ } finally {
170
+ rmSync(cwd, { recursive: true, force: true });
171
+ }
172
+ }
173
+ const viaDesign = bootAgainstEmpty(['design', 'serve']);
174
+ const viaStudio = bootAgainstEmpty(['studio']);
175
+ // Both fail loud (no .design/) — same exit code, same first-line diagnostic.
176
+ assert.notEqual(viaStudio.status, 0, `studio should not boot cleanly: ${viaStudio.firstErr}`);
177
+ assert.equal(viaStudio.status, viaDesign.status);
178
+ assert.equal(viaStudio.firstErr, viaDesign.firstErr);
179
+ });
180
+
181
+ test('`maude studio` is recognized (not an unknown command)', () => {
182
+ const BIN_PATH = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'bin', 'maude.mjs');
183
+ const r = spawnSync(process.execPath, [BIN_PATH, 'studio', '--root', '/nonexistent-xyz'], {
184
+ encoding: 'utf8',
185
+ timeout: 30000,
186
+ });
187
+ assert.doesNotMatch(r.stderr || '', /unknown command/);
188
+ });
@@ -29,9 +29,14 @@ COMMANDS
29
29
  contract — see DDR-061); 'list' shows layers + sizes; 'stats' shows
30
30
  hit-rate; 'inspect' pretty-prints entries; 'clear' wipes a layer or all.
31
31
 
32
+ studio [--port N] [--root PATH]
33
+ Alias for 'maude design serve' — boot the canvas studio (the design
34
+ dev server) in the current repo. Forwards all remaining args.
35
+
32
36
  design serve [--port N] [--root PATH]
33
37
  Start the design plugin's dev server in the current repo. Equivalent
34
- to invoking 'claude-design-server'. Forwards all remaining args.
38
+ to 'maude studio' / invoking 'claude-design-server'. Forwards all
39
+ remaining args.
35
40
 
36
41
  design init [--name <slug>] [--ds <name>] [--force] [--dry-run]
37
42
  [--no-discovery | --discovery-payload <path>]
@@ -43,7 +48,7 @@ COMMANDS
43
48
 
44
49
  design <screenshot|server-up|prep|slug|bootstrap-check|runtime-health
45
50
  |smoke|canvas-edit|handoff|asset-sweep|visual-sanity> [args]
46
- Dispatch to the dev-server's bundled bash helper of the same name.
51
+ Dispatch to the studio's bundled bash helper of the same name.
47
52
  maude resolves it from its own package root and sets CLAUDE_PLUGIN_ROOT
48
53
  for the child; stdout/stderr/exit-code pass straight through. This is
49
54
  the contract plugin markdown uses instead of a raw bin path (DDR-062).
@@ -88,6 +93,7 @@ EXAMPLES
88
93
  maude config get motion.complex
89
94
  maude cache list
90
95
  maude cache clear research/domain
96
+ maude studio --port 4399
91
97
  maude design serve --port 4399
92
98
  maude design init --no-discovery --name acme-app
93
99
  maude design slug "Some Canvas Name"
@@ -82,7 +82,7 @@ function usage() {
82
82
  exact commands to run next. Does NOT execute fly/docker for you —
83
83
  review the emitted files first, then run the printed command.
84
84
 
85
- fly → fly.toml (+ reuses plugins/design/hub/Dockerfile).
85
+ fly → fly.toml (+ reuses apps/hub/Dockerfile).
86
86
  --name app name (default maude-hub-<rand>)
87
87
  --region Fly region code (default iad)
88
88
  docker → docker-compose.yml + Caddyfile (universal — Lightsail, EC2,
@@ -91,7 +91,7 @@ function usage() {
91
91
 
92
92
  NOTES
93
93
  serve / token / deploy run inside a 'maude' source checkout (they read the
94
- bundled hub workspace at plugins/design/hub). Production hubs run the
94
+ bundled hub workspace at apps/hub). Production hubs run the
95
95
  published Docker image (ghcr.io/1agh/maude-hub) — see 'maude hub deploy'.
96
96
  status works from anywhere (plain HTTP GET against /health).
97
97
 
@@ -433,7 +433,7 @@ function randHex(bytes) {
433
433
  // ---------------------------------------------------------------- helpers
434
434
 
435
435
  function findHubRoot(pkgRoot) {
436
- const dev = resolve(pkgRoot, 'plugins', 'design', 'hub');
436
+ const dev = resolve(pkgRoot, 'apps', 'hub');
437
437
  if (existsSync(resolve(dev, 'package.json'))) {
438
438
  try {
439
439
  const pkg = JSON.parse(readFileSync(resolve(dev, 'package.json'), 'utf8'));
@@ -9,7 +9,7 @@ import { dirname, join, resolve } from 'node:path';
9
9
  import { test } from 'node:test';
10
10
  import { fileURLToPath } from 'node:url';
11
11
 
12
- import { readTokens } from '../../plugins/design/hub/src/tokens.mjs';
12
+ import { readTokens } from '../../apps/hub/src/tokens.mjs';
13
13
 
14
14
  const BIN = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'bin', 'maude.mjs');
15
15
 
@@ -5,7 +5,7 @@ import { pathToFileURL } from 'node:url';
5
5
  // `maude scenario-report <run-dir> [--out <path>]` — deterministic cross-platform
6
6
  // scenario report generator (Phase C / DDR-061). Thin wrapper that resolves the
7
7
  // bundled generator from maude's OWN package root (NOT $CLAUDE_PLUGIN_ROOT — the
8
- // flow plugin can't reach the design plugin's dev-server dir; only the on-PATH
8
+ // flow plugin can't reach the studio app's bin dir; only the on-PATH
9
9
  // `maude` binary resolves it reliably across install shapes — see DDR-062), runs
10
10
  // it, and writes report.md. Output stdout = the written path (capture idiom).
11
11
 
@@ -22,14 +22,7 @@ export async function run({ args, pkgRoot }) {
22
22
  return;
23
23
  }
24
24
 
25
- const generatorPath = resolve(
26
- pkgRoot,
27
- 'plugins',
28
- 'design',
29
- 'dev-server',
30
- 'bin',
31
- 'scenario-report.mjs'
32
- );
25
+ const generatorPath = resolve(pkgRoot, 'apps', 'studio', 'bin', 'scenario-report.mjs');
33
26
  const { generateReport } = await import(pathToFileURL(generatorPath).href);
34
27
 
35
28
  const absRunDir = resolve(process.cwd(), runDir);
@@ -26,7 +26,7 @@ import { lintConfig } from './config-lint.mjs';
26
26
  const read = (p) => readFileSync(resolve(p), 'utf8');
27
27
  const readJson = (p) => JSON.parse(read(p));
28
28
 
29
- const META_SCHEMA = readJson('plugins/design/dev-server/canvas-meta.schema.json');
29
+ const META_SCHEMA = readJson('apps/studio/canvas-meta.schema.json');
30
30
  const FLOW_SCHEMA = readJson('plugins/flow/.claude-plugin/config.schema.json');
31
31
  const SKELETON = readJson('plugins/flow/templates/ai-skeleton/workflows.config.json');
32
32
 
@@ -31,6 +31,7 @@ export function buildBlock(designRel = '.design') {
31
31
  `${root}/_active.json`,
32
32
  `${root}/_sync.json`, // linked-mode offline/sync status (Task 8)
33
33
  `${root}/_history/`,
34
+ `${root}/_trash/`, // soft-deleted canvases (recoverable locally — Phase 22 delete)
34
35
  `${root}/_draw/`, // draw-agent proof canvases (regenerable — Phase 25)
35
36
  `${root}/_canvas-state/`, // per-machine canvas undo/redo + scratch state
36
37
  `${root}/_chat/`, // ACP transcripts (per-machine)
@@ -10,12 +10,13 @@
10
10
  // SAME file also offers a `command -v maude` fallback (the sibling-first /
11
11
  // maude-fallback pattern). This test fails loudly if a new straggler lands.
12
12
  //
13
- // DDR-062: plugin MARKDOWN must reach the dev-server bash helpers through
14
- // `maude design <verb>`, never `bash "$CLAUDE_PLUGIN_ROOT/dev-server/bin/<x>.sh"`.
15
- // The marketplace never copies the dev-server beside a plugin, and a flow
16
- // command's $CLAUDE_PLUGIN_ROOT points at plugins/flow (no dev-server/ at all).
17
- // Prose mentions of the path are fine; INVOCATIONS (bash/sh/exec/$( prefixed)
18
- // are banned.
13
+ // DDR-062: plugin MARKDOWN must reach the studio bash helpers through
14
+ // `maude design <verb>`, never `bash "$CLAUDE_PLUGIN_ROOT/dev-server/bin/<x>.sh"`
15
+ // or `bash apps/studio/bin/<x>.sh`. The marketplace never copies the studio app
16
+ // beside a plugin, and a flow command's $CLAUDE_PLUGIN_ROOT points at
17
+ // plugins/flow (no bin/ at all). Per DDR-095 the helpers live under
18
+ // apps/studio/bin (was plugins/design/dev-server/bin). Prose mentions of the
19
+ // path are fine; INVOCATIONS (bash/sh/exec/$( prefixed) are banned.
19
20
 
20
21
  import assert from 'node:assert/strict';
21
22
  import { execSync } from 'node:child_process';
@@ -43,7 +44,7 @@ test('no plugin markdown invokes a $CLAUDE_PLUGIN_ROOT/dev-server/bin/*.sh helpe
43
44
  // command substitution. Prose mentions of the path (backtick-wrapped, no verb)
44
45
  // are exempt — they don't run anything. Matches both the $CLAUDE_PLUGIN_ROOT
45
46
  // form and the repo-relative `plugins/<x>/dev-server/bin/` form.
46
- const pattern = String.raw`(bash|sh|exec) +"?(\$\{?CLAUDE_PLUGIN_ROOT\}?|plugins/[a-z]+)/dev-server/bin/[A-Za-z0-9_-]+\.sh|\$\("?\$?\{?CLAUDE_PLUGIN_ROOT\}?/dev-server/bin/[A-Za-z0-9_-]+\.sh`;
47
+ const pattern = String.raw`(bash|sh|exec) +"?(\$\{?CLAUDE_PLUGIN_ROOT\}?|plugins/[a-z]+)/dev-server/bin/[A-Za-z0-9_-]+\.sh|\$\("?\$?\{?CLAUDE_PLUGIN_ROOT\}?/dev-server/bin/[A-Za-z0-9_-]+\.sh|(bash|sh|exec) +"?[^"\n]*apps/studio/bin/[A-Za-z0-9_-]+\.sh|\$\("?[^"\n]*apps/studio/bin/[A-Za-z0-9_-]+\.sh`;
47
48
  const out = execSync(`grep -rnE '${pattern}' plugins --include='*.md' || true`, {
48
49
  encoding: 'utf8',
49
50
  });
@@ -5,7 +5,7 @@
5
5
  // Used by:
6
6
  // - cli/commands/doctor.mjs (the unified diagnostic CLI)
7
7
  // - plugins/flow/commands/init.md (the wired pre-flight Step 1)
8
- // - plugins/design/dev-server/bin/preflight.sh (which re-shells to node
8
+ // - apps/studio/bin/preflight.sh (which re-shells to node
9
9
  // for the actual checks — keeps detection logic in one place).
10
10
  //
11
11
  // Pure-ish: no process.exit; returns an envelope. printReport() is here
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1agh/maude",
3
- "version": "0.28.1",
3
+ "version": "0.29.0",
4
4
  "description": "Marketplace of Claude Code plugins by Michal Dovrtěl: `design` (canvas-first design iteration) + `flow` (generic agentic workflow loop with .ai second brain). Ships the `maude` CLI (with `mdcc` legacy alias) to scaffold workspace, run the design dev server, and manage configs.",
5
5
  "type": "module",
6
6
  "engines": {
@@ -14,16 +14,16 @@
14
14
  "mdcc": "cli/bin/mdcc.mjs",
15
15
  "maude-safe": "cli/cli-wrapper.cjs",
16
16
  "mdcc-safe": "cli/cli-wrapper.cjs",
17
- "claude-design-server": "plugins/design/dev-server/server.mjs"
17
+ "claude-design-server": "apps/studio/server.mjs"
18
18
  },
19
19
  "scripts": {
20
- "start": "bun run plugins/design/dev-server/server.ts",
21
- "dev": "bun run plugins/design/dev-server/server.ts --port 4555",
20
+ "start": "bun run apps/studio/server.ts",
21
+ "dev": "bun run apps/studio/server.ts --port 4555",
22
22
  "dev:site": "pnpm --filter @maude/site dev --port 4398",
23
23
  "build": "pnpm -r --if-present run build",
24
- "build:binary": "bun run plugins/design/dev-server/build.ts --release",
24
+ "build:binary": "bun run apps/studio/build.ts --release",
25
25
  "test": "node --test --test-reporter=spec cli/**/*.test.mjs",
26
- "test:dev-server": "cd plugins/design/dev-server && bun test",
26
+ "test:dev-server": "cd apps/studio && bun test",
27
27
  "lint": "biome check .",
28
28
  "format": "biome format --write .",
29
29
  "changeset": "changeset",
@@ -38,20 +38,20 @@
38
38
  "video:render": "cd scripts/video/final && pnpm run render",
39
39
  "video:studio": "cd scripts/video/final && pnpm run studio",
40
40
  "postinstall": "node cli/install.cjs",
41
- "prepublishOnly": "bash scripts/check-version-parity.sh && bash plugins/design/dev-server/bin/check-runtime-bundles.sh"
41
+ "prepublishOnly": "bash scripts/check-version-parity.sh && bash apps/studio/bin/check-runtime-bundles.sh"
42
42
  },
43
43
  "optionalDependencies": {
44
- "@1agh/maude-darwin-arm64": "0.28.1",
45
- "@1agh/maude-darwin-x64": "0.28.1",
46
- "@1agh/maude-linux-arm64": "0.28.1",
47
- "@1agh/maude-linux-arm64-musl": "0.28.1",
48
- "@1agh/maude-linux-x64": "0.28.1",
49
- "@1agh/maude-linux-x64-musl": "0.28.1",
50
- "@1agh/maude-win32-x64": "0.28.1"
44
+ "@1agh/maude-darwin-arm64": "0.29.0",
45
+ "@1agh/maude-darwin-x64": "0.29.0",
46
+ "@1agh/maude-linux-arm64": "0.29.0",
47
+ "@1agh/maude-linux-arm64-musl": "0.29.0",
48
+ "@1agh/maude-linux-x64": "0.29.0",
49
+ "@1agh/maude-linux-x64-musl": "0.29.0",
50
+ "@1agh/maude-win32-x64": "0.29.0"
51
51
  },
52
52
  "files": [
53
53
  "cli",
54
- "plugins/design/dev-server",
54
+ "apps/studio",
55
55
  "plugins/design/dependencies.json",
56
56
  "plugins/design/dependencies.schema.json",
57
57
  "plugins/design/templates",
@@ -0,0 +1,61 @@
1
+ /**
2
+ * @canvas {{NAME}} — brief board
3
+ * @ds {{DS_NAME}}
4
+ * @platform {{PLATFORM}}
5
+ * @kind brief-board
6
+ * @stack React 19 · TSX · Bun.build
7
+ * @history {{HISTORY_DIR}}
8
+ *
9
+ * Annotation-only brief board (Phase 22). This canvas is born EMPTY on purpose:
10
+ * one framed reference artboard you fill with sticky notes (N), text (T), and
11
+ * arrows (A) describing what each screen should do. When you run `/design:new`
12
+ * again while this board is the active canvas, Claude reads those annotations as
13
+ * a VERBATIM brief and inserts the matching generated artboards right here, below
14
+ * this frame — the board becomes a living brief you sketch and Claude fills in.
15
+ *
16
+ * The annotation layer lives in a sibling `<slug>.annotations.svg` (NEVER in this
17
+ * file), so your notes stay floating on top across every regeneration. No design
18
+ * system tokens or classes are wired in — the board is a neutral surface; the
19
+ * generated artboards bring the DS with them on ingest.
20
+ */
21
+
22
+ import { DCArtboard, DCSection, DesignCanvas } from "@maude/canvas-lib";
23
+
24
+ export default function {{COMPONENT_NAME}}() {
25
+ return (
26
+ <DesignCanvas>
27
+ <DCSection id="brief-board" title="Brief">
28
+ <DCArtboard id="brief" label="Brief — annotate me" width={1280} height={800}>
29
+ <div
30
+ style={{
31
+ boxSizing: "border-box",
32
+ width: "100%",
33
+ height: "100%",
34
+ display: "flex",
35
+ flexDirection: "column",
36
+ alignItems: "center",
37
+ justifyContent: "center",
38
+ gap: "14px",
39
+ padding: "48px",
40
+ textAlign: "center",
41
+ fontFamily: "ui-sans-serif, system-ui, -apple-system, sans-serif",
42
+ color: "#9aa0a6",
43
+ background: "#ffffff",
44
+ border: "1.5px dashed #d4d8dd",
45
+ }}
46
+ >
47
+ <div style={{ fontSize: "22px", fontWeight: 600, color: "#5f6571" }}>
48
+ {{NAME}}
49
+ </div>
50
+ <div style={{ fontSize: "14px", color: "#8a9099" }}>{{SEED_HINT}}</div>
51
+ <div style={{ fontSize: "13px", maxWidth: "460px", lineHeight: 1.55 }}>
52
+ Drop sticky notes (N), text (T) &amp; arrows (A) here describing what
53
+ each screen should do — then run <code>/design:new</code> again to have
54
+ Claude read your notes and lay the matching artboards out right here.
55
+ </div>
56
+ </div>
57
+ </DCArtboard>
58
+ </DCSection>
59
+ </DesignCanvas>
60
+ );
61
+ }
@@ -20,7 +20,7 @@
20
20
  * The envelope primitives (`DesignCanvas`, `DCSection`, `DCArtboard`) and any
21
21
  * specimen helpers come from the dev-server-bundled canvas library via the
22
22
  * virtual specifier — the dev-server resolves it to
23
- * `plugins/design/dev-server/canvas-lib.tsx` (single source, ships with the
23
+ * `apps/studio/canvas-lib.tsx` (single source, ships with the
24
24
  * dev-server install per DDR-025), and `/design:handoff` AST-inlines the used
25
25
  * exports so the registry-item drop is self-contained. Read that file for the
26
26
  * full export surface (helpers + hooks) before reaching for new components.
@@ -1,5 +1,5 @@
1
1
  {
2
- "$schema": "https://raw.githubusercontent.com/1aGh/maude/main/plugins/design/dev-server/config.schema.json",
2
+ "$schema": "https://raw.githubusercontent.com/1aGh/maude/main/apps/studio/config.schema.json",
3
3
  "name": "{{project_name}}",
4
4
  "projectLabel": "{{project_label}}",
5
5
  "designRoot": ".design",
@@ -56,7 +56,7 @@ Per DDR-049: a canvas that imports `<MotionDemo>` or any sibling motion helper f
56
56
 
57
57
  ## Cross-links
58
58
 
59
- - Library source: `plugins/design/dev-server/canvas-lib.tsx` (`MotionDemo`, `MotionTrack`, `TokenPlayback`, `ReducedMotionToggle`, `useMotionTokens`, `easingFromToken`)
59
+ - Library source: `apps/studio/canvas-lib.tsx` (`MotionDemo`, `MotionTrack`, `TokenPlayback`, `ReducedMotionToggle`, `useMotionTokens`, `easingFromToken`)
60
60
  - Library decision: `.ai/decisions/DDR-049-motion-one-as-canonical-motion-library.md`
61
61
  - Sub-agent safety block: `plugins/design/templates/design-system-inspiration/SUB-AGENT-PROMPTS.md` → ANIMATION SAFETY
62
62
  - Tokens: `colors_and_type.css.tpl` (lines around `--dur-*` + `--ease-*`)
@@ -408,6 +408,22 @@
408
408
  "mcp": { "type": "string" },
409
409
  "defaults": { "type": "object", "additionalProperties": true }
410
410
  }
411
+ },
412
+ "whatsNew": {
413
+ "type": "object",
414
+ "additionalProperties": false,
415
+ "description": "In-product \"What's New\" feed. When enabled, /flow:done offers to append a user-facing entry for the closed-out feature to `feed`, delegating to the named project skill if set. Generic + opt-in: absent or `enabled:false` → /flow:done skips it silently. Maude wires this to apps/studio/whats-new.json, surfaced in the canvas browser.",
416
+ "properties": {
417
+ "enabled": { "type": "boolean", "default": false },
418
+ "feed": {
419
+ "type": "string",
420
+ "description": "Repo-relative path to the What's New feed JSON the entry is appended to."
421
+ },
422
+ "skill": {
423
+ "type": "string",
424
+ "description": "Optional name of a project skill (in .claude/skills/) that authors the entry; /flow:done invokes it instead of inlining the append."
425
+ }
426
+ }
411
427
  }
412
428
  }
413
429
  }