@1agh/maude 0.45.2 → 0.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/apps/studio/acp/bootstrap-brief.ts +8 -0
  2. package/apps/studio/acp/bridge.ts +151 -1
  3. package/apps/studio/annotations-layer.tsx +42 -0
  4. package/apps/studio/annotations-snap.ts +50 -10
  5. package/apps/studio/api.ts +760 -15
  6. package/apps/studio/artboard-guides-overlay.tsx +270 -0
  7. package/apps/studio/bin/_agent-browser-safe-config.json +1 -0
  8. package/apps/studio/bin/_agent-browser-safe.mjs +228 -0
  9. package/apps/studio/bin/_agent-browser-safe.test.mjs +165 -0
  10. package/apps/studio/bin/_curl-local.mjs +349 -0
  11. package/apps/studio/bin/_curl-local.test.mjs +280 -0
  12. package/apps/studio/bin/_pdf-playwright.mjs +35 -4
  13. package/apps/studio/bin/_png-playwright.mjs +38 -4
  14. package/apps/studio/bin/_pw-launch.mjs +52 -0
  15. package/apps/studio/bin/_pw-launch.test.mjs +90 -0
  16. package/apps/studio/bin/_smart-frames.mjs +419 -0
  17. package/apps/studio/bin/_smart-frames.test.mjs +140 -0
  18. package/apps/studio/bin/agent-browser-safe.sh +29 -0
  19. package/apps/studio/bin/curl-local.sh +28 -0
  20. package/apps/studio/bin/smart-frames.sh +30 -0
  21. package/apps/studio/canvas-cursors.ts +6 -0
  22. package/apps/studio/canvas-edit.ts +972 -6
  23. package/apps/studio/canvas-icons.tsx +13 -0
  24. package/apps/studio/canvas-lib.tsx +206 -11
  25. package/apps/studio/canvas-shell.tsx +809 -50
  26. package/apps/studio/client/app.jsx +1554 -206
  27. package/apps/studio/client/panels/ChatPanel.jsx +92 -3
  28. package/apps/studio/client/panels/SettingsPanel.jsx +211 -0
  29. package/apps/studio/client/panels/acp-capabilities.js +11 -0
  30. package/apps/studio/client/styles/3-shell-maude.css +39 -0
  31. package/apps/studio/client/styles/6-acp-chat.css +41 -0
  32. package/apps/studio/contextual-toolbar.tsx +5 -3
  33. package/apps/studio/dist/client.bundle.js +1627 -1627
  34. package/apps/studio/dist/comment-mount.js +2 -2
  35. package/apps/studio/dist/styles.css +1 -1
  36. package/apps/studio/dom-selection.ts +20 -0
  37. package/apps/studio/export-dialog.tsx +138 -18
  38. package/apps/studio/exporters/pdf.ts +332 -18
  39. package/apps/studio/exporters/png.ts +45 -3
  40. package/apps/studio/footage/schema.ts +17 -1
  41. package/apps/studio/generation/gemma-models.ts +224 -0
  42. package/apps/studio/generation/prefs.ts +43 -0
  43. package/apps/studio/grid-track-handles.ts +179 -0
  44. package/apps/studio/handoff.ts +35 -0
  45. package/apps/studio/http.ts +331 -7
  46. package/apps/studio/input-router.tsx +73 -17
  47. package/apps/studio/print/marks.ts +113 -0
  48. package/apps/studio/print/units.ts +269 -0
  49. package/apps/studio/print-overlay-content.tsx +132 -0
  50. package/apps/studio/test/acp-mode-banner.test.ts +45 -0
  51. package/apps/studio/test/acp-session-allowed-tools.test.ts +187 -0
  52. package/apps/studio/test/annotations-snap.test.ts +56 -0
  53. package/apps/studio/test/artboard-guides-overlay.test.tsx +152 -0
  54. package/apps/studio/test/artboard-kinds.test.tsx +83 -0
  55. package/apps/studio/test/artboard-selection-attrs.test.ts +69 -0
  56. package/apps/studio/test/browse-posture.test.tsx +107 -0
  57. package/apps/studio/test/canvas-hide-chrome.test.ts +58 -0
  58. package/apps/studio/test/canvas-meta-api.test.ts +237 -0
  59. package/apps/studio/test/canvas-origin-gate.test.ts +4 -0
  60. package/apps/studio/test/comment-mount.test.ts +2 -1
  61. package/apps/studio/test/component-map.test.ts +48 -0
  62. package/apps/studio/test/convert-to-absolute.test.ts +333 -0
  63. package/apps/studio/test/detach-component.test.ts +94 -0
  64. package/apps/studio/test/edit-scope-api.test.ts +8 -4
  65. package/apps/studio/test/element-structural-api.test.ts +74 -0
  66. package/apps/studio/test/element-structural-edit.test.ts +363 -0
  67. package/apps/studio/test/exporters/png.test.ts +49 -1
  68. package/apps/studio/test/grid-track-handles.test.ts +160 -0
  69. package/apps/studio/test/handoff.test.ts +48 -0
  70. package/apps/studio/test/input-router.test.ts +82 -8
  71. package/apps/studio/test/layers-synthetic-groups.test.ts +96 -0
  72. package/apps/studio/test/pdf-print-boxes.test.ts +326 -0
  73. package/apps/studio/test/print-marks.test.ts +113 -0
  74. package/apps/studio/test/print-units.test.ts +173 -0
  75. package/apps/studio/test/use-snap-guides.test.ts +81 -0
  76. package/apps/studio/test/use-tool-mode.test.tsx +10 -2
  77. package/apps/studio/tool-palette.tsx +3 -1
  78. package/apps/studio/use-canvas-media-drop.tsx +126 -0
  79. package/apps/studio/use-chrome-visibility.tsx +19 -0
  80. package/apps/studio/use-element-resize.tsx +24 -3
  81. package/apps/studio/use-grid-track-handles.tsx +364 -0
  82. package/apps/studio/use-keyboard-discipline.tsx +15 -0
  83. package/apps/studio/use-snap-guides.tsx +73 -5
  84. package/apps/studio/use-spacing-handles.tsx +9 -5
  85. package/apps/studio/use-tool-mode.tsx +30 -3
  86. package/apps/studio/web-overlay-content.tsx +52 -0
  87. package/apps/studio/whats-new.json +55 -0
  88. package/cli/commands/design.mjs +25 -1
  89. package/package.json +8 -8
  90. package/plugins/design/dependencies.json +35 -0
  91. package/plugins/design/templates/_shell.html +4 -0
@@ -1,6 +1,61 @@
1
1
  {
2
2
  "$schema": "./whats-new.schema.json",
3
3
  "entries": [
4
+ {
5
+ "id": "figma-smart-select",
6
+ "version": "0.47.0",
7
+ "date": "2026-07-21",
8
+ "kind": "feature",
9
+ "title": "Click to select, like Figma",
10
+ "summary": "Your mock now opens live — click a button or link to actually try it. When you want to edit, press V: a plain click selects the object under your cursor, ⌘-click reaches the deepest element, double-click drills in one level, and Enter / Shift+Enter / Tab walk the layer tree. The toolbar's first two tools are Browse (live) and Select (V). The Layers panel grew up too: wrapper groups show at their real depth, component instances render purple with their component's name, you can lock a layer (locked layers can't be selected or dragged on the canvas), double-click a layer's name to rename it, and the tree auto-reveals whatever you pick on the canvas. And when a flex layout fights your manual tweaks, right-click the container → \"Convert children to absolute position\" freezes every child where it sits so you can drag them freely (one undo reverts it) — or convert a whole artboard at once (right-click the artboard, or when switching its kind to Digital/Print). And when a component instance needs its own look, hit Detach on the Inspector's Shared badge — edits stay local to that one instance. Text editing got Figma's exact rhythm too: drilling down to a text layer selects all of it (ready to overwrite), and once you're in, a click places the cursor, a double-click grabs a word, and a triple-click grabs everything.",
11
+ "surface": "design-ui"
12
+ },
13
+ {
14
+ "id": "acp-safe-defaults-and-attention-notifications",
15
+ "version": "0.47.0",
16
+ "date": "2026-07-21",
17
+ "kind": "improvement",
18
+ "title": "Fewer prompts in chat, and a nudge when you're needed",
19
+ "summary": "The assistant chat now runs common design-workflow actions — browser checks, your own local dev-server requests, reading files, and web search — without asking every time. And when a chat is waiting on your approval or an answer, Maude now sends a system notification so you don't miss it.",
20
+ "surface": "design-ui"
21
+ },
22
+ {
23
+ "id": "web-artboards",
24
+ "version": "0.47.0",
25
+ "date": "2026-07-21",
26
+ "kind": "feature",
27
+ "title": "Web artboards — breakpoints, duplicate, and a grid editor",
28
+ "summary": "Set an artboard's kind to Web and it becomes a responsive viewport: a small chip shows its current breakpoint, and \"Duplicate at width…\" (right-click or the Inspector) clones it at Mobile/Tablet/Laptop/Desktop widths for reflow testing. Grid containers also get a new Grid section in the Inspector — define columns and rows with px/%/fr/em/auto units, drag the gutters directly on the canvas, and place children into specific cells.",
29
+ "surface": "design-ui"
30
+ },
31
+ {
32
+ "id": "scene-aware-video-analyze",
33
+ "version": "0.46.0",
34
+ "date": "2026-07-18",
35
+ "kind": "feature",
36
+ "title": "Analyze a video — picture and sound — in one command",
37
+ "summary": "Run /design:video-analyze on a clip and Maude reads it end to end: it picks keyframes at real scene changes and action beats (not a blind frame rate), transcribes the audio, and writes a summary with shots, on-screen text, mood, and the best moment to use. A new Settings → Video section lets you choose the analysis engine and, on Apple Silicon, download an optional local Gemma model for smarter shot detection.",
38
+ "surface": "design-ui"
39
+ },
40
+ {
41
+ "id": "print-artboards",
42
+ "version": "0.46.0",
43
+ "date": "2026-07-18",
44
+ "kind": "feature",
45
+ "title": "Design flyers, posters, and business cards — print-ready",
46
+ "summary": "Give a print artboard a real paper size (A4, Letter, business card, and more) and it resolves to the correct bleed-inclusive dimensions automatically. Toggle bleed/trim/margin guides from the View menu while you work, then export a 300–600 DPI PNG or a print-ready PDF with correct page boxes and crop/registration marks.",
47
+ "surface": "design-ui",
48
+ "learnMore": "https://maude.sh/docs/design/print"
49
+ },
50
+ {
51
+ "id": "artboard-kinds-foundation",
52
+ "version": "0.46.0",
53
+ "date": "2026-07-18",
54
+ "kind": "feature",
55
+ "title": "Artboards now know what they are",
56
+ "summary": "Give any artboard a kind — Digital, Print, Web, or Video — from the Inspector or the right-click menu, and it gets its own chrome. New generic layout guides (columns, rows, grid) can be toggled on from the View menu for any artboard. Print- and web-specific tools land in follow-up releases.",
57
+ "surface": "design-ui"
58
+ },
4
59
  {
5
60
  "id": "acp-ask-user-question",
6
61
  "version": "0.45.2",
@@ -87,6 +87,14 @@ const BIN_VERBS = new Set([
87
87
  // reads the clip as a file:// resource).
88
88
  'ingest-footage',
89
89
  'probe-footage',
90
+ // feature-scene-aware-keyframes. `smart-frames` is the scene-AWARE sibling of
91
+ // `probe-footage`: it selects keyframes at scene cuts + semantic action beats +
92
+ // endpoints (three tiers, auto-detected — gemma scout / ffmpeg scene-detect /
93
+ // blind Chromium floor) instead of a blind frame rate, and emits a SUPERSET of
94
+ // probe-footage's manifest (drop-in for the footage-analyst). No dev server.
95
+ // Owned by skill `footage-keyframes`; --engine auto self-detects deps so it
96
+ // works standalone as a terminal video analyzer.
97
+ 'smart-frames',
90
98
  // feature-ai-media-generation (Phase 0, DDR-16x). `generate` is the thin
91
99
  // non-browser BYOK verb (curl → /_api/generate-jobs → poll → print the
92
100
  // produced /assets/<sha8>.<ext>). The provider call happens server-side (the
@@ -102,6 +110,22 @@ const BIN_VERBS = new Set([
102
110
  // user's ElevenLabs history before spending credits on a new music/SFX/VO
103
111
  // track. Runs server-side (key resolved by the sidecar); needs a dev server.
104
112
  'audio-search',
113
+ // DDR-185. `curl-local` is a loopback-only curl: resolves the request's
114
+ // target host and refuses to invoke real curl at all unless every resolved
115
+ // address is strictly loopback (127.0.0.0/8 or ::1). Exists so an ACP chat
116
+ // session can auto-approve "check my local dev server" without widening the
117
+ // session's Bash allow-list to unscoped curl (`Bash(curl:*)` would reach any
118
+ // host — see DDR-185's rejected alternatives). No dev server dependency —
119
+ // pure Node, no `<designRoot>` involvement.
120
+ 'curl-local',
121
+ // DDR-185 security addendum. `agent-browser-safe` replaces the bare
122
+ // `Bash(agent-browser:*)` allow-list entry a security review found was a
123
+ // zero-confirmation session-hijack primitive (agent-browser's own bundled
124
+ // skill recommends a PERSISTENT authenticated Chrome profile). Closed
125
+ // subcommand allow-list + forced domain scope + forced ephemeral profile —
126
+ // see `_agent-browser-safe.mjs` for the full rationale. No dev server
127
+ // dependency — pure Node.
128
+ 'agent-browser-safe',
105
129
  ]);
106
130
 
107
131
  // Bin verbs that boot the dev-server (directly, or by shelling into server-up.sh).
@@ -290,7 +314,7 @@ Dev-tooling (dispatch to the dev-server bash helpers — DDR-062):
290
314
  screenshot · server-up · prep · slug · bootstrap-check · runtime-health
291
315
  smoke · canvas-edit · handoff · asset-sweep · visual-sanity · fetch-asset
292
316
  draw-build · draw-proof · svg-optimize · to-lottie · read-annotations · annotate
293
- canvas-rects · ingest-footage · probe-footage
317
+ canvas-rects · ingest-footage · probe-footage · smart-frames
294
318
  generate · transcribe · audio-search
295
319
  Invoke the bundled helper of the same name. maude resolves it from its
296
320
  own package root and sets CLAUDE_PLUGIN_ROOT for the child; stdout,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1agh/maude",
3
- "version": "0.45.2",
3
+ "version": "0.47.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": {
@@ -51,13 +51,13 @@
51
51
  "test:e2e:desktop:acp-cold-start": "pnpm --filter @maude/desktop-e2e e2e:acp-cold-start"
52
52
  },
53
53
  "optionalDependencies": {
54
- "@1agh/maude-darwin-arm64": "0.45.2",
55
- "@1agh/maude-darwin-x64": "0.45.2",
56
- "@1agh/maude-linux-arm64": "0.45.2",
57
- "@1agh/maude-linux-arm64-musl": "0.45.2",
58
- "@1agh/maude-linux-x64": "0.45.2",
59
- "@1agh/maude-linux-x64-musl": "0.45.2",
60
- "@1agh/maude-win32-x64": "0.45.2"
54
+ "@1agh/maude-darwin-arm64": "0.47.0",
55
+ "@1agh/maude-darwin-x64": "0.47.0",
56
+ "@1agh/maude-linux-arm64": "0.47.0",
57
+ "@1agh/maude-linux-arm64-musl": "0.47.0",
58
+ "@1agh/maude-linux-x64": "0.47.0",
59
+ "@1agh/maude-linux-x64-musl": "0.47.0",
60
+ "@1agh/maude-win32-x64": "0.47.0"
61
61
  },
62
62
  "files": [
63
63
  "cli",
@@ -213,6 +213,41 @@
213
213
  "fallbackBehavior": "feature-ai-media-generation Phase 2 (DDR-164) — `maude design transcribe` uses whisper.cpp for local, no-key, word-timestamped subtitles (the DEFAULT subtitle path). Without it, transcription falls back to cloud STT (ElevenLabs Scribe / Groq Whisper) via a provider key. whisper.cpp also needs a ggml model file (--model / $MAUDE_WHISPER_MODEL); it ships no default and does not auto-download — see https://huggingface.co/ggerganov/whisper.cpp (e.g. ggml-large-v3-turbo.bin).",
214
214
  "usedBy": ["dev-server/bin/transcribe.sh", "dev-server/bin/_transcribe.mjs"],
215
215
  "docsUrl": "https://github.com/ggml-org/whisper.cpp"
216
+ },
217
+ {
218
+ "id": "ffmpeg",
219
+ "type": "cli",
220
+ "hardness": "soft",
221
+ "check": {
222
+ "command": "ffmpeg -version",
223
+ "expectExit": 0
224
+ },
225
+ "install": {
226
+ "darwin": "brew install ffmpeg",
227
+ "linux": "apt-get install -y ffmpeg || dnf install -y ffmpeg",
228
+ "preferred": "https://ffmpeg.org/download.html"
229
+ },
230
+ "autoInstall": false,
231
+ "fallbackBehavior": "feature-scene-aware-keyframes — the `ffmpeg` tier of `maude design smart-frames` (skill footage-keyframes) uses ffmpeg scene-detection to pick keyframes at real shot cuts. Without it, the extractor falls back to the blind Chromium tier (probe-footage, even-spaced) — still works, just not scene-aware.",
232
+ "usedBy": ["dev-server/bin/smart-frames.sh", "dev-server/bin/_smart-frames.mjs"],
233
+ "docsUrl": "https://ffmpeg.org"
234
+ },
235
+ {
236
+ "id": "mlx-vlm",
237
+ "type": "cli",
238
+ "hardness": "soft",
239
+ "check": {
240
+ "command": "python3 -c \"import mlx_vlm\"",
241
+ "expectExit": 0
242
+ },
243
+ "install": {
244
+ "darwin": "pip install mlx-vlm",
245
+ "preferred": "https://github.com/Blaizzy/mlx-vlm"
246
+ },
247
+ "autoInstall": false,
248
+ "fallbackBehavior": "feature-scene-aware-keyframes — OPT-IN. The `gemma` tier of `maude design smart-frames` runs a local Gemma-4 MLX scout (Apple Silicon only) to flag semantic action beats. Without it, smart-frames uses the ffmpeg or blind tier — no model download required. The scout also needs a Gemma-4 MLX model (--engine gemma / $MAUDE_GEMMA_MODEL, one-click in Studio Settings → Scene-aware keyframes).",
249
+ "usedBy": ["dev-server/bin/_smart-frames.mjs"],
250
+ "docsUrl": "https://github.com/Blaizzy/mlx-vlm"
216
251
  }
217
252
  ]
218
253
  }
@@ -116,6 +116,10 @@
116
116
  .dc-hmr-holding,
117
117
  /* Artboard title/label button (editor affordance, not design content) */
118
118
  .dc-artboard-label,
119
+ /* Print/bleed/trim/margin guide overlay (feature-2-print-artboards) —
120
+ in-app-only chrome; never part of a PDF/PNG/SVG export (RCA
121
+ issue-pdf-print-export-marks-missing). */
122
+ .dc-artboard-guides,
119
123
  /* Generic opt-in hooks for any future floating overlay */
120
124
  [data-dc-overlay],
121
125
  [data-mdcc-annotations] { display: none !important; }