@playcraft/cli 0.0.57 → 0.0.58

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 (225) hide show
  1. package/README.md +34 -16
  2. package/dist/cli-root-help.js +1 -0
  3. package/dist/commands/build-all.js +10 -9
  4. package/dist/commands/build.js +13 -12
  5. package/dist/commands/create.js +26 -33
  6. package/dist/commands/platform-skills.generated.js +19 -0
  7. package/dist/commands/skills.js +2 -0
  8. package/dist/commands/tools-generation.js +1 -1
  9. package/dist/commands/workspace-runtime.js +54 -0
  10. package/dist/index.js +3 -1
  11. package/dist/project-skills/commands.js +72 -0
  12. package/dist/project-skills/lifecycle.js +28 -0
  13. package/dist/project-skills/local-run.js +112 -0
  14. package/dist/project-skills/local-store.js +149 -0
  15. package/dist/project-skills/messages.js +72 -0
  16. package/dist/project-skills/reconcile.js +62 -0
  17. package/dist/project-skills/remote-cache.js +51 -0
  18. package/dist/project-skills/validation.js +19 -0
  19. package/dist/remix/clone.js +2 -0
  20. package/dist/remix/init-template.js +2 -0
  21. package/dist/remix/pull.js +2 -0
  22. package/dist/remix/push.js +21 -1
  23. package/dist/utils/agent-api-client.js +54 -17
  24. package/dist/utils/tool-operation-journal.js +54 -0
  25. package/dist/workspace-runtime/codex/app-server.js +395 -0
  26. package/dist/workspace-runtime/codex/config-toml.js +25 -0
  27. package/dist/workspace-runtime/codex/jsonrpc-stdio.js +106 -0
  28. package/dist/workspace-runtime/codex/loopback.js +59 -0
  29. package/dist/workspace-runtime/codex/native-adapter.js +3 -0
  30. package/dist/workspace-runtime/main.js +10 -0
  31. package/dist/workspace-runtime/persistence/journal.js +350 -0
  32. package/dist/workspace-runtime/processes/managed-writes.js +69 -0
  33. package/dist/workspace-runtime/serve.js +111 -0
  34. package/dist/workspace-runtime/server/auth.js +21 -0
  35. package/dist/workspace-runtime/server/dispatch.js +861 -0
  36. package/dist/workspace-runtime/server/execution-group.js +88 -0
  37. package/dist/workspace-runtime/server/http.js +561 -0
  38. package/dist/workspace-runtime/server/lock.js +53 -0
  39. package/dist/workspace-runtime/server/types.js +1 -0
  40. package/dist/workspace-runtime/workspaces/context-error.js +2 -0
  41. package/dist/workspace-runtime/workspaces/file-snapshot.js +213 -0
  42. package/dist/workspace-runtime/workspaces/files.js +143 -0
  43. package/dist/workspace-runtime/workspaces/git.js +242 -0
  44. package/dist/workspace-runtime/workspaces/json5-edit.js +170 -0
  45. package/dist/workspace-runtime/workspaces/parameters.js +272 -0
  46. package/dist/workspace-runtime/workspaces/prepare.js +364 -0
  47. package/dist/workspace-runtime/workspaces/registry.js +107 -0
  48. package/dist/workspace-runtime/workspaces/revisions.js +31 -0
  49. package/package.json +4 -1
  50. package/project-template-v2/.claude/agents/artist.md +82 -0
  51. package/project-template-v2/.claude/agents/developer.md +153 -0
  52. package/project-template-v2/.claude/agents/game-designer.md +264 -0
  53. package/project-template-v2/.claude/agents/refs/artist-art-style-catalog.md +533 -0
  54. package/project-template-v2/.claude/agents/refs/artist-color-audio-recipes.md +153 -0
  55. package/project-template-v2/.claude/agents/refs/artist-dimension-axis.md +27 -0
  56. package/project-template-v2/.claude/agents/refs/artist-master-composite-recipes.md +208 -0
  57. package/project-template-v2/.claude/agents/refs/atom-skill-library.md +81 -0
  58. package/project-template-v2/.claude/agents/refs/developer-impl-cookbook.md +432 -0
  59. package/project-template-v2/.claude/agents/refs/framework-5-component-filter.md +252 -0
  60. package/project-template-v2/.claude/agents/refs/framework-game-feel-juice.md +266 -0
  61. package/project-template-v2/.claude/agents/refs/framework-mda.md +147 -0
  62. package/project-template-v2/.claude/agents/refs/game-designer-gameplay-sufficiency.md +123 -0
  63. package/project-template-v2/.claude/agents/refs/ta-3d-flip-recipe.md +88 -0
  64. package/project-template-v2/.claude/agents/refs/ta-atlas-deliverable-standard.md +67 -0
  65. package/project-template-v2/.claude/agents/refs/ta-batch-pipeline-recipes.md +120 -0
  66. package/project-template-v2/.claude/agents/refs/ta-image-generation-detail.md +300 -0
  67. package/project-template-v2/.claude/agents/refs/ta-image-ops-reference.md +495 -0
  68. package/project-template-v2/.claude/agents/refs/ta-pipeline-cookbook.md +1141 -0
  69. package/project-template-v2/.claude/agents/refs/ta-tools-reference.md +111 -0
  70. package/project-template-v2/.claude/agents/refs/ta-vfx-preset-catalog.md +365 -0
  71. package/project-template-v2/.claude/agents/refs/threejs-cannon-pitfalls.md +412 -0
  72. package/project-template-v2/.claude/agents/reviewer.md +75 -0
  73. package/project-template-v2/.claude/agents/technical-artist.md +86 -0
  74. package/project-template-v2/.claude/hooks/snapshot-milestone.mjs +243 -0
  75. package/project-template-v2/.claude/hooks/user-prompt.mjs +133 -0
  76. package/project-template-v2/.claude/settings.json +33 -0
  77. package/project-template-v2/.claude/skills/brainstorming/SKILL.md +161 -0
  78. package/project-template-v2/.claude/skills/brainstorming/scripts/frame-template.html +270 -0
  79. package/project-template-v2/.claude/skills/brainstorming/scripts/helper.js +177 -0
  80. package/project-template-v2/.claude/skills/brainstorming/scripts/server.cjs +354 -0
  81. package/project-template-v2/.claude/skills/brainstorming/scripts/start-server.sh +148 -0
  82. package/project-template-v2/.claude/skills/brainstorming/scripts/stop-server.sh +56 -0
  83. package/project-template-v2/.claude/skills/brainstorming/scripts/wait-for-selection.sh +62 -0
  84. package/project-template-v2/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  85. package/project-template-v2/.claude/skills/brainstorming/visual-companion.md +309 -0
  86. package/project-template-v2/.claude/skills/playcraft-ad-psychology/SKILL.md +182 -0
  87. package/project-template-v2/.claude/skills/playcraft-art-style-guide/SKILL.md +123 -0
  88. package/project-template-v2/.claude/skills/playcraft-asset-state-sheet/SKILL.md +205 -0
  89. package/project-template-v2/.claude/skills/playcraft-audio-generation/SKILL.md +280 -0
  90. package/project-template-v2/.claude/skills/playcraft-batch-pipeline/SKILL.md +184 -0
  91. package/project-template-v2/.claude/skills/playcraft-build-optimizer/SKILL.md +306 -0
  92. package/project-template-v2/.claude/skills/playcraft-image-generation/SKILL.md +298 -0
  93. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +123 -0
  94. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +254 -0
  95. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +324 -0
  96. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +97 -0
  97. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +118 -0
  98. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +137 -0
  99. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +397 -0
  100. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +296 -0
  101. package/project-template-v2/.claude/skills/playcraft-image-ops/SKILL.md +122 -0
  102. package/project-template-v2/.claude/skills/playcraft-image-processing/SKILL.md +219 -0
  103. package/project-template-v2/.claude/skills/playcraft-masking/SKILL.md +373 -0
  104. package/project-template-v2/.claude/skills/playcraft-playable-optimization/SKILL.md +161 -0
  105. package/project-template-v2/.claude/skills/playcraft-research/SKILL.md +215 -0
  106. package/project-template-v2/.claude/skills/playcraft-skill-recommender/SKILL.md +382 -0
  107. package/project-template-v2/.claude/skills/playcraft-sprite-generation/SKILL.md +423 -0
  108. package/project-template-v2/.claude/skills/playcraft-sprite-remix/SKILL.md +158 -0
  109. package/project-template-v2/.claude/skills/playcraft-sprite-sheet/SKILL.md +100 -0
  110. package/project-template-v2/.claude/skills/playcraft-storyboard/SKILL.md +167 -0
  111. package/project-template-v2/.claude/skills/playcraft-style-qa/SKILL.md +270 -0
  112. package/project-template-v2/.claude/skills/playcraft-text-rendering/SKILL.md +236 -0
  113. package/project-template-v2/.claude/skills/playcraft-vfx-animation/SKILL.md +130 -0
  114. package/project-template-v2/.claude/skills/playwright-cli/SKILL.md +390 -0
  115. package/project-template-v2/.claude/skills/playwright-cli/references/element-attributes.md +23 -0
  116. package/project-template-v2/.claude/skills/playwright-cli/references/playwright-tests.md +39 -0
  117. package/project-template-v2/.claude/skills/playwright-cli/references/request-mocking.md +87 -0
  118. package/project-template-v2/.claude/skills/playwright-cli/references/running-code.md +240 -0
  119. package/project-template-v2/.claude/skills/playwright-cli/references/session-management.md +226 -0
  120. package/project-template-v2/.claude/skills/playwright-cli/references/spec-driven-testing.md +308 -0
  121. package/project-template-v2/.claude/skills/playwright-cli/references/storage-state.md +275 -0
  122. package/project-template-v2/.claude/skills/playwright-cli/references/test-generation.md +134 -0
  123. package/project-template-v2/.claude/skills/playwright-cli/references/tracing.md +142 -0
  124. package/project-template-v2/.claude/skills/playwright-cli/references/video-recording.md +153 -0
  125. package/project-template-v2/.claude/skills/session-analyzer/SKILL.md +386 -0
  126. package/project-template-v2/.claude/skills/session-analyzer/scripts/execution-breakdown.mjs +182 -0
  127. package/project-template-v2/.claude/skills/session-analyzer/scripts/find-turns.mjs +72 -0
  128. package/project-template-v2/.claude/skills/session-analyzer/scripts/heavy-output.mjs +121 -0
  129. package/project-template-v2/.claude/skills/session-analyzer/scripts/resolve-session.mjs +102 -0
  130. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-stats.mjs +127 -0
  131. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-tool-timeline.mjs +106 -0
  132. package/project-template-v2/.claude/skills/session-analyzer/scripts/time-gaps.mjs +128 -0
  133. package/project-template-v2/.claude/skills/session-analyzer/scripts/turn-timeline.mjs +67 -0
  134. package/project-template-v2/.claude/snapshot.mjs +263 -0
  135. package/project-template-v2/.playcraft/skills.lock.json +152 -0
  136. package/project-template-v2/CLAUDE.md +146 -0
  137. package/project-template-v2/assets/audio/bgm/.gitkeep +0 -0
  138. package/project-template-v2/assets/audio/sfx/.gitkeep +0 -0
  139. package/project-template-v2/assets/bundles/.gitkeep +0 -0
  140. package/project-template-v2/assets/images/bg/.gitkeep +0 -0
  141. package/project-template-v2/assets/images/reference/.gitkeep +0 -0
  142. package/project-template-v2/assets/images/storyboard/.gitkeep +0 -0
  143. package/project-template-v2/assets/images/tiles/.gitkeep +0 -0
  144. package/project-template-v2/assets/images/ui/.gitkeep +0 -0
  145. package/project-template-v2/assets/images/vfx/.gitkeep +0 -0
  146. package/project-template-v2/assets/models/.gitkeep +0 -0
  147. package/project-template-v2/docs/harness/iteration-1/context-flow.md +254 -0
  148. package/project-template-v2/docs/harness/iteration-1/generate-flow.md +91 -0
  149. package/project-template-v2/docs/harness/iteration-1/ideate-flow.md +214 -0
  150. package/project-template-v2/docs/harness/iteration-1/optimize-flow.md +75 -0
  151. package/project-template-v2/docs/harness/iteration-1/wrapup-flow.md +63 -0
  152. package/project-template-v2/docs/harness/iteration-2/context-flow.md +223 -0
  153. package/project-template-v2/docs/harness/iteration-2/generate-flow.md +129 -0
  154. package/project-template-v2/docs/harness/iteration-2/ideate-flow.md +267 -0
  155. package/project-template-v2/docs/harness/iteration-2/optimize-flow.md +164 -0
  156. package/project-template-v2/docs/harness/iteration-2/wrapup-flow.md +115 -0
  157. package/project-template-v2/docs/harness/orchestrator-flow.md +364 -0
  158. package/project-template-v2/docs/project-state.json +60 -0
  159. package/project-template-v2/docs/project-state.md +72 -0
  160. package/project-template-v2/docs/standards/README.md +225 -0
  161. package/project-template-v2/docs/standards/agent-behavior-standards.md +174 -0
  162. package/project-template-v2/docs/standards/artifacts/design-brief.md +19 -0
  163. package/project-template-v2/docs/standards/artifacts/design.md +22 -0
  164. package/project-template-v2/docs/standards/artifacts/game-code.md +41 -0
  165. package/project-template-v2/docs/standards/artifacts/todo-list.md +41 -0
  166. package/project-template-v2/docs/standards/iter1-agent-behavior-standards.md +343 -0
  167. package/project-template-v2/game/index.ts +18 -0
  168. package/project-template-v2/globals.d.ts +51 -0
  169. package/project-template-v2/index.css +34 -0
  170. package/project-template-v2/index.html +18 -0
  171. package/project-template-v2/main.ts +9 -0
  172. package/project-template-v2/package.json +46 -0
  173. package/project-template-v2/skills/_shared/scripts/dispatch-clear.mjs +31 -0
  174. package/project-template-v2/skills/_shared/scripts/dispatch-set.mjs +86 -0
  175. package/project-template-v2/skills/_shared/scripts/dod-check.mjs +153 -0
  176. package/project-template-v2/skills/_shared/scripts/handoff-append.mjs +70 -0
  177. package/project-template-v2/skills/_shared/scripts/lib/validator-artifacts.mjs +91 -0
  178. package/project-template-v2/skills/_shared/scripts/pipeline/dod-config.mjs +131 -0
  179. package/project-template-v2/skills/_shared/scripts/pipeline/index.mjs +80 -0
  180. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-1-core.mjs +90 -0
  181. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-2-wrap.mjs +93 -0
  182. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-3-visual.mjs +23 -0
  183. package/project-template-v2/skills/_shared/scripts/render-project-state.mjs +230 -0
  184. package/project-template-v2/skills/_shared/scripts/state-advance-stage.mjs +58 -0
  185. package/project-template-v2/skills/_shared/scripts/state-get.mjs +339 -0
  186. package/project-template-v2/skills/_shared/scripts/state-handoff.mjs +39 -0
  187. package/project-template-v2/skills/_shared/scripts/state-set.mjs +94 -0
  188. package/project-template-v2/skills/_shared/scripts/state-store.mjs +783 -0
  189. package/project-template-v2/skills/_shared/scripts/todo-add.mjs +88 -0
  190. package/project-template-v2/skills/_shared/scripts/todo-get.mjs +130 -0
  191. package/project-template-v2/skills/_shared/scripts/todo-remove.mjs +33 -0
  192. package/project-template-v2/skills/_shared/scripts/todo-set.mjs +47 -0
  193. package/project-template-v2/skills/_shared/scripts/verify-asset-code-sync.mjs +268 -0
  194. package/project-template-v2/skills/_shared/scripts/verify-env.mjs +285 -0
  195. package/project-template-v2/skills/_shared/scripts/verify-placeholders.mjs +161 -0
  196. package/project-template-v2/skills/playable-autoplay/SKILL.md +176 -0
  197. package/project-template-v2/skills/playable-autoplay/agents/openai.yaml +4 -0
  198. package/project-template-v2/skills/playable-debug/SKILL.md +116 -0
  199. package/project-template-v2/skills/playable-debug/agents/openai.yaml +4 -0
  200. package/project-template-v2/skills/playable-debug/references/debug-config.md +40 -0
  201. package/project-template-v2/skills/playable-record/SKILL.md +140 -0
  202. package/project-template-v2/skills/playable-record/scripts/lib/dev-server.mjs +104 -0
  203. package/project-template-v2/skills/playable-record/scripts/lib/record-audio-bridge.js +141 -0
  204. package/project-template-v2/skills/playable-record/scripts/record-playable.mjs +425 -0
  205. package/project-template-v2/skills/playable-record/scripts/verify-contract.mjs +261 -0
  206. package/project-template-v2/skills/playable-record/scripts/verify-firstwin.mjs +398 -0
  207. package/project-template-v2/skills/playable-record/scripts/verify-fusion.mjs +322 -0
  208. package/project-template-v2/skills/playable-record/scripts/verify-lifecycle.mjs +105 -0
  209. package/project-template-v2/skills/playable-record/scripts/verify-vlm-video.mjs +230 -0
  210. package/project-template-v2/skills/playable-validate/SKILL.md +61 -0
  211. package/project-template-v2/skills/playable-validate/validation-rules.md +14 -0
  212. package/project-template-v2/skills/playable-verify-ui/SKILL.md +63 -0
  213. package/project-template-v2/skills/playable-verify-ui/scripts/lib/__init__.py +1 -0
  214. package/project-template-v2/skills/playable-verify-ui/scripts/lib/config_expr.js +218 -0
  215. package/project-template-v2/skills/playable-verify-ui/scripts/lib/node_utils.js +51 -0
  216. package/project-template-v2/skills/playable-verify-ui/scripts/lib/profile_loader.py +59 -0
  217. package/project-template-v2/skills/playable-verify-ui/scripts/lib/report.py +106 -0
  218. package/project-template-v2/skills/playable-verify-ui/scripts/lib/runtime_contract.js +116 -0
  219. package/project-template-v2/skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py +59 -0
  220. package/project-template-v2/skills/playable-verify-ui/scripts/verify_hardcoded_layout.js +64 -0
  221. package/project-template-v2/skills/playable-verify-ui/scripts/verify_runtime_contract.js +58 -0
  222. package/project-template-v2/skills/playable-verify-ui/scripts/verify_text_overlap.py +333 -0
  223. package/project-template-v2/ta-workspace/scripts/.gitkeep +0 -0
  224. package/project-template-v2/tsconfig.json +20 -0
  225. package/project-template-v2/vite.config.ts +27 -0
@@ -0,0 +1,423 @@
1
+ ---
2
+ name: playcraft-sprite-generation
3
+ description: PlayCraft 批量元素一次性生成完整指南。涵盖 sprite sheet / 元素拼图 / UI 组件集等所有"多元素同图生成"场景。包含 Canvas 规格计算、五段式 Prompt 模板、9 项核查清单、全量生成命令、逐格校验与定向修补流程、切割脚本模板,以及麻将 42-tile 完整示例。TA 在进行任何批量元素生成前必读。
4
+ triggers: sprite sheet,精灵图,批量生成,一次性生成,元素拼图,全量生成,tile sheet,icon sheet,UI组件集,grid generation,多元素同图,spritesheet,拼图生成,图标集,decompose-layers,crop,切割
5
+ ---
6
+
7
+ # PlayCraft 批量元素一次性生成指南
8
+
9
+ ## 0. 适用场景判断
10
+
11
+ **何时使用全量同图生成**:
12
+
13
+ | 场景 | 示例 | 推荐方式 |
14
+ | --------------------- | ----------------------------------------------- | ------------ |
15
+ | 同类型多元素(>3 个) | 42 张麻将牌、9 种水果、8 个图标 | 全量同图生成 |
16
+ | UI 组件集 | 按钮组(normal/hover/pressed × 3 种)、HUD 元素 | 全量同图生成 |
17
+ | 角色表情/姿态集 | 6 种表情、8 个方向 | 全量同图生成 |
18
+ | 同风格背景变体 | 3 个关卡背景 | 全量同图生成 |
19
+
20
+ **何时不适用**:
21
+
22
+ - 单个大尺寸资产(如 1080×1920 背景)→ 直接单独生成
23
+ - 元素间风格差异大(如写实 + 卡通混合)→ 分别生成
24
+ - 需要精确透明度/alpha 通道 → 生成后需 remove-background 处理
25
+
26
+ ### 生成后从同图提取单格(与 `playcraft-masking` 对齐)
27
+
28
+ | 布局 | 推荐提取方式 |
29
+ | ------------------------------------------- | ---------------------------------------------------------- |
30
+ | **规则网格 spritesheet**(本节主流程) | `playcraft image crop` + 下方切割脚本 |
31
+ | **散乱/非网格拼图** | `segment --boxes` 或 SAM3(慎用纯 text prompt) |
32
+ | **整张 Master Composite**(非 spritesheet) | `playcraft image decompose-layers`(302 整图分层,非逐格) |
33
+
34
+ > 网格图**不要**用 `decompose-layers` 代替 crop;整图分层也**不能**指定「只要第 N 格」。
35
+
36
+ ---
37
+
38
+ ## 1. Canvas 规格计算
39
+
40
+ ### 公式
41
+
42
+ ```
43
+ totalWidth = cols × cellWidth + (cols - 1) × gap
44
+ totalHeight = rows × cellHeight + (rows - 1) × gap
45
+
46
+ # 对齐到 16 的倍数(对 GPU 纹理和视频编码友好)
47
+ alignedWidth = ceil(totalWidth / 16) × 16
48
+ alignedHeight = ceil(totalHeight / 16) × 16
49
+
50
+ # 约束:不超过模型最大分辨率
51
+ assert alignedWidth ≤ 4096
52
+ assert alignedHeight ≤ 4096
53
+ ```
54
+
55
+ ### 快速参考表
56
+
57
+ | 元素数 | 推荐网格 | 单格尺寸(gap=10) | 画布尺寸 |
58
+ | ------ | -------- | ------------------ | --------------------- |
59
+ | 9 | 3×3 | 1024×1024 | 3092×3092 → 3104×3104 |
60
+ | 16 | 4×4 | 768×768 | 3102×3102 → 3104×3104 |
61
+ | 25 | 5×5 | 680×680 | 3440×3440 → 3440×3440 |
62
+ | 36 | 6×6 | 560×560 | 3410×3410 → 3424×3424 |
63
+ | 42 | 7×6 | 80×100 (small) | 624×656 → 624×656 |
64
+ | 42 | 7×6 | 540×540 | 3840×3290 → 3840×3296 |
65
+
66
+ > 建议优先使用大单格尺寸(≥540px),牺牲格数不如牺牲精度。如果元素数多(>36),可接受较小单格但不低于 80px。
67
+
68
+ ### gap 选择
69
+
70
+ - gap=0:元素紧贴,适合最终游戏用的 sprite sheet(开发者按像素切)
71
+ - gap=10-20:元素有间距,适合 AI 生成(防止跨格渲染污染)
72
+ - **推荐 AI 生成时 gap=10-20px**,切割后丢弃 gap 区域
73
+
74
+ ---
75
+
76
+ ## 2. 五段式 Prompt 模板
77
+
78
+ AI 生图 prompt 必须严格遵循五段式结构(Scene → Canvas → Element Set → Details → Constraints):
79
+
80
+ ```
81
+ Scene: [背景色 + hex + 用途,1-2 句].
82
+
83
+ Canvas: a strict [ROWS]-row by [COLS]-column spritesheet.
84
+ Final canvas size: [W]×[H] pixels (both multiples of 16).
85
+ Each element is exactly [CELL_W] pixels wide and [CELL_H] pixels tall.
86
+ Horizontal and vertical gaps between elements: [GAP] pixels.
87
+ All rows are left-aligned.
88
+
89
+ Element set: all [N] [ELEMENT_TYPE], each appearing exactly once, arranged in the following order:
90
+ - Row 1: [id_1 (标签)], [id_2 (标签)], ..., [id_COLS (标签)]
91
+ - Row 2: [id_COLS+1], ..., [id_2×COLS]
92
+ - ...
93
+ - Row [ROWS]: [remaining elements, mark empty cells if any]
94
+
95
+ Details:
96
+ - Every element is identical in size ([CELL_W]×[CELL_H] px) with [edge treatment].
97
+ - Material/texture: [具体材质描述].
98
+ - [Category 1] elements: [颜色 + 样式].
99
+ - [Category 2] elements: [颜色 + 样式].
100
+ - ...
101
+ - Art style: [风格关键词,引用 design-brief].
102
+
103
+ Constraints:
104
+ - No [unwanted_1], no [unwanted_2], no [unwanted_3].
105
+ - All symbols/text must be [质量要求].
106
+ - [其他技术约束].
107
+ ```
108
+
109
+ ### 五段式强制规则
110
+
111
+ | 段落 | 必须包含 | 禁止 |
112
+ | ----------- | ---------------------------- | ------------------------------ |
113
+ | Scene | 背景色 hex + 用途 | 不写风格(风格在 Details 段) |
114
+ | Canvas | 精确像素:画布/单格/gap/对齐 | 不写模糊尺寸如 "large" |
115
+ | Element Set | 逐行完整枚举 + 中文标签 | 不省略("etc." 或 "...") |
116
+ | Details | 按分类描述材质/颜色/风格 | 不写单一笼统描述覆盖所有 |
117
+ | Constraints | ≥3 条 "No xxx" | 不写正面描述(正面在 Details) |
118
+
119
+ ---
120
+
121
+ ## 3. Prompt 核查清单
122
+
123
+ 生成前对照以下 9 项逐一核查(在 `logs/ta-log.md` 中打勾),**全部通过才可执行生成命令**:
124
+
125
+ | # | 核查项 | 标准 |
126
+ | --- | ----------------------------- | --------------------------------------------------- |
127
+ | 1 | **Scene 段存在** | 背景色 hex 明确 |
128
+ | 2 | **Canvas 像素精确** | 画布/单格/gap 为精确数值,且是 16 倍数 |
129
+ | 3 | **Element Set 完整** | 逐行枚举数量 = assetMapping 总数,无遗漏无重复 |
130
+ | 4 | **Details 分类描述** | 每类元素有独立的颜色/材质描述,引用 layout-spec hex |
131
+ | 5 | **Details 引用 Style Intent** | 风格关键词来自 artist-log Style Intent Notes |
132
+ | 6 | **Constraints 负面约束** | ≥3 条 "No xxx",含 Anti-Pattern Notes 中的禁忌 |
133
+ | 7 | **Canvas ≤ 4096px** | 总尺寸不超过模型最大分辨率 |
134
+ | 8 | **--reference-image 指定** | 指向 ASR element sheet 或 Master Composite |
135
+ | 9 | **Prompt 已记录** | 完整 prompt 已写入 `logs/ta-log.md` |
136
+
137
+ **任何一项未通过 → 修正后重新核查。不可跳过。**
138
+
139
+ ---
140
+
141
+ ## 4. 全量生成命令
142
+
143
+ ```bash
144
+ playcraft tools generate-image \
145
+ --prompt "<五段式 prompt,已通过核查>" \
146
+ --output assets/images/[type]/spritesheet_[type].png \
147
+ --reference-image <asr-element-sheet-or-composite-path> \
148
+ --image-size 1K \
149
+ --image-model gpt-image-2
150
+
151
+ # 自动生成的 .json sidecar 记录完整 prompt + 配置
152
+ # 检查确认:
153
+ cat assets/images/[type]/spritesheet_[type].json
154
+ ```
155
+
156
+ ### `--image-size` 与画布尺寸的关系
157
+
158
+ `--image-size` 接受预设值 `1K`、`2K`、`4K`。实际输出像素由 `aspectRatio + imageSize` 联合决定——对 gpt-image-2: `1:1+4K`→2048x2048, `16:9+4K`→3840x2160, `1:1+1K`→1024x1024。
159
+
160
+ | 情况 | `--image-size` 设置 | 后续处理 |
161
+ | ---------------- | ------------------------------------ | -------------------------------------------------------- |
162
+ | 画布 ≤ 1024px | `1K` | 模型输出 ~1024px,**必须 resize 到目标画布尺寸后再切割** |
163
+ | 画布 1024–4096px | `4K` | 直接切割 |
164
+ | 需要最大精度 | `4K` + 放大单格尺寸使画布接近 4096px | 直接切割 |
165
+
166
+ **当模型输出 > 实际画布尺寸时的处理流程**:
167
+
168
+ ```bash
169
+ # 1. 生成(模型输出 ~1024px)
170
+ playcraft tools generate-image --prompt "..." --output tmp_sheet.png --image-size 1K ...
171
+
172
+ # 2. Resize 到实际画布尺寸(保持网格比例)
173
+ playcraft image resize --input tmp_sheet.png --width [alignedWidth] --height [alignedHeight] --output assets/images/[type]/spritesheet_[type].png
174
+
175
+ # 3. 然后正常切割
176
+ ```
177
+
178
+ > **推荐**:优先选择大单格尺寸方案(≥540px),使画布接近 4096×4096,避免先生成再缩放的精度损失。
179
+
180
+ ### 模型选择
181
+
182
+ | 模型 | 适用 | 注意 |
183
+ | ------------- | -------------------------------------- | ------------------ |
184
+ | gpt-image-2 | 首选——复杂布局、中文字符、多元素一致性 | 慢(~7-8 min),贵 |
185
+ | nano-banana-2 | 备选——简单图形、无文字元素 | 快,中文字符不可靠 |
186
+ | gemini-flash | 备选——色彩鲜艳场景 | 网格理解弱 |
187
+
188
+ **中文字符场景(麻将/汉字标签)必须用 gpt-image-2。**
189
+
190
+ ### 元素数超限时的分批策略
191
+
192
+ 当元素总数使画布无法在 4096px 内保持 ≥ 80px 单格时,需分批生成:
193
+
194
+ ```
195
+ 最大可容纳元素数 ≈ (4096 ÷ (cellSize + gap))²
196
+ # 例:cellSize=540, gap=10 → (4096÷550)² ≈ 49 个
197
+ # 例:cellSize=256, gap=10 → (4096÷266)² ≈ 237 个(但精度低)
198
+ ```
199
+
200
+ **分批原则**:
201
+
202
+ - 按元素类别分 sheet(如:萬子一张、條子一张),每张 sheet 内部风格一致
203
+ - 所有 sheet 使用**相同的 `--reference-image` + 相同模型**,保证跨 sheet 风格统一
204
+ - 在 `logs/ta-log.md` 中标注分批策略和每张 sheet 包含的元素清单
205
+
206
+ ---
207
+
208
+ ## 5. 逐格校验 + 定向修补
209
+
210
+ ### 校验标准
211
+
212
+ 生成后逐格对照 Element Set 清单检查:
213
+
214
+ | 校验项 | 通过标准 |
215
+ | ---------- | --------------------------------------------- |
216
+ | 元素存在 | 格内有完整元素,无空格、无残缺 |
217
+ | 符号正确 | 文字/图案与清单描述一致(无笔画错误、无乱码) |
218
+ | 尺寸一致 | 各格元素大小视觉统一(允许 ±5% 偏差) |
219
+ | 无跨格污染 | 元素不越界到相邻格 |
220
+ | 风格统一 | 颜色、材质、光照与其他格一致 |
221
+
222
+ ### 修补决策
223
+
224
+ | 错误比例 | 策略 |
225
+ | ------------------------------- | ------------------------------------- |
226
+ | ≤ 30%(如 42 格中 ≤ 12 格错误) | 逐格定向修补 |
227
+ | > 30% | 修改 prompt → 重新核查 → 重新全量生成 |
228
+
229
+ ### 定向修补流程
230
+
231
+ ```bash
232
+ # 用整张 sheet 作为 reference-image,保证修补格与其他格风格一致
233
+ playcraft tools generate-image \
234
+ --prompt "Single [ELEMENT_TYPE]: [错误格子的详细描述,从原 prompt Element Set 段摘取]. Same art style as reference. On solid [BG_COLOR] background. Centered in frame." \
235
+ --reference-image assets/images/[type]/spritesheet_[type].png \
236
+ --output ta-workspace/tmp/fix_[element_id].png \
237
+ --image-size 1K \
238
+ --image-model gpt-image-2
239
+ ```
240
+
241
+ **修补后**:resize 到 cellW×cellH → 替换到最终切割输出中(不修改原 sheet 文件):
242
+
243
+ ```bash
244
+ playcraft image resize \
245
+ --input ta-workspace/tmp/fix_[element_id].png \
246
+ --width [cellW] --height [cellH] \
247
+ --output assets/images/[type]/tile_[element_id].png
248
+ ```
249
+
250
+ ---
251
+
252
+ ## 6. 切割 + 替换 + 验证
253
+
254
+ ### 切割脚本模板
255
+
256
+ ```javascript
257
+ // ta-workspace/scripts/split-spritesheet.mjs
258
+ import { execSync } from 'child_process';
259
+ import { existsSync, mkdirSync } from 'fs';
260
+
261
+ const CONFIG = {
262
+ input: 'assets/images/tiles/spritesheet_mahjong.png',
263
+ outputDir: 'assets/images/tiles/',
264
+ cols: 7,
265
+ rows: 6,
266
+ cellW: 80,
267
+ cellH: 100,
268
+ gap: 10,
269
+ names: [
270
+ '1wan',
271
+ '2wan',
272
+ '3wan',
273
+ '4wan',
274
+ '5wan',
275
+ '6wan',
276
+ '7wan',
277
+ '8wan',
278
+ '9wan',
279
+ '1tiao',
280
+ '2tiao',
281
+ '3tiao',
282
+ '4tiao',
283
+ '5tiao',
284
+ '6tiao',
285
+ '7tiao',
286
+ '8tiao',
287
+ '9tiao',
288
+ '1tong',
289
+ '2tong',
290
+ '3tong',
291
+ '4tong',
292
+ '5tong',
293
+ '6tong',
294
+ '7tong',
295
+ '8tong',
296
+ '9tong',
297
+ 'east',
298
+ 'south',
299
+ 'west',
300
+ 'north',
301
+ 'red_dragon',
302
+ 'green_dragon',
303
+ 'white_dragon',
304
+ 'spring',
305
+ 'summer',
306
+ 'autumn',
307
+ 'winter',
308
+ 'plum',
309
+ 'orchid',
310
+ 'bamboo',
311
+ 'chrysanthemum',
312
+ ],
313
+ };
314
+
315
+ mkdirSync(CONFIG.outputDir, { recursive: true });
316
+
317
+ for (let row = 0; row < CONFIG.rows; row++) {
318
+ for (let col = 0; col < CONFIG.cols; col++) {
319
+ const idx = row * CONFIG.cols + col;
320
+ if (idx >= CONFIG.names.length) break;
321
+
322
+ const x = col * (CONFIG.cellW + CONFIG.gap);
323
+ const y = row * (CONFIG.cellH + CONFIG.gap);
324
+ const name = CONFIG.names[idx];
325
+ const output = `${CONFIG.outputDir}tile_${name}.png`;
326
+
327
+ if (existsSync(output)) continue; // idempotent
328
+
329
+ execSync(
330
+ `playcraft image crop --input ${CONFIG.input} --x ${x} --y ${y} --width ${CONFIG.cellW} --height ${CONFIG.cellH} --output ${output}`,
331
+ );
332
+ console.log(`[${idx + 1}/${CONFIG.names.length}] ${output}`);
333
+ }
334
+ }
335
+ console.log('Done. Split complete.');
336
+ ```
337
+
338
+ ### 替换修补格
339
+
340
+ ```bash
341
+ # 修补的格子直接覆盖切割输出
342
+ cp ta-workspace/tmp/fix_east.png assets/images/tiles/tile_east.png
343
+ cp ta-workspace/tmp/fix_red_dragon.png assets/images/tiles/tile_red_dragon.png
344
+ ```
345
+
346
+ ### 最终验证
347
+
348
+ ```bash
349
+ # 逐文件检查尺寸一致
350
+ playcraft image info assets/images/tiles/tile_*.png
351
+
352
+ # 确认文件数量 = Element Set 清单数量
353
+ ls assets/images/tiles/tile_*.png | wc -l
354
+ ```
355
+
356
+ ---
357
+
358
+ ## 7. 完整示例:麻将 42-tile Sprite Sheet
359
+
360
+ ### Define
361
+
362
+ ```
363
+ 总元素数: 42
364
+ 网格布局: 7 cols × 6 rows = 42 cells (all used)
365
+ 单格尺寸: 80×100 px
366
+ Gap: 10 px
367
+ 画布尺寸: 7×80 + 6×10 = 620 → aligned 624 | 6×100 + 5×10 = 650 → aligned 656
368
+ 最终: 624×656 px
369
+ 背景: #00FF00 (green-screen)
370
+ 模型: gpt-image-2
371
+ 参考图: assets/images/storyboard/master_composite.png
372
+ ```
373
+
374
+ ### Prompt
375
+
376
+ ```
377
+ Scene: pure green background (#00FF00) for easy keying.
378
+
379
+ Canvas: a strict 6-row by 7-column spritesheet.
380
+ Final canvas size: 624×656 pixels (both multiples of 16).
381
+ Each tile is exactly 80 pixels wide and 100 pixels tall.
382
+ Horizontal and vertical gaps between tiles: 10 pixels.
383
+ All rows are left-aligned.
384
+
385
+ Tile set: all 42 standard Mahjong tiles, each appearing exactly once, arranged in the following order:
386
+ - Row 1: 1wan (一萬), 2wan (二萬), 3wan (三萬), 4wan (四萬), 5wan (五萬), 6wan (六萬), 7wan (七萬)
387
+ - Row 2: 8wan (八萬), 9wan (九萬), 1tiao (一條), 2tiao (二條), 3tiao (三條), 4tiao (四條), 5tiao (五條)
388
+ - Row 3: 6tiao (六條), 7tiao (七條), 8tiao (八條), 9tiao (九條), 1tong (一筒), 2tong (二筒), 3tong (三筒)
389
+ - Row 4: 4tong (四筒), 5tong (五筒), 6tong (六筒), 7tong (七筒), 8tong (八筒), 9tong (九筒), East wind (東)
390
+ - Row 5: South wind (南), West wind (西), North wind (北), Red dragon (中), Green dragon (發), White dragon (白), Spring (春)
391
+ - Row 6: Summer (夏), Autumn (秋), Winter (冬), Plum (梅), Orchid (蘭), Bamboo (竹), Chrysanthemum (菊)
392
+
393
+ Details:
394
+ - Every tile is identical in size (80×100 px) with 4px rounded corners and thin 1px dark border (#333333).
395
+ - Tile surface: brushed brass/bronze metallic texture with subtle reflections.
396
+ - Wan (萬) suit: Chinese numeral + "萬" character in dark red (#8B0000), traditional Kaiti calligraphy.
397
+ - Tiao (條) suit: stylized bamboo stalks in dark green (#1B5E20), count matches the number.
398
+ - Tong (筒) suit: ornamental coin/circle patterns in dark green (#2E4E2E) with concentric ring detail.
399
+ - Wind tiles (東南西北): large bold Chinese character in dark ink (#1A1A1A), centered.
400
+ - Dragon tiles: 中=red character on tile, 發=green character on tile, 白=blank/framed tile.
401
+ - Flower/Season tiles (春夏秋冬梅蘭竹菊): small botanical/seasonal illustration + Chinese character label at top.
402
+ - Art style: Chinese traditional aesthetic, elegant and clean, premium mobile game quality.
403
+
404
+ Constraints:
405
+ - No cast shadows behind tiles, no perspective distortion, no 3D rotation.
406
+ - No extra text, no labels outside tiles, no watermarks, no visible grid lines.
407
+ - No background texture — pure flat #00FF00.
408
+ - All Chinese characters must be sharp, legible, and correctly written (no garbled strokes).
409
+ - Strictly front-on orthographic view for all 42 tiles.
410
+ ```
411
+
412
+ ### 执行
413
+
414
+ ```bash
415
+ playcraft tools generate-image \
416
+ --prompt "<上述完整 prompt>" \
417
+ --output assets/images/tiles/spritesheet_mahjong.png \
418
+ --reference-image assets/images/storyboard/master_composite.png \
419
+ --image-size 1K \
420
+ --image-model gpt-image-2
421
+ ```
422
+
423
+ > 注:624×656 小于模型最小输出(~1024px),模型会自动适配。如需更高精度,可将单格放大到 540×540(画布 3840×3290)并使用 `--image-size 4K`。
@@ -0,0 +1,158 @@
1
+ ---
2
+ name: playcraft-sprite-remix
3
+ description: 精灵图(sprite sheet)拆解、逐帧 AI 重绘、去背景与重组装的完整流水线。适用于换肤、风格变换、牌面/图集批量处理;通过 playcraft CLI 在沙箱内执行,分析步骤可走后端 Vision API。
4
+ compatibility: agent,opencode
5
+ triggers: 精灵图, sprite sheet, 图集, 换肤, 风格变换, 逐帧, 麻将牌, tile sheet, atlas remix
6
+ ---
7
+
8
+ ## Skill Definition
9
+
10
+ tools:
11
+
12
+ - bash
13
+ - read
14
+ prompt_extension: |
15
+ 你是精灵图管线工程师。不得向 /project/ 写入;中间产物与最终输出必须在会话 .../sessions/{id}/ta-workspace/ 下。
16
+ 当用户提到精灵图、sprite sheet、图集换肤、逐帧重绘、牌面风格变换等需求时,优先采用「分析/拆分 → 逐帧生成 → 去背景 → 重组 → 对比验收」流程,而不是把整张图直接丢给生图模型。
17
+ 通过 bash 调用 playcraft CLI:sprite-split(可选 Vision)、tools generate-image、image remove-background、image sprite-sheet。
18
+ 需要多模态理解布局时,使用 `playcraft image sprite-split --input ... --output-dir ... --auto-detect [--hint "..."]`(消耗后端 Vision 配额)。
19
+ 若网格行列与帧尺寸已知,用手动参数省略 Vision:`--rows --columns --frame-width --frame-height [--padding]`。
20
+ 交付到素材库时按 docs/agent/remixable-prefab-spec.md 整理 staging 后执行 `playcraft tools publish-prefab`。
21
+
22
+ ## 我做什么
23
+
24
+ - 将整张精灵图拆成独立帧(规则网格或不规则元素)
25
+ - 按统一风格或用户要求对每帧做图生图(`playcraft tools generate-image` + `--reference-image`)
26
+ - 逐帧去背景(优先 `remove-background` 默认 floodfill;复杂底用 `--method ai`)
27
+ - 用 `playcraft image sprite-sheet` 按原拓扑拼回 PNG + JSON
28
+ - 产出 `split-meta.json` 记录裁切与网格,便于复现与人工微调
29
+
30
+ ## 何时用我
31
+
32
+ - 用户明确在处理 **sprite sheet / 精灵图 / 纹理图集**,且需要 **保留网格或元素位置**
33
+ - 整张图直接文生图/图生图效果差、帧错位、风格不一致
34
+ - 需要批量对 **每一格 / 每一元素** 单独生成或变换
35
+
36
+ ## 推荐工作流(6 步)
37
+
38
+ ### 1–2. 分析与拆分(一步 CLI)
39
+
40
+ ```bash
41
+ # Vision 自动推断网格(需 PLAYCRAFT_API_URL + PLAYCRAFT_SANDBOX_TOKEN或 .playcraft.json)
42
+ playcraft image sprite-split \
43
+ --input ta-workspace/source-sheet.png \
44
+ --output-dir ta-workspace/split_frames \
45
+ --auto-detect \
46
+ --hint "mahjong tiles, uniform grid, equal cell size"
47
+
48
+ # 或已知网格时(纯本地 sharp,不调后端)
49
+ playcraft image sprite-split \
50
+ --input ta-workspace/source-sheet.png \
51
+ --output-dir ta-workspace/split_frames \
52
+ --rows 4 --columns 10 --frame-width 100 --frame-height 130 --padding 2
53
+ ```
54
+
55
+ 输出:`split_frames/frame_r*_c*.png`(或不规则时的按元素命名)、`split_frames/split-meta.json`。
56
+
57
+ ### 3. 逐帧重生成
58
+
59
+ 对每一帧单独调用(可并行多个 bash 命令,注意 API 限流):
60
+
61
+ ```bash
62
+ playcraft tools generate-image \
63
+ --prompt "same tile, frozen ice style, keep symbol readable, game asset" \
64
+ --reference-image ta-workspace/split_frames/frame_r0_c0.png \
65
+ --aspect-ratio 1:1 \
66
+ --output ta-workspace/remix_frames/frame_r0_c0.png
67
+ ```
68
+
69
+ 多帧时循环处理;单帧失败只需重试该帧。
70
+
71
+ ### 4. 去背景
72
+
73
+ ```bash
74
+ playcraft image remove-background \
75
+ --input ta-workspace/remix_frames/frame_r0_c0.png \
76
+ --output ta-workspace/remix_frames_nobg/frame_r0_c0.png
77
+ ```
78
+
79
+ 复杂背景再考虑 `--method ai`。
80
+
81
+ ### 5. 重组精灵图
82
+
83
+ 根据 `split-meta.json` 中的行列与 `frameWidth` / `frameHeight` / `padding` 与 `sprite-sheet` 对齐(与拆分时一致):
84
+
85
+ ```bash
86
+ playcraft image sprite-sheet \
87
+ --inputs ta-workspace/remix_frames_nobg/frame_r0_c0.png,ta-workspace/remix_frames_nobg/frame_r0_c1.png \
88
+ --output ta-workspace/remixed-sheet \
89
+ --columns 10 \
90
+ --cell-width 100 --cell-height 130 \
91
+ --padding 2
92
+ ```
93
+
94
+ (`--inputs` 顺序须与拼图行列一致;帧数多时用脚本生成逗号列表。)
95
+
96
+ ### 6. Review(对比验收)
97
+
98
+ 将 **原图** 与 **新精灵图** 作为参考图,请求模型做一致性/对齐简述(可选,用于汇报或自检):
99
+
100
+ ```bash
101
+ playcraft tools generate-image \
102
+ --prompt "Compare layout: does the second image preserve the grid and approximate content of the first? Answer briefly in English." \
103
+ --reference-image ta-workspace/source-sheet.png \
104
+ --reference-image ta-workspace/remixed-sheet.png \
105
+ --aspect-ratio 1:1 \
106
+ --output ta-workspace/review_note.png
107
+ ```
108
+
109
+ 若仅需文字反馈,可改为由 Manager/Reviewer 角色阅读两张图;CLI 仍会生成一张图,可按项目约定使用或丢弃。
110
+
111
+ ## 局部 remix:不拆整张,只替换单一元素
112
+
113
+ 已知某个元素在原图上的 bounds(例如某个按钮位于 x=120 y=240 宽 160 高 64),想仅重绘该元素并贴回原图:
114
+
115
+ ```bash
116
+ # 1) 裁出目标区域(可向外扩 ~10% 给模型一点上下文)
117
+ playcraft image crop \
118
+ --input ta-workspace/source-sheet.png \
119
+ --output ta-workspace/region.png \
120
+ --x 104 --y 234 --width 192 --height 76
121
+
122
+ # 2) 以裁剪片作为 reference 做 image-to-image
123
+ playcraft tools generate-image \
124
+ --prompt "green rounded rectangle button with white text 'Start', flat UI" \
125
+ --reference-image ta-workspace/region.png \
126
+ --aspect-ratio 1:1 \
127
+ --output ta-workspace/region_remixed.png
128
+
129
+ # 3) 抠掉新片段的背景/边框
130
+ playcraft image remove-background \
131
+ --input ta-workspace/region_remixed.png \
132
+ --output ta-workspace/region_remixed_nobg.png
133
+
134
+ # 4) 贴回原图(注意 x/y 是粘贴起点,这里是 104/234,而不是 bounds 原点)
135
+ playcraft image overlay \
136
+ --base ta-workspace/source-sheet.png \
137
+ --overlay ta-workspace/region_remixed_nobg.png \
138
+ --output ta-workspace/source-sheet.v2.png \
139
+ --x 104 --y 234
140
+ ```
141
+
142
+ 4 步各是一个原子,可单独替换:
143
+
144
+ - 不需要外扩时 step 1 使用原始 bounds 即可。
145
+ - 场景融合足够好时 step 3 可跳过。
146
+ - 多元素批量换皮时把这套流程写在一个 for 循环里,或对每个元素走一遍 step 1–4 并合到同一底图上。
147
+
148
+ ## 与现有 Skill 的关系
149
+
150
+ - **playcraft-sprite-sheet**:仅负责「多图合并为 sheet」;本 Skill 覆盖「从 sheet 出发的完整 remix」
151
+ - **playcraft-image-generation**:单图生成;本 Skill 强调 **逐帧** 与 **结构保持**
152
+ - **playcraft-image-processing**:缩放、裁剪、像素化等本地处理;在本流程中可与 remix 步骤穿插使用
153
+
154
+ ## 注意事项
155
+
156
+ - **不要**对整张 sprite sheet 一次性下「全部改成某风格」的生图指令作为主路径
157
+ - `--auto-detect` 有成本;已知规格时务必用手动网格减少调用
158
+ - 不规则图集(`gridType: irregular`)重组时需按 `split-meta.json` 中元素坐标逐个 `overlay` 或扩展 `sprite-sheet` 工作流;优先在 ta-workspace 用脚本或分步 composite 还原布局
@@ -0,0 +1,100 @@
1
+ ---
2
+ name: playcraft-sprite-sheet
3
+ description: 可玩广告流程步骤 7(可选)。将多张图片合并为精灵图(sprite sheet),输出 PNG 及 JSON 帧坐标元数据。通过 `playcraft image sprite-sheet` 命令在沙箱本地执行,无需 backend。
4
+ compatibility: agent,opencode
5
+ ---
6
+
7
+ ## Skill Definition
8
+
9
+ tools:
10
+
11
+ - bash
12
+ - read
13
+ prompt_extension: |
14
+ 你是精灵图合成师。不得向 /project/ 写入;所有输出必须在会话 .../sessions/{id}/ta-workspace/ 下。
15
+ 通过 bash 工具运行 `playcraft image sprite-sheet` CLI 命令将多张图合并为 PNG + JSON 元数据,全程本地执行,无需往返 backend。
16
+ 若需交付到素材库,先按 docs/agent/remixable-prefab-spec.md 整理 staging,再通过 bash 运行 `playcraft tools publish-prefab` CLI 命令。
17
+
18
+ ## 我做什么
19
+
20
+ - 将多张图片合并为精灵图(sprite sheet)
21
+ - 输出:精灵图 PNG + JSON 元数据(每帧的 x, y, w, h 及文件名索引)
22
+ - 可与 playcraft-image-generation、playcraft-image-processing 串联使用
23
+
24
+ ## 何时用我
25
+
26
+ 当变体需要:
27
+
28
+ - 角色动画(idle、walk、jump 等多帧)
29
+ - 序列帧动画
30
+ - 多张小图合并为图集(减少 draw call)
31
+
32
+ ## 命令用法
33
+
34
+ ```bash
35
+ playcraft image sprite-sheet \
36
+ --inputs <图1>,<图2>,<图3>,... \
37
+ --output <ta-workspace内的基路径> # 自动生成 .png 和 .json
38
+ [--columns <列数>] # 默认按平方根自动计算
39
+ [--padding <帧间距像素>] # 默认 0
40
+ [--cell-width <宽>] # 默认用第一张图的宽
41
+ [--cell-height <高>] # 默认用第一张图的高
42
+ ```
43
+
44
+ ### 输出文件
45
+
46
+ - `<output>.png` — 精灵图 PNG
47
+ - `<output>.json` — 帧坐标数据,格式如下:
48
+ ```json
49
+ {
50
+ "frames": {
51
+ "hero_idle_0.png": { "x": 0, "y": 0, "w": 64, "h": 64 },
52
+ "hero_idle_1.png": { "x": 64, "y": 0, "w": 64, "h": 64 }
53
+ },
54
+ "meta": { "image": "hero.png", "size": { "w": 256, "h": 64 }, "scale": 1 }
55
+ }
56
+ ```
57
+
58
+ ## 工作流
59
+
60
+ 1. **准备帧图片**:从 /project 只读读取参考图,或引用 ta-workspace 内已生成/处理的帧图
61
+ 2. **(可选)统一尺寸**:用 `playcraft image resize` 确保所有帧尺寸一致
62
+ 3. **合并精灵图**:
63
+ ```bash
64
+ playcraft image sprite-sheet \
65
+ --inputs ta-workspace/frame_0.png,ta-workspace/frame_1.png,ta-workspace/frame_2.png \
66
+ --output ta-workspace/hero-sheet \
67
+ --columns 4 \
68
+ --cell-width 64 --cell-height 64
69
+ # 生成:ta-workspace/hero-sheet.png 和 ta-workspace/hero-sheet.json
70
+ ```
71
+ 4. **(可选)交付到素材库**:
72
+ ```bash
73
+ playcraft tools publish-prefab \
74
+ --remix-project-id <ID> --template <名> --variant <名> --prefab <名> \
75
+ --staging-root <staging路径>
76
+ ```
77
+
78
+ ## 与步骤 5、6 融合
79
+
80
+ 完整流程示例:
81
+
82
+ ```bash
83
+ # 步骤 5:AI 生成帧
84
+ playcraft tools generate-image --prompt "hero idle frame 1, pixel art, transparent background" --output ta-workspace/f0.png
85
+ playcraft tools generate-image --prompt "hero idle frame 2, pixel art, transparent background" --output ta-workspace/f1.png
86
+
87
+ # 步骤 6:统一尺寸
88
+ playcraft image resize --input ta-workspace/f0.png --output ta-workspace/f0_64.png --width 64 --height 64 --fit contain
89
+ playcraft image resize --input ta-workspace/f1.png --output ta-workspace/f1_64.png --width 64 --height 64 --fit contain
90
+
91
+ # 步骤 7:合并精灵图
92
+ playcraft image sprite-sheet \
93
+ --inputs ta-workspace/f0_64.png,ta-workspace/f1_64.png \
94
+ --output ta-workspace/hero-idle \
95
+ --cell-width 64 --cell-height 64
96
+ ```
97
+
98
+ ## 游戏引擎兼容
99
+
100
+ JSON 格式设计兼容常见引擎(Phaser、PlayCanvas 的 sprite 格式),key 为文件名,value 含 x/y/w/h 坐标。