@playcraft/cli 0.0.40 → 0.0.42

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 (130) hide show
  1. package/README.md +66 -3
  2. package/dist/atom-plan/validate-atom-plan.js +298 -0
  3. package/dist/cli-root-help.js +1 -1
  4. package/dist/commands/3d.js +363 -0
  5. package/dist/commands/create.js +337 -0
  6. package/dist/commands/image.js +1337 -43
  7. package/dist/commands/recommend.js +1 -1
  8. package/dist/commands/remix.js +213 -0
  9. package/dist/commands/skills.js +1379 -0
  10. package/dist/commands/tools-3d.js +473 -0
  11. package/dist/commands/tools-generation.js +452 -0
  12. package/dist/commands/tools-project.js +400 -0
  13. package/dist/commands/tools-research.js +37 -0
  14. package/dist/commands/tools-research.test.js +216 -0
  15. package/dist/commands/tools-utils.js +183 -0
  16. package/dist/commands/tools.js +7 -616
  17. package/dist/config.js +2 -0
  18. package/dist/index.js +19 -1
  19. package/dist/utils/version-checker.js +8 -11
  20. package/package.json +9 -3
  21. package/project-template/.claude/agents/designer.md +120 -0
  22. package/project-template/.claude/agents/developer.md +124 -0
  23. package/project-template/.claude/agents/pm.md +164 -0
  24. package/project-template/.claude/agents/refs/README.md +73 -0
  25. package/project-template/.claude/agents/refs/designer-art-style-catalog.md +533 -0
  26. package/project-template/.claude/agents/refs/designer-color-audio-recipes.md +153 -0
  27. package/project-template/.claude/agents/refs/designer-deliverable-spec.md +191 -0
  28. package/project-template/.claude/agents/refs/designer-dimension-axis.md +27 -0
  29. package/project-template/.claude/agents/refs/designer-handoff-v2-checklist.md +68 -0
  30. package/project-template/.claude/agents/refs/designer-master-composite-recipes.md +208 -0
  31. package/project-template/.claude/agents/refs/designer-style-exploration-flow.md +37 -0
  32. package/project-template/.claude/agents/refs/developer-dev-handoff.md +109 -0
  33. package/project-template/.claude/agents/refs/developer-impl-cookbook.md +134 -0
  34. package/project-template/.claude/agents/refs/developer-phase1-flow.md +136 -0
  35. package/project-template/.claude/agents/refs/pm-workflow-detail.md +551 -0
  36. package/project-template/.claude/agents/refs/reviewer-convergence-eval.md +130 -0
  37. package/project-template/.claude/agents/refs/reviewer-six-dimension-eval.md +6 -0
  38. package/project-template/.claude/agents/refs/ta-3d-flip-recipe.md +85 -0
  39. package/project-template/.claude/agents/refs/ta-atlas-deliverable-standard.md +67 -0
  40. package/project-template/.claude/agents/refs/ta-batch-pipeline-recipes.md +120 -0
  41. package/project-template/.claude/agents/refs/ta-image-generation-detail.md +356 -0
  42. package/project-template/.claude/agents/refs/ta-image-ops-reference.md +495 -0
  43. package/project-template/.claude/agents/refs/ta-pipeline-cookbook.md +1108 -0
  44. package/project-template/.claude/agents/refs/ta-tools-reference.md +111 -0
  45. package/project-template/.claude/agents/refs/ta-vfx-preset-catalog.md +365 -0
  46. package/project-template/.claude/agents/reviewer.md +127 -0
  47. package/project-template/.claude/agents/technical-artist.md +122 -0
  48. package/project-template/.claude/hooks/README.md +44 -0
  49. package/project-template/.claude/hooks/validate-atom-plan.mjs +224 -0
  50. package/project-template/.claude/hooks/validate-workflow-stop.mjs +343 -0
  51. package/project-template/.claude/settings.json +36 -0
  52. package/project-template/.claude/settings.local.json +4 -0
  53. package/project-template/.claude/skills/playcraft-ad-psychology/SKILL.md +182 -0
  54. package/project-template/.claude/skills/playcraft-art-style-guide/SKILL.md +123 -0
  55. package/project-template/.claude/skills/playcraft-asset-state-sheet/SKILL.md +141 -0
  56. package/project-template/.claude/skills/playcraft-audio-generation/SKILL.md +280 -0
  57. package/project-template/.claude/skills/playcraft-batch-pipeline/SKILL.md +184 -0
  58. package/project-template/.claude/skills/playcraft-build-optimizer/SKILL.md +306 -0
  59. package/project-template/.claude/skills/playcraft-image-generation/SKILL.md +279 -0
  60. package/project-template/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +123 -0
  61. package/project-template/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +254 -0
  62. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +235 -0
  63. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +97 -0
  64. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +118 -0
  65. package/project-template/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +137 -0
  66. package/project-template/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +397 -0
  67. package/project-template/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +296 -0
  68. package/project-template/.claude/skills/playcraft-image-ops/SKILL.md +122 -0
  69. package/project-template/.claude/skills/playcraft-masking/SKILL.md +373 -0
  70. package/project-template/.claude/skills/playcraft-research/SKILL.md +212 -0
  71. package/project-template/.claude/skills/playcraft-sprite-generation/SKILL.md +423 -0
  72. package/project-template/.claude/skills/playcraft-storyboard/SKILL.md +167 -0
  73. package/project-template/.claude/skills/playcraft-style-qa/SKILL.md +270 -0
  74. package/project-template/.claude/skills/playcraft-text-rendering/SKILL.md +236 -0
  75. package/project-template/.claude/skills/playcraft-vfx-animation/SKILL.md +130 -0
  76. package/project-template/.claude/skills/playcraft-workflow/SKILL.md +485 -0
  77. package/project-template/.claude/skills/playwright-cli/SKILL.md +390 -0
  78. package/project-template/.claude/skills/playwright-cli/references/element-attributes.md +23 -0
  79. package/project-template/.claude/skills/playwright-cli/references/playwright-tests.md +39 -0
  80. package/project-template/.claude/skills/playwright-cli/references/request-mocking.md +87 -0
  81. package/project-template/.claude/skills/playwright-cli/references/running-code.md +240 -0
  82. package/project-template/.claude/skills/playwright-cli/references/session-management.md +226 -0
  83. package/project-template/.claude/skills/playwright-cli/references/spec-driven-testing.md +312 -0
  84. package/project-template/.claude/skills/playwright-cli/references/storage-state.md +275 -0
  85. package/project-template/.claude/skills/playwright-cli/references/test-generation.md +138 -0
  86. package/project-template/.claude/skills/playwright-cli/references/tracing.md +142 -0
  87. package/project-template/.claude/skills/playwright-cli/references/video-recording.md +157 -0
  88. package/project-template/.cursor/hooks.json +17 -0
  89. package/project-template/.cursor/rules/playcraft-orchestrator.mdc +137 -0
  90. package/project-template/.cursor/rules/playcraft-subagent-boundary.mdc +18 -0
  91. package/project-template/CLAUDE.md +280 -0
  92. package/project-template/assets/audio/bgm/.gitkeep +0 -0
  93. package/project-template/assets/audio/sfx/.gitkeep +0 -0
  94. package/project-template/assets/bundles/.gitkeep +0 -0
  95. package/project-template/assets/images/bg/.gitkeep +0 -0
  96. package/project-template/assets/images/reference/.gitkeep +0 -0
  97. package/project-template/assets/images/storyboard/.gitkeep +0 -0
  98. package/project-template/assets/images/tiles/.gitkeep +0 -0
  99. package/project-template/assets/images/ui/.gitkeep +0 -0
  100. package/project-template/assets/images/vfx/.gitkeep +0 -0
  101. package/project-template/assets/models/.gitkeep +0 -0
  102. package/project-template/docs/team/agent-conduct.md +121 -0
  103. package/project-template/docs/team/agent-runtime-matrix.md +62 -0
  104. package/project-template/docs/team/atom-plan-format.md +105 -0
  105. package/project-template/docs/team/collaboration.md +297 -0
  106. package/project-template/docs/team/core-model.md +50 -0
  107. package/project-template/docs/team/platform-capabilities.md +15 -0
  108. package/project-template/docs/team/workflow-changelog.md +65 -0
  109. package/project-template/docs/team/workflow-consistency-checklist.md +140 -0
  110. package/project-template/game/config/.gitkeep +0 -0
  111. package/project-template/game/gameplay/.gitkeep +0 -0
  112. package/project-template/game/scenes/.gitkeep +0 -0
  113. package/project-template/logs/.gitkeep +0 -0
  114. package/project-template/ta-workspace/logs/.gitkeep +0 -0
  115. package/project-template/ta-workspace/scripts/.gitkeep +0 -0
  116. package/project-template/ta-workspace/tmp/.gitkeep +0 -0
  117. package/project-template/templates/atom-plan.template.json +26 -0
  118. package/project-template/templates/atom-plan.template.md +108 -0
  119. package/project-template/templates/design-brief.template.md +195 -0
  120. package/project-template/templates/design-lens-checklist.reference.md +117 -0
  121. package/project-template/templates/design-methodology.md +99 -0
  122. package/project-template/templates/designer-log.template.md +114 -0
  123. package/project-template/templates/developer-log.template.md +134 -0
  124. package/project-template/templates/five-axis-framework.md +186 -0
  125. package/project-template/templates/intent-clarifications.template.md +58 -0
  126. package/project-template/templates/layout-spec.template.md +146 -0
  127. package/project-template/templates/project-state.template.md +237 -0
  128. package/project-template/templates/review-report.template.md +91 -0
  129. package/project-template/templates/style-exploration.template.md +93 -0
  130. package/project-template/templates/ta-log.template.md +343 -0
@@ -0,0 +1,167 @@
1
+ ---
2
+ name: playcraft-storyboard
3
+ description: PlayCraft Master Composite 生成指南。5 格完整 9:16 H5 竖屏拼成一张审阅图(横排或网格均可)。Designer Phase 1 必读。
4
+ triggers: 故事板,storyboard,4帧,四帧,体验流,experience flow,合成图,composite,master composite,Hook场景,EndCard场景,故事板生成,storyboard generation,gameplay flow visual,concept panel,5面板
5
+ ---
6
+
7
+ # PlayCraft Master Composite 生成指南
8
+
9
+ ## 0. 核心尺寸原则(只看比例)
10
+
11
+ **每一格 = 一张完整 H5 竖屏,宽高比固定 9:16**(与 `layout-spec.md` 的 1080×1920 一致)。
12
+
13
+ **整张输出 = 5 张完整 H5 的拼接**——可以横排,也可以 2+3 网格等;**禁止**把 5 个竖屏塞进 1:1 / 3:2 画布导致单格变形。
14
+
15
+ ### 单格(H5 viewport)
16
+
17
+ | 字段 | 值 |
18
+ | -------- | -------------------------- |
19
+ | 宽高比 | **9:16**(宽/高 = 0.5625) |
20
+ | 合约参考 | 1080 × 1920 |
21
+
22
+ ### 整图(5 格横排,默认布局)
23
+
24
+ ```
25
+ ┌────┬────┬────┬────┬────┐
26
+ │9:16│9:16│9:16│9:16│9:16│ 每格等宽等高,互不裁切
27
+ └────┴────┴────┴────┴────┘
28
+ 总宽高比 = 5×9 : 16 = 45:16 (≈ 2.81,不是 10:3,不是 1:1)
29
+ ```
30
+
31
+ | 档位 | 单格尺寸 | 整图尺寸(5 横排) |
32
+ | --------------- | -------------- | ------------------------------------------ |
33
+ | 推荐 2K | **720 × 1280** | **3600 × 1280** |
34
+ | 4K(长边≤4096) | **819 × 1455** | **4096 × 1455** |
35
+ | 合约 1:1 缩放 | 1080 × 1920 | 5400 × 1920(超 4K 宽,需 302 或接受缩小) |
36
+
37
+ > **已废弃**:720×1080(2:3)、3600×1080、`--aspect-ratio 10:3` — 单格不是 H5,会压扁/拉长。
38
+
39
+ ### 可选布局(仍是 5 张完整 9:16)
40
+
41
+ | 布局 | 整图宽×高(单格 W×H) | 说明 |
42
+ | -------------------- | --------------------- | ---------------------------------------- |
43
+ | **1×5 横排**(默认) | `5W × H` | Gate #2 审阅最常用 |
44
+ | 2+3 网格 | `3W × 2H` | 上行 2 屏、下行 3 屏;prompt 须写明 grid |
45
+ | 5×1 竖排 | `W × 5H` | 过高,一般不推荐(易超 4096 高) |
46
+
47
+ 选用非横排时,prompt 必须写清 **grid layout**,且 **each cell still 9:16 full mobile screen**。
48
+
49
+ ---
50
+
51
+ ## 1. 五格内容(Panel 1–5)
52
+
53
+ > **术语**(与 `docs/team/collaboration.md` 一致):**Panel 1 = concept panel**(Main Gameplay,含全部元素类型 + 静态文字 + 完整 UI,TA 主提取源);**Panels 2–5 = storyboard panels**(体验流分镜,Developer 对照)。
54
+
55
+ | # | 面板 | 用途 |
56
+ | --- | --------------------------------- | ------------------ |
57
+ | 1 | Main Gameplay (**concept panel**) | 完整游戏截屏 |
58
+ | 2 | Key Hook | 高光 / combo |
59
+ | 3 | Onboarding HUD | 教学引导 |
60
+ | 4 | End Card | 结算 + Install CTA |
61
+ | 5 | CTA Always Visible | 游戏中 CTA 常驻 |
62
+
63
+ ---
64
+
65
+ ## 2. Prompt 公式
66
+
67
+ ```
68
+ Mobile game UI contact sheet: exactly 5 separate complete portrait mobile game screens.
69
+
70
+ CRITICAL SIZE: Each of the 5 cells is a full 9:16 H5 playable viewport (same proportions as 1080x1920). Cells must NOT be stretched or squashed. Equal cell width and height.
71
+
72
+ Layout: [five equal panels in one horizontal row | OR 2+3 grid as specified].
73
+
74
+ Panel 1 '1. Main Gameplay': ...
75
+ Panel 2 '2. Key Hook': ...
76
+ Panel 3 '3. Onboarding HUD': ...
77
+ Panel 4 '4. End Card': ...
78
+ Panel 5 '5. CTA Always Visible': ...
79
+
80
+ [STYLE_KEYWORDS]. Thin dividers between cells only. Numbered label on top of each cell.
81
+ Total image exactly [3600] pixels wide by [1280] pixels tall (five 720x1280 cells in a row).
82
+ ```
83
+
84
+ **必须约束词**:
85
+
86
+ - `each cell is a full 9:16 H5 viewport` / `1080x1920 proportions`
87
+ - `equal cell width and height` / `NOT stretched`
88
+ - 总像素与布局一致(横排:`3600x1280` 或 `4096x1455`)
89
+
90
+ ---
91
+
92
+ ## 3. 生成命令
93
+
94
+ ### MC 模型白名单(强制)
95
+
96
+ Master Composite **只允许**下列高质量模型(须带 **provider 前缀**,禁止裸模型名):
97
+
98
+ | 用途 | `--image-model` | 说明 |
99
+ | -------- | -------------------------- | ------------------------------------------------- |
100
+ | **首选** | `mulerouter/gpt-image-2` | 细节、光影、复杂 UI;默认 Option A |
101
+ | **备选** | `mulerouter/nano-banana-2` | Gemini 3.1 Flash Image;Option B/C 或需不同画风时 |
102
+
103
+ **禁止**用于 MC:`gemini-*`、`flux-*`、`hy-image-*`、`wan*`、`qwen*`、裸 `gpt-image-2`、以及 `list-image-models` 中未列入上表的模型。
104
+
105
+ 多方案(A/B/C)应用 **不同 prompt / 美术方向** 探索,**不得**用低档模型换方案——质量门槛对所有 MC 选项相同。
106
+
107
+ ```bash
108
+ playcraft tools generate-image \
109
+ --prompt "<Section 2>" \
110
+ --output assets/images/storyboard/master_composite_option_A.png \
111
+ --image-model mulerouter/gpt-image-2 \
112
+ --aspect-ratio 45:16 \
113
+ --image-size 2K \
114
+ --width 3600 \
115
+ --height 1280
116
+ ```
117
+
118
+ Option B 示例(仍须白名单内):
119
+
120
+ ```bash
121
+ --image-model mulerouter/nano-banana-2 \
122
+ ```
123
+
124
+ > **必须**带 `mulerouter/` 前缀。**禁止**裸 `gpt-image-2`——fallback 会先走 `iegg-litellm`,成功时只能出 **1536×1024**,五格竖屏会被压扁。CLI 会在保存后自动校验像素,不合格直接失败。
125
+
126
+ **4K 档**:`--image-size 4K --width 4096 --height 1455`
127
+
128
+ | 参数 | 要求 |
129
+ | ---------------------- | ----------------------------------------------------------------------------------------- |
130
+ | `--aspect-ratio` | **`45:16`**(5 个 9:16 横排);**禁止 `1:1`、`10:3`** |
131
+ | `--width` / `--height` | **3600×1280**(2K)或 **4096×1455**(4K) |
132
+ | `--image-model` | **`mulerouter/gpt-image-2`** 或 **`mulerouter/nano-banana-2`** only(强制 provider 前缀) |
133
+
134
+ ### 生成后验收(强制)
135
+
136
+ ```bash
137
+ playcraft image info --input assets/images/storyboard/master_composite_option_A.png
138
+ ```
139
+
140
+ | 检查项 | 横排 2K | 横排 4K |
141
+ | --------------------- | ---------------------- | -------------------- |
142
+ | 总尺寸 | 3600×1280(±3%) | 4096×1455(±3%) |
143
+ | 总宽高比 width/height | **≈ 2.81**(45/16) | **≈ 2.81** |
144
+ | 单格推算 | 宽/5 : 高 ≈ **9:16** | 宽/5 : 高 ≈ **9:16** |
145
+ | 视觉 | 圆钮正圆、竖屏 UI 不扁 | 同左 |
146
+
147
+ 不合格(1024×1024、1:1、总比例≈3.33 等)→ **必须重生成**。
148
+
149
+ ---
150
+
151
+ ## 4. 核查清单
152
+
153
+ | # | 项 | 标准 |
154
+ | --- | --------------- | --------------------------- |
155
+ | 1 | 5 个 Panel 描述 | 完整 |
156
+ | 2 | 单格 9:16 | prompt + 像素双约束 |
157
+ | 3 | CLI | `45:16` + 成对 width/height |
158
+ | 4 | image info | 通过上表 |
159
+ | 5 | 方案数 | ≥2(designer.md) |
160
+
161
+ ---
162
+
163
+ ## 5. 进阶
164
+
165
+ > **Read `refs/designer-master-composite-recipes.md`**
166
+
167
+ > **TA 从 MC 拆层/抠图**:读 `playcraft-masking` skill(`decompose-layers` 整图分层 vs `segment`/`crop` 单元素)。
@@ -0,0 +1,270 @@
1
+ ---
2
+ name: playcraft-style-qa
3
+ description: 可玩广告风格质量验证方法论。涵盖 Designer Phase 2 样本自检流程(4 维度)、TA 风格解读检查方法(confidence 判定标准)、TA 微批次验证评分标准(5 级附示例场景)、色彩一致性检查、ICP 提问模板。Designer 在 Phase 2 生成样本后、TA 在 Step 0c 前必读。
4
+ triggers: 风格验证,style qa,风格一致性,style consistency,风格检查,微批次验证,micro-batch,style interpretation,confidence,TA自检,样本质量,品质验证,意图传递,ICP提问
5
+ ---
6
+
7
+ # PlayCraft 风格质量验证方法论
8
+
9
+ ## 0. 谁在什么时候用这个 Skill
10
+
11
+ | 角色 | 时机 | 用哪个章节 |
12
+ | ----------------- | -------------------------------------------- | ----------------------------- |
13
+ | **Designer** | Phase 2 **ICP 补洞 PNG** 生成后(非 ASR 板) | §1 Designer 自检 |
14
+ | **TA** | Step 0c(开始任何补全工作前)读 designer-log | §2 Style Interpretation Check |
15
+ | **TA** | Stage A 每类素材前 2 个补全完成后 | §3 Micro-Batch Validation |
16
+ | **Designer + TA** | 需要向对方提问时 | §5 ICP 提问模板 |
17
+
18
+ ---
19
+
20
+ ## 1. Designer 自检:ICP 补洞文件(designer-handoff-v2)
21
+
22
+ **不用于** ASR 双板或 MC(已在 Gate #2 锁定)。仅当 ICP 要求交付**单张孤立 PNG** 时使用。
23
+
24
+ 对照图:`assets/images/storyboard/master_composite_option_[selectedMcOption].png`(MC concept panel)。
25
+
26
+ ### 自检清单
27
+
28
+ ```
29
+ 样本路径:[ICP target path]
30
+ 对照图:master_composite_option_[X].png
31
+
32
+ [ ] 色调一致(Palette Locked hex)
33
+ [ ] 光影方向与 MC 一致
34
+ [ ] 边缘处理与 Style Intent Notes 一致
35
+ [ ] 质感特征匹配
36
+ ```
37
+
38
+ **通过**:记入 designer-log Per-Atom Delivery。**未通过**:重生成或注明 TA 注意事项。
39
+
40
+ ### 快速重生成
41
+
42
+ ```bash
43
+ playcraft tools generate-image \
44
+ --prompt "... matching locked MC style ..." \
45
+ --reference-image assets/images/storyboard/master_composite_option_[X].png \
46
+ --reference-image assets/images/reference/element_state_sheet_[X].png \
47
+ --output <ICP-path>
48
+ ```
49
+
50
+ ---
51
+
52
+ ## 2. TA Style Interpretation Check(Step 0c 必做)
53
+
54
+ 在开始任何补全工作前,阅读 `logs/designer-log.md` 中的 Style Intent Notes,**写出你自己的理解**,并判断 confidence 等级。
55
+
56
+ ### 阅读 Style Intent Notes 的方法
57
+
58
+ 逐条阅读 designer-log 中每个样本的 Style Intent Notes,提取:
59
+
60
+ 1. **主色调**:具体色温描述(暖橙、冷蓝、柔粉……)
61
+ 2. **光影方向**:光源位置(左上角 45°、正面平光……)
62
+ 3. **边缘处理**:描边有无 + 粗细 + 风格(硬边/柔边)
63
+ 4. **质感特征**:材质感(卡通光泽、哑光扁平、写实粗糙……)
64
+
65
+ ### Confidence 判定标准
66
+
67
+ 写到 `logs/ta-log.md` 的 Style Interpretation 表中:
68
+
69
+ | Confidence | 判定条件 | 处置方式 |
70
+ | ---------- | --------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
71
+ | **high** | Designer 提供了具体数值或对比词(如"饱和度约 70%,轮廓线 2px"),你的理解与描述完全一致 | 直接生成 |
72
+ | **medium** | Designer 用形容词描述(如"柔和"、"温暖"),你能理解大方向但无法确定具体参数 | 生成,但在 prompt 中加入你的理解作为约束词 |
73
+ | **low** | 描述模糊(如"有点古典风")、或不同样本的 Style Intent Notes 存在明显矛盾 | **STOP,写问题到 `docs/intent-clarifications.md`,等待 Designer 回答** |
74
+
75
+ ### 写入 ta-log.md 的格式
76
+
77
+ ```markdown
78
+ ## Style Interpretation
79
+
80
+ | # | Designer Intent(引用 designer-log 原文) | 我的理解 | Confidence | 处置 |
81
+ | --- | ----------------------------------------- | --------------------------------------------------- | ---------- | ------- |
82
+ | 1 | "warm amber tones, golden highlights" | 主色为 #E8A020 附近的暖橙,高光用米白色渐变 | high | proceed |
83
+ | 2 | "soft edges, no harsh outlines" | 无描边,边缘使用 2-3px 柔化过渡(anti-aliasing) | high | proceed |
84
+ | 3 | "有一种古典气质" | 理解不明确,可能是深色系+金色装饰,也可能是水墨风格 | low | clarify |
85
+ ```
86
+
87
+ > **规则**:任何一项 confidence = low,都必须先提问,不得继续该类型的素材生成。
88
+
89
+ ---
90
+
91
+ ## 3. Micro-Batch Validation 评分标准(TA)
92
+
93
+ **触发时机**:每种素材类型前 2 个补全完成后,与 **ASR crop 参考** 或 MC 概念面板并排对比评分。
94
+
95
+ ### 5 级评分标准
96
+
97
+ | 分数 | 标准 | 示例场景 |
98
+ | ----- | ---------------------------------------------------------------------------- | -------------------------------------------- |
99
+ | **5** | 完美匹配,可以乱真——若不看文件名,看不出哪个是 Designer 原始样本 | 色调、光影、边缘、质感全部一致 |
100
+ | **4** | 良好匹配,细看才发现微小差异——整体风格统一,不影响游戏视觉连贯性 | 高光角度略偏 5°,或饱和度差 ±5% |
101
+ | **3** | 可接受匹配,整体风格可识别,但有明显属性偏差——在游戏里仔细看会觉得"有点不对" | 色温偏冷了一档,或描边略粗 |
102
+ | **2** | 较差匹配,风格明显不一致——玩家会注意到这个元素和其他元素"不一样" | 应该是暖色调却生成了冷色调,边缘风格完全不同 |
103
+ | **1** | 完全不匹配,必须停止——风格完全是另一个方向 | 应该是卡通风却生成了写实风,色系完全对立 |
104
+
105
+ ### 评分流程
106
+
107
+ ```
108
+ 1. 并排打开 Designer 样本 + 你的第 1、2 个补全
109
+ 2. 逐维度对比(色调 / 光影 / 边缘 / 质感)
110
+ 3. 给整体打分(1–5)
111
+ 4. 写入 ta-log.md 的 Micro-Batch Validation 表
112
+ ```
113
+
114
+ **判断逻辑**:
115
+
116
+ - Score ≥ 3 → 继续批量生产剩余同类素材
117
+ - Score < 3 → **立即停止此类素材**,调整生成参数(见下方)或提问 ICP
118
+
119
+ ### Score < 3 时的参数调整策略
120
+
121
+ ```bash
122
+ # 问题:色调偏差(最常见)
123
+ # 调整:加强 reference-image 权重(多加一张已通过自检的 Designer 样本)
124
+ playcraft tools generate-image \
125
+ --reference-image assets/images/storyboard/master_composite_option_[X].png \
126
+ --reference-image <asr-crop-or-icp-reference>.png
127
+ --prompt "... [加入具体色调描述,从 Style Intent Notes 中提取]"
128
+
129
+ # 问题:边缘/描边风格不对
130
+ # 调整:在 prompt 中明确描边参数
131
+ # 原:无描边描述
132
+ # 改:加 "black outline 2px" 或 "no outline, smooth edges"
133
+
134
+ # 问题:模型选型问题(某模型不擅长该风格)
135
+ # 调整:换模型,保持 prompt 不变(不同模型对同类素材风格差异明显)
136
+ playcraft tools generate-image \
137
+ --image-model google/gemini-3.1-flash-image-preview \ # 换模型
138
+ --prompt "[与之前相同]" \
139
+ --reference-image [同上]
140
+ ```
141
+
142
+ ---
143
+
144
+ ## 4. 色彩一致性检查
145
+
146
+ ### 4.1 手动快速检查(单张比较)
147
+
148
+ 当视觉判断不确定时,用 `playcraft image info` 提取色彩信息辅助判断:
149
+
150
+ ```bash
151
+ # 提取参考图(概念图)的色彩信息
152
+ playcraft image info assets/images/storyboard/master_composite_option_[X].png
153
+ # 重点看:dominant colors(主色列表)
154
+
155
+ # 提取你生成的素材的色彩信息
156
+ playcraft image info assets/images/tiles/tile_001.png
157
+
158
+ # 对比两张图的 dominant colors:
159
+ # - 主色的色相(H)差异 < 15°:可接受
160
+ # - 主色的色相(H)差异 15–30°:需要在 prompt 中加强色调描述
161
+ # - 主色的色相(H)差异 > 30°:色调严重偏差,重新生成
162
+ ```
163
+
164
+ **参考色彩提取技巧**:
165
+
166
+ 从 `playcraft image info` 的输出中找到 `dominant colors` 字段,记录前 3 个颜色的 Hex 值。在下一次生成时,将这些 Hex 值直接写入 prompt:
167
+
168
+ ```bash
169
+ # 从概念图提取到主色 #E8A020(暖橙)+ #4A2800(深棕)+ #FFFAF0(奶白)
170
+ playcraft tools generate-image \
171
+ --prompt "... color palette dominated by warm amber #E8A020, dark brown #4A2800, cream white #FFFAF0 ..."
172
+ ```
173
+
174
+ ---
175
+
176
+ ### 4.2 自动化批量检查(推荐用于 Micro-Batch Validation)
177
+
178
+ 当需要对一批补全素材做客观量化评估时,使用 `compare-style.template.mjs` 脚本,避免纯靠 LLM 视觉判断的主观性。
179
+
180
+ **使用步骤**:
181
+
182
+ ```bash
183
+ # 1. 复制脚本模板到 ta-workspace
184
+ cp .claude/skills/playcraft-image-generation/reference/compare-style.template.mjs \
185
+ ta-workspace/scripts/compare-style.mjs
186
+
187
+ # 2. 编辑 CONFIG 区域(约 30 秒):
188
+ # referenceImage: 你的 Designer 样本路径
189
+ # targetDir: 你的 TA 补全素材目录
190
+ # excludeKeywords: 排除 Designer 样本自身(避免自比)
191
+
192
+ # 3. 运行
193
+ node ta-workspace/scripts/compare-style.mjs
194
+ ```
195
+
196
+ **输出示例**:
197
+
198
+ ```
199
+ 📊 色彩风格一致性检查
200
+ 参考图: assets/images/reference/element_state_sheet_[X].png (crop slot)
201
+
202
+ [COMPARE] asr_crop_ref.png vs tile_comp_01.png
203
+ 色相距离(加权): 8.3° → ✅ 优秀(< 15°)
204
+ 明度差异: 0.06 → ✅ 优秀(< 0.10)
205
+ 饱和度差异: 0.04 → ✅ 优秀(< 0.10)
206
+ 综合一致性评分: 5 / 5 → ✅ 良好
207
+
208
+ [COMPARE] tile_sample_1.png vs tile_comp_02.png
209
+ 色相距离(加权): 34.1° → ❌ 严重偏差(≥ 30°)
210
+ 明度差异: 0.22 → ❌ 严重偏差(≥ 0.20)
211
+ 饱和度差异: 0.09 → ✅ 优秀(< 0.10)
212
+ 综合一致性评分: 1 / 5 → ❌ 偏差过大,需停止
213
+
214
+ === 汇总 ===
215
+ 检查文件数: 2
216
+ 平均评分: 3.0 / 5
217
+ 低于阈值数: 1(阈值 3.0)
218
+ ⚠️ 建议:停止低分文件类型的批量生产,调整生成参数或向 Designer 提问 ICP
219
+ ```
220
+
221
+ **评分标准(与 §3 Micro-Batch Validation 对齐)**:
222
+
223
+ | 综合评分 | 色相距离 | 明度/饱和度差 | 对应 §3 评分 | 处置 |
224
+ | -------- | -------- | ------------- | ------------ | -------------------------- |
225
+ | 5 | < 15° | < 0.10 | 4–5 | 继续批量生产 |
226
+ | 4 | < 20° | < 0.15 | 4 | 继续批量生产 |
227
+ | 3 | < 30° | < 0.20 | 3 | 勉强可接受,调整参数后继续 |
228
+ | 2 | < 45° | < 0.30 | 2 | 停止,调整 prompt 后重试 |
229
+ | 1 | ≥ 45° | ≥ 0.30 | 1 | 停止,向 Designer 提问 ICP |
230
+
231
+ > **注意**:脚本基于 `playcraft image info` 的 dominant colors 做色相分析,是色彩维度的客观辅助,不能替代 §3 的整体视觉评估(边缘处理、质感特征等维度需人工判断)。
232
+
233
+ ---
234
+
235
+ ## 5. ICP 提问模板
236
+
237
+ **原则**:提问必须具体,必须引用文件路径和具体 atom,不能用"风格不对"这种模糊描述。
238
+
239
+ ### TA → Designer 提问格式
240
+
241
+ ```markdown
242
+ | # | From | To | Atom/Topic | Question | Raised At | Status |
243
+ | --- | ---- | -------- | -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | ------ |
244
+ | 1 | TA | Designer | tile_atom / 边缘风格 | `logs/designer-log.md` Style Intent Notes 中 tile_sample_1.png 的描述是 "soft edges",但 tile_sample_2.png 的 Anti-Pattern Notes 中写 "avoid blurry edges"。两者相互矛盾——请问边缘应该是柔化过渡(anti-aliasing)还是清晰硬边? | production | open |
245
+ ```
246
+
247
+ ### TA → PM 提问格式(故事板与 layout-spec 冲突)
248
+
249
+ ```markdown
250
+ | # | From | To | Atom/Topic | Question | Raised At | Status |
251
+ | --- | ---- | --- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | ------ |
252
+ | 1 | TA | PM | bg_atom / EndCard 背景 | `assets/images/storyboard/storyboard_confirmed.png` EndCard 帧(右下)显示背景为深蓝色夜景,但 `docs/layout-spec.md` zones.endcard.background 注释写的是"白色/浅色背景以突出 CTA 按钮"。请裁决:以故事板色调为准还是以 layout-spec 注释为准? | production | open |
253
+ ```
254
+
255
+ ### Designer → TA 回答格式
256
+
257
+ 回答时直接在表格 Status 改为 `answered`,并在同行末尾加 `| Answer |`:
258
+
259
+ ```markdown
260
+ | 1 | TA | Designer | ... | ... | ... | answered | tile_sample_1.png 的 "soft edges" 指 anti-aliasing(无描边);tile_sample_2.png 的 "avoid blurry edges" 是指不要过度模糊失去形状,两者不冲突。统一结论:无描边,边缘使用 2px anti-aliasing,保持形状清晰。 |
261
+ ```
262
+
263
+ ### 常见可问题类型速查
264
+
265
+ | 疑问类型 | 提问 Target | 示例提问 |
266
+ | ------------------------------ | ----------- | ---------------------------------------------------------------------- |
267
+ | Style Intent Notes 描述矛盾 | Designer | "XXX 样本的描述 A 和描述 B 相互矛盾,请澄清..." |
268
+ | 故事板帧与 layout-spec 冲突 | PM | "故事板第 N 帧显示 X,但 layout-spec 写 Y,以谁为准?" |
269
+ | Micro-Batch Score < 3 无法提升 | Designer | "尝试了 3 种参数组合,score 无法超过 3,需要新的 Style Intent 指导..." |
270
+ | 素材类型无 Designer 样本 | Designer | "atom-plan 中 XXX 类型缺少样本,TA 无法生成对应参考,请提供或指导..." |
@@ -0,0 +1,236 @@
1
+ ---
2
+ name: playcraft-text-rendering
3
+ description: PlayCraft 可玩广告文字渲染完整指南。涵盖全烤图策略(零字体文件)、静态文字图片规格、动态数字 Digit Sprite Strip 规格与运行时帧切割渲染模板、layout-spec textAssets 字段说明、三角色(Designer/TA/Developer)各自职责。任何涉及游戏内文字、字体、数字显示、分数、计时器的场景前必读。
4
+ triggers: 文字,字体,font,text,数字,digit,分数,score,计时器,timer,倒计时,countdown,sprite strip,digit strip,CTA文字,游戏标题,label,艺术字,显示字体,烤图,text rendering
5
+ ---
6
+
7
+ # PlayCraft 文字渲染完整指南
8
+
9
+ ## 0. 核心原则:零字体文件
10
+
11
+ 可玩广告的硬约束是**零外部请求**和**体积最小化**。因此:
12
+
13
+ - **不使用任何字体文件**(不内嵌 TTF/WOFF,不引用 CDN 字体)
14
+ - **所有可见文字都是图片资产**——和元素、背景一样走 Asset Contract
15
+ - 静态文字烤入图片,动态数字用 Digit Sprite Strip 帧切割渲染
16
+
17
+ ```
18
+ 文字类型决策树:
19
+ ├── 内容固定不变?
20
+ │ ├── 是 → 静态文字图片(Designer 烤入 Master Composite → TA 提取)
21
+ │ └── 否 → 动态文字
22
+ │ ├── 仅数字/符号?
23
+ │ │ ├── 是 → Digit Sprite Strip(Designer 生成 → Developer 帧切割)
24
+ │ │ └── 否 → 扩展 Sprite Strip 字符集(PM 在 layout-spec 指定)
25
+ ```
26
+
27
+ ---
28
+
29
+ ## 1. 静态文字(Static Text)
30
+
31
+ ### 什么是静态文字
32
+
33
+ 游戏中**内容不会变化**的文字元素:
34
+
35
+ | 示例 | 典型位置 |
36
+ | -------------------------- | ------------- |
37
+ | 游戏标题 | Hook 场景顶部 |
38
+ | 关卡名 "Level 1" | 场景过渡 |
39
+ | "YOU WIN" / "GAME OVER" | EndCard |
40
+ | CTA 按钮文字 "Install Now" | EndCard 底部 |
41
+ | 教学引导 "Tap to match" | Tutorial 场景 |
42
+
43
+ ### 生产流程
44
+
45
+ 1. **PM**:在 `layout-spec.md` `## Text Assets > Static Text` 表中列出所有静态文字,指定资产路径
46
+ 2. **Designer**:在 Master Composite 的 concept panel 中,将所有静态文字以**艺术风格**渲染(不是随便加文字——文字本身就是美术的一部分)
47
+ 3. **TA**:从 MC concept panel **逐条**提取(`crop` 优先;`segment --text` 最后手段)→ layout-spec 路径
48
+ 4. **提取失败** → ICP → **Designer** 交付该 id 的**单张**孤立 PNG(`designer-deliverable-spec.md`)
49
+ 5. **Developer**:`loadImage(path)` per Asset Contract
50
+
51
+ > Rows must appear in `designer-log` **ASR Coverage Matrix** (`Type: text`).
52
+
53
+ ### layout-spec 格式
54
+
55
+ ```markdown
56
+ ### Static Text (baked into Master Composite concept panel)
57
+
58
+ | id | text content | asset path | notes |
59
+ | -------- | -------------- | ----------------------------- | ------------------------ |
60
+ | title | "Fruit Blast" | assets/images/ui/title.png | TA extracts from concept |
61
+ | cta | "Install Now" | assets/images/ui/cta_text.png | TA extracts from concept |
62
+ | tutorial | "Tap to match" | assets/images/ui/tutorial.png | TA extracts from concept |
63
+ | win | "YOU WIN!" | assets/images/ui/win_text.png | TA extracts from concept |
64
+ ```
65
+
66
+ ---
67
+
68
+ ## 2. Digit Sprite Strip(动态数字)
69
+
70
+ ### 什么是 Digit Sprite Strip
71
+
72
+ 一张水平排列的图片,包含所有需要动态显示的字符。每个字符占据等宽的一个 cell。运行时按字符索引切割渲染。
73
+
74
+ ```
75
+ ┌────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┬────┐
76
+ │ 0 │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ : │ , │ . │
77
+ └────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┴────┘
78
+ cell0 cell1 cell2 ... cellN
79
+ ```
80
+
81
+ ### 生产流程
82
+
83
+ 1. **PM**:在 `layout-spec.md` `## Text Assets > Digit Sprite Strip` 中定义:
84
+ - `characters`:字符集字符串(如 `"0123456789:,."`)
85
+ - `cell size`:单个字符的宽高(如 `64x80`)
86
+ - `asset path`:如 `assets/images/ui/digits.png`
87
+ 2. **Designer**:Phase 2 生成整条 strip 图片(见下方生成命令),确保:
88
+ - 字符按 `characters` 字符串顺序从左到右排列
89
+ - 每个字符等宽(= cellWidth),高度 = cellHeight
90
+ - 艺术风格与 confirmed Master Composite 一致(使用 composite 作 `--reference-image`)
91
+ - 总图片宽度 = `characters.length × cellWidth`
92
+ - **约束**:总宽度不得超过 4096px(如 `18 chars × 200px = 3600px` ✓;若超限则减小 cellWidth)
93
+ 3. **TA**:验证 strip 尺寸(见下方验证命令),不合规则 resize 修正
94
+ 4. **Developer**:运行时帧切割渲染(见下方代码模板)
95
+
96
+ ### Designer 生成命令
97
+
98
+ ```bash
99
+ # 计算总尺寸
100
+ # totalWidth = characters.length × cellWidth(必须 ≤ 4096)
101
+ # totalHeight = cellHeight
102
+
103
+ playcraft tools generate-image \
104
+ --prompt "Horizontal digit sprite strip on solid [BG_COLOR] background. Single row of characters, left-to-right in exact order: [CHAR_1], [CHAR_2], ..., [CHAR_N]. Each character occupies exactly [CELL_W]px width × [CELL_H]px height. [N] characters total, evenly spaced, no gaps. Art style: [SAME style as confirmed Master Composite]. Characters rendered in [FONT_STYLE] with [COLOR] on [BG]. No extra decoration, no borders between characters, no labels." \
105
+ --output assets/images/ui/digits.png \
106
+ --reference-image assets/images/storyboard/master_composite.png \
107
+ --image-size 1K \
108
+ --image-model gpt-image-2
109
+ ```
110
+
111
+ > 若 `totalWidth × totalHeight` 小于模型最小输出(1024×1024),模型会自动适配。生成后 TA 需 resize 到精确尺寸。
112
+
113
+ ### TA 验证命令
114
+
115
+ ```bash
116
+ # 检查尺寸是否精确匹配
117
+ playcraft image info assets/images/ui/digits.png
118
+ # 期望输出:width = characters.length × cellWidth, height = cellHeight
119
+
120
+ # 如尺寸不匹配,resize 修正:
121
+ playcraft image resize \
122
+ --input assets/images/ui/digits.png \
123
+ --width [characters.length × cellWidth] \
124
+ --height [cellHeight] \
125
+ --output assets/images/ui/digits.png
126
+ ```
127
+
128
+ ### layout-spec 格式
129
+
130
+ ```markdown
131
+ ### Digit Sprite Strip (for dynamic numbers)
132
+
133
+ - **Characters**: `0123456789:,.`
134
+ - **Cell size**: 64x80
135
+ - **Asset path**: `assets/images/ui/digits.png`
136
+ ```
137
+
138
+ ### 常见字符集
139
+
140
+ | 游戏类型 | 推荐字符集 | 说明 |
141
+ | ------------- | -------------------- | ------- |
142
+ | 仅分数 | `0123456789` | 10 字符 |
143
+ | 分数 + 计时器 | `0123456789:.` | 12 字符 |
144
+ | 分数 + 倍率 | `0123456789x+,.` | 14 字符 |
145
+ | 完整 | `0123456789:,.x+-/%` | 18 字符 |
146
+
147
+ > PM 根据项目实际需求在 layout-spec 中指定,不使用固定字符集。
148
+
149
+ ---
150
+
151
+ ## 3. Developer 运行时渲染
152
+
153
+ ### Canvas 2D 帧切割
154
+
155
+ ```javascript
156
+ const DIGIT_CHARS = "0123456789:,."; // ← from layout-spec
157
+ const CELL_W = 64; // ← from layout-spec
158
+ const CELL_H = 80; // ← from layout-spec
159
+ const digitImg = await loadImage("assets/images/ui/digits.png");
160
+
161
+ function drawText(ctx, text, x, y, scale = 1) {
162
+ const w = CELL_W * scale;
163
+ const h = CELL_H * scale;
164
+ for (let i = 0; i < text.length; i++) {
165
+ const charIdx = DIGIT_CHARS.indexOf(text[i]);
166
+ if (charIdx >= 0) {
167
+ ctx.drawImage(
168
+ digitImg,
169
+ charIdx * CELL_W,
170
+ 0,
171
+ CELL_W,
172
+ CELL_H, // source rect
173
+ x + i * w,
174
+ y,
175
+ w,
176
+ h, // dest rect
177
+ );
178
+ }
179
+ }
180
+ }
181
+
182
+ // Usage
183
+ drawText(ctx, "12345", 100, 50); // score
184
+ drawText(ctx, "0:30", 300, 10, 0.75); // timer (scaled down)
185
+ ```
186
+
187
+ ### 对齐辅助
188
+
189
+ ```javascript
190
+ function drawTextCentered(ctx, text, centerX, y, scale = 1) {
191
+ const totalW = text.length * CELL_W * scale;
192
+ drawText(ctx, text, centerX - totalW / 2, y, scale);
193
+ }
194
+
195
+ function drawTextRight(ctx, text, rightX, y, scale = 1) {
196
+ const totalW = text.length * CELL_W * scale;
197
+ drawText(ctx, text, rightX - totalW, y, scale);
198
+ }
199
+ ```
200
+
201
+ ### PlayCanvas Engine (sprite frame)
202
+
203
+ 如果项目使用 PlayCanvas Engine,可以用 TextureAtlas 方式注册帧:
204
+
205
+ ```javascript
206
+ const atlas = new pc.TextureAtlas();
207
+ atlas.setFrame("0", { rect: new pc.Vec4(0, 0, CELL_W, CELL_H) });
208
+ atlas.setFrame("1", { rect: new pc.Vec4(CELL_W, 0, CELL_W, CELL_H) });
209
+ // ... register all chars
210
+
211
+ const sprite = new pc.Sprite(app.graphicsDevice, {
212
+ atlas: atlas,
213
+ frameKeys: DIGIT_CHARS.split(""),
214
+ });
215
+ ```
216
+
217
+ ---
218
+
219
+ ## 4. 角色职责速查
220
+
221
+ | 角色 | 文字相关职责 |
222
+ | ------------- | -------------------------------------------------------------------------------------------------- |
223
+ | **PM** | 在 layout-spec `textAssets` 中定义:静态文字列表 + digit strip 字符集/尺寸/路径 |
224
+ | **Designer** | ① Master Composite concept panel 中渲染所有静态文字(艺术风格);② Phase 2 生成 digit sprite strip |
225
+ | **TA** | ① 从 composite 提取静态文字图片(segment → resize);② 验证 digit strip 尺寸合规 |
226
+ | **Developer** | ① 静态文字按 Asset Contract 路径加载图片;② digit strip 帧切割渲染(上方代码模板) |
227
+
228
+ ---
229
+
230
+ ## 5. 注意事项
231
+
232
+ 1. **文字是美术的一部分**——Designer 不是"随便加文字",而是将文字作为视觉设计元素融入 concept
233
+ 2. **digit strip 字符顺序必须与 layout-spec 一致**——Developer 按索引切割,顺序错了显示就错
234
+ 3. **不要用 CSS text-shadow / -webkit-text-stroke 模拟艺术字**——这不是 web 页面,是游戏
235
+ 4. **CTA 按钮文字也是图片**——按钮背景 + 文字都从 composite 提取,Developer 只管点击事件
236
+ 5. **多语言场景**:如需多语言,PM 在 layout-spec 中为每种语言指定独立的文字资产路径,Designer 为每种语言生成对应文字