@1agh/maude 0.42.0 → 0.44.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/apps/studio/.ai/cache/_stats.json +7 -0
- package/apps/studio/acp/bootstrap-brief.ts +12 -2
- package/apps/studio/acp/bridge.ts +44 -10
- package/apps/studio/acp/env.ts +23 -0
- package/apps/studio/acp/login-state.ts +263 -0
- package/apps/studio/acp/plugin-bootstrap.ts +31 -25
- package/apps/studio/acp/probe.ts +152 -1
- package/apps/studio/annotations-layer.tsx +1451 -324
- package/apps/studio/annotations-model.ts +58 -0
- package/apps/studio/api.ts +568 -24
- package/apps/studio/bin/_audio-search.mjs +140 -0
- package/apps/studio/bin/_import-asset-pdf-worker.mjs +34 -0
- package/apps/studio/bin/_import-asset.mjs +815 -0
- package/apps/studio/bin/_import-brand.mjs +635 -0
- package/apps/studio/bin/_import-tokens-alias-resolver.mjs +95 -0
- package/apps/studio/bin/_import-tokens.mjs +1201 -0
- package/apps/studio/bin/_ingest-footage.mjs +386 -0
- package/apps/studio/bin/_probe-footage-playwright.mjs +269 -0
- package/apps/studio/bin/_transcribe.mjs +419 -0
- package/apps/studio/bin/_transcribe.test.mjs +80 -0
- package/apps/studio/bin/_video-playwright.mjs +141 -71
- package/apps/studio/bin/audio-search.sh +28 -0
- package/apps/studio/bin/generate.sh +154 -0
- package/apps/studio/bin/import-asset.sh +34 -0
- package/apps/studio/bin/import-brand.sh +29 -0
- package/apps/studio/bin/import-tokens.sh +33 -0
- package/apps/studio/bin/ingest-footage.sh +27 -0
- package/apps/studio/bin/photo-adjust.sh +163 -0
- package/apps/studio/bin/photo-bg-remove.sh +258 -0
- package/apps/studio/bin/probe-footage.sh +28 -0
- package/apps/studio/bin/read-annotations.mjs +125 -2
- package/apps/studio/bin/transcribe.sh +39 -0
- package/apps/studio/canvas-edit.ts +656 -12
- package/apps/studio/canvas-lib.tsx +637 -10
- package/apps/studio/canvas-pipeline.ts +65 -7
- package/apps/studio/canvas-shell.tsx +156 -16
- package/apps/studio/client/app.jsx +2385 -699
- package/apps/studio/client/export-center.jsx +35 -1
- package/apps/studio/client/generate-dialog.jsx +352 -0
- package/apps/studio/client/github.js +18 -0
- package/apps/studio/client/inspector-controls.jsx +781 -0
- package/apps/studio/client/panels/BrandUploadPanel.jsx +233 -0
- package/apps/studio/client/panels/ChatPanel.jsx +15 -33
- package/apps/studio/client/panels/GitPanel.jsx +8 -0
- package/apps/studio/client/panels/IntroVideoDialog.jsx +44 -0
- package/apps/studio/client/panels/OnboardingWizard.jsx +12 -0
- package/apps/studio/client/panels/ReadinessList.jsx +227 -7
- package/apps/studio/client/panels/RepoBranchSwitcher.jsx +133 -21
- package/apps/studio/client/panels/SettingsPanel.jsx +828 -0
- package/apps/studio/client/panels/SetupChecklist.jsx +223 -0
- package/apps/studio/client/panels/StickerPicker.jsx +160 -0
- package/apps/studio/client/panels/TimelinePanel.jsx +15 -2
- package/apps/studio/client/photo-knobs.jsx +432 -0
- package/apps/studio/client/styles/3-shell-maude.css +376 -28
- package/apps/studio/client/styles/4-components.css +223 -0
- package/apps/studio/client/styles/6-acp-chat.css +86 -0
- package/apps/studio/client/tour/quick-setup-tour.js +39 -0
- package/apps/studio/commands/annotation-strokes-command.ts +13 -3
- package/apps/studio/commands/edit-source-command.ts +31 -4
- package/apps/studio/config.schema.json +70 -0
- package/apps/studio/context-menu.tsx +42 -8
- package/apps/studio/context.ts +16 -0
- package/apps/studio/design-setup-readiness.ts +115 -0
- package/apps/studio/dist/client.bundle.js +5572 -21
- package/apps/studio/dist/comment-mount.js +2 -2
- package/apps/studio/dist/runtime/.min-sizes.json +1 -0
- package/apps/studio/dist/runtime/@imgly_background-removal.js +5543 -0
- package/apps/studio/dist/runtime/pixi-js.js +519 -519
- package/apps/studio/dist/styles.css +1 -1
- package/apps/studio/dom-selection.ts +25 -0
- package/apps/studio/draw/palette.ts +34 -0
- package/apps/studio/exporters/jobs.ts +47 -5
- package/apps/studio/exporters/video.ts +24 -4
- package/apps/studio/footage/schema.test.ts +287 -0
- package/apps/studio/footage/schema.ts +662 -0
- package/apps/studio/footage-store.ts +235 -0
- package/apps/studio/fs-watch.ts +10 -0
- package/apps/studio/generation/adapters/elevenlabs.ts +370 -0
- package/apps/studio/generation/adapters/gemini.ts +542 -0
- package/apps/studio/generation/adapters/groq.test.ts +80 -0
- package/apps/studio/generation/adapters/groq.ts +247 -0
- package/apps/studio/generation/audio-library.test.ts +95 -0
- package/apps/studio/generation/audio-library.ts +156 -0
- package/apps/studio/generation/captions.test.ts +78 -0
- package/apps/studio/generation/captions.ts +132 -0
- package/apps/studio/generation/download.ts +76 -0
- package/apps/studio/generation/elevenlabs.test.ts +223 -0
- package/apps/studio/generation/gemini.test.ts +350 -0
- package/apps/studio/generation/jobs.test.ts +128 -0
- package/apps/studio/generation/jobs.ts +243 -0
- package/apps/studio/generation/keys.test.ts +75 -0
- package/apps/studio/generation/keys.ts +162 -0
- package/apps/studio/generation/prefs.test.ts +95 -0
- package/apps/studio/generation/prefs.ts +82 -0
- package/apps/studio/generation/registry.ts +88 -0
- package/apps/studio/generation/types.test.ts +123 -0
- package/apps/studio/generation/types.ts +266 -0
- package/apps/studio/generation/whisper-models.test.ts +152 -0
- package/apps/studio/generation/whisper-models.ts +257 -0
- package/apps/studio/generation/whisper-spike-results.md +61 -0
- package/apps/studio/git/endpoints.ts +68 -7
- package/apps/studio/git/service.ts +199 -21
- package/apps/studio/github/service.ts +67 -0
- package/apps/studio/handoff.ts +3 -2
- package/apps/studio/http.ts +1039 -22
- package/apps/studio/input-router.tsx +10 -0
- package/apps/studio/inspect.ts +53 -1
- package/apps/studio/media/intro.mp4 +0 -0
- package/apps/studio/media-commit-chain.ts +119 -0
- package/apps/studio/paths.ts +20 -0
- package/apps/studio/photo/filters.ts +285 -0
- package/apps/studio/photo/pipeline.ts +607 -0
- package/apps/studio/photo/schema.ts +367 -0
- package/apps/studio/photo-store.ts +154 -0
- package/apps/studio/readiness.ts +108 -20
- package/apps/studio/runtime-bundle.ts +29 -6
- package/apps/studio/scaffold-design.ts +1145 -0
- package/apps/studio/server.ts +18 -2
- package/apps/studio/stickers/figjam-doodle/manifest.json +104 -0
- package/apps/studio/stickers/figjam-doodle/slice1.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice10.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice11.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice12.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice13.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice14.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice15.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice16.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice17.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice18.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice19.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice2.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice20.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice21.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice22.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice23.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice24.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice3.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice4.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice5.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice6.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice7.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice8.png +0 -0
- package/apps/studio/stickers/figjam-doodle/slice9.png +0 -0
- package/apps/studio/stickers/life-style/best.png +0 -0
- package/apps/studio/stickers/life-style/come-on.png +0 -0
- package/apps/studio/stickers/life-style/cut.png +0 -0
- package/apps/studio/stickers/life-style/detox.png +0 -0
- package/apps/studio/stickers/life-style/just.png +0 -0
- package/apps/studio/stickers/life-style/manifest.json +68 -0
- package/apps/studio/stickers/life-style/mirror.png +0 -0
- package/apps/studio/stickers/life-style/nice.png +0 -0
- package/apps/studio/stickers/life-style/objects.png +0 -0
- package/apps/studio/stickers/life-style/ok.png +0 -0
- package/apps/studio/stickers/life-style/queen.png +0 -0
- package/apps/studio/stickers/life-style/star.png +0 -0
- package/apps/studio/stickers/life-style/sun.png +0 -0
- package/apps/studio/stickers/life-style/water.png +0 -0
- package/apps/studio/stickers/life-style/yeah.png +0 -0
- package/apps/studio/stickers/life-style/you-can.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/check-the-deets.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/cut-it.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/dope.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/fresh.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/hot.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/idea.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/keep-exploring.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/killed-it.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/love-it.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/manifest.json +88 -0
- package/apps/studio/stickers/opposing-thoughts/not-sure.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/ok.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/pure-gold.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/save-for-later.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/steal-this.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/take-a-peek.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/this-or-that.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/thoughts.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/vibes.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/winner.png +0 -0
- package/apps/studio/stickers/opposing-thoughts/wip.png +0 -0
- package/apps/studio/stickers/project-status/group-100.png +0 -0
- package/apps/studio/stickers/project-status/group-101.png +0 -0
- package/apps/studio/stickers/project-status/group-102.png +0 -0
- package/apps/studio/stickers/project-status/group-103.png +0 -0
- package/apps/studio/stickers/project-status/group-104.png +0 -0
- package/apps/studio/stickers/project-status/group-105.png +0 -0
- package/apps/studio/stickers/project-status/group-106.png +0 -0
- package/apps/studio/stickers/project-status/group-107.png +0 -0
- package/apps/studio/stickers/project-status/group-108.png +0 -0
- package/apps/studio/stickers/project-status/group-109.png +0 -0
- package/apps/studio/stickers/project-status/group-110.png +0 -0
- package/apps/studio/stickers/project-status/group-111.png +0 -0
- package/apps/studio/stickers/project-status/group-112.png +0 -0
- package/apps/studio/stickers/project-status/group-113.png +0 -0
- package/apps/studio/stickers/project-status/group-114.png +0 -0
- package/apps/studio/stickers/project-status/group-115.png +0 -0
- package/apps/studio/stickers/project-status/group-117.png +0 -0
- package/apps/studio/stickers/project-status/group-118.png +0 -0
- package/apps/studio/stickers/project-status/group-119.png +0 -0
- package/apps/studio/stickers/project-status/group-120.png +0 -0
- package/apps/studio/stickers/project-status/group-121.png +0 -0
- package/apps/studio/stickers/project-status/group-122.png +0 -0
- package/apps/studio/stickers/project-status/group-41.png +0 -0
- package/apps/studio/stickers/project-status/group-42.png +0 -0
- package/apps/studio/stickers/project-status/group-43.png +0 -0
- package/apps/studio/stickers/project-status/group-44.png +0 -0
- package/apps/studio/stickers/project-status/group-45.png +0 -0
- package/apps/studio/stickers/project-status/group-46.png +0 -0
- package/apps/studio/stickers/project-status/group-47.png +0 -0
- package/apps/studio/stickers/project-status/group-48.png +0 -0
- package/apps/studio/stickers/project-status/group-49.png +0 -0
- package/apps/studio/stickers/project-status/group-50.png +0 -0
- package/apps/studio/stickers/project-status/group-51.png +0 -0
- package/apps/studio/stickers/project-status/group-52.png +0 -0
- package/apps/studio/stickers/project-status/group-53.png +0 -0
- package/apps/studio/stickers/project-status/group-54.png +0 -0
- package/apps/studio/stickers/project-status/group-55.png +0 -0
- package/apps/studio/stickers/project-status/group-56.png +0 -0
- package/apps/studio/stickers/project-status/group-57.png +0 -0
- package/apps/studio/stickers/project-status/group-58.png +0 -0
- package/apps/studio/stickers/project-status/group-59.png +0 -0
- package/apps/studio/stickers/project-status/group-60.png +0 -0
- package/apps/studio/stickers/project-status/group-61.png +0 -0
- package/apps/studio/stickers/project-status/group-62.png +0 -0
- package/apps/studio/stickers/project-status/group-63.png +0 -0
- package/apps/studio/stickers/project-status/group-64.png +0 -0
- package/apps/studio/stickers/project-status/group-65.png +0 -0
- package/apps/studio/stickers/project-status/group-66.png +0 -0
- package/apps/studio/stickers/project-status/group-67.png +0 -0
- package/apps/studio/stickers/project-status/group-68.png +0 -0
- package/apps/studio/stickers/project-status/group-69.png +0 -0
- package/apps/studio/stickers/project-status/group-70.png +0 -0
- package/apps/studio/stickers/project-status/group-71.png +0 -0
- package/apps/studio/stickers/project-status/group-72.png +0 -0
- package/apps/studio/stickers/project-status/group-73.png +0 -0
- package/apps/studio/stickers/project-status/group-74.png +0 -0
- package/apps/studio/stickers/project-status/group-75.png +0 -0
- package/apps/studio/stickers/project-status/group-76.png +0 -0
- package/apps/studio/stickers/project-status/group-77.png +0 -0
- package/apps/studio/stickers/project-status/group-78.png +0 -0
- package/apps/studio/stickers/project-status/group-79.png +0 -0
- package/apps/studio/stickers/project-status/group-80.png +0 -0
- package/apps/studio/stickers/project-status/group-81.png +0 -0
- package/apps/studio/stickers/project-status/group-82.png +0 -0
- package/apps/studio/stickers/project-status/group-83.png +0 -0
- package/apps/studio/stickers/project-status/group-84.png +0 -0
- package/apps/studio/stickers/project-status/group-85.png +0 -0
- package/apps/studio/stickers/project-status/group-86.png +0 -0
- package/apps/studio/stickers/project-status/group-87.png +0 -0
- package/apps/studio/stickers/project-status/group-88.png +0 -0
- package/apps/studio/stickers/project-status/group-89.png +0 -0
- package/apps/studio/stickers/project-status/group-90.png +0 -0
- package/apps/studio/stickers/project-status/group-91.png +0 -0
- package/apps/studio/stickers/project-status/group-92.png +0 -0
- package/apps/studio/stickers/project-status/group-93.png +0 -0
- package/apps/studio/stickers/project-status/group-94.png +0 -0
- package/apps/studio/stickers/project-status/group-96.png +0 -0
- package/apps/studio/stickers/project-status/group-97.png +0 -0
- package/apps/studio/stickers/project-status/group-98.png +0 -0
- package/apps/studio/stickers/project-status/group-99.png +0 -0
- package/apps/studio/stickers/project-status/manifest.json +328 -0
- package/apps/studio/test/_helpers.ts +15 -2
- package/apps/studio/test/acp-bootstrap-brief.test.ts +11 -0
- package/apps/studio/test/acp-bridge.test.ts +34 -1
- package/apps/studio/test/acp-commands.test.ts +2 -1
- package/apps/studio/test/acp-env.test.ts +30 -0
- package/apps/studio/test/acp-plugin-bootstrap.test.ts +23 -57
- package/apps/studio/test/acp-session-plugins.test.ts +72 -1
- package/apps/studio/test/annotation-strokes-command.test.ts +17 -0
- package/apps/studio/test/annotations-layer.test.ts +174 -0
- package/apps/studio/test/asset-api.test.ts +3 -3
- package/apps/studio/test/canvas-edit.test.ts +17 -6
- package/apps/studio/test/canvas-origin-gate.test.ts +50 -0
- package/apps/studio/test/csp-canvas-shell.test.ts +11 -0
- package/apps/studio/test/csrf-write-guard.test.ts +23 -1
- package/apps/studio/test/design-setup-readiness.test.ts +155 -0
- package/apps/studio/test/dynamic-text-edit.test.ts +162 -0
- package/apps/studio/test/edit-source-command.test.ts +23 -0
- package/apps/studio/test/element-structural-edit.test.ts +154 -0
- package/apps/studio/test/fixtures/fake-claude-auth.mjs +13 -0
- package/apps/studio/test/footage-store.test.ts +100 -0
- package/apps/studio/test/generate-route.test.ts +106 -0
- package/apps/studio/test/git-branches.test.ts +97 -0
- package/apps/studio/test/github-api.test.ts +56 -1
- package/apps/studio/test/import-asset-browser.test.ts +64 -0
- package/apps/studio/test/import-asset-route.test.ts +71 -0
- package/apps/studio/test/import-asset.test.ts +399 -0
- package/apps/studio/test/import-brand-browser.test.ts +88 -0
- package/apps/studio/test/import-brand-route.test.ts +120 -0
- package/apps/studio/test/import-brand.test.ts +206 -0
- package/apps/studio/test/import-tokens.test.ts +722 -0
- package/apps/studio/test/input-router.test.ts +33 -0
- package/apps/studio/test/inspect-script-syntax.test.ts +53 -0
- package/apps/studio/test/media-commit-chain.test.ts +210 -0
- package/apps/studio/test/photo-bg-remove-validation.test.ts +71 -0
- package/apps/studio/test/photo-canvas-bundle.test.ts +61 -0
- package/apps/studio/test/photo-edit-api.test.ts +201 -0
- package/apps/studio/test/photo-filters.test.ts +149 -0
- package/apps/studio/test/photo-pipeline.test.ts +106 -0
- package/apps/studio/test/photo-taxonomy.test.ts +96 -0
- package/apps/studio/test/read-annotations.test.ts +164 -0
- package/apps/studio/test/readiness.test.ts +13 -11
- package/apps/studio/test/scaffold-design.test.ts +122 -0
- package/apps/studio/test/shell-importmap.test.ts +49 -0
- package/apps/studio/test/text-editability-stamp.test.ts +131 -0
- package/apps/studio/test/timeline-parse.test.ts +57 -0
- package/apps/studio/test/tool-palette-insert-anchor.test.ts +5 -3
- package/apps/studio/test/tour-overlay.test.tsx +16 -0
- package/apps/studio/test/undo-stack.test.ts +33 -0
- package/apps/studio/test/video-asset.test.ts +5 -5
- package/apps/studio/test/video-render-bridge.test.ts +23 -1
- package/apps/studio/text-caret.ts +239 -0
- package/apps/studio/tool-palette.tsx +49 -21
- package/apps/studio/ui-prefs.ts +130 -0
- package/apps/studio/undo-stack.ts +94 -2
- package/apps/studio/use-annotation-resize.tsx +4 -4
- package/apps/studio/use-canvas-media-drop.tsx +40 -1
- package/apps/studio/use-chrome-visibility.tsx +8 -2
- package/apps/studio/use-selection-set.tsx +21 -0
- package/apps/studio/video-comp.tsx +48 -7
- package/apps/studio/whats-new.json +149 -0
- package/apps/studio/ws.ts +5 -0
- package/cli/bin/maude.mjs +6 -6
- package/cli/commands/design.mjs +67 -3
- package/cli/lib/gitignore-block.mjs +2 -0
- package/cli/lib/pkg-root.mjs +107 -0
- package/cli/lib/pkg-root.test.mjs +79 -0
- package/cli/lib/reconstruct-toolset.test.mjs +194 -0
- package/cli/lib/update-check.mjs +8 -0
- package/package.json +13 -11
- package/plugins/design/dependencies.json +18 -0
- package/plugins/design/templates/_shell.html +1 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Project status stickers",
|
|
3
|
+
"author": "Iconfinder",
|
|
4
|
+
"attributionUrl": "https://www.figma.com/community/file/1128224635870836270",
|
|
5
|
+
"license": "Figma Community (see attributionUrl for terms)",
|
|
6
|
+
"stickers": [
|
|
7
|
+
{
|
|
8
|
+
"file": "group-100.png",
|
|
9
|
+
"keywords": ["thumbs-up", "awesome", "approve"]
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
"file": "group-101.png",
|
|
13
|
+
"keywords": ["super-star", "star", "cool"]
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"file": "group-102.png",
|
|
17
|
+
"keywords": ["off", "launch", "rocket"]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"file": "group-103.png",
|
|
21
|
+
"keywords": ["star", "sparkle", "favorite"]
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"file": "group-104.png",
|
|
25
|
+
"keywords": ["hot", "fire", "skull"]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"file": "group-105.png",
|
|
29
|
+
"keywords": ["yeah", "rock-on", "excited"]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"file": "group-106.png",
|
|
33
|
+
"keywords": ["plus-one", "+1", "agree"]
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"file": "group-107.png",
|
|
37
|
+
"keywords": ["no", "reject"]
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"file": "group-108.png",
|
|
41
|
+
"keywords": ["hate-it", "dislike", "broken-heart"]
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"file": "group-109.png",
|
|
45
|
+
"keywords": ["fresh", "new"]
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"file": "group-110.png",
|
|
49
|
+
"keywords": ["sleepy", "zzz", "tired"]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"file": "group-111.png",
|
|
53
|
+
"keywords": ["meh", "unimpressed", "neutral"]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"file": "group-112.png",
|
|
57
|
+
"keywords": ["ok", "thumbs-up"]
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"file": "group-113.png",
|
|
61
|
+
"keywords": ["nope", "no", "reject"]
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"file": "group-114.png",
|
|
65
|
+
"keywords": ["star", "sparkle", "favorite"]
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"file": "group-115.png",
|
|
69
|
+
"keywords": ["party-time", "celebrate", "party"]
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"file": "group-117.png",
|
|
73
|
+
"keywords": ["peace", "peace-sign"]
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"file": "group-118.png",
|
|
77
|
+
"keywords": ["omg", "surprised", "shocked"]
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"file": "group-119.png",
|
|
81
|
+
"keywords": ["love-it", "heart", "like"]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"file": "group-120.png",
|
|
85
|
+
"keywords": ["ok", "okay-hand"]
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"file": "group-121.png",
|
|
89
|
+
"keywords": ["great-idea", "idea", "lightbulb"]
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"file": "group-122.png",
|
|
93
|
+
"keywords": ["hmm", "thinking", "question"]
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"file": "group-41.png",
|
|
97
|
+
"keywords": ["lol", "funny", "laugh"]
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"file": "group-42.png",
|
|
101
|
+
"keywords": ["sparkle", "shiny", "star"]
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
"file": "group-43.png",
|
|
105
|
+
"keywords": ["good-idea", "idea", "lightbulb"]
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"file": "group-44.png",
|
|
109
|
+
"keywords": ["thanks", "thank-you"]
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"file": "group-45.png",
|
|
113
|
+
"keywords": ["ok", "okay"]
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"file": "group-46.png",
|
|
117
|
+
"keywords": ["done", "finished", "complete"]
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"file": "group-47.png",
|
|
121
|
+
"keywords": ["flagged", "flag", "important"]
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"file": "group-48.png",
|
|
125
|
+
"keywords": ["awesome", "great"]
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"file": "group-49.png",
|
|
129
|
+
"keywords": ["dead", "skull", "killed-it"]
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"file": "group-50.png",
|
|
133
|
+
"keywords": ["hot", "fire", "trending"]
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"file": "group-51.png",
|
|
137
|
+
"keywords": ["done", "thumbs-up", "approved"]
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"file": "group-52.png",
|
|
141
|
+
"keywords": ["meh", "unimpressed", "neutral"]
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"file": "group-53.png",
|
|
145
|
+
"keywords": ["feedback", "question"]
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
"file": "group-54.png",
|
|
149
|
+
"keywords": ["work-busy", "busy", "clock"]
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
"file": "group-55.png",
|
|
153
|
+
"keywords": ["chill", "relax", "cool"]
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"file": "group-56.png",
|
|
157
|
+
"keywords": ["almost-done", "nearly-finished", "hourglass"]
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
"file": "group-57.png",
|
|
161
|
+
"keywords": ["no", "reject"]
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"file": "group-58.png",
|
|
165
|
+
"keywords": ["nope", "no", "reject"]
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"file": "group-59.png",
|
|
169
|
+
"keywords": ["star", "favorite"]
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"file": "group-60.png",
|
|
173
|
+
"keywords": ["peace", "peace-sign"]
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"file": "group-61.png",
|
|
177
|
+
"keywords": ["hmm", "thinking", "question"]
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"file": "group-62.png",
|
|
181
|
+
"keywords": ["thumbs-up", "awesome", "approve"]
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
"file": "group-63.png",
|
|
185
|
+
"keywords": ["ok", "okay-hand"]
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"file": "group-64.png",
|
|
189
|
+
"keywords": ["love-it", "heart", "like"]
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"file": "group-65.png",
|
|
193
|
+
"keywords": ["fresh", "new"]
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
"file": "group-66.png",
|
|
197
|
+
"keywords": ["off", "launch", "rocket"]
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"file": "group-67.png",
|
|
201
|
+
"keywords": ["hate-it", "dislike", "broken-heart"]
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"file": "group-68.png",
|
|
205
|
+
"keywords": ["wow", "heart", "surprised"]
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"file": "group-69.png",
|
|
209
|
+
"keywords": ["yes", "agree"]
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"file": "group-70.png",
|
|
213
|
+
"keywords": ["plus-one", "+1", "agree"]
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
"file": "group-71.png",
|
|
217
|
+
"keywords": ["party-time", "celebrate", "party"]
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"file": "group-72.png",
|
|
221
|
+
"keywords": ["omg", "surprised", "shocked"]
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
"file": "group-73.png",
|
|
225
|
+
"keywords": ["hot", "fire", "skull"]
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"file": "group-74.png",
|
|
229
|
+
"keywords": ["sleepy", "zzz", "tired"]
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"file": "group-75.png",
|
|
233
|
+
"keywords": ["wow", "surprised"]
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"file": "group-76.png",
|
|
237
|
+
"keywords": ["yeah", "rock-on", "excited"]
|
|
238
|
+
},
|
|
239
|
+
{
|
|
240
|
+
"file": "group-77.png",
|
|
241
|
+
"keywords": ["high-alert", "warning", "urgent"]
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"file": "group-78.png",
|
|
245
|
+
"keywords": ["thumbs-down", "dislike"]
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"file": "group-79.png",
|
|
249
|
+
"keywords": ["great-idea", "idea", "lightbulb"]
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
"file": "group-80.png",
|
|
253
|
+
"keywords": ["super-star", "star", "cool"]
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"file": "group-81.png",
|
|
257
|
+
"keywords": ["wow", "heart", "surprised"]
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"file": "group-82.png",
|
|
261
|
+
"keywords": ["done", "thumbs-up", "approved"]
|
|
262
|
+
},
|
|
263
|
+
{
|
|
264
|
+
"file": "group-83.png",
|
|
265
|
+
"keywords": ["wow", "surprised"]
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"file": "group-84.png",
|
|
269
|
+
"keywords": ["work-busy", "busy", "clock"]
|
|
270
|
+
},
|
|
271
|
+
{
|
|
272
|
+
"file": "group-85.png",
|
|
273
|
+
"keywords": ["thumbs-down", "dislike"]
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"file": "group-86.png",
|
|
277
|
+
"keywords": ["thanks", "thank-you"]
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"file": "group-87.png",
|
|
281
|
+
"keywords": ["flagged", "flag", "important"]
|
|
282
|
+
},
|
|
283
|
+
{
|
|
284
|
+
"file": "group-88.png",
|
|
285
|
+
"keywords": ["dead", "skull"]
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
"file": "group-89.png",
|
|
289
|
+
"keywords": ["high-alert", "warning", "urgent"]
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"file": "group-90.png",
|
|
293
|
+
"keywords": ["good-idea", "idea", "lightbulb"]
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
"file": "group-91.png",
|
|
297
|
+
"keywords": ["lol", "funny", "laugh"]
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
"file": "group-92.png",
|
|
301
|
+
"keywords": ["awesome", "great"]
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"file": "group-93.png",
|
|
305
|
+
"keywords": ["hot", "fire"]
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
"file": "group-94.png",
|
|
309
|
+
"keywords": ["chill", "relax", "cool"]
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
"file": "group-96.png",
|
|
313
|
+
"keywords": ["done", "finished", "complete"]
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"file": "group-97.png",
|
|
317
|
+
"keywords": ["feedback", "question"]
|
|
318
|
+
},
|
|
319
|
+
{
|
|
320
|
+
"file": "group-98.png",
|
|
321
|
+
"keywords": ["yes", "agree"]
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
"file": "group-99.png",
|
|
325
|
+
"keywords": ["almost-done", "nearly-finished", "hourglass"]
|
|
326
|
+
}
|
|
327
|
+
]
|
|
328
|
+
}
|
|
@@ -37,7 +37,12 @@ export function makeSandbox(): Sandbox {
|
|
|
37
37
|
return { root, designRoot };
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
// Base is spread by pid, not a fixed literal — bun test runs different test
|
|
41
|
+
// files as separate processes, each importing a fresh copy of this module, so
|
|
42
|
+
// a fixed base (e.g. 4500 for everyone) reliably collides across files. The
|
|
43
|
+
// pid spread doesn't guarantee uniqueness on its own — bootServer's pid check
|
|
44
|
+
// below is the actual safety net — but it makes collisions rare in practice.
|
|
45
|
+
let portCounter = 4500 + (process.pid % 4000);
|
|
41
46
|
export function nextPort(): number {
|
|
42
47
|
// Bump on every call so parallel tests don't collide. Bun.serve will throw
|
|
43
48
|
// EADDRINUSE if the host happened to bind one — caller retries with nextPort().
|
|
@@ -65,7 +70,15 @@ export async function bootServer(
|
|
|
65
70
|
const r = await fetch(`http://localhost:${port}/_health`, {
|
|
66
71
|
signal: AbortSignal.timeout(200),
|
|
67
72
|
});
|
|
68
|
-
if (r.ok)
|
|
73
|
+
if (r.ok) {
|
|
74
|
+
const json = (await r.json()) as { pid?: number };
|
|
75
|
+
// A same-port collision with a concurrently-running test file's server
|
|
76
|
+
// (see the portCounter comment above) would otherwise look "ready" —
|
|
77
|
+
// /_health answers fine, just from someone else's sandbox — and every
|
|
78
|
+
// later request 404s against a designRoot that doesn't have our
|
|
79
|
+
// fixtures. Only trust the health check if it's actually our process.
|
|
80
|
+
if (json.pid === proc.pid) return proc;
|
|
81
|
+
}
|
|
69
82
|
} catch {
|
|
70
83
|
/* not up yet */
|
|
71
84
|
}
|
|
@@ -164,4 +164,15 @@ describe('buildStudioBrief — native session commands available (DDR-143)', ()
|
|
|
164
164
|
buildStudioBrief({ designRel: '.design', projectLabel: 'maude', commandsAvailable: true })
|
|
165
165
|
).toBe(brief);
|
|
166
166
|
});
|
|
167
|
+
|
|
168
|
+
test('names board + the whiteboard capability so it is reached for unprompted (Phase 5, whiteboard-improvements)', () => {
|
|
169
|
+
expect(brief).toContain('board');
|
|
170
|
+
expect(brief.toLowerCase()).toContain('whiteboard');
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
test('web path (commandsAvailable falsy) names board in the command family but skips the whiteboard capability fact (no in-session claim)', () => {
|
|
174
|
+
const web = buildStudioBrief({ designRel: '.design', projectLabel: 'maude' });
|
|
175
|
+
expect(web).toContain('board');
|
|
176
|
+
expect(web.toLowerCase()).not.toContain('whiteboard');
|
|
177
|
+
});
|
|
167
178
|
});
|
|
@@ -9,7 +9,7 @@ import { tmpdir } from 'node:os';
|
|
|
9
9
|
import { join } from 'node:path';
|
|
10
10
|
|
|
11
11
|
import { AcpBridge } from '../acp/bridge.ts';
|
|
12
|
-
import { probeAcpAvailability } from '../acp/probe.ts';
|
|
12
|
+
import { probeAcpAvailability, probeAcpAvailabilityAuthed } from '../acp/probe.ts';
|
|
13
13
|
|
|
14
14
|
const FIXTURE = join(import.meta.dir, 'fixtures', 'mock-acp-agent.mjs');
|
|
15
15
|
const TEST_ENV_KEYS = [
|
|
@@ -261,3 +261,36 @@ describe('probeAcpAvailability — not-connected detection', () => {
|
|
|
261
261
|
expect(probe.adapterEntry).toBe(FIXTURE);
|
|
262
262
|
});
|
|
263
263
|
});
|
|
264
|
+
|
|
265
|
+
describe('probeAcpAvailabilityAuthed — DDR-166 T0d, logged-out must not read as available', () => {
|
|
266
|
+
const AUTH_FIXTURE = join(import.meta.dir, 'fixtures', 'fake-claude-auth.mjs');
|
|
267
|
+
|
|
268
|
+
afterEach(() => {
|
|
269
|
+
delete process.env.FAKE_CLAUDE_LOGGED_IN;
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
test('installed but NOT signed in reports available:false (the bug this closes)', async () => {
|
|
273
|
+
process.env.MAUDE_ACP_ADAPTER_ENTRY = FIXTURE;
|
|
274
|
+
process.env.MAUDE_CLAUDE_BIN = AUTH_FIXTURE;
|
|
275
|
+
process.env.FAKE_CLAUDE_LOGGED_IN = '0';
|
|
276
|
+
const probe = await probeAcpAvailabilityAuthed();
|
|
277
|
+
expect(probe.available).toBe(false);
|
|
278
|
+
expect(probe.reason ?? '').toMatch(/signed in/i);
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
test('installed AND signed in reports available:true', async () => {
|
|
282
|
+
process.env.MAUDE_ACP_ADAPTER_ENTRY = FIXTURE;
|
|
283
|
+
process.env.MAUDE_CLAUDE_BIN = AUTH_FIXTURE;
|
|
284
|
+
process.env.FAKE_CLAUDE_LOGGED_IN = '1';
|
|
285
|
+
const probe = await probeAcpAvailabilityAuthed();
|
|
286
|
+
expect(probe.available).toBe(true);
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
test('not installed still reports the plain not-installed reason (no auth spawn attempted)', async () => {
|
|
290
|
+
process.env.MAUDE_ACP_ADAPTER_ENTRY = FIXTURE;
|
|
291
|
+
process.env.MAUDE_CLAUDE_BIN = join(import.meta.dir, 'no-such-claude-bin');
|
|
292
|
+
const probe = await probeAcpAvailabilityAuthed();
|
|
293
|
+
expect(probe.available).toBe(false);
|
|
294
|
+
expect(probe.reason ?? '').toMatch(/Claude Code/i);
|
|
295
|
+
});
|
|
296
|
+
});
|
|
@@ -101,7 +101,8 @@ describe('Acp manager — warm frame broadcasts + open replays commands', () =>
|
|
|
101
101
|
acp.onOpen(b.ws);
|
|
102
102
|
const replay = b.frames.find((f) => f.t === 'commands');
|
|
103
103
|
expect(replay).toBeDefined();
|
|
104
|
-
|
|
104
|
+
const replayCommands = replay?.commands as Array<{ name: string }>;
|
|
105
|
+
expect(replayCommands.length).toBe(2);
|
|
105
106
|
acp.onClose(b.ws);
|
|
106
107
|
} finally {
|
|
107
108
|
acp.onClose(a.ws);
|
|
@@ -62,4 +62,34 @@ describe('scrubAgentEnv — subscription guardrail', () => {
|
|
|
62
62
|
const out = scrubAgentEnv();
|
|
63
63
|
expect('ANTHROPIC_API_KEY' in out).toBe(false);
|
|
64
64
|
});
|
|
65
|
+
|
|
66
|
+
// feature-ai-media-generation Phase 1 (Task 1.4) + DDR-164 F3 — the ACP chat
|
|
67
|
+
// panel can TRIGGER generation because the BYOK provider key is resolved
|
|
68
|
+
// SERVER-SIDE (the dev-server, a separate process, reads the 0600 file /
|
|
69
|
+
// keychain via keys.ts). The ACP `claude` subprocess never needs a generation
|
|
70
|
+
// key-custody env var, so we SCRUB them: the Phase-5.1 keychain-bridge endpoint
|
|
71
|
+
// + key (`MAUDE_GEN_KEY_*` — F3, brought forward so the tripwire is armed before
|
|
72
|
+
// the bridge is wired) AND a custom key-file path (`MAUDE_GEN_KEYS_PATH`). This
|
|
73
|
+
// does NOT make the key unreachable to a compromised same-UID agent (it can
|
|
74
|
+
// still read the default keys.json off disk — the pre-existing full-tool-agent
|
|
75
|
+
// trifecta, documented, not closable by an env-scrub); it only ensures the child
|
|
76
|
+
// is never HANDED a pointer/credential it doesn't need. Meanwhile the `maude`
|
|
77
|
+
// CLI on PATH still resolves, so generation keeps working through the scrub.
|
|
78
|
+
test('scrubs the generation key-custody env vars, keeps CLI PATH (Task 1.4 / DDR-164 F3)', () => {
|
|
79
|
+
const out = scrubAgentEnv({
|
|
80
|
+
PATH: '/usr/local/bin:/usr/bin',
|
|
81
|
+
MAUDE_GEN_KEYS_PATH: '/Users/x/.config/maude/keys.json',
|
|
82
|
+
MAUDE_GEN_KEY_ENDPOINT: 'http://127.0.0.1:9/keychain', // Phase-5.1 bridge — MUST be scrubbed (F3)
|
|
83
|
+
MAUDE_GEN_KEY_KEY: 'per-launch-bridge-secret',
|
|
84
|
+
ANTHROPIC_API_KEY: 'sk-should-be-scrubbed',
|
|
85
|
+
});
|
|
86
|
+
// The generate CLI stays reachable (the sidecar, not this child, holds the key).
|
|
87
|
+
expect(out.PATH).toBe('/usr/local/bin:/usr/bin');
|
|
88
|
+
// Every generation key-custody var is stripped from the agent env.
|
|
89
|
+
expect('MAUDE_GEN_KEYS_PATH' in out).toBe(false);
|
|
90
|
+
expect('MAUDE_GEN_KEY_ENDPOINT' in out).toBe(false);
|
|
91
|
+
expect('MAUDE_GEN_KEY_KEY' in out).toBe(false);
|
|
92
|
+
// The subscription guardrail still fires.
|
|
93
|
+
expect('ANTHROPIC_API_KEY' in out).toBe(false);
|
|
94
|
+
});
|
|
65
95
|
});
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
// ACP session-scoped plugin auto-bootstrap resolver (DDR-143
|
|
1
|
+
// ACP session-scoped plugin auto-bootstrap resolver (DDR-143; unconditional
|
|
2
|
+
// injection DDR-168).
|
|
2
3
|
//
|
|
3
|
-
// The pure gate logic — native/bundle context
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
4
|
+
// The pure gate logic — native/bundle context and per-plugin bundled-dir
|
|
5
|
+
// presence — all exercised without touching disk or ~/.claude. Since DDR-168,
|
|
6
|
+
// there is no longer a `scan`-gated no-op: a bundled plugin injects regardless
|
|
7
|
+
// of whether it's ALSO installed on disk (the double-registration risk that
|
|
8
|
+
// used to gate this is now closed structurally in bridge.ts instead — see
|
|
9
|
+
// acp-session-plugins.test.ts). The wire-level presence test (that the
|
|
10
|
+
// resolved configs actually land on `_meta.claudeCode.options.plugins`) lives
|
|
11
|
+
// in acp-session-plugins.test.ts.
|
|
8
12
|
|
|
9
13
|
import { describe, expect, test } from 'bun:test';
|
|
10
14
|
|
|
@@ -12,78 +16,40 @@ import { computeSessionPlugins } from '../acp/plugin-bootstrap.ts';
|
|
|
12
16
|
|
|
13
17
|
const DESIGN = '/bundle/plugins/design';
|
|
14
18
|
const FLOW = '/bundle/plugins/flow';
|
|
15
|
-
const NEITHER_INSTALLED = { design: false, flow: false };
|
|
16
19
|
|
|
17
20
|
describe('computeSessionPlugins — gates', () => {
|
|
18
21
|
// `/flow` auto-load is intentionally OFF for now (2026-07-03) — only `design`
|
|
19
|
-
// is ever injected, even when the flow dir resolves
|
|
20
|
-
test('
|
|
21
|
-
const out = computeSessionPlugins({
|
|
22
|
-
native: true,
|
|
23
|
-
designDir: DESIGN,
|
|
24
|
-
flowDir: FLOW,
|
|
25
|
-
scan: NEITHER_INSTALLED,
|
|
26
|
-
});
|
|
22
|
+
// is ever injected, even when the flow dir resolves.
|
|
23
|
+
test('native, both bundled ⇒ inject design only (flow disabled)', () => {
|
|
24
|
+
const out = computeSessionPlugins({ native: true, designDir: DESIGN, flowDir: FLOW });
|
|
27
25
|
expect(out).toEqual([{ type: 'local', path: DESIGN, skipMcpDiscovery: true }]);
|
|
28
26
|
});
|
|
29
27
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
});
|
|
37
|
-
expect(out).toEqual([]);
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
test('no-op gate: BOTH already installed (power user) ⇒ inject nothing', () => {
|
|
41
|
-
const out = computeSessionPlugins({
|
|
42
|
-
native: true,
|
|
43
|
-
designDir: DESIGN,
|
|
44
|
-
flowDir: FLOW,
|
|
45
|
-
scan: { design: true, flow: true },
|
|
46
|
-
});
|
|
47
|
-
expect(out).toEqual([]);
|
|
28
|
+
// DDR-168 — no more no-op gate: injection no longer depends on disk state.
|
|
29
|
+
// The double-registration risk this used to guard against is now closed
|
|
30
|
+
// structurally via bridge.ts's `options.settings.enabledPlugins` override.
|
|
31
|
+
test('design already installed on disk ⇒ STILL injects (no more scan-gated no-op)', () => {
|
|
32
|
+
const out = computeSessionPlugins({ native: true, designDir: DESIGN, flowDir: FLOW });
|
|
33
|
+
expect(out).toEqual([{ type: 'local', path: DESIGN, skipMcpDiscovery: true }]);
|
|
48
34
|
});
|
|
49
35
|
|
|
50
36
|
test('native-only gate: not native (web serve) ⇒ inject nothing even if dirs resolve', () => {
|
|
51
|
-
const out = computeSessionPlugins({
|
|
52
|
-
native: false,
|
|
53
|
-
designDir: DESIGN,
|
|
54
|
-
flowDir: FLOW,
|
|
55
|
-
scan: NEITHER_INSTALLED,
|
|
56
|
-
});
|
|
37
|
+
const out = computeSessionPlugins({ native: false, designDir: DESIGN, flowDir: FLOW });
|
|
57
38
|
expect(out).toEqual([]);
|
|
58
39
|
});
|
|
59
40
|
|
|
60
41
|
test('path-missing gate: design dir null ⇒ inject nothing (flow disabled, so no fallback)', () => {
|
|
61
|
-
const out = computeSessionPlugins({
|
|
62
|
-
native: true,
|
|
63
|
-
designDir: null,
|
|
64
|
-
flowDir: FLOW,
|
|
65
|
-
scan: NEITHER_INSTALLED,
|
|
66
|
-
});
|
|
42
|
+
const out = computeSessionPlugins({ native: true, designDir: null, flowDir: FLOW });
|
|
67
43
|
expect(out).toEqual([]);
|
|
68
44
|
});
|
|
69
45
|
|
|
70
46
|
test('web/npm layout: native false AND both dirs null ⇒ empty', () => {
|
|
71
|
-
const out = computeSessionPlugins({
|
|
72
|
-
native: false,
|
|
73
|
-
designDir: null,
|
|
74
|
-
flowDir: null,
|
|
75
|
-
scan: NEITHER_INSTALLED,
|
|
76
|
-
});
|
|
47
|
+
const out = computeSessionPlugins({ native: false, designDir: null, flowDir: null });
|
|
77
48
|
expect(out).toEqual([]);
|
|
78
49
|
});
|
|
79
50
|
|
|
80
51
|
test('every injected config sets skipMcpDiscovery (SDK host owns MCP)', () => {
|
|
81
|
-
const out = computeSessionPlugins({
|
|
82
|
-
native: true,
|
|
83
|
-
designDir: DESIGN,
|
|
84
|
-
flowDir: FLOW,
|
|
85
|
-
scan: NEITHER_INSTALLED,
|
|
86
|
-
});
|
|
52
|
+
const out = computeSessionPlugins({ native: true, designDir: DESIGN, flowDir: FLOW });
|
|
87
53
|
expect(out.every((c) => c.skipMcpDiscovery === true && c.type === 'local')).toBe(true);
|
|
88
54
|
});
|
|
89
55
|
});
|