@playcraft/cli 0.1.53-beta → 0.1.54

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 (400) hide show
  1. package/README.md +3 -62
  2. package/dist/agent/local-backend.js +1 -1
  3. package/dist/cli-root-help.js +0 -2
  4. package/dist/commands/build-all.js +19 -5
  5. package/dist/commands/build.js +28 -15
  6. package/dist/commands/create.js +33 -26
  7. package/dist/commands/login.js +42 -84
  8. package/dist/commands/skills.js +0 -4
  9. package/dist/commands/tools-3d.js +0 -11
  10. package/dist/commands/tools-generation.js +0 -6
  11. package/dist/commands/tools.js +0 -2
  12. package/dist/config.js +4 -59
  13. package/dist/index.js +3 -42
  14. package/dist/remix/clone.js +0 -2
  15. package/dist/remix/init-template.js +0 -2
  16. package/dist/remix/pull.js +0 -2
  17. package/dist/remix/push.js +1 -21
  18. package/dist/utils/agent-api-client.js +30 -210
  19. package/dist/utils/playcraft-http-client.js +4 -6
  20. package/package.json +5 -15
  21. package/SKILLS_REGISTRY.md +0 -149
  22. package/dist/auth/account-activation.js +0 -157
  23. package/dist/auth/messages.js +0 -30
  24. package/dist/commands/build-temp.js +0 -26
  25. package/dist/commands/platform-skills.generated.js +0 -19
  26. package/dist/commands/playable.js +0 -53
  27. package/dist/commands/preview-runtime.js +0 -21
  28. package/dist/commands/tools-batch.js +0 -113
  29. package/dist/commands/video.js +0 -122
  30. package/dist/commands/workspace-runtime.js +0 -54
  31. package/dist/commands/workspace.js +0 -40
  32. package/dist/preview-runtime/distribution.js +0 -77
  33. package/dist/project-skills/builtin-import.js +0 -225
  34. package/dist/project-skills/commands.js +0 -77
  35. package/dist/project-skills/lifecycle.js +0 -28
  36. package/dist/project-skills/local-run.js +0 -112
  37. package/dist/project-skills/local-store.js +0 -221
  38. package/dist/project-skills/messages.js +0 -80
  39. package/dist/project-skills/reconcile.js +0 -62
  40. package/dist/project-skills/remote-cache.js +0 -51
  41. package/dist/project-skills/validation.js +0 -19
  42. package/dist/recording/messages.js +0 -40
  43. package/dist/recording/project-digest.js +0 -85
  44. package/dist/recording/recorder.js +0 -293
  45. package/dist/recording/scenario.js +0 -50
  46. package/dist/skill-registry/client.js +0 -345
  47. package/dist/skill-registry/commands.js +0 -180
  48. package/dist/skill-registry/evaluation-client.js +0 -156
  49. package/dist/skill-registry/evaluation-commands.js +0 -174
  50. package/dist/skill-registry/messages.js +0 -177
  51. package/dist/skill-registry/package.js +0 -275
  52. package/dist/skill-registry/platform-package.js +0 -100
  53. package/dist/utils/environment-endpoints.js +0 -17
  54. package/dist/utils/error-diagnostics.js +0 -20
  55. package/dist/utils/tool-operation-journal.js +0 -124
  56. package/dist/utils/video-evidence-git.js +0 -81
  57. package/dist/video-replication/client.js +0 -234
  58. package/dist/video-replication/comparison-evidence.js +0 -149
  59. package/dist/video-replication/comparison-files.js +0 -57
  60. package/dist/video-replication/comparison-log.js +0 -72
  61. package/dist/video-replication/comparison-messages.js +0 -104
  62. package/dist/video-replication/comparison-output.js +0 -63
  63. package/dist/video-replication/comparison-preflight.js +0 -66
  64. package/dist/video-replication/comparison.js +0 -230
  65. package/dist/video-replication/diagnostics.js +0 -41
  66. package/dist/video-replication/evidence.js +0 -165
  67. package/dist/video-replication/media.js +0 -112
  68. package/dist/video-replication/messages.js +0 -97
  69. package/dist/workspace/messages.js +0 -67
  70. package/dist/workspace/transfer-client.js +0 -237
  71. package/dist/workspace/transfer-errors.js +0 -48
  72. package/dist/workspace-runtime/batch/content-changes.js +0 -30
  73. package/dist/workspace-runtime/batch/control.js +0 -86
  74. package/dist/workspace-runtime/batch/deliver.js +0 -173
  75. package/dist/workspace-runtime/batch/freeze.js +0 -101
  76. package/dist/workspace-runtime/batch/generate.js +0 -249
  77. package/dist/workspace-runtime/batch/git.js +0 -40
  78. package/dist/workspace-runtime/batch/occupancy.js +0 -8
  79. package/dist/workspace-runtime/batch/policy.js +0 -70
  80. package/dist/workspace-runtime/batch/prepare.js +0 -317
  81. package/dist/workspace-runtime/batch/processes.js +0 -72
  82. package/dist/workspace-runtime/batch/records.js +0 -113
  83. package/dist/workspace-runtime/batch/routes.js +0 -61
  84. package/dist/workspace-runtime/batch/source-candidate.js +0 -86
  85. package/dist/workspace-runtime/batch/source-capture.js +0 -146
  86. package/dist/workspace-runtime/batch/source-failure.js +0 -43
  87. package/dist/workspace-runtime/batch/source-publish.js +0 -130
  88. package/dist/workspace-runtime/codex/app-server.js +0 -1065
  89. package/dist/workspace-runtime/codex/compact.js +0 -46
  90. package/dist/workspace-runtime/codex/config-toml.js +0 -107
  91. package/dist/workspace-runtime/codex/delivery-tools.js +0 -144
  92. package/dist/workspace-runtime/codex/jsonrpc-stdio.js +0 -145
  93. package/dist/workspace-runtime/codex/launcher-client.js +0 -177
  94. package/dist/workspace-runtime/codex/loopback.js +0 -146
  95. package/dist/workspace-runtime/codex/mcp-config.js +0 -39
  96. package/dist/workspace-runtime/codex/model-broker.js +0 -263
  97. package/dist/workspace-runtime/codex/native-adapter.js +0 -9
  98. package/dist/workspace-runtime/codex/permissions.js +0 -79
  99. package/dist/workspace-runtime/codex/thread-image.js +0 -38
  100. package/dist/workspace-runtime/codex/tool-response.js +0 -10
  101. package/dist/workspace-runtime/codex/ui-instructions.js +0 -4
  102. package/dist/workspace-runtime/codex/ui-tools.js +0 -203
  103. package/dist/workspace-runtime/codex/work-mode.js +0 -15
  104. package/dist/workspace-runtime/main.js +0 -10
  105. package/dist/workspace-runtime/persistence/journal.js +0 -365
  106. package/dist/workspace-runtime/persistence/native-subagents.js +0 -162
  107. package/dist/workspace-runtime/persistence/sqlite-client.js +0 -77
  108. package/dist/workspace-runtime/persistence/sqlite-worker.js +0 -1161
  109. package/dist/workspace-runtime/persistence/stopped-execution.js +0 -77
  110. package/dist/workspace-runtime/previews/diagnostics.js +0 -44
  111. package/dist/workspace-runtime/previews/output.js +0 -36
  112. package/dist/workspace-runtime/previews/publish.js +0 -283
  113. package/dist/workspace-runtime/previews/runtime-preview.js +0 -251
  114. package/dist/workspace-runtime/previews/single-file.js +0 -43
  115. package/dist/workspace-runtime/processes/managed-writes.js +0 -69
  116. package/dist/workspace-runtime/serve.js +0 -441
  117. package/dist/workspace-runtime/server/accept-operation.js +0 -61
  118. package/dist/workspace-runtime/server/asset-transfers.js +0 -63
  119. package/dist/workspace-runtime/server/auth.js +0 -21
  120. package/dist/workspace-runtime/server/connectivity.js +0 -211
  121. package/dist/workspace-runtime/server/desktop-host.js +0 -429
  122. package/dist/workspace-runtime/server/desktop-preview-config.js +0 -81
  123. package/dist/workspace-runtime/server/desktop-preview-service.js +0 -157
  124. package/dist/workspace-runtime/server/desktop-preview-static.js +0 -53
  125. package/dist/workspace-runtime/server/desktop-preview.js +0 -189
  126. package/dist/workspace-runtime/server/dispatch.js +0 -1655
  127. package/dist/workspace-runtime/server/endpoints.js +0 -21
  128. package/dist/workspace-runtime/server/execution-group.js +0 -90
  129. package/dist/workspace-runtime/server/http.js +0 -1339
  130. package/dist/workspace-runtime/server/lock.js +0 -53
  131. package/dist/workspace-runtime/server/operation-record.js +0 -33
  132. package/dist/workspace-runtime/server/rfb-watch-gate.js +0 -168
  133. package/dist/workspace-runtime/server/session-restore.js +0 -84
  134. package/dist/workspace-runtime/server/source-uploader.js +0 -138
  135. package/dist/workspace-runtime/server/submit-operation.js +0 -41
  136. package/dist/workspace-runtime/server/terminal-host.js +0 -366
  137. package/dist/workspace-runtime/server/types.js +0 -1
  138. package/dist/workspace-runtime/server/workspace-transfer.js +0 -168
  139. package/dist/workspace-runtime/verify-artifact.js +0 -59
  140. package/dist/workspace-runtime/workspaces/append-only-log.js +0 -62
  141. package/dist/workspace-runtime/workspaces/archive.js +0 -207
  142. package/dist/workspace-runtime/workspaces/artifact-events.js +0 -55
  143. package/dist/workspace-runtime/workspaces/artifact-files.js +0 -199
  144. package/dist/workspace-runtime/workspaces/artifact-receipts.js +0 -89
  145. package/dist/workspace-runtime/workspaces/artifacts.js +0 -282
  146. package/dist/workspace-runtime/workspaces/asset-library-import.js +0 -387
  147. package/dist/workspace-runtime/workspaces/asset-publication-access.js +0 -25
  148. package/dist/workspace-runtime/workspaces/asset-transfer-dependencies.js +0 -81
  149. package/dist/workspace-runtime/workspaces/asset-transfer-publish.js +0 -438
  150. package/dist/workspace-runtime/workspaces/asset-transfer-storage.js +0 -389
  151. package/dist/workspace-runtime/workspaces/attachment-content.js +0 -73
  152. package/dist/workspace-runtime/workspaces/attachments.js +0 -185
  153. package/dist/workspace-runtime/workspaces/batch-commit.js +0 -142
  154. package/dist/workspace-runtime/workspaces/binary-content.js +0 -65
  155. package/dist/workspace-runtime/workspaces/binary-write.js +0 -117
  156. package/dist/workspace-runtime/workspaces/cli-context.js +0 -23
  157. package/dist/workspace-runtime/workspaces/cli-credentials.js +0 -115
  158. package/dist/workspace-runtime/workspaces/composer-context.js +0 -147
  159. package/dist/workspace-runtime/workspaces/context-error.js +0 -2
  160. package/dist/workspace-runtime/workspaces/delivery-build.js +0 -331
  161. package/dist/workspace-runtime/workspaces/delivery-store.js +0 -168
  162. package/dist/workspace-runtime/workspaces/delivery.js +0 -64
  163. package/dist/workspace-runtime/workspaces/dependencies.js +0 -279
  164. package/dist/workspace-runtime/workspaces/developer-command.js +0 -98
  165. package/dist/workspace-runtime/workspaces/directories.js +0 -132
  166. package/dist/workspace-runtime/workspaces/directory-access.js +0 -37
  167. package/dist/workspace-runtime/workspaces/directory-attachments.js +0 -245
  168. package/dist/workspace-runtime/workspaces/directory-create.js +0 -57
  169. package/dist/workspace-runtime/workspaces/directory-maintenance.js +0 -111
  170. package/dist/workspace-runtime/workspaces/directory-mutations.js +0 -238
  171. package/dist/workspace-runtime/workspaces/directory-revisions.js +0 -56
  172. package/dist/workspace-runtime/workspaces/directory-stats.js +0 -49
  173. package/dist/workspace-runtime/workspaces/disk-snapshot.js +0 -31
  174. package/dist/workspace-runtime/workspaces/empty-template.js +0 -42
  175. package/dist/workspace-runtime/workspaces/file-content.js +0 -48
  176. package/dist/workspace-runtime/workspaces/files-search.js +0 -116
  177. package/dist/workspace-runtime/workspaces/files.js +0 -150
  178. package/dist/workspace-runtime/workspaces/git-credential-broker.js +0 -312
  179. package/dist/workspace-runtime/workspaces/git-credential-helper.js +0 -68
  180. package/dist/workspace-runtime/workspaces/git-direct-store.js +0 -155
  181. package/dist/workspace-runtime/workspaces/git.js +0 -670
  182. package/dist/workspace-runtime/workspaces/instructions.js +0 -56
  183. package/dist/workspace-runtime/workspaces/json5-edit.js +0 -313
  184. package/dist/workspace-runtime/workspaces/library-attachments.js +0 -268
  185. package/dist/workspace-runtime/workspaces/operation-log.js +0 -23
  186. package/dist/workspace-runtime/workspaces/optional-platform-skills.js +0 -14
  187. package/dist/workspace-runtime/workspaces/parameter-agent-inputs.js +0 -97
  188. package/dist/workspace-runtime/workspaces/parameter-agent-protocol.js +0 -40
  189. package/dist/workspace-runtime/workspaces/parameter-agent-store.js +0 -58
  190. package/dist/workspace-runtime/workspaces/parameter-agent.js +0 -284
  191. package/dist/workspace-runtime/workspaces/parameter-assets.js +0 -189
  192. package/dist/workspace-runtime/workspaces/parameters.js +0 -329
  193. package/dist/workspace-runtime/workspaces/prepare.js +0 -278
  194. package/dist/workspace-runtime/workspaces/registry.js +0 -251
  195. package/dist/workspace-runtime/workspaces/remix-references.js +0 -301
  196. package/dist/workspace-runtime/workspaces/revisions.js +0 -31
  197. package/dist/workspace-runtime/workspaces/session-image.js +0 -104
  198. package/dist/workspace-runtime/workspaces/shared-git.js +0 -40
  199. package/dist/workspace-runtime/workspaces/skill-artifact-loader.js +0 -95
  200. package/dist/workspace-runtime/workspaces/skills.js +0 -191
  201. package/dist/workspace-runtime/workspaces/theme-asset-index.js +0 -157
  202. package/dist/workspace-runtime/workspaces/transfer-quota.js +0 -69
  203. package/dist/workspace-runtime/workspaces/transfer.js +0 -471
  204. package/dist/workspace-runtime/workspaces/turn-changes.js +0 -75
  205. package/dist/workspace-runtime/workspaces/video-attachments.js +0 -49
  206. package/project-template/.claude/skills/playcraft-replica-validation/SKILL.md +0 -25
  207. package/project-template/.claude/skills/playcraft-replica-validation/references/contracts.md +0 -79
  208. package/project-template/.claude/skills/playcraft-video-understanding/SKILL.md +0 -29
  209. package/project-template/.claude/skills/playcraft-video-understanding/references/contracts.md +0 -37
  210. package/project-template-v2/.claude/agents/artist.md +0 -82
  211. package/project-template-v2/.claude/agents/developer.md +0 -153
  212. package/project-template-v2/.claude/agents/game-designer.md +0 -264
  213. package/project-template-v2/.claude/agents/refs/artist-art-style-catalog.md +0 -533
  214. package/project-template-v2/.claude/agents/refs/artist-color-audio-recipes.md +0 -153
  215. package/project-template-v2/.claude/agents/refs/artist-dimension-axis.md +0 -27
  216. package/project-template-v2/.claude/agents/refs/artist-master-composite-recipes.md +0 -208
  217. package/project-template-v2/.claude/agents/refs/atom-skill-library.md +0 -81
  218. package/project-template-v2/.claude/agents/refs/developer-impl-cookbook.md +0 -432
  219. package/project-template-v2/.claude/agents/refs/framework-5-component-filter.md +0 -252
  220. package/project-template-v2/.claude/agents/refs/framework-game-feel-juice.md +0 -266
  221. package/project-template-v2/.claude/agents/refs/framework-mda.md +0 -147
  222. package/project-template-v2/.claude/agents/refs/game-designer-gameplay-sufficiency.md +0 -123
  223. package/project-template-v2/.claude/agents/refs/ta-3d-flip-recipe.md +0 -88
  224. package/project-template-v2/.claude/agents/refs/ta-atlas-deliverable-standard.md +0 -67
  225. package/project-template-v2/.claude/agents/refs/ta-batch-pipeline-recipes.md +0 -120
  226. package/project-template-v2/.claude/agents/refs/ta-image-generation-detail.md +0 -300
  227. package/project-template-v2/.claude/agents/refs/ta-image-ops-reference.md +0 -495
  228. package/project-template-v2/.claude/agents/refs/ta-pipeline-cookbook.md +0 -1141
  229. package/project-template-v2/.claude/agents/refs/ta-tools-reference.md +0 -111
  230. package/project-template-v2/.claude/agents/refs/ta-vfx-preset-catalog.md +0 -365
  231. package/project-template-v2/.claude/agents/refs/threejs-cannon-pitfalls.md +0 -412
  232. package/project-template-v2/.claude/agents/reviewer.md +0 -75
  233. package/project-template-v2/.claude/agents/technical-artist.md +0 -86
  234. package/project-template-v2/.claude/hooks/snapshot-milestone.mjs +0 -243
  235. package/project-template-v2/.claude/hooks/user-prompt.mjs +0 -133
  236. package/project-template-v2/.claude/settings.json +0 -33
  237. package/project-template-v2/.claude/skills/brainstorming/SKILL.md +0 -161
  238. package/project-template-v2/.claude/skills/brainstorming/scripts/frame-template.html +0 -270
  239. package/project-template-v2/.claude/skills/brainstorming/scripts/helper.js +0 -177
  240. package/project-template-v2/.claude/skills/brainstorming/scripts/server.cjs +0 -354
  241. package/project-template-v2/.claude/skills/brainstorming/scripts/start-server.sh +0 -148
  242. package/project-template-v2/.claude/skills/brainstorming/scripts/stop-server.sh +0 -56
  243. package/project-template-v2/.claude/skills/brainstorming/scripts/wait-for-selection.sh +0 -62
  244. package/project-template-v2/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
  245. package/project-template-v2/.claude/skills/brainstorming/visual-companion.md +0 -309
  246. package/project-template-v2/.claude/skills/playcraft-ad-psychology/SKILL.md +0 -182
  247. package/project-template-v2/.claude/skills/playcraft-art-style-guide/SKILL.md +0 -123
  248. package/project-template-v2/.claude/skills/playcraft-asset-state-sheet/SKILL.md +0 -205
  249. package/project-template-v2/.claude/skills/playcraft-audio-generation/SKILL.md +0 -280
  250. package/project-template-v2/.claude/skills/playcraft-batch-pipeline/SKILL.md +0 -184
  251. package/project-template-v2/.claude/skills/playcraft-build-optimizer/SKILL.md +0 -306
  252. package/project-template-v2/.claude/skills/playcraft-image-generation/SKILL.md +0 -370
  253. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +0 -123
  254. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +0 -254
  255. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +0 -333
  256. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +0 -95
  257. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +0 -118
  258. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +0 -136
  259. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +0 -397
  260. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +0 -296
  261. package/project-template-v2/.claude/skills/playcraft-image-ops/SKILL.md +0 -122
  262. package/project-template-v2/.claude/skills/playcraft-image-processing/SKILL.md +0 -219
  263. package/project-template-v2/.claude/skills/playcraft-masking/SKILL.md +0 -373
  264. package/project-template-v2/.claude/skills/playcraft-playable-optimization/SKILL.md +0 -161
  265. package/project-template-v2/.claude/skills/playcraft-research/SKILL.md +0 -215
  266. package/project-template-v2/.claude/skills/playcraft-skill-recommender/SKILL.md +0 -382
  267. package/project-template-v2/.claude/skills/playcraft-sprite-generation/SKILL.md +0 -423
  268. package/project-template-v2/.claude/skills/playcraft-sprite-remix/SKILL.md +0 -158
  269. package/project-template-v2/.claude/skills/playcraft-sprite-sheet/SKILL.md +0 -100
  270. package/project-template-v2/.claude/skills/playcraft-storyboard/SKILL.md +0 -167
  271. package/project-template-v2/.claude/skills/playcraft-style-qa/SKILL.md +0 -270
  272. package/project-template-v2/.claude/skills/playcraft-text-rendering/SKILL.md +0 -236
  273. package/project-template-v2/.claude/skills/playcraft-vfx-animation/SKILL.md +0 -130
  274. package/project-template-v2/.claude/skills/playwright-cli/SKILL.md +0 -390
  275. package/project-template-v2/.claude/skills/playwright-cli/references/element-attributes.md +0 -23
  276. package/project-template-v2/.claude/skills/playwright-cli/references/playwright-tests.md +0 -39
  277. package/project-template-v2/.claude/skills/playwright-cli/references/request-mocking.md +0 -87
  278. package/project-template-v2/.claude/skills/playwright-cli/references/running-code.md +0 -240
  279. package/project-template-v2/.claude/skills/playwright-cli/references/session-management.md +0 -226
  280. package/project-template-v2/.claude/skills/playwright-cli/references/spec-driven-testing.md +0 -308
  281. package/project-template-v2/.claude/skills/playwright-cli/references/storage-state.md +0 -275
  282. package/project-template-v2/.claude/skills/playwright-cli/references/test-generation.md +0 -134
  283. package/project-template-v2/.claude/skills/playwright-cli/references/tracing.md +0 -142
  284. package/project-template-v2/.claude/skills/playwright-cli/references/video-recording.md +0 -153
  285. package/project-template-v2/.claude/skills/session-analyzer/SKILL.md +0 -386
  286. package/project-template-v2/.claude/skills/session-analyzer/scripts/execution-breakdown.mjs +0 -182
  287. package/project-template-v2/.claude/skills/session-analyzer/scripts/find-turns.mjs +0 -72
  288. package/project-template-v2/.claude/skills/session-analyzer/scripts/heavy-output.mjs +0 -121
  289. package/project-template-v2/.claude/skills/session-analyzer/scripts/resolve-session.mjs +0 -102
  290. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-stats.mjs +0 -127
  291. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-tool-timeline.mjs +0 -106
  292. package/project-template-v2/.claude/skills/session-analyzer/scripts/time-gaps.mjs +0 -128
  293. package/project-template-v2/.claude/skills/session-analyzer/scripts/turn-timeline.mjs +0 -67
  294. package/project-template-v2/.claude/snapshot.mjs +0 -263
  295. package/project-template-v2/.playcraft/skills.lock.json +0 -152
  296. package/project-template-v2/CLAUDE.md +0 -146
  297. package/project-template-v2/assets/audio/bgm/.gitkeep +0 -0
  298. package/project-template-v2/assets/audio/sfx/.gitkeep +0 -0
  299. package/project-template-v2/assets/bundles/.gitkeep +0 -0
  300. package/project-template-v2/assets/images/bg/.gitkeep +0 -0
  301. package/project-template-v2/assets/images/reference/.gitkeep +0 -0
  302. package/project-template-v2/assets/images/storyboard/.gitkeep +0 -0
  303. package/project-template-v2/assets/images/tiles/.gitkeep +0 -0
  304. package/project-template-v2/assets/images/ui/.gitkeep +0 -0
  305. package/project-template-v2/assets/images/vfx/.gitkeep +0 -0
  306. package/project-template-v2/assets/models/.gitkeep +0 -0
  307. package/project-template-v2/docs/harness/iteration-1/context-flow.md +0 -254
  308. package/project-template-v2/docs/harness/iteration-1/generate-flow.md +0 -91
  309. package/project-template-v2/docs/harness/iteration-1/ideate-flow.md +0 -214
  310. package/project-template-v2/docs/harness/iteration-1/optimize-flow.md +0 -75
  311. package/project-template-v2/docs/harness/iteration-1/wrapup-flow.md +0 -63
  312. package/project-template-v2/docs/harness/iteration-2/context-flow.md +0 -223
  313. package/project-template-v2/docs/harness/iteration-2/generate-flow.md +0 -129
  314. package/project-template-v2/docs/harness/iteration-2/ideate-flow.md +0 -267
  315. package/project-template-v2/docs/harness/iteration-2/optimize-flow.md +0 -164
  316. package/project-template-v2/docs/harness/iteration-2/wrapup-flow.md +0 -115
  317. package/project-template-v2/docs/harness/orchestrator-flow.md +0 -364
  318. package/project-template-v2/docs/project-state.json +0 -60
  319. package/project-template-v2/docs/project-state.md +0 -72
  320. package/project-template-v2/docs/standards/README.md +0 -225
  321. package/project-template-v2/docs/standards/agent-behavior-standards.md +0 -174
  322. package/project-template-v2/docs/standards/artifacts/design-brief.md +0 -19
  323. package/project-template-v2/docs/standards/artifacts/design.md +0 -22
  324. package/project-template-v2/docs/standards/artifacts/game-code.md +0 -41
  325. package/project-template-v2/docs/standards/artifacts/todo-list.md +0 -41
  326. package/project-template-v2/docs/standards/iter1-agent-behavior-standards.md +0 -343
  327. package/project-template-v2/game/index.ts +0 -18
  328. package/project-template-v2/globals.d.ts +0 -51
  329. package/project-template-v2/index.css +0 -34
  330. package/project-template-v2/index.html +0 -18
  331. package/project-template-v2/main.ts +0 -9
  332. package/project-template-v2/package.json +0 -46
  333. package/project-template-v2/skills/_shared/scripts/dispatch-clear.mjs +0 -31
  334. package/project-template-v2/skills/_shared/scripts/dispatch-set.mjs +0 -86
  335. package/project-template-v2/skills/_shared/scripts/dod-check.mjs +0 -153
  336. package/project-template-v2/skills/_shared/scripts/handoff-append.mjs +0 -70
  337. package/project-template-v2/skills/_shared/scripts/lib/validator-artifacts.mjs +0 -91
  338. package/project-template-v2/skills/_shared/scripts/pipeline/dod-config.mjs +0 -131
  339. package/project-template-v2/skills/_shared/scripts/pipeline/index.mjs +0 -80
  340. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-1-core.mjs +0 -90
  341. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-2-wrap.mjs +0 -93
  342. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-3-visual.mjs +0 -23
  343. package/project-template-v2/skills/_shared/scripts/render-project-state.mjs +0 -230
  344. package/project-template-v2/skills/_shared/scripts/state-advance-stage.mjs +0 -58
  345. package/project-template-v2/skills/_shared/scripts/state-get.mjs +0 -339
  346. package/project-template-v2/skills/_shared/scripts/state-handoff.mjs +0 -39
  347. package/project-template-v2/skills/_shared/scripts/state-set.mjs +0 -94
  348. package/project-template-v2/skills/_shared/scripts/state-store.mjs +0 -783
  349. package/project-template-v2/skills/_shared/scripts/todo-add.mjs +0 -88
  350. package/project-template-v2/skills/_shared/scripts/todo-get.mjs +0 -130
  351. package/project-template-v2/skills/_shared/scripts/todo-remove.mjs +0 -33
  352. package/project-template-v2/skills/_shared/scripts/todo-set.mjs +0 -47
  353. package/project-template-v2/skills/_shared/scripts/verify-asset-code-sync.mjs +0 -268
  354. package/project-template-v2/skills/_shared/scripts/verify-env.mjs +0 -285
  355. package/project-template-v2/skills/_shared/scripts/verify-placeholders.mjs +0 -161
  356. package/project-template-v2/skills/playable-autoplay/SKILL.md +0 -176
  357. package/project-template-v2/skills/playable-autoplay/agents/openai.yaml +0 -4
  358. package/project-template-v2/skills/playable-debug/SKILL.md +0 -116
  359. package/project-template-v2/skills/playable-debug/agents/openai.yaml +0 -4
  360. package/project-template-v2/skills/playable-debug/references/debug-config.md +0 -40
  361. package/project-template-v2/skills/playable-record/SKILL.md +0 -140
  362. package/project-template-v2/skills/playable-record/scripts/lib/dev-server.mjs +0 -104
  363. package/project-template-v2/skills/playable-record/scripts/lib/record-audio-bridge.js +0 -141
  364. package/project-template-v2/skills/playable-record/scripts/record-playable.mjs +0 -425
  365. package/project-template-v2/skills/playable-record/scripts/verify-contract.mjs +0 -261
  366. package/project-template-v2/skills/playable-record/scripts/verify-firstwin.mjs +0 -398
  367. package/project-template-v2/skills/playable-record/scripts/verify-fusion.mjs +0 -322
  368. package/project-template-v2/skills/playable-record/scripts/verify-lifecycle.mjs +0 -105
  369. package/project-template-v2/skills/playable-record/scripts/verify-vlm-video.mjs +0 -230
  370. package/project-template-v2/skills/playable-validate/SKILL.md +0 -61
  371. package/project-template-v2/skills/playable-validate/validation-rules.md +0 -14
  372. package/project-template-v2/skills/playable-verify-ui/SKILL.md +0 -63
  373. package/project-template-v2/skills/playable-verify-ui/scripts/lib/__init__.py +0 -1
  374. package/project-template-v2/skills/playable-verify-ui/scripts/lib/config_expr.js +0 -218
  375. package/project-template-v2/skills/playable-verify-ui/scripts/lib/node_utils.js +0 -51
  376. package/project-template-v2/skills/playable-verify-ui/scripts/lib/profile_loader.py +0 -59
  377. package/project-template-v2/skills/playable-verify-ui/scripts/lib/report.py +0 -106
  378. package/project-template-v2/skills/playable-verify-ui/scripts/lib/runtime_contract.js +0 -116
  379. package/project-template-v2/skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py +0 -59
  380. package/project-template-v2/skills/playable-verify-ui/scripts/verify_hardcoded_layout.js +0 -64
  381. package/project-template-v2/skills/playable-verify-ui/scripts/verify_runtime_contract.js +0 -58
  382. package/project-template-v2/skills/playable-verify-ui/scripts/verify_text_overlap.py +0 -333
  383. package/project-template-v2/ta-workspace/scripts/.gitkeep +0 -0
  384. package/project-template-v2/tsconfig.json +0 -20
  385. package/project-template-v2/vite.config.ts +0 -27
  386. package/project-templates/batch-locks/phaser.yaml +0 -922
  387. package/project-templates/batch-locks/threejs.yaml +0 -978
  388. package/project-templates/empty/AGENTS.md +0 -41
  389. package/project-templates/empty/gitignore +0 -33
  390. package/templates/preview-runtime/v1/README.md +0 -71
  391. package/templates/preview-runtime/v1/build-preview.mjs +0 -1324
  392. package/templates/preview-runtime/v1/manifest.json +0 -17
  393. package/templates/preview-runtime/v1/release-guard.mjs +0 -87
  394. package/templates/preview-runtime/v1/runtime.d.mts +0 -3
  395. package/templates/preview-runtime/v1/runtime.d.ts +0 -3
  396. package/templates/preview-runtime/v1/runtime.mjs +0 -1121
  397. package/templates/preview-runtime/v1/types/adapters.d.ts +0 -26
  398. package/templates/preview-runtime/v1/types/preview.d.ts +0 -23
  399. package/templates/preview-runtime/v1/types/protocol.d.ts +0 -94
  400. package/templates/preview-runtime/v1/types/runtime.d.ts +0 -14
@@ -1,61 +0,0 @@
1
- ---
2
- name: playable-validate
3
- description: >-
4
- Validation loop for template-v2. Use after game code is runnable to verify
5
- runtime contract, lifecycle phase path, first-win, fusion, placeholders, asset
6
- sync, MP4 recording, and VLM video review. Iteration-2 optimize adds lifecycle
7
- to the standard DoD sequence. UI layout validation is in playable-verify-ui.
8
- ---
9
-
10
- # Playable Validate
11
-
12
- ## Iteration-1 DoD 序列
13
-
14
- ```bash
15
- npm run verify:env # 环境预检 (Node/Python/Playwright)
16
- npm run verify:contract # window.__playable 合约接线
17
- npm run verify:firstwin # autoPlay() 能到达 ENDCARD
18
- npm run verify:fusion # 多玩法融合接线 (单玩法自动 no-op)
19
- npm run record:mp4 -- --headed --fps=60
20
- npm run verify:vlm-video -- --record-first
21
- ```
22
-
23
- ## Iteration-2 DoD 序列(在 iter-1 序列基础上新增)
24
-
25
- ```bash
26
- npm run verify:lifecycle # phasePath: HOOK→TUTORIAL→GAMEPLAY→WIN/FAIL→ENDCARD 完整无跳跃
27
- ```
28
-
29
- lifecycle 失败时:检查 phasePath 输出,定位哪个 phase 缺失,路由回 generate 修复状态机骨架。
30
-
31
- ## 辅助检查(generate / optimize 阶段可按需运行)
32
-
33
- ```bash
34
- npm run verify:placeholders # ✅ 可用:代码引用的资产路径实际存在于磁盘
35
- npm run verify:asset-sync # ✅ 可用:资产文件与代码引用双向一致
36
- npm run verify:runtime-contract # ✅ 可用:静态合约检查(无需浏览器)
37
-
38
- # ⚠️ 暂不可用——需先创建 playable.ui.profile.yaml:
39
- # npm run verify:hardcoded-layout
40
- # python3 skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py --root .
41
- ```
42
-
43
- ## Scope
44
-
45
- | 命令 | 检查内容 | 产出 |
46
- | ------------------------- | ------------------------------------------------------------- | ------------------------- |
47
- | `verify:env` | Node ≥20 / Python3 / Pillow / Playwright Chromium | 控制台报告 |
48
- | `verify:contract` | `window.__playable` 动态接线 | `validate/contract.json` |
49
- | `verify:lifecycle` | phasePath 顺序完整性(HOOK 开头,ENDCARD 结尾,中间节点存在) | `validate/lifecycle.json` |
50
- | `verify:firstwin` | autoPlay 到达 ENDCARD + isGameOver | `validate/firstwin.json` |
51
- | `verify:fusion` | 多玩法 atom 融合类型 + 源码接线 | `validate/fusion.json` |
52
- | `verify:placeholders` | 代码 load.image/atlas 路径磁盘存在 | 控制台 |
53
- | `verify:asset-sync` | 资产↔代码双向引用一致 | 控制台 |
54
- | `verify:runtime-contract` | 静态合约(无浏览器) | 控制台 |
55
- | `verify:hardcoded-layout` | 硬编码 px 宽高 | 控制台 |
56
- | `record:mp4` | headed 60fps MP4 | `recordings/*.mp4` |
57
- | `verify:vlm-video` | VLM 语义视频评审 | `validate/vlm-video.json` |
58
-
59
- ## UI 布局验证
60
-
61
- 文字叠加、fetch 反模式、布局区域规则等 UI 检查在 `playable-verify-ui` skill。
@@ -1,14 +0,0 @@
1
- # Validation Rules
2
-
3
- Current template-v2 iteration 1 validates the runtime/video path only.
4
-
5
- | Check | Command | Pass condition |
6
- | ---------------- | -------------------------- | --------------------------------------------------------------------------------------- |
7
- | Runtime contract | `npm run verify:contract` | `window.__playable.autoPlay()` and `getState()` exist; initial phase is `HOOK` |
8
- | First win | `npm run verify:firstwin` | Auto-play reaches `ENDCARD` with `isGameOver=true` |
9
- | Fusion | `npm run verify:fusion` | Single gameplay atom no-ops; multi-atom projects document fusion and show source wiring |
10
- | Recording | `npm run record:mp4` | MP4 is produced without contract/runtime timeout |
11
- | Video semantics | `npm run verify:vlm-video` | No P0/fail findings in `vlm-video.json` |
12
-
13
- UI, atlas, layout, focus playground, and visual ring checks are deferred until
14
- their migration stage.
@@ -1,63 +0,0 @@
1
- ---
2
- name: playable-verify-ui
3
- description: >-
4
- UI integrity checks for playable ads: static runtime contract and text overlap
5
- detection. Use during iteration-2 generate/optimize when adding overlay UI
6
- layers. verify:hardcoded-layout and verify_fetch_antipatterns require
7
- playable.ui.profile.yaml and are NOT usable until that file is created.
8
- ---
9
-
10
- # Playable Verify UI
11
-
12
- 布局层和 UI 层的静态完整性检查。部分工具不需要浏览器或 profile 配置;部分工具依赖 `playable.ui.profile.yaml`,在 v2 模板中该文件尚未创建,标记为暂不可用。
13
-
14
- ## 何时使用
15
-
16
- - 包装层新增 Tutorial 引导层、HUD、EndCard 等 UI 覆盖层时
17
- - optimize 阶段完整游戏评价前的 UI 快速自检
18
-
19
- ## ✅ 可用命令
20
-
21
- ```bash
22
- npm run verify:runtime-contract # 静态合约:扫描 game/ 确认 window.__playable 接口声明存在
23
- python3 skills/playable-verify-ui/scripts/verify_text_overlap.py --root .
24
- # 文字叠加检测(需 Python3;无 tesseract 时 degraded pass,不 block)
25
- ```
26
-
27
- ## ⚠️ 暂不可用(需要 playable.ui.profile.yaml)
28
-
29
- 下列工具依赖项目根目录的 `playable.ui.profile.yaml`,v2 模板尚未提供该文件。
30
- 直接运行会报 profile 缺失错误,**不要在 DoD 中引用这两个命令**:
31
-
32
- ```bash
33
- # ❌ 暂不可用
34
- npm run verify:hardcoded-layout
35
- python3 skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py --root .
36
- ```
37
-
38
- 启用方式:参考 project-template 的 `examples/mahjong-match.profile.yaml`,
39
- 创建并填写本项目的 `playable.ui.profile.yaml`,然后这两个命令才可使用。
40
-
41
- ## 检查内容
42
-
43
- | 脚本 | 状态 | 检查内容 | 失败含义 |
44
- | ------------------------------ | ------------- | ---------------------------------------------------- | ----------------------------------------- |
45
- | `verify_runtime_contract.js` | ✅ 可用 | 静态扫描 game/ 确认 `window.__playable` 接口声明存在 | 接口未声明,动态 verify:contract 必然失败 |
46
- | `verify_text_overlap.py` | ✅ 可用 | OCR 检测 CTA 区域文字是否重叠 | Tutorial 文字 + HUD 文字在同区域叠加 |
47
- | `verify_hardcoded_layout.js` | ⚠️ 需 profile | 检测 game/ 中直接写死的 px 宽高 | 多分辨率适配和包装层叠加会错位 |
48
- | `verify_fetch_antipatterns.py` | ⚠️ 需 profile | 扫描是否有 placehold.co 等外部 fetch 引用 | 所有渠道禁止外部请求 |
49
-
50
- ## 与 verify:contract 的关系
51
-
52
- `verify:runtime-contract`(静态,无浏览器)和 `verify:contract`(动态,需 dev server)互补:
53
-
54
- - 静态版在 generate 阶段写完代码后即可运行,快速确认接口声明
55
- - 动态版在 optimize 阶段作为 DoD 项运行
56
-
57
- ## 依赖
58
-
59
- - Node.js(`verify_runtime_contract.js`)
60
- - Python3(`verify_text_overlap.py`)
61
- - tesseract(可选,无 OCR 时 degraded pass)
62
-
63
- 运行 `npm run verify:env` 确认环境满足要求。
@@ -1 +0,0 @@
1
- # Playable UI verification library
@@ -1,218 +0,0 @@
1
- 'use strict';
2
-
3
- /**
4
- * Safely evaluate layout expressions against GAME_CONFIG + profile.safeArea.
5
- * Only allows numeric literals, + - * /, parentheses, and dotted identifiers.
6
- */
7
-
8
- const TOKEN_RE = /(\d+(?:\.\d+)?|[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*|[+\-*/()]|\s+)/g;
9
-
10
- function getPathValue(root, path) {
11
- const parts = path.split('.');
12
- let cur = root;
13
- for (const part of parts) {
14
- if (cur == null || typeof cur !== 'object' || !(part in cur)) {
15
- throw new Error(`Unknown path: ${path}`);
16
- }
17
- cur = cur[part];
18
- }
19
- if (typeof cur !== 'number' || !Number.isFinite(cur)) {
20
- throw new Error(`Path is not a finite number: ${path}`);
21
- }
22
- return cur;
23
- }
24
-
25
- function resolveRef(expr, gameConfig, profile) {
26
- const trimmed = expr.trim();
27
- if (/^\d+(?:\.\d+)?$/.test(trimmed)) {
28
- return Number(trimmed);
29
- }
30
- if (trimmed.startsWith('safeArea.')) {
31
- const key = trimmed.slice('safeArea.'.length);
32
- const safe = profile && profile.safeArea;
33
- if (!safe || !(key in safe)) {
34
- throw new Error(`Unknown safeArea key: ${key}`);
35
- }
36
- return Number(safe[key]);
37
- }
38
- return getPathValue(gameConfig, trimmed);
39
- }
40
-
41
- function tokenize(expr) {
42
- const tokens = [];
43
- let m;
44
- TOKEN_RE.lastIndex = 0;
45
- while ((m = TOKEN_RE.exec(expr)) !== null) {
46
- const t = m[0];
47
- if (/^\s+$/.test(t)) continue;
48
- tokens.push(t);
49
- }
50
- return tokens;
51
- }
52
-
53
- function parseExpression(tokens, gameConfig, profile) {
54
- let pos = 0;
55
-
56
- function peek() {
57
- return tokens[pos];
58
- }
59
-
60
- function consume(expected) {
61
- const t = tokens[pos++];
62
- if (expected && t !== expected) {
63
- throw new Error(`Expected '${expected}' but got '${t}'`);
64
- }
65
- return t;
66
- }
67
-
68
- function parsePrimary() {
69
- const t = peek();
70
- if (t === '(') {
71
- consume('(');
72
- const val = parseAddSub();
73
- consume(')');
74
- return val;
75
- }
76
- if (/^\d+(?:\.\d+)?$/.test(t)) {
77
- consume();
78
- return Number(t);
79
- }
80
- if (/^[A-Za-z_]/.test(t)) {
81
- consume();
82
- return resolveRef(t, gameConfig, profile);
83
- }
84
- throw new Error(`Unexpected token: ${t}`);
85
- }
86
-
87
- function parseMulDiv() {
88
- let left = parsePrimary();
89
- while (peek() === '*' || peek() === '/') {
90
- const op = consume();
91
- const right = parsePrimary();
92
- left = op === '*' ? left * right : left / right;
93
- }
94
- return left;
95
- }
96
-
97
- function parseAddSub() {
98
- let left = parseMulDiv();
99
- while (peek() === '+' || peek() === '-') {
100
- const op = consume();
101
- const right = parseMulDiv();
102
- left = op === '+' ? left + right : left - right;
103
- }
104
- return left;
105
- }
106
-
107
- const result = parseAddSub();
108
- if (pos !== tokens.length) {
109
- throw new Error(`Unexpected trailing tokens at position ${pos}`);
110
- }
111
- return result;
112
- }
113
-
114
- function evaluate(expr, gameConfig, profile) {
115
- if (expr == null) {
116
- throw new Error('Expression is required');
117
- }
118
- if (typeof expr === 'number') return expr;
119
- const str = String(expr).trim();
120
- if (/^\d+(?:\.\d+)?$/.test(str)) {
121
- return Number(str);
122
- }
123
- if (/^[A-Za-z_][A-Za-z0-9_.]*$/.test(str) && !/[+\-*/()]/.test(str)) {
124
- return resolveRef(str, gameConfig, profile);
125
- }
126
- const tokens = tokenize(str);
127
- return parseExpression(tokens, gameConfig, profile);
128
- }
129
-
130
- function regionBounds(regionDef, gameConfig, profile) {
131
- if (regionDef.cy != null && regionDef.h != null) {
132
- const cy = evaluate(regionDef.cy, gameConfig, profile);
133
- const h = evaluate(regionDef.h, gameConfig, profile);
134
- return { y0: cy - h / 2, y1: cy + h / 2 };
135
- }
136
- if (regionDef.y0 != null && regionDef.y1 != null) {
137
- return {
138
- y0: evaluate(regionDef.y0, gameConfig, profile),
139
- y1: evaluate(regionDef.y1, gameConfig, profile),
140
- };
141
- }
142
- throw new Error('Region must define y0/y1 or cy/h');
143
- }
144
-
145
- /**
146
- * Load GAME_CONFIG from the project's single source of truth.
147
- *
148
- * Supports TypeScript (`.ts`/`.tsx`) directly so the project keeps ONE config
149
- * file — verify reads exactly what the game runs, making drift structurally
150
- * impossible. Legacy plain `.js` configs remain supported.
151
- *
152
- * Extraction order (robust to authoring style):
153
- * 1. `module.exports.GAME_CONFIG` (CJS / esbuild output / current stub)
154
- * 2. bare top-level `const GAME_CONFIG = {...}` (legacy hand-written JS)
155
- */
156
- function loadGameConfig(configPath) {
157
- const fs = require('fs');
158
- const vm = require('vm');
159
- const path = require('path');
160
-
161
- let code = fs.readFileSync(configPath, 'utf8');
162
- const ext = path.extname(configPath).toLowerCase();
163
-
164
- if (ext === '.ts' || ext === '.tsx' || ext === '.mts' || ext === '.cts') {
165
- let esbuild;
166
- try {
167
- esbuild = require('esbuild');
168
- } catch (err) {
169
- throw new Error(
170
- `Loading ${path.basename(configPath)} needs esbuild (bundled with vite). ` +
171
- `Run "npm install" in the project root. Original: ${err.message}`,
172
- );
173
- }
174
- code = esbuild.transformSync(code, {
175
- loader: ext === '.tsx' ? 'tsx' : 'ts',
176
- format: 'cjs',
177
- target: 'es2020',
178
- }).code;
179
- }
180
-
181
- const moduleObj = { exports: {} };
182
- const sandbox = {
183
- module: moduleObj,
184
- exports: moduleObj.exports,
185
- require,
186
- console,
187
- __DEV__: false,
188
- globalThis: undefined,
189
- };
190
- vm.createContext(sandbox);
191
- sandbox.globalThis = sandbox;
192
-
193
- // Capture a bare top-level `const GAME_CONFIG` (block-scoped, won't leak to
194
- // the sandbox object on its own) by re-exposing it after the script body.
195
- const wrapped = `${code}\n;try{ globalThis.__GAME_CONFIG__ = (typeof GAME_CONFIG !== 'undefined') ? GAME_CONFIG : undefined; }catch(_e){}`;
196
- vm.runInContext(wrapped, sandbox, { filename: configPath });
197
-
198
- const exported = moduleObj.exports || {};
199
- const cfg =
200
- exported.GAME_CONFIG ||
201
- (exported.default && exported.default.GAME_CONFIG) ||
202
- sandbox.__GAME_CONFIG__;
203
-
204
- if (!cfg || typeof cfg !== 'object') {
205
- throw new Error(
206
- `GAME_CONFIG not found after loading ${path.basename(configPath)} — ` +
207
- `export a GAME_CONFIG object (e.g. "export const GAME_CONFIG = { ... }").`,
208
- );
209
- }
210
- return cfg;
211
- }
212
-
213
- module.exports = {
214
- evaluate,
215
- regionBounds,
216
- loadGameConfig,
217
- resolveRef,
218
- };
@@ -1,51 +0,0 @@
1
- 'use strict';
2
-
3
- const fs = require('fs');
4
- const path = require('path');
5
- const { execFileSync } = require('child_process');
6
-
7
- function loadProfile(profilePath) {
8
- const out = execFileSync(
9
- 'python3',
10
- [
11
- '-c',
12
- 'import json, sys, yaml; print(json.dumps(yaml.safe_load(open(sys.argv[1], encoding="utf-8"))))',
13
- profilePath,
14
- ],
15
- { encoding: 'utf8' },
16
- );
17
- return JSON.parse(out);
18
- }
19
-
20
- function walkFiles(root, matcher) {
21
- const results = [];
22
- function walk(dir) {
23
- if (!fs.existsSync(dir)) return;
24
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
25
- const full = path.join(dir, entry.name);
26
- if (entry.isDirectory()) {
27
- walk(full);
28
- } else if (matcher(full)) {
29
- results.push(full);
30
- }
31
- }
32
- }
33
- walk(root);
34
- return results;
35
- }
36
-
37
- function globFiles(projectRoot, pattern) {
38
- // Supports patterns like game/**/*.js, game/**/*.ts, game/**/*.tsx
39
- const normalized = pattern.replace(/\\/g, '/');
40
- const recursive = normalized.match(/^(.*)\/\*\*\/\*\.([A-Za-z0-9]+)$/);
41
- if (recursive) {
42
- const base = recursive[1];
43
- const ext = `.${recursive[2]}`;
44
- const baseDir = path.join(projectRoot, base);
45
- return walkFiles(baseDir, (f) => f.endsWith(ext));
46
- }
47
- const direct = path.join(projectRoot, normalized);
48
- return fs.existsSync(direct) ? [direct] : [];
49
- }
50
-
51
- module.exports = { loadProfile, globFiles };
@@ -1,59 +0,0 @@
1
- """Load and validate playable.ui.profile.yaml against JSON Schema."""
2
-
3
- from __future__ import annotations
4
-
5
- import json
6
- from pathlib import Path
7
- from typing import Any
8
-
9
- import yaml
10
-
11
- SKILL_ROOT = Path(__file__).resolve().parents[2]
12
- DEFAULT_SCHEMA = SKILL_ROOT / "schema" / "playable-ui-profile.schema.json"
13
-
14
-
15
- def load_schema(schema_path: Path | None = None) -> dict[str, Any]:
16
- path = schema_path or DEFAULT_SCHEMA
17
- with path.open(encoding="utf-8") as fh:
18
- return json.load(fh)
19
-
20
-
21
- def load_profile(
22
- profile_path: Path,
23
- *,
24
- schema_path: Path | None = None,
25
- validate: bool = True,
26
- ) -> dict[str, Any]:
27
- with profile_path.open(encoding="utf-8") as fh:
28
- profile = yaml.safe_load(fh)
29
-
30
- if not isinstance(profile, dict):
31
- raise ValueError(f"Profile must be a mapping: {profile_path}")
32
-
33
- if validate:
34
- validate_profile(profile, schema_path=schema_path)
35
-
36
- return profile
37
-
38
-
39
- def validate_profile(profile: dict[str, Any], *, schema_path: Path | None = None) -> None:
40
- try:
41
- import jsonschema
42
- except ImportError as exc:
43
- raise RuntimeError("jsonschema is required: pip install jsonschema") from exc
44
-
45
- schema = load_schema(schema_path)
46
- jsonschema.validate(instance=profile, schema=schema)
47
-
48
-
49
- def resolve_project_path(profile_path: Path, relative: str) -> Path:
50
- return (profile_path.parent / relative).resolve()
51
-
52
-
53
- def get_paths(profile: dict[str, Any], profile_path: Path) -> dict[str, Path]:
54
- paths_cfg = profile.get("paths", {})
55
- return {
56
- key: resolve_project_path(profile_path, value)
57
- for key, value in paths_cfg.items()
58
- if isinstance(value, str)
59
- }
@@ -1,106 +0,0 @@
1
- """Unified pass / warn / fail reporting for UI verification scripts."""
2
-
3
- from __future__ import annotations
4
-
5
- import json
6
- import sys
7
- from dataclasses import asdict, dataclass, field
8
- from enum import Enum
9
- from typing import Any
10
-
11
-
12
- class Status(str, Enum):
13
- PASS = "pass"
14
- WARN = "warn"
15
- FAIL = "fail"
16
-
17
-
18
- @dataclass
19
- class Finding:
20
- check: str
21
- status: Status
22
- message: str
23
- details: dict[str, Any] = field(default_factory=dict)
24
-
25
-
26
- @dataclass
27
- class Report:
28
- findings: list[Finding] = field(default_factory=list)
29
- metadata: dict[str, Any] = field(default_factory=dict)
30
-
31
- def add(self, check: str, status: Status | str, message: str, **details: Any) -> None:
32
- if isinstance(status, str):
33
- status = Status(status)
34
- self.findings.append(Finding(check=check, status=status, message=message, details=details))
35
-
36
- def pass_(self, check: str, message: str, **details: Any) -> None:
37
- self.add(check, Status.PASS, message, **details)
38
-
39
- def warn(self, check: str, message: str, **details: Any) -> None:
40
- self.add(check, Status.WARN, message, **details)
41
-
42
- def fail(self, check: str, message: str, **details: Any) -> None:
43
- self.add(check, Status.FAIL, message, **details)
44
-
45
- @property
46
- def worst(self) -> Status:
47
- order = {Status.PASS: 0, Status.WARN: 1, Status.FAIL: 2}
48
- if not self.findings:
49
- return Status.PASS
50
- return max(self.findings, key=lambda f: order[f.status]).status
51
-
52
- @property
53
- def exit_code(self) -> int:
54
- return 1 if self.worst == Status.FAIL else 0
55
-
56
- def counts(self) -> dict[str, int]:
57
- counts = {s.value: 0 for s in Status}
58
- for finding in self.findings:
59
- counts[finding.status.value] += 1
60
- return counts
61
-
62
- def merge(self, other: Report) -> None:
63
- self.findings.extend(other.findings)
64
-
65
- def print_summary(self, title: str = "Playable UI Verification") -> None:
66
- counts = self.counts()
67
- print(f"\n=== {title} ===")
68
- for finding in self.findings:
69
- icon = {"pass": "✓", "warn": "!", "fail": "✗"}[finding.status.value]
70
- print(f" [{icon}] {finding.check}: {finding.message}")
71
- print(
72
- f"\nSummary: {counts['pass']} pass, {counts['warn']} warn, {counts['fail']} fail"
73
- )
74
- if self.worst == Status.FAIL:
75
- print("Result: FAIL")
76
- elif self.worst == Status.WARN:
77
- print("Result: PASS (with warnings)")
78
- else:
79
- print("Result: PASS")
80
-
81
- def to_json(self) -> dict[str, Any]:
82
- payload = {
83
- "summary": self.counts(),
84
- "worst": self.worst.value,
85
- "findings": [
86
- {**asdict(f), "status": f.status.value}
87
- for f in self.findings
88
- ],
89
- }
90
- payload.update(self.metadata)
91
- return payload
92
-
93
- def write_json(self, path: str) -> None:
94
- with open(path, "w", encoding="utf-8") as fh:
95
- json.dump(self.to_json(), fh, indent=2, ensure_ascii=False)
96
-
97
-
98
- def exit_with_report(report: Report, *, json_path: str | None = None, json_stdout: bool = False) -> None:
99
- if json_stdout:
100
- print(json.dumps(report.to_json(), ensure_ascii=False))
101
- elif json_path:
102
- report.write_json(json_path)
103
- report.print_summary()
104
- else:
105
- report.print_summary()
106
- sys.exit(report.exit_code)