@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.
- package/README.md +2 -2
- package/{plugins/design/dev-server → apps/studio}/ai-banner.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/annotations-context-toolbar.tsx +285 -5
- package/{plugins/design/dev-server → apps/studio}/annotations-layer.tsx +1206 -119
- package/{plugins/design/dev-server → apps/studio}/api.ts +486 -32
- package/{plugins/design/dev-server → apps/studio}/artboard-activity-overlay.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/artboard-marquee.tsx +1 -1
- package/apps/studio/bin/_motion-sample-playwright.mjs +129 -0
- package/{plugins/design/dev-server → apps/studio}/bin/canvas-edit.sh +1 -1
- package/{plugins/design/dev-server → apps/studio}/bin/draw-proof.sh +37 -2
- package/{plugins/design/dev-server → apps/studio}/bin/preflight.sh +1 -1
- package/apps/studio/bin/read-annotations.mjs +438 -0
- package/apps/studio/bin/read-annotations.sh +11 -0
- package/{plugins/design/dev-server → apps/studio}/bin/runtime-health.sh +1 -1
- package/{plugins/design/dev-server → apps/studio}/bin/screenshot.sh +62 -2
- package/{plugins/design/dev-server → apps/studio}/bin/server-up.sh +9 -3
- package/apps/studio/bin/to-lottie-verify.html +68 -0
- package/apps/studio/bin/to-lottie.sh +128 -0
- package/{plugins/design/dev-server → apps/studio}/build.ts +5 -3
- package/{plugins/design/dev-server → apps/studio}/canvas-arrowheads.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/canvas-comment-mount.tsx +1 -1
- package/apps/studio/canvas-create.ts +104 -0
- package/{plugins/design/dev-server → apps/studio}/canvas-cursors.ts +46 -12
- package/{plugins/design/dev-server → apps/studio}/canvas-icons.tsx +60 -1
- package/{plugins/design/dev-server → apps/studio}/canvas-lib-inline.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/canvas-lib-resolver.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/canvas-lib.tsx +31 -12
- package/{plugins/design/dev-server → apps/studio}/canvas-shell.tsx +56 -41
- package/{plugins/design/dev-server → apps/studio}/client/app.jsx +1713 -530
- package/apps/studio/client/canvas-url.js +81 -0
- package/{plugins/design/dev-server → apps/studio}/client/comments-overlay.css +41 -27
- package/{plugins/design/dev-server → apps/studio}/client/index.html +2 -1
- package/apps/studio/client/styles/1-tokens-maude.css +296 -0
- package/apps/studio/client/styles/3-shell-maude.css +459 -0
- package/{plugins/design/dev-server → apps/studio}/client/styles/3-shell.css +129 -0
- package/apps/studio/client/styles/4-components-maude.css +74 -0
- package/{plugins/design/dev-server → apps/studio}/client/styles/4-components.css +357 -34
- package/apps/studio/client/styles/5-maude-overrides.css +123 -0
- package/{plugins/design/dev-server → apps/studio}/client/styles/_index.css +9 -0
- package/{plugins/design/dev-server → apps/studio}/client/styles.css +1 -1
- package/apps/studio/client/tour/overlay.jsx +191 -0
- package/apps/studio/client/tour/usage-tour.js +35 -0
- package/apps/studio/client/whats-new-seen.js +52 -0
- package/apps/studio/client/whats-new.jsx +250 -0
- package/{plugins/design/dev-server → apps/studio}/commands/annotation-strokes-command.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/commands/equal-spacing-command.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/commands/move-artboards-command.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/comments-overlay.tsx +25 -6
- package/{plugins/design/dev-server → apps/studio}/context-menu.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/contextual-toolbar.tsx +4 -7
- package/{plugins/design/dev-server → apps/studio}/cursors-overlay.tsx +1 -1
- package/apps/studio/dist/client.bundle.js +22825 -0
- package/apps/studio/dist/comment-mount.js +1960 -0
- package/apps/studio/dist/styles.css +5695 -0
- package/{plugins/design/dev-server → apps/studio}/dom-selection.ts +75 -4
- package/apps/studio/draw/animate.ts +333 -0
- package/{plugins/design/dev-server → apps/studio}/draw/brush.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/draw/composition.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/draw/geometry.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/draw/index.ts +4 -1
- package/{plugins/design/dev-server → apps/studio}/draw/layout.ts +1 -1
- package/apps/studio/draw/morph.ts +204 -0
- package/{plugins/design/dev-server → apps/studio}/draw/optimize.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/draw/palette.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/draw/primitives.ts +1 -1
- package/apps/studio/draw/serialize-animate.ts +324 -0
- package/{plugins/design/dev-server → apps/studio}/draw/serialize.ts +9 -3
- package/apps/studio/draw/test/animate.test.ts +172 -0
- package/apps/studio/draw/test/morph.test.ts +107 -0
- package/apps/studio/draw/test/serialize-animate.test.ts +142 -0
- package/{plugins/design/dev-server → apps/studio}/equal-spacing-detector.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/equal-spacing-handles.tsx +7 -29
- package/{plugins/design/dev-server → apps/studio}/export-dialog.tsx +13 -1
- package/{plugins/design/dev-server → apps/studio}/http.ts +102 -1
- package/{plugins/design/dev-server → apps/studio}/input-router.tsx +8 -1
- package/{plugins/design/dev-server → apps/studio}/inspect.ts +20 -3
- package/{plugins/design/dev-server → apps/studio}/marquee-overlay.tsx +5 -2
- package/{plugins/design/dev-server → apps/studio}/participants-chrome.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/paths.ts +15 -11
- package/{plugins/design/dev-server → apps/studio}/server.ts +18 -0
- package/{plugins/design/dev-server → apps/studio}/sync/index.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/test/annotations-layer.test.ts +63 -0
- package/{plugins/design/dev-server → apps/studio}/test/annotations-roundtrip.test.ts +97 -0
- package/apps/studio/test/annotations-text-format.test.ts +396 -0
- package/apps/studio/test/asset-api.test.ts +149 -0
- package/apps/studio/test/canvas-create-api.test.ts +361 -0
- package/{plugins/design/dev-server → apps/studio}/test/canvas-cursors.test.ts +2 -0
- package/{plugins/design/dev-server → apps/studio}/test/canvas-lib-resolver.test.ts +1 -1
- package/apps/studio/test/canvas-media-drop.test.ts +158 -0
- package/{plugins/design/dev-server → apps/studio}/test/canvas-origin-gate.test.ts +17 -1
- package/apps/studio/test/canvas-url.test.ts +99 -0
- package/apps/studio/test/index-data-canvas-ds.test.ts +97 -0
- package/apps/studio/test/motion-sample.test.ts +35 -0
- package/{plugins/design/dev-server → apps/studio}/test/perf-harness.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/test/phase-3.6-smoke.test.ts +3 -1
- package/apps/studio/test/read-annotations.test.ts +409 -0
- package/{plugins/design/dev-server → apps/studio}/test/sanitize-annotation-svg.test.ts +108 -2
- package/{plugins/design/dev-server → apps/studio}/test/shared-doc-convergence.test.ts +1 -1
- package/apps/studio/test/tour-overlay.test.tsx +56 -0
- package/{plugins/design/dev-server → apps/studio}/test/use-annotation-resize.test.ts +43 -0
- package/{plugins/design/dev-server → apps/studio}/test/use-tool-mode.test.tsx +4 -1
- package/apps/studio/test/whats-new.test.ts +101 -0
- package/apps/studio/text-imports.d.ts +9 -0
- package/{plugins/design/dev-server → apps/studio}/tool-palette.tsx +4 -69
- package/{plugins/design/dev-server → apps/studio}/undo-hud.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/undo-stack.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/use-agent-presence.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/use-annotation-resize.tsx +40 -7
- package/{plugins/design/dev-server → apps/studio}/use-annotation-selection.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/use-annotations-visibility.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/use-artboard-drag.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/use-canvas-activity.tsx +1 -1
- package/apps/studio/use-canvas-media-drop.tsx +343 -0
- package/{plugins/design/dev-server → apps/studio}/use-collab.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/use-cursor-modifiers.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/use-keyboard-discipline.tsx +5 -2
- package/{plugins/design/dev-server → apps/studio}/use-selection-set.tsx +9 -1
- package/{plugins/design/dev-server → apps/studio}/use-snap-guides.tsx +1 -1
- package/{plugins/design/dev-server → apps/studio}/use-tool-mode.tsx +3 -1
- package/{plugins/design/dev-server → apps/studio}/use-undo-stack.tsx +1 -1
- package/apps/studio/whats-new.json +139 -0
- package/apps/studio/whats-new.schema.json +70 -0
- package/apps/studio/whats-new.ts +87 -0
- package/cli/bin/maude.mjs +10 -0
- package/cli/commands/design.mjs +15 -7
- package/cli/commands/design.test.mjs +36 -0
- package/cli/commands/help.mjs +8 -2
- package/cli/commands/hub.mjs +3 -3
- package/cli/commands/hub.test.mjs +1 -1
- package/cli/commands/scenario-report.mjs +2 -9
- package/cli/lib/flow-design-integration.test.mjs +1 -1
- package/cli/lib/gitignore-block.mjs +1 -0
- package/cli/lib/plugin-cli-reachability.test.mjs +8 -7
- package/cli/lib/preflight.mjs +1 -1
- package/package.json +15 -15
- package/plugins/design/templates/brief-board.tsx.template +61 -0
- package/plugins/design/templates/canvas.tsx.template +1 -1
- package/plugins/design/templates/design-system-inspiration/core/config.json.tpl +1 -1
- package/plugins/design/templates/design-system-inspiration/core/preview/_motion-readme.md.tpl +1 -1
- package/plugins/flow/.claude-plugin/config.schema.json +16 -0
- package/plugins/design/dev-server/dist/client.bundle.js +0 -20692
- package/plugins/design/dev-server/dist/comment-mount.js +0 -1924
- package/plugins/design/dev-server/dist/styles.css +0 -2710
- /package/{plugins/design/dev-server → apps/studio}/activity.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/_enumerate-artboards-playwright.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/_html-playwright.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/_pdf-playwright.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/_png-playwright.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/_pptx-playwright.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/_pw-launch.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/_screenshot-playwright.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/_svg-optimize.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/_svg-playwright.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/asset-sweep.sh +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/bootstrap-check.sh +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/check-runtime-bundles.sh +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/draw-build.sh +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/handoff.sh +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/prep.sh +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/scenario-report.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/slug.sh +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/smoke.sh +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/svg-optimize.sh +0 -0
- /package/{plugins/design/dev-server → apps/studio}/bin/visual-sanity.sh +0 -0
- /package/{plugins/design/dev-server → apps/studio}/boot-self-heal.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/canvas-build.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/canvas-edit.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/canvas-header.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/canvas-meta.schema.json +0 -0
- /package/{plugins/design/dev-server → apps/studio}/canvas-pipeline.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/client/hmr.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/client/iframe-lazy.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/client/styles/0-reset.css +0 -0
- /package/{plugins/design/dev-server → apps/studio}/client/styles/1-tokens.css +0 -0
- /package/{plugins/design/dev-server → apps/studio}/client/styles/2-layout.css +0 -0
- /package/{plugins/design/dev-server → apps/studio}/client/styles/5-utilities.css +0 -0
- /package/{plugins/design/dev-server → apps/studio}/collab/ai-activity.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/collab/awareness-bridge.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/collab/git-lifecycle.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/collab/index.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/collab/persistence.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/collab/protocol.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/collab/registry.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/collab/room.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/config.schema.json +0 -0
- /package/{plugins/design/dev-server → apps/studio}/context.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/.min-sizes.json +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/lib0_decoding.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/lib0_encoding.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/motion.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/motion_react.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/pixi-js.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react-dom.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react-dom_client.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react_jsx-dev-runtime.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/react_jsx-runtime.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/y-protocols_awareness.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/y-protocols_sync.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/dist/runtime/yjs.js +0 -0
- /package/{plugins/design/dev-server → apps/studio}/draw/test/brush.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/draw/test/composition.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/draw/test/geometry.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/draw/test/gradient.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/draw/test/layout.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/draw/test/optimize.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/draw/test/palette.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/draw/test/primitives.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/draw/test/serialize.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/examples/README.md +0 -0
- /package/{plugins/design/dev-server → apps/studio}/examples/perf-100-artboards.tsx +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/_browser-bundles.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/canva-handoff-prompt.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/canva.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/html.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/index.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/pdf.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/png.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/pptx.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/scope.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/svg.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/exporters/zip.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/fs-watch.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/handoff.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/history.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/hmr-broadcast.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/locator.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/mem.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/runtime-bundle.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/server.mjs +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/agent.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/atomic-write.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/codec.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/connection-state.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/echo-guard.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/fs-mirror.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/hubs-config.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/materialize.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/migrate-seed.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/origins.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/projection.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/status.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/sync/untrusted.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/_helpers.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/active-state.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/activity.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/ai-activity.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/annotation-strokes-command.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/annotations-api.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/annotations-draw-modifiers.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/artboard-activity-overlay.test.tsx +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/binary-smoke.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/boot-self-heal.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/bundle-smoke.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/canvas-build.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/canvas-edit.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/canvas-header.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/canvas-hmr-runtime.test.tsx +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/canvas-lib-inline.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/canvas-lib-motion.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/canvas-meta-api.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/canvas-pipeline.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/canvas-route.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/collab-annotations-bridge.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/collab-awareness-bridge.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/collab-bridge.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/collab-loopback.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/collab-protocol.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/collab-reseed-guard.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/collab-room.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/collab-stress.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/comment-mount.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/comments-api.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/compile-entry.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/context-resolve-tokens.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/csp-canvas-shell.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/equal-spacing-detector.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/canva.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/endpoint.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/history.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/html.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/pdf.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/png.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/pptx-deck.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/pptx.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/pw-launch.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/scope.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/svg.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/exporters/zip.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/fixtures/phase-20-annotations.svg +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/fixtures/phase-21-annotations.svg +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/fs-watch.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/git-lifecycle.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/handoff-static-frames.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/handoff.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/history-rollback.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/hmr-broadcast.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/hmr-classify.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/input-router.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/locator.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/marquee-overlay.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/move-artboards-command.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/participants-chrome.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/paths.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/runtime-bundle-error-mapping.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/runtime-bundle.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/server-lifecycle.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/shared-doc-foundation.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/shared-doc-migrate.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/shared-doc-projection.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/snap-distance-pill.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-agent.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-atomic-write.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-codec.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-connection-state.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-echo-guard.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-fs-mirror.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-hardening.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-hubs-config.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-meta-codec.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-runtime.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-status.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/sync-untrusted.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/system-endpoint.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/tool-palette.test.tsx +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/undo-stack.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/use-agent-presence.test.tsx +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/use-annotation-selection.test.tsx +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/use-artboard-drag.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/use-canvas-activity.test.tsx +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/use-collab.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/use-cursor-modifiers.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/use-keyboard-discipline.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/use-selection-set.test.tsx +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/use-snap-guides.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/use-undo-stack.test.tsx +0 -0
- /package/{plugins/design/dev-server → apps/studio}/test/ws-handshake.test.ts +0 -0
- /package/{plugins/design/dev-server → apps/studio}/tsconfig.json +0 -0
- /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(
|
package/cli/commands/design.mjs
CHANGED
|
@@ -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(
|
|
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
|
|
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'.
|
|
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, '
|
|
263
|
-
const mjsEntry = resolve(pkgRoot, '
|
|
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, '
|
|
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
|
+
});
|
package/cli/commands/help.mjs
CHANGED
|
@@ -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
|
|
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
|
|
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"
|
package/cli/commands/hub.mjs
CHANGED
|
@@ -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
|
|
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
|
|
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, '
|
|
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 '../../
|
|
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
|
|
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('
|
|
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
|
|
14
|
-
// `maude design <verb>`, never `bash "$CLAUDE_PLUGIN_ROOT/dev-server/bin/<x>.sh"
|
|
15
|
-
// The marketplace never copies the
|
|
16
|
-
// command's $CLAUDE_PLUGIN_ROOT points at
|
|
17
|
-
//
|
|
18
|
-
//
|
|
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
|
});
|
package/cli/lib/preflight.mjs
CHANGED
|
@@ -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
|
-
// -
|
|
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.
|
|
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": "
|
|
17
|
+
"claude-design-server": "apps/studio/server.mjs"
|
|
18
18
|
},
|
|
19
19
|
"scripts": {
|
|
20
|
-
"start": "bun run
|
|
21
|
-
"dev": "bun run
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
45
|
-
"@1agh/maude-darwin-x64": "0.
|
|
46
|
-
"@1agh/maude-linux-arm64": "0.
|
|
47
|
-
"@1agh/maude-linux-arm64-musl": "0.
|
|
48
|
-
"@1agh/maude-linux-x64": "0.
|
|
49
|
-
"@1agh/maude-linux-x64-musl": "0.
|
|
50
|
-
"@1agh/maude-win32-x64": "0.
|
|
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
|
-
"
|
|
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) & 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
|
-
* `
|
|
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/
|
|
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",
|
package/plugins/design/templates/design-system-inspiration/core/preview/_motion-readme.md.tpl
CHANGED
|
@@ -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: `
|
|
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
|
}
|