@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
package/apps/studio/readiness.ts
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import { existsSync, readFileSync } from 'node:fs';
|
|
15
15
|
import { homedir } from 'node:os';
|
|
16
16
|
import { join } from 'node:path';
|
|
17
|
+
import { getClaudeAuthStatus } from './acp/login-state.ts';
|
|
17
18
|
import { isNativePluginContext } from './acp/plugin-bootstrap.ts';
|
|
18
19
|
import { resolveAdapterEntry, resolveClaudePath } from './acp/probe.ts';
|
|
19
20
|
import { resolveBrowser } from './bin/_ensure-browser.mjs';
|
|
@@ -32,6 +33,19 @@ export interface ReadinessItem {
|
|
|
32
33
|
detail: string;
|
|
33
34
|
/** Copy-paste-able fix, present only when the item is not satisfied. */
|
|
34
35
|
remediation?: string;
|
|
36
|
+
/** Verbatim shell command for a dedicated code-block + Copy affordance (DDR-166 T0c) — kept separate from the prose `remediation`. */
|
|
37
|
+
installCommand?: string;
|
|
38
|
+
/** UI action hint (DDR-166): 'install' renders a "Set up AI editing" button that runs the official installer then auto-chains to sign-in; 'signin' renders a "Sign in to Claude" button alone. */
|
|
39
|
+
action?: 'install' | 'signin';
|
|
40
|
+
/**
|
|
41
|
+
* DDR-166 Decision 3 (binding — a security-review-mandated control, not
|
|
42
|
+
* cosmetic): the resolved absolute path of the binary a Sign-in click is
|
|
43
|
+
* about to spawn, shown BEFORE the button so a pre-existing PATH-hijacked
|
|
44
|
+
* `claude` isn't invisible to the one human capable of noticing it's wrong.
|
|
45
|
+
*/
|
|
46
|
+
resolvedPath?: string;
|
|
47
|
+
/** True when `resolvedPath` is the binary Maude itself just installed (content-pinned — see probe.ts `setTrustedClaudeBin`), not something already on the user's PATH. */
|
|
48
|
+
resolvedViaMaude?: boolean;
|
|
35
49
|
}
|
|
36
50
|
|
|
37
51
|
export interface ReadinessReport {
|
|
@@ -164,37 +178,101 @@ export function scanPlugins(): PluginScan {
|
|
|
164
178
|
* (DDR-128 hardening) so this can't be turned into a spawn-storm from a drive-by page.
|
|
165
179
|
*/
|
|
166
180
|
export async function probeReadiness(): Promise<ReadinessReport> {
|
|
167
|
-
|
|
181
|
+
let [claude, maude, agentBrowser] = await Promise.all([
|
|
168
182
|
(async () => resolveClaudePath() ?? (await resolveOnPath('claude')))(),
|
|
169
183
|
resolveOnPath('maude'),
|
|
170
184
|
resolveOnPath('agent-browser'),
|
|
171
185
|
]);
|
|
172
186
|
|
|
187
|
+
// Deterministic E2E stub for the two claude-readiness states that are
|
|
188
|
+
// otherwise near-impossible to reproduce on a real, already-set-up dev
|
|
189
|
+
// machine (mirrors MAUDE_E2E_FAKE_GITHUB_LOGIN in oauth.rs — same problem,
|
|
190
|
+
// same shape of fix: a real state that needs a pristine/logged-out machine
|
|
191
|
+
// to occur naturally gets a narrow, explicitly-named override instead of a
|
|
192
|
+
// hand-rolled sandbox that fights the OS's own PATH resolution). Never
|
|
193
|
+
// affects real users — unset in every normal launch.
|
|
194
|
+
const e2eForce = process.env.MAUDE_E2E_FORCE_CLAUDE_STATUS;
|
|
195
|
+
// A verified, explicitly-provisioned MAUDE_CLAUDE_BIN override (T0c's
|
|
196
|
+
// install flow, once its freshness+hash check passes) must never be
|
|
197
|
+
// clobbered back to "missing"/"signed-out" by this coarser stub — mirrors
|
|
198
|
+
// the same precedence fix in probe.ts's resolveClaudePath(). Without this,
|
|
199
|
+
// the acp-cold-start scenario could never observe its OWN install actually
|
|
200
|
+
// taking effect after starting from a forced-missing state.
|
|
201
|
+
const hasVerifiedOverride =
|
|
202
|
+
!!process.env.MAUDE_CLAUDE_BIN && claude === process.env.MAUDE_CLAUDE_BIN;
|
|
203
|
+
if (e2eForce === 'missing' && !hasVerifiedOverride) claude = null;
|
|
204
|
+
else if (e2eForce === 'signed-out' && !hasVerifiedOverride) claude = claude || '/usr/bin/claude'; // present, but auth probe below is also stubbed
|
|
205
|
+
|
|
173
206
|
const items: ReadinessItem[] = [];
|
|
174
207
|
|
|
208
|
+
// DDR-166 T0d — honest 3-state instead of presence-only: not installed (an
|
|
209
|
+
// "install" action, T0c — runs the same verbatim official one-liner a user
|
|
210
|
+
// would type themselves, live-verified 2026-07-13 against
|
|
211
|
+
// code.claude.com/docs/en/quickstart.md; the copy-paste command below stays
|
|
212
|
+
// as the fallback/opt-out path) / installed-but-signed-out (a "Sign in"
|
|
213
|
+
// action, T0d) / signed-in-on-subscription.
|
|
214
|
+
const authStatus =
|
|
215
|
+
e2eForce === 'signed-out' ? { loggedIn: false } : claude ? await getClaudeAuthStatus() : null;
|
|
216
|
+
const signedIn = !!authStatus?.loggedIn;
|
|
217
|
+
const offSubscription =
|
|
218
|
+
signedIn && authStatus?.apiProvider && authStatus.apiProvider !== 'firstParty';
|
|
219
|
+
// DDR-166 Decision 5 — the settings-UI opt-out (prefs.rs `claude_auto_setup`,
|
|
220
|
+
// DEFAULT ON) reaches the dev-server as an env var set fresh at each sidecar
|
|
221
|
+
// spawn. Disabled → fall back to guide-only: no automated action offered,
|
|
222
|
+
// same posture as before T0c/T0d existed (still shows the copy-paste
|
|
223
|
+
// command below, just no button).
|
|
224
|
+
const autoSetupEnabled = process.env.MAUDE_CLAUDE_AUTOSETUP_ENABLED !== '0';
|
|
175
225
|
items.push({
|
|
176
226
|
id: 'claude',
|
|
177
227
|
label: 'Claude Code (the `claude` CLI)',
|
|
178
228
|
required: true,
|
|
179
|
-
status: claude ? 'present' : 'missing',
|
|
180
|
-
detail: claude
|
|
181
|
-
? '
|
|
182
|
-
:
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
229
|
+
status: claude && signedIn ? 'present' : 'missing',
|
|
230
|
+
detail: !claude
|
|
231
|
+
? 'Not found on PATH.'
|
|
232
|
+
: signedIn
|
|
233
|
+
? offSubscription
|
|
234
|
+
? `Signed in, but not on a Claude subscription (${authStatus?.apiProvider}) — AI editing may bill metered API usage.`
|
|
235
|
+
: `Signed in${authStatus?.subscriptionType ? ` · ${authStatus.subscriptionType}` : ''} — AI editing runs on your own Pro/Max subscription.`
|
|
236
|
+
: 'Installed, but not signed in.',
|
|
237
|
+
remediation: !claude
|
|
238
|
+
? 'Install Claude Code, then sign in. AI editing runs on your own Pro/Max subscription — never API billing.'
|
|
239
|
+
: signedIn
|
|
240
|
+
? undefined
|
|
241
|
+
: 'Sign in to connect it to your Pro/Max subscription.',
|
|
242
|
+
installCommand: !claude ? 'curl -fsSL https://claude.ai/install.sh | bash' : undefined,
|
|
243
|
+
action: !autoSetupEnabled ? undefined : !claude ? 'install' : !signedIn ? 'signin' : undefined,
|
|
244
|
+
resolvedPath: claude ?? undefined,
|
|
245
|
+
resolvedViaMaude: !!claude && claude === process.env.MAUDE_CLAUDE_BIN,
|
|
186
246
|
});
|
|
187
247
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
248
|
+
// DDR-166 T0b / DDR-168 — `maude` is bundled into the packaged app (compiled
|
|
249
|
+
// via apps/desktop/scripts/build-cli-binary.mjs, shipped as `externalBin`
|
|
250
|
+
// `binaries/maude`; sidecar.rs stages it into its own narrow, single-binary
|
|
251
|
+
// PATH directory, PREPENDS that directory ahead of the rest of PATH, and sets
|
|
252
|
+
// MAUDE_BUNDLED_CLI_PATH to that exact path). Prepending makes this
|
|
253
|
+
// deterministic, not a best-effort fallback: inside the sidecar's own spawned
|
|
254
|
+
// children the bundled copy always wins PATH resolution, so `maude === bundledCliPath`
|
|
255
|
+
// is the normal case on the desktop path, not merely one possible outcome. This
|
|
256
|
+
// row disappears entirely for the end user rather than surfacing an
|
|
257
|
+
// `npm i -g` instruction for something already shipped — it's an internal
|
|
258
|
+
// plumbing detail, not a recognizable capability like the agent-browser/
|
|
259
|
+
// adapter rows below. In dev contexts where the bundling step hasn't run
|
|
260
|
+
// (a bare `bun run server.ts`, `maude design serve`), MAUDE_BUNDLED_CLI_PATH
|
|
261
|
+
// is unset and this falls through to the pre-T0b behavior unchanged.
|
|
262
|
+
const bundledCliPath = process.env.MAUDE_BUNDLED_CLI_PATH || null;
|
|
263
|
+
const maudeIsBundled = !!bundledCliPath && maude === bundledCliPath;
|
|
264
|
+
if (!maudeIsBundled) {
|
|
265
|
+
items.push({
|
|
266
|
+
id: 'maude',
|
|
267
|
+
label: 'maude CLI',
|
|
268
|
+
required: true,
|
|
269
|
+
status: maude ? 'present' : 'missing',
|
|
270
|
+
detail: maude ? 'On PATH — `/design:edit` can reach its helpers.' : 'Not found on PATH.',
|
|
271
|
+
remediation: maude
|
|
272
|
+
? undefined
|
|
273
|
+
: 'Install it: `npm i -g @1agh/maude`. `/design:edit` shells out to `maude design …`, so it must be on PATH.',
|
|
274
|
+
});
|
|
275
|
+
}
|
|
198
276
|
|
|
199
277
|
const scan = scanPlugins();
|
|
200
278
|
// DDR-143 — on the native/desktop path the ACP chat session AUTO-LOADS the
|
|
@@ -206,8 +284,18 @@ export async function probeReadiness(): Promise<ReadinessReport> {
|
|
|
206
284
|
// `design` alone — demanding a plugin the chat doesn't use would be a false red.
|
|
207
285
|
// The web `maude design serve` path ships no bundle (native=false, dir null) →
|
|
208
286
|
// the manual marketplace remediation still shows there.
|
|
287
|
+
//
|
|
288
|
+
// DDR-168 — `designAutoloaded` no longer requires `!scan.design`: the bundled
|
|
289
|
+
// copy is injected unconditionally now (plugin-bootstrap.ts), regardless of
|
|
290
|
+
// whether a marketplace copy is ALSO installed at the user level (the
|
|
291
|
+
// double-registration risk that used to gate this is closed structurally in
|
|
292
|
+
// bridge.ts's `options.settings.enabledPlugins` override instead). So this row
|
|
293
|
+
// reads "auto-loaded" even on a machine that separately has design@maude
|
|
294
|
+
// installed — that's the whole point: the bundled, release-matched copy is
|
|
295
|
+
// what actually runs in the chat, so the UI should say so rather than imply
|
|
296
|
+
// "ready because you already had it."
|
|
209
297
|
const native = isNativePluginContext();
|
|
210
|
-
const designAutoloaded = native && DESIGN_PLUGIN_DIR !== null
|
|
298
|
+
const designAutoloaded = native && DESIGN_PLUGIN_DIR !== null;
|
|
211
299
|
const designReady = scan.design || designAutoloaded;
|
|
212
300
|
const pluginStatus: ReadinessStatus = designReady
|
|
213
301
|
? 'present'
|
|
@@ -221,7 +309,7 @@ export async function probeReadiness(): Promise<ReadinessReport> {
|
|
|
221
309
|
status: pluginStatus,
|
|
222
310
|
detail: designReady
|
|
223
311
|
? designAutoloaded
|
|
224
|
-
? '
|
|
312
|
+
? 'Bundled with this app — loads automatically in the chat session.'
|
|
225
313
|
: 'design@maude is installed.'
|
|
226
314
|
: scan.status === 'unknown'
|
|
227
315
|
? "Couldn't read Claude Code's plugin registry — check it manually."
|
|
@@ -47,12 +47,26 @@ export const RUNTIME_PACKAGES = [
|
|
|
47
47
|
'react-dom/client',
|
|
48
48
|
'react/jsx-runtime',
|
|
49
49
|
'react/jsx-dev-runtime',
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
//
|
|
54
|
-
//
|
|
50
|
+
// Pixi.js v8 — per-iframe runtime bundle for the non-destructive photo editor
|
|
51
|
+
// (feature-photo-editor). The canvas-lib `<PhotoLayer>` reaches the WebGL
|
|
52
|
+
// compositor (`photo/pipeline.ts`) through a LAZY runtime `import('pixi.js')`,
|
|
53
|
+
// so a canvas with no edited photo never pays the ~500 KB bundle cost (the
|
|
54
|
+
// lazy-bundle guarantee — regression-tested in test/photo-canvas-bundle.test.ts).
|
|
55
|
+
// Pre-built into dist/runtime/pixi-js.js + floored in .min-sizes.json.
|
|
56
|
+
// (Originally parked by DDR-024 for snapshot-to-texture rendering; the photo
|
|
57
|
+
// editor is the first real activation — see the photo-editor architecture DDR.)
|
|
55
58
|
'pixi.js',
|
|
59
|
+
// @imgly/background-removal (feature-photo-editor) — client-side ML background
|
|
60
|
+
// removal (WASM/WebGPU via onnxruntime-web, ZERO native deps; the Node/native
|
|
61
|
+
// `-node` variant is NEVER imported — bun-compile-hostile, DDR-070 sharp-class
|
|
62
|
+
// exclusion). Externalised for the same lazy per-iframe bundling as pixi: the
|
|
63
|
+
// bg-remove harness (PhotoBgRemoveHarness) reaches it through a runtime
|
|
64
|
+
// `import('@imgly/background-removal')`, so a canvas that never removes a
|
|
65
|
+
// background pays zero cost. Model weights (~11–44 MB isnet) are fetched at
|
|
66
|
+
// first use (IMG.LY CDN by default; `publicPath` self-hosts for air-gapped —
|
|
67
|
+
// a documented follow-up, see the photo-editor DDR). Pre-built into
|
|
68
|
+
// dist/runtime + floored in .min-sizes.json.
|
|
69
|
+
'@imgly/background-removal',
|
|
56
70
|
// Phase 3.7 / DDR-049 — Motion One (motion/react) is the canonical motion
|
|
57
71
|
// library for the canvas-lib + handoff pipeline. Externalised here so the
|
|
58
72
|
// canvas-lib motion helpers (<MotionDemo>, etc.) resolve through the same
|
|
@@ -220,7 +234,16 @@ export async function getRuntimeBundle(
|
|
|
220
234
|
// The `as any` cast tolerates names like `__INTERNAL_DO_NOT_USE_OR_WARN`
|
|
221
235
|
// that aren't declared in the package's .d.ts; the destructure still
|
|
222
236
|
// succeeds at runtime, which is what matters.
|
|
223
|
-
|
|
237
|
+
// pixi.js compiles shaders with `new Function()` — which the split-origin
|
|
238
|
+
// canvas iframe's strict CSP (DDR-054) forbids (no `unsafe-eval`), so the
|
|
239
|
+
// photo compositor threw "Current environment does not allow unsafe-eval" and
|
|
240
|
+
// the live preview silently failed in the DEFAULT mode (only same-origin, the
|
|
241
|
+
// opt-out, had no CSP to trip). pixi ships `pixi.js/unsafe-eval` — a
|
|
242
|
+
// side-effect module that swaps the eval-based shader/uniform sync for
|
|
243
|
+
// eval-free polyfills. Baking it into the runtime bundle here makes EVERY
|
|
244
|
+
// canvas's `import('pixi.js')` CSP-safe transparently (feature-photo-editor).
|
|
245
|
+
const sideEffects = pkg === 'pixi.js' ? `import "pixi.js/unsafe-eval";\n` : '';
|
|
246
|
+
const entryContent = `${sideEffects}import * as __mod__ from ${JSON.stringify(pkg)};\n${
|
|
224
247
|
exportNames.length > 0
|
|
225
248
|
? `const {\n${namedLines}\n} = __mod__ as any;\n` + `export {\n${namedLines}\n};\n`
|
|
226
249
|
: ''
|