@1agh/maude 0.60.6 → 1.0.2

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 (145) hide show
  1. package/apps/studio/acp/index.ts +1 -0
  2. package/apps/studio/ai-banner.tsx +1 -0
  3. package/apps/studio/annotations-context-toolbar.tsx +3 -1
  4. package/apps/studio/annotations-layer.tsx +33 -16
  5. package/apps/studio/api.ts +108 -18
  6. package/apps/studio/artboard-guides-overlay.tsx +5 -1
  7. package/apps/studio/assets-s3.ts +6 -1
  8. package/apps/studio/bin/_import-figma.mjs +8 -3
  9. package/apps/studio/build.ts +1 -1
  10. package/apps/studio/canvas-artifacts.ts +21 -0
  11. package/apps/studio/canvas-build.ts +14 -9
  12. package/apps/studio/canvas-comment-mount.tsx +27 -30
  13. package/apps/studio/canvas-icons.tsx +1 -1
  14. package/apps/studio/canvas-lib.tsx +94 -5
  15. package/apps/studio/canvas-list-watch.ts +14 -1
  16. package/apps/studio/canvas-shell.tsx +8 -0
  17. package/apps/studio/client/app.jsx +224 -45
  18. package/apps/studio/client/panels/GitPanel.jsx +121 -13
  19. package/apps/studio/client/panels/SettingsPanel.jsx +1 -1
  20. package/apps/studio/client/panels/SyncConsentDialog.jsx +182 -0
  21. package/apps/studio/client/panels/SyncPanel.jsx +595 -1
  22. package/apps/studio/client/styles/3-shell-maude.css +38 -0
  23. package/apps/studio/clip-ops.ts +8 -1
  24. package/apps/studio/cloud/endpoints.ts +265 -3
  25. package/apps/studio/collab/origins.ts +3 -1
  26. package/apps/studio/comments-overlay.tsx +5 -0
  27. package/apps/studio/config.schema.json +24 -0
  28. package/apps/studio/context-menu.tsx +40 -27
  29. package/apps/studio/context.ts +57 -8
  30. package/apps/studio/cursors-overlay.tsx +25 -13
  31. package/apps/studio/dist/client.bundle.js +686 -686
  32. package/apps/studio/dist/comment-mount.js +2 -2
  33. package/apps/studio/dist/styles.css +1 -1
  34. package/apps/studio/exporters/jobs.ts +77 -15
  35. package/apps/studio/exporters/remote.ts +190 -0
  36. package/apps/studio/exporters/video-encode-lib.ts +10 -4
  37. package/apps/studio/figma/to-strokes.ts +11 -9
  38. package/apps/studio/gifenc.d.ts +51 -0
  39. package/apps/studio/git/log-format.ts +88 -0
  40. package/apps/studio/git/safe-rel.ts +96 -0
  41. package/apps/studio/git/service.ts +46 -27
  42. package/apps/studio/hmr-broadcast.ts +10 -0
  43. package/apps/studio/http.ts +384 -6
  44. package/apps/studio/participants-chrome.tsx +1 -0
  45. package/apps/studio/photo-store.ts +7 -0
  46. package/apps/studio/react-augment.d.ts +17 -0
  47. package/apps/studio/runtime-bundle.ts +6 -1
  48. package/apps/studio/server.ts +43 -8
  49. package/apps/studio/sync/agent.ts +70 -82
  50. package/apps/studio/sync/asset-push.ts +28 -6
  51. package/apps/studio/sync/autocommit.ts +106 -5
  52. package/apps/studio/sync/cell-file-events.ts +117 -0
  53. package/apps/studio/sync/cell-pairing.ts +20 -5
  54. package/apps/studio/sync/cell-write-nudge.ts +244 -0
  55. package/apps/studio/sync/codec.ts +155 -3
  56. package/apps/studio/sync/cold-start-apply.ts +211 -0
  57. package/apps/studio/sync/ctl-heal.ts +253 -0
  58. package/apps/studio/sync/ctl-provider.ts +217 -0
  59. package/apps/studio/sync/decide-file.ts +335 -0
  60. package/apps/studio/sync/file-ledger.ts +581 -0
  61. package/apps/studio/sync/file-membership.ts +32 -0
  62. package/apps/studio/sync/file-plane.ts +1400 -0
  63. package/apps/studio/sync/file-pull.ts +41 -4
  64. package/apps/studio/sync/hub-link.ts +16 -1
  65. package/apps/studio/sync/hub-listing.ts +46 -0
  66. package/apps/studio/sync/hubs-config.ts +16 -0
  67. package/apps/studio/sync/index.ts +919 -214
  68. package/apps/studio/sync/journal-client.ts +200 -0
  69. package/apps/studio/sync/migrate-seed.ts +99 -67
  70. package/apps/studio/sync/poke.ts +50 -0
  71. package/apps/studio/sync/projection.ts +13 -0
  72. package/apps/studio/sync/pull-budget.ts +86 -0
  73. package/apps/studio/sync/settings.ts +110 -0
  74. package/apps/studio/sync/status.ts +68 -0
  75. package/apps/studio/sync/trash.ts +243 -0
  76. package/apps/studio/sync/untrusted.ts +30 -10
  77. package/apps/studio/test/_helpers.ts +8 -0
  78. package/apps/studio/test/canvas-build.test.ts +63 -0
  79. package/apps/studio/test/canvas-list-watch.test.ts +17 -0
  80. package/apps/studio/test/canvas-move-api.test.ts +31 -0
  81. package/apps/studio/test/canvas-origin-gate.test.ts +12 -0
  82. package/apps/studio/test/canvas-shell-build-error.test.ts +49 -0
  83. package/apps/studio/test/cloud-history-hardening.test.ts +165 -0
  84. package/apps/studio/test/cloud-history-posture.test.ts +230 -0
  85. package/apps/studio/test/cloud-session-role.test.ts +30 -0
  86. package/apps/studio/test/cloud-shell-surfaces.test.ts +39 -0
  87. package/apps/studio/test/cold-start-apply.test.ts +303 -0
  88. package/apps/studio/test/collab-stress.test.ts +9 -1
  89. package/apps/studio/test/export-lane.test.ts +245 -0
  90. package/apps/studio/test/fixtures/video-comp-fixture.tsx +1 -1
  91. package/apps/studio/test/git-log-format.test.ts +95 -0
  92. package/apps/studio/test/git-safe-rel.test.ts +132 -0
  93. package/apps/studio/test/hmr-broadcast.test.ts +26 -0
  94. package/apps/studio/test/peer-selection-follows-camera.test.tsx +131 -0
  95. package/apps/studio/test/shared-doc-cell-pairing.test.ts +5 -2
  96. package/apps/studio/test/sync-agent.test.ts +78 -0
  97. package/apps/studio/test/sync-asset-push.test.ts +90 -16
  98. package/apps/studio/test/sync-autocommit.test.ts +80 -0
  99. package/apps/studio/test/sync-cell-write-nudge.test.ts +346 -0
  100. package/apps/studio/test/sync-ctl-channel.test.ts +508 -0
  101. package/apps/studio/test/sync-decide-file.test.ts +420 -0
  102. package/apps/studio/test/sync-file-ledger.test.ts +334 -0
  103. package/apps/studio/test/sync-file-membership.test.ts +17 -1
  104. package/apps/studio/test/sync-file-plane.test.ts +976 -0
  105. package/apps/studio/test/sync-hub-listing.test.ts +46 -0
  106. package/apps/studio/test/sync-meta-codec.test.ts +76 -0
  107. package/apps/studio/test/sync-move-retirement.test.ts +231 -0
  108. package/apps/studio/test/sync-panel-surface.test.ts +20 -0
  109. package/apps/studio/test/sync-path-pull.test.ts +67 -1
  110. package/apps/studio/test/sync-pull-budget.test.ts +169 -0
  111. package/apps/studio/test/sync-seed-defers-to-hub.test.ts +83 -0
  112. package/apps/studio/test/sync-settings-routes.test.ts +195 -0
  113. package/apps/studio/test/sync-settings.test.ts +151 -0
  114. package/apps/studio/test/sync-status.test.ts +69 -0
  115. package/apps/studio/test/sync-trash.test.ts +132 -0
  116. package/apps/studio/test/workspace-containment.test.ts +45 -9
  117. package/apps/studio/tsconfig.json +9 -10
  118. package/apps/studio/use-annotation-resize.tsx +14 -3
  119. package/apps/studio/use-collab.tsx +3 -1
  120. package/apps/studio/whats-new.json +99 -0
  121. package/apps/studio/workspace-mode.ts +110 -62
  122. package/apps/studio/ws.ts +22 -1
  123. package/cli/bin/claude-design-server.mjs +19 -0
  124. package/cli/commands/design.mjs +25 -6
  125. package/cli/commands/hub-workspace.mjs +243 -22
  126. package/cli/commands/hub-workspace.test.mjs +171 -0
  127. package/cli/commands/hub.mjs +71 -1
  128. package/cli/lib/design-link.mjs +186 -1
  129. package/cli/lib/design-ownership.mjs +330 -0
  130. package/cli/lib/design-ownership.test.mjs +329 -0
  131. package/cli/lib/hubs-config.mjs +21 -0
  132. package/cli/lib/hubs-config.test.mjs +47 -1
  133. package/cli/lib/workspace-plan.mjs +298 -5
  134. package/cli/lib/workspace-plan.test.mjs +215 -1
  135. package/package.json +10 -10
  136. package/plugins/design/templates/_shell.html +43 -2
  137. package/plugins/design/templates/design-system-inspiration/SUB-AGENT-PROMPTS.md +1 -1
  138. package/plugins/design/templates/design-system-inspiration/core/preview/_motion-readme.md.tpl +1 -1
  139. package/apps/studio/server.mjs +0 -1312
  140. package/apps/studio/sync/asset-pull.ts +0 -210
  141. package/apps/studio/sync/asset-push-worker.ts +0 -84
  142. package/apps/studio/sync/asset-sweep.ts +0 -262
  143. package/apps/studio/test/sync-asset-pull.test.ts +0 -161
  144. package/apps/studio/test/sync-asset-push-worker.test.ts +0 -183
  145. package/apps/studio/test/sync-asset-sweep.test.ts +0 -243
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1agh/maude",
3
- "version": "0.60.6",
3
+ "version": "1.0.2",
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,7 +14,7 @@
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": "apps/studio/server.mjs"
17
+ "claude-design-server": "cli/bin/claude-design-server.mjs"
18
18
  },
19
19
  "scripts": {
20
20
  "start": "bun run apps/studio/server.ts",
@@ -30,7 +30,7 @@
30
30
  "build": "pnpm -r --if-present --filter '!@maude/desktop' '!@maude/desktop-e2e' run build",
31
31
  "build:binary": "bun run apps/studio/build.ts --release",
32
32
  "test": "node --test --test-reporter=spec cli/**/*.test.mjs && pnpm --filter @maude/hub test",
33
- "test:dev-server": "cd apps/studio && bun test",
33
+ "test:dev-server": "cd apps/studio && bun test --timeout 20000",
34
34
  "lint": "biome check .",
35
35
  "format": "biome format --write .",
36
36
  "changeset": "changeset",
@@ -54,13 +54,13 @@
54
54
  "test:e2e:desktop:parity:cloud": "pnpm --filter @maude/desktop-e2e e2e:parity:cloud"
55
55
  },
56
56
  "optionalDependencies": {
57
- "@1agh/maude-darwin-arm64": "0.60.6",
58
- "@1agh/maude-darwin-x64": "0.60.6",
59
- "@1agh/maude-linux-arm64": "0.60.6",
60
- "@1agh/maude-linux-arm64-musl": "0.60.6",
61
- "@1agh/maude-linux-x64": "0.60.6",
62
- "@1agh/maude-linux-x64-musl": "0.60.6",
63
- "@1agh/maude-win32-x64": "0.60.6"
57
+ "@1agh/maude-darwin-arm64": "1.0.2",
58
+ "@1agh/maude-darwin-x64": "1.0.2",
59
+ "@1agh/maude-linux-arm64": "1.0.2",
60
+ "@1agh/maude-linux-arm64-musl": "1.0.2",
61
+ "@1agh/maude-linux-x64": "1.0.2",
62
+ "@1agh/maude-linux-x64-musl": "1.0.2",
63
+ "@1agh/maude-win32-x64": "1.0.2"
64
64
  },
65
65
  "files": [
66
66
  "cli",
@@ -274,7 +274,11 @@
274
274
  .catch((err) => {
275
275
  // Build/transpile/import error → keep the current render, surface a
276
276
  // non-destructive "holding" toast. Next good build swaps it in.
277
- if (rt.setHolding) rt.setHolding(true, (err && (err.message || String(err))) || 'build error');
277
+ // Same M8 diagnosis as the mount path: the 422 body names the
278
+ // culprit, the TypeError never does.
279
+ diagnoseImportFailure(canvasUrl, err).then((msg) => {
280
+ if (rt.setHolding) rt.setHolding(true, msg || 'build error');
281
+ });
278
282
  console.warn('[canvas-shell] soft-reload held last good (build error):', err);
279
283
  });
280
284
  }
@@ -296,6 +300,30 @@
296
300
  console.error('[canvas-shell]', msg);
297
301
  }
298
302
 
303
+ // Spike finding M8 — a failed dynamic import throws a bare
304
+ // "TypeError: Failed to fetch dynamically imported module", and the
305
+ // browser DISCARDS the response body, which for a 422 is the one thing
306
+ // worth reading ("Canvas build error: this canvas imports …"). The spike
307
+ // burned several rounds on token/cookie hypotheses when the server had
308
+ // already written the answer into the body; it took a manual curl to see
309
+ // it. So: when the import fails, fetch the same URL once more and, if the
310
+ // server answered with a legible non-2xx body, show THAT.
311
+ function diagnoseImportFailure(url, err) {
312
+ const fallback = (err && (err.stack || err.message)) || String(err);
313
+ if (!url) return Promise.resolve(fallback);
314
+ return fetch(url, { headers: { 'Cache-Control': 'no-store' } })
315
+ .then((r) => {
316
+ if (r.ok) return fallback; // import failed but the fetch is fine → the error was in the module itself
317
+ return r.text().then((body) => {
318
+ const text = (body || '').trim();
319
+ if (!text) return 'HTTP ' + r.status + ' for ' + url + '\n\n' + fallback;
320
+ // Cap it — a build error is a paragraph, not a payload.
321
+ return 'HTTP ' + r.status + ' — ' + text.slice(0, 4000);
322
+ });
323
+ })
324
+ .catch(() => fallback);
325
+ }
326
+
299
327
  // ---------------------------------------------------------------------
300
328
  // HMR client — listens for `canvas-hmr` messages on /_ws. Three modes:
301
329
  // - css: swap <link> href with ?v=<version> cache bust.
@@ -475,6 +503,17 @@
475
503
  // now), so both URLs converge on the good bytes.
476
504
  const assetName = (msg.file || '').split('/').pop();
477
505
  if (!assetName) return;
506
+ // A PhotoEdit sidecar (`<sha8>.photo.json`) — nothing on the
507
+ // page references the sidecar itself, so re-pointing <img> would
508
+ // be a no-op. Hand the fact to the canvas instead: canvas-lib's
509
+ // PhotoPreviewBridge re-fetches the edit and re-bakes the photo.
510
+ if (/\.photo\.json$/i.test(assetName)) {
511
+ const sha8 = assetName.replace(/\.photo\.json$/i, '');
512
+ document.dispatchEvent(
513
+ new CustomEvent('maude:photo-edit-refreshed', { detail: { sha8: sha8 } })
514
+ );
515
+ return;
516
+ }
478
517
  const v = msg.version || Date.now();
479
518
  const nameMatches = function (u) {
480
519
  if (!u) return false;
@@ -578,7 +617,9 @@
578
617
  } catch (e) { /* parent gone */ }
579
618
  }, 800);
580
619
  } catch (err) {
581
- showError((err && err.stack) || String(err));
620
+ // The canvas module is the import worth diagnosing — comment-mount is
621
+ // ours and does not 422 on tenant content.
622
+ diagnoseImportFailure(canvasUrl, err).then(showError);
582
623
  }
583
624
  }
584
625
  </script>
@@ -262,7 +262,7 @@ No slice-specific addenda — the base template covers them.
262
262
 
263
263
  - Owner skill: `plugins/design/skills/design-system/SKILL.md` (BOOTSTRAP flow → "Batches B + C — parallel fan-out via sub-agents" section loads this file)
264
264
  - Discovery probe templates (sibling): `plugins/design/skills/design-system/_pastier-probe-templates.md`
265
- - Motion library decision: `.ai/decisions/DDR-049-motion-one-as-canonical-motion-library.md`
265
+ - Motion library decision: `.ai/archive/decisions/DDR-049-motion-one-as-canonical-motion-library.md`
266
266
  - Imprint-bootstrap retro (source of D-1 … D-5): `.ai/logs/system-reviews/imprint-bootstrap-review-2026-05-26.md`
267
267
  - Asset sweep helper: `maude design asset-sweep` (on-PATH `maude` dispatches to the bundled helper — DDR-062)
268
268
  - Visual sanity helper: `maude design visual-sanity` (on-PATH `maude` dispatches to the bundled helper — DDR-062)
@@ -57,7 +57,7 @@ Per DDR-049: a canvas that imports `<MotionDemo>` or any sibling motion helper f
57
57
  ## Cross-links
58
58
 
59
59
  - Library source: `apps/studio/canvas-lib.tsx` (`MotionDemo`, `MotionTrack`, `TokenPlayback`, `ReducedMotionToggle`, `useMotionTokens`, `easingFromToken`)
60
- - Library decision: `.ai/decisions/DDR-049-motion-one-as-canonical-motion-library.md`
60
+ - Library decision: `.ai/archive/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-*`)
63
63
  - CSS escape hatch: `_components.css.tpl` (`.motion-flip`, `.motion-panel`, ... `.motion-presence`)