@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.
- package/README.md +3 -1
- package/apps/studio/acp/bridge.ts +18 -13
- package/apps/studio/acp/index.ts +43 -7
- package/apps/studio/acp/transcript-io.ts +394 -0
- package/apps/studio/acp/transcript.ts +103 -38
- package/apps/studio/annotations-layer.tsx +191 -116
- package/apps/studio/annotations-model.ts +39 -0
- package/apps/studio/annotations-sync.ts +50 -0
- package/apps/studio/api.ts +821 -55
- package/apps/studio/bin/_import-figma.mjs +57 -11
- package/apps/studio/bin/_seed-fixture.mjs +163 -0
- package/apps/studio/bin/annotate.mjs +3 -1
- package/apps/studio/bin/server-up.sh +17 -2
- package/apps/studio/canvas-edit.ts +391 -7
- package/apps/studio/canvas-imports.ts +89 -0
- package/apps/studio/canvas-lib.tsx +82 -18
- package/apps/studio/canvas-notice-message.ts +16 -0
- package/apps/studio/canvas-notifications.tsx +19 -0
- package/apps/studio/canvas-shell.tsx +57 -6
- package/apps/studio/client/app.jsx +943 -248
- package/apps/studio/client/apply-edit-request.ts +55 -0
- package/apps/studio/client/export-center.jsx +125 -67
- package/apps/studio/client/github.js +38 -1
- package/apps/studio/client/index-loader.ts +76 -0
- package/apps/studio/client/panels/CloudBar.jsx +52 -6
- package/apps/studio/client/panels/GitPanel.jsx +103 -0
- package/apps/studio/client/panels/OnboardingWizard.jsx +36 -7
- package/apps/studio/client/panels/RepoBranchSwitcher.jsx +92 -27
- package/apps/studio/client/panels/SourceConflictPanel.jsx +166 -0
- package/apps/studio/client/panels/SyncPanel.jsx +238 -4
- package/apps/studio/client/panels/TeamProjects.jsx +376 -0
- package/apps/studio/client/panels/file-deep-link-dialog.jsx +54 -0
- package/apps/studio/client/photo-knobs.jsx +3 -0
- package/apps/studio/client/report-bug.jsx +19 -1
- package/apps/studio/client/share-dialog.jsx +91 -0
- package/apps/studio/client/share-link.js +94 -0
- package/apps/studio/client/styles/3-shell-maude.css +69 -18
- package/apps/studio/client/styles/4-components.css +44 -1
- package/apps/studio/client/tree-row-menu.jsx +48 -3
- package/apps/studio/client/whats-new.jsx +26 -32
- package/apps/studio/cloud/endpoints.ts +132 -0
- package/apps/studio/collab/index.ts +4 -0
- package/apps/studio/collab/persistence.ts +137 -17
- package/apps/studio/collab/registry.ts +19 -21
- package/apps/studio/collab/room.ts +13 -2
- package/apps/studio/context.ts +59 -0
- package/apps/studio/debug-bundle.ts +13 -0
- package/apps/studio/dist/client.bundle.js +1911 -1879
- package/apps/studio/dist/runtime/.min-sizes.json +1 -0
- package/apps/studio/dist/runtime/sonner.js +1 -0
- package/apps/studio/dist/styles.css +1 -1
- package/apps/studio/export-dialog.tsx +54 -0
- package/apps/studio/exporters/degraded.ts +19 -3
- package/apps/studio/exporters/ghostscript.ts +194 -0
- package/apps/studio/exporters/pdf-fonts.ts +261 -0
- package/apps/studio/exporters/pdf.ts +152 -3
- package/apps/studio/exporters/remote.ts +36 -1
- package/apps/studio/fs-watch.ts +45 -1
- package/apps/studio/http.ts +296 -19
- package/apps/studio/inspect.ts +19 -0
- package/apps/studio/managed-projects.ts +150 -0
- package/apps/studio/mem.ts +45 -9
- package/apps/studio/notifications.tsx +292 -0
- package/apps/studio/runtime-bundle.ts +2 -0
- package/apps/studio/server.ts +69 -6
- package/apps/studio/sync/accepted-cold-start.ts +225 -0
- package/apps/studio/sync/accepted-link.ts +320 -0
- package/apps/studio/sync/action-stage.ts +343 -0
- package/apps/studio/sync/agent.ts +104 -45
- package/apps/studio/sync/asset-push.ts +1 -47
- package/apps/studio/sync/cell-file-events.ts +3 -0
- package/apps/studio/sync/codec.ts +192 -34
- package/apps/studio/sync/cold-start-apply.ts +7 -0
- package/apps/studio/sync/cold-start.ts +118 -22
- package/apps/studio/sync/comment-identity.ts +68 -0
- package/apps/studio/sync/connection-state.ts +15 -1
- package/apps/studio/sync/ctl-provider.ts +15 -2
- package/apps/studio/sync/document-discovery.ts +81 -0
- package/apps/studio/sync/file-ledger.ts +117 -0
- package/apps/studio/sync/file-membership.ts +10 -2
- package/apps/studio/sync/file-plane.ts +926 -47
- package/apps/studio/sync/index.ts +1786 -36
- package/apps/studio/sync/journal-client.ts +13 -1
- package/apps/studio/sync/migrate-seed.ts +150 -22
- package/apps/studio/sync/poke.ts +4 -2
- package/apps/studio/sync/presentation.ts +311 -5
- package/apps/studio/sync/projection.ts +820 -23
- package/apps/studio/sync/repeated-module.ts +73 -0
- package/apps/studio/sync/retry-after.ts +169 -0
- package/apps/studio/sync/revision-barrier.ts +129 -0
- package/apps/studio/sync/seed-progress.ts +218 -0
- package/apps/studio/sync/seed-repair.ts +46 -0
- package/apps/studio/sync/source-merge.ts +100 -0
- package/apps/studio/sync/source-ops.ts +289 -0
- package/apps/studio/sync/source-recovery.ts +70 -0
- package/apps/studio/sync/source-validation.ts +56 -0
- package/apps/studio/sync/status.ts +201 -6
- package/apps/studio/sync/transaction-client.ts +460 -0
- package/apps/studio/sync/transport-error.ts +111 -0
- package/apps/studio/sync/writer-registry.ts +236 -0
- package/apps/studio/text-caret.ts +35 -0
- package/apps/studio/undo-hud.tsx +9 -87
- package/apps/studio/use-canvas-media-drop.tsx +4 -39
- package/apps/studio/whats-new.json +173 -0
- package/cli/bin/maude.mjs +2 -0
- package/cli/commands/codex.mjs +191 -0
- package/cli/commands/harness.mjs +1051 -0
- package/cli/commands/help.mjs +13 -0
- package/cli/lib/design-link.mjs +190 -2
- package/cli/lib/harness/capabilities.mjs +302 -0
- package/cli/lib/harness/codex-runtime.mjs +892 -0
- package/cli/lib/harness/compatibility.mjs +27 -0
- package/cli/lib/harness/discover-claude.mjs +1393 -0
- package/cli/lib/harness/managed-state.mjs +1296 -0
- package/cli/lib/harness/model.mjs +86 -0
- package/cli/lib/harness/secrets.mjs +390 -0
- package/cli/lib/harness/targets/codex.mjs +1141 -0
- package/cli/lib/harness/targets/opencode.mjs +807 -0
- package/cli/lib/harness/transaction.mjs +1099 -0
- package/cli/lib/hubs-config.mjs +35 -8
- package/cli/templates/harness/opencode/maude-projector.ts +58 -0
- package/docs/harness-capability-matrix.md +125 -0
- package/docs/harness-environment-projection.md +95 -0
- package/package.json +33 -9
- package/plugins/design/dependencies.json +3 -3
- package/plugins/design/templates/_shell.html +47 -0
- package/plugins/flow/.claude-plugin/config.schema.json +8 -0
- package/plugins/flow/dependencies.json +3 -3
- package/apps/studio/.ai/cache/_stats.json +0 -7
- package/apps/studio/bin/_agent-browser-safe.test.mjs +0 -165
- package/apps/studio/bin/_curl-local.test.mjs +0 -280
- package/apps/studio/bin/_pw-launch.test.mjs +0 -90
- package/apps/studio/bin/_smart-frames.test.mjs +0 -195
- package/apps/studio/bin/_transcribe.test.mjs +0 -80
- package/apps/studio/bun.lock +0 -928
- package/apps/studio/draw/test/animate.test.ts +0 -172
- package/apps/studio/draw/test/brush.test.ts +0 -213
- package/apps/studio/draw/test/composition.test.ts +0 -141
- package/apps/studio/draw/test/geometry.test.ts +0 -199
- package/apps/studio/draw/test/gradient.test.ts +0 -167
- package/apps/studio/draw/test/layout.test.ts +0 -120
- package/apps/studio/draw/test/morph.test.ts +0 -107
- package/apps/studio/draw/test/optimize.test.ts +0 -40
- package/apps/studio/draw/test/palette.test.ts +0 -123
- package/apps/studio/draw/test/primitives.test.ts +0 -129
- package/apps/studio/draw/test/serialize-animate.test.ts +0 -142
- package/apps/studio/draw/test/serialize.test.ts +0 -105
- package/apps/studio/figma/assets.test.ts +0 -464
- package/apps/studio/figma/client.test.ts +0 -395
- package/apps/studio/figma/codegen-client.test.ts +0 -276
- package/apps/studio/figma/codegen-fonts.test.ts +0 -103
- package/apps/studio/figma/codegen-values.test.ts +0 -179
- package/apps/studio/figma/comments-to-strokes.test.ts +0 -194
- package/apps/studio/figma/fig-decode.test.ts +0 -788
- package/apps/studio/figma/fig-differential.test.ts +0 -182
- package/apps/studio/figma/fig-translator.test.ts +0 -192
- package/apps/studio/figma/fig-vector.test.ts +0 -113
- package/apps/studio/figma/from-codegen.test.ts +0 -408
- package/apps/studio/figma/sanitize.test.ts +0 -325
- package/apps/studio/figma/tailwind-map.test.ts +0 -142
- package/apps/studio/figma/to-artboard.test.ts +0 -808
- package/apps/studio/figma/to-render.test.ts +0 -180
- package/apps/studio/figma/to-strokes-roundtrip.test.ts +0 -152
- package/apps/studio/figma/to-strokes.test.ts +0 -705
- package/apps/studio/figma/to-tokens.test.ts +0 -321
- package/apps/studio/figma/url.test.ts +0 -167
- package/apps/studio/footage/schema.test.ts +0 -287
- package/apps/studio/generation/adapters/groq.test.ts +0 -80
- package/apps/studio/generation/audio-library.test.ts +0 -95
- package/apps/studio/generation/captions.test.ts +0 -78
- package/apps/studio/generation/elevenlabs.test.ts +0 -223
- package/apps/studio/generation/gemini.test.ts +0 -350
- package/apps/studio/generation/jobs.test.ts +0 -128
- package/apps/studio/generation/keys.test.ts +0 -75
- package/apps/studio/generation/prefs.test.ts +0 -95
- package/apps/studio/generation/types.test.ts +0 -123
- package/apps/studio/generation/whisper-models.test.ts +0 -179
- package/apps/studio/test/_helpers.ts +0 -108
- package/apps/studio/test/acp-activity-endpoint.test.ts +0 -183
- package/apps/studio/test/acp-activity.test.ts +0 -154
- package/apps/studio/test/acp-ai-activity.test.ts +0 -182
- package/apps/studio/test/acp-attachment-serve.test.ts +0 -74
- package/apps/studio/test/acp-bootstrap-brief.test.ts +0 -178
- package/apps/studio/test/acp-branch-guard.test.ts +0 -123
- package/apps/studio/test/acp-bridge-lifetime.test.ts +0 -475
- package/apps/studio/test/acp-bridge.test.ts +0 -545
- package/apps/studio/test/acp-capabilities.test.ts +0 -123
- package/apps/studio/test/acp-caps-bridge.test.ts +0 -279
- package/apps/studio/test/acp-commands.test.ts +0 -119
- package/apps/studio/test/acp-elicitation-bridge.test.ts +0 -480
- package/apps/studio/test/acp-elicitation.test.ts +0 -251
- package/apps/studio/test/acp-env.test.ts +0 -95
- package/apps/studio/test/acp-mode-banner.test.ts +0 -45
- package/apps/studio/test/acp-origin-gate.test.ts +0 -160
- package/apps/studio/test/acp-permission-prompt.test.ts +0 -251
- package/apps/studio/test/acp-permission.test.ts +0 -278
- package/apps/studio/test/acp-plugin-bootstrap.test.ts +0 -89
- package/apps/studio/test/acp-session-allowed-tools.test.ts +0 -235
- package/apps/studio/test/acp-session-plugins.test.ts +0 -209
- package/apps/studio/test/acp-toolgroup.test.ts +0 -76
- package/apps/studio/test/acp-transcript-view.test.ts +0 -71
- package/apps/studio/test/acp-transcript.test.ts +0 -238
- package/apps/studio/test/acp-usage-bridge.test.ts +0 -141
- package/apps/studio/test/acp-usage.test.ts +0 -143
- package/apps/studio/test/acp-write-gate.test.ts +0 -323
- package/apps/studio/test/acp-write-scope.test.ts +0 -533
- package/apps/studio/test/active-state.test.ts +0 -186
- package/apps/studio/test/activity.test.ts +0 -189
- package/apps/studio/test/ai-activity.test.ts +0 -113
- package/apps/studio/test/annotate-write.test.ts +0 -1074
- package/apps/studio/test/annotation-strokes-command.test.ts +0 -166
- package/apps/studio/test/annotations-align.test.ts +0 -88
- package/apps/studio/test/annotations-api.test.ts +0 -145
- package/apps/studio/test/annotations-bindings.test.ts +0 -262
- package/apps/studio/test/annotations-draw-modifiers.test.ts +0 -206
- package/apps/studio/test/annotations-groups.test.ts +0 -231
- package/apps/studio/test/annotations-layer.test.ts +0 -1011
- package/apps/studio/test/annotations-roundtrip.test.ts +0 -663
- package/apps/studio/test/annotations-snap.test.ts +0 -135
- package/apps/studio/test/annotations-text-format.test.ts +0 -396
- package/apps/studio/test/artboard-activity-overlay.test.tsx +0 -56
- package/apps/studio/test/artboard-guides-overlay.test.tsx +0 -152
- package/apps/studio/test/artboard-hug-commit.test.ts +0 -36
- package/apps/studio/test/artboard-kinds.test.tsx +0 -83
- package/apps/studio/test/artboard-selection-attrs.test.ts +0 -69
- package/apps/studio/test/asset-api.test.ts +0 -149
- package/apps/studio/test/assets-s3.test.ts +0 -249
- package/apps/studio/test/binary-smoke.test.ts +0 -47
- package/apps/studio/test/boot-self-heal.test.ts +0 -87
- package/apps/studio/test/browse-posture.test.tsx +0 -107
- package/apps/studio/test/bundle-smoke.test.ts +0 -46
- package/apps/studio/test/camera-reveal.test.tsx +0 -173
- package/apps/studio/test/canvas-artifacts.test.ts +0 -125
- package/apps/studio/test/canvas-build-sandbox.test.ts +0 -69
- package/apps/studio/test/canvas-build.test.ts +0 -141
- package/apps/studio/test/canvas-create-api.test.ts +0 -676
- package/apps/studio/test/canvas-cursors.test.ts +0 -164
- package/apps/studio/test/canvas-edit.test.ts +0 -470
- package/apps/studio/test/canvas-freshness-deps.test.ts +0 -64
- package/apps/studio/test/canvas-header.test.ts +0 -127
- package/apps/studio/test/canvas-hide-chrome.test.ts +0 -88
- package/apps/studio/test/canvas-hmr-runtime.test.tsx +0 -114
- package/apps/studio/test/canvas-lib-inline.test.ts +0 -146
- package/apps/studio/test/canvas-lib-motion.test.ts +0 -131
- package/apps/studio/test/canvas-lib-resolver.test.ts +0 -111
- package/apps/studio/test/canvas-list-watch.test.ts +0 -388
- package/apps/studio/test/canvas-media-drop.test.ts +0 -187
- package/apps/studio/test/canvas-meta-api.test.ts +0 -707
- package/apps/studio/test/canvas-move-api.test.ts +0 -587
- package/apps/studio/test/canvas-origin-gate.test.ts +0 -417
- package/apps/studio/test/canvas-pipeline.test.ts +0 -180
- package/apps/studio/test/canvas-rects.test.ts +0 -198
- package/apps/studio/test/canvas-reorder.test.ts +0 -211
- package/apps/studio/test/canvas-route.test.ts +0 -179
- package/apps/studio/test/canvas-shell-base.test.ts +0 -107
- package/apps/studio/test/canvas-shell-build-error.test.ts +0 -52
- package/apps/studio/test/canvas-url.test.ts +0 -138
- package/apps/studio/test/canvas-wheel-delta.test.ts +0 -42
- package/apps/studio/test/canvas-zoom-floor.test.ts +0 -73
- package/apps/studio/test/capture-core.test.ts +0 -32
- package/apps/studio/test/capture-determinism-shape.test.ts +0 -135
- package/apps/studio/test/chat-attachments.test.ts +0 -117
- package/apps/studio/test/chat-context.test.ts +0 -129
- package/apps/studio/test/chat-markdown.test.tsx +0 -58
- package/apps/studio/test/clip-addressing.test.ts +0 -738
- package/apps/studio/test/clip-ops.test.ts +0 -922
- package/apps/studio/test/cloud-build.test.ts +0 -95
- package/apps/studio/test/cloud-connect-note.test.ts +0 -135
- package/apps/studio/test/cloud-endpoints.test.ts +0 -590
- package/apps/studio/test/cloud-history-hardening.test.ts +0 -165
- package/apps/studio/test/cloud-history-posture.test.ts +0 -230
- package/apps/studio/test/cloud-managed-save-surfaces.test.ts +0 -90
- package/apps/studio/test/cloud-renew.test.ts +0 -205
- package/apps/studio/test/cloud-session-role.test.ts +0 -161
- package/apps/studio/test/cloud-shell-surfaces.test.ts +0 -170
- package/apps/studio/test/cold-start-apply.test.ts +0 -303
- package/apps/studio/test/collab-annotations-bridge.test.ts +0 -55
- package/apps/studio/test/collab-awareness-bridge.test.ts +0 -223
- package/apps/studio/test/collab-bridge.test.ts +0 -79
- package/apps/studio/test/collab-loopback.test.ts +0 -63
- package/apps/studio/test/collab-origin-gate.test.ts +0 -323
- package/apps/studio/test/collab-protocol.test.ts +0 -146
- package/apps/studio/test/collab-readonly-gate.test.ts +0 -194
- package/apps/studio/test/collab-reseed-guard.test.ts +0 -78
- package/apps/studio/test/collab-room.test.ts +0 -188
- package/apps/studio/test/collab-session-survival.test.tsx +0 -176
- package/apps/studio/test/collab-stress.test.ts +0 -129
- package/apps/studio/test/comment-mount.test.ts +0 -97
- package/apps/studio/test/comment-relay-origin-gate.test.ts +0 -117
- package/apps/studio/test/comments-api.test.ts +0 -277
- package/apps/studio/test/comments-fs-rebroadcast.test.ts +0 -155
- package/apps/studio/test/comments-overlay.test.ts +0 -117
- package/apps/studio/test/compile-entry.test.ts +0 -133
- package/apps/studio/test/component-map.test.ts +0 -48
- package/apps/studio/test/config-projection.test.ts +0 -104
- package/apps/studio/test/config-reload.test.ts +0 -230
- package/apps/studio/test/config-version.test.ts +0 -88
- package/apps/studio/test/context-resolve-tokens.test.ts +0 -97
- package/apps/studio/test/convert-to-absolute.test.ts +0 -333
- package/apps/studio/test/credential-grammar.test.ts +0 -107
- package/apps/studio/test/csp-canvas-shell.test.ts +0 -62
- package/apps/studio/test/csrf-write-guard.test.ts +0 -141
- package/apps/studio/test/debug-bundle.test.ts +0 -105
- package/apps/studio/test/design-setup-readiness.test.ts +0 -155
- package/apps/studio/test/detach-component.test.ts +0 -94
- package/apps/studio/test/dns-rebinding-guard.test.ts +0 -101
- package/apps/studio/test/dom-selection.test.ts +0 -198
- package/apps/studio/test/dynamic-text-edit.test.ts +0 -162
- package/apps/studio/test/edit-css-occurrence.test.ts +0 -81
- package/apps/studio/test/edit-persistence.test.ts +0 -91
- package/apps/studio/test/edit-scope-api.test.ts +0 -119
- package/apps/studio/test/edit-source-command.test.ts +0 -142
- package/apps/studio/test/edit-suppress.test.ts +0 -170
- package/apps/studio/test/editing-presence.test.ts +0 -103
- package/apps/studio/test/element-resize.test.ts +0 -136
- package/apps/studio/test/element-structural-api.test.ts +0 -434
- package/apps/studio/test/element-structural-edit.test.ts +0 -750
- package/apps/studio/test/ensure-browser.test.ts +0 -92
- package/apps/studio/test/equal-spacing-detector.test.ts +0 -257
- package/apps/studio/test/export-assemble.test.ts +0 -53
- package/apps/studio/test/export-browser-lane.test.ts +0 -126
- package/apps/studio/test/export-capture-fidelity.test.ts +0 -146
- package/apps/studio/test/export-capture-hygiene.test.ts +0 -675
- package/apps/studio/test/export-center.test.tsx +0 -287
- package/apps/studio/test/export-e2e-lanes.test.ts +0 -857
- package/apps/studio/test/export-format-scope-coherence.test.ts +0 -89
- package/apps/studio/test/export-lane.test.ts +0 -245
- package/apps/studio/test/export-shim-multi-capture.test.ts +0 -83
- package/apps/studio/test/exporters/canva.test.ts +0 -63
- package/apps/studio/test/exporters/degraded-propagation.test.ts +0 -123
- package/apps/studio/test/exporters/endpoint.test.ts +0 -121
- package/apps/studio/test/exporters/history.test.ts +0 -107
- package/apps/studio/test/exporters/html.test.ts +0 -26
- package/apps/studio/test/exporters/jobs.test.ts +0 -342
- package/apps/studio/test/exporters/pdf.test.ts +0 -85
- package/apps/studio/test/exporters/png.test.ts +0 -103
- package/apps/studio/test/exporters/pptx-deck.test.ts +0 -112
- package/apps/studio/test/exporters/pptx.test.ts +0 -31
- package/apps/studio/test/exporters/pw-launch.test.ts +0 -49
- package/apps/studio/test/exporters/runtime.test.ts +0 -59
- package/apps/studio/test/exporters/scope.test.ts +0 -292
- package/apps/studio/test/exporters/svg.test.ts +0 -29
- package/apps/studio/test/exporters/unsupported-media.test.ts +0 -123
- package/apps/studio/test/exporters/zip.test.ts +0 -104
- package/apps/studio/test/fetch-asset-gate.test.ts +0 -189
- package/apps/studio/test/figjam-v3-model.test.ts +0 -342
- package/apps/studio/test/figma-explode.test.ts +0 -438
- package/apps/studio/test/figma-provenance.test.ts +0 -108
- package/apps/studio/test/figma-routes.test.ts +0 -294
- package/apps/studio/test/file-lock.test.ts +0 -84
- package/apps/studio/test/fixtures/backgrounding-claude-auth.sh +0 -12
- package/apps/studio/test/fixtures/fake-claude-auth.mjs +0 -23
- package/apps/studio/test/fixtures/figjam-v3-groups-bindings.svg +0 -1
- package/apps/studio/test/fixtures/mock-acp-agent-caps.mjs +0 -158
- package/apps/studio/test/fixtures/mock-acp-agent-commands.mjs +0 -44
- package/apps/studio/test/fixtures/mock-acp-agent-elicit-flood.mjs +0 -46
- package/apps/studio/test/fixtures/mock-acp-agent-elicit-url.mjs +0 -42
- package/apps/studio/test/fixtures/mock-acp-agent-elicit.mjs +0 -63
- package/apps/studio/test/fixtures/mock-acp-agent-permission-flood.mjs +0 -51
- package/apps/studio/test/fixtures/mock-acp-agent-permission.mjs +0 -50
- package/apps/studio/test/fixtures/mock-acp-agent-slow.mjs +0 -45
- package/apps/studio/test/fixtures/mock-acp-agent-usage.mjs +0 -56
- package/apps/studio/test/fixtures/mock-acp-agent-wedged.mjs +0 -37
- package/apps/studio/test/fixtures/mock-acp-agent-write.mjs +0 -118
- package/apps/studio/test/fixtures/mock-acp-agent.mjs +0 -69
- package/apps/studio/test/fixtures/noisy-claude-auth.mjs +0 -27
- package/apps/studio/test/fixtures/perf-canvas.mjs +0 -201
- package/apps/studio/test/fixtures/phase-20-annotations.svg +0 -1
- package/apps/studio/test/fixtures/phase-21-annotations.svg +0 -1
- package/apps/studio/test/fixtures/tiny-subset.woff2 +0 -0
- package/apps/studio/test/fixtures/video-comp-fixture.tsx +0 -82
- package/apps/studio/test/fixtures/wedged-claude-auth.sh +0 -11
- package/apps/studio/test/footage-store.test.ts +0 -100
- package/apps/studio/test/fs-mkdir-api.test.ts +0 -248
- package/apps/studio/test/fs-watch.test.ts +0 -41
- package/apps/studio/test/gemma-models.test.ts +0 -245
- package/apps/studio/test/generate-route.test.ts +0 -106
- package/apps/studio/test/git-api.test.ts +0 -0
- package/apps/studio/test/git-branches.test.ts +0 -341
- package/apps/studio/test/git-cloud-posture.test.ts +0 -59
- package/apps/studio/test/git-grouping.test.ts +0 -106
- package/apps/studio/test/git-lifecycle.test.ts +0 -100
- package/apps/studio/test/git-log-format.test.ts +0 -95
- package/apps/studio/test/git-safe-rel.test.ts +0 -132
- package/apps/studio/test/git-system-engine.test.ts +0 -135
- package/apps/studio/test/git-watch.test.ts +0 -97
- package/apps/studio/test/github-api.test.ts +0 -577
- package/apps/studio/test/grid-track-handles.test.ts +0 -160
- package/apps/studio/test/handoff-static-frames.test.ts +0 -215
- package/apps/studio/test/handoff.test.ts +0 -329
- package/apps/studio/test/history-rollback.test.ts +0 -88
- package/apps/studio/test/hmr-broadcast.test.ts +0 -236
- package/apps/studio/test/hmr-classify.test.ts +0 -87
- package/apps/studio/test/hub-link.test.ts +0 -80
- package/apps/studio/test/identity-cache.test.ts +0 -83
- package/apps/studio/test/import-asset-browser.test.ts +0 -64
- package/apps/studio/test/import-asset-route.test.ts +0 -71
- package/apps/studio/test/import-asset.test.ts +0 -427
- package/apps/studio/test/import-brand-browser.test.ts +0 -88
- package/apps/studio/test/import-brand-route.test.ts +0 -120
- package/apps/studio/test/import-brand.test.ts +0 -206
- package/apps/studio/test/import-figma.test.ts +0 -667
- package/apps/studio/test/import-tokens.test.ts +0 -722
- package/apps/studio/test/index-data-canvas-ds.test.ts +0 -97
- package/apps/studio/test/input-router.test.ts +0 -757
- package/apps/studio/test/inspect-script-syntax.test.ts +0 -53
- package/apps/studio/test/inspect-selections.test.ts +0 -219
- package/apps/studio/test/knob-props-authored.test.ts +0 -87
- package/apps/studio/test/layers-synthetic-groups.test.ts +0 -96
- package/apps/studio/test/locator.test.ts +0 -214
- package/apps/studio/test/marquee-overlay.test.ts +0 -94
- package/apps/studio/test/media-commit-chain.test.ts +0 -210
- package/apps/studio/test/mode-toggle.test.tsx +0 -226
- package/apps/studio/test/motion-sample.test.ts +0 -35
- package/apps/studio/test/move-artboards-command.test.ts +0 -108
- package/apps/studio/test/participants-chrome.test.ts +0 -65
- package/apps/studio/test/paths.test.ts +0 -88
- package/apps/studio/test/pdf-print-boxes.test.ts +0 -359
- package/apps/studio/test/peer-selection-follows-camera.test.tsx +0 -131
- package/apps/studio/test/perf-harness.ts +0 -193
- package/apps/studio/test/phase-3.6-smoke.test.ts +0 -79
- package/apps/studio/test/photo-bg-remove-validation.test.ts +0 -71
- package/apps/studio/test/photo-canvas-bundle.test.ts +0 -79
- package/apps/studio/test/photo-edit-api.test.ts +0 -201
- package/apps/studio/test/photo-filters.test.ts +0 -149
- package/apps/studio/test/photo-pipeline.test.ts +0 -106
- package/apps/studio/test/photo-taxonomy.test.ts +0 -96
- package/apps/studio/test/print-marks.test.ts +0 -113
- package/apps/studio/test/print-units.test.ts +0 -173
- package/apps/studio/test/read-annotations.test.ts +0 -727
- package/apps/studio/test/read-only-gate.test.ts +0 -188
- package/apps/studio/test/read-only-role.test.ts +0 -95
- package/apps/studio/test/readiness.test.ts +0 -337
- package/apps/studio/test/remote-ahead-behind-cache.test.ts +0 -89
- package/apps/studio/test/reorder-api.test.ts +0 -210
- package/apps/studio/test/repo-concurrency.test.ts +0 -146
- package/apps/studio/test/repo-lock.test.ts +0 -350
- package/apps/studio/test/report-proxy.test.ts +0 -125
- package/apps/studio/test/ripple.test.ts +0 -197
- package/apps/studio/test/runtime-bundle-error-mapping.test.ts +0 -43
- package/apps/studio/test/runtime-bundle.test.ts +0 -69
- package/apps/studio/test/sanitize-annotation-svg.test.ts +0 -238
- package/apps/studio/test/scaffold-design.test.ts +0 -122
- package/apps/studio/test/server-lifecycle.test.ts +0 -38
- package/apps/studio/test/session-runtime-state.test.ts +0 -226
- package/apps/studio/test/session-scope.test.ts +0 -100
- package/apps/studio/test/shared-doc-cell-pairing.test.ts +0 -642
- package/apps/studio/test/shared-doc-convergence.test.ts +0 -265
- package/apps/studio/test/shared-doc-foundation.test.ts +0 -63
- package/apps/studio/test/shared-doc-migrate.test.ts +0 -369
- package/apps/studio/test/shared-doc-projection.test.ts +0 -238
- package/apps/studio/test/shell-importmap.test.ts +0 -56
- package/apps/studio/test/sizing-mode.test.ts +0 -102
- package/apps/studio/test/slash-commands.test.ts +0 -117
- package/apps/studio/test/snap-distance-pill.test.ts +0 -68
- package/apps/studio/test/spacing-handles.test.ts +0 -138
- package/apps/studio/test/specimen-select.test.ts +0 -88
- package/apps/studio/test/sync-agent.test.ts +0 -660
- package/apps/studio/test/sync-annotations-cold-start.test.ts +0 -302
- package/apps/studio/test/sync-asset-push.test.ts +0 -931
- package/apps/studio/test/sync-atomic-write.test.ts +0 -62
- package/apps/studio/test/sync-attach-incremental.test.ts +0 -527
- package/apps/studio/test/sync-autocommit.test.ts +0 -537
- package/apps/studio/test/sync-canvas-path.test.ts +0 -200
- package/apps/studio/test/sync-cell-write-nudge.test.ts +0 -346
- package/apps/studio/test/sync-codec.test.ts +0 -230
- package/apps/studio/test/sync-cold-seed-dedup.test.ts +0 -187
- package/apps/studio/test/sync-cold-start.test.ts +0 -304
- package/apps/studio/test/sync-connect-honesty.test.ts +0 -114
- package/apps/studio/test/sync-connection-state.test.ts +0 -337
- package/apps/studio/test/sync-ctl-channel.test.ts +0 -508
- package/apps/studio/test/sync-decide-file.test.ts +0 -420
- package/apps/studio/test/sync-doc-name.test.ts +0 -281
- package/apps/studio/test/sync-echo-guard.test.ts +0 -96
- package/apps/studio/test/sync-file-ledger.test.ts +0 -334
- package/apps/studio/test/sync-file-membership.test.ts +0 -347
- package/apps/studio/test/sync-file-plane.test.ts +0 -976
- package/apps/studio/test/sync-file-pull.test.ts +0 -333
- package/apps/studio/test/sync-fresh-link-parity.test.ts +0 -267
- package/apps/studio/test/sync-fs-mirror.test.ts +0 -181
- package/apps/studio/test/sync-hardening.test.ts +0 -586
- package/apps/studio/test/sync-hub-listing.test.ts +0 -46
- package/apps/studio/test/sync-hubs-config.test.ts +0 -133
- package/apps/studio/test/sync-incident-replay.test.ts +0 -211
- package/apps/studio/test/sync-journal.test.ts +0 -176
- package/apps/studio/test/sync-meta-codec.test.ts +0 -199
- package/apps/studio/test/sync-migrate-flat-fallback.test.ts +0 -98
- package/apps/studio/test/sync-move-retirement.test.ts +0 -231
- package/apps/studio/test/sync-panel-surface.test.ts +0 -153
- package/apps/studio/test/sync-path-pull.test.ts +0 -531
- package/apps/studio/test/sync-presentation.test.ts +0 -262
- package/apps/studio/test/sync-pull-budget.test.ts +0 -169
- package/apps/studio/test/sync-remote-docs.test.ts +0 -333
- package/apps/studio/test/sync-resync-routes.test.ts +0 -168
- package/apps/studio/test/sync-runtime.test.ts +0 -1675
- package/apps/studio/test/sync-seed-defers-to-hub.test.ts +0 -83
- package/apps/studio/test/sync-settings-routes.test.ts +0 -195
- package/apps/studio/test/sync-settings.test.ts +0 -151
- package/apps/studio/test/sync-status.test.ts +0 -261
- package/apps/studio/test/sync-supervisor.test.ts +0 -262
- package/apps/studio/test/sync-tombstone-apply.test.ts +0 -111
- package/apps/studio/test/sync-trash.test.ts +0 -132
- package/apps/studio/test/sync-two-peer-discovery.test.ts +0 -343
- package/apps/studio/test/sync-untrusted.test.ts +0 -103
- package/apps/studio/test/system-endpoint.test.ts +0 -144
- package/apps/studio/test/text-editability-stamp.test.ts +0 -131
- package/apps/studio/test/timeline-comp-target.test.ts +0 -139
- package/apps/studio/test/timeline-media-cache.test.ts +0 -41
- package/apps/studio/test/timeline-parse.test.ts +0 -184
- package/apps/studio/test/timeline-scale.test.ts +0 -65
- package/apps/studio/test/timeline-snap.test.ts +0 -85
- package/apps/studio/test/tool-palette-insert-anchor.test.ts +0 -86
- package/apps/studio/test/tool-palette.test.tsx +0 -55
- package/apps/studio/test/tour-overlay.test.tsx +0 -90
- package/apps/studio/test/trusted-request-host.test.ts +0 -66
- package/apps/studio/test/undo-sequence-byte-compare.test.ts +0 -211
- package/apps/studio/test/undo-stack.test.ts +0 -244
- package/apps/studio/test/use-agent-presence.test.tsx +0 -117
- package/apps/studio/test/use-annotation-resize.test.ts +0 -402
- package/apps/studio/test/use-annotation-selection.test.tsx +0 -77
- package/apps/studio/test/use-artboard-drag.test.ts +0 -324
- package/apps/studio/test/use-canvas-activity.test.tsx +0 -206
- package/apps/studio/test/use-collab.test.ts +0 -0
- package/apps/studio/test/use-cursor-modifiers.test.ts +0 -59
- package/apps/studio/test/use-keyboard-discipline.test.ts +0 -27
- package/apps/studio/test/use-selection-set.test.tsx +0 -166
- package/apps/studio/test/use-snap-guides.test.ts +0 -271
- package/apps/studio/test/use-tool-mode.test.tsx +0 -186
- package/apps/studio/test/use-undo-stack.test.tsx +0 -223
- package/apps/studio/test/video-asset.test.ts +0 -163
- package/apps/studio/test/video-comp-fixture.test.ts +0 -50
- package/apps/studio/test/video-comp.test.ts +0 -270
- package/apps/studio/test/video-encode-lib.test.ts +0 -63
- package/apps/studio/test/video-render-bridge.test.ts +0 -171
- package/apps/studio/test/whats-new.test.ts +0 -113
- package/apps/studio/test/whisper-setup.test.ts +0 -97
- package/apps/studio/test/workspace-containment.test.ts +0 -382
- package/apps/studio/test/workspace-signin.test.ts +0 -292
- package/apps/studio/test/ws-handshake.test.ts +0 -33
- package/cli/commands/cache.test.mjs +0 -166
- package/cli/commands/design-link.test.mjs +0 -419
- package/cli/commands/design.test.mjs +0 -240
- package/cli/commands/doctor.test.mjs +0 -237
- package/cli/commands/hub-workspace.test.mjs +0 -275
- package/cli/commands/hub.test.mjs +0 -225
- package/cli/commands/kg.test.mjs +0 -142
- package/cli/commands/preflight.test.mjs +0 -46
- package/cli/lib/argv.test.mjs +0 -46
- package/cli/lib/cache.test.mjs +0 -303
- package/cli/lib/cell-plan.test.mjs +0 -225
- package/cli/lib/config-lint.test.mjs +0 -117
- package/cli/lib/ddr-to-kgai.test.mjs +0 -118
- package/cli/lib/design-ownership.test.mjs +0 -329
- package/cli/lib/fetch-asset.test.mjs +0 -213
- package/cli/lib/figma-codegen-reachability.test.mjs +0 -104
- package/cli/lib/figma-import-controls.test.mjs +0 -70
- package/cli/lib/flow-design-integration.test.mjs +0 -165
- package/cli/lib/gitignore-block.test.mjs +0 -136
- package/cli/lib/gitignore-drift.test.mjs +0 -156
- package/cli/lib/hubs-config.test.mjs +0 -165
- package/cli/lib/pkg-root.test.mjs +0 -111
- package/cli/lib/plugin-cli-reachability.test.mjs +0 -57
- package/cli/lib/plugin-name-namespace.test.mjs +0 -71
- package/cli/lib/reconstruct-toolset.test.mjs +0 -194
- package/cli/lib/stack-detect.test.mjs +0 -121
- package/cli/lib/update-check.test.mjs +0 -32
- package/cli/lib/workspace-plan.test.mjs +0 -699
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
// tool-palette.tsx — Stage I3 tail (feature-element-editing-robustness). The
|
|
2
|
-
// "+ Element" affordance's anchor resolver: appends relative to the ACTIVE
|
|
3
|
-
// artboard's last existing child (mirrors the context-menu's element-relative
|
|
4
|
-
// insert, since an artboard's own `<article data-dc-screen>` carries no
|
|
5
|
-
// `data-cd-id` of its own — DCArtboard doesn't forward it to the DOM), falling
|
|
6
|
-
// back to the artboard's own `data-dc-screen` id (inside-end) when it has no
|
|
7
|
-
// such child yet — the empty-artboard fix for the previously-silent no-op.
|
|
8
|
-
//
|
|
9
|
-
// Needs a live DOM (querySelector/:scope) — register happy-dom for this file
|
|
10
|
-
// only, like canvas-hmr-runtime.test.tsx.
|
|
11
|
-
|
|
12
|
-
import { afterAll, beforeAll, describe, expect, test } from 'bun:test';
|
|
13
|
-
import { GlobalRegistrator } from '@happy-dom/global-registrator';
|
|
14
|
-
|
|
15
|
-
beforeAll(() => {
|
|
16
|
-
GlobalRegistrator.register();
|
|
17
|
-
});
|
|
18
|
-
afterAll(() => {
|
|
19
|
-
GlobalRegistrator.unregister();
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
import { resolveInsertAnchor } from '../tool-palette.tsx';
|
|
23
|
-
|
|
24
|
-
describe('tool-palette / resolveInsertAnchor', () => {
|
|
25
|
-
test('anchors on the last data-cd-id child of the CURRENT (aria-current) artboard', () => {
|
|
26
|
-
document.body.innerHTML = `
|
|
27
|
-
<article data-dc-screen="a1">
|
|
28
|
-
<div class="dc-artboard-body">
|
|
29
|
-
<div data-cd-id="11111111">one</div>
|
|
30
|
-
<div data-cd-id="22222222">two</div>
|
|
31
|
-
</div>
|
|
32
|
-
</article>
|
|
33
|
-
<article data-dc-screen="a2" aria-current="true">
|
|
34
|
-
<div class="dc-artboard-body">
|
|
35
|
-
<div data-cd-id="33333333">three</div>
|
|
36
|
-
<div data-cd-id="44444444">four</div>
|
|
37
|
-
</div>
|
|
38
|
-
</article>
|
|
39
|
-
`;
|
|
40
|
-
expect(resolveInsertAnchor(document)).toEqual({ refId: '44444444', position: 'after' });
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test('falls back to the FIRST artboard when none is aria-current', () => {
|
|
44
|
-
document.body.innerHTML = `
|
|
45
|
-
<article data-dc-screen="a1">
|
|
46
|
-
<div class="dc-artboard-body"><div data-cd-id="aaaaaaaa">x</div></div>
|
|
47
|
-
</article>
|
|
48
|
-
<article data-dc-screen="a2">
|
|
49
|
-
<div class="dc-artboard-body"><div data-cd-id="bbbbbbbb">y</div></div>
|
|
50
|
-
</article>
|
|
51
|
-
`;
|
|
52
|
-
expect(resolveInsertAnchor(document)).toEqual({ refId: 'aaaaaaaa', position: 'after' });
|
|
53
|
-
});
|
|
54
|
-
|
|
55
|
-
test('skips a chrome direct-child with no data-cd-id, picking the last STAMPED one', () => {
|
|
56
|
-
document.body.innerHTML = `
|
|
57
|
-
<article data-dc-screen="a1" aria-current="true">
|
|
58
|
-
<div class="dc-artboard-body">
|
|
59
|
-
<div data-cd-id="11111111">one</div>
|
|
60
|
-
<div class="some-chrome-node">no cd-id</div>
|
|
61
|
-
</div>
|
|
62
|
-
</article>
|
|
63
|
-
`;
|
|
64
|
-
expect(resolveInsertAnchor(document)).toEqual({ refId: '11111111', position: 'after' });
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
test('falls back to the artboard id (inside-end) for an EMPTY artboard — no longer a silent no-op', () => {
|
|
68
|
-
document.body.innerHTML = `
|
|
69
|
-
<article data-dc-screen="a1" aria-current="true">
|
|
70
|
-
<div class="dc-artboard-body"></div>
|
|
71
|
-
</article>
|
|
72
|
-
`;
|
|
73
|
-
expect(resolveInsertAnchor(document)).toEqual({ artboardId: 'a1', position: 'inside-end' });
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
test('returns null when there is no artboard at all', () => {
|
|
77
|
-
document.body.innerHTML = '<div>no artboards here</div>';
|
|
78
|
-
expect(resolveInsertAnchor(document)).toBeNull();
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test('returns null when the artboard has no .dc-artboard-body wrapper', () => {
|
|
82
|
-
document.body.innerHTML =
|
|
83
|
-
'<article data-dc-screen="a1"><div data-cd-id="11111111">x</div></article>';
|
|
84
|
-
expect(resolveInsertAnchor(document)).toBeNull();
|
|
85
|
-
});
|
|
86
|
-
});
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
// tool-palette — Phase 5.1 centered icon toolbar.
|
|
2
|
-
//
|
|
3
|
-
// The palette pulls live state via three context hooks (tool mode, viewport
|
|
4
|
-
// controller, annotations visibility) and the icon set is dependency-free, so
|
|
5
|
-
// the SSR render path is the cleanest unit-test surface. We confirm:
|
|
6
|
-
// - one icon button per default tool registered in ToolProvider
|
|
7
|
-
// - the active tool gets aria-pressed=true
|
|
8
|
-
// - the zoom display shows the live percentage
|
|
9
|
-
// - the icon module exports a glyph for every default tool id
|
|
10
|
-
|
|
11
|
-
import { describe, expect, test } from 'bun:test';
|
|
12
|
-
|
|
13
|
-
import { renderToStaticMarkup } from 'react-dom/server';
|
|
14
|
-
|
|
15
|
-
import { TOOL_ICONS } from '../canvas-icons.tsx';
|
|
16
|
-
import { ToolPalette } from '../tool-palette.tsx';
|
|
17
|
-
import { AnnotationsVisibilityProvider } from '../use-annotations-visibility.tsx';
|
|
18
|
-
import { DEFAULT_TOOLS, ToolProvider } from '../use-tool-mode.tsx';
|
|
19
|
-
|
|
20
|
-
describe('canvas-icons / TOOL_ICONS', () => {
|
|
21
|
-
test('exposes a component for every default tool id', () => {
|
|
22
|
-
for (const t of DEFAULT_TOOLS) {
|
|
23
|
-
expect(TOOL_ICONS[t.id]).toBeDefined();
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test('icons render as <svg> elements with currentColor stroke', () => {
|
|
28
|
-
for (const t of DEFAULT_TOOLS) {
|
|
29
|
-
const Icon = TOOL_ICONS[t.id];
|
|
30
|
-
if (!Icon) continue;
|
|
31
|
-
const html = renderToStaticMarkup(<Icon />);
|
|
32
|
-
expect(html).toContain('<svg');
|
|
33
|
-
expect(html).toContain('stroke="currentColor"');
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
describe('tool-palette / SSR render contract', () => {
|
|
39
|
-
// First render under SSR returns null (the `mounted` gate is intentional —
|
|
40
|
-
// avoids hydration drift). We assert the empty mount + then re-render
|
|
41
|
-
// hydrated by passing a different initial setup, but bun's SSR only runs
|
|
42
|
-
// the first render. Adequate to confirm the import + provider stack don't
|
|
43
|
-
// throw, which catches typo/cycle regressions in the new chrome modules.
|
|
44
|
-
test('mounts inside ToolProvider + visibility provider without throwing', () => {
|
|
45
|
-
expect(() =>
|
|
46
|
-
renderToStaticMarkup(
|
|
47
|
-
<AnnotationsVisibilityProvider>
|
|
48
|
-
<ToolProvider>
|
|
49
|
-
<ToolPalette />
|
|
50
|
-
</ToolProvider>
|
|
51
|
-
</AnnotationsVisibilityProvider>
|
|
52
|
-
)
|
|
53
|
-
).not.toThrow();
|
|
54
|
-
});
|
|
55
|
-
});
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
// tour-overlay — Phase 3. Render contract for the hand-rolled tour engine.
|
|
2
|
-
//
|
|
3
|
-
// renderToStaticMarkup doesn't run effects, so the rect stays null on the
|
|
4
|
-
// server render → the overlay falls back to a centered card + scrim. We assert
|
|
5
|
-
// the a11y dialog contract + step/nav wiring; keyboard/focus-trap behavior is a
|
|
6
|
-
// live-only concern (verified via agent-browser).
|
|
7
|
-
|
|
8
|
-
import { describe, expect, test } from 'bun:test';
|
|
9
|
-
import { renderToStaticMarkup } from 'react-dom/server';
|
|
10
|
-
import { TourOverlay } from '../client/tour/overlay.jsx';
|
|
11
|
-
import { QUICK_SETUP_TOUR } from '../client/tour/quick-setup-tour.js';
|
|
12
|
-
|
|
13
|
-
const STEP = { target: '.x', title: 'Welcome', body: 'Body copy here' };
|
|
14
|
-
|
|
15
|
-
describe('TourOverlay', () => {
|
|
16
|
-
test('renders an accessible dialog with the first step', () => {
|
|
17
|
-
const html = renderToStaticMarkup(
|
|
18
|
-
<TourOverlay open steps={[STEP]} onClose={() => {}} onComplete={() => {}} />
|
|
19
|
-
);
|
|
20
|
-
expect(html).toContain('mdcc-tour');
|
|
21
|
-
expect(html).toContain('role="dialog"');
|
|
22
|
-
expect(html).toContain('aria-modal="true"');
|
|
23
|
-
expect(html).toContain('Welcome');
|
|
24
|
-
expect(html).toContain('Body copy here');
|
|
25
|
-
expect(html).toContain('1 / 1');
|
|
26
|
-
expect(html).toContain('mdcc-tour__scrim'); // no rect on the server → scrim, not spotlight
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
test('single step shows Done (not Next) and no Back', () => {
|
|
30
|
-
const html = renderToStaticMarkup(
|
|
31
|
-
<TourOverlay open steps={[STEP]} onClose={() => {}} onComplete={() => {}} />
|
|
32
|
-
);
|
|
33
|
-
expect(html).toContain('Done');
|
|
34
|
-
expect(html).not.toContain('mdcc-tour__back');
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
test('multi-step first page shows Next, the counter, and no Back yet', () => {
|
|
38
|
-
const steps = [STEP, { ...STEP, title: 'Two' }, { ...STEP, title: 'Three' }];
|
|
39
|
-
const html = renderToStaticMarkup(
|
|
40
|
-
<TourOverlay open steps={steps} onClose={() => {}} onComplete={() => {}} />
|
|
41
|
-
);
|
|
42
|
-
expect(html).toContain('1 / 3');
|
|
43
|
-
expect(html).toContain('Next');
|
|
44
|
-
expect(html).not.toContain('mdcc-tour__back'); // i === 0
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
test('a step with a render graphic widens the card and draws the graphic (Phase 29 / E4)', () => {
|
|
48
|
-
function Graphic() {
|
|
49
|
-
return <div className="cm-info">TWO-LAYER-DIAGRAM</div>;
|
|
50
|
-
}
|
|
51
|
-
const html = renderToStaticMarkup(
|
|
52
|
-
<TourOverlay
|
|
53
|
-
open
|
|
54
|
-
steps={[{ render: Graphic, title: 'Working together', body: 'Two layers.' }]}
|
|
55
|
-
onClose={() => {}}
|
|
56
|
-
onComplete={() => {}}
|
|
57
|
-
/>
|
|
58
|
-
);
|
|
59
|
-
expect(html).toContain('mdcc-tour__card--graphic');
|
|
60
|
-
expect(html).toContain('mdcc-tour__graphic');
|
|
61
|
-
expect(html).toContain('TWO-LAYER-DIAGRAM');
|
|
62
|
-
expect(html).toContain('Working together');
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
test('QUICK_SETUP_TOUR (DDR-166 plan, Phase 2 / T7) is a well-formed, renderable deck', () => {
|
|
66
|
-
expect(QUICK_SETUP_TOUR.length).toBeGreaterThan(1);
|
|
67
|
-
for (const step of QUICK_SETUP_TOUR) {
|
|
68
|
-
expect(typeof step.title).toBe('string');
|
|
69
|
-
expect(step.title.length).toBeGreaterThan(0);
|
|
70
|
-
expect(typeof step.body).toBe('string');
|
|
71
|
-
expect(step.body.length).toBeGreaterThan(0);
|
|
72
|
-
}
|
|
73
|
-
const html = renderToStaticMarkup(
|
|
74
|
-
<TourOverlay open steps={QUICK_SETUP_TOUR} onClose={() => {}} onComplete={() => {}} />
|
|
75
|
-
);
|
|
76
|
-
expect(html).toContain('mdcc-tour__title');
|
|
77
|
-
expect(html).toContain(`1 / ${QUICK_SETUP_TOUR.length}`);
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
test('closed or empty renders nothing', () => {
|
|
81
|
-
expect(
|
|
82
|
-
renderToStaticMarkup(
|
|
83
|
-
<TourOverlay open={false} steps={[STEP]} onClose={() => {}} onComplete={() => {}} />
|
|
84
|
-
)
|
|
85
|
-
).toBe('');
|
|
86
|
-
expect(
|
|
87
|
-
renderToStaticMarkup(<TourOverlay open steps={[]} onClose={() => {}} onComplete={() => {}} />)
|
|
88
|
-
).toBe('');
|
|
89
|
-
});
|
|
90
|
-
});
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
// `isTrustedRequestHost` — the mode-aware DNS-rebind guard.
|
|
2
|
-
// RCA: issue-cloud-inspector-edits-refused-by-loopback-guard.
|
|
3
|
-
//
|
|
4
|
-
// The bug: 97 studio route handlers gated on `isLoopbackHost(Host)`, and in a
|
|
5
|
-
// cell the hub proxy rewrites Host to the project's PUBLIC name (D4), so that
|
|
6
|
-
// check could never pass — every Inspector/artboard edit 403'd while annotations
|
|
7
|
-
// (no such guard) synced. The fix keeps the loopback check verbatim OUTSIDE
|
|
8
|
-
// workspace mode and, INSIDE a cell, accepts the proxy's unforgeable
|
|
9
|
-
// `x-maude-role` vouch instead (the proxy strips every inbound `x-maude-*`
|
|
10
|
-
// before injecting its own, so the header's presence proves hub provenance).
|
|
11
|
-
|
|
12
|
-
import { afterEach, describe, expect, test } from 'bun:test';
|
|
13
|
-
|
|
14
|
-
import { isTrustedRequestHost } from '../http.ts';
|
|
15
|
-
|
|
16
|
-
const WS = 'MAUDE_WORKSPACE_MODE';
|
|
17
|
-
const prior = process.env[WS];
|
|
18
|
-
afterEach(() => {
|
|
19
|
-
if (prior === undefined) delete process.env[WS];
|
|
20
|
-
else process.env[WS] = prior;
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const req = (host: string | null, extra: Record<string, string> = {}) =>
|
|
24
|
-
new Request('http://x/_api/edit-css', {
|
|
25
|
-
headers: { ...(host ? { host } : {}), ...extra },
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
describe('local mode — loopback Host only (verbatim DNS-rebind guard)', () => {
|
|
29
|
-
test('loopback Hosts pass', () => {
|
|
30
|
-
delete process.env[WS];
|
|
31
|
-
expect(isTrustedRequestHost(req('localhost:4399'))).toBe(true);
|
|
32
|
-
expect(isTrustedRequestHost(req('127.0.0.1:4399'))).toBe(true);
|
|
33
|
-
expect(isTrustedRequestHost(req('[::1]:4399'))).toBe(true);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
test('a rebound foreign Host is refused — even carrying x-maude-role', () => {
|
|
37
|
-
delete process.env[WS];
|
|
38
|
-
expect(isTrustedRequestHost(req('evil.example:4399'))).toBe(false);
|
|
39
|
-
// Outside a cell the injected header means nothing: there is no proxy in
|
|
40
|
-
// front to have stamped it, so it is attacker-supplied and ignored.
|
|
41
|
-
expect(isTrustedRequestHost(req('evil.example:4399', { 'x-maude-role': 'owner' }))).toBe(false);
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
describe('workspace mode — the hub proxy vouch is accepted', () => {
|
|
46
|
-
test('a public Host WITH an injected role is trusted (the cell shell-edit path)', () => {
|
|
47
|
-
process.env[WS] = '1';
|
|
48
|
-
expect(
|
|
49
|
-
isTrustedRequestHost(req('alligators.cloud.maude.sh', { 'x-maude-role': 'owner' }))
|
|
50
|
-
).toBe(true);
|
|
51
|
-
expect(
|
|
52
|
-
isTrustedRequestHost(req('alligators.cloud.maude.sh', { 'x-maude-role': 'member' }))
|
|
53
|
-
).toBe(true);
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
test('a public Host WITHOUT an injected role is still refused', () => {
|
|
57
|
-
process.env[WS] = '1';
|
|
58
|
-
// No proxy vouch ⇒ no proof of hub provenance ⇒ the guard holds.
|
|
59
|
-
expect(isTrustedRequestHost(req('alligators.cloud.maude.sh'))).toBe(false);
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
test('loopback still passes in workspace mode (the studio binds 127.0.0.1)', () => {
|
|
63
|
-
process.env[WS] = '1';
|
|
64
|
-
expect(isTrustedRequestHost(req('127.0.0.1:4399'))).toBe(true);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
@@ -1,211 +0,0 @@
|
|
|
1
|
-
// Stage K (Task K1, feature-element-editing-robustness) — the scripted
|
|
2
|
-
// mixed-op undo sequence the plan's INV-1 asks for: resize → delete → insert
|
|
3
|
-
// → move → spacing-drag → Cmd+Z ×5 → canvas byte-identical to the start.
|
|
4
|
-
//
|
|
5
|
-
// Drives the SAME HTTP routes the client's undo mechanisms call:
|
|
6
|
-
// - CSS-shaped ops (resize/move/spacing) undo by re-POSTing `/_api/edit-css`
|
|
7
|
-
// with the pre-edit value — exactly what `recordSourceEdit` +
|
|
8
|
-
// `commands/edit-source-command.ts`'s `undo()` do (do/undo are both a
|
|
9
|
-
// single `applyFn` call with a different `value`, so there is no
|
|
10
|
-
// separate "revert" endpoint to test — the HTTP-level round-trip IS the
|
|
11
|
-
// undo mechanism).
|
|
12
|
-
// - Structural ops (delete/insert) undo via `/_api/reorder-revert`, the
|
|
13
|
-
// whole-file seq-log swap Stage I reuses from Phase 12.1's reorder undo
|
|
14
|
-
// (`commands/reorder-command.ts`) rather than a bespoke command per op.
|
|
15
|
-
//
|
|
16
|
-
// `/_api/reorder-revert` 409s if the file drifted since the logged seq (its
|
|
17
|
-
// own doc comment: "refuses 409 when the canvas changed since") — so the 5
|
|
18
|
-
// undos below MUST run in strict reverse (LIFO) order, exactly like a real
|
|
19
|
-
// Cmd+Z stack, or the structural reverts would fail closed. That ordering
|
|
20
|
-
// constraint is itself part of what this test proves.
|
|
21
|
-
|
|
22
|
-
import { describe, expect, test } from 'bun:test';
|
|
23
|
-
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
24
|
-
import { join } from 'node:path';
|
|
25
|
-
|
|
26
|
-
import { bootServer, killProc, makeSandbox, nextPort } from './_helpers.ts';
|
|
27
|
-
|
|
28
|
-
// Style values use DOUBLE quotes throughout — matching this codebase's own
|
|
29
|
-
// authored-JSX convention (canvas-lib.tsx, scaffold-design.ts): editCss's
|
|
30
|
-
// underlying write is a JSON.stringify literal, which is always
|
|
31
|
-
// double-quoted regardless of the original source's quote style. A
|
|
32
|
-
// single-quoted fixture would make a value round-trip only VALUE-identical,
|
|
33
|
-
// not byte-identical (a cosmetic quote-style delta, not a real undo gap) —
|
|
34
|
-
// double-quoting the fixture up front keeps this test's byte-compare
|
|
35
|
-
// meaningful instead of tripping over that unrelated cosmetic mismatch.
|
|
36
|
-
const CANVAS_SRC = `export default function Seq() {
|
|
37
|
-
return (
|
|
38
|
-
<DesignCanvas>
|
|
39
|
-
<DCArtboard id="home" label="Home" width={1440} height={1024}>
|
|
40
|
-
<figure style={{ position: "absolute", left: "20px", top: "20px", width: "100px", height: "60px" }}>Box</figure>
|
|
41
|
-
<div>A</div>
|
|
42
|
-
<div>B</div>
|
|
43
|
-
<div>C</div>
|
|
44
|
-
<section style={{ display: "flex", paddingLeft: "8px" }}>
|
|
45
|
-
<span>x</span>
|
|
46
|
-
<span>y</span>
|
|
47
|
-
</section>
|
|
48
|
-
</DCArtboard>
|
|
49
|
-
</DesignCanvas>
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
`;
|
|
53
|
-
|
|
54
|
-
interface LocatorEntry {
|
|
55
|
-
line: number;
|
|
56
|
-
jsxPath: string[];
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
async function locatorMap(main: string, designRoot: string): Promise<Record<string, LocatorEntry>> {
|
|
60
|
-
const r = await fetch(`${main}/.design/ui/Seq.tsx`, { signal: AbortSignal.timeout(2000) });
|
|
61
|
-
expect(r.status).toBe(200);
|
|
62
|
-
const locator = JSON.parse(readFileSync(join(designRoot, '_locator.json'), 'utf8'));
|
|
63
|
-
return locator['ui/Seq'] as Record<string, LocatorEntry>;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/** First (only, in this fixture) data-cd-id whose JSX tag is `tag`. */
|
|
67
|
-
function idOf(map: Record<string, LocatorEntry>, tag: string): string {
|
|
68
|
-
const hit = Object.entries(map).find(([, e]) => e.jsxPath[e.jsxPath.length - 1] === tag);
|
|
69
|
-
expect(hit).toBeDefined();
|
|
70
|
-
return hit?.[0] as string;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
function idsByTag(map: Record<string, LocatorEntry>, tag: string): string[] {
|
|
74
|
-
return Object.entries(map)
|
|
75
|
-
.filter(([, e]) => e.jsxPath[e.jsxPath.length - 1] === tag)
|
|
76
|
-
.sort((a, b) => a[1].line - b[1].line)
|
|
77
|
-
.map(([id]) => id);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
async function editCss(
|
|
81
|
-
main: string,
|
|
82
|
-
body: { canvas: string; id: string; property: string; value: string }
|
|
83
|
-
): Promise<{ ok: boolean; error?: string }> {
|
|
84
|
-
const res = await fetch(`${main}/_api/edit-css`, {
|
|
85
|
-
method: 'POST',
|
|
86
|
-
body: JSON.stringify(body),
|
|
87
|
-
signal: AbortSignal.timeout(2000),
|
|
88
|
-
});
|
|
89
|
-
return (await res.json()) as { ok: boolean; error?: string };
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
describe('Stage K1 — mixed resize/delete/insert/move/spacing undo sequence', () => {
|
|
93
|
-
test('5 undos (LIFO) return the canvas byte-identical to its start', async () => {
|
|
94
|
-
const { root, designRoot } = makeSandbox();
|
|
95
|
-
mkdirSync(join(designRoot, 'ui'), { recursive: true });
|
|
96
|
-
writeFileSync(join(designRoot, 'ui', 'Seq.tsx'), CANVAS_SRC);
|
|
97
|
-
const port = nextPort();
|
|
98
|
-
const proc = await bootServer(root, port);
|
|
99
|
-
const main = `http://localhost:${port}`;
|
|
100
|
-
const canvasPath = join(designRoot, 'ui', 'Seq.tsx');
|
|
101
|
-
const original = readFileSync(canvasPath, 'utf8');
|
|
102
|
-
expect(original).toBe(CANVAS_SRC);
|
|
103
|
-
|
|
104
|
-
try {
|
|
105
|
-
// ── 1. resize (CSS-shaped) ──────────────────────────────────────────
|
|
106
|
-
let map = await locatorMap(main, designRoot);
|
|
107
|
-
const boxId = idOf(map, 'figure');
|
|
108
|
-
const resize = await editCss(main, {
|
|
109
|
-
canvas: 'ui/Seq',
|
|
110
|
-
id: boxId,
|
|
111
|
-
property: 'width',
|
|
112
|
-
value: '140px',
|
|
113
|
-
});
|
|
114
|
-
expect(resize.ok).toBe(true);
|
|
115
|
-
expect(readFileSync(canvasPath, 'utf8')).toContain('width: "140px"');
|
|
116
|
-
|
|
117
|
-
// ── 2. delete (structural) ──────────────────────────────────────────
|
|
118
|
-
map = await locatorMap(main, designRoot);
|
|
119
|
-
const [aId, bId] = idsByTag(map, 'div');
|
|
120
|
-
const del = await fetch(`${main}/_api/delete-element`, {
|
|
121
|
-
method: 'POST',
|
|
122
|
-
body: JSON.stringify({ canvas: 'ui/Seq', id: bId }),
|
|
123
|
-
signal: AbortSignal.timeout(2000),
|
|
124
|
-
});
|
|
125
|
-
expect(del.status).toBe(200);
|
|
126
|
-
const delJson = (await del.json()) as { ok: boolean; seq: number };
|
|
127
|
-
expect(delJson.ok).toBe(true);
|
|
128
|
-
expect(
|
|
129
|
-
[...readFileSync(canvasPath, 'utf8').matchAll(/<div>([ABC])</g)].map((m) => m[1])
|
|
130
|
-
).toEqual(['A', 'C']);
|
|
131
|
-
|
|
132
|
-
// ── 3. insert (structural) ──────────────────────────────────────────
|
|
133
|
-
const ins = await fetch(`${main}/_api/insert-element`, {
|
|
134
|
-
method: 'POST',
|
|
135
|
-
body: JSON.stringify({ canvas: 'ui/Seq', refId: aId, position: 'after', kind: 'div' }),
|
|
136
|
-
signal: AbortSignal.timeout(2000),
|
|
137
|
-
});
|
|
138
|
-
expect(ins.status).toBe(200);
|
|
139
|
-
const insJson = (await ins.json()) as { ok: boolean; seq: number; newId: string | null };
|
|
140
|
-
expect(insJson.ok).toBe(true);
|
|
141
|
-
|
|
142
|
-
// ── 4. move (CSS-shaped, same box element as step 1) ────────────────
|
|
143
|
-
map = await locatorMap(main, designRoot);
|
|
144
|
-
const boxIdAfterStructural = idOf(map, 'figure');
|
|
145
|
-
const move = await editCss(main, {
|
|
146
|
-
canvas: 'ui/Seq',
|
|
147
|
-
id: boxIdAfterStructural,
|
|
148
|
-
property: 'left',
|
|
149
|
-
value: '60px',
|
|
150
|
-
});
|
|
151
|
-
expect(move.ok).toBe(true);
|
|
152
|
-
expect(readFileSync(canvasPath, 'utf8')).toContain('left: "60px"');
|
|
153
|
-
|
|
154
|
-
// ── 5. spacing-drag (CSS-shaped, padding-left) ──────────────────────
|
|
155
|
-
map = await locatorMap(main, designRoot);
|
|
156
|
-
const sectionId = idOf(map, 'section');
|
|
157
|
-
const spacing = await editCss(main, {
|
|
158
|
-
canvas: 'ui/Seq',
|
|
159
|
-
id: sectionId,
|
|
160
|
-
property: 'padding-left',
|
|
161
|
-
value: '24px',
|
|
162
|
-
});
|
|
163
|
-
expect(spacing.ok).toBe(true);
|
|
164
|
-
expect(readFileSync(canvasPath, 'utf8')).toContain('paddingLeft: "24px"');
|
|
165
|
-
|
|
166
|
-
// ── Cmd+Z ×5 — strict LIFO ───────────────────────────────────────────
|
|
167
|
-
const undo5 = await editCss(main, {
|
|
168
|
-
canvas: 'ui/Seq',
|
|
169
|
-
id: sectionId,
|
|
170
|
-
property: 'padding-left',
|
|
171
|
-
value: '8px',
|
|
172
|
-
});
|
|
173
|
-
expect(undo5.ok).toBe(true);
|
|
174
|
-
|
|
175
|
-
const undo4 = await editCss(main, {
|
|
176
|
-
canvas: 'ui/Seq',
|
|
177
|
-
id: boxIdAfterStructural,
|
|
178
|
-
property: 'left',
|
|
179
|
-
value: '20px',
|
|
180
|
-
});
|
|
181
|
-
expect(undo4.ok).toBe(true);
|
|
182
|
-
|
|
183
|
-
const undo3 = await fetch(`${main}/_api/reorder-revert`, {
|
|
184
|
-
method: 'POST',
|
|
185
|
-
body: JSON.stringify({ canvas: 'ui/Seq', seq: insJson.seq, dir: 'undo' }),
|
|
186
|
-
signal: AbortSignal.timeout(2000),
|
|
187
|
-
});
|
|
188
|
-
expect(undo3.status).toBe(200);
|
|
189
|
-
|
|
190
|
-
const undo2 = await fetch(`${main}/_api/reorder-revert`, {
|
|
191
|
-
method: 'POST',
|
|
192
|
-
body: JSON.stringify({ canvas: 'ui/Seq', seq: delJson.seq, dir: 'undo' }),
|
|
193
|
-
signal: AbortSignal.timeout(2000),
|
|
194
|
-
});
|
|
195
|
-
expect(undo2.status).toBe(200);
|
|
196
|
-
|
|
197
|
-
const undo1 = await editCss(main, {
|
|
198
|
-
canvas: 'ui/Seq',
|
|
199
|
-
id: boxId,
|
|
200
|
-
property: 'width',
|
|
201
|
-
value: '100px',
|
|
202
|
-
});
|
|
203
|
-
expect(undo1.ok).toBe(true);
|
|
204
|
-
|
|
205
|
-
// ── Assert: byte-identical to the pre-sequence source ───────────────
|
|
206
|
-
expect(readFileSync(canvasPath, 'utf8')).toBe(original);
|
|
207
|
-
} finally {
|
|
208
|
-
await killProc(proc);
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
});
|