@hybridlabor-api/aos 4.6.6 → 4.7.1
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/.agents/agents.md +9 -3
- package/.agents/nodes.json +7 -2
- package/.agents/state.schema.json +26 -1
- package/.agents/vendor-manifest.json +56 -0
- package/.agents/workflows/startcycle-graph.md +2 -2
- package/.claude/agents/architect.md +7 -2
- package/.claude/agents/security-reviewer.md +1 -1
- package/.claude/agents/techlead.md +2 -0
- package/.claude/hooks/memb-inject.mjs +257 -135
- package/.claude/hooks/trail-relay.mjs +18 -0
- package/.claude/settings.json +70 -0
- package/.claude/workflows/startcycle-dispatch.mjs +203 -17
- package/.opencode/agents/architect.md +7 -2
- package/.opencode/agents/techlead.md +2 -0
- package/.opencode/plugins/bdb-aos.js +75 -0
- package/THIRD_PARTY_NOTICES.md +57 -1
- package/bin/aos-doctor.mjs +366 -0
- package/bin/aos-store.mjs +167 -0
- package/bin/aos-uninstall.mjs +55 -1
- package/docs/AUDIT_BRIEF_ECC_STORE.md +122 -0
- package/docs/PLAN_AOS_STORE_PHASE1.md +190 -0
- package/docs/handover/agenttrail-for-ao.md +58 -0
- package/docs/handover/deja-for-ao.md +51 -0
- package/installer.js +182 -38
- package/lib/aos-archify-contract.mjs +277 -0
- package/lib/ecc-store-index.json +1 -0
- package/mcp_config.json +8 -0
- package/mcps/mcsc/README.md +24 -0
- package/mcps/mcsc/package-lock.json +1234 -0
- package/mcps/mcsc/package.json +14 -0
- package/mcps/mcsc/packages/core/bin/mcsc.js +162 -0
- package/mcps/mcsc/packages/core/rulebook.default.yaml +49 -0
- package/mcps/mcsc/packages/core/schema/rulebook.schema.json +56 -0
- package/mcps/mcsc/packages/core/src/adapters/agy.js +107 -0
- package/mcps/mcsc/packages/core/src/adapters/codex.js +179 -0
- package/mcps/mcsc/packages/core/src/adapters/native.js +14 -0
- package/mcps/mcsc/packages/core/src/adapters/opencode.js +183 -0
- package/mcps/mcsc/packages/core/src/adapters/types.js +21 -0
- package/mcps/mcsc/packages/core/src/capabilities/buildOfferTable.js +34 -0
- package/mcps/mcsc/packages/core/src/capabilities/registry.js +99 -0
- package/mcps/mcsc/packages/core/src/capabilities/types.js +24 -0
- package/mcps/mcsc/packages/core/src/detect/cache.js +47 -0
- package/mcps/mcsc/packages/core/src/detect/inventory.js +73 -0
- package/mcps/mcsc/packages/core/src/detect/probes.js +158 -0
- package/mcps/mcsc/packages/core/src/detect/types.js +26 -0
- package/mcps/mcsc/packages/core/src/rulebook/load.js +53 -0
- package/mcps/mcsc/packages/core/src/rulebook/resolve.js +227 -0
- package/mcps/mcsc/packages/core/src/rulebook/rulebook.types.js +89 -0
- package/mcps/mcsc/packages/core/src/trail.js +17 -0
- package/mcps/mcsc/packages/mcp/server.js +302 -0
- package/mcps/mcsc/server.js +2 -0
- package/package.json +8 -2
- package/scripts/build-ecc-store-index.mjs +147 -0
- package/skills/basic/bdbmediastorm/SKILL.md +1 -1
- package/skills/basic/godmode-ui-ux/SKILL.md +2 -2
- package/skills/basic/godmode-ui-ux/references/anti-slop-rules.md +44 -40
- package/skills/basic/godmode-ui-ux/references/taste-archetypes.md +49 -0
- package/skills/basic/startcycle/SKILL.md +7 -0
- package/skills/basic/startcycle-graph/SKILL.md +25 -0
- package/skills/basic/startcycle-graph-user/SKILL.md +3 -0
- package/skills/basic/teamwork-preview/SKILL.md +2 -0
- package/skills/bdbrainstorm/SKILL.md +1 -0
- package/skills/global_config/agenttrail/LICENSE +21 -0
- package/skills/global_config/agenttrail/SKILL.md +48 -0
- package/skills/global_config/agenttrail/bin/agenttrail.mjs +1113 -0
- package/skills/global_config/agenttrail/public/index.html +662 -0
- package/skills/global_config/aos-project-init/SKILL.md +25 -5
- package/skills/global_config/aos-setup/SKILL.md +34 -1
- package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +115 -1
- package/skills/global_config/archify/LICENSE +22 -0
- package/skills/global_config/archify/SKILL.md +140 -0
- package/skills/global_config/archify/THIRD_PARTY_NOTICES.md +69 -0
- package/skills/global_config/archify/assets/JetBrainsMono-OFL.txt +93 -0
- package/skills/global_config/archify/assets/template.html +14937 -0
- package/skills/global_config/archify/bin/archify.mjs +2139 -0
- package/skills/global_config/archify/bin/open-artifact.mjs +86 -0
- package/skills/global_config/archify/bin/preview.mjs +653 -0
- package/skills/global_config/archify/bin/visual-check.mjs +829 -0
- package/skills/global_config/archify/brand-marks/README.md +31 -0
- package/skills/global_config/archify/brand-marks/catalog.json +131 -0
- package/skills/global_config/archify/delta/architecture-delta.mjs +1232 -0
- package/skills/global_config/archify/examples/agent-run.lifecycle.json +60 -0
- package/skills/global_config/archify/examples/agent-tool-call.workflow.json +94 -0
- package/skills/global_config/archify/examples/async-job-roundtrip.sequence.json +61 -0
- package/skills/global_config/archify/examples/brand-aware-delivery.architecture.json +47 -0
- package/skills/global_config/archify/examples/cache-miss-request.sequence.json +82 -0
- package/skills/global_config/archify/examples/checkout-platform.base.architecture.json +31 -0
- package/skills/global_config/archify/examples/checkout-platform.head.architecture.json +31 -0
- package/skills/global_config/archify/examples/dataflow-product-analytics.html +15048 -0
- package/skills/global_config/archify/examples/deployment-release.lifecycle.json +49 -0
- package/skills/global_config/archify/examples/event-stream.dataflow.json +57 -0
- package/skills/global_config/archify/examples/incident-response.workflow.json +64 -0
- package/skills/global_config/archify/examples/lifecycle-agent-run.html +14983 -0
- package/skills/global_config/archify/examples/product-analytics.dataflow.json +76 -0
- package/skills/global_config/archify/examples/production-deployment.architecture.json +71 -0
- package/skills/global_config/archify/examples/release-delivery.workflow.json +62 -0
- package/skills/global_config/archify/examples/sequence-cache-miss-request.html +15063 -0
- package/skills/global_config/archify/examples/web-app-rendered.html +15012 -0
- package/skills/global_config/archify/examples/web-app.architecture.json +46 -0
- package/skills/global_config/archify/examples/workflow-agent-tool-call-rendered.html +15054 -0
- package/skills/global_config/archify/migrations/workflow-v2.mjs +279 -0
- package/skills/global_config/archify/package.json +39 -0
- package/skills/global_config/archify/recipes/scenarios.mjs +391 -0
- package/skills/global_config/archify/references/authoring-contract.md +247 -0
- package/skills/global_config/archify/references/brand-marks.md +65 -0
- package/skills/global_config/archify/references/delivery-contract.md +138 -0
- package/skills/global_config/archify/references/viewer-runtime.md +45 -0
- package/skills/global_config/archify/renderers/architecture/grid.mjs +62 -0
- package/skills/global_config/archify/renderers/architecture/render-architecture.mjs +1078 -0
- package/skills/global_config/archify/renderers/dataflow/README.md +104 -0
- package/skills/global_config/archify/renderers/dataflow/render-dataflow.mjs +483 -0
- package/skills/global_config/archify/renderers/lifecycle/README.md +115 -0
- package/skills/global_config/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
- package/skills/global_config/archify/renderers/sequence/README.md +114 -0
- package/skills/global_config/archify/renderers/sequence/render-sequence.mjs +464 -0
- package/skills/global_config/archify/renderers/shared/brand-marks.mjs +563 -0
- package/skills/global_config/archify/renderers/shared/cli.mjs +218 -0
- package/skills/global_config/archify/renderers/shared/desktop-readability.mjs +26 -0
- package/skills/global_config/archify/renderers/shared/diagnostics.mjs +160 -0
- package/skills/global_config/archify/renderers/shared/engineering-profiles.mjs +157 -0
- package/skills/global_config/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
- package/skills/global_config/archify/renderers/shared/generated-validators.mjs +13 -0
- package/skills/global_config/archify/renderers/shared/geometry.mjs +1423 -0
- package/skills/global_config/archify/renderers/shared/i18n.mjs +595 -0
- package/skills/global_config/archify/renderers/shared/layout-report.mjs +40 -0
- package/skills/global_config/archify/renderers/shared/legend.mjs +217 -0
- package/skills/global_config/archify/renderers/shared/output-path.mjs +340 -0
- package/skills/global_config/archify/renderers/shared/repository-evidence.mjs +239 -0
- package/skills/global_config/archify/renderers/shared/repository-location.mjs +58 -0
- package/skills/global_config/archify/renderers/shared/text-fit.mjs +49 -0
- package/skills/global_config/archify/renderers/shared/utils.mjs +232 -0
- package/skills/global_config/archify/renderers/shared/validator.mjs +86 -0
- package/skills/global_config/archify/renderers/workflow/README.md +223 -0
- package/skills/global_config/archify/renderers/workflow/render-workflow.mjs +35 -0
- package/skills/global_config/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
- package/skills/global_config/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
- package/skills/global_config/archify/schemas/README.md +211 -0
- package/skills/global_config/archify/schemas/architecture.schema.json +178 -0
- package/skills/global_config/archify/schemas/common.schema.json +115 -0
- package/skills/global_config/archify/schemas/dataflow.schema.json +243 -0
- package/skills/global_config/archify/schemas/lifecycle.schema.json +266 -0
- package/skills/global_config/archify/schemas/sequence.schema.json +223 -0
- package/skills/global_config/archify/schemas/workflow.schema.json +428 -0
- package/skills/global_config/archify/scripts/check-render-output.mjs +916 -0
- package/skills/global_config/archify/scripts/generate-brand-marks.mjs +141 -0
- package/skills/global_config/archify/scripts/generate-validators.mjs +66 -0
- package/skills/global_config/archify/scripts/render-examples.mjs +26 -0
- package/skills/global_config/archify/skill-release.json +10 -0
- package/skills/global_config/ask-tim/SKILL.md +10 -0
- package/skills/global_config/bdb-security-audit/SKILL.md +109 -0
- package/skills/global_config/bdb-security-audit/references/audit-checklists.md +172 -0
- package/skills/global_config/bdb-security-audit/references/skylos-guide.md +139 -0
- package/skills/global_config/bdb-security-audit/references/xalgorix-bridge.md +110 -0
- package/skills/global_config/bdbdesignpro/SKILL.md +4 -4
- package/skills/global_config/bdbdesignpro/references/bdb-motion-tokens.md +52 -31
- package/skills/global_config/bdbresilience/SKILL.md +10 -0
- package/skills/global_config/brag/SKILL.md +179 -0
- package/skills/global_config/brag/assets/music/README.md +20 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.json +3846 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.md +35 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.json +1826 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.md +35 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.json +2266 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.md +35 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.json +2806 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.md +35 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.json +2796 -0
- package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.md +35 -0
- package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-1-by-ende-dot-app.mp3 +0 -0
- package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-10-by-ende-dot-app.mp3 +0 -0
- package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-11-by-ende-dot-app.mp3 +0 -0
- package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-12-by-ende-dot-app.mp3 +0 -0
- package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-9-by-ende-dot-app.mp3 +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-fan-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-fan-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-place-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-place-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-place-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-place-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-shove-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-shove-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-shove-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-shove-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-shuffle.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-5.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-6.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-7.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/card-slide-8.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chip-lay-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chip-lay-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chip-lay-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-collide-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-collide-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-collide-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-collide-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-handle-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-handle-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-handle-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-handle-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-handle-6.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-5.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/chips-stack-6.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-grab-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-grab-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-shake-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-shake-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-shake-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-throw-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-throw-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/dice-throw-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/die-throw-1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/die-throw-2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/die-throw-3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/casino/die-throw-4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_grass_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_grass_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_grass_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_grass_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_grass_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_snow_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_snow_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_snow_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_snow_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_snow_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_wood_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_wood_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_wood_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_wood_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/footstep_wood_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactMining_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_light_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_light_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_light_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_light_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_light_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/bong_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/click_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/click_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/click_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/click_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/click_005.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/drop_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/drop_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/drop_003.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/error_005.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/error_006.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/glitch_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/glitch_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/select_008.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_001.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_002.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_004.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_005.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_006.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/interface/switch_007.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-001.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-002.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-003.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-004.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-005.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-006.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-007.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-008.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-009.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-010.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-011.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-012.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-013.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-014.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-015.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-016.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-017.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-018.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-019.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-020.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-021.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-022.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-023.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-024.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-025.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-026.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-027.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-028.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-029.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-030.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-031.wav +0 -0
- package/skills/global_config/brag/assets/sfx/keyboard/keypress-032.wav +0 -0
- package/skills/global_config/brag/assets/sfx/sfx-analysis.json +15584 -0
- package/skills/global_config/brag/assets/sfx/sfx-analysis.md +75 -0
- package/skills/global_config/brag/assets/sfx/ui/click1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/click2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/click3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/click4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/click5.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/mouseclick1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/rollover1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/rollover2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/rollover4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/rollover5.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch1.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch10.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch11.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch12.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch13.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch14.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch15.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch16.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch17.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch18.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch19.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch2.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch20.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch21.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch22.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch23.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch24.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch25.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch26.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch27.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch28.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch29.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch3.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch30.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch31.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch32.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch33.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch34.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch35.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch36.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch37.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch38.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch4.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch5.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch6.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch7.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch8.ogg +0 -0
- package/skills/global_config/brag/assets/sfx/ui/switch9.ogg +0 -0
- package/skills/global_config/brag/references/audio.md +307 -0
- package/skills/global_config/brag/references/step-1-inspect.md +133 -0
- package/skills/global_config/brag/references/step-2-plan.md +234 -0
- package/skills/global_config/brag/references/step-3-compose.md +210 -0
- package/skills/global_config/brag/references/step-4-deliver.md +168 -0
- package/skills/global_config/brag/references/tones.md +231 -0
- package/skills/global_config/brag/scripts/analyze_music_cues.py +309 -0
- package/skills/global_config/brag/scripts/pyproject.toml +14 -0
- package/skills/global_config/brag/scripts/uv.lock +819 -0
- package/skills/global_config/deja-memory/SKILL.md +42 -0
- package/skills/global_config/editable-design/LICENSE +202 -0
- package/skills/global_config/editable-design/README.md +34 -0
- package/skills/global_config/editable-design/SKILL.md +630 -0
- package/skills/global_config/editable-design/THIRD_PARTY_NOTICES.md +10 -0
- package/skills/global_config/editable-design/agents/openai.yaml +4 -0
- package/skills/global_config/editable-design/assets/editor/layer-editor.css +262 -0
- package/skills/global_config/editable-design/assets/editor/layer-editor.js +1929 -0
- package/skills/global_config/editable-design/assets/poster-starter/README.md +92 -0
- package/skills/global_config/editable-design/assets/poster-starter/assets/.gitkeep +0 -0
- package/skills/global_config/editable-design/assets/poster-starter/index.html +91 -0
- package/skills/global_config/editable-design/assets/poster-starter/poster.json +6 -0
- package/skills/global_config/editable-design/assets/poster-starter/reference/.gitkeep +1 -0
- package/skills/global_config/editable-design/assets/replay/icons/assets.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/html.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/input.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/layers.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/plan.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/reference.png +0 -0
- package/skills/global_config/editable-design/assets/replay/icons/review.png +0 -0
- package/skills/global_config/editable-design/assets/replay/index.html +59 -0
- package/skills/global_config/editable-design/assets/replay/replay-motion.js +410 -0
- package/skills/global_config/editable-design/assets/replay/replay.css +380 -0
- package/skills/global_config/editable-design/assets/replay/replay.js +374 -0
- package/skills/global_config/editable-design/font-kit/package-lock.json +115 -0
- package/skills/global_config/editable-design/font-kit/package.json +19 -0
- package/skills/global_config/editable-design/pack.sh +20 -0
- package/skills/global_config/editable-design/references/asset-architecture.md +72 -0
- package/skills/global_config/editable-design/references/editor-pitfalls.md +70 -0
- package/skills/global_config/editable-design/references/editor-runtime.md +131 -0
- package/skills/global_config/editable-design/references/font-system.md +89 -0
- package/skills/global_config/editable-design/references/imagery.md +145 -0
- package/skills/global_config/editable-design/references/layout-typography.md +116 -0
- package/skills/global_config/editable-design/references/replay-contract.md +169 -0
- package/skills/global_config/editable-design/scripts/_browser.mjs +247 -0
- package/skills/global_config/editable-design/scripts/bake.mjs +87 -0
- package/skills/global_config/editable-design/scripts/build-replay.mjs +316 -0
- package/skills/global_config/editable-design/scripts/check-contract.mjs +293 -0
- package/skills/global_config/editable-design/scripts/check-fonts.sh +252 -0
- package/skills/global_config/editable-design/scripts/check-poster.sh +70 -0
- package/skills/global_config/editable-design/scripts/doctor.sh +78 -0
- package/skills/global_config/editable-design/scripts/explode.mjs +115 -0
- package/skills/global_config/editable-design/scripts/font-kit.mjs +187 -0
- package/skills/global_config/editable-design/scripts/import-asset.sh +23 -0
- package/skills/global_config/editable-design/scripts/init-poster.sh +64 -0
- package/skills/global_config/editable-design/scripts/install-font-kit.sh +13 -0
- package/skills/global_config/editable-design/scripts/package-lock.json +334 -0
- package/skills/global_config/editable-design/scripts/package.json +14 -0
- package/skills/global_config/editable-design/scripts/remove-chroma-key.py +201 -0
- package/skills/global_config/editable-design/scripts/render-poster.sh +202 -0
- package/skills/global_config/editable-design/scripts/trace.sh +159 -0
- package/skills/global_config/editable-design/scripts/verify-replay.mjs +97 -0
- package/skills/global_config/editable-design/scripts/verify.mjs +782 -0
- package/skills/global_config/editable-design/scripts/wire-editor.mjs +104 -0
- package/skills/global_config/editable-design/tests/fixtures/small-explode/index.html +86 -0
- package/skills/global_config/mcsc/SKILL.md +60 -0
- package/skills/global_config/plan-canvas/SKILL.md +8 -0
- package/skills/global_config/plan-canvas/scripts/lib/plan-canvas/server.js +31 -6
- package/skills/global_config/plan-canvas/scripts/plan-canvas.js +4 -2
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
const data = window.__POSTER_REPLAY__;
|
|
3
|
+
if (!data) {
|
|
4
|
+
document.getElementById('stage-layer').innerHTML = '<p style="padding:40px">Replay data is missing.</p>';
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
const viewport = document.getElementById('canvas-viewport');
|
|
9
|
+
const world = document.getElementById('canvas-world');
|
|
10
|
+
const stageLayer = document.getElementById('stage-layer');
|
|
11
|
+
const artifactLayer = document.getElementById('artifact-layer');
|
|
12
|
+
const flowLines = document.getElementById('flow-lines');
|
|
13
|
+
const detailPanel = document.getElementById('detail-panel');
|
|
14
|
+
const detailContent = document.getElementById('detail-content');
|
|
15
|
+
const mediaLightbox = document.getElementById('media-lightbox');
|
|
16
|
+
const mediaLightboxFrame = document.getElementById('media-lightbox-frame');
|
|
17
|
+
const mediaLightboxTitle = document.getElementById('media-lightbox-title');
|
|
18
|
+
const mediaLightboxNote = document.getElementById('media-lightbox-note');
|
|
19
|
+
const zoomLabel = document.getElementById('zoom-label');
|
|
20
|
+
const phaseNav = document.getElementById('phase-nav');
|
|
21
|
+
const WORLD_WIDTH = 2540;
|
|
22
|
+
const WORLD_HEIGHT = 1780;
|
|
23
|
+
const stageById = new Map(data.stages.map((stage) => [stage.id, stage]));
|
|
24
|
+
const layout = {
|
|
25
|
+
input: { x: 260, y: 110, w: 490, h: 310 },
|
|
26
|
+
reference: { x: 820, y: 110, w: 450, h: 330 },
|
|
27
|
+
plan: { x: 2075, y: 110, w: 420, h: 360 },
|
|
28
|
+
assets: { x: 800, y: 640, w: 480, h: 390 },
|
|
29
|
+
html: { x: 1330, y: 640, w: 690, h: 390 },
|
|
30
|
+
review: { x: 300, y: 1240, w: 690, h: 380 },
|
|
31
|
+
layers: { x: 1330, y: 1240, w: 690, h: 380 }
|
|
32
|
+
};
|
|
33
|
+
const phaseColor = { think: '#567bc9', make: '#cf7626', prove: '#53856b' };
|
|
34
|
+
let scale = 1;
|
|
35
|
+
let tx = 0;
|
|
36
|
+
let ty = 0;
|
|
37
|
+
let selected = null;
|
|
38
|
+
let dragging = false;
|
|
39
|
+
let dragOrigin = null;
|
|
40
|
+
|
|
41
|
+
document.title = `${data.project.title} · Agent 创意轨迹`;
|
|
42
|
+
document.getElementById('project-title').textContent = data.project.title;
|
|
43
|
+
document.getElementById('project-status').textContent = data.project.status === 'ok' ? '已完成' : data.project.status;
|
|
44
|
+
|
|
45
|
+
const esc = (value = '') => String(value).replace(/[&<>"']/g, (char) => ({ '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[char]));
|
|
46
|
+
const shorten = (value = '', max = 620) => value.length > max ? `${value.slice(0, max).trim()}…` : value;
|
|
47
|
+
|
|
48
|
+
function stageIcon(stage) {
|
|
49
|
+
return `<img class="stage-icon" src="icons/${esc(stage.kind)}.png" alt="">`;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function inputVisual(stage) {
|
|
53
|
+
const text = stage.raw || '未记录原始用户 Prompt。';
|
|
54
|
+
return `<div class="input-body"><img src="icons/input.png" alt=""><p class="${stage.raw ? '' : 'missing'}">${esc(shorten(text, 520))}</p></div>`;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function referenceVisual(stage) {
|
|
58
|
+
return `<div class="text-evidence"><small>Art-direction prompt</small><pre>${esc(shorten(stage.prompt || '未记录增强 Prompt。', 880))}</pre><div class="evidence-file">${esc(stage.promptSource || 'missing')}</div></div>`;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function planVisual(stage) {
|
|
62
|
+
const slots = (stage.slots || []).slice(0, 8);
|
|
63
|
+
const hasRecordedRects = slots.length > 0 && slots.every((slot) => {
|
|
64
|
+
const rect = slot.rect || {};
|
|
65
|
+
return ['x', 'y', 'width', 'height'].every((key) => Number.isFinite(Number(rect[key]))) && Number(rect.width) > 0 && Number(rect.height) > 0;
|
|
66
|
+
});
|
|
67
|
+
let positionedSlots = [];
|
|
68
|
+
if (hasRecordedRects) {
|
|
69
|
+
const maxX = Math.max(1, ...slots.map((slot) => Number(slot.rect.x) + Number(slot.rect.width)));
|
|
70
|
+
const maxY = Math.max(1, ...slots.map((slot) => Number(slot.rect.y) + Number(slot.rect.height)));
|
|
71
|
+
positionedSlots = slots.map((slot) => ({
|
|
72
|
+
slot,
|
|
73
|
+
left: Math.max(1, Number(slot.rect.x) / maxX * 94),
|
|
74
|
+
top: Math.max(1, Number(slot.rect.y) / maxY * 94),
|
|
75
|
+
width: Math.max(12, Number(slot.rect.width) / maxX * 94),
|
|
76
|
+
height: Math.max(12, Number(slot.rect.height) / maxY * 94)
|
|
77
|
+
}));
|
|
78
|
+
} else if (slots.length) {
|
|
79
|
+
const columns = slots.length >= 5 ? 3 : slots.length >= 3 ? 2 : 1;
|
|
80
|
+
const rows = Math.ceil(slots.length / columns);
|
|
81
|
+
const gap = 3;
|
|
82
|
+
const width = (92 - gap * (columns - 1)) / columns;
|
|
83
|
+
const height = (88 - gap * (rows - 1)) / rows;
|
|
84
|
+
positionedSlots = slots.map((slot, index) => ({
|
|
85
|
+
slot,
|
|
86
|
+
left: 4 + (index % columns) * (width + gap),
|
|
87
|
+
top: 6 + Math.floor(index / columns) * (height + gap),
|
|
88
|
+
width,
|
|
89
|
+
height
|
|
90
|
+
}));
|
|
91
|
+
}
|
|
92
|
+
const slotHTML = positionedSlots.length ? positionedSlots.map(({ slot, left, top, width, height }, index) => `<div class="plan-slot${hasRecordedRects ? '' : ' is-auto'}" style="left:${left}%;top:${top}%;width:${Math.min(width, 98-left)}%;height:${Math.min(height, 98-top)}%"><strong>${String(index + 1).padStart(2, '0')} · ${esc(slot.id || slot.label || 'slot')}</strong><span>${esc(slot.role || slot.form || slot.aspect || slot.prompt || '')}</span></div>`).join('') : '<div class="plan-empty"><strong>未记录可视化槽位</strong><span>右侧保留原始设计规划</span></div>';
|
|
93
|
+
return `<div class="plan-body"><div class="plan-canvas">${slotHTML}</div><div class="plan-copy"><small>${esc(stage.architecture || 'DESIGN PLAN')}</small><strong>${esc(stage.planTitle || '版式与信息层级')}</strong><p>${esc(shorten(stage.raw || '', 300))}</p></div></div>`;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function assetsVisual(stage) {
|
|
97
|
+
const first = stage.items?.[0] || {};
|
|
98
|
+
const tabs = (stage.items || []).slice(0, 6).map((_, index) => `<span>${String(index + 1).padStart(2, '0')}</span>`).join('');
|
|
99
|
+
return `<div class="asset-body"><header><strong>${esc(first.title || '生成 Prompt')}</strong><span>PROMPT 摘要 · ${stage.items?.length || 0}</span></header><pre>${esc(shorten(first.prompt || '未记录素材 Prompt。', 320))}</pre><div class="asset-tabs">${tabs}</div></div>`;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function htmlVisual(stage) {
|
|
103
|
+
return `<div class="code-body"><div class="code-window"><span>index.html · live layers</span><pre>${esc(shorten(stage.code || '', 1700))}</pre></div><div class="code-facts"><small>RENDER CONTRACT</small><span>${esc(stage.canvas || 'fixed canvas')}</span><span>${stage.layerCount || 0} editable layers</span><span>${stage.groupCount || 0} explode groups</span></div></div>`;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function reviewVisual(stage) {
|
|
107
|
+
const bullets = (stage.bullets || []).slice(0, 4);
|
|
108
|
+
return `<div class="review-body"><div class="review-count"><strong>${stage.passCount || 1}</strong><span>REVIEW PASSES</span></div><div class="review-list">${bullets.map((line, index) => `<div>${String(index + 1).padStart(2, '0')} · ${esc(shorten(line, 96))}</div>`).join('') || '<div>未记录 Review 内容</div>'}</div></div>`;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function layersVisual(stage) {
|
|
112
|
+
return `<div class="layers-body"><div class="layer-stat"><small>EDITABLE LAYERS</small><strong>${stage.layerCount || 0}</strong><span>data-layer-id</span></div><div class="layer-stat"><small>CONTENT GROUPS</small><strong>${stage.groupCount || 0}</strong><span>data-explode-group</span></div><div class="layer-stat"><small>OUTPUT</small><strong>${stage.preview ? 'LIVE' : '—'}</strong><span>${esc(stage.previewSource || '未生成分层展示')}</span></div></div>`;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
const visualFor = { input: inputVisual, reference: referenceVisual, plan: planVisual, assets: assetsVisual, html: htmlVisual, review: reviewVisual, layers: layersVisual };
|
|
116
|
+
|
|
117
|
+
function renderStage(stage) {
|
|
118
|
+
const box = layout[stage.id];
|
|
119
|
+
const article = document.createElement('article');
|
|
120
|
+
article.className = 'stage-node';
|
|
121
|
+
article.dataset.stage = stage.id;
|
|
122
|
+
article.dataset.phase = stage.phase;
|
|
123
|
+
article.style.cssText = `left:${box.x}px;top:${box.y}px;width:${box.w}px;height:${box.h}px`;
|
|
124
|
+
article.innerHTML = `<header class="stage-head">${stageIcon(stage)}<div class="stage-heading"><small>${esc(stage.order)} · ${esc(stage.kind)}</small><strong>${esc(stage.title)}</strong></div><span class="stage-status">${esc(stage.statusLabel || '已记录')}</span></header><div class="stage-body">${visualFor[stage.kind](stage)}</div><footer class="stage-meta"><span>${esc(stage.timeLabel || '')}</span><span>${esc(stage.artifactLabel || '')}</span></footer>`;
|
|
125
|
+
article.addEventListener('click', (event) => { event.stopPropagation(); selectStage(stage.id); });
|
|
126
|
+
stageLayer.appendChild(article);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function closeDetail(updateUrl = true) {
|
|
130
|
+
detailPanel.classList.remove('is-open');
|
|
131
|
+
selected = null;
|
|
132
|
+
document.querySelectorAll('.stage-node').forEach((node) => node.classList.remove('is-selected'));
|
|
133
|
+
phaseNav?.querySelectorAll('button').forEach((button) => button.classList.remove('is-active'));
|
|
134
|
+
if (updateUrl) {
|
|
135
|
+
const url = new URL(location.href);
|
|
136
|
+
url.searchParams.delete('stage');
|
|
137
|
+
history.replaceState(null, '', url);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function closeMedia() {
|
|
142
|
+
mediaLightbox.classList.remove('is-open');
|
|
143
|
+
mediaLightbox.setAttribute('aria-hidden', 'true');
|
|
144
|
+
mediaLightboxFrame.replaceChildren();
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function openMedia(src, label, kind) {
|
|
148
|
+
if (!src) return;
|
|
149
|
+
closeDetail();
|
|
150
|
+
mediaLightbox.dataset.kind = kind;
|
|
151
|
+
mediaLightboxTitle.textContent = label;
|
|
152
|
+
mediaLightboxNote.textContent = kind === 'animation' ? '交互式 HTML · 自动播放分层动画' : '高清图像预览';
|
|
153
|
+
const media = document.createElement(kind === 'animation' ? 'iframe' : 'img');
|
|
154
|
+
if (kind === 'animation') {
|
|
155
|
+
const url = new URL(src, location.href);
|
|
156
|
+
url.searchParams.delete('motion');
|
|
157
|
+
url.searchParams.set('replay', String(Date.now()));
|
|
158
|
+
media.src = url.href;
|
|
159
|
+
media.title = label;
|
|
160
|
+
} else {
|
|
161
|
+
media.src = src;
|
|
162
|
+
media.alt = label;
|
|
163
|
+
}
|
|
164
|
+
mediaLightboxFrame.replaceChildren(media);
|
|
165
|
+
mediaLightbox.classList.add('is-open');
|
|
166
|
+
mediaLightbox.setAttribute('aria-hidden', 'false');
|
|
167
|
+
document.getElementById('media-lightbox-close')?.focus({ preventScroll: true });
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function animationUrl(src) {
|
|
171
|
+
const url = new URL(src, location.href);
|
|
172
|
+
url.searchParams.delete('motion');
|
|
173
|
+
url.searchParams.set('replay', String(Date.now()));
|
|
174
|
+
return url.href;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
function restartLayerAnimation() {
|
|
178
|
+
const host = document.querySelector('.external-artifact.layers [data-animation-src]');
|
|
179
|
+
if (!host) return;
|
|
180
|
+
const iframe = document.createElement('iframe');
|
|
181
|
+
iframe.src = animationUrl(host.dataset.animationSrc);
|
|
182
|
+
iframe.title = host.dataset.animationTitle || 'Layer animation';
|
|
183
|
+
host.replaceChildren(iframe);
|
|
184
|
+
host.dataset.animationState = 'playing';
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function artifactCard({ className, x, y, w, h, src, label, code, contain = false, iframe = false, stage, openMode = 'detail' }) {
|
|
188
|
+
if (!src) return;
|
|
189
|
+
const figure = document.createElement('figure');
|
|
190
|
+
figure.className = `external-artifact ${className}`;
|
|
191
|
+
figure.dataset.stage = stage;
|
|
192
|
+
figure.dataset.contain = contain ? 'true' : 'false';
|
|
193
|
+
figure.style.cssText = `left:${x}px;top:${y}px;width:${w}px;height:${h}px`;
|
|
194
|
+
figure.innerHTML = `${iframe ? `<div class="animation-preview" data-animation-src="${esc(src)}" data-animation-title="${esc(label)}" data-animation-state="waiting"><span>▶</span><strong>Layer animation</strong></div>` : `<img src="${esc(src)}" alt="${esc(label)}">`}<figcaption><span>${esc(label)}</span><span>${esc(code)}</span></figcaption>`;
|
|
195
|
+
figure.addEventListener('click', (event) => {
|
|
196
|
+
event.stopPropagation();
|
|
197
|
+
if (openMode === 'image') openMedia(src, label, 'image');
|
|
198
|
+
else if (openMode === 'animation') openMedia(src, label, 'animation');
|
|
199
|
+
else selectStage(stage);
|
|
200
|
+
});
|
|
201
|
+
artifactLayer.appendChild(figure);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function renderArtifacts() {
|
|
205
|
+
const reference = stageById.get('reference');
|
|
206
|
+
artifactCard({ className: 'reference', x: 1538, y: 110, w: 270, h: 360, src: reference?.preview, label: '视觉参考', code: 'OUT 02', contain: true, stage: 'reference', openMode: 'image' });
|
|
207
|
+
|
|
208
|
+
const assets = stageById.get('assets');
|
|
209
|
+
const assetItems = (assets?.items || []).filter((item) => item.src).slice(0, 4);
|
|
210
|
+
if (assetItems.length === 1) {
|
|
211
|
+
const item = assetItems[0];
|
|
212
|
+
artifactCard({ className: 'asset single-asset', x: 260, y: 610, w: 500, h: 440, src: item.src, label: item.title || 'Asset 1', code: 'OUT 04.1', contain: item.contain, stage: 'assets' });
|
|
213
|
+
} else {
|
|
214
|
+
assetItems.forEach((item, index) => artifactCard({ className: 'asset', x: 260 + (index % 2) * 260, y: 610 + Math.floor(index / 2) * 230, w: 240, h: 210, src: item.src, label: item.title || `Asset ${index + 1}`, code: `OUT 04.${index + 1}`, contain: item.contain, stage: 'assets' }));
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const html = stageById.get('html');
|
|
218
|
+
artifactCard({ className: 'render featured-output', x: 2075, y: 670, w: 420, h: 560, src: html?.render, label: '最终渲染结果', code: 'OUT 05', contain: true, stage: 'html', openMode: 'image' });
|
|
219
|
+
|
|
220
|
+
const layers = stageById.get('layers');
|
|
221
|
+
artifactCard({ className: 'layers', x: 2075, y: 1320, w: 420, h: 360, src: layers?.preview, label: '可编辑分层动画', code: 'OUT 07', contain: true, iframe: layers?.preview?.endsWith('.html') || layers?.preview?.includes('.html?'), stage: 'layers', openMode: 'animation' });
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
function renderLines() {
|
|
225
|
+
const assetCount = (stageById.get('assets')?.items || []).filter((item) => item.src).slice(0, 4).length;
|
|
226
|
+
const assetConnectorPaths = assetCount === 1
|
|
227
|
+
? ['M760 830 C775 830 790 830 800 830']
|
|
228
|
+
: [
|
|
229
|
+
'M500 715 C605 715 720 735 800 760',
|
|
230
|
+
'M760 715 C775 715 790 730 800 760',
|
|
231
|
+
'M500 945 C605 945 720 920 800 900',
|
|
232
|
+
'M760 945 C775 945 790 920 800 900',
|
|
233
|
+
].slice(0, assetCount);
|
|
234
|
+
const assetConnectors = assetConnectorPaths.map((d) => `<path class="flow-artifact make intro-path" d="${d}"/>`).join('');
|
|
235
|
+
flowLines.innerHTML = `
|
|
236
|
+
<defs>
|
|
237
|
+
<marker id="arrow-blue" markerUnits="userSpaceOnUse" markerWidth="18" markerHeight="18" refX="16" refY="9" viewBox="0 0 18 18" orient="auto"><path d="M1,1 L17,9 L1,17 Z" fill="#567bc9"/></marker>
|
|
238
|
+
<marker id="arrow-orange" markerUnits="userSpaceOnUse" markerWidth="18" markerHeight="18" refX="16" refY="9" viewBox="0 0 18 18" orient="auto"><path d="M1,1 L17,9 L1,17 Z" fill="#cf7626"/></marker>
|
|
239
|
+
<marker id="arrow-green" markerUnits="userSpaceOnUse" markerWidth="18" markerHeight="18" refX="16" refY="9" viewBox="0 0 18 18" orient="auto"><path d="M1,1 L17,9 L1,17 Z" fill="#53856b"/></marker>
|
|
240
|
+
<marker id="arrow-red" markerUnits="userSpaceOnUse" markerWidth="18" markerHeight="18" refX="16" refY="9" viewBox="0 0 18 18" orient="auto"><path d="M1,1 L17,9 L1,17 Z" fill="#df7058"/></marker>
|
|
241
|
+
</defs>
|
|
242
|
+
<path id="flow-input-reference" class="flow-main flow-path think" data-from="input" data-to="reference" data-color="#567bc9" marker-end="url(#arrow-blue)" d="M750 265 C770 265 790 265 820 265"/>
|
|
243
|
+
<path id="flow-reference-plan" class="flow-artifact flow-path think" data-from="reference" data-to="plan" data-color="#567bc9" marker-end="url(#arrow-blue)" d="M1270 290 L2075 290"/>
|
|
244
|
+
<path id="flow-plan-assets" class="flow-main flow-path make" data-from="plan" data-to="assets" data-color="#cf7626" marker-end="url(#arrow-orange)" d="M2285 470 C2285 570 1500 500 1040 640"/>
|
|
245
|
+
${assetConnectors}
|
|
246
|
+
<path id="flow-assets-html" class="flow-main flow-path make" data-from="assets" data-to="html" data-color="#cf7626" marker-end="url(#arrow-orange)" d="M1280 835 C1295 835 1310 835 1330 835"/>
|
|
247
|
+
<path id="flow-html-review" class="flow-main flow-path prove" data-from="html" data-to="review" data-color="#53856b" marker-end="url(#arrow-green)" d="M1675 1030 C1675 1150 1015 1140 890 1240"/>
|
|
248
|
+
<path id="flow-review-layers" class="flow-main flow-path prove" data-from="review" data-to="layers" data-color="#53856b" marker-end="url(#arrow-green)" d="M990 1430 C1100 1430 1210 1430 1330 1430"/>
|
|
249
|
+
<path id="flow-review-html-repair" class="flow-repair flow-path repair" data-from="review" data-to="html" data-color="#df7058" marker-end="url(#arrow-red)" d="M610 1240 C610 1130 1220 1170 1470 1030"/>
|
|
250
|
+
<g class="flow-label prove-label" transform="translate(1010 1150)"><rect width="134" height="34" rx="9"/><text x="67" y="23" text-anchor="middle">反馈修正</text></g>`;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
function mediaSection(src, title, iframe = false) {
|
|
254
|
+
if (!src) return '';
|
|
255
|
+
return `<section class="detail-section"><h3>${esc(title)}</h3><div class="detail-media">${iframe ? `<iframe src="${esc(src)}" title="${esc(title)}"></iframe>` : `<img src="${esc(src)}" alt="${esc(title)}">`}</div></section>`;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
function textSection(title, text, code = false) {
|
|
259
|
+
if (!text) return '';
|
|
260
|
+
return `<section class="detail-section"><h3>${esc(title)}</h3><pre class="${code ? 'code' : ''}">${esc(text)}</pre></section>`;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function detailFor(stage) {
|
|
264
|
+
let body = '';
|
|
265
|
+
if (stage.kind === 'input') {
|
|
266
|
+
body += textSection('原始用户 Prompt', stage.raw || '未记录原始用户 Prompt。');
|
|
267
|
+
if (stage.attachments?.length) body += `<section class="detail-section"><h3>输入附件</h3><p>${stage.attachments.map(esc).join('\n')}</p></section>`;
|
|
268
|
+
}
|
|
269
|
+
if (stage.kind === 'reference') {
|
|
270
|
+
body += textSection('增强后的视觉 Prompt', stage.prompt || '未记录。');
|
|
271
|
+
body += mediaSection(stage.preview, '生成的视觉参考');
|
|
272
|
+
}
|
|
273
|
+
if (stage.kind === 'plan') {
|
|
274
|
+
body += textSection('设计规划', stage.raw || '未记录。');
|
|
275
|
+
if (stage.assetPlanRaw) body += textSection('asset-plan.json', stage.assetPlanRaw);
|
|
276
|
+
}
|
|
277
|
+
if (stage.kind === 'assets') {
|
|
278
|
+
const overviewItems = (stage.items || []).filter((item) => item.src);
|
|
279
|
+
if (overviewItems.length) {
|
|
280
|
+
body += `<section class="detail-section asset-overview-section"><div class="detail-section-title"><h3>素材全览</h3><span>${overviewItems.length} ASSETS</span></div><div class="asset-overview-grid">${overviewItems.map((item, index) => `<figure><img src="${esc(item.src)}" alt="${esc(item.title || item.id || '')}" loading="lazy"><figcaption><span>${String(index + 1).padStart(2, '0')}</span><strong>${esc(item.title || item.id || `Asset ${index + 1}`)}</strong></figcaption></figure>`).join('')}</div></section>`;
|
|
281
|
+
}
|
|
282
|
+
body += `<section class="detail-section"><h3>Prompt + 结果</h3><div class="prompt-list">${(stage.items || []).map((item, index) => `<details class="prompt-item" ${index === 0 ? 'open' : ''}><summary><span>${String(index + 1).padStart(2, '0')}</span><strong>${esc(item.title || item.id || `Asset ${index + 1}`)}</strong></summary><div class="prompt-result">${item.src ? `<img src="${esc(item.src)}" alt="${esc(item.title || '')}">` : '<div></div>'}<pre>${esc(item.prompt || '未记录 Prompt。')}</pre></div></details>`).join('')}</div></section>`;
|
|
283
|
+
body += textSection('prompts.md', stage.raw);
|
|
284
|
+
}
|
|
285
|
+
if (stage.kind === 'html') {
|
|
286
|
+
body += textSection('index.html', stage.fullCode || stage.code, true);
|
|
287
|
+
body += mediaSection(stage.render, '渲染结果');
|
|
288
|
+
}
|
|
289
|
+
if (stage.kind === 'review') {
|
|
290
|
+
body += textSection('render-review.md', stage.raw || '未记录。');
|
|
291
|
+
}
|
|
292
|
+
if (stage.kind === 'layers') {
|
|
293
|
+
body += `<section class="detail-section"><h3>分层契约</h3><p>${stage.layerCount || 0} editable layers\n${stage.groupCount || 0} explode groups\n${stage.componentCount || 0} gallery components</p></section>`;
|
|
294
|
+
body += mediaSection(stage.preview, '可编辑分层动画(HTML)', stage.preview?.includes('.html'));
|
|
295
|
+
}
|
|
296
|
+
return `<div class="detail-head" style="--detail-color:${phaseColor[stage.phase]}"><img src="icons/${esc(stage.kind)}.png" alt=""><div><small>${esc(stage.order)} · ${esc(stage.kind)}</small><strong>${esc(stage.title)}</strong></div></div><div class="detail-body">${body}<section class="detail-section"><h3>真实来源</h3><p>${esc(stage.sources?.join('\n') || '无')}</p></section></div>`;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
function selectStage(id, updateUrl = true) {
|
|
300
|
+
const stage = stageById.get(id);
|
|
301
|
+
if (!stage) return;
|
|
302
|
+
selected = id;
|
|
303
|
+
document.querySelectorAll('.stage-node').forEach((node) => node.classList.toggle('is-selected', node.dataset.stage === id));
|
|
304
|
+
phaseNav?.querySelectorAll('button').forEach((button) => button.classList.toggle('is-active', button.dataset.phase === stage.phase));
|
|
305
|
+
detailContent.innerHTML = detailFor(stage);
|
|
306
|
+
detailPanel.classList.add('is-open');
|
|
307
|
+
if (id === 'layers') restartLayerAnimation();
|
|
308
|
+
if (updateUrl) {
|
|
309
|
+
const url = new URL(location.href);
|
|
310
|
+
url.searchParams.set('stage', stage.order.replace(/^0/, ''));
|
|
311
|
+
history.replaceState(null, '', url);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
function applyTransform() {
|
|
316
|
+
world.style.transform = `translate(${tx}px, ${ty}px) scale(${scale})`;
|
|
317
|
+
zoomLabel.value = `${Math.round(scale * 100)}%`;
|
|
318
|
+
zoomLabel.textContent = zoomLabel.value;
|
|
319
|
+
window.dispatchEvent(new CustomEvent('poster-replay-viewchange', { detail: { scale } }));
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
function fitView() {
|
|
323
|
+
const pad = 34;
|
|
324
|
+
const availableW = viewport.clientWidth - pad * 2;
|
|
325
|
+
const availableH = viewport.clientHeight - pad * 2;
|
|
326
|
+
scale = Math.min(1, availableW / WORLD_WIDTH, availableH / WORLD_HEIGHT);
|
|
327
|
+
tx = (viewport.clientWidth - WORLD_WIDTH * scale) / 2;
|
|
328
|
+
ty = (viewport.clientHeight - WORLD_HEIGHT * scale) / 2;
|
|
329
|
+
applyTransform();
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function zoomBy(factor, centerX = viewport.clientWidth / 2, centerY = viewport.clientHeight / 2) {
|
|
333
|
+
const next = Math.max(.18, Math.min(1.65, scale * factor));
|
|
334
|
+
const worldX = (centerX - tx) / scale;
|
|
335
|
+
const worldY = (centerY - ty) / scale;
|
|
336
|
+
scale = next;
|
|
337
|
+
tx = centerX - worldX * scale;
|
|
338
|
+
ty = centerY - worldY * scale;
|
|
339
|
+
applyTransform();
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
data.stages.forEach(renderStage);
|
|
343
|
+
renderArtifacts();
|
|
344
|
+
renderLines();
|
|
345
|
+
|
|
346
|
+
document.getElementById('fit-view').addEventListener('click', fitView);
|
|
347
|
+
document.getElementById('zoom-out').addEventListener('click', () => zoomBy(.86));
|
|
348
|
+
document.getElementById('zoom-in').addEventListener('click', () => zoomBy(1.16));
|
|
349
|
+
document.getElementById('detail-close').addEventListener('click', closeDetail);
|
|
350
|
+
document.getElementById('media-lightbox-close').addEventListener('click', closeMedia);
|
|
351
|
+
mediaLightbox.addEventListener('click', (event) => { if (event.target === mediaLightbox) closeMedia(); });
|
|
352
|
+
document.addEventListener('keydown', (event) => { if (event.key === 'Escape' && mediaLightbox.classList.contains('is-open')) closeMedia(); });
|
|
353
|
+
phaseNav?.querySelectorAll('button').forEach((button) => button.addEventListener('click', () => selectStage(button.dataset.stage)));
|
|
354
|
+
viewport.addEventListener('wheel', (event) => { if (event.target.closest('.detail-panel,.media-lightbox')) return; event.preventDefault(); const rect = viewport.getBoundingClientRect(); zoomBy(event.deltaY < 0 ? 1.08 : .92, event.clientX - rect.left, event.clientY - rect.top); }, { passive: false });
|
|
355
|
+
viewport.addEventListener('pointerdown', (event) => { if (event.target.closest('.stage-node,.external-artifact,.phase-nav,.detail-panel,.view-controls')) return; dragging = true; dragOrigin = { x: event.clientX, y: event.clientY, tx, ty }; viewport.classList.add('is-panning'); viewport.setPointerCapture(event.pointerId); });
|
|
356
|
+
viewport.addEventListener('pointermove', (event) => { if (!dragging) return; tx = dragOrigin.tx + event.clientX - dragOrigin.x; ty = dragOrigin.ty + event.clientY - dragOrigin.y; applyTransform(); });
|
|
357
|
+
viewport.addEventListener('pointerup', () => { dragging = false; viewport.classList.remove('is-panning'); });
|
|
358
|
+
window.addEventListener('resize', fitView);
|
|
359
|
+
|
|
360
|
+
requestAnimationFrame(() => {
|
|
361
|
+
fitView();
|
|
362
|
+
const requested = new URLSearchParams(location.search).get('stage');
|
|
363
|
+
const requestedStage = requested ? data.stages.find((item) => item.order.replace(/^0/, '') === requested || item.id === requested) : null;
|
|
364
|
+
const defaultStage = document.body.dataset.defaultStage ? stageById.get(document.body.dataset.defaultStage) : null;
|
|
365
|
+
const initialStage = requestedStage || defaultStage;
|
|
366
|
+
const viewer = { data, viewport, world, flowLines, phaseNav, detailPanel, selectStage, initialStage, restartLayerAnimation, getViewState: () => ({ scale, tx, ty }) };
|
|
367
|
+
window.__POSTER_REPLAY_VIEWER__ = viewer;
|
|
368
|
+
if (window.__POSTER_REPLAY_MOTION__?.mount) {
|
|
369
|
+
window.__POSTER_REPLAY_MOTION__.mount(viewer);
|
|
370
|
+
} else if (initialStage) {
|
|
371
|
+
selectStage(initialStage.id, false);
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
})();
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "editable-design-font-kit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"lockfileVersion": 3,
|
|
5
|
+
"requires": true,
|
|
6
|
+
"packages": {
|
|
7
|
+
"": {
|
|
8
|
+
"name": "editable-design-font-kit",
|
|
9
|
+
"version": "0.1.0",
|
|
10
|
+
"license": "Apache-2.0",
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"@fontsource-variable/bodoni-moda": "5.3.0",
|
|
13
|
+
"@fontsource-variable/fraunces": "5.3.0",
|
|
14
|
+
"@fontsource-variable/instrument-sans": "5.3.0",
|
|
15
|
+
"@fontsource-variable/noto-sans-sc": "5.3.0",
|
|
16
|
+
"@fontsource-variable/noto-serif-sc": "5.3.0",
|
|
17
|
+
"@fontsource-variable/roboto-condensed": "5.3.0",
|
|
18
|
+
"@fontsource-variable/space-grotesk": "5.3.0",
|
|
19
|
+
"@fontsource-variable/unbounded": "5.3.0",
|
|
20
|
+
"@fontsource/ma-shan-zheng": "5.3.1",
|
|
21
|
+
"@fontsource/zcool-xiaowei": "5.3.0"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"node_modules/@fontsource-variable/bodoni-moda": {
|
|
25
|
+
"version": "5.3.0",
|
|
26
|
+
"resolved": "https://registry.npmjs.org/@fontsource-variable/bodoni-moda/-/bodoni-moda-5.3.0.tgz",
|
|
27
|
+
"integrity": "sha512-yTDXk4+/J8I20KjtkHBbXDQNeE5PR3BZa0gv/YRza+kyxsz+mmg0la/n/hsr6+WvSfVP7Lc8lRTjHGIYwBW43A==",
|
|
28
|
+
"license": "OFL-1.1",
|
|
29
|
+
"funding": {
|
|
30
|
+
"url": "https://github.com/sponsors/ayuhito"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"node_modules/@fontsource-variable/fraunces": {
|
|
34
|
+
"version": "5.3.0",
|
|
35
|
+
"resolved": "https://registry.npmjs.org/@fontsource-variable/fraunces/-/fraunces-5.3.0.tgz",
|
|
36
|
+
"integrity": "sha512-9BYGySn4AHEJdgp9Z28tQ3X+laJMEOITXkQarZXeloWQZDq5oOvXJ3kDA8c7MGIfpogIaZfjrQBqmda8POOCKA==",
|
|
37
|
+
"license": "OFL-1.1",
|
|
38
|
+
"funding": {
|
|
39
|
+
"url": "https://github.com/sponsors/ayuhito"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"node_modules/@fontsource-variable/instrument-sans": {
|
|
43
|
+
"version": "5.3.0",
|
|
44
|
+
"resolved": "https://registry.npmjs.org/@fontsource-variable/instrument-sans/-/instrument-sans-5.3.0.tgz",
|
|
45
|
+
"integrity": "sha512-u4gKbDBTNFGkg997tfQn3eHOhHuquWUFTRT/rwzuKtrxX5P2ekfs2x+LgBPP4P32+cC+vUwF1Cr+IdRoPQbrGw==",
|
|
46
|
+
"license": "OFL-1.1",
|
|
47
|
+
"funding": {
|
|
48
|
+
"url": "https://github.com/sponsors/ayuhito"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
"node_modules/@fontsource-variable/noto-sans-sc": {
|
|
52
|
+
"version": "5.3.0",
|
|
53
|
+
"resolved": "https://registry.npmjs.org/@fontsource-variable/noto-sans-sc/-/noto-sans-sc-5.3.0.tgz",
|
|
54
|
+
"integrity": "sha512-lNar1dF7Ik/lHNPo/7JWG0TolXY29LtsqYgMvEysooZ5bsO9uH4shJmRrwyJ3PjyTPljhpMJEK0jDuLSU4vJ1w==",
|
|
55
|
+
"license": "OFL-1.1",
|
|
56
|
+
"funding": {
|
|
57
|
+
"url": "https://github.com/sponsors/ayuhito"
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
"node_modules/@fontsource-variable/noto-serif-sc": {
|
|
61
|
+
"version": "5.3.0",
|
|
62
|
+
"resolved": "https://registry.npmjs.org/@fontsource-variable/noto-serif-sc/-/noto-serif-sc-5.3.0.tgz",
|
|
63
|
+
"integrity": "sha512-7LcN2NEf4HDjoSkGWc79WqDDyMK8JvSPdA/gsHjJpZ8l9A9mcK/GQTazp3klmkBwJooy0eqeNvlmaZFXPupHrA==",
|
|
64
|
+
"license": "OFL-1.1",
|
|
65
|
+
"funding": {
|
|
66
|
+
"url": "https://github.com/sponsors/ayuhito"
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"node_modules/@fontsource-variable/roboto-condensed": {
|
|
70
|
+
"version": "5.3.0",
|
|
71
|
+
"resolved": "https://registry.npmjs.org/@fontsource-variable/roboto-condensed/-/roboto-condensed-5.3.0.tgz",
|
|
72
|
+
"integrity": "sha512-RpYyF6G0h0nsVcCDLRIbZbK+l8cVDoe1PVbzvzVhtLzCiPqIEEGDs9xB9ZWPJawKS4bJzpKn42KgZFISF/AOuQ==",
|
|
73
|
+
"license": "OFL-1.1",
|
|
74
|
+
"funding": {
|
|
75
|
+
"url": "https://github.com/sponsors/ayuhito"
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"node_modules/@fontsource-variable/space-grotesk": {
|
|
79
|
+
"version": "5.3.0",
|
|
80
|
+
"resolved": "https://registry.npmjs.org/@fontsource-variable/space-grotesk/-/space-grotesk-5.3.0.tgz",
|
|
81
|
+
"integrity": "sha512-2IxmvfB08i9vnGB3Ym/AXvhRE+8XOjWMXIyDum03c+tPwH0FUoMNQfGpU8NXPxjbws0Vvss3AH0Zqt4oJBBAdw==",
|
|
82
|
+
"license": "OFL-1.1",
|
|
83
|
+
"funding": {
|
|
84
|
+
"url": "https://github.com/sponsors/ayuhito"
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"node_modules/@fontsource-variable/unbounded": {
|
|
88
|
+
"version": "5.3.0",
|
|
89
|
+
"resolved": "https://registry.npmjs.org/@fontsource-variable/unbounded/-/unbounded-5.3.0.tgz",
|
|
90
|
+
"integrity": "sha512-ea565Ncn4r7gPdBEHcmaF31V11hDfkL7b/JCklLobQbMfbu2ZZQrVWNgdeEFWFLqNh36yhieZWOgxdAnMTzrLg==",
|
|
91
|
+
"license": "OFL-1.1",
|
|
92
|
+
"funding": {
|
|
93
|
+
"url": "https://github.com/sponsors/ayuhito"
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
"node_modules/@fontsource/ma-shan-zheng": {
|
|
97
|
+
"version": "5.3.1",
|
|
98
|
+
"resolved": "https://registry.npmjs.org/@fontsource/ma-shan-zheng/-/ma-shan-zheng-5.3.1.tgz",
|
|
99
|
+
"integrity": "sha512-cGGn7Yje2RSduXVxEk+rCfNZyD/T/7FMGj03LNPiK8TRL9Sing0tq1zJF3n+W29szPqgb2RNs5oIvmm+ikeI+Q==",
|
|
100
|
+
"license": "OFL-1.1",
|
|
101
|
+
"funding": {
|
|
102
|
+
"url": "https://github.com/sponsors/ayuhito"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"node_modules/@fontsource/zcool-xiaowei": {
|
|
106
|
+
"version": "5.3.0",
|
|
107
|
+
"resolved": "https://registry.npmjs.org/@fontsource/zcool-xiaowei/-/zcool-xiaowei-5.3.0.tgz",
|
|
108
|
+
"integrity": "sha512-iRuUPl9ONFbYzi6JcEshpE4VedINyzQ4hv0Z5XEt0cB0pMPiQeqc2Qvv1NwJCNzkPwG02VCdcO+cF2K8ylYn2A==",
|
|
109
|
+
"license": "OFL-1.1",
|
|
110
|
+
"funding": {
|
|
111
|
+
"url": "https://github.com/sponsors/ayuhito"
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "editable-design-font-kit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"description": "Curated, self-hosted open-source fonts for Editable Design",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"dependencies": {
|
|
8
|
+
"@fontsource-variable/bodoni-moda": "5.3.0",
|
|
9
|
+
"@fontsource-variable/fraunces": "5.3.0",
|
|
10
|
+
"@fontsource-variable/instrument-sans": "5.3.0",
|
|
11
|
+
"@fontsource-variable/noto-sans-sc": "5.3.0",
|
|
12
|
+
"@fontsource-variable/noto-serif-sc": "5.3.0",
|
|
13
|
+
"@fontsource-variable/roboto-condensed": "5.3.0",
|
|
14
|
+
"@fontsource-variable/space-grotesk": "5.3.0",
|
|
15
|
+
"@fontsource-variable/unbounded": "5.3.0",
|
|
16
|
+
"@fontsource/ma-shan-zheng": "5.3.1",
|
|
17
|
+
"@fontsource/zcool-xiaowei": "5.3.0"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
skill_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
5
|
+
parent_dir="$(cd "$skill_dir/.." && pwd)"
|
|
6
|
+
out="${1:-${TMPDIR:-/tmp}/editable-design-skill.tar.gz}"
|
|
7
|
+
|
|
8
|
+
mkdir -p "$(dirname "$out")"
|
|
9
|
+
tar \
|
|
10
|
+
--exclude='editable-design/scripts/node_modules' \
|
|
11
|
+
--exclude='editable-design/font-kit/node_modules' \
|
|
12
|
+
--exclude='editable-design/._*' \
|
|
13
|
+
--exclude='editable-design/*/._*' \
|
|
14
|
+
--exclude='editable-design/*/*/._*' \
|
|
15
|
+
--exclude='editable-design/.DS_Store' \
|
|
16
|
+
-czf "$out" \
|
|
17
|
+
-C "$parent_dir" \
|
|
18
|
+
editable-design
|
|
19
|
+
|
|
20
|
+
echo "$out"
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Asset architecture
|
|
2
|
+
|
|
3
|
+
Read this only after [SKILL.md](../SKILL.md) selects a slot matrix, cutout stack,
|
|
4
|
+
or layered collage. `SKILL.md` owns topology and asset count; this reference
|
|
5
|
+
owns multi-asset cohesion and the `asset-plan.json` schema. [Imagery](imagery.md)
|
|
6
|
+
controls how each asset is prompted and validated.
|
|
7
|
+
|
|
8
|
+
## Multi-asset cohesion
|
|
9
|
+
|
|
10
|
+
### Slot matrix
|
|
11
|
+
|
|
12
|
+
Use for product families, catalog grids, comparisons, specimens, menus, and
|
|
13
|
+
timelines. Give every bounded cell its own asset and let HTML define identical
|
|
14
|
+
cell geometry, gutters, labels, and alignment.
|
|
15
|
+
|
|
16
|
+
Freeze one shared art-direction block for all prompts: camera, lens or rendering
|
|
17
|
+
style, viewpoint, lighting, background treatment, scale, palette, and crop. Add
|
|
18
|
+
only the subject-specific difference to each prompt. Prose alone does not lock a
|
|
19
|
+
series: when material, camera, and set continuity matter, give every slot the
|
|
20
|
+
same visual style anchor. Prefer the non-shipping art-directed reference when it
|
|
21
|
+
already defines the set; otherwise generate and approve one canonical slot,
|
|
22
|
+
then use it as the style reference for the remaining slots. Record the anchor in
|
|
23
|
+
`asset-plan.json`. If exact branded products are required, use supplied
|
|
24
|
+
packshots; do not invent packaging, labels, or product variants.
|
|
25
|
+
|
|
26
|
+
### Cutout stack
|
|
27
|
+
|
|
28
|
+
Use when subjects float over a field, overlap one another, or cross typography.
|
|
29
|
+
Plan the order explicitly, for example: backdrop, rear decoration, headline,
|
|
30
|
+
main subject, foreground detail, metadata. Put exact text in HTML at the correct
|
|
31
|
+
position in that order; never bake it into a cutout.
|
|
32
|
+
|
|
33
|
+
Use one transparent file per independently movable subject. Follow the
|
|
34
|
+
transparency workflow in [Imagery](imagery.md), and keep enough clean padding
|
|
35
|
+
around each subject for reliable extraction and cropping.
|
|
36
|
+
|
|
37
|
+
### Layered collage
|
|
38
|
+
|
|
39
|
+
Use a restrained base field plus a purposeful set of fragments. Split only
|
|
40
|
+
pieces whose overlap, angle, crop, or replacement matters. Generate photographic
|
|
41
|
+
or materially complex fragments; make simple tape, rules, flat paper polygons,
|
|
42
|
+
and frames in HTML/CSS. Reuse a fragment only when repetition is visibly part of
|
|
43
|
+
the design language.
|
|
44
|
+
|
|
45
|
+
Vary scale, angle, edge treatment, and depth, but preserve one palette and one
|
|
46
|
+
material logic. Avoid filling every gap: collage still needs hierarchy and
|
|
47
|
+
negative space.
|
|
48
|
+
|
|
49
|
+
## `asset-plan.json`
|
|
50
|
+
|
|
51
|
+
Create this only when two or more shipping assets are required. Keep it small.
|
|
52
|
+
For every asset record:
|
|
53
|
+
|
|
54
|
+
- `id` and `form`: `backdrop`, `slot`, `cutout`, or `fragment`;
|
|
55
|
+
- `rect`: intended `x`, `y`, `width`, and `height` on the poster canvas;
|
|
56
|
+
- `layer`: its named position in the back-to-front order;
|
|
57
|
+
- `prompt`: the prompt identifier stored in `prompts.md`;
|
|
58
|
+
- `style_reference`: the common visual anchor path or `null`;
|
|
59
|
+
- `depends_on`: the prerequisite asset only when returned pixels from it are
|
|
60
|
+
required, otherwise empty;
|
|
61
|
+
- `source`: `generated`, `user`, or `provided-reference`.
|
|
62
|
+
|
|
63
|
+
List HTML text and geometry layers separately so the overlap order is explicit.
|
|
64
|
+
|
|
65
|
+
## Assembly checks
|
|
66
|
+
|
|
67
|
+
- Inspect every asset alone before assembly, especially alpha edges and unwanted
|
|
68
|
+
generated lettering.
|
|
69
|
+
- Inspect the final render for rectangular seams, inconsistent light direction,
|
|
70
|
+
mismatched scale, accidental tangencies, and text trapped between busy layers.
|
|
71
|
+
- If the composition only works after hiding seams with gradients and shadows,
|
|
72
|
+
the split was wrong. Regenerate a continuous scene or change the architecture.
|