@1agh/maude 0.28.1 → 0.30.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 +3 -3
- package/{plugins/design/dev-server → apps/studio}/ai-banner.tsx +1 -2
- package/apps/studio/annotations-align.ts +149 -0
- package/apps/studio/annotations-bindings.ts +197 -0
- package/{plugins/design/dev-server → apps/studio}/annotations-context-toolbar.tsx +681 -151
- package/apps/studio/annotations-groups.ts +270 -0
- package/apps/studio/annotations-layer.tsx +4537 -0
- package/apps/studio/annotations-model.ts +2077 -0
- package/apps/studio/annotations-snap.ts +125 -0
- package/{plugins/design/dev-server → apps/studio}/api.ts +616 -70
- 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/_png-playwright.mjs +1 -1
- package/apps/studio/bin/annotate.mjs +732 -0
- package/apps/studio/bin/annotate.sh +17 -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 +573 -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 +6 -4
- package/{plugins/design/dev-server → apps/studio}/canvas-arrowheads.ts +79 -10
- 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 +48 -12
- package/{plugins/design/dev-server → apps/studio}/canvas-edit.ts +257 -7
- package/{plugins/design/dev-server → apps/studio}/canvas-icons.tsx +165 -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 +360 -48
- package/apps/studio/client/app.jsx +6742 -0
- package/apps/studio/client/canvas-url.js +81 -0
- package/{plugins/design/dev-server → apps/studio}/client/comments-overlay.css +41 -27
- package/apps/studio/client/index.html +16 -0
- package/apps/studio/client/styles/1-tokens-maude.css +296 -0
- package/apps/studio/client/styles/3-shell-maude.css +1161 -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 +396 -34
- package/apps/studio/client/styles/5-maude-overrides.css +137 -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 +279 -0
- package/apps/studio/client/tour/usage-tour.js +48 -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 +2 -2
- 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 +2 -2
- package/{plugins/design/dev-server → apps/studio}/comments-overlay.tsx +32 -11
- package/{plugins/design/dev-server → apps/studio}/context-menu.tsx +5 -4
- package/{plugins/design/dev-server → apps/studio}/contextual-toolbar.tsx +18 -7
- package/{plugins/design/dev-server → apps/studio}/cursors-overlay.tsx +21 -21
- package/apps/studio/dist/client.bundle.js +25545 -0
- package/apps/studio/dist/comment-mount.js +2046 -0
- package/apps/studio/dist/styles.css +8018 -0
- package/apps/studio/dom-selection.ts +342 -0
- 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 +16 -4
- package/{plugins/design/dev-server → apps/studio}/history.ts +20 -3
- package/{plugins/design/dev-server → apps/studio}/http.ts +226 -6
- package/{plugins/design/dev-server → apps/studio}/input-router.tsx +15 -1
- package/{plugins/design/dev-server → apps/studio}/inspect.ts +50 -4
- package/{plugins/design/dev-server → apps/studio}/marquee-overlay.tsx +5 -2
- package/{plugins/design/dev-server → apps/studio}/participants-chrome.tsx +2 -8
- package/{plugins/design/dev-server → apps/studio}/paths.ts +15 -11
- package/{plugins/design/dev-server → apps/studio}/server.ts +23 -2
- package/{plugins/design/dev-server → apps/studio}/sync/agent.ts +231 -57
- package/{plugins/design/dev-server → apps/studio}/sync/codec.ts +45 -0
- package/apps/studio/sync/cold-start.ts +158 -0
- package/{plugins/design/dev-server → apps/studio}/sync/connection-state.ts +58 -2
- package/{plugins/design/dev-server → apps/studio}/sync/index.ts +563 -221
- package/apps/studio/sync/journal.ts +190 -0
- package/apps/studio/sync/migrate-seed.ts +321 -0
- package/{plugins/design/dev-server → apps/studio}/sync/projection.ts +22 -3
- package/{plugins/design/dev-server → apps/studio}/sync/status.ts +15 -4
- package/{plugins/design/dev-server → apps/studio}/test/activity.test.ts +1 -7
- package/apps/studio/test/annotate-write.test.ts +184 -0
- package/apps/studio/test/annotations-align.test.ts +88 -0
- package/apps/studio/test/annotations-bindings.test.ts +124 -0
- package/apps/studio/test/annotations-groups.test.ts +231 -0
- 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-snap.test.ts +79 -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/apps/studio/test/canvas-edit.test.ts +319 -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 +25 -1
- package/apps/studio/test/canvas-url.test.ts +99 -0
- package/{plugins/design/dev-server → apps/studio}/test/collab-bridge.test.ts +0 -2
- package/{plugins/design/dev-server → apps/studio}/test/collab-room.test.ts +2 -7
- package/{plugins/design/dev-server → apps/studio}/test/csp-canvas-shell.test.ts +5 -0
- package/apps/studio/test/csrf-write-guard.test.ts +52 -0
- package/apps/studio/test/figjam-v3-model.test.ts +342 -0
- package/apps/studio/test/fixtures/figjam-v3-groups-bindings.svg +1 -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/shared-doc-migrate.test.ts +369 -0
- package/apps/studio/test/sync-agent.test.ts +575 -0
- package/{plugins/design/dev-server → apps/studio}/test/sync-codec.test.ts +65 -0
- package/apps/studio/test/sync-cold-start.test.ts +244 -0
- package/{plugins/design/dev-server → apps/studio}/test/sync-connection-state.test.ts +68 -0
- package/{plugins/design/dev-server → apps/studio}/test/sync-hardening.test.ts +0 -8
- package/{plugins/design/dev-server → apps/studio}/test/sync-hubs-config.test.ts +0 -1
- package/apps/studio/test/sync-incident-replay.test.ts +211 -0
- package/apps/studio/test/sync-journal.test.ts +176 -0
- package/{plugins/design/dev-server → apps/studio}/test/sync-runtime.test.ts +360 -5
- package/{plugins/design/dev-server → apps/studio}/test/sync-status.test.ts +66 -0
- package/apps/studio/test/tour-overlay.test.tsx +56 -0
- package/apps/studio/test/use-annotation-resize.test.ts +402 -0
- package/{plugins/design/dev-server → apps/studio}/test/use-artboard-drag.test.ts +0 -1
- package/{plugins/design/dev-server → apps/studio}/test/use-collab.test.ts +0 -0
- package/{plugins/design/dev-server → apps/studio}/test/use-tool-mode.test.tsx +8 -2
- 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 +15 -70
- package/{plugins/design/dev-server → apps/studio}/undo-hud.tsx +1 -2
- package/{plugins/design/dev-server → apps/studio}/undo-stack.ts +1 -1
- package/{plugins/design/dev-server → apps/studio}/use-agent-presence.tsx +5 -3
- package/apps/studio/use-annotation-resize.tsx +912 -0
- package/{plugins/design/dev-server → apps/studio}/use-annotation-selection.tsx +17 -5
- 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 +3 -3
- package/apps/studio/use-canvas-media-drop.tsx +343 -0
- package/{plugins/design/dev-server → apps/studio}/use-collab.tsx +21 -16
- 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 +18 -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 +8 -2
- package/{plugins/design/dev-server → apps/studio}/use-undo-stack.tsx +1 -1
- package/apps/studio/whats-new.json +264 -0
- package/apps/studio/whats-new.schema.json +86 -0
- package/apps/studio/whats-new.ts +87 -0
- package/cli/bin/maude.mjs +10 -0
- package/cli/commands/design-link.test.mjs +84 -0
- package/cli/commands/design.mjs +16 -7
- package/cli/commands/design.test.mjs +40 -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/design-link.mjs +51 -1
- 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/_shell.html +28 -4
- 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/annotations-layer.tsx +0 -3402
- package/plugins/design/dev-server/client/app.jsx +0 -2985
- package/plugins/design/dev-server/client/index.html +0 -15
- 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/dom-selection.ts +0 -156
- package/plugins/design/dev-server/sync/migrate-seed.ts +0 -163
- package/plugins/design/dev-server/test/canvas-edit.test.ts +0 -139
- package/plugins/design/dev-server/test/shared-doc-migrate.test.ts +0 -159
- package/plugins/design/dev-server/test/sync-agent.test.ts +0 -305
- package/plugins/design/dev-server/test/use-annotation-resize.test.ts +0 -200
- package/plugins/design/dev-server/use-annotation-resize.tsx +0 -449
- /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/_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-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}/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/atomic-write.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/origins.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/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-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-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-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/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-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-atomic-write.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-meta-codec.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-canvas-activity.test.tsx +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
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);
|
package/cli/lib/design-link.mjs
CHANGED
|
@@ -108,6 +108,16 @@ export async function runLink({ args, cwd = process.cwd(), forceAdopt = false })
|
|
|
108
108
|
process.exit(1);
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
// DDR-102 incident learning (same-machine token overwrite): hubs.json is
|
|
112
|
+
// keyed per hub URL only, so a second `link --token` silently replaced the
|
|
113
|
+
// first machine-wide — both dev servers then authenticated as the same
|
|
114
|
+
// label and shared one hub rate bucket. Make the overwrite explicit.
|
|
115
|
+
if (getHub(normUrl)) {
|
|
116
|
+
process.stdout.write(
|
|
117
|
+
`[design link] note: replacing the stored token for ${normUrl} (the token is per-machine — this applies to EVERY project linked to this hub on this machine).\n`
|
|
118
|
+
);
|
|
119
|
+
}
|
|
120
|
+
|
|
111
121
|
// Write hub side: token (+ adopt attestation) in ~/.config/maude/hubs.json.
|
|
112
122
|
const hubRecord = addHub(normUrl, token, adopt ? { adoptedAt: Date.now() } : {});
|
|
113
123
|
|
|
@@ -262,16 +272,56 @@ export async function runStatus({ args, cwd = process.cwd() }) {
|
|
|
262
272
|
}
|
|
263
273
|
|
|
264
274
|
const uptimeS = Math.round((probe.uptimeMs ?? 0) / 1000);
|
|
275
|
+
// DDR-102 — per-doc rollup (old payloads without `docs` render unchanged).
|
|
276
|
+
const docsLine = sync?.docs
|
|
277
|
+
? `, docs: ${sync.docs.synced} synced · ${sync.docs.pending} pending · ${sync.docs.rejected} rejected`
|
|
278
|
+
: '';
|
|
265
279
|
const syncLine = sync?.notSyncable
|
|
266
280
|
? `linked but 0 syncable canvases — ${sync.reason}`
|
|
267
281
|
: sync
|
|
268
282
|
? `${sync.state}${sync.sharedDoc ? ' [shared-doc]' : ''}${sync.queuedOps ? ` — ${sync.queuedOps} edit(s) queued` : ''}${
|
|
269
283
|
sync.lastSyncAt ? `, last sync ${new Date(sync.lastSyncAt).toISOString()}` : ''
|
|
270
|
-
}${sync.conflicts?.length ? `, ${sync.conflicts.length} conflict notice(s)` : ''}`
|
|
284
|
+
}${docsLine}${sync.conflicts?.length ? `, ${sync.conflicts.length} conflict notice(s)` : ''}`
|
|
271
285
|
: 'idle (start `maude design serve` in linked mode)';
|
|
272
286
|
process.stdout.write(
|
|
273
287
|
`Maude design — linked mode\n hub URL: ${url}\n linked at: ${new Date(cfg.linkedHub.linkedAt).toISOString()}\n adopt mode: ${cfg.linkedHub.adopt ? 'yes (push-on-first-sync)' : 'no (hub-wins)'}\n TSX sync: ${cfg.linkedHub.syncTsx === false ? 'off (opted out — linkedHub.syncTsx: false)' : 'on (default — DDR-079)'}\n token stored: ${hubRecord ? 'yes (~/.config/maude/hubs.json)' : "NO — re-run 'maude design link'"}\n hub status: ${probe.ok ? `up — v${probe.version}, ${uptimeS}s uptime, ${probe.tokenCount} token(s), ${probe.authMode}` : `UNREACHABLE — ${probe.error}`}\n sync agent: ${syncLine}\n`
|
|
274
288
|
);
|
|
289
|
+
// DDR-102 — auth-rejected canvases (per-slug honesty).
|
|
290
|
+
if (Array.isArray(sync?.rejectedSlugs) && sync.rejectedSlugs.length > 0) {
|
|
291
|
+
const total = sync.docs?.rejected ?? sync.rejectedSlugs.length;
|
|
292
|
+
const more =
|
|
293
|
+
total > sync.rejectedSlugs.length ? ` (+${total - sync.rejectedSlugs.length} more)` : '';
|
|
294
|
+
process.stdout.write(
|
|
295
|
+
` not syncing: ${sync.rejectedSlugs.join(', ')}${more} — hub rejected auth; the serve log names the reason (scope / invalid token / rate limit).\n`
|
|
296
|
+
);
|
|
297
|
+
}
|
|
298
|
+
// DDR-102 — conflict log with winner + snapshot refs + the recovery story.
|
|
299
|
+
if (Array.isArray(sync?.conflicts) && sync.conflicts.length > 0) {
|
|
300
|
+
process.stdout.write(' conflicts:\n');
|
|
301
|
+
for (const c of sync.conflicts.slice(-10)) {
|
|
302
|
+
const at = c.at ? new Date(c.at).toISOString() : '?';
|
|
303
|
+
if (c.kind === 'cold-start-diverged') {
|
|
304
|
+
const snaps = c.snapshots
|
|
305
|
+
? ` snapshots: ${[
|
|
306
|
+
c.snapshots.local ? `local@${c.snapshots.local}` : null,
|
|
307
|
+
c.snapshots.hub ? `hub@${c.snapshots.hub}` : null,
|
|
308
|
+
]
|
|
309
|
+
.filter(Boolean)
|
|
310
|
+
.join(' ')}`
|
|
311
|
+
: '';
|
|
312
|
+
process.stdout.write(
|
|
313
|
+
` ${at} ${c.slug} — diverged, kept ${c.winner ?? 'hub'} (newest-wins);${snaps}\n recover the other version: /design:rollback ${c.slug}\n`
|
|
314
|
+
);
|
|
315
|
+
if (c.snapshotFailed) {
|
|
316
|
+
process.stdout.write(
|
|
317
|
+
` ⚠ the _history snapshot FAILED — local was KEPT instead of overwritten (DDR-102 fail-closed); check disk space / _history write perms.\n`
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
} else {
|
|
321
|
+
process.stdout.write(` ${at} ${c.slug} — ${c.kind}\n`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
275
325
|
// DDR-079 migration advisory: a config with no explicit `syncTsx` rides the
|
|
276
326
|
// default, which FLIPPED from off→on in maude 0.27. Surface it so an upgrader
|
|
277
327
|
// who relied on the old "TSX never syncs" behavior isn't surprised that every
|
|
@@ -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.30.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.30.0",
|
|
45
|
+
"@1agh/maude-darwin-x64": "0.30.0",
|
|
46
|
+
"@1agh/maude-linux-arm64": "0.30.0",
|
|
47
|
+
"@1agh/maude-linux-arm64-musl": "0.30.0",
|
|
48
|
+
"@1agh/maude-linux-x64": "0.30.0",
|
|
49
|
+
"@1agh/maude-linux-x64-musl": "0.30.0",
|
|
50
|
+
"@1agh/maude-win32-x64": "0.30.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",
|
|
@@ -177,14 +177,27 @@
|
|
|
177
177
|
// ai-activity via postMessage when embedded; the own-WS path (standalone /
|
|
178
178
|
// same-origin inspector socket) is handled in connectHmr below.
|
|
179
179
|
let agentEditing = false;
|
|
180
|
+
// SECURITY (ethical-hacker A1) — the CSS-panel optimistic-reload-skip
|
|
181
|
+
// timestamp lives HERE, in the shell-script closure, NOT a window global:
|
|
182
|
+
// the canvas module shares this realm, so a window global would let
|
|
183
|
+
// untrusted canvas JS pin it and suppress reloads to desync view/source.
|
|
184
|
+
// It's set ONLY from the parent-gated message below (a canvas self-post
|
|
185
|
+
// can't reach it), and the HMR echo-guard reads this local, not window.*.
|
|
186
|
+
let lastCssOptimisticAt = 0;
|
|
180
187
|
window.addEventListener('message', (e) => {
|
|
181
188
|
// DDR-078 security follow-up: only the trusted embedding parent relays
|
|
182
|
-
// ai-activity. Reject canvas self-posts (which could flip
|
|
183
|
-
// and any non-parent source. Standalone gets it via its
|
|
189
|
+
// ai-activity / apply-style. Reject canvas self-posts (which could flip
|
|
190
|
+
// the HMR gate) and any non-parent source. Standalone gets it via its WS.
|
|
184
191
|
if (e.source !== window.parent || window.parent === window) return;
|
|
185
192
|
const m = e && e.data;
|
|
186
|
-
if (!m || typeof m !== 'object'
|
|
187
|
-
if (
|
|
193
|
+
if (!m || typeof m !== 'object') return;
|
|
194
|
+
if (m.dgn === 'ai-activity') {
|
|
195
|
+
if (myFileKey && m.file === myFileKey) agentEditing = !!m.entry;
|
|
196
|
+
} else if (m.dgn === 'apply-style') {
|
|
197
|
+
// The panel just optimistically applied an edit → skip the redundant
|
|
198
|
+
// follow-up module reload (set here, parent-verified).
|
|
199
|
+
lastCssOptimisticAt = Date.now();
|
|
200
|
+
}
|
|
188
201
|
});
|
|
189
202
|
|
|
190
203
|
// Soft reload — re-import the canvas module (cache-busted) and swap it in
|
|
@@ -320,6 +333,17 @@
|
|
|
320
333
|
} else if (msg.mode === 'module' || msg.mode === 'hard') {
|
|
321
334
|
// Only reload when the change touches *this* canvas (or `_lib`).
|
|
322
335
|
if (msg.mode === 'hard' || !msg.file || (canvasRel && msg.file === canvasRel)) {
|
|
336
|
+
// Phase 12.3 — CSS-panel echo guard. The panel applies each
|
|
337
|
+
// edit optimistically to the live DOM (dgn:'apply-style'), so a
|
|
338
|
+
// `module` reload for THIS canvas's own edit is redundant churn:
|
|
339
|
+
// it remounts the canvas, drops the selection halo, and flickers
|
|
340
|
+
// the iframe. Skip it within a short window of a self-applied
|
|
341
|
+
// optimistic style. `hard` (_lib rebuild) is global — never
|
|
342
|
+
// skipped. Mirrors the meta echo-guard below.
|
|
343
|
+
if (msg.mode === 'module') {
|
|
344
|
+
// read the parent-verified local (NOT a canvas-writable global)
|
|
345
|
+
if (Date.now() - lastCssOptimisticAt < 1500) return;
|
|
346
|
+
}
|
|
323
347
|
// Phase 13.1 / DDR-077 — when an agent is live-editing, soft-
|
|
324
348
|
// reload (hold last good on a broken intermediate). Manual edits
|
|
325
349
|
// (or no runtime yet) keep the plain, immediate hard reload.
|
|
@@ -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
|
}
|