@playcraft/cli 0.1.36-beta1 → 0.1.37-beta

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 (366) hide show
  1. package/README.md +58 -3
  2. package/SKILLS_REGISTRY.md +149 -0
  3. package/dist/agent/local-backend.js +1 -1
  4. package/dist/auth/account-activation.js +157 -0
  5. package/dist/auth/messages.js +30 -0
  6. package/dist/cli-root-help.js +2 -0
  7. package/dist/commands/build-all.js +5 -19
  8. package/dist/commands/build-temp.js +26 -0
  9. package/dist/commands/build.js +15 -28
  10. package/dist/commands/create.js +26 -33
  11. package/dist/commands/image.js +2 -6
  12. package/dist/commands/login.js +84 -42
  13. package/dist/commands/platform-skills.generated.js +19 -0
  14. package/dist/commands/playable.js +53 -0
  15. package/dist/commands/skills.js +4 -0
  16. package/dist/commands/tools-3d.js +11 -0
  17. package/dist/commands/tools-batch.js +87 -0
  18. package/dist/commands/tools-generation.js +68 -109
  19. package/dist/commands/tools.js +2 -2
  20. package/dist/commands/video.js +111 -0
  21. package/dist/commands/workspace-runtime.js +54 -0
  22. package/dist/commands/workspace.js +35 -0
  23. package/dist/config.js +59 -4
  24. package/dist/index.js +40 -3
  25. package/dist/project-skills/builtin-import.js +225 -0
  26. package/dist/project-skills/commands.js +77 -0
  27. package/dist/project-skills/lifecycle.js +28 -0
  28. package/dist/project-skills/local-run.js +112 -0
  29. package/dist/project-skills/local-store.js +221 -0
  30. package/dist/project-skills/messages.js +80 -0
  31. package/dist/project-skills/reconcile.js +62 -0
  32. package/dist/project-skills/remote-cache.js +51 -0
  33. package/dist/project-skills/validation.js +19 -0
  34. package/dist/recording/messages.js +40 -0
  35. package/dist/recording/project-digest.js +85 -0
  36. package/dist/recording/recorder.js +293 -0
  37. package/dist/recording/scenario.js +50 -0
  38. package/dist/remix/clone.js +2 -0
  39. package/dist/remix/init-template.js +2 -0
  40. package/dist/remix/pull.js +2 -0
  41. package/dist/remix/push.js +21 -1
  42. package/dist/skill-registry/client.js +345 -0
  43. package/dist/skill-registry/commands.js +180 -0
  44. package/dist/skill-registry/evaluation-client.js +156 -0
  45. package/dist/skill-registry/evaluation-commands.js +174 -0
  46. package/dist/skill-registry/messages.js +177 -0
  47. package/dist/skill-registry/package.js +275 -0
  48. package/dist/skill-registry/platform-package.js +100 -0
  49. package/dist/utils/agent-api-client.js +185 -30
  50. package/dist/utils/environment-endpoints.js +17 -0
  51. package/dist/utils/playcraft-http-client.js +6 -4
  52. package/dist/utils/tool-operation-journal.js +124 -0
  53. package/dist/utils/video-evidence-git.js +81 -0
  54. package/dist/video-replication/client.js +222 -0
  55. package/dist/video-replication/comparison-evidence.js +149 -0
  56. package/dist/video-replication/comparison-files.js +57 -0
  57. package/dist/video-replication/comparison-log.js +72 -0
  58. package/dist/video-replication/comparison-messages.js +104 -0
  59. package/dist/video-replication/comparison-output.js +63 -0
  60. package/dist/video-replication/comparison-preflight.js +66 -0
  61. package/dist/video-replication/comparison.js +216 -0
  62. package/dist/video-replication/evidence.js +165 -0
  63. package/dist/video-replication/media.js +111 -0
  64. package/dist/video-replication/messages.js +89 -0
  65. package/dist/workspace/messages.js +35 -0
  66. package/dist/workspace/transfer-client.js +174 -0
  67. package/dist/workspace-runtime/codex/app-server.js +1040 -0
  68. package/dist/workspace-runtime/codex/compact.js +46 -0
  69. package/dist/workspace-runtime/codex/config-toml.js +107 -0
  70. package/dist/workspace-runtime/codex/jsonrpc-stdio.js +145 -0
  71. package/dist/workspace-runtime/codex/launcher-client.js +177 -0
  72. package/dist/workspace-runtime/codex/loopback.js +146 -0
  73. package/dist/workspace-runtime/codex/mcp-config.js +39 -0
  74. package/dist/workspace-runtime/codex/model-broker.js +263 -0
  75. package/dist/workspace-runtime/codex/native-adapter.js +9 -0
  76. package/dist/workspace-runtime/codex/permissions.js +70 -0
  77. package/dist/workspace-runtime/codex/thread-image.js +38 -0
  78. package/dist/workspace-runtime/codex/ui-instructions.js +4 -0
  79. package/dist/workspace-runtime/codex/ui-tools.js +183 -0
  80. package/dist/workspace-runtime/codex/work-mode.js +15 -0
  81. package/dist/workspace-runtime/main.js +10 -0
  82. package/dist/workspace-runtime/persistence/journal.js +358 -0
  83. package/dist/workspace-runtime/persistence/native-subagents.js +162 -0
  84. package/dist/workspace-runtime/persistence/sqlite-client.js +77 -0
  85. package/dist/workspace-runtime/persistence/sqlite-worker.js +1161 -0
  86. package/dist/workspace-runtime/persistence/stopped-execution.js +77 -0
  87. package/dist/workspace-runtime/previews/output.js +36 -0
  88. package/dist/workspace-runtime/previews/publish.js +262 -0
  89. package/dist/workspace-runtime/previews/single-file.js +43 -0
  90. package/dist/workspace-runtime/processes/managed-writes.js +69 -0
  91. package/dist/workspace-runtime/production/contracts.js +19 -0
  92. package/dist/workspace-runtime/production/controller.js +218 -0
  93. package/dist/workspace-runtime/production/dependencies.js +60 -0
  94. package/dist/workspace-runtime/production/native.js +212 -0
  95. package/dist/workspace-runtime/production/processes.js +102 -0
  96. package/dist/workspace-runtime/production/save-command.js +35 -0
  97. package/dist/workspace-runtime/production/source-archive.js +137 -0
  98. package/dist/workspace-runtime/production/source-copy.js +91 -0
  99. package/dist/workspace-runtime/production/stages.js +303 -0
  100. package/dist/workspace-runtime/production/storage.js +60 -0
  101. package/dist/workspace-runtime/serve.js +214 -0
  102. package/dist/workspace-runtime/server/auth.js +21 -0
  103. package/dist/workspace-runtime/server/connectivity.js +201 -0
  104. package/dist/workspace-runtime/server/desktop-host.js +429 -0
  105. package/dist/workspace-runtime/server/desktop-preview-config.js +81 -0
  106. package/dist/workspace-runtime/server/desktop-preview-service.js +157 -0
  107. package/dist/workspace-runtime/server/desktop-preview-static.js +53 -0
  108. package/dist/workspace-runtime/server/desktop-preview.js +189 -0
  109. package/dist/workspace-runtime/server/dispatch.js +1217 -0
  110. package/dist/workspace-runtime/server/endpoints.js +21 -0
  111. package/dist/workspace-runtime/server/execution-group.js +90 -0
  112. package/dist/workspace-runtime/server/http.js +1243 -0
  113. package/dist/workspace-runtime/server/lock.js +53 -0
  114. package/dist/workspace-runtime/server/rfb-watch-gate.js +168 -0
  115. package/dist/workspace-runtime/server/source-uploader.js +138 -0
  116. package/dist/workspace-runtime/server/terminal-host.js +366 -0
  117. package/dist/workspace-runtime/server/types.js +1 -0
  118. package/dist/workspace-runtime/server/workspace-transfer.js +99 -0
  119. package/dist/workspace-runtime/workspaces/archive.js +207 -0
  120. package/dist/workspace-runtime/workspaces/artifact-events.js +55 -0
  121. package/dist/workspace-runtime/workspaces/artifact-files.js +197 -0
  122. package/dist/workspace-runtime/workspaces/artifact-receipts.js +89 -0
  123. package/dist/workspace-runtime/workspaces/artifacts.js +282 -0
  124. package/dist/workspace-runtime/workspaces/attachment-content.js +123 -0
  125. package/dist/workspace-runtime/workspaces/attachments.js +185 -0
  126. package/dist/workspace-runtime/workspaces/batch-commit.js +142 -0
  127. package/dist/workspace-runtime/workspaces/cli-context.js +23 -0
  128. package/dist/workspace-runtime/workspaces/cli-credentials.js +111 -0
  129. package/dist/workspace-runtime/workspaces/composer-context.js +147 -0
  130. package/dist/workspace-runtime/workspaces/context-error.js +2 -0
  131. package/dist/workspace-runtime/workspaces/dependencies.js +264 -0
  132. package/dist/workspace-runtime/workspaces/developer-command.js +64 -0
  133. package/dist/workspace-runtime/workspaces/directories.js +133 -0
  134. package/dist/workspace-runtime/workspaces/directory-access.js +37 -0
  135. package/dist/workspace-runtime/workspaces/directory-attachments.js +245 -0
  136. package/dist/workspace-runtime/workspaces/directory-maintenance.js +111 -0
  137. package/dist/workspace-runtime/workspaces/directory-stats.js +49 -0
  138. package/dist/workspace-runtime/workspaces/disk-snapshot.js +31 -0
  139. package/dist/workspace-runtime/workspaces/empty-template.js +42 -0
  140. package/dist/workspace-runtime/workspaces/files-search.js +116 -0
  141. package/dist/workspace-runtime/workspaces/files.js +120 -0
  142. package/dist/workspace-runtime/workspaces/git-credential-broker.js +312 -0
  143. package/dist/workspace-runtime/workspaces/git-credential-helper.js +68 -0
  144. package/dist/workspace-runtime/workspaces/git-direct-store.js +155 -0
  145. package/dist/workspace-runtime/workspaces/git.js +670 -0
  146. package/dist/workspace-runtime/workspaces/instructions.js +56 -0
  147. package/dist/workspace-runtime/workspaces/json5-edit.js +170 -0
  148. package/dist/workspace-runtime/workspaces/library-attachments.js +268 -0
  149. package/dist/workspace-runtime/workspaces/optional-platform-skills.js +14 -0
  150. package/dist/workspace-runtime/workspaces/parameters.js +272 -0
  151. package/dist/workspace-runtime/workspaces/prepare.js +278 -0
  152. package/dist/workspace-runtime/workspaces/registry.js +251 -0
  153. package/dist/workspace-runtime/workspaces/remix-references.js +301 -0
  154. package/dist/workspace-runtime/workspaces/revisions.js +31 -0
  155. package/dist/workspace-runtime/workspaces/session-image.js +104 -0
  156. package/dist/workspace-runtime/workspaces/shared-git.js +40 -0
  157. package/dist/workspace-runtime/workspaces/skill-artifact-loader.js +95 -0
  158. package/dist/workspace-runtime/workspaces/skills.js +191 -0
  159. package/dist/workspace-runtime/workspaces/transfer.js +288 -0
  160. package/dist/workspace-runtime/workspaces/turn-changes.js +75 -0
  161. package/dist/workspace-runtime/workspaces/video-attachments.js +49 -0
  162. package/package.json +15 -5
  163. package/project-template/.claude/agents/refs/ta-image-generation-detail.md +123 -67
  164. package/project-template/.claude/skills/playcraft-image-generation/SKILL.md +44 -105
  165. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +33 -42
  166. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +20 -18
  167. package/project-template/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +7 -6
  168. package/project-template/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -36
  169. package/project-template/.claude/skills/playcraft-replica-validation/SKILL.md +25 -0
  170. package/project-template/.claude/skills/playcraft-replica-validation/references/contracts.md +79 -0
  171. package/project-template/.claude/skills/playcraft-video-understanding/SKILL.md +29 -0
  172. package/project-template/.claude/skills/playcraft-video-understanding/references/contracts.md +37 -0
  173. package/project-template-v2/.claude/agents/artist.md +82 -0
  174. package/project-template-v2/.claude/agents/developer.md +153 -0
  175. package/project-template-v2/.claude/agents/game-designer.md +264 -0
  176. package/project-template-v2/.claude/agents/refs/artist-art-style-catalog.md +533 -0
  177. package/project-template-v2/.claude/agents/refs/artist-color-audio-recipes.md +153 -0
  178. package/project-template-v2/.claude/agents/refs/artist-dimension-axis.md +27 -0
  179. package/project-template-v2/.claude/agents/refs/artist-master-composite-recipes.md +208 -0
  180. package/project-template-v2/.claude/agents/refs/atom-skill-library.md +81 -0
  181. package/project-template-v2/.claude/agents/refs/developer-impl-cookbook.md +432 -0
  182. package/project-template-v2/.claude/agents/refs/framework-5-component-filter.md +252 -0
  183. package/project-template-v2/.claude/agents/refs/framework-game-feel-juice.md +266 -0
  184. package/project-template-v2/.claude/agents/refs/framework-mda.md +147 -0
  185. package/project-template-v2/.claude/agents/refs/game-designer-gameplay-sufficiency.md +123 -0
  186. package/project-template-v2/.claude/agents/refs/ta-3d-flip-recipe.md +88 -0
  187. package/project-template-v2/.claude/agents/refs/ta-atlas-deliverable-standard.md +67 -0
  188. package/project-template-v2/.claude/agents/refs/ta-batch-pipeline-recipes.md +120 -0
  189. package/project-template-v2/.claude/agents/refs/ta-image-generation-detail.md +300 -0
  190. package/project-template-v2/.claude/agents/refs/ta-image-ops-reference.md +495 -0
  191. package/project-template-v2/.claude/agents/refs/ta-pipeline-cookbook.md +1141 -0
  192. package/project-template-v2/.claude/agents/refs/ta-tools-reference.md +111 -0
  193. package/project-template-v2/.claude/agents/refs/ta-vfx-preset-catalog.md +365 -0
  194. package/project-template-v2/.claude/agents/refs/threejs-cannon-pitfalls.md +412 -0
  195. package/project-template-v2/.claude/agents/reviewer.md +75 -0
  196. package/project-template-v2/.claude/agents/technical-artist.md +86 -0
  197. package/project-template-v2/.claude/hooks/snapshot-milestone.mjs +243 -0
  198. package/project-template-v2/.claude/hooks/user-prompt.mjs +133 -0
  199. package/project-template-v2/.claude/settings.json +33 -0
  200. package/project-template-v2/.claude/skills/brainstorming/SKILL.md +161 -0
  201. package/project-template-v2/.claude/skills/brainstorming/scripts/frame-template.html +270 -0
  202. package/project-template-v2/.claude/skills/brainstorming/scripts/helper.js +177 -0
  203. package/project-template-v2/.claude/skills/brainstorming/scripts/server.cjs +354 -0
  204. package/project-template-v2/.claude/skills/brainstorming/scripts/start-server.sh +148 -0
  205. package/project-template-v2/.claude/skills/brainstorming/scripts/stop-server.sh +56 -0
  206. package/project-template-v2/.claude/skills/brainstorming/scripts/wait-for-selection.sh +62 -0
  207. package/project-template-v2/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  208. package/project-template-v2/.claude/skills/brainstorming/visual-companion.md +309 -0
  209. package/project-template-v2/.claude/skills/playcraft-ad-psychology/SKILL.md +182 -0
  210. package/project-template-v2/.claude/skills/playcraft-art-style-guide/SKILL.md +123 -0
  211. package/project-template-v2/.claude/skills/playcraft-asset-state-sheet/SKILL.md +205 -0
  212. package/project-template-v2/.claude/skills/playcraft-audio-generation/SKILL.md +280 -0
  213. package/project-template-v2/.claude/skills/playcraft-batch-pipeline/SKILL.md +184 -0
  214. package/project-template-v2/.claude/skills/playcraft-build-optimizer/SKILL.md +306 -0
  215. package/project-template-v2/.claude/skills/playcraft-image-generation/SKILL.md +298 -0
  216. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +123 -0
  217. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +254 -0
  218. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +324 -0
  219. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +97 -0
  220. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +118 -0
  221. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +137 -0
  222. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +397 -0
  223. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +296 -0
  224. package/project-template-v2/.claude/skills/playcraft-image-ops/SKILL.md +122 -0
  225. package/project-template-v2/.claude/skills/playcraft-image-processing/SKILL.md +219 -0
  226. package/project-template-v2/.claude/skills/playcraft-masking/SKILL.md +373 -0
  227. package/project-template-v2/.claude/skills/playcraft-playable-optimization/SKILL.md +161 -0
  228. package/project-template-v2/.claude/skills/playcraft-research/SKILL.md +215 -0
  229. package/project-template-v2/.claude/skills/playcraft-skill-recommender/SKILL.md +382 -0
  230. package/project-template-v2/.claude/skills/playcraft-sprite-generation/SKILL.md +423 -0
  231. package/project-template-v2/.claude/skills/playcraft-sprite-remix/SKILL.md +158 -0
  232. package/project-template-v2/.claude/skills/playcraft-sprite-sheet/SKILL.md +100 -0
  233. package/project-template-v2/.claude/skills/playcraft-storyboard/SKILL.md +167 -0
  234. package/project-template-v2/.claude/skills/playcraft-style-qa/SKILL.md +270 -0
  235. package/project-template-v2/.claude/skills/playcraft-text-rendering/SKILL.md +236 -0
  236. package/project-template-v2/.claude/skills/playcraft-vfx-animation/SKILL.md +130 -0
  237. package/project-template-v2/.claude/skills/playwright-cli/SKILL.md +390 -0
  238. package/project-template-v2/.claude/skills/playwright-cli/references/element-attributes.md +23 -0
  239. package/project-template-v2/.claude/skills/playwright-cli/references/playwright-tests.md +39 -0
  240. package/project-template-v2/.claude/skills/playwright-cli/references/request-mocking.md +87 -0
  241. package/project-template-v2/.claude/skills/playwright-cli/references/running-code.md +240 -0
  242. package/project-template-v2/.claude/skills/playwright-cli/references/session-management.md +226 -0
  243. package/project-template-v2/.claude/skills/playwright-cli/references/spec-driven-testing.md +308 -0
  244. package/project-template-v2/.claude/skills/playwright-cli/references/storage-state.md +275 -0
  245. package/project-template-v2/.claude/skills/playwright-cli/references/test-generation.md +134 -0
  246. package/project-template-v2/.claude/skills/playwright-cli/references/tracing.md +142 -0
  247. package/project-template-v2/.claude/skills/playwright-cli/references/video-recording.md +153 -0
  248. package/project-template-v2/.claude/skills/session-analyzer/SKILL.md +386 -0
  249. package/project-template-v2/.claude/skills/session-analyzer/scripts/execution-breakdown.mjs +182 -0
  250. package/project-template-v2/.claude/skills/session-analyzer/scripts/find-turns.mjs +72 -0
  251. package/project-template-v2/.claude/skills/session-analyzer/scripts/heavy-output.mjs +121 -0
  252. package/project-template-v2/.claude/skills/session-analyzer/scripts/resolve-session.mjs +102 -0
  253. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-stats.mjs +127 -0
  254. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-tool-timeline.mjs +106 -0
  255. package/project-template-v2/.claude/skills/session-analyzer/scripts/time-gaps.mjs +128 -0
  256. package/project-template-v2/.claude/skills/session-analyzer/scripts/turn-timeline.mjs +67 -0
  257. package/project-template-v2/.claude/snapshot.mjs +263 -0
  258. package/project-template-v2/.playcraft/skills.lock.json +152 -0
  259. package/project-template-v2/CLAUDE.md +146 -0
  260. package/project-template-v2/assets/audio/bgm/.gitkeep +0 -0
  261. package/project-template-v2/assets/audio/sfx/.gitkeep +0 -0
  262. package/project-template-v2/assets/bundles/.gitkeep +0 -0
  263. package/project-template-v2/assets/images/bg/.gitkeep +0 -0
  264. package/project-template-v2/assets/images/reference/.gitkeep +0 -0
  265. package/project-template-v2/assets/images/storyboard/.gitkeep +0 -0
  266. package/project-template-v2/assets/images/tiles/.gitkeep +0 -0
  267. package/project-template-v2/assets/images/ui/.gitkeep +0 -0
  268. package/project-template-v2/assets/images/vfx/.gitkeep +0 -0
  269. package/project-template-v2/assets/models/.gitkeep +0 -0
  270. package/project-template-v2/docs/harness/iteration-1/context-flow.md +254 -0
  271. package/project-template-v2/docs/harness/iteration-1/generate-flow.md +91 -0
  272. package/project-template-v2/docs/harness/iteration-1/ideate-flow.md +214 -0
  273. package/project-template-v2/docs/harness/iteration-1/optimize-flow.md +75 -0
  274. package/project-template-v2/docs/harness/iteration-1/wrapup-flow.md +63 -0
  275. package/project-template-v2/docs/harness/iteration-2/context-flow.md +223 -0
  276. package/project-template-v2/docs/harness/iteration-2/generate-flow.md +129 -0
  277. package/project-template-v2/docs/harness/iteration-2/ideate-flow.md +267 -0
  278. package/project-template-v2/docs/harness/iteration-2/optimize-flow.md +164 -0
  279. package/project-template-v2/docs/harness/iteration-2/wrapup-flow.md +115 -0
  280. package/project-template-v2/docs/harness/orchestrator-flow.md +364 -0
  281. package/project-template-v2/docs/project-state.json +60 -0
  282. package/project-template-v2/docs/project-state.md +72 -0
  283. package/project-template-v2/docs/standards/README.md +225 -0
  284. package/project-template-v2/docs/standards/agent-behavior-standards.md +174 -0
  285. package/project-template-v2/docs/standards/artifacts/design-brief.md +19 -0
  286. package/project-template-v2/docs/standards/artifacts/design.md +22 -0
  287. package/project-template-v2/docs/standards/artifacts/game-code.md +41 -0
  288. package/project-template-v2/docs/standards/artifacts/todo-list.md +41 -0
  289. package/project-template-v2/docs/standards/iter1-agent-behavior-standards.md +343 -0
  290. package/project-template-v2/game/index.ts +18 -0
  291. package/project-template-v2/globals.d.ts +51 -0
  292. package/project-template-v2/index.css +34 -0
  293. package/project-template-v2/index.html +18 -0
  294. package/project-template-v2/main.ts +9 -0
  295. package/project-template-v2/package.json +46 -0
  296. package/project-template-v2/skills/_shared/scripts/dispatch-clear.mjs +31 -0
  297. package/project-template-v2/skills/_shared/scripts/dispatch-set.mjs +86 -0
  298. package/project-template-v2/skills/_shared/scripts/dod-check.mjs +153 -0
  299. package/project-template-v2/skills/_shared/scripts/handoff-append.mjs +70 -0
  300. package/project-template-v2/skills/_shared/scripts/lib/validator-artifacts.mjs +91 -0
  301. package/project-template-v2/skills/_shared/scripts/pipeline/dod-config.mjs +131 -0
  302. package/project-template-v2/skills/_shared/scripts/pipeline/index.mjs +80 -0
  303. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-1-core.mjs +90 -0
  304. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-2-wrap.mjs +93 -0
  305. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-3-visual.mjs +23 -0
  306. package/project-template-v2/skills/_shared/scripts/render-project-state.mjs +230 -0
  307. package/project-template-v2/skills/_shared/scripts/state-advance-stage.mjs +58 -0
  308. package/project-template-v2/skills/_shared/scripts/state-get.mjs +339 -0
  309. package/project-template-v2/skills/_shared/scripts/state-handoff.mjs +39 -0
  310. package/project-template-v2/skills/_shared/scripts/state-set.mjs +94 -0
  311. package/project-template-v2/skills/_shared/scripts/state-store.mjs +783 -0
  312. package/project-template-v2/skills/_shared/scripts/todo-add.mjs +88 -0
  313. package/project-template-v2/skills/_shared/scripts/todo-get.mjs +130 -0
  314. package/project-template-v2/skills/_shared/scripts/todo-remove.mjs +33 -0
  315. package/project-template-v2/skills/_shared/scripts/todo-set.mjs +47 -0
  316. package/project-template-v2/skills/_shared/scripts/verify-asset-code-sync.mjs +268 -0
  317. package/project-template-v2/skills/_shared/scripts/verify-env.mjs +285 -0
  318. package/project-template-v2/skills/_shared/scripts/verify-placeholders.mjs +161 -0
  319. package/project-template-v2/skills/playable-autoplay/SKILL.md +176 -0
  320. package/project-template-v2/skills/playable-autoplay/agents/openai.yaml +4 -0
  321. package/project-template-v2/skills/playable-debug/SKILL.md +116 -0
  322. package/project-template-v2/skills/playable-debug/agents/openai.yaml +4 -0
  323. package/project-template-v2/skills/playable-debug/references/debug-config.md +40 -0
  324. package/project-template-v2/skills/playable-record/SKILL.md +140 -0
  325. package/project-template-v2/skills/playable-record/scripts/lib/dev-server.mjs +104 -0
  326. package/project-template-v2/skills/playable-record/scripts/lib/record-audio-bridge.js +141 -0
  327. package/project-template-v2/skills/playable-record/scripts/record-playable.mjs +425 -0
  328. package/project-template-v2/skills/playable-record/scripts/verify-contract.mjs +261 -0
  329. package/project-template-v2/skills/playable-record/scripts/verify-firstwin.mjs +398 -0
  330. package/project-template-v2/skills/playable-record/scripts/verify-fusion.mjs +322 -0
  331. package/project-template-v2/skills/playable-record/scripts/verify-lifecycle.mjs +105 -0
  332. package/project-template-v2/skills/playable-record/scripts/verify-vlm-video.mjs +230 -0
  333. package/project-template-v2/skills/playable-validate/SKILL.md +61 -0
  334. package/project-template-v2/skills/playable-validate/validation-rules.md +14 -0
  335. package/project-template-v2/skills/playable-verify-ui/SKILL.md +63 -0
  336. package/project-template-v2/skills/playable-verify-ui/scripts/lib/__init__.py +1 -0
  337. package/project-template-v2/skills/playable-verify-ui/scripts/lib/config_expr.js +218 -0
  338. package/project-template-v2/skills/playable-verify-ui/scripts/lib/node_utils.js +51 -0
  339. package/project-template-v2/skills/playable-verify-ui/scripts/lib/profile_loader.py +59 -0
  340. package/project-template-v2/skills/playable-verify-ui/scripts/lib/report.py +106 -0
  341. package/project-template-v2/skills/playable-verify-ui/scripts/lib/runtime_contract.js +116 -0
  342. package/project-template-v2/skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py +59 -0
  343. package/project-template-v2/skills/playable-verify-ui/scripts/verify_hardcoded_layout.js +64 -0
  344. package/project-template-v2/skills/playable-verify-ui/scripts/verify_runtime_contract.js +58 -0
  345. package/project-template-v2/skills/playable-verify-ui/scripts/verify_text_overlap.py +333 -0
  346. package/project-template-v2/ta-workspace/scripts/.gitkeep +0 -0
  347. package/project-template-v2/tsconfig.json +20 -0
  348. package/project-template-v2/vite.config.ts +27 -0
  349. package/project-templates/batch-locks/phaser.yaml +922 -0
  350. package/project-templates/batch-locks/threejs.yaml +978 -0
  351. package/project-templates/empty/AGENTS.md +41 -0
  352. package/project-templates/empty/gitignore +33 -0
  353. package/project-templates/phaser/.claude/agents/refs/ta-image-generation-detail.md +59 -59
  354. package/project-templates/phaser/.claude/skills/playcraft-image-generation/SKILL.md +44 -105
  355. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +33 -42
  356. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +20 -18
  357. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +7 -6
  358. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -36
  359. package/project-templates/threejs/.claude/agents/refs/ta-image-generation-detail.md +59 -59
  360. package/project-templates/threejs/.claude/skills/playcraft-image-generation/SKILL.md +44 -105
  361. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +33 -42
  362. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +20 -18
  363. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +7 -6
  364. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -36
  365. package/dist/commands/tools-image-context.js +0 -23
  366. package/dist/utils/image-asset-context.js +0 -105
@@ -1,7 +1,7 @@
1
1
  // ============================================================
2
- // gen-batch-sprite.template.mjs — 精灵图直出脚本模板
2
+ // gen-batch-sprite.template.mjs — gpt-image-2 精灵图直出脚本模板
3
3
  //
4
- // 核心原则:一次 API (Application Programming Interface, 应用程序编程接口) 调用生成包含多个元素的
4
+ // 核心原则:让 gpt-image-2 一次 API 调用直接生成包含多个元素的
5
5
  // 网格精灵图,然后用 sprite-split 切分。比逐个生成效率高 N 倍。
6
6
  //
7
7
  // 适用场景:
@@ -34,11 +34,11 @@ function playcraft(args, { capture = false, timeout } = {}) {
34
34
  // ============ CONFIG — 修改这里 ============
35
35
  const CONFIG = {
36
36
  /**
37
- * 使用 list-image-models 核实本次模型;默认示例为 Image 2.5。
38
- * 用户或制作流程锁定其他模型时填写实际 provider/model。
39
- * 请求使用命令行默认等待时间,不在脚本中提前杀死仍在运行的请求。
37
+ * 精灵图直出模型:永远用 gpt-image-2(图像理解 + 布局能力最强)
38
+ * mulerouter 质量更高(建议作为主模型),iegg 更快(备用)
39
+ * 注意:精灵图生成比单图慢,通常需要 90-150s,timeout 设 240 以上
40
40
  */
41
- model: 'iegg-litellm/gpt-image-2.5-sunburst',
41
+ model: 'mulerouter/gpt-image-2',
42
42
 
43
43
  /**
44
44
  * 每批精灵图的列数
@@ -64,20 +64,21 @@ const CONFIG = {
64
64
  /**
65
65
  * 通用风格描述(追加到每个批次 prompt 末尾)
66
66
  *
67
- * 只填写主体风格与构图,源图背景由下方流程选择。
68
- * 卡牌白色牌面属于主体,应在 items.desc 中描述并设 removeBg=false。
67
+ * 元素需要透明背景(独立元素:角色/车/道具/图标)→ 绿幕策略:
68
+ * style: 'flat 2D illustration, isolated on solid bright green #00FF00 background, centered, no shadow'
69
+ * removeBg: true (切分后逐帧去背景)
70
+ *
71
+ * 元素本身就是矩形(卡牌/棋子/UI 面板)→ 白底策略:
72
+ * style: 'flat 2D, white background, no shadow, no drop shadow, clean edges'
73
+ * removeBg: false
69
74
  */
70
- style: 'flat 2D illustration, isolated subjects, centered, no shadow',
75
+ style: 'flat 2D illustration, isolated on solid bright green #00FF00 background, centered, no shadow',
71
76
  /**
72
- * 最终是否需要透明:true 为独立元素,false 为不透明牌面/场景。
73
- * automatic:整板由工具交付透明,切分后保留,不重复去背。
74
- * chroma:保留色幕中间图,切分后逐格去背;仅限主文第 3 节明确选择的流程。
77
+ * 切分后是否对每帧执行 remove-background(绿幕去背景)
78
+ * true → 独立元素(需透明通道):remove-background --tolerance 25
79
+ * false → 卡牌/UI 面板等矩形元素:直接 resize,不去背景
75
80
  */
76
81
  removeBg: true,
77
- backgroundMode: 'automatic',
78
- /** 独立色幕才使用;按主体颜色选择,金/黄/橙/绿用蓝幕,蓝/紫用绿幕。 */
79
- chromaColor: '#00FF00',
80
- chromaTolerance: 25,
81
82
 
82
83
  /**
83
84
  * 切分单元尺寸(像素)。留空(null)= 自动按精灵图实际像素尺寸 ÷ 网格推导(推荐)。
@@ -118,7 +119,7 @@ const BATCHES = [
118
119
  // ============ 精灵图 Prompt 构建器 ============
119
120
  /**
120
121
  * 根据 items 列表构建精灵图网格 prompt
121
- * 描述网格布局,避免重绘边框或格子标签。
122
+ * 关键词组合让 gpt-image-2 理解"网格布局"意图
122
123
  */
123
124
  /**
124
125
  * 读取精灵图实际像素尺寸(用于自动推导切分单元尺寸)。
@@ -137,7 +138,7 @@ function readSheetDims(sheetPath) {
137
138
  return null;
138
139
  }
139
140
 
140
- function buildSpriteSheetPrompt(items, columns, config) {
141
+ function buildSpriteSheetPrompt(items, columns, style, removeBg) {
141
142
  const actualRows = Math.ceil(items.length / columns);
142
143
  const cellDescs = items.map((item, i) => {
143
144
  const col = (i % columns) + 1;
@@ -145,13 +146,10 @@ function buildSpriteSheetPrompt(items, columns, config) {
145
146
  return `[Row${row},Col${col}]: ${item.desc}`;
146
147
  }).join('; ');
147
148
 
148
- // Image 2.5 由后端组装背景;其他模型首次请求需明确单一干净底色。
149
- const modelId = config.model.trim().split('/').at(-1);
150
- const nativeBackground = /^gpt-image-2\.5(?:$|-)/.test(modelId);
151
- const bgInstruction = !config.removeBg ? '' : config.backgroundMode === 'chroma'
152
- ? `Each element isolated on a uniform solid ${config.chromaColor} background, no shadow, no gradient background.`
153
- : nativeBackground ? ''
154
- : 'Render all foreground elements on a uniform solid pure white background for subsequent background removal. Preserve all elements, text, white details, colors and style.';
149
+ // 绿幕模式强制在 prompt 里明确背景色,避免模型用白底
150
+ const bgInstruction = removeBg
151
+ ? 'Each element isolated on solid bright green #00FF00 background, no shadow, no gradient background.'
152
+ : 'Each element on clean white background.';
155
153
 
156
154
  return [
157
155
  `Sprite sheet grid layout, ${columns} columns × ${actualRows} rows.`,
@@ -159,19 +157,13 @@ function buildSpriteSheetPrompt(items, columns, config) {
159
157
  bgInstruction,
160
158
  `Grid layout, uniform cell size, equal spacing, elements perfectly centered in each cell.`,
161
159
  `No borders between cells, no labels, no numbers on cells.`,
162
- config.style,
163
- ].filter(Boolean).join(' ');
160
+ style,
161
+ ].join(' ');
164
162
  }
165
163
 
166
164
  // ============ LOGIC — 通常不需要修改 ============
167
165
 
168
166
  const LOG_FILE = 'ta-workspace/logs/gen-batch-sprite.log';
169
- if (!['automatic', 'chroma'].includes(CONFIG.backgroundMode)) {
170
- throw new Error('backgroundMode must be automatic or chroma.');
171
- }
172
- if (CONFIG.backgroundMode === 'chroma' && !/^#[\da-f]{6}$/i.test(CONFIG.chromaColor)) {
173
- throw new Error('chromaColor must be one six-digit hex color.');
174
- }
175
167
  mkdirSync(CONFIG.sheetDir, { recursive: true });
176
168
  mkdirSync(CONFIG.outputDir, { recursive: true });
177
169
  mkdirSync('ta-workspace/logs', { recursive: true });
@@ -198,7 +190,7 @@ for (let bi = 0; bi < BATCHES.length; bi++) {
198
190
  log(`[SKIP-SHEET] (${bi + 1}/${BATCHES.length}) ${batch.sheetName} already exists`);
199
191
  } else {
200
192
  log(`[GEN-SHEET ] (${bi + 1}/${BATCHES.length}) Generating ${batch.sheetName} (${batch.items.length} elements)`);
201
- const prompt = buildSpriteSheetPrompt(batch.items, CONFIG.columns, CONFIG);
193
+ const prompt = buildSpriteSheetPrompt(batch.items, CONFIG.columns, CONFIG.style, CONFIG.removeBg);
202
194
 
203
195
  try {
204
196
  playcraft(
@@ -208,9 +200,9 @@ for (let bi = 0; bi < BATCHES.length; bi++) {
208
200
  '--output', sheetPath,
209
201
  '--aspect-ratio', CONFIG.aspectRatio,
210
202
  '--image-model', CONFIG.model,
211
- CONFIG.removeBg && CONFIG.backgroundMode === 'automatic'
212
- ? '--remove-background' : '--no-remove-background',
203
+ '--timeout', '240',
213
204
  ],
205
+ { timeout: 300_000 },
214
206
  );
215
207
  log(`[OK-SHEET ] ${batch.sheetName}`);
216
208
  } catch (e) {
@@ -277,11 +269,10 @@ for (let bi = 0; bi < BATCHES.length; bi++) {
277
269
  continue;
278
270
  }
279
271
 
280
- // ── Step 3: 保留自动透明结果;独立色幕才逐格去背 ────────────────
272
+ // ── Step 3: 重命名(+可选绿幕去背景)切分结果到最终位置 ─────────
281
273
  // 任何缺帧 / 处理失败都视为该批次失败(FAIL,不是 WARN):一个不完整的
282
274
  // 批次绝不能被报成 OK-BATCH,否则下游会拿到缺图的资产集。
283
- const removeCellBackground = CONFIG.removeBg && CONFIG.backgroundMode === 'chroma';
284
- log(`[RENAME ] Renaming ${batch.items.length} cells${removeCellBackground ? ' + remove-background' : ''}`);
275
+ log(`[RENAME ] Renaming ${batch.items.length} cells${CONFIG.removeBg ? ' + remove-background' : ''}`);
285
276
  let processedOk = 0;
286
277
  let batchFailed = false;
287
278
  for (let j = 0; j < batch.items.length; j++) {
@@ -298,13 +289,13 @@ for (let bi = 0; bi < BATCHES.length; bi++) {
298
289
  continue;
299
290
  }
300
291
  try {
301
- if (removeCellBackground) {
302
- // 只处理独立色幕,保留常规工具已经交付的透明边缘。
292
+ if (CONFIG.removeBg) {
293
+ // 绿幕去背景(tolerance 25 适合纯绿色 #00FF00 背景)
303
294
  playcraft([
304
295
  'image', 'remove-background',
305
296
  '--input', srcPath,
306
297
  '--output', dstPath,
307
- '--tolerance', String(CONFIG.chromaTolerance),
298
+ '--tolerance', '25',
308
299
  ]);
309
300
  } else {
310
301
  copyFileSync(srcPath, dstPath);
@@ -1,5 +1,5 @@
1
1
  // ============================================================
2
- // gen-batch.template.mjs — 批量 AI (Artificial Intelligence, 人工智能) 生图脚本模板
2
+ // gen-batch.template.mjs — 批量 AI 生图脚本模板
3
3
  // 用途:从零批量生成一组风格一致的素材(reference-image 模式)
4
4
  //
5
5
  // 使用方式:
@@ -8,18 +8,22 @@
8
8
  // 3. node ta-workspace/scripts/gen-<name>.mjs
9
9
  // ============================================================
10
10
 
11
- import { execFileSync } from 'child_process';
11
+ import { execSync } from 'child_process';
12
12
  import { existsSync, mkdirSync, appendFileSync } from 'fs';
13
13
 
14
14
  // ============ CONFIG — 修改这里 ============
15
15
  const CONFIG = {
16
16
  /**
17
17
  * 生图模型。
18
- * 先 list-image-models,再填写本次实际模型;普通素材优先 Image 2.5。
19
- * 用户或制作流程锁定其他模型时保留其选择。
20
- * 参考图要求模型支持 text+image 或 image→image。
18
+ * - Phase 1 概念图(追求质量):用 gpt-image-2
19
+ * model: 'iegg-litellm/gpt-image-2'
20
+ * - Phase 2 批量(reference-image 一致性):用 google/,更稳定
21
+ * model: 'google/gemini-3.1-flash-image-preview'
22
+ *
23
+ * 后端按优先级自动 fallback 多个 provider,无需手动指定 provider。
24
+ * text+image CAPABILITY 的模型才支持 --reference-image
21
25
  */
22
- model: 'iegg-litellm/gpt-image-2.5-sunburst',
26
+ model: 'google/gemini-3.1-flash-image-preview',
23
27
  /** 概念图路径(确认过风格的样本,所有后续图的参考来源) */
24
28
  referenceImage: 'assets/images/concept/approved_sample.png',
25
29
  /** 输出目录 */
@@ -28,11 +32,9 @@ const CONFIG = {
28
32
  aspectRatio: '1:1',
29
33
  /**
30
34
  * 统一风格描述(从 design-brief.md 复制,粘贴到每个 prompt 末尾)
31
- * 示例:"flat 2D icon, vibrant colors, clean edges, no shadow"
35
+ * 示例:"flat 2D icon, vibrant colors, clean edges, white background, no shadow"
32
36
  */
33
37
  style: '<从 design-brief 复制的统一风格描述>',
34
- /** 最终透明设 true;完整场景或不透明牌面设 false。独立色幕使用精灵图模板。 */
35
- removeBackground: true,
36
38
  };
37
39
  // ============ DATA — 定义要生成的素材列表 ============
38
40
  const ITEMS = [
@@ -70,17 +72,17 @@ for (let i = 0; i < ITEMS.length; i++) {
70
72
 
71
73
  log(`[GEN ] (${i + 1}/${ITEMS.length}) ${item.name}`);
72
74
 
73
- const nativeBackground = /^gpt-image-2\.5(?:$|-)/.test(CONFIG.model.trim().split('/').at(-1));
74
- const sourceBackground = CONFIG.removeBackground && !nativeBackground
75
- ? 'on a uniform solid pure white background for subsequent background removal' : '';
76
- const prompt = [item.desc, CONFIG.style, sourceBackground].filter(Boolean).join('. ');
77
- const args = ['tools', 'generate-image', '--prompt', prompt, '--output', outPath,
78
- '--aspect-ratio', CONFIG.aspectRatio, '--image-model', CONFIG.model,
79
- CONFIG.removeBackground ? '--remove-background' : '--no-remove-background'];
80
- if (CONFIG.referenceImage) args.push('--reference-image', CONFIG.referenceImage);
75
+ const promptEscaped = `${item.desc}. ${CONFIG.style}`.replace(/"/g, '\\"');
76
+ const cmd =
77
+ `playcraft tools generate-image` +
78
+ ` --prompt "${promptEscaped}"` +
79
+ ` --output "${outPath}"` +
80
+ ` --aspect-ratio ${CONFIG.aspectRatio}` +
81
+ ` --reference-image "${CONFIG.referenceImage}"` +
82
+ ` --image-model "${CONFIG.model}"`;
81
83
 
82
84
  try {
83
- execFileSync('playcraft', args, { stdio: 'inherit' });
85
+ execSync(cmd, { stdio: 'inherit', timeout: 120_000 });
84
86
  done++;
85
87
  log(`[OK ] ${item.name}`);
86
88
  } catch (e) {
@@ -8,9 +8,10 @@
8
8
  // 3. node ta-workspace/scripts/process-<name>.mjs
9
9
  //
10
10
  // 背景处理决策(修改 CONFIG.skipRemoveBg 前请阅读):
11
- // - 常规工具已验证透明 / 不透明牌面或场景 → skipRemoveBg = true(默认)
12
- // - 明确选择的独立色幕中间图 → skipRemoveBg = false,按主文第 3 节选择色幕
13
- // 生成中间图时用 --no-remove-background,最终去背后验证透明边缘
11
+ // - 独立元素(角色/道具/图标)需透明背景 → skipRemoveBg = false(默认)
12
+ // 建议生图时 prompt 加 "on solid bright green #00FF00 background, isolated"
13
+ // - 卡牌/棋子/UI面板(矩形本体不需透明)→ skipRemoveBg = true
14
+ // 生图时 prompt 加 "flat 2D, no shadow, no 3D effect, clean edges"
14
15
  // ============================================================
15
16
 
16
17
  import { execSync } from 'child_process';
@@ -31,10 +32,10 @@ const CONFIG = {
31
32
  targetH: 128,
32
33
  /**
33
34
  * 跳过去背景步骤
34
- * - true(默认):保留已验证透明的结果或不透明牌面/场景,不重复去背
35
- * - false:仅对独立色幕中间图执行 remove-background
35
+ * - false(默认):执行 remove-background(绿幕素材/独立元素)
36
+ * - true:跳过,只做 trim + resize(卡牌/棋子等矩形本体素材)
36
37
  */
37
- skipRemoveBg: true,
38
+ skipRemoveBg: false,
38
39
  /**
39
40
  * floodfill 容差(0–255)
40
41
  * 绿幕背景建议 25;默认白背景可用 15
@@ -1,23 +1,21 @@
1
1
  # Image Generation Prompt Cookbook
2
2
 
3
- > 适用于 PlayCraft CLI (Command-Line Interface, 命令行工具) `playcraft tools generate-image` 及沙箱生图工具。
3
+ > 适用于 PlayCraft CLI `playcraft tools generate-image`。
4
4
  > 所有模型均适用;gpt-image-2 类模型对英文 prompt 理解最准确,优先写英文。
5
5
 
6
- 透明交付通过 `removeBackground: true` / `--remove-background` 或目标字段配置表达。下方常规前景模板描述主体、文字、风格、构图与材质;源图背景遵循主文第 2 节:Image 2.5 由后端组装,不追加背景后缀;明确选用其他模型时,首次请求需追加单一 `on a uniform solid pure white background for subsequent background removal`。不要同时要求透明、白底与色幕。完整场景可以描述背景内容,矩形本体的白色牌面也应保留。独立色幕流程见主文第 3 节,中间图必须关闭自动去背。
7
-
8
6
  ---
9
7
 
10
8
  ## 一、Prompt 万能公式
11
9
 
12
10
  ```
13
- [主体描述] + [风格/介质] + [构图/视角] + [场景内容(如需要)] + [质量修饰词]
11
+ [主体描述] + [风格/介质] + [构图/视角] + [背景] + [质量修饰词]
14
12
  ```
15
13
 
16
14
  **示例**:
17
15
 
18
16
  ```
19
17
  A golden sword icon, flat 2D vector style, centered composition,
20
- isolated subject, clean crisp edges, game UI asset, high quality
18
+ white background, clean crisp edges, game UI asset, high quality
21
19
  ```
22
20
 
23
21
  ---
@@ -28,13 +26,12 @@ isolated subject, clean crisp edges, game UI asset, high quality
28
26
 
29
27
  ```
30
28
  A [物品名] icon, flat 2D vector illustration, bold outlines,
31
- vibrant colors, centered composition, isolated subject,
29
+ vibrant colors, centered composition, white background,
32
30
  no shadow, no gradient, game UI style, sharp crisp edges
33
31
  ```
34
32
 
35
33
  - 关键词:`flat 2D` / `bold outlines` / `centered` / `no shadow` / `game UI style`
36
34
  - 避免:`3D` / `realistic` / `photographic` / `drop shadow`
37
- - 需要透明交付时传 `removeBackground: true` / `--remove-background`。
38
35
 
39
36
  ### 🃏 卡牌 / 棋子 / 方块(Rectangular Tiles)
40
37
 
@@ -53,11 +50,12 @@ sharp clean edges, centered on white background
53
50
  ```
54
51
  A [角色描述] character, full body visible, game sprite style,
55
52
  [艺术风格: pixel art / cartoon / chibi / realistic],
56
- isolated subject,
53
+ isolated on solid bright green #00FF00 background,
57
54
  centered, facing forward / side view, clean silhouette
58
55
  ```
59
56
 
60
- - 需要透明交付 → `removeBackground: true` / `--remove-background`,按主文第 2 节准备源图背景,由后端去背并完成验收。
57
+ - 需要透明背景 → **绿幕策略**,prompt 加 `"on solid bright green #00FF00 background, isolated"`
58
+ - 后处理:`remove-background --tolerance 25`
61
59
 
62
60
  ### 🌄 场景背景(Backgrounds)
63
61
 
@@ -122,7 +120,7 @@ Grid layout, equal cell size, no borders between cells. Bold black ink for spade
122
120
  **图标集示例**(一批 9 个图标):
123
121
 
124
122
  ```
125
- Sprite sheet grid, 3 columns × 3 rows. Flat 2D game icon style, isolated subjects.
123
+ Sprite sheet grid, 3 columns × 3 rows. Flat 2D game icon style, white background.
126
124
  [Row1,Col1]: sword icon; [Row1,Col2]: shield icon; [Row1,Col3]: bow and arrow icon;
127
125
  [Row2,Col1]: magic staff icon; [Row2,Col2]: potion bottle icon; [Row2,Col3]: scroll icon;
128
126
  [Row3,Col1]: coin gold icon; [Row3,Col2]: gem diamond icon; [Row3,Col3]: key icon.
@@ -131,17 +129,17 @@ Each icon centered in its cell, bold outlines, vibrant colors, no shadow.
131
129
 
132
130
  **背景选择(重要!)**:
133
131
 
134
- | 素材类型 | 交付要求 | 切分后处理 |
135
- | ----------------------------------- | ------------------------------------------------ | -------------------------------- |
136
- | 独立元素(角色/车/道具/图标)需透明 | `--remove-background`,按主文第 2 节准备源图背景 | 保留透明通道,验证每格前景与边缘 |
137
- | 卡牌/棋子/UI 面板(矩形本体) | `--no-remove-background`,保留白色牌面 | 直接 resize,不去背景 |
132
+ | 素材类型 | prompt 背景写法 | 切分后处理 |
133
+ | ----------------------------------- | --------------------------------------------------- | ---------------------------------- |
134
+ | 独立元素(角色/车/道具/图标)需透明 | `isolated on solid bright green #00FF00 background` | `remove-background --tolerance 25` |
135
+ | 卡牌/棋子/UI 面板(矩形本体) | `white background, no shadow` | 直接 resize,不去背景 |
138
136
 
139
137
  **注意事项**:
140
138
 
141
139
  - 每批最多 **4×4 = 16 个元素**,超过会出现混乱
142
140
  - 每个格的描述要精确,包含特征性视觉元素
143
141
  - 切分后用 `sprite-split --rows N --columns M` 按网格切分
144
- - 模板:[gen-batch-sprite.template.mjs](gen-batch-sprite.template.mjs):`backgroundMode='automatic'` 为常规流程,`removeBg` 表示最终是否透明。独立色幕需显式设 `backgroundMode='chroma'`、所选模型和色幕颜色;脚本关闭整板自动去背,切分后逐格去背。
142
+ - 模板:[gen-batch-sprite.template.mjs](gen-batch-sprite.template.mjs)
145
143
 
146
144
  ---
147
145
 
@@ -185,7 +183,7 @@ gpt-image-2 是目前质量最高的文生图模型,prompt 套路略有不同
185
183
  - **英文 prompt 效果最佳**,中文理解也不错但英文更稳定
186
184
  - 对**复杂场景**、**细节描述**处理能力远超其他模型
187
185
  - 支持**图生图 edit 模式**(传 `--reference-image`),局部编辑能力强
188
- - 不支持原生透明 PNG (Portable Network Graphics, 便携式网络图形) 输出(ALPHA = no);透明交付仍由工具后处理。明确选择独立色幕制作时再按主文第 3 节处理。
186
+ - 不支持透明 PNG 输出(ALPHA = no),需绿幕策略
189
187
 
190
188
  ### prompt 格式建议
191
189
 
@@ -272,8 +270,6 @@ playcraft tools generate-image \
272
270
  >
273
271
  > 注意:`figer_icon.aiimage`、`win_result_panel.aiimage` 等 atom Skills 提供了带参考图的生成配方,Game Designer `playcraft skills match` 能匹配到时优先使用。本节模板用于无对应 atom Skill 的场景。
274
272
 
275
- 下方独立界面前景通过 `removeBackground: true` / `--remove-background` 要求最终透明;模板描述主体,调用前按主文第 2 节补充适用于所选模型的源图背景。
276
-
277
273
  ### 🟠 CTA 按钮(Call-to-Action Button)
278
274
 
279
275
  ```
@@ -284,13 +280,13 @@ Important details: [bright orange / gold / green] gradient fill,
284
280
  subtle drop shadow below button, glossy highlight on top edge,
285
281
  3px white inner border, corners rounded radius 24px
286
282
  Use case: Game ad install button, isolated asset, HTML5 playable ad
287
- Constraints: No extra elements, centered, clean crisp edges,
283
+ Constraints: Transparent background, no extra elements, centered, clean crisp edges,
288
284
  no watermark
289
285
  ```
290
286
 
291
287
  - CTA 颜色必须是游戏画面中**最少使用**的颜色(对比稀缺性原则)
292
288
  - 触控目标区域 ≥ 48×48px,生成建议尺寸 360×120px(9:3 比例)
293
- - 后处理由工具完成,验证最终透明背景、文字与边缘。
289
+ - 后处理:不需要去背景(直接生成透明背景或用绿幕)
294
290
 
295
291
  ---
296
292
 
@@ -303,7 +299,7 @@ Important details: [color] filled portion [80% of total width], unfilled portion
303
299
  rounded end caps, thin outer frame in [darker shade],
304
300
  optional inner glow on filled section
305
301
  Use case: Game HUD progress indicator, isolated UI element
306
- Constraints: Horizontal orientation, no text labels,
302
+ Constraints: Transparent background, horizontal orientation, no text labels,
307
303
  clean edges, no watermark
308
304
  ```
309
305
 
@@ -321,7 +317,8 @@ Important details: warm skin tone, white sleeve cuff visible at wrist,
321
317
  soft drop shadow beneath finger tip, friendly approachable style,
322
318
  [optional: subtle animated glow ring around fingertip]
323
319
  Use case: Tutorial overlay tap gesture for playable ad, points toward target element
324
- Constraints: No extra limbs or elements, finger pointing at bottom-center
320
+ Constraints: Transparent background, PNG with alpha channel,
321
+ no extra limbs or elements, finger pointing at bottom-center
325
322
  ```
326
323
 
327
324
  **箭头变体**(更简洁):
@@ -331,7 +328,7 @@ Subject: Bold cartoon arrow pointing [down / right], game tutorial UI
331
328
  Style: flat 2D, thick outline 4px, rounded arrowhead
332
329
  Important details: [bright yellow / white] fill, [dark outline],
333
330
  slight perspective tilt for depth, attention-grabbing
334
- Constraints: Single clean arrow shape, no text
331
+ Constraints: Transparent background, single clean arrow shape, no text
335
332
  ```
336
333
 
337
334
  ---
@@ -345,7 +342,7 @@ Important details: white or [light color] fill, [2–3px] dark outline,
345
342
  tail pointing [down-left / down-center], interior empty for text overlay,
346
343
  subtle inner shadow or gradient
347
344
  Use case: Game tutorial hint tooltip, isolated UI asset
348
- Constraints: No text inside, clean edges,
345
+ Constraints: Transparent background, no text inside, clean edges,
349
346
  no watermark, no extra decorations
350
347
  ```
351
348
 
@@ -365,7 +362,7 @@ Important details: [treasure chest]: lid slightly ajar, golden glow escaping fro
365
362
  [gold coins]: scattered pile, gleaming highlights, not neatly stacked (implies uncollected);
366
363
  [gem crystal]: large, brilliant facets, floating above ground, clearly valuable
367
364
  Use case: EndCard reward visual, creates FOMO and drives install
368
- Constraints: Centered, isolated subject,
365
+ Constraints: Transparent background, centered, isolated subject,
369
366
  no CTA text (added separately), warm celebratory lighting
370
367
  ```
371
368
 
@@ -376,19 +373,25 @@ Constraints: Centered, isolated subject,
376
373
 
377
374
  ### 📊 UI 元素背景处理规则速查
378
375
 
379
- CTA 按钮、进度条、引导手势、对话气泡与 EndCard 奖励图标都通过 `removeBackground: true` / `--remove-background` 要求最终透明;主体内容使用上述模板,源图背景按主文第 2 节准备。交付后验证文字、完整前景及深浅背景上的边缘。独立色幕制作沿用主文第 3 节的单一背景与独立去背流程。
376
+ | UI 元素类型 | prompt 背景写法 | 后处理 |
377
+ | ---------------- | ----------------------------------------------- | ------------------------------ |
378
+ | CTA 按钮 | `transparent background` 或绿幕 | floodfill 去背 |
379
+ | 进度条 | `transparent background` 或绿幕 | floodfill 去背 |
380
+ | 引导手势 | `transparent background, PNG with alpha` | floodfill 去背(tolerance 25) |
381
+ | 对话气泡 | `transparent background` 或绿幕 | floodfill 去背 |
382
+ | EndCard 奖励图标 | 绿幕(`solid bright green #00FF00 background`) | floodfill 去背(tolerance 25) |
380
383
 
381
384
  ---
382
385
 
383
386
  ## 六、常见问题 & 修正方案
384
387
 
385
- | 问题 | 原因 | 修正 |
386
- | ------------------ | -------------------- | ------------------------------------------------------------------------ |
387
- | 图标边缘有阴影 | 模型默认加立体效果 | 加 `no shadow, no drop shadow, flat 2D` |
388
- | 构图不居中 | 没有明确指定 | 加 `centered composition, subject centered` |
389
- | 背景不干净 | 交付要求或处理不匹配 | 核对背景开关、字段配置及模型对应的源图规则;检查最终验收,不混加背景要求 |
390
- | 多个物体出现 | 主体不够明确 | 加 `a single [物体]`, `only one [物体]` |
391
- | 文字拼写错误 | 所有模型通病 | 尝试 gpt-image-2(最好),或多生成几张 |
392
- | 风格不一致(批量) | 没用 reference image | Phase 2 必须加 `--reference-image` |
393
- | 细节过于复杂 | 素材尺寸小但细节太多 | 加 `simple design, minimal details, bold shapes` |
394
- | 生成极慢/超时 | 模型负载高 | 换另一个 provider 或换模型 |
388
+ | 问题 | 原因 | 修正 |
389
+ | ------------------ | -------------------- | ------------------------------------------------ |
390
+ | 图标边缘有阴影 | 模型默认加立体效果 | 加 `no shadow, no drop shadow, flat 2D` |
391
+ | 构图不居中 | 没有明确指定 | 加 `centered composition, subject centered` |
392
+ | 背景不干净 | 背景描述不够明确 | 加 `solid white background, isolated` 或绿幕策略 |
393
+ | 多个物体出现 | 主体不够明确 | 加 `a single [物体]`, `only one [物体]` |
394
+ | 文字拼写错误 | 所有模型通病 | 尝试 gpt-image-2(最好),或多生成几张 |
395
+ | 风格不一致(批量) | 没用 reference image | Phase 2 必须加 `--reference-image` |
396
+ | 细节过于复杂 | 素材尺寸小但细节太多 | 加 `simple design, minimal details, bold shapes` |
397
+ | 生成极慢/超时 | 模型负载高 | 换另一个 provider 或换模型 |
@@ -1,23 +0,0 @@
1
- import { readImageAssetContext } from '../utils/image-asset-context.js';
2
- import { collectReferenceImagePaths, handleError } from './tools-utils.js';
3
- export function registerImageContextCommand(tools) {
4
- tools.command('image-context')
5
- .description('Read image asset reference and delivery constraints locally; does not generate an image')
6
- .requiredOption('--asset-path <path>', 'Existing image asset path relative to the project')
7
- .option('--reference-image <path>', 'Explicit local reference; may be repeated', collectReferenceImagePaths, [])
8
- .option('--no-target-reference', 'Do not use the target schema or current asset as a reference')
9
- .option('--prompt <text>', 'Generation request used to resolve background intent')
10
- .option('--remove-background', 'Explicitly request verified transparency')
11
- .option('--no-remove-background', 'Explicitly keep an opaque background')
12
- .action(async (opts) => {
13
- try {
14
- console.log(JSON.stringify(await readImageAssetContext(opts.assetPath, process.cwd(), {
15
- referenceImagePaths: opts.referenceImage, useTargetReference: opts.targetReference,
16
- prompt: opts.prompt, removeBackground: opts.removeBackground,
17
- })));
18
- }
19
- catch (error) {
20
- handleError(error);
21
- }
22
- });
23
- }
@@ -1,105 +0,0 @@
1
- import { existsSync, readFileSync, realpathSync } from 'node:fs';
2
- import path from 'node:path';
3
- import JSON5 from 'json5';
4
- import sharp from 'sharp';
5
- import { extractAssetFields, getByPath, resolveAiImageTargetConstraints, resolveImageBackgroundRequirement, THEME_SCHEMA_PATH, themeDataPath, } from '@playcraft/common/prefab';
6
- /** Resolve only real files in this project, including legacy /project aliases. */
7
- function projectFile(root, input) {
8
- const mapped = input.startsWith('/project/') ? input.slice('/project/'.length) : input;
9
- const file = path.resolve(root, mapped);
10
- const prefix = path.resolve(root) + path.sep;
11
- if (!file.startsWith(prefix))
12
- throw new Error(`Image asset path is outside the project: ${input}`);
13
- const real = realpathSync(file);
14
- if (!real.startsWith(realpathSync(root) + path.sep))
15
- throw new Error(`Image asset symlink is outside the project: ${input}`);
16
- return file;
17
- }
18
- /** Read the same per-field constraints used by the asset image dialog. */
19
- export async function readImageAssetContext(assetPath, projectDir = process.cwd(), options = {}) {
20
- const root = path.resolve(projectDir);
21
- const target = projectFile(root, assetPath);
22
- const relativeTarget = path.relative(root, target).replace(/\\/g, '/');
23
- const themeMatch = relativeTarget.match(/^src\/theme\/([^/]+)\/assets\//);
24
- let field;
25
- const schemaFile = path.join(root, THEME_SCHEMA_PATH);
26
- if (themeMatch && existsSync(schemaFile)) {
27
- const schema = JSON5.parse(readFileSync(projectFile(root, THEME_SCHEMA_PATH), 'utf8'));
28
- const dataPath = themeDataPath(themeMatch[1]);
29
- const data = existsSync(path.join(root, dataPath))
30
- ? JSON5.parse(readFileSync(projectFile(root, dataPath), 'utf8')) : {};
31
- const themeRoot = path.dirname(path.join(root, dataPath));
32
- const matches = extractAssetFields(schema, data).filter(candidate => {
33
- let configured = getByPath(data, candidate.path);
34
- if (configured === undefined && ['gameplay', 'gamePlay'].includes(candidate.path[0])) {
35
- configured = getByPath(data, [candidate.path[0] === 'gameplay' ? 'gamePlay' : 'gameplay', ...candidate.path.slice(1)]);
36
- }
37
- const value = typeof configured === 'string' ? configured : candidate.schema.default;
38
- if (typeof value !== 'string' || /^https?:\/\//i.test(value))
39
- return false;
40
- return path.resolve(themeRoot, value) === target;
41
- });
42
- if (matches.length > 1)
43
- throw new Error('Multiple image fields use this asset; specify an unambiguous target asset.');
44
- field = matches[0];
45
- if (!field)
46
- throw new Error(`No image schema field matches ${relativeTarget}; check theme.data.json5 before generating.`);
47
- }
48
- const xp = field?.schema.xplatform;
49
- const ext = xp?.ext;
50
- // Schema references follow the dialog's root/theme conventions; explicit tool paths do not change.
51
- const schemaReferences = Array.isArray(ext?.reference_image)
52
- ? ext.reference_image.filter(ref => typeof ref === 'string' && ref.trim()).map(ref => {
53
- const raw = ref.trim().replace(/\\/g, '/');
54
- const normalized = raw.replace(/^\.\/+/, '').replace(/^\/+/, '').replace(/\/{2,}/g, '/');
55
- if (/^\/?(?:assets|src|public)\//.test(raw) || normalized.startsWith('src/'))
56
- return normalized;
57
- if (!themeMatch || path.isAbsolute(raw) || /^https?:\/\//i.test(raw))
58
- return raw;
59
- return path.posix.join('src/theme', themeMatch[1], normalized);
60
- }) : [];
61
- const referenceImagePaths = options.referenceImagePaths?.length ? options.referenceImagePaths
62
- : options.useTargetReference === false ? [] : schemaReferences.length ? schemaReferences : [relativeTarget];
63
- if (referenceImagePaths.length > 8)
64
- throw new Error('At most 8 reference images are allowed.');
65
- for (const ref of referenceImagePaths) {
66
- if (/^https?:\/\//i.test(ref))
67
- throw new Error('Download the schema reference into the project before generating.');
68
- await sharp(projectFile(root, ref)).metadata();
69
- }
70
- const targetMeta = await sharp(target).metadata();
71
- const hasSchemaBackground = typeof ext?.remove_background === 'boolean';
72
- const targetStats = !hasSchemaBackground && targetMeta.hasAlpha ? await sharp(target).stats() : undefined;
73
- const targetHasTransparency = !!targetStats && targetStats.channels.at(-1).min < 250;
74
- const removeBackground = resolveImageBackgroundRequirement({
75
- prompt: options.prompt ?? '',
76
- schemaRemoveBackground: hasSchemaBackground ? ext.remove_background : undefined,
77
- removeBackground: options.removeBackground,
78
- fallbackRemoveBackground: targetHasTransparency,
79
- });
80
- const delivery = resolveAiImageTargetConstraints({
81
- schemaResolution: ext?.resolution,
82
- schemaMimeType: xp?.mime_type,
83
- schemaFitMode: xp?.fit_mode ?? ext?.fit_mode,
84
- schemaRemoveBackground: removeBackground,
85
- schemaPaddingColor: ext?.padding_color,
86
- assetPath: relativeTarget,
87
- referenceWidth: targetMeta.width,
88
- referenceHeight: targetMeta.height,
89
- referenceFormat: targetMeta.format,
90
- });
91
- if (!['png', 'webp', 'jpeg'].includes(delivery.format))
92
- throw new Error('Unsupported image delivery format; use a dedicated animation or vector workflow.');
93
- return {
94
- targetAssetPath: relativeTarget,
95
- fieldPath: field?.path,
96
- referenceImagePaths,
97
- width: delivery.width, height: delivery.height,
98
- aspectRatio: typeof ext?.ratio === 'string' ? ext.ratio : `${delivery.width}:${delivery.height}`,
99
- outputFormat: (removeBackground && delivery.format === 'jpeg' && !delivery.fromSchemaMimeType
100
- ? 'png' : delivery.format),
101
- fitMode: delivery.fitMode, removeBackground: delivery.removeBackground, paddingColor: delivery.paddingColor,
102
- removeBackgroundFromSchema: hasSchemaBackground,
103
- imageModelRef: typeof ext?.imageModelRef === 'string' ? ext.imageModelRef : undefined,
104
- };
105
- }