@1agh/maude 1.0.11 → 1.3.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 (567) hide show
  1. package/README.md +3 -1
  2. package/apps/studio/acp/bridge.ts +18 -13
  3. package/apps/studio/acp/index.ts +43 -7
  4. package/apps/studio/acp/transcript-io.ts +394 -0
  5. package/apps/studio/acp/transcript.ts +103 -38
  6. package/apps/studio/annotations-layer.tsx +191 -116
  7. package/apps/studio/annotations-model.ts +39 -0
  8. package/apps/studio/annotations-sync.ts +50 -0
  9. package/apps/studio/api.ts +821 -55
  10. package/apps/studio/bin/_import-figma.mjs +57 -11
  11. package/apps/studio/bin/_seed-fixture.mjs +163 -0
  12. package/apps/studio/bin/annotate.mjs +3 -1
  13. package/apps/studio/bin/server-up.sh +17 -2
  14. package/apps/studio/canvas-edit.ts +391 -7
  15. package/apps/studio/canvas-imports.ts +89 -0
  16. package/apps/studio/canvas-lib.tsx +82 -18
  17. package/apps/studio/canvas-notice-message.ts +16 -0
  18. package/apps/studio/canvas-notifications.tsx +19 -0
  19. package/apps/studio/canvas-shell.tsx +57 -6
  20. package/apps/studio/client/app.jsx +943 -248
  21. package/apps/studio/client/apply-edit-request.ts +55 -0
  22. package/apps/studio/client/export-center.jsx +125 -67
  23. package/apps/studio/client/github.js +38 -1
  24. package/apps/studio/client/index-loader.ts +76 -0
  25. package/apps/studio/client/panels/CloudBar.jsx +52 -6
  26. package/apps/studio/client/panels/GitPanel.jsx +103 -0
  27. package/apps/studio/client/panels/OnboardingWizard.jsx +36 -7
  28. package/apps/studio/client/panels/RepoBranchSwitcher.jsx +92 -27
  29. package/apps/studio/client/panels/SourceConflictPanel.jsx +166 -0
  30. package/apps/studio/client/panels/SyncPanel.jsx +238 -4
  31. package/apps/studio/client/panels/TeamProjects.jsx +376 -0
  32. package/apps/studio/client/panels/file-deep-link-dialog.jsx +54 -0
  33. package/apps/studio/client/photo-knobs.jsx +3 -0
  34. package/apps/studio/client/report-bug.jsx +19 -1
  35. package/apps/studio/client/share-dialog.jsx +91 -0
  36. package/apps/studio/client/share-link.js +94 -0
  37. package/apps/studio/client/styles/3-shell-maude.css +69 -18
  38. package/apps/studio/client/styles/4-components.css +44 -1
  39. package/apps/studio/client/tree-row-menu.jsx +48 -3
  40. package/apps/studio/client/whats-new.jsx +26 -32
  41. package/apps/studio/cloud/endpoints.ts +132 -0
  42. package/apps/studio/collab/index.ts +4 -0
  43. package/apps/studio/collab/persistence.ts +137 -17
  44. package/apps/studio/collab/registry.ts +19 -21
  45. package/apps/studio/collab/room.ts +13 -2
  46. package/apps/studio/context.ts +59 -0
  47. package/apps/studio/debug-bundle.ts +13 -0
  48. package/apps/studio/dist/client.bundle.js +1911 -1879
  49. package/apps/studio/dist/runtime/.min-sizes.json +1 -0
  50. package/apps/studio/dist/runtime/sonner.js +1 -0
  51. package/apps/studio/dist/styles.css +1 -1
  52. package/apps/studio/export-dialog.tsx +54 -0
  53. package/apps/studio/exporters/degraded.ts +19 -3
  54. package/apps/studio/exporters/ghostscript.ts +194 -0
  55. package/apps/studio/exporters/pdf-fonts.ts +261 -0
  56. package/apps/studio/exporters/pdf.ts +152 -3
  57. package/apps/studio/exporters/remote.ts +36 -1
  58. package/apps/studio/fs-watch.ts +45 -1
  59. package/apps/studio/http.ts +296 -19
  60. package/apps/studio/inspect.ts +19 -0
  61. package/apps/studio/managed-projects.ts +150 -0
  62. package/apps/studio/mem.ts +45 -9
  63. package/apps/studio/notifications.tsx +292 -0
  64. package/apps/studio/runtime-bundle.ts +2 -0
  65. package/apps/studio/server.ts +69 -6
  66. package/apps/studio/sync/accepted-cold-start.ts +225 -0
  67. package/apps/studio/sync/accepted-link.ts +320 -0
  68. package/apps/studio/sync/action-stage.ts +343 -0
  69. package/apps/studio/sync/agent.ts +104 -45
  70. package/apps/studio/sync/asset-push.ts +1 -47
  71. package/apps/studio/sync/cell-file-events.ts +3 -0
  72. package/apps/studio/sync/codec.ts +192 -34
  73. package/apps/studio/sync/cold-start-apply.ts +7 -0
  74. package/apps/studio/sync/cold-start.ts +118 -22
  75. package/apps/studio/sync/comment-identity.ts +68 -0
  76. package/apps/studio/sync/connection-state.ts +15 -1
  77. package/apps/studio/sync/ctl-provider.ts +15 -2
  78. package/apps/studio/sync/document-discovery.ts +81 -0
  79. package/apps/studio/sync/file-ledger.ts +117 -0
  80. package/apps/studio/sync/file-membership.ts +10 -2
  81. package/apps/studio/sync/file-plane.ts +926 -47
  82. package/apps/studio/sync/index.ts +1786 -36
  83. package/apps/studio/sync/journal-client.ts +13 -1
  84. package/apps/studio/sync/migrate-seed.ts +150 -22
  85. package/apps/studio/sync/poke.ts +4 -2
  86. package/apps/studio/sync/presentation.ts +311 -5
  87. package/apps/studio/sync/projection.ts +820 -23
  88. package/apps/studio/sync/repeated-module.ts +73 -0
  89. package/apps/studio/sync/retry-after.ts +169 -0
  90. package/apps/studio/sync/revision-barrier.ts +129 -0
  91. package/apps/studio/sync/seed-progress.ts +218 -0
  92. package/apps/studio/sync/seed-repair.ts +46 -0
  93. package/apps/studio/sync/source-merge.ts +100 -0
  94. package/apps/studio/sync/source-ops.ts +289 -0
  95. package/apps/studio/sync/source-recovery.ts +70 -0
  96. package/apps/studio/sync/source-validation.ts +56 -0
  97. package/apps/studio/sync/status.ts +201 -6
  98. package/apps/studio/sync/transaction-client.ts +460 -0
  99. package/apps/studio/sync/transport-error.ts +111 -0
  100. package/apps/studio/sync/writer-registry.ts +236 -0
  101. package/apps/studio/text-caret.ts +35 -0
  102. package/apps/studio/undo-hud.tsx +9 -87
  103. package/apps/studio/use-canvas-media-drop.tsx +4 -39
  104. package/apps/studio/whats-new.json +173 -0
  105. package/cli/bin/maude.mjs +2 -0
  106. package/cli/commands/codex.mjs +191 -0
  107. package/cli/commands/harness.mjs +1051 -0
  108. package/cli/commands/help.mjs +13 -0
  109. package/cli/lib/design-link.mjs +190 -2
  110. package/cli/lib/harness/capabilities.mjs +302 -0
  111. package/cli/lib/harness/codex-runtime.mjs +892 -0
  112. package/cli/lib/harness/compatibility.mjs +27 -0
  113. package/cli/lib/harness/discover-claude.mjs +1393 -0
  114. package/cli/lib/harness/managed-state.mjs +1296 -0
  115. package/cli/lib/harness/model.mjs +86 -0
  116. package/cli/lib/harness/secrets.mjs +390 -0
  117. package/cli/lib/harness/targets/codex.mjs +1141 -0
  118. package/cli/lib/harness/targets/opencode.mjs +807 -0
  119. package/cli/lib/harness/transaction.mjs +1099 -0
  120. package/cli/lib/hubs-config.mjs +35 -8
  121. package/cli/templates/harness/opencode/maude-projector.ts +58 -0
  122. package/docs/harness-capability-matrix.md +125 -0
  123. package/docs/harness-environment-projection.md +95 -0
  124. package/package.json +33 -9
  125. package/plugins/design/dependencies.json +3 -3
  126. package/plugins/design/templates/_shell.html +47 -0
  127. package/plugins/flow/.claude-plugin/config.schema.json +8 -0
  128. package/plugins/flow/dependencies.json +3 -3
  129. package/apps/studio/.ai/cache/_stats.json +0 -7
  130. package/apps/studio/bin/_agent-browser-safe.test.mjs +0 -165
  131. package/apps/studio/bin/_curl-local.test.mjs +0 -280
  132. package/apps/studio/bin/_pw-launch.test.mjs +0 -90
  133. package/apps/studio/bin/_smart-frames.test.mjs +0 -195
  134. package/apps/studio/bin/_transcribe.test.mjs +0 -80
  135. package/apps/studio/bun.lock +0 -928
  136. package/apps/studio/draw/test/animate.test.ts +0 -172
  137. package/apps/studio/draw/test/brush.test.ts +0 -213
  138. package/apps/studio/draw/test/composition.test.ts +0 -141
  139. package/apps/studio/draw/test/geometry.test.ts +0 -199
  140. package/apps/studio/draw/test/gradient.test.ts +0 -167
  141. package/apps/studio/draw/test/layout.test.ts +0 -120
  142. package/apps/studio/draw/test/morph.test.ts +0 -107
  143. package/apps/studio/draw/test/optimize.test.ts +0 -40
  144. package/apps/studio/draw/test/palette.test.ts +0 -123
  145. package/apps/studio/draw/test/primitives.test.ts +0 -129
  146. package/apps/studio/draw/test/serialize-animate.test.ts +0 -142
  147. package/apps/studio/draw/test/serialize.test.ts +0 -105
  148. package/apps/studio/figma/assets.test.ts +0 -464
  149. package/apps/studio/figma/client.test.ts +0 -395
  150. package/apps/studio/figma/codegen-client.test.ts +0 -276
  151. package/apps/studio/figma/codegen-fonts.test.ts +0 -103
  152. package/apps/studio/figma/codegen-values.test.ts +0 -179
  153. package/apps/studio/figma/comments-to-strokes.test.ts +0 -194
  154. package/apps/studio/figma/fig-decode.test.ts +0 -788
  155. package/apps/studio/figma/fig-differential.test.ts +0 -182
  156. package/apps/studio/figma/fig-translator.test.ts +0 -192
  157. package/apps/studio/figma/fig-vector.test.ts +0 -113
  158. package/apps/studio/figma/from-codegen.test.ts +0 -408
  159. package/apps/studio/figma/sanitize.test.ts +0 -325
  160. package/apps/studio/figma/tailwind-map.test.ts +0 -142
  161. package/apps/studio/figma/to-artboard.test.ts +0 -808
  162. package/apps/studio/figma/to-render.test.ts +0 -180
  163. package/apps/studio/figma/to-strokes-roundtrip.test.ts +0 -152
  164. package/apps/studio/figma/to-strokes.test.ts +0 -705
  165. package/apps/studio/figma/to-tokens.test.ts +0 -321
  166. package/apps/studio/figma/url.test.ts +0 -167
  167. package/apps/studio/footage/schema.test.ts +0 -287
  168. package/apps/studio/generation/adapters/groq.test.ts +0 -80
  169. package/apps/studio/generation/audio-library.test.ts +0 -95
  170. package/apps/studio/generation/captions.test.ts +0 -78
  171. package/apps/studio/generation/elevenlabs.test.ts +0 -223
  172. package/apps/studio/generation/gemini.test.ts +0 -350
  173. package/apps/studio/generation/jobs.test.ts +0 -128
  174. package/apps/studio/generation/keys.test.ts +0 -75
  175. package/apps/studio/generation/prefs.test.ts +0 -95
  176. package/apps/studio/generation/types.test.ts +0 -123
  177. package/apps/studio/generation/whisper-models.test.ts +0 -179
  178. package/apps/studio/test/_helpers.ts +0 -108
  179. package/apps/studio/test/acp-activity-endpoint.test.ts +0 -183
  180. package/apps/studio/test/acp-activity.test.ts +0 -154
  181. package/apps/studio/test/acp-ai-activity.test.ts +0 -182
  182. package/apps/studio/test/acp-attachment-serve.test.ts +0 -74
  183. package/apps/studio/test/acp-bootstrap-brief.test.ts +0 -178
  184. package/apps/studio/test/acp-branch-guard.test.ts +0 -123
  185. package/apps/studio/test/acp-bridge-lifetime.test.ts +0 -475
  186. package/apps/studio/test/acp-bridge.test.ts +0 -545
  187. package/apps/studio/test/acp-capabilities.test.ts +0 -123
  188. package/apps/studio/test/acp-caps-bridge.test.ts +0 -279
  189. package/apps/studio/test/acp-commands.test.ts +0 -119
  190. package/apps/studio/test/acp-elicitation-bridge.test.ts +0 -480
  191. package/apps/studio/test/acp-elicitation.test.ts +0 -251
  192. package/apps/studio/test/acp-env.test.ts +0 -95
  193. package/apps/studio/test/acp-mode-banner.test.ts +0 -45
  194. package/apps/studio/test/acp-origin-gate.test.ts +0 -160
  195. package/apps/studio/test/acp-permission-prompt.test.ts +0 -251
  196. package/apps/studio/test/acp-permission.test.ts +0 -278
  197. package/apps/studio/test/acp-plugin-bootstrap.test.ts +0 -89
  198. package/apps/studio/test/acp-session-allowed-tools.test.ts +0 -235
  199. package/apps/studio/test/acp-session-plugins.test.ts +0 -209
  200. package/apps/studio/test/acp-toolgroup.test.ts +0 -76
  201. package/apps/studio/test/acp-transcript-view.test.ts +0 -71
  202. package/apps/studio/test/acp-transcript.test.ts +0 -238
  203. package/apps/studio/test/acp-usage-bridge.test.ts +0 -141
  204. package/apps/studio/test/acp-usage.test.ts +0 -143
  205. package/apps/studio/test/acp-write-gate.test.ts +0 -323
  206. package/apps/studio/test/acp-write-scope.test.ts +0 -533
  207. package/apps/studio/test/active-state.test.ts +0 -186
  208. package/apps/studio/test/activity.test.ts +0 -189
  209. package/apps/studio/test/ai-activity.test.ts +0 -113
  210. package/apps/studio/test/annotate-write.test.ts +0 -1074
  211. package/apps/studio/test/annotation-strokes-command.test.ts +0 -166
  212. package/apps/studio/test/annotations-align.test.ts +0 -88
  213. package/apps/studio/test/annotations-api.test.ts +0 -145
  214. package/apps/studio/test/annotations-bindings.test.ts +0 -262
  215. package/apps/studio/test/annotations-draw-modifiers.test.ts +0 -206
  216. package/apps/studio/test/annotations-groups.test.ts +0 -231
  217. package/apps/studio/test/annotations-layer.test.ts +0 -1011
  218. package/apps/studio/test/annotations-roundtrip.test.ts +0 -663
  219. package/apps/studio/test/annotations-snap.test.ts +0 -135
  220. package/apps/studio/test/annotations-text-format.test.ts +0 -396
  221. package/apps/studio/test/artboard-activity-overlay.test.tsx +0 -56
  222. package/apps/studio/test/artboard-guides-overlay.test.tsx +0 -152
  223. package/apps/studio/test/artboard-hug-commit.test.ts +0 -36
  224. package/apps/studio/test/artboard-kinds.test.tsx +0 -83
  225. package/apps/studio/test/artboard-selection-attrs.test.ts +0 -69
  226. package/apps/studio/test/asset-api.test.ts +0 -149
  227. package/apps/studio/test/assets-s3.test.ts +0 -249
  228. package/apps/studio/test/binary-smoke.test.ts +0 -47
  229. package/apps/studio/test/boot-self-heal.test.ts +0 -87
  230. package/apps/studio/test/browse-posture.test.tsx +0 -107
  231. package/apps/studio/test/bundle-smoke.test.ts +0 -46
  232. package/apps/studio/test/camera-reveal.test.tsx +0 -173
  233. package/apps/studio/test/canvas-artifacts.test.ts +0 -125
  234. package/apps/studio/test/canvas-build-sandbox.test.ts +0 -69
  235. package/apps/studio/test/canvas-build.test.ts +0 -141
  236. package/apps/studio/test/canvas-create-api.test.ts +0 -676
  237. package/apps/studio/test/canvas-cursors.test.ts +0 -164
  238. package/apps/studio/test/canvas-edit.test.ts +0 -470
  239. package/apps/studio/test/canvas-freshness-deps.test.ts +0 -64
  240. package/apps/studio/test/canvas-header.test.ts +0 -127
  241. package/apps/studio/test/canvas-hide-chrome.test.ts +0 -88
  242. package/apps/studio/test/canvas-hmr-runtime.test.tsx +0 -114
  243. package/apps/studio/test/canvas-lib-inline.test.ts +0 -146
  244. package/apps/studio/test/canvas-lib-motion.test.ts +0 -131
  245. package/apps/studio/test/canvas-lib-resolver.test.ts +0 -111
  246. package/apps/studio/test/canvas-list-watch.test.ts +0 -388
  247. package/apps/studio/test/canvas-media-drop.test.ts +0 -187
  248. package/apps/studio/test/canvas-meta-api.test.ts +0 -707
  249. package/apps/studio/test/canvas-move-api.test.ts +0 -587
  250. package/apps/studio/test/canvas-origin-gate.test.ts +0 -417
  251. package/apps/studio/test/canvas-pipeline.test.ts +0 -180
  252. package/apps/studio/test/canvas-rects.test.ts +0 -198
  253. package/apps/studio/test/canvas-reorder.test.ts +0 -211
  254. package/apps/studio/test/canvas-route.test.ts +0 -179
  255. package/apps/studio/test/canvas-shell-base.test.ts +0 -107
  256. package/apps/studio/test/canvas-shell-build-error.test.ts +0 -52
  257. package/apps/studio/test/canvas-url.test.ts +0 -138
  258. package/apps/studio/test/canvas-wheel-delta.test.ts +0 -42
  259. package/apps/studio/test/canvas-zoom-floor.test.ts +0 -73
  260. package/apps/studio/test/capture-core.test.ts +0 -32
  261. package/apps/studio/test/capture-determinism-shape.test.ts +0 -135
  262. package/apps/studio/test/chat-attachments.test.ts +0 -117
  263. package/apps/studio/test/chat-context.test.ts +0 -129
  264. package/apps/studio/test/chat-markdown.test.tsx +0 -58
  265. package/apps/studio/test/clip-addressing.test.ts +0 -738
  266. package/apps/studio/test/clip-ops.test.ts +0 -922
  267. package/apps/studio/test/cloud-build.test.ts +0 -95
  268. package/apps/studio/test/cloud-connect-note.test.ts +0 -135
  269. package/apps/studio/test/cloud-endpoints.test.ts +0 -590
  270. package/apps/studio/test/cloud-history-hardening.test.ts +0 -165
  271. package/apps/studio/test/cloud-history-posture.test.ts +0 -230
  272. package/apps/studio/test/cloud-managed-save-surfaces.test.ts +0 -90
  273. package/apps/studio/test/cloud-renew.test.ts +0 -205
  274. package/apps/studio/test/cloud-session-role.test.ts +0 -161
  275. package/apps/studio/test/cloud-shell-surfaces.test.ts +0 -170
  276. package/apps/studio/test/cold-start-apply.test.ts +0 -303
  277. package/apps/studio/test/collab-annotations-bridge.test.ts +0 -55
  278. package/apps/studio/test/collab-awareness-bridge.test.ts +0 -223
  279. package/apps/studio/test/collab-bridge.test.ts +0 -79
  280. package/apps/studio/test/collab-loopback.test.ts +0 -63
  281. package/apps/studio/test/collab-origin-gate.test.ts +0 -323
  282. package/apps/studio/test/collab-protocol.test.ts +0 -146
  283. package/apps/studio/test/collab-readonly-gate.test.ts +0 -194
  284. package/apps/studio/test/collab-reseed-guard.test.ts +0 -78
  285. package/apps/studio/test/collab-room.test.ts +0 -188
  286. package/apps/studio/test/collab-session-survival.test.tsx +0 -176
  287. package/apps/studio/test/collab-stress.test.ts +0 -129
  288. package/apps/studio/test/comment-mount.test.ts +0 -97
  289. package/apps/studio/test/comment-relay-origin-gate.test.ts +0 -117
  290. package/apps/studio/test/comments-api.test.ts +0 -277
  291. package/apps/studio/test/comments-fs-rebroadcast.test.ts +0 -155
  292. package/apps/studio/test/comments-overlay.test.ts +0 -117
  293. package/apps/studio/test/compile-entry.test.ts +0 -133
  294. package/apps/studio/test/component-map.test.ts +0 -48
  295. package/apps/studio/test/config-projection.test.ts +0 -104
  296. package/apps/studio/test/config-reload.test.ts +0 -230
  297. package/apps/studio/test/config-version.test.ts +0 -88
  298. package/apps/studio/test/context-resolve-tokens.test.ts +0 -97
  299. package/apps/studio/test/convert-to-absolute.test.ts +0 -333
  300. package/apps/studio/test/credential-grammar.test.ts +0 -107
  301. package/apps/studio/test/csp-canvas-shell.test.ts +0 -62
  302. package/apps/studio/test/csrf-write-guard.test.ts +0 -141
  303. package/apps/studio/test/debug-bundle.test.ts +0 -105
  304. package/apps/studio/test/design-setup-readiness.test.ts +0 -155
  305. package/apps/studio/test/detach-component.test.ts +0 -94
  306. package/apps/studio/test/dns-rebinding-guard.test.ts +0 -101
  307. package/apps/studio/test/dom-selection.test.ts +0 -198
  308. package/apps/studio/test/dynamic-text-edit.test.ts +0 -162
  309. package/apps/studio/test/edit-css-occurrence.test.ts +0 -81
  310. package/apps/studio/test/edit-persistence.test.ts +0 -91
  311. package/apps/studio/test/edit-scope-api.test.ts +0 -119
  312. package/apps/studio/test/edit-source-command.test.ts +0 -142
  313. package/apps/studio/test/edit-suppress.test.ts +0 -170
  314. package/apps/studio/test/editing-presence.test.ts +0 -103
  315. package/apps/studio/test/element-resize.test.ts +0 -136
  316. package/apps/studio/test/element-structural-api.test.ts +0 -434
  317. package/apps/studio/test/element-structural-edit.test.ts +0 -750
  318. package/apps/studio/test/ensure-browser.test.ts +0 -92
  319. package/apps/studio/test/equal-spacing-detector.test.ts +0 -257
  320. package/apps/studio/test/export-assemble.test.ts +0 -53
  321. package/apps/studio/test/export-browser-lane.test.ts +0 -126
  322. package/apps/studio/test/export-capture-fidelity.test.ts +0 -146
  323. package/apps/studio/test/export-capture-hygiene.test.ts +0 -675
  324. package/apps/studio/test/export-center.test.tsx +0 -287
  325. package/apps/studio/test/export-e2e-lanes.test.ts +0 -857
  326. package/apps/studio/test/export-format-scope-coherence.test.ts +0 -89
  327. package/apps/studio/test/export-lane.test.ts +0 -245
  328. package/apps/studio/test/export-shim-multi-capture.test.ts +0 -83
  329. package/apps/studio/test/exporters/canva.test.ts +0 -63
  330. package/apps/studio/test/exporters/degraded-propagation.test.ts +0 -123
  331. package/apps/studio/test/exporters/endpoint.test.ts +0 -121
  332. package/apps/studio/test/exporters/history.test.ts +0 -107
  333. package/apps/studio/test/exporters/html.test.ts +0 -26
  334. package/apps/studio/test/exporters/jobs.test.ts +0 -342
  335. package/apps/studio/test/exporters/pdf.test.ts +0 -85
  336. package/apps/studio/test/exporters/png.test.ts +0 -103
  337. package/apps/studio/test/exporters/pptx-deck.test.ts +0 -112
  338. package/apps/studio/test/exporters/pptx.test.ts +0 -31
  339. package/apps/studio/test/exporters/pw-launch.test.ts +0 -49
  340. package/apps/studio/test/exporters/runtime.test.ts +0 -59
  341. package/apps/studio/test/exporters/scope.test.ts +0 -292
  342. package/apps/studio/test/exporters/svg.test.ts +0 -29
  343. package/apps/studio/test/exporters/unsupported-media.test.ts +0 -123
  344. package/apps/studio/test/exporters/zip.test.ts +0 -104
  345. package/apps/studio/test/fetch-asset-gate.test.ts +0 -189
  346. package/apps/studio/test/figjam-v3-model.test.ts +0 -342
  347. package/apps/studio/test/figma-explode.test.ts +0 -438
  348. package/apps/studio/test/figma-provenance.test.ts +0 -108
  349. package/apps/studio/test/figma-routes.test.ts +0 -294
  350. package/apps/studio/test/file-lock.test.ts +0 -84
  351. package/apps/studio/test/fixtures/backgrounding-claude-auth.sh +0 -12
  352. package/apps/studio/test/fixtures/fake-claude-auth.mjs +0 -23
  353. package/apps/studio/test/fixtures/figjam-v3-groups-bindings.svg +0 -1
  354. package/apps/studio/test/fixtures/mock-acp-agent-caps.mjs +0 -158
  355. package/apps/studio/test/fixtures/mock-acp-agent-commands.mjs +0 -44
  356. package/apps/studio/test/fixtures/mock-acp-agent-elicit-flood.mjs +0 -46
  357. package/apps/studio/test/fixtures/mock-acp-agent-elicit-url.mjs +0 -42
  358. package/apps/studio/test/fixtures/mock-acp-agent-elicit.mjs +0 -63
  359. package/apps/studio/test/fixtures/mock-acp-agent-permission-flood.mjs +0 -51
  360. package/apps/studio/test/fixtures/mock-acp-agent-permission.mjs +0 -50
  361. package/apps/studio/test/fixtures/mock-acp-agent-slow.mjs +0 -45
  362. package/apps/studio/test/fixtures/mock-acp-agent-usage.mjs +0 -56
  363. package/apps/studio/test/fixtures/mock-acp-agent-wedged.mjs +0 -37
  364. package/apps/studio/test/fixtures/mock-acp-agent-write.mjs +0 -118
  365. package/apps/studio/test/fixtures/mock-acp-agent.mjs +0 -69
  366. package/apps/studio/test/fixtures/noisy-claude-auth.mjs +0 -27
  367. package/apps/studio/test/fixtures/perf-canvas.mjs +0 -201
  368. package/apps/studio/test/fixtures/phase-20-annotations.svg +0 -1
  369. package/apps/studio/test/fixtures/phase-21-annotations.svg +0 -1
  370. package/apps/studio/test/fixtures/tiny-subset.woff2 +0 -0
  371. package/apps/studio/test/fixtures/video-comp-fixture.tsx +0 -82
  372. package/apps/studio/test/fixtures/wedged-claude-auth.sh +0 -11
  373. package/apps/studio/test/footage-store.test.ts +0 -100
  374. package/apps/studio/test/fs-mkdir-api.test.ts +0 -248
  375. package/apps/studio/test/fs-watch.test.ts +0 -41
  376. package/apps/studio/test/gemma-models.test.ts +0 -245
  377. package/apps/studio/test/generate-route.test.ts +0 -106
  378. package/apps/studio/test/git-api.test.ts +0 -0
  379. package/apps/studio/test/git-branches.test.ts +0 -341
  380. package/apps/studio/test/git-cloud-posture.test.ts +0 -59
  381. package/apps/studio/test/git-grouping.test.ts +0 -106
  382. package/apps/studio/test/git-lifecycle.test.ts +0 -100
  383. package/apps/studio/test/git-log-format.test.ts +0 -95
  384. package/apps/studio/test/git-safe-rel.test.ts +0 -132
  385. package/apps/studio/test/git-system-engine.test.ts +0 -135
  386. package/apps/studio/test/git-watch.test.ts +0 -97
  387. package/apps/studio/test/github-api.test.ts +0 -577
  388. package/apps/studio/test/grid-track-handles.test.ts +0 -160
  389. package/apps/studio/test/handoff-static-frames.test.ts +0 -215
  390. package/apps/studio/test/handoff.test.ts +0 -329
  391. package/apps/studio/test/history-rollback.test.ts +0 -88
  392. package/apps/studio/test/hmr-broadcast.test.ts +0 -236
  393. package/apps/studio/test/hmr-classify.test.ts +0 -87
  394. package/apps/studio/test/hub-link.test.ts +0 -80
  395. package/apps/studio/test/identity-cache.test.ts +0 -83
  396. package/apps/studio/test/import-asset-browser.test.ts +0 -64
  397. package/apps/studio/test/import-asset-route.test.ts +0 -71
  398. package/apps/studio/test/import-asset.test.ts +0 -427
  399. package/apps/studio/test/import-brand-browser.test.ts +0 -88
  400. package/apps/studio/test/import-brand-route.test.ts +0 -120
  401. package/apps/studio/test/import-brand.test.ts +0 -206
  402. package/apps/studio/test/import-figma.test.ts +0 -667
  403. package/apps/studio/test/import-tokens.test.ts +0 -722
  404. package/apps/studio/test/index-data-canvas-ds.test.ts +0 -97
  405. package/apps/studio/test/input-router.test.ts +0 -757
  406. package/apps/studio/test/inspect-script-syntax.test.ts +0 -53
  407. package/apps/studio/test/inspect-selections.test.ts +0 -219
  408. package/apps/studio/test/knob-props-authored.test.ts +0 -87
  409. package/apps/studio/test/layers-synthetic-groups.test.ts +0 -96
  410. package/apps/studio/test/locator.test.ts +0 -214
  411. package/apps/studio/test/marquee-overlay.test.ts +0 -94
  412. package/apps/studio/test/media-commit-chain.test.ts +0 -210
  413. package/apps/studio/test/mode-toggle.test.tsx +0 -226
  414. package/apps/studio/test/motion-sample.test.ts +0 -35
  415. package/apps/studio/test/move-artboards-command.test.ts +0 -108
  416. package/apps/studio/test/participants-chrome.test.ts +0 -65
  417. package/apps/studio/test/paths.test.ts +0 -88
  418. package/apps/studio/test/pdf-print-boxes.test.ts +0 -359
  419. package/apps/studio/test/peer-selection-follows-camera.test.tsx +0 -131
  420. package/apps/studio/test/perf-harness.ts +0 -193
  421. package/apps/studio/test/phase-3.6-smoke.test.ts +0 -79
  422. package/apps/studio/test/photo-bg-remove-validation.test.ts +0 -71
  423. package/apps/studio/test/photo-canvas-bundle.test.ts +0 -79
  424. package/apps/studio/test/photo-edit-api.test.ts +0 -201
  425. package/apps/studio/test/photo-filters.test.ts +0 -149
  426. package/apps/studio/test/photo-pipeline.test.ts +0 -106
  427. package/apps/studio/test/photo-taxonomy.test.ts +0 -96
  428. package/apps/studio/test/print-marks.test.ts +0 -113
  429. package/apps/studio/test/print-units.test.ts +0 -173
  430. package/apps/studio/test/read-annotations.test.ts +0 -727
  431. package/apps/studio/test/read-only-gate.test.ts +0 -188
  432. package/apps/studio/test/read-only-role.test.ts +0 -95
  433. package/apps/studio/test/readiness.test.ts +0 -337
  434. package/apps/studio/test/remote-ahead-behind-cache.test.ts +0 -89
  435. package/apps/studio/test/reorder-api.test.ts +0 -210
  436. package/apps/studio/test/repo-concurrency.test.ts +0 -146
  437. package/apps/studio/test/repo-lock.test.ts +0 -350
  438. package/apps/studio/test/report-proxy.test.ts +0 -125
  439. package/apps/studio/test/ripple.test.ts +0 -197
  440. package/apps/studio/test/runtime-bundle-error-mapping.test.ts +0 -43
  441. package/apps/studio/test/runtime-bundle.test.ts +0 -69
  442. package/apps/studio/test/sanitize-annotation-svg.test.ts +0 -238
  443. package/apps/studio/test/scaffold-design.test.ts +0 -122
  444. package/apps/studio/test/server-lifecycle.test.ts +0 -38
  445. package/apps/studio/test/session-runtime-state.test.ts +0 -226
  446. package/apps/studio/test/session-scope.test.ts +0 -100
  447. package/apps/studio/test/shared-doc-cell-pairing.test.ts +0 -642
  448. package/apps/studio/test/shared-doc-convergence.test.ts +0 -265
  449. package/apps/studio/test/shared-doc-foundation.test.ts +0 -63
  450. package/apps/studio/test/shared-doc-migrate.test.ts +0 -369
  451. package/apps/studio/test/shared-doc-projection.test.ts +0 -238
  452. package/apps/studio/test/shell-importmap.test.ts +0 -56
  453. package/apps/studio/test/sizing-mode.test.ts +0 -102
  454. package/apps/studio/test/slash-commands.test.ts +0 -117
  455. package/apps/studio/test/snap-distance-pill.test.ts +0 -68
  456. package/apps/studio/test/spacing-handles.test.ts +0 -138
  457. package/apps/studio/test/specimen-select.test.ts +0 -88
  458. package/apps/studio/test/sync-agent.test.ts +0 -660
  459. package/apps/studio/test/sync-annotations-cold-start.test.ts +0 -302
  460. package/apps/studio/test/sync-asset-push.test.ts +0 -931
  461. package/apps/studio/test/sync-atomic-write.test.ts +0 -62
  462. package/apps/studio/test/sync-attach-incremental.test.ts +0 -527
  463. package/apps/studio/test/sync-autocommit.test.ts +0 -537
  464. package/apps/studio/test/sync-canvas-path.test.ts +0 -200
  465. package/apps/studio/test/sync-cell-write-nudge.test.ts +0 -346
  466. package/apps/studio/test/sync-codec.test.ts +0 -230
  467. package/apps/studio/test/sync-cold-seed-dedup.test.ts +0 -187
  468. package/apps/studio/test/sync-cold-start.test.ts +0 -304
  469. package/apps/studio/test/sync-connect-honesty.test.ts +0 -114
  470. package/apps/studio/test/sync-connection-state.test.ts +0 -337
  471. package/apps/studio/test/sync-ctl-channel.test.ts +0 -508
  472. package/apps/studio/test/sync-decide-file.test.ts +0 -420
  473. package/apps/studio/test/sync-doc-name.test.ts +0 -281
  474. package/apps/studio/test/sync-echo-guard.test.ts +0 -96
  475. package/apps/studio/test/sync-file-ledger.test.ts +0 -334
  476. package/apps/studio/test/sync-file-membership.test.ts +0 -347
  477. package/apps/studio/test/sync-file-plane.test.ts +0 -976
  478. package/apps/studio/test/sync-file-pull.test.ts +0 -333
  479. package/apps/studio/test/sync-fresh-link-parity.test.ts +0 -267
  480. package/apps/studio/test/sync-fs-mirror.test.ts +0 -181
  481. package/apps/studio/test/sync-hardening.test.ts +0 -586
  482. package/apps/studio/test/sync-hub-listing.test.ts +0 -46
  483. package/apps/studio/test/sync-hubs-config.test.ts +0 -133
  484. package/apps/studio/test/sync-incident-replay.test.ts +0 -211
  485. package/apps/studio/test/sync-journal.test.ts +0 -176
  486. package/apps/studio/test/sync-meta-codec.test.ts +0 -199
  487. package/apps/studio/test/sync-migrate-flat-fallback.test.ts +0 -98
  488. package/apps/studio/test/sync-move-retirement.test.ts +0 -231
  489. package/apps/studio/test/sync-panel-surface.test.ts +0 -153
  490. package/apps/studio/test/sync-path-pull.test.ts +0 -531
  491. package/apps/studio/test/sync-presentation.test.ts +0 -262
  492. package/apps/studio/test/sync-pull-budget.test.ts +0 -169
  493. package/apps/studio/test/sync-remote-docs.test.ts +0 -333
  494. package/apps/studio/test/sync-resync-routes.test.ts +0 -168
  495. package/apps/studio/test/sync-runtime.test.ts +0 -1675
  496. package/apps/studio/test/sync-seed-defers-to-hub.test.ts +0 -83
  497. package/apps/studio/test/sync-settings-routes.test.ts +0 -195
  498. package/apps/studio/test/sync-settings.test.ts +0 -151
  499. package/apps/studio/test/sync-status.test.ts +0 -261
  500. package/apps/studio/test/sync-supervisor.test.ts +0 -262
  501. package/apps/studio/test/sync-tombstone-apply.test.ts +0 -111
  502. package/apps/studio/test/sync-trash.test.ts +0 -132
  503. package/apps/studio/test/sync-two-peer-discovery.test.ts +0 -343
  504. package/apps/studio/test/sync-untrusted.test.ts +0 -103
  505. package/apps/studio/test/system-endpoint.test.ts +0 -144
  506. package/apps/studio/test/text-editability-stamp.test.ts +0 -131
  507. package/apps/studio/test/timeline-comp-target.test.ts +0 -139
  508. package/apps/studio/test/timeline-media-cache.test.ts +0 -41
  509. package/apps/studio/test/timeline-parse.test.ts +0 -184
  510. package/apps/studio/test/timeline-scale.test.ts +0 -65
  511. package/apps/studio/test/timeline-snap.test.ts +0 -85
  512. package/apps/studio/test/tool-palette-insert-anchor.test.ts +0 -86
  513. package/apps/studio/test/tool-palette.test.tsx +0 -55
  514. package/apps/studio/test/tour-overlay.test.tsx +0 -90
  515. package/apps/studio/test/trusted-request-host.test.ts +0 -66
  516. package/apps/studio/test/undo-sequence-byte-compare.test.ts +0 -211
  517. package/apps/studio/test/undo-stack.test.ts +0 -244
  518. package/apps/studio/test/use-agent-presence.test.tsx +0 -117
  519. package/apps/studio/test/use-annotation-resize.test.ts +0 -402
  520. package/apps/studio/test/use-annotation-selection.test.tsx +0 -77
  521. package/apps/studio/test/use-artboard-drag.test.ts +0 -324
  522. package/apps/studio/test/use-canvas-activity.test.tsx +0 -206
  523. package/apps/studio/test/use-collab.test.ts +0 -0
  524. package/apps/studio/test/use-cursor-modifiers.test.ts +0 -59
  525. package/apps/studio/test/use-keyboard-discipline.test.ts +0 -27
  526. package/apps/studio/test/use-selection-set.test.tsx +0 -166
  527. package/apps/studio/test/use-snap-guides.test.ts +0 -271
  528. package/apps/studio/test/use-tool-mode.test.tsx +0 -186
  529. package/apps/studio/test/use-undo-stack.test.tsx +0 -223
  530. package/apps/studio/test/video-asset.test.ts +0 -163
  531. package/apps/studio/test/video-comp-fixture.test.ts +0 -50
  532. package/apps/studio/test/video-comp.test.ts +0 -270
  533. package/apps/studio/test/video-encode-lib.test.ts +0 -63
  534. package/apps/studio/test/video-render-bridge.test.ts +0 -171
  535. package/apps/studio/test/whats-new.test.ts +0 -113
  536. package/apps/studio/test/whisper-setup.test.ts +0 -97
  537. package/apps/studio/test/workspace-containment.test.ts +0 -382
  538. package/apps/studio/test/workspace-signin.test.ts +0 -292
  539. package/apps/studio/test/ws-handshake.test.ts +0 -33
  540. package/cli/commands/cache.test.mjs +0 -166
  541. package/cli/commands/design-link.test.mjs +0 -419
  542. package/cli/commands/design.test.mjs +0 -240
  543. package/cli/commands/doctor.test.mjs +0 -237
  544. package/cli/commands/hub-workspace.test.mjs +0 -275
  545. package/cli/commands/hub.test.mjs +0 -225
  546. package/cli/commands/kg.test.mjs +0 -142
  547. package/cli/commands/preflight.test.mjs +0 -46
  548. package/cli/lib/argv.test.mjs +0 -46
  549. package/cli/lib/cache.test.mjs +0 -303
  550. package/cli/lib/cell-plan.test.mjs +0 -225
  551. package/cli/lib/config-lint.test.mjs +0 -117
  552. package/cli/lib/ddr-to-kgai.test.mjs +0 -118
  553. package/cli/lib/design-ownership.test.mjs +0 -329
  554. package/cli/lib/fetch-asset.test.mjs +0 -213
  555. package/cli/lib/figma-codegen-reachability.test.mjs +0 -104
  556. package/cli/lib/figma-import-controls.test.mjs +0 -70
  557. package/cli/lib/flow-design-integration.test.mjs +0 -165
  558. package/cli/lib/gitignore-block.test.mjs +0 -136
  559. package/cli/lib/gitignore-drift.test.mjs +0 -156
  560. package/cli/lib/hubs-config.test.mjs +0 -165
  561. package/cli/lib/pkg-root.test.mjs +0 -111
  562. package/cli/lib/plugin-cli-reachability.test.mjs +0 -57
  563. package/cli/lib/plugin-name-namespace.test.mjs +0 -71
  564. package/cli/lib/reconstruct-toolset.test.mjs +0 -194
  565. package/cli/lib/stack-detect.test.mjs +0 -121
  566. package/cli/lib/update-check.test.mjs +0 -32
  567. package/cli/lib/workspace-plan.test.mjs +0 -699
@@ -1,107 +0,0 @@
1
- // The canvas shell under a based origin — Cloud Phase 27 (DDR-209).
2
- //
3
- // The fleet's canvas origin puts the project in the PATH:
4
- // `canvas.<zone>/<project>/_canvas-shell.html`. Every URL the shell builds must
5
- // therefore hang off the path it was SERVED from, not off the origin root —
6
- // otherwise the browser asks for `canvas.<zone>/.design/…`, the data plane reads
7
- // `.design` as a project name, and every dynamic import fails with
8
- // "Failed to fetch dynamically imported module".
9
- //
10
- // Two mechanisms, because the shell has two kinds of URL and only one of them
11
- // can be built at runtime:
12
- //
13
- // built by JS → `withCap()` prefixes the derived base.
14
- // the IMPORTMAP → cannot be: it must be static and present before any
15
- // module loads, and the server cannot rewrite it either
16
- // (the data plane strips the project segment before the
17
- // request arrives, so only the browser knows the base).
18
- // Importmap addresses resolve against the DOCUMENT's base
19
- // URL, so `./` gets it for free.
20
-
21
- import { describe, expect, test } from 'bun:test';
22
- import { readFileSync } from 'node:fs';
23
- import { join } from 'node:path';
24
-
25
- const SHELL = readFileSync(
26
- join(import.meta.dir, '..', '..', '..', 'plugins', 'design', 'templates', '_shell.html'),
27
- 'utf8'
28
- );
29
-
30
- /** The shell's own derivation, mirrored so the test breaks when it changes. */
31
- const baseOf = (pathname: string) => pathname.replace(/\/_canvas-shell(\.html)?$/, '');
32
-
33
- describe('the canvas shell hangs off the path it was served from', () => {
34
- test('the base is derived from location, and is empty at the origin root', () => {
35
- expect(baseOf('/alligators/_canvas-shell.html')).toBe('/alligators');
36
- expect(baseOf('/alligators/_canvas-shell')).toBe('/alligators');
37
- expect(baseOf('/_canvas-shell.html')).toBe('');
38
- expect(baseOf('/_canvas-shell')).toBe('');
39
- expect(SHELL).toContain("location.pathname.replace(/\\/_canvas-shell(\\.html)?$/, '')");
40
- });
41
-
42
- test('NO importmap entry is origin-absolute', () => {
43
- // `"/_canvas-runtime/react.js"` resolves against the origin and drops the
44
- // project. This is the one that cannot be fixed at runtime, so it is the one
45
- // most worth pinning.
46
- expect(SHELL).not.toContain('"/_canvas-runtime/');
47
- expect(SHELL).toContain('"./_canvas-runtime/');
48
- });
49
-
50
- test('a relative importmap address resolves under the project, and at the root', () => {
51
- // The actual browser rule, exercised rather than asserted.
52
- expect(
53
- new URL(
54
- './_canvas-runtime/react.js',
55
- 'https://canvas.cloud.maude.sh/alligators/_canvas-shell.html?t=x'
56
- ).href
57
- ).toBe('https://canvas.cloud.maude.sh/alligators/_canvas-runtime/react.js');
58
- expect(
59
- new URL('./_canvas-runtime/react.js', 'http://localhost:4399/_canvas-shell.html').href
60
- ).toBe('http://localhost:4399/_canvas-runtime/react.js');
61
- });
62
-
63
- test('withCap prefixes the base AND carries the capability', () => {
64
- const base = '/alligators';
65
- const cap = 'cap-1';
66
- const withCap = (u: string) => {
67
- const abs = u.startsWith('/') ? base + u : u;
68
- return cap ? abs + (abs.includes('?') ? '&' : '?') + 't=' + encodeURIComponent(cap) : abs;
69
- };
70
- expect(withCap('/.design/ui/Home.tsx')).toBe('/alligators/.design/ui/Home.tsx?t=cap-1');
71
- expect(withCap('/_api/canvas-meta?file=x')).toBe('/alligators/_api/canvas-meta?file=x&t=cap-1');
72
- expect(SHELL).toContain("const abs = u.startsWith('/') ? base + u : u;");
73
- });
74
-
75
- test('EVERY absolute URL the shell requests goes through the base', () => {
76
- // The systematic version of the three separate bugs this file records. Each
77
- // was one absolute path that nobody had thought about: the module, then the
78
- // importmap, then `comment-mount.js` — and the last one aborted the mount
79
- // outright, because it is imported in the same `Promise.all` as the canvas.
80
- //
81
- // So this asserts the SHAPE rather than a list: nothing in the shell may
82
- // form a request from an origin-absolute literal.
83
- const offenders: string[] = [];
84
- for (const re of [
85
- /import\(\s*['"`]\//g, // import('/…')
86
- /fetch\(\s*['"`]\//g, // fetch('/…')
87
- /\.href\s*=\s*['"`]\//g, // el.href = '/…'
88
- /\.src\s*=\s*['"`]\//g, // el.src = '/…'
89
- /location\.host\s*\+\s*['"`]\//g, // ws://host + '/…'
90
- ]) {
91
- for (const m of SHELL.matchAll(re)) offenders.push(m[0].trim());
92
- }
93
- expect(offenders).toEqual([]);
94
- });
95
-
96
- test('the URLs that DO appear are the ones withCap builds', () => {
97
- // Belt to the brace above: the four paths the shell legitimately names must
98
- // each be reachable only through `withCap`.
99
- for (const path of ['/_client/comment-mount.js', '/_api/canvas-meta']) {
100
- const at = SHELL.indexOf(path);
101
- expect(at).toBeGreaterThan(0);
102
- // `withCap(` appears within the same expression, before the literal.
103
- const before = SHELL.slice(Math.max(0, at - 120), at);
104
- expect(before).toContain('withCap(');
105
- }
106
- });
107
- });
@@ -1,52 +0,0 @@
1
- // Spike finding M8 (studyfi-design AWS run, 2026-08-20) — the mount's catch
2
- // showed `err.stack`, which for a failed dynamic import is the bare
3
- // "TypeError: Failed to fetch dynamically imported module". The 422 body the
4
- // server wrote ("Canvas build error: this canvas imports …") names the culprit
5
- // and the rule — and the browser throws it away on non-2xx. The spike spent
6
- // several rounds on token/cookie hypotheses before a manual curl surfaced the
7
- // body.
8
- //
9
- // The shell is a static template, so this suite pins the WIRING the way
10
- // canvas-shell-base.test.ts does: the diagnosis helper exists, and both import
11
- // failure paths (initial mount + soft reload) route through it instead of
12
- // printing the TypeError.
13
-
14
- import { describe, expect, test } from 'bun:test';
15
- import { readFileSync } from 'node:fs';
16
- import { join } from 'node:path';
17
-
18
- const SHELL = readFileSync(
19
- join(import.meta.dir, '..', '..', '..', 'plugins', 'design', 'templates', '_shell.html'),
20
- 'utf8'
21
- );
22
-
23
- describe('a canvas build error reaches the person (M8)', () => {
24
- test('the shell carries the import-failure diagnosis helper', () => {
25
- expect(SHELL).toContain('function diagnoseImportFailure(');
26
- // It refetches the module URL to recover the discarded response body…
27
- expect(SHELL).toMatch(/diagnoseImportFailure[\s\S]{0,400}fetch\(url/);
28
- // …and shows the body, not just the status line.
29
- expect(SHELL).toMatch(/r\.text\(\)/);
30
- });
31
-
32
- test('the initial mount catch routes through the diagnosis, not err.stack', () => {
33
- expect(SHELL).toContain('diagnoseImportFailure(canvasUrl, err).then(showError)');
34
- // The old shape — showError straight from the stack — must not come back.
35
- expect(SHELL).not.toContain('showError((err && err.stack) || String(err))');
36
- });
37
-
38
- test('the soft-reload holding toast gets the same diagnosis', () => {
39
- const soft = SHELL.slice(
40
- SHELL.indexOf('function softReload'),
41
- SHELL.indexOf('function softReload') + 1500
42
- );
43
- expect(soft).toContain('diagnoseImportFailure(canvasUrl, err)');
44
- });
45
-
46
- test('a 2xx refetch falls back to the original error — the diagnosis never masks a module-level throw', () => {
47
- // If the module fetches fine, the failure was inside the module (a runtime
48
- // throw at import time). Showing an "HTTP 200" line there would point the
49
- // person at the network when the bug is in their code.
50
- expect(SHELL).toMatch(/if \(r\.ok\) return fallback/);
51
- });
52
- });
@@ -1,138 +0,0 @@
1
- // DDR-093 — canvasUrl() token-resolution. Regression guard for the
2
- // "non-default-DS UI canvas renders unstyled" bug: every `ui/*.tsx` authored
3
- // under a non-default design system used to load designSystems[0]'s tokens
4
- // (scoped to a different `.<rootClass>` subtree) so every `var(--*)` went
5
- // undefined and the canvas rendered white.
6
-
7
- import { describe, expect, test } from 'bun:test';
8
-
9
- import { canvasUrl, urlOf } from '../client/canvas-url.js';
10
-
11
- // Mirrors this repo's real multi-DS config: `project` is the default (ds0),
12
- // `maude` is the non-default one that the bug broke.
13
- const cfg = {
14
- designRel: '.design',
15
- designSystems: [
16
- { name: 'project', path: 'system/project', tokensCssRel: 'system/project/colors_and_type.css' },
17
- { name: 'maude', path: 'system/maude', tokensCssRel: 'system/maude/colors_and_type.css' },
18
- ],
19
- };
20
-
21
- function paramsOf(url: string): URLSearchParams {
22
- const qs = url.split('?')[1] ?? '';
23
- return new URLSearchParams(qs);
24
- }
25
-
26
- describe('canvasUrl — per-canvas design-system token resolution', () => {
27
- test('explicit opts.ds resolves a non-default DS canvas to its OWN tokens', () => {
28
- const p = paramsOf(canvasUrl('.design/ui/Studio.tsx', cfg, { ds: 'maude' }));
29
- expect(p.get('tokens')).toBe('system/maude/colors_and_type.css');
30
- expect(p.get('components')).toBe('system/maude/preview/_components.css');
31
- });
32
-
33
- test('RCA interface form — relative path + opts.ds', () => {
34
- const p = paramsOf(canvasUrl('ui/Studio.tsx', cfg, { ds: 'maude' }));
35
- expect(p.get('tokens')).toBe('system/maude/colors_and_type.css');
36
- expect(p.get('components')).toBe('system/maude/preview/_components.css');
37
- });
38
-
39
- test('opts.ds = the default DS resolves to ds0 tokens', () => {
40
- const p = paramsOf(canvasUrl('.design/ui/Studio.tsx', cfg, { ds: 'project' }));
41
- expect(p.get('tokens')).toBe('system/project/colors_and_type.css');
42
- expect(p.get('components')).toBe('system/project/preview/_components.css');
43
- });
44
-
45
- test('cfg.canvasDesignSystems map drives resolution when opts.ds is absent', () => {
46
- const withMap = { ...cfg, canvasDesignSystems: { '.design/ui/Studio.tsx': 'maude' } };
47
- const p = paramsOf(canvasUrl('.design/ui/Studio.tsx', withMap));
48
- expect(p.get('tokens')).toBe('system/maude/colors_and_type.css');
49
- expect(p.get('components')).toBe('system/maude/preview/_components.css');
50
- });
51
-
52
- test('opts.ds wins over the map', () => {
53
- const withMap = { ...cfg, canvasDesignSystems: { '.design/ui/Studio.tsx': 'maude' } };
54
- const p = paramsOf(canvasUrl('.design/ui/Studio.tsx', withMap, { ds: 'project' }));
55
- expect(p.get('tokens')).toBe('system/project/colors_and_type.css');
56
- });
57
-
58
- test('unknown / no DS falls back to ds0 (single-DS + legacy behavior intact)', () => {
59
- const p = paramsOf(canvasUrl('.design/ui/Plain.tsx', cfg, {}));
60
- expect(p.get('tokens')).toBe('system/project/colors_and_type.css');
61
- expect(p.get('components')).toBe('system/project/preview/_components.css');
62
- });
63
-
64
- test('an unknown DS name (not in designSystems) falls back to ds0, never undefined', () => {
65
- const p = paramsOf(canvasUrl('.design/ui/Ghost.tsx', cfg, { ds: 'does-not-exist' }));
66
- expect(p.get('tokens')).toBe('system/project/colors_and_type.css');
67
- });
68
-
69
- test('specimen paths stay path-resolved and are unaffected by the map', () => {
70
- const withWrongMap = {
71
- ...cfg,
72
- // A bogus map entry must NOT override the specimen branch.
73
- canvasDesignSystems: { '.design/system/maude/preview/Buttons.tsx': 'project' },
74
- };
75
- const p = paramsOf(canvasUrl('.design/system/maude/preview/Buttons.tsx', withWrongMap));
76
- expect(p.get('tokens')).toBe('system/maude/colors_and_type.css');
77
- expect(p.get('layout')).toBe('system/maude/preview/_layout.css');
78
- expect(p.get('components')).toBe('system/maude/preview/_components.css');
79
- });
80
-
81
- test('the bug it guards against: ds0 is the WRONG DS for a maude canvas', () => {
82
- // Documents the failure mode — with neither opts.ds nor a map entry the
83
- // resolver returns designSystems[0] (project), which is exactly what broke a
84
- // maude canvas before DDR-093. The fix is that the map now supplies 'maude'.
85
- const p = paramsOf(canvasUrl('.design/ui/Studio.tsx', cfg));
86
- expect(p.get('tokens')).toBe('system/project/colors_and_type.css'); // ds0 — wrong for maude
87
- const fixed = paramsOf(
88
- canvasUrl('.design/ui/Studio.tsx', {
89
- ...cfg,
90
- canvasDesignSystems: { '.design/ui/Studio.tsx': 'maude' },
91
- })
92
- );
93
- expect(fixed.get('tokens')).toBe('system/maude/colors_and_type.css'); // fixed
94
- });
95
-
96
- test('non-tsx paths bypass the shell and return a direct URL', () => {
97
- expect(canvasUrl('.design/ui/legacy.html', cfg)).toBe(urlOf('.design/ui/legacy.html'));
98
- });
99
-
100
- // Cloud Phase 25 C2 — the viewer role rides into the canvas as ?ro=1 so the
101
- // iframe chrome is read-only from its very first paint (boot-static, no
102
- // postMessage race).
103
- test('cfg.readOnly stamps ro=1; absent/false omits it', () => {
104
- expect(paramsOf(canvasUrl('.design/ui/Studio.tsx', { ...cfg, readOnly: true })).get('ro')).toBe(
105
- '1'
106
- );
107
- expect(paramsOf(canvasUrl('.design/ui/Studio.tsx', cfg)).get('ro')).toBeNull();
108
- expect(
109
- paramsOf(canvasUrl('.design/ui/Studio.tsx', { ...cfg, readOnly: false })).get('ro')
110
- ).toBeNull();
111
- });
112
- });
113
-
114
- // Cloud Phase 27 (DDR-209) — the canvas origin's capability.
115
- //
116
- // In the cloud the canvas origin is a cookieless, cross-site hostname: a cookie
117
- // scoped widely enough to cover it would be readable by the untrusted canvas
118
- // content itself, which is the one thing the DDR-054 split exists to prevent.
119
- // So the capability rides in the URL. It reaches `cfg` through the `/_config`
120
- // projection — which silently dropped it once, and would have 401'd every
121
- // canvas iframe in production (see `config-projection.test.ts`).
122
-
123
- test('a canvas URL carries the capability when the server minted one', () => {
124
- const url = canvasUrl('.design/ui/Home.tsx', {
125
- designRel: '.design',
126
- canvasOrigin: 'https://canvas.cloud.maude.sh/alligators',
127
- canvasToken: 'cap-abc123',
128
- });
129
- expect(url.startsWith('https://canvas.cloud.maude.sh/alligators/_canvas-shell.html?')).toBe(true);
130
- expect(new URL(url).searchParams.get('t')).toBe('cap-abc123');
131
- });
132
-
133
- test('a desktop URL is byte-identical to before — no capability, no query', () => {
134
- // The loopback canvas origin needs none, so this must not change for the
135
- // shell that has always worked.
136
- const url = canvasUrl('.design/ui/Home.tsx', { designRel: '.design' });
137
- expect(new URL(url, 'http://x').searchParams.has('t')).toBe(false);
138
- });
@@ -1,42 +0,0 @@
1
- // canvas-wheel-delta — issue #94 dogfood report: mouse-wheel panning in the
2
- // canvas is very slow. Root cause: `onWheel` fed raw `WheelEvent.deltaX`/
3
- // `deltaY` straight into `panBy` as CSS pixels, but the Wheel Events spec
4
- // lets a browser report deltas in pixel/line/page units (`deltaMode`).
5
- // Physical mice on Firefox (and some browser/OS combos elsewhere) report
6
- // LINE-mode deltas — a single integer like 3 per notch — which, read as
7
- // pixels, panned the canvas only a few px per wheel notch. Trackpads report
8
- // pixel-mode deltas already, so trackpad panning felt fine while mouse-wheel
9
- // panning felt frozen. See .ai/logs/rca/issue-94-wheel-pan-slow.md.
10
- //
11
- // `wheelDeltaToPixels` is a pure function (no DOM needed) so this test
12
- // doesn't need happy-dom, unlike canvas-zoom-floor.test.ts's computeFit case.
13
-
14
- import { describe, expect, test } from 'bun:test';
15
-
16
- import { wheelDeltaToPixels } from '../canvas-lib.tsx';
17
-
18
- describe('wheelDeltaToPixels — normalizes WheelEvent units (issue #94)', () => {
19
- test('pixel mode (deltaMode 0) passes the value through unchanged', () => {
20
- expect(wheelDeltaToPixels(100, 0, 800)).toBe(100);
21
- expect(wheelDeltaToPixels(-42.5, 0, 800)).toBe(-42.5);
22
- });
23
-
24
- test('line mode (deltaMode 1) scales a small per-notch delta up to a pixel-range step', () => {
25
- // The regression: before the fix, `onWheel` fed the raw delta straight
26
- // into `panBy`, so a line-mode notch of 3 panned only 3 CSS pixels —
27
- // reproducing the "very slow" mouse-wheel report. This asserts the FIXED
28
- // behavior: scaled up to a magnitude comparable to a trackpad's
29
- // pixel-mode delta (~100 per gesture step). Pre-fix, `wheelDeltaToPixels`
30
- // didn't exist and `onWheel` used the raw `3` — this assertion fails
31
- // against that old code path (3 !== 48).
32
- const raw = 3;
33
- const scaled = wheelDeltaToPixels(raw, 1, 800);
34
- expect(scaled).toBe(48);
35
- expect(scaled).not.toBe(raw);
36
- });
37
-
38
- test('page mode (deltaMode 2) scales by the supplied page size', () => {
39
- expect(wheelDeltaToPixels(1, 2, 800)).toBe(800);
40
- expect(wheelDeltaToPixels(-2, 2, 600)).toBe(-1200);
41
- });
42
- });
@@ -1,73 +0,0 @@
1
- // canvas-zoom-floor — issue #91 dogfood report: dragging an artboard across a
2
- // large board, the user can't zoom out far enough to complete the move in one
3
- // motion. Root cause: `clampZoom` applies a single hard-coded floor to every
4
- // viewport write, including the programmatic `fit()` path — a board wider
5
- // than ~10x the viewport could never be framed whole. See
6
- // .ai/logs/rca/issue-91-canvas-zoom-floor.md.
7
- //
8
- // canvas-lib.tsx pulls in a React/DOM dependency graph, so we register
9
- // happy-dom for this file (like camera-reveal.test.tsx) before importing.
10
-
11
- import { afterAll, beforeAll, describe, expect, test } from 'bun:test';
12
- import { GlobalRegistrator } from '@happy-dom/global-registrator';
13
-
14
- beforeAll(() => {
15
- GlobalRegistrator.register();
16
- });
17
- afterAll(() => {
18
- GlobalRegistrator.unregister();
19
- });
20
-
21
- import { clampZoom, computeFit } from '../canvas-lib.tsx';
22
-
23
- function fakeHost(clientWidth: number, clientHeight: number): HTMLElement {
24
- const el = document.createElement('div');
25
- Object.defineProperty(el, 'clientWidth', { value: clientWidth });
26
- Object.defineProperty(el, 'clientHeight', { value: clientHeight });
27
- return el;
28
- }
29
-
30
- describe('clampZoom — the interactive zoom floor (issue #91)', () => {
31
- test('a deep zoom-out below the OLD 0.1 floor is no longer clamped', () => {
32
- expect(clampZoom(0.05)).toBe(0.05);
33
- expect(clampZoom(0.02)).toBe(0.02);
34
- });
35
-
36
- test('still clamps below the new floor', () => {
37
- expect(clampZoom(0.0001)).toBe(0.02);
38
- expect(clampZoom(-5)).toBe(0.02);
39
- });
40
-
41
- test('still clamps above the max and normalizes non-finite input', () => {
42
- expect(clampZoom(99)).toBe(4);
43
- expect(clampZoom(Number.NaN)).toBe(1);
44
- expect(clampZoom(Number.POSITIVE_INFINITY)).toBe(1);
45
- });
46
- });
47
-
48
- describe('computeFit → clampZoom — fit() can now frame a wide board (issue #91)', () => {
49
- test('a board ~20x the viewport width computes a zoom the old floor would have clamped up', () => {
50
- // Viewport 1000x800; board 20000 wide — the exact "more than a screenful
51
- // of artboards" shape from the report. Ideal fit zoom is well under 0.1.
52
- const host = fakeHost(1000, 800);
53
- const fit = computeFit([{ x: 0, y: 0, w: 20000, h: 800 }], host, 24);
54
-
55
- expect(fit.zoom).toBeLessThan(0.1); // the bug: old floor would have clamped this
56
- expect(fit.zoom).toBeGreaterThanOrEqual(0.02); // still within the new interactive floor
57
-
58
- // The regression proper: applying the viewport funnel's clamp must be a
59
- // no-op for this value now — before the fix (ZOOM_MIN = 0.1) this would
60
- // have raised fit.zoom back up to 0.1, cropping the board.
61
- expect(clampZoom(fit.zoom)).toBe(fit.zoom);
62
- });
63
-
64
- test('an extremely wide board (>50x viewport) still bottoms out at the interactive floor', () => {
65
- const host = fakeHost(1000, 800);
66
- const fit = computeFit([{ x: 0, y: 0, w: 100000, h: 800 }], host, 24);
67
-
68
- // The ideal fit zoom is far below even the new floor — clampZoom must
69
- // still protect the interactive floor for pathological board sizes.
70
- expect(fit.zoom).toBeLessThan(0.02);
71
- expect(clampZoom(fit.zoom)).toBe(0.02);
72
- });
73
- });
@@ -1,32 +0,0 @@
1
- // capture-core.test.ts — pure-logic guards of the shared capture spine
2
- // (DDR-231). The DOM-dependent half (svgForElement, rasterizeSvg) is exercised
3
- // end-to-end by the fidelity gate (plan T6) — no DOM emulation here.
4
-
5
- import { describe, expect, test } from 'bun:test';
6
-
7
- import {
8
- assertRasterSizeOk,
9
- MAX_OUTPUT_BYTES,
10
- MAX_OUTPUT_SIDE_PX,
11
- } from '../exporters/capture-core.ts';
12
-
13
- describe('assertRasterSizeOk — the raster render guard', () => {
14
- test('a 1440×900 artboard at 2× passes', () => {
15
- expect(() => assertRasterSizeOk(1440, 900, 2)).not.toThrow();
16
- });
17
-
18
- test('a 600dpi A0 poster still fits (the guard ceiling rationale)', () => {
19
- // 9933×14043 px ≈ 558MB RGBA — deliberately inside the ~600MB ceiling.
20
- expect(() => assertRasterSizeOk(9933 / 6.25, 14043 / 6.25, 6.25)).not.toThrow();
21
- });
22
-
23
- test('exceeding the side ceiling throws with an actionable max-DPI hint', () => {
24
- expect(() => assertRasterSizeOk(MAX_OUTPUT_SIDE_PX, 900, 2)).toThrow(/max supported DPI/);
25
- });
26
-
27
- test('exceeding the byte ceiling throws even when both sides fit', () => {
28
- // 15000×15000 × 4B = 900MB > ceiling while each side < 16000.
29
- expect(15000 * 15000 * 4).toBeGreaterThan(MAX_OUTPUT_BYTES);
30
- expect(() => assertRasterSizeOk(15000, 15000, 1)).toThrow(/render guard/);
31
- });
32
- });
@@ -1,135 +0,0 @@
1
- // Source-shape gates for capture determinism.
2
- //
3
- // These guard properties that only manifest in a browser under load, which CI
4
- // has no way to run — `test/exporters/pw-launch.test.ts` says as much ("the
5
- // launch path itself is integration-shape (needs a real browser)"), and
6
- // `test/export-shim-multi-capture.test.ts` exists precisely because of it. So,
7
- // in that same house style, the FIX SHAPE is asserted at the source level.
8
- //
9
- // Why these particular shapes: the plan's original premise was that frame-step
10
- // capture is "deterministic by construction" — a doc comment in video-comp.tsx
11
- // with nothing enforcing it. It was not true. A seek could fail silently, and
12
- // the capture wait could give up on a wall-clock timer and screenshot a stale
13
- // frame. Serially both were survivable; under any parallel capture neither is.
14
- // If someone deletes these guards, the resulting bug is a valid-looking video
15
- // with wrong frames — invisible to every other test we have.
16
-
17
- import { describe, expect, test } from 'bun:test';
18
- import { readFileSync } from 'node:fs';
19
- import { join } from 'node:path';
20
-
21
- const STUDIO = join(import.meta.dir, '..');
22
- const read = (rel: string) => readFileSync(join(STUDIO, rel), 'utf8');
23
-
24
- describe('the seek bridge must not report a seek that did not happen', () => {
25
- const src = () => read('video-comp.tsx');
26
-
27
- test('no empty catch swallows a failed seekTo', () => {
28
- // The exact regression: `catch { /* comment only */ }` around the seek.
29
- const emptyCatch = /catch\s*\{\s*(?:\/\*[\s\S]*?\*\/|\/\/[^\n]*)?\s*\}/g;
30
- const body = src();
31
- const seekRegion = body.slice(
32
- body.indexOf('__maude_seek__ = async'),
33
- body.indexOf('Ordinary-artboard fallback')
34
- );
35
- expect(seekRegion.length).toBeGreaterThan(0);
36
- expect(seekRegion.match(emptyCatch)).toBeNull();
37
- });
38
-
39
- test('an unlanded seek throws rather than resolving', () => {
40
- expect(src()).toContain('refusing to report a seek that did not happen');
41
- });
42
-
43
- test('failures are counted where the shim can read them', () => {
44
- expect(src()).toContain('__maude_seek_failures__');
45
- });
46
-
47
- test('a cold Player still gets bounded retries — the fix is not "fail faster"', () => {
48
- expect(src()).toContain('SEEK_ATTEMPTS');
49
- expect(src()).toContain('seekEntryWithRetry');
50
- });
51
- });
52
-
53
- describe('the capture shim must refuse a capture built on stale frames', () => {
54
- test('it reads the in-page failure count and throws on any', () => {
55
- const shim = read('bin/_video-playwright.mjs');
56
- expect(shim).toContain('__maude_seek_failures__');
57
- expect(shim).toMatch(/seekFailures\s*>\s*0/);
58
- expect(shim).toContain('Refusing to encode');
59
- });
60
-
61
- test('the refusal happens BEFORE the encoded output is written', () => {
62
- const shim = read('bin/_video-playwright.mjs');
63
- const guardAt = shim.indexOf('seekFailures');
64
- const writeAt = shim.indexOf('writeFileSync(out, Buffer.from(enc.b64');
65
- expect(guardAt).toBeGreaterThan(0);
66
- expect(writeAt).toBeGreaterThan(0);
67
- // Ordering is the whole point — a check after the write ships the bad file.
68
- expect(guardAt).toBeLessThan(writeAt);
69
- });
70
- });
71
-
72
- describe('encoder guards (unit-shape — these run without a browser)', () => {
73
- const enc = () => read('exporters/video-encode-lib.ts');
74
-
75
- test('a mismatched frame is rejected, never silently resampled', () => {
76
- const src = enc();
77
- expect(src).toContain('refusing to resample');
78
- // The check must precede the draw, or the resample already happened.
79
- const guardAt = src.indexOf('refusing to resample');
80
- const drawAt = src.indexOf('vstate.ctx.drawImage(bmp, 0, 0');
81
- expect(guardAt).toBeGreaterThan(0);
82
- expect(guardAt).toBeLessThan(drawAt);
83
- });
84
-
85
- test("latencyMode is pinned to 'quality' — 'realtime' may drop frames", () => {
86
- expect(enc()).toContain("latencyMode: 'quality'");
87
- });
88
-
89
- test('the encoder canvas is NOT cleared between frames — pinned deliberately', () => {
90
- // Current behaviour: a transparent artboard ghosts the previous frame,
91
- // because nothing clears the canvas before drawImage. That is a real defect
92
- // for transparent comps, but changing it is a visual change to every export
93
- // and belongs in its own change with its own before/after. Pinned here so
94
- // the next person changes it ON PURPOSE rather than as a side effect.
95
- expect(enc()).not.toContain('clearRect');
96
- });
97
- });
98
-
99
- describe('bundle cache paths must be content-addressed', () => {
100
- test('no fixed-name temp bundle two servers could race on', () => {
101
- const src = read('exporters/_browser-bundles.ts');
102
- expect(src).toContain('writeHashedBundle');
103
- expect(src).not.toContain("'maude-video-encode-lib.mjs'");
104
- expect(src).not.toContain("'maude-video-render-lib.mjs'");
105
- });
106
- });
107
-
108
- describe('the video shim must guard its output size', () => {
109
- test('it calls assertRenderOutputSizeOk like the pdf shim does', () => {
110
- const shim = read('bin/_video-playwright.mjs');
111
- expect(shim).toContain(
112
- "assertRenderOutputSizeOk(clip.width, clip.height, deviceScaleFactor, '_video-playwright')"
113
- );
114
- });
115
- });
116
-
117
- describe('timing telemetry must not break the summary contract', () => {
118
- test('MAUDE_TIMING is filtered in _runtime.ts, not in an adapter', () => {
119
- const rt = read('exporters/_runtime.ts');
120
- expect(rt).toContain('TIMING_LINE');
121
- expect(rt).toContain('onTiming');
122
- // video.ts parses stdoutLines.at(-1) as its summary JSON — an unfiltered
123
- // trailing diagnostic line would break EVERY video export.
124
- const video = read('exporters/video.ts');
125
- expect(video).toContain('stdoutLines.at(-1)');
126
- expect(video).not.toContain('MAUDE_TIMING');
127
- });
128
-
129
- test('both capture paths emit it, so they are comparable', () => {
130
- const shim = read('bin/_video-playwright.mjs');
131
- expect(shim).toContain("path: 'frame-step'");
132
- expect(shim).toContain("path: 'renderer'");
133
- expect(shim).toContain('stageMs');
134
- });
135
- });