@hybridlabor-api/aos 4.6.5 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/.agents/agents.md +1 -0
  2. package/.agents/nodes.json +5 -1
  3. package/.agents/state.schema.json +2 -1
  4. package/.agents/vendor-manifest.json +50 -0
  5. package/.claude/agents/architect.md +4 -0
  6. package/.claude/agents/security-reviewer.md +1 -1
  7. package/.claude/hooks/memb-inject.mjs +257 -135
  8. package/.claude/hooks/trail-relay.mjs +18 -0
  9. package/.claude/settings.json +70 -0
  10. package/.claude/workflows/startcycle-dispatch.mjs +29 -1
  11. package/.opencode/agents/architect.md +4 -0
  12. package/.opencode/plugins/bdb-aos.js +75 -0
  13. package/THIRD_PARTY_NOTICES.md +48 -0
  14. package/bin/aos-config.mjs +3 -1
  15. package/bin/aos-uninstall.mjs +55 -1
  16. package/docs/handover/agenttrail-for-ao.md +58 -0
  17. package/docs/handover/deja-for-ao.md +51 -0
  18. package/installer.js +257 -56
  19. package/mcp_config.json +4 -0
  20. package/mcps/mcsc/README.md +24 -0
  21. package/mcps/mcsc/package-lock.json +1234 -0
  22. package/mcps/mcsc/package.json +14 -0
  23. package/mcps/mcsc/packages/core/bin/mcsc.js +162 -0
  24. package/mcps/mcsc/packages/core/rulebook.default.yaml +49 -0
  25. package/mcps/mcsc/packages/core/schema/rulebook.schema.json +56 -0
  26. package/mcps/mcsc/packages/core/src/adapters/agy.js +107 -0
  27. package/mcps/mcsc/packages/core/src/adapters/codex.js +56 -0
  28. package/mcps/mcsc/packages/core/src/adapters/native.js +14 -0
  29. package/mcps/mcsc/packages/core/src/adapters/opencode.js +183 -0
  30. package/mcps/mcsc/packages/core/src/adapters/types.js +21 -0
  31. package/mcps/mcsc/packages/core/src/capabilities/buildOfferTable.js +34 -0
  32. package/mcps/mcsc/packages/core/src/capabilities/registry.js +99 -0
  33. package/mcps/mcsc/packages/core/src/capabilities/types.js +24 -0
  34. package/mcps/mcsc/packages/core/src/detect/cache.js +47 -0
  35. package/mcps/mcsc/packages/core/src/detect/inventory.js +73 -0
  36. package/mcps/mcsc/packages/core/src/detect/probes.js +158 -0
  37. package/mcps/mcsc/packages/core/src/detect/types.js +26 -0
  38. package/mcps/mcsc/packages/core/src/rulebook/load.js +53 -0
  39. package/mcps/mcsc/packages/core/src/rulebook/resolve.js +227 -0
  40. package/mcps/mcsc/packages/core/src/rulebook/rulebook.types.js +89 -0
  41. package/mcps/mcsc/packages/core/src/trail.js +17 -0
  42. package/mcps/mcsc/packages/mcp/server.js +302 -0
  43. package/mcps/mcsc/server.js +2 -0
  44. package/package.json +3 -1
  45. package/skills/basic/bdbmediastorm/SKILL.md +1 -1
  46. package/skills/basic/godmode-ui-ux/SKILL.md +2 -2
  47. package/skills/basic/godmode-ui-ux/references/anti-slop-rules.md +44 -40
  48. package/skills/basic/godmode-ui-ux/references/taste-archetypes.md +49 -0
  49. package/skills/basic/startcycle/SKILL.md +7 -0
  50. package/skills/basic/startcycle-graph/SKILL.md +12 -0
  51. package/skills/basic/startcycle-graph-user/SKILL.md +3 -0
  52. package/skills/basic/teamwork-preview/SKILL.md +2 -0
  53. package/skills/bdbrainstorm/SKILL.md +1 -0
  54. package/skills/global_config/agenttrail/LICENSE +21 -0
  55. package/skills/global_config/agenttrail/SKILL.md +48 -0
  56. package/skills/global_config/agenttrail/bin/agenttrail.mjs +1002 -0
  57. package/skills/global_config/agenttrail/public/index.html +661 -0
  58. package/skills/global_config/aos-project-init/SKILL.md +25 -5
  59. package/skills/global_config/aos-project-init/scripts/aos-project-doctor.mjs +11 -0
  60. package/skills/global_config/aos-setup/SKILL.md +34 -1
  61. package/skills/global_config/aos-setup/scripts/aos-doctor.mjs +115 -1
  62. package/skills/global_config/archify/LICENSE +22 -0
  63. package/skills/global_config/archify/SKILL.md +140 -0
  64. package/skills/global_config/archify/THIRD_PARTY_NOTICES.md +69 -0
  65. package/skills/global_config/archify/assets/JetBrainsMono-OFL.txt +93 -0
  66. package/skills/global_config/archify/assets/template.html +14937 -0
  67. package/skills/global_config/archify/bin/archify.mjs +2139 -0
  68. package/skills/global_config/archify/bin/open-artifact.mjs +86 -0
  69. package/skills/global_config/archify/bin/preview.mjs +653 -0
  70. package/skills/global_config/archify/bin/visual-check.mjs +829 -0
  71. package/skills/global_config/archify/brand-marks/README.md +31 -0
  72. package/skills/global_config/archify/brand-marks/catalog.json +131 -0
  73. package/skills/global_config/archify/delta/architecture-delta.mjs +1232 -0
  74. package/skills/global_config/archify/examples/agent-run.lifecycle.json +60 -0
  75. package/skills/global_config/archify/examples/agent-tool-call.workflow.json +94 -0
  76. package/skills/global_config/archify/examples/async-job-roundtrip.sequence.json +61 -0
  77. package/skills/global_config/archify/examples/brand-aware-delivery.architecture.json +47 -0
  78. package/skills/global_config/archify/examples/cache-miss-request.sequence.json +82 -0
  79. package/skills/global_config/archify/examples/checkout-platform.base.architecture.json +31 -0
  80. package/skills/global_config/archify/examples/checkout-platform.head.architecture.json +31 -0
  81. package/skills/global_config/archify/examples/deployment-release.lifecycle.json +49 -0
  82. package/skills/global_config/archify/examples/event-stream.dataflow.json +57 -0
  83. package/skills/global_config/archify/examples/incident-response.workflow.json +64 -0
  84. package/skills/global_config/archify/examples/product-analytics.dataflow.json +76 -0
  85. package/skills/global_config/archify/examples/production-deployment.architecture.json +71 -0
  86. package/skills/global_config/archify/examples/release-delivery.workflow.json +62 -0
  87. package/skills/global_config/archify/examples/web-app.architecture.json +46 -0
  88. package/skills/global_config/archify/migrations/workflow-v2.mjs +279 -0
  89. package/skills/global_config/archify/package.json +39 -0
  90. package/skills/global_config/archify/recipes/scenarios.mjs +391 -0
  91. package/skills/global_config/archify/references/authoring-contract.md +247 -0
  92. package/skills/global_config/archify/references/brand-marks.md +65 -0
  93. package/skills/global_config/archify/references/delivery-contract.md +138 -0
  94. package/skills/global_config/archify/references/viewer-runtime.md +45 -0
  95. package/skills/global_config/archify/renderers/architecture/grid.mjs +62 -0
  96. package/skills/global_config/archify/renderers/architecture/render-architecture.mjs +1078 -0
  97. package/skills/global_config/archify/renderers/dataflow/README.md +104 -0
  98. package/skills/global_config/archify/renderers/dataflow/render-dataflow.mjs +483 -0
  99. package/skills/global_config/archify/renderers/lifecycle/README.md +115 -0
  100. package/skills/global_config/archify/renderers/lifecycle/render-lifecycle.mjs +561 -0
  101. package/skills/global_config/archify/renderers/sequence/README.md +114 -0
  102. package/skills/global_config/archify/renderers/sequence/render-sequence.mjs +464 -0
  103. package/skills/global_config/archify/renderers/shared/brand-marks.mjs +563 -0
  104. package/skills/global_config/archify/renderers/shared/cli.mjs +218 -0
  105. package/skills/global_config/archify/renderers/shared/desktop-readability.mjs +26 -0
  106. package/skills/global_config/archify/renderers/shared/diagnostics.mjs +160 -0
  107. package/skills/global_config/archify/renderers/shared/engineering-profiles.mjs +157 -0
  108. package/skills/global_config/archify/renderers/shared/generated-brand-marks.mjs +2003 -0
  109. package/skills/global_config/archify/renderers/shared/generated-validators.mjs +13 -0
  110. package/skills/global_config/archify/renderers/shared/geometry.mjs +1423 -0
  111. package/skills/global_config/archify/renderers/shared/i18n.mjs +595 -0
  112. package/skills/global_config/archify/renderers/shared/layout-report.mjs +40 -0
  113. package/skills/global_config/archify/renderers/shared/legend.mjs +217 -0
  114. package/skills/global_config/archify/renderers/shared/output-path.mjs +340 -0
  115. package/skills/global_config/archify/renderers/shared/repository-evidence.mjs +239 -0
  116. package/skills/global_config/archify/renderers/shared/repository-location.mjs +58 -0
  117. package/skills/global_config/archify/renderers/shared/text-fit.mjs +49 -0
  118. package/skills/global_config/archify/renderers/shared/utils.mjs +232 -0
  119. package/skills/global_config/archify/renderers/shared/validator.mjs +86 -0
  120. package/skills/global_config/archify/renderers/workflow/README.md +223 -0
  121. package/skills/global_config/archify/renderers/workflow/render-workflow.mjs +35 -0
  122. package/skills/global_config/archify/renderers/workflow/workflow-compiler.mjs +4400 -0
  123. package/skills/global_config/archify/renderers/workflow/workflow-migration-geometry.mjs +144 -0
  124. package/skills/global_config/archify/schemas/README.md +211 -0
  125. package/skills/global_config/archify/schemas/architecture.schema.json +178 -0
  126. package/skills/global_config/archify/schemas/common.schema.json +115 -0
  127. package/skills/global_config/archify/schemas/dataflow.schema.json +243 -0
  128. package/skills/global_config/archify/schemas/lifecycle.schema.json +266 -0
  129. package/skills/global_config/archify/schemas/sequence.schema.json +223 -0
  130. package/skills/global_config/archify/schemas/workflow.schema.json +428 -0
  131. package/skills/global_config/archify/scripts/check-render-output.mjs +916 -0
  132. package/skills/global_config/archify/scripts/generate-brand-marks.mjs +141 -0
  133. package/skills/global_config/archify/scripts/generate-validators.mjs +66 -0
  134. package/skills/global_config/archify/scripts/render-examples.mjs +26 -0
  135. package/skills/global_config/archify/skill-release.json +10 -0
  136. package/skills/global_config/bdb-security-audit/SKILL.md +109 -0
  137. package/skills/global_config/bdb-security-audit/references/audit-checklists.md +172 -0
  138. package/skills/global_config/bdb-security-audit/references/skylos-guide.md +139 -0
  139. package/skills/global_config/bdb-security-audit/references/xalgorix-bridge.md +110 -0
  140. package/skills/global_config/bdbdesignpro/SKILL.md +4 -4
  141. package/skills/global_config/bdbdesignpro/references/bdb-motion-tokens.md +52 -31
  142. package/skills/global_config/bdbresilience/SKILL.md +10 -0
  143. package/skills/global_config/brag/SKILL.md +179 -0
  144. package/skills/global_config/brag/assets/music/README.md +20 -0
  145. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.json +3846 -0
  146. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-1-by-ende-dot-app.music-cues.md +35 -0
  147. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.json +1826 -0
  148. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-10-by-ende-dot-app.music-cues.md +35 -0
  149. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.json +2266 -0
  150. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-11-by-ende-dot-app.music-cues.md +35 -0
  151. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.json +2806 -0
  152. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-12-by-ende-dot-app.music-cues.md +35 -0
  153. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.json +2796 -0
  154. package/skills/global_config/brag/assets/music/cues/happy-beats-business-moves-vol-9-by-ende-dot-app.music-cues.md +35 -0
  155. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-1-by-ende-dot-app.mp3 +0 -0
  156. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-10-by-ende-dot-app.mp3 +0 -0
  157. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-11-by-ende-dot-app.mp3 +0 -0
  158. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-12-by-ende-dot-app.mp3 +0 -0
  159. package/skills/global_config/brag/assets/music/happy-beats-business-moves-vol-9-by-ende-dot-app.mp3 +0 -0
  160. package/skills/global_config/brag/assets/sfx/casino/card-fan-1.ogg +0 -0
  161. package/skills/global_config/brag/assets/sfx/casino/card-fan-2.ogg +0 -0
  162. package/skills/global_config/brag/assets/sfx/casino/card-place-1.ogg +0 -0
  163. package/skills/global_config/brag/assets/sfx/casino/card-place-2.ogg +0 -0
  164. package/skills/global_config/brag/assets/sfx/casino/card-place-3.ogg +0 -0
  165. package/skills/global_config/brag/assets/sfx/casino/card-place-4.ogg +0 -0
  166. package/skills/global_config/brag/assets/sfx/casino/card-shove-1.ogg +0 -0
  167. package/skills/global_config/brag/assets/sfx/casino/card-shove-2.ogg +0 -0
  168. package/skills/global_config/brag/assets/sfx/casino/card-shove-3.ogg +0 -0
  169. package/skills/global_config/brag/assets/sfx/casino/card-shove-4.ogg +0 -0
  170. package/skills/global_config/brag/assets/sfx/casino/card-shuffle.ogg +0 -0
  171. package/skills/global_config/brag/assets/sfx/casino/card-slide-1.ogg +0 -0
  172. package/skills/global_config/brag/assets/sfx/casino/card-slide-2.ogg +0 -0
  173. package/skills/global_config/brag/assets/sfx/casino/card-slide-3.ogg +0 -0
  174. package/skills/global_config/brag/assets/sfx/casino/card-slide-4.ogg +0 -0
  175. package/skills/global_config/brag/assets/sfx/casino/card-slide-5.ogg +0 -0
  176. package/skills/global_config/brag/assets/sfx/casino/card-slide-6.ogg +0 -0
  177. package/skills/global_config/brag/assets/sfx/casino/card-slide-7.ogg +0 -0
  178. package/skills/global_config/brag/assets/sfx/casino/card-slide-8.ogg +0 -0
  179. package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-1.ogg +0 -0
  180. package/skills/global_config/brag/assets/sfx/casino/cards-pack-open-2.ogg +0 -0
  181. package/skills/global_config/brag/assets/sfx/casino/chip-lay-1.ogg +0 -0
  182. package/skills/global_config/brag/assets/sfx/casino/chip-lay-2.ogg +0 -0
  183. package/skills/global_config/brag/assets/sfx/casino/chip-lay-3.ogg +0 -0
  184. package/skills/global_config/brag/assets/sfx/casino/chips-collide-1.ogg +0 -0
  185. package/skills/global_config/brag/assets/sfx/casino/chips-collide-2.ogg +0 -0
  186. package/skills/global_config/brag/assets/sfx/casino/chips-collide-3.ogg +0 -0
  187. package/skills/global_config/brag/assets/sfx/casino/chips-collide-4.ogg +0 -0
  188. package/skills/global_config/brag/assets/sfx/casino/chips-handle-1.ogg +0 -0
  189. package/skills/global_config/brag/assets/sfx/casino/chips-handle-2.ogg +0 -0
  190. package/skills/global_config/brag/assets/sfx/casino/chips-handle-3.ogg +0 -0
  191. package/skills/global_config/brag/assets/sfx/casino/chips-handle-4.ogg +0 -0
  192. package/skills/global_config/brag/assets/sfx/casino/chips-handle-6.ogg +0 -0
  193. package/skills/global_config/brag/assets/sfx/casino/chips-stack-1.ogg +0 -0
  194. package/skills/global_config/brag/assets/sfx/casino/chips-stack-2.ogg +0 -0
  195. package/skills/global_config/brag/assets/sfx/casino/chips-stack-3.ogg +0 -0
  196. package/skills/global_config/brag/assets/sfx/casino/chips-stack-4.ogg +0 -0
  197. package/skills/global_config/brag/assets/sfx/casino/chips-stack-5.ogg +0 -0
  198. package/skills/global_config/brag/assets/sfx/casino/chips-stack-6.ogg +0 -0
  199. package/skills/global_config/brag/assets/sfx/casino/dice-grab-1.ogg +0 -0
  200. package/skills/global_config/brag/assets/sfx/casino/dice-grab-2.ogg +0 -0
  201. package/skills/global_config/brag/assets/sfx/casino/dice-shake-1.ogg +0 -0
  202. package/skills/global_config/brag/assets/sfx/casino/dice-shake-2.ogg +0 -0
  203. package/skills/global_config/brag/assets/sfx/casino/dice-shake-3.ogg +0 -0
  204. package/skills/global_config/brag/assets/sfx/casino/dice-throw-1.ogg +0 -0
  205. package/skills/global_config/brag/assets/sfx/casino/dice-throw-2.ogg +0 -0
  206. package/skills/global_config/brag/assets/sfx/casino/dice-throw-3.ogg +0 -0
  207. package/skills/global_config/brag/assets/sfx/casino/die-throw-1.ogg +0 -0
  208. package/skills/global_config/brag/assets/sfx/casino/die-throw-2.ogg +0 -0
  209. package/skills/global_config/brag/assets/sfx/casino/die-throw-3.ogg +0 -0
  210. package/skills/global_config/brag/assets/sfx/casino/die-throw-4.ogg +0 -0
  211. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_000.ogg +0 -0
  212. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_003.ogg +0 -0
  213. package/skills/global_config/brag/assets/sfx/impact/footstep_carpet_004.ogg +0 -0
  214. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_000.ogg +0 -0
  215. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_001.ogg +0 -0
  216. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_002.ogg +0 -0
  217. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_003.ogg +0 -0
  218. package/skills/global_config/brag/assets/sfx/impact/footstep_concrete_004.ogg +0 -0
  219. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_000.ogg +0 -0
  220. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_001.ogg +0 -0
  221. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_002.ogg +0 -0
  222. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_003.ogg +0 -0
  223. package/skills/global_config/brag/assets/sfx/impact/footstep_grass_004.ogg +0 -0
  224. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_000.ogg +0 -0
  225. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_001.ogg +0 -0
  226. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_002.ogg +0 -0
  227. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_003.ogg +0 -0
  228. package/skills/global_config/brag/assets/sfx/impact/footstep_snow_004.ogg +0 -0
  229. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_000.ogg +0 -0
  230. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_001.ogg +0 -0
  231. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_002.ogg +0 -0
  232. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_003.ogg +0 -0
  233. package/skills/global_config/brag/assets/sfx/impact/footstep_wood_004.ogg +0 -0
  234. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_000.ogg +0 -0
  235. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_003.ogg +0 -0
  236. package/skills/global_config/brag/assets/sfx/impact/impactBell_heavy_004.ogg +0 -0
  237. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_000.ogg +0 -0
  238. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_001.ogg +0 -0
  239. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_002.ogg +0 -0
  240. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_003.ogg +0 -0
  241. package/skills/global_config/brag/assets/sfx/impact/impactGeneric_light_004.ogg +0 -0
  242. package/skills/global_config/brag/assets/sfx/impact/impactGlass_heavy_002.ogg +0 -0
  243. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_001.ogg +0 -0
  244. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_002.ogg +0 -0
  245. package/skills/global_config/brag/assets/sfx/impact/impactGlass_light_003.ogg +0 -0
  246. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_000.ogg +0 -0
  247. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_002.ogg +0 -0
  248. package/skills/global_config/brag/assets/sfx/impact/impactGlass_medium_004.ogg +0 -0
  249. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_000.ogg +0 -0
  250. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_002.ogg +0 -0
  251. package/skills/global_config/brag/assets/sfx/impact/impactMetal_heavy_004.ogg +0 -0
  252. package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_002.ogg +0 -0
  253. package/skills/global_config/brag/assets/sfx/impact/impactMetal_light_003.ogg +0 -0
  254. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_000.ogg +0 -0
  255. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_001.ogg +0 -0
  256. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_002.ogg +0 -0
  257. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_003.ogg +0 -0
  258. package/skills/global_config/brag/assets/sfx/impact/impactMetal_medium_004.ogg +0 -0
  259. package/skills/global_config/brag/assets/sfx/impact/impactMining_001.ogg +0 -0
  260. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_000.ogg +0 -0
  261. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_001.ogg +0 -0
  262. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_002.ogg +0 -0
  263. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_003.ogg +0 -0
  264. package/skills/global_config/brag/assets/sfx/impact/impactPlank_medium_004.ogg +0 -0
  265. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_000.ogg +0 -0
  266. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_001.ogg +0 -0
  267. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_002.ogg +0 -0
  268. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_003.ogg +0 -0
  269. package/skills/global_config/brag/assets/sfx/impact/impactPlate_heavy_004.ogg +0 -0
  270. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_000.ogg +0 -0
  271. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_001.ogg +0 -0
  272. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_002.ogg +0 -0
  273. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_003.ogg +0 -0
  274. package/skills/global_config/brag/assets/sfx/impact/impactPlate_light_004.ogg +0 -0
  275. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_000.ogg +0 -0
  276. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_001.ogg +0 -0
  277. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_002.ogg +0 -0
  278. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_003.ogg +0 -0
  279. package/skills/global_config/brag/assets/sfx/impact/impactPlate_medium_004.ogg +0 -0
  280. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_000.ogg +0 -0
  281. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_001.ogg +0 -0
  282. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_002.ogg +0 -0
  283. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_003.ogg +0 -0
  284. package/skills/global_config/brag/assets/sfx/impact/impactPunch_heavy_004.ogg +0 -0
  285. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_000.ogg +0 -0
  286. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_001.ogg +0 -0
  287. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_002.ogg +0 -0
  288. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_003.ogg +0 -0
  289. package/skills/global_config/brag/assets/sfx/impact/impactPunch_medium_004.ogg +0 -0
  290. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_000.ogg +0 -0
  291. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_001.ogg +0 -0
  292. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_002.ogg +0 -0
  293. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_003.ogg +0 -0
  294. package/skills/global_config/brag/assets/sfx/impact/impactSoft_heavy_004.ogg +0 -0
  295. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_000.ogg +0 -0
  296. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_001.ogg +0 -0
  297. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_002.ogg +0 -0
  298. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_003.ogg +0 -0
  299. package/skills/global_config/brag/assets/sfx/impact/impactSoft_medium_004.ogg +0 -0
  300. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_000.ogg +0 -0
  301. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_001.ogg +0 -0
  302. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_002.ogg +0 -0
  303. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_003.ogg +0 -0
  304. package/skills/global_config/brag/assets/sfx/impact/impactTin_medium_004.ogg +0 -0
  305. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_000.ogg +0 -0
  306. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_001.ogg +0 -0
  307. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_002.ogg +0 -0
  308. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_003.ogg +0 -0
  309. package/skills/global_config/brag/assets/sfx/impact/impactWood_heavy_004.ogg +0 -0
  310. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_000.ogg +0 -0
  311. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_001.ogg +0 -0
  312. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_002.ogg +0 -0
  313. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_003.ogg +0 -0
  314. package/skills/global_config/brag/assets/sfx/impact/impactWood_light_004.ogg +0 -0
  315. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_000.ogg +0 -0
  316. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_001.ogg +0 -0
  317. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_002.ogg +0 -0
  318. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_003.ogg +0 -0
  319. package/skills/global_config/brag/assets/sfx/impact/impactWood_medium_004.ogg +0 -0
  320. package/skills/global_config/brag/assets/sfx/interface/bong_001.ogg +0 -0
  321. package/skills/global_config/brag/assets/sfx/interface/click_001.ogg +0 -0
  322. package/skills/global_config/brag/assets/sfx/interface/click_002.ogg +0 -0
  323. package/skills/global_config/brag/assets/sfx/interface/click_003.ogg +0 -0
  324. package/skills/global_config/brag/assets/sfx/interface/click_004.ogg +0 -0
  325. package/skills/global_config/brag/assets/sfx/interface/click_005.ogg +0 -0
  326. package/skills/global_config/brag/assets/sfx/interface/drop_001.ogg +0 -0
  327. package/skills/global_config/brag/assets/sfx/interface/drop_002.ogg +0 -0
  328. package/skills/global_config/brag/assets/sfx/interface/drop_003.ogg +0 -0
  329. package/skills/global_config/brag/assets/sfx/interface/error_005.ogg +0 -0
  330. package/skills/global_config/brag/assets/sfx/interface/error_006.ogg +0 -0
  331. package/skills/global_config/brag/assets/sfx/interface/glitch_002.ogg +0 -0
  332. package/skills/global_config/brag/assets/sfx/interface/glitch_004.ogg +0 -0
  333. package/skills/global_config/brag/assets/sfx/interface/select_008.ogg +0 -0
  334. package/skills/global_config/brag/assets/sfx/interface/switch_001.ogg +0 -0
  335. package/skills/global_config/brag/assets/sfx/interface/switch_002.ogg +0 -0
  336. package/skills/global_config/brag/assets/sfx/interface/switch_004.ogg +0 -0
  337. package/skills/global_config/brag/assets/sfx/interface/switch_005.ogg +0 -0
  338. package/skills/global_config/brag/assets/sfx/interface/switch_006.ogg +0 -0
  339. package/skills/global_config/brag/assets/sfx/interface/switch_007.ogg +0 -0
  340. package/skills/global_config/brag/assets/sfx/keyboard/keypress-001.wav +0 -0
  341. package/skills/global_config/brag/assets/sfx/keyboard/keypress-002.wav +0 -0
  342. package/skills/global_config/brag/assets/sfx/keyboard/keypress-003.wav +0 -0
  343. package/skills/global_config/brag/assets/sfx/keyboard/keypress-004.wav +0 -0
  344. package/skills/global_config/brag/assets/sfx/keyboard/keypress-005.wav +0 -0
  345. package/skills/global_config/brag/assets/sfx/keyboard/keypress-006.wav +0 -0
  346. package/skills/global_config/brag/assets/sfx/keyboard/keypress-007.wav +0 -0
  347. package/skills/global_config/brag/assets/sfx/keyboard/keypress-008.wav +0 -0
  348. package/skills/global_config/brag/assets/sfx/keyboard/keypress-009.wav +0 -0
  349. package/skills/global_config/brag/assets/sfx/keyboard/keypress-010.wav +0 -0
  350. package/skills/global_config/brag/assets/sfx/keyboard/keypress-011.wav +0 -0
  351. package/skills/global_config/brag/assets/sfx/keyboard/keypress-012.wav +0 -0
  352. package/skills/global_config/brag/assets/sfx/keyboard/keypress-013.wav +0 -0
  353. package/skills/global_config/brag/assets/sfx/keyboard/keypress-014.wav +0 -0
  354. package/skills/global_config/brag/assets/sfx/keyboard/keypress-015.wav +0 -0
  355. package/skills/global_config/brag/assets/sfx/keyboard/keypress-016.wav +0 -0
  356. package/skills/global_config/brag/assets/sfx/keyboard/keypress-017.wav +0 -0
  357. package/skills/global_config/brag/assets/sfx/keyboard/keypress-018.wav +0 -0
  358. package/skills/global_config/brag/assets/sfx/keyboard/keypress-019.wav +0 -0
  359. package/skills/global_config/brag/assets/sfx/keyboard/keypress-020.wav +0 -0
  360. package/skills/global_config/brag/assets/sfx/keyboard/keypress-021.wav +0 -0
  361. package/skills/global_config/brag/assets/sfx/keyboard/keypress-022.wav +0 -0
  362. package/skills/global_config/brag/assets/sfx/keyboard/keypress-023.wav +0 -0
  363. package/skills/global_config/brag/assets/sfx/keyboard/keypress-024.wav +0 -0
  364. package/skills/global_config/brag/assets/sfx/keyboard/keypress-025.wav +0 -0
  365. package/skills/global_config/brag/assets/sfx/keyboard/keypress-026.wav +0 -0
  366. package/skills/global_config/brag/assets/sfx/keyboard/keypress-027.wav +0 -0
  367. package/skills/global_config/brag/assets/sfx/keyboard/keypress-028.wav +0 -0
  368. package/skills/global_config/brag/assets/sfx/keyboard/keypress-029.wav +0 -0
  369. package/skills/global_config/brag/assets/sfx/keyboard/keypress-030.wav +0 -0
  370. package/skills/global_config/brag/assets/sfx/keyboard/keypress-031.wav +0 -0
  371. package/skills/global_config/brag/assets/sfx/keyboard/keypress-032.wav +0 -0
  372. package/skills/global_config/brag/assets/sfx/sfx-analysis.json +15584 -0
  373. package/skills/global_config/brag/assets/sfx/sfx-analysis.md +75 -0
  374. package/skills/global_config/brag/assets/sfx/ui/click1.ogg +0 -0
  375. package/skills/global_config/brag/assets/sfx/ui/click2.ogg +0 -0
  376. package/skills/global_config/brag/assets/sfx/ui/click3.ogg +0 -0
  377. package/skills/global_config/brag/assets/sfx/ui/click4.ogg +0 -0
  378. package/skills/global_config/brag/assets/sfx/ui/click5.ogg +0 -0
  379. package/skills/global_config/brag/assets/sfx/ui/mouseclick1.ogg +0 -0
  380. package/skills/global_config/brag/assets/sfx/ui/rollover1.ogg +0 -0
  381. package/skills/global_config/brag/assets/sfx/ui/rollover2.ogg +0 -0
  382. package/skills/global_config/brag/assets/sfx/ui/rollover4.ogg +0 -0
  383. package/skills/global_config/brag/assets/sfx/ui/rollover5.ogg +0 -0
  384. package/skills/global_config/brag/assets/sfx/ui/switch1.ogg +0 -0
  385. package/skills/global_config/brag/assets/sfx/ui/switch10.ogg +0 -0
  386. package/skills/global_config/brag/assets/sfx/ui/switch11.ogg +0 -0
  387. package/skills/global_config/brag/assets/sfx/ui/switch12.ogg +0 -0
  388. package/skills/global_config/brag/assets/sfx/ui/switch13.ogg +0 -0
  389. package/skills/global_config/brag/assets/sfx/ui/switch14.ogg +0 -0
  390. package/skills/global_config/brag/assets/sfx/ui/switch15.ogg +0 -0
  391. package/skills/global_config/brag/assets/sfx/ui/switch16.ogg +0 -0
  392. package/skills/global_config/brag/assets/sfx/ui/switch17.ogg +0 -0
  393. package/skills/global_config/brag/assets/sfx/ui/switch18.ogg +0 -0
  394. package/skills/global_config/brag/assets/sfx/ui/switch19.ogg +0 -0
  395. package/skills/global_config/brag/assets/sfx/ui/switch2.ogg +0 -0
  396. package/skills/global_config/brag/assets/sfx/ui/switch20.ogg +0 -0
  397. package/skills/global_config/brag/assets/sfx/ui/switch21.ogg +0 -0
  398. package/skills/global_config/brag/assets/sfx/ui/switch22.ogg +0 -0
  399. package/skills/global_config/brag/assets/sfx/ui/switch23.ogg +0 -0
  400. package/skills/global_config/brag/assets/sfx/ui/switch24.ogg +0 -0
  401. package/skills/global_config/brag/assets/sfx/ui/switch25.ogg +0 -0
  402. package/skills/global_config/brag/assets/sfx/ui/switch26.ogg +0 -0
  403. package/skills/global_config/brag/assets/sfx/ui/switch27.ogg +0 -0
  404. package/skills/global_config/brag/assets/sfx/ui/switch28.ogg +0 -0
  405. package/skills/global_config/brag/assets/sfx/ui/switch29.ogg +0 -0
  406. package/skills/global_config/brag/assets/sfx/ui/switch3.ogg +0 -0
  407. package/skills/global_config/brag/assets/sfx/ui/switch30.ogg +0 -0
  408. package/skills/global_config/brag/assets/sfx/ui/switch31.ogg +0 -0
  409. package/skills/global_config/brag/assets/sfx/ui/switch32.ogg +0 -0
  410. package/skills/global_config/brag/assets/sfx/ui/switch33.ogg +0 -0
  411. package/skills/global_config/brag/assets/sfx/ui/switch34.ogg +0 -0
  412. package/skills/global_config/brag/assets/sfx/ui/switch35.ogg +0 -0
  413. package/skills/global_config/brag/assets/sfx/ui/switch36.ogg +0 -0
  414. package/skills/global_config/brag/assets/sfx/ui/switch37.ogg +0 -0
  415. package/skills/global_config/brag/assets/sfx/ui/switch38.ogg +0 -0
  416. package/skills/global_config/brag/assets/sfx/ui/switch4.ogg +0 -0
  417. package/skills/global_config/brag/assets/sfx/ui/switch5.ogg +0 -0
  418. package/skills/global_config/brag/assets/sfx/ui/switch6.ogg +0 -0
  419. package/skills/global_config/brag/assets/sfx/ui/switch7.ogg +0 -0
  420. package/skills/global_config/brag/assets/sfx/ui/switch8.ogg +0 -0
  421. package/skills/global_config/brag/assets/sfx/ui/switch9.ogg +0 -0
  422. package/skills/global_config/brag/references/audio.md +307 -0
  423. package/skills/global_config/brag/references/step-1-inspect.md +133 -0
  424. package/skills/global_config/brag/references/step-2-plan.md +234 -0
  425. package/skills/global_config/brag/references/step-3-compose.md +210 -0
  426. package/skills/global_config/brag/references/step-4-deliver.md +168 -0
  427. package/skills/global_config/brag/references/tones.md +231 -0
  428. package/skills/global_config/brag/scripts/analyze_music_cues.py +309 -0
  429. package/skills/global_config/brag/scripts/pyproject.toml +14 -0
  430. package/skills/global_config/brag/scripts/uv.lock +819 -0
  431. package/skills/global_config/deja-memory/SKILL.md +42 -0
  432. package/skills/global_config/editable-design/LICENSE +202 -0
  433. package/skills/global_config/editable-design/README.md +34 -0
  434. package/skills/global_config/editable-design/SKILL.md +630 -0
  435. package/skills/global_config/editable-design/THIRD_PARTY_NOTICES.md +10 -0
  436. package/skills/global_config/editable-design/agents/openai.yaml +4 -0
  437. package/skills/global_config/editable-design/assets/editor/layer-editor.css +262 -0
  438. package/skills/global_config/editable-design/assets/editor/layer-editor.js +1929 -0
  439. package/skills/global_config/editable-design/assets/poster-starter/README.md +92 -0
  440. package/skills/global_config/editable-design/assets/poster-starter/assets/.gitkeep +0 -0
  441. package/skills/global_config/editable-design/assets/poster-starter/index.html +91 -0
  442. package/skills/global_config/editable-design/assets/poster-starter/poster.json +6 -0
  443. package/skills/global_config/editable-design/assets/poster-starter/reference/.gitkeep +1 -0
  444. package/skills/global_config/editable-design/assets/replay/icons/assets.png +0 -0
  445. package/skills/global_config/editable-design/assets/replay/icons/html.png +0 -0
  446. package/skills/global_config/editable-design/assets/replay/icons/input.png +0 -0
  447. package/skills/global_config/editable-design/assets/replay/icons/layers.png +0 -0
  448. package/skills/global_config/editable-design/assets/replay/icons/plan.png +0 -0
  449. package/skills/global_config/editable-design/assets/replay/icons/reference.png +0 -0
  450. package/skills/global_config/editable-design/assets/replay/icons/review.png +0 -0
  451. package/skills/global_config/editable-design/assets/replay/index.html +59 -0
  452. package/skills/global_config/editable-design/assets/replay/replay-motion.js +410 -0
  453. package/skills/global_config/editable-design/assets/replay/replay.css +380 -0
  454. package/skills/global_config/editable-design/assets/replay/replay.js +374 -0
  455. package/skills/global_config/editable-design/font-kit/package-lock.json +115 -0
  456. package/skills/global_config/editable-design/font-kit/package.json +19 -0
  457. package/skills/global_config/editable-design/pack.sh +20 -0
  458. package/skills/global_config/editable-design/references/asset-architecture.md +72 -0
  459. package/skills/global_config/editable-design/references/editor-pitfalls.md +70 -0
  460. package/skills/global_config/editable-design/references/editor-runtime.md +131 -0
  461. package/skills/global_config/editable-design/references/font-system.md +89 -0
  462. package/skills/global_config/editable-design/references/imagery.md +145 -0
  463. package/skills/global_config/editable-design/references/layout-typography.md +116 -0
  464. package/skills/global_config/editable-design/references/replay-contract.md +169 -0
  465. package/skills/global_config/editable-design/scripts/_browser.mjs +247 -0
  466. package/skills/global_config/editable-design/scripts/bake.mjs +87 -0
  467. package/skills/global_config/editable-design/scripts/build-replay.mjs +316 -0
  468. package/skills/global_config/editable-design/scripts/check-contract.mjs +293 -0
  469. package/skills/global_config/editable-design/scripts/check-fonts.sh +252 -0
  470. package/skills/global_config/editable-design/scripts/check-poster.sh +70 -0
  471. package/skills/global_config/editable-design/scripts/doctor.sh +78 -0
  472. package/skills/global_config/editable-design/scripts/explode.mjs +115 -0
  473. package/skills/global_config/editable-design/scripts/font-kit.mjs +187 -0
  474. package/skills/global_config/editable-design/scripts/import-asset.sh +23 -0
  475. package/skills/global_config/editable-design/scripts/init-poster.sh +64 -0
  476. package/skills/global_config/editable-design/scripts/install-font-kit.sh +13 -0
  477. package/skills/global_config/editable-design/scripts/package-lock.json +334 -0
  478. package/skills/global_config/editable-design/scripts/package.json +14 -0
  479. package/skills/global_config/editable-design/scripts/remove-chroma-key.py +201 -0
  480. package/skills/global_config/editable-design/scripts/render-poster.sh +202 -0
  481. package/skills/global_config/editable-design/scripts/trace.sh +159 -0
  482. package/skills/global_config/editable-design/scripts/verify-replay.mjs +97 -0
  483. package/skills/global_config/editable-design/scripts/verify.mjs +782 -0
  484. package/skills/global_config/editable-design/scripts/wire-editor.mjs +104 -0
  485. package/skills/global_config/editable-design/tests/fixtures/small-explode/index.html +86 -0
  486. package/skills/global_config/plan-canvas/SKILL.md +8 -0
@@ -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) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' }[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.