@playcraft/cli 0.1.50-beta → 0.1.52

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 (406) 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/image.js +6 -2
  8. package/dist/commands/login.js +42 -84
  9. package/dist/commands/skills.js +0 -4
  10. package/dist/commands/tools-3d.js +0 -11
  11. package/dist/commands/tools-generation.js +137 -69
  12. package/dist/commands/tools-image-context.js +29 -0
  13. package/dist/commands/tools-utils.js +12 -0
  14. package/dist/commands/tools.js +2 -2
  15. package/dist/config.js +4 -59
  16. package/dist/index.js +3 -40
  17. package/dist/remix/clone.js +0 -2
  18. package/dist/remix/init-template.js +0 -2
  19. package/dist/remix/pull.js +0 -2
  20. package/dist/remix/push.js +1 -21
  21. package/dist/utils/agent-api-client.js +30 -210
  22. package/dist/utils/image-asset-context.js +228 -0
  23. package/dist/utils/playcraft-http-client.js +4 -6
  24. package/package.json +5 -15
  25. package/project-template/.claude/agents/refs/ta-image-generation-detail.md +67 -123
  26. package/project-template/.claude/skills/playcraft-image-generation/SKILL.md +135 -63
  27. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +42 -33
  28. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +18 -20
  29. package/project-template/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +6 -7
  30. package/project-template/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -39
  31. package/project-templates/phaser/.claude/agents/refs/ta-image-generation-detail.md +59 -59
  32. package/project-templates/phaser/.claude/skills/playcraft-image-generation/SKILL.md +135 -63
  33. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +42 -33
  34. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +18 -20
  35. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +6 -7
  36. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -39
  37. package/project-templates/threejs/.claude/agents/refs/ta-image-generation-detail.md +59 -59
  38. package/project-templates/threejs/.claude/skills/playcraft-image-generation/SKILL.md +135 -63
  39. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +42 -33
  40. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +18 -20
  41. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +6 -7
  42. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -39
  43. package/SKILLS_REGISTRY.md +0 -149
  44. package/dist/auth/account-activation.js +0 -157
  45. package/dist/auth/messages.js +0 -30
  46. package/dist/commands/build-temp.js +0 -26
  47. package/dist/commands/platform-skills.generated.js +0 -19
  48. package/dist/commands/playable.js +0 -53
  49. package/dist/commands/tools-batch.js +0 -113
  50. package/dist/commands/video.js +0 -122
  51. package/dist/commands/workspace-runtime.js +0 -54
  52. package/dist/commands/workspace.js +0 -40
  53. package/dist/project-skills/builtin-import.js +0 -225
  54. package/dist/project-skills/commands.js +0 -77
  55. package/dist/project-skills/lifecycle.js +0 -28
  56. package/dist/project-skills/local-run.js +0 -112
  57. package/dist/project-skills/local-store.js +0 -221
  58. package/dist/project-skills/messages.js +0 -80
  59. package/dist/project-skills/reconcile.js +0 -62
  60. package/dist/project-skills/remote-cache.js +0 -51
  61. package/dist/project-skills/validation.js +0 -19
  62. package/dist/recording/messages.js +0 -40
  63. package/dist/recording/project-digest.js +0 -85
  64. package/dist/recording/recorder.js +0 -293
  65. package/dist/recording/scenario.js +0 -50
  66. package/dist/skill-registry/client.js +0 -345
  67. package/dist/skill-registry/commands.js +0 -180
  68. package/dist/skill-registry/evaluation-client.js +0 -156
  69. package/dist/skill-registry/evaluation-commands.js +0 -174
  70. package/dist/skill-registry/messages.js +0 -177
  71. package/dist/skill-registry/package.js +0 -275
  72. package/dist/skill-registry/platform-package.js +0 -100
  73. package/dist/utils/environment-endpoints.js +0 -17
  74. package/dist/utils/error-diagnostics.js +0 -20
  75. package/dist/utils/tool-operation-journal.js +0 -124
  76. package/dist/utils/video-evidence-git.js +0 -81
  77. package/dist/video-replication/client.js +0 -234
  78. package/dist/video-replication/comparison-evidence.js +0 -149
  79. package/dist/video-replication/comparison-files.js +0 -57
  80. package/dist/video-replication/comparison-log.js +0 -72
  81. package/dist/video-replication/comparison-messages.js +0 -104
  82. package/dist/video-replication/comparison-output.js +0 -63
  83. package/dist/video-replication/comparison-preflight.js +0 -66
  84. package/dist/video-replication/comparison.js +0 -230
  85. package/dist/video-replication/diagnostics.js +0 -41
  86. package/dist/video-replication/evidence.js +0 -165
  87. package/dist/video-replication/media.js +0 -112
  88. package/dist/video-replication/messages.js +0 -97
  89. package/dist/workspace/messages.js +0 -67
  90. package/dist/workspace/transfer-client.js +0 -233
  91. package/dist/workspace/transfer-errors.js +0 -48
  92. package/dist/workspace-runtime/batch/content-changes.js +0 -30
  93. package/dist/workspace-runtime/batch/control.js +0 -86
  94. package/dist/workspace-runtime/batch/deliver.js +0 -173
  95. package/dist/workspace-runtime/batch/freeze.js +0 -101
  96. package/dist/workspace-runtime/batch/generate.js +0 -249
  97. package/dist/workspace-runtime/batch/git.js +0 -40
  98. package/dist/workspace-runtime/batch/occupancy.js +0 -8
  99. package/dist/workspace-runtime/batch/policy.js +0 -70
  100. package/dist/workspace-runtime/batch/prepare.js +0 -317
  101. package/dist/workspace-runtime/batch/processes.js +0 -72
  102. package/dist/workspace-runtime/batch/records.js +0 -113
  103. package/dist/workspace-runtime/batch/routes.js +0 -61
  104. package/dist/workspace-runtime/batch/source-candidate.js +0 -86
  105. package/dist/workspace-runtime/batch/source-capture.js +0 -146
  106. package/dist/workspace-runtime/batch/source-failure.js +0 -43
  107. package/dist/workspace-runtime/batch/source-publish.js +0 -130
  108. package/dist/workspace-runtime/codex/app-server.js +0 -1065
  109. package/dist/workspace-runtime/codex/compact.js +0 -46
  110. package/dist/workspace-runtime/codex/config-toml.js +0 -107
  111. package/dist/workspace-runtime/codex/delivery-tools.js +0 -144
  112. package/dist/workspace-runtime/codex/jsonrpc-stdio.js +0 -145
  113. package/dist/workspace-runtime/codex/launcher-client.js +0 -177
  114. package/dist/workspace-runtime/codex/loopback.js +0 -146
  115. package/dist/workspace-runtime/codex/mcp-config.js +0 -39
  116. package/dist/workspace-runtime/codex/model-broker.js +0 -263
  117. package/dist/workspace-runtime/codex/native-adapter.js +0 -9
  118. package/dist/workspace-runtime/codex/permissions.js +0 -79
  119. package/dist/workspace-runtime/codex/thread-image.js +0 -38
  120. package/dist/workspace-runtime/codex/tool-response.js +0 -10
  121. package/dist/workspace-runtime/codex/ui-instructions.js +0 -4
  122. package/dist/workspace-runtime/codex/ui-tools.js +0 -203
  123. package/dist/workspace-runtime/codex/work-mode.js +0 -15
  124. package/dist/workspace-runtime/main.js +0 -10
  125. package/dist/workspace-runtime/persistence/journal.js +0 -365
  126. package/dist/workspace-runtime/persistence/native-subagents.js +0 -162
  127. package/dist/workspace-runtime/persistence/sqlite-client.js +0 -77
  128. package/dist/workspace-runtime/persistence/sqlite-worker.js +0 -1161
  129. package/dist/workspace-runtime/persistence/stopped-execution.js +0 -77
  130. package/dist/workspace-runtime/previews/diagnostics.js +0 -44
  131. package/dist/workspace-runtime/previews/output.js +0 -36
  132. package/dist/workspace-runtime/previews/publish.js +0 -283
  133. package/dist/workspace-runtime/previews/runtime-preview.js +0 -177
  134. package/dist/workspace-runtime/previews/single-file.js +0 -43
  135. package/dist/workspace-runtime/processes/managed-writes.js +0 -69
  136. package/dist/workspace-runtime/serve.js +0 -441
  137. package/dist/workspace-runtime/server/accept-operation.js +0 -61
  138. package/dist/workspace-runtime/server/asset-transfers.js +0 -63
  139. package/dist/workspace-runtime/server/auth.js +0 -21
  140. package/dist/workspace-runtime/server/connectivity.js +0 -209
  141. package/dist/workspace-runtime/server/desktop-host.js +0 -429
  142. package/dist/workspace-runtime/server/desktop-preview-config.js +0 -81
  143. package/dist/workspace-runtime/server/desktop-preview-service.js +0 -157
  144. package/dist/workspace-runtime/server/desktop-preview-static.js +0 -53
  145. package/dist/workspace-runtime/server/desktop-preview.js +0 -189
  146. package/dist/workspace-runtime/server/dispatch.js +0 -1632
  147. package/dist/workspace-runtime/server/endpoints.js +0 -21
  148. package/dist/workspace-runtime/server/execution-group.js +0 -90
  149. package/dist/workspace-runtime/server/http.js +0 -1340
  150. package/dist/workspace-runtime/server/lock.js +0 -53
  151. package/dist/workspace-runtime/server/operation-record.js +0 -33
  152. package/dist/workspace-runtime/server/rfb-watch-gate.js +0 -168
  153. package/dist/workspace-runtime/server/session-restore.js +0 -84
  154. package/dist/workspace-runtime/server/source-uploader.js +0 -138
  155. package/dist/workspace-runtime/server/submit-operation.js +0 -41
  156. package/dist/workspace-runtime/server/terminal-host.js +0 -366
  157. package/dist/workspace-runtime/server/types.js +0 -1
  158. package/dist/workspace-runtime/server/workspace-transfer.js +0 -168
  159. package/dist/workspace-runtime/verify-artifact.js +0 -59
  160. package/dist/workspace-runtime/workspaces/append-only-log.js +0 -62
  161. package/dist/workspace-runtime/workspaces/archive.js +0 -207
  162. package/dist/workspace-runtime/workspaces/artifact-events.js +0 -55
  163. package/dist/workspace-runtime/workspaces/artifact-files.js +0 -199
  164. package/dist/workspace-runtime/workspaces/artifact-receipts.js +0 -89
  165. package/dist/workspace-runtime/workspaces/artifacts.js +0 -282
  166. package/dist/workspace-runtime/workspaces/asset-library-import.js +0 -366
  167. package/dist/workspace-runtime/workspaces/asset-transfer-dependencies.js +0 -81
  168. package/dist/workspace-runtime/workspaces/asset-transfer-publish.js +0 -434
  169. package/dist/workspace-runtime/workspaces/asset-transfer-storage.js +0 -389
  170. package/dist/workspace-runtime/workspaces/attachment-content.js +0 -73
  171. package/dist/workspace-runtime/workspaces/attachments.js +0 -185
  172. package/dist/workspace-runtime/workspaces/batch-commit.js +0 -142
  173. package/dist/workspace-runtime/workspaces/binary-content.js +0 -65
  174. package/dist/workspace-runtime/workspaces/binary-write.js +0 -112
  175. package/dist/workspace-runtime/workspaces/cli-context.js +0 -23
  176. package/dist/workspace-runtime/workspaces/cli-credentials.js +0 -115
  177. package/dist/workspace-runtime/workspaces/composer-context.js +0 -147
  178. package/dist/workspace-runtime/workspaces/context-error.js +0 -2
  179. package/dist/workspace-runtime/workspaces/delivery-build.js +0 -331
  180. package/dist/workspace-runtime/workspaces/delivery-store.js +0 -168
  181. package/dist/workspace-runtime/workspaces/delivery.js +0 -64
  182. package/dist/workspace-runtime/workspaces/dependencies.js +0 -279
  183. package/dist/workspace-runtime/workspaces/developer-command.js +0 -98
  184. package/dist/workspace-runtime/workspaces/directories.js +0 -132
  185. package/dist/workspace-runtime/workspaces/directory-access.js +0 -37
  186. package/dist/workspace-runtime/workspaces/directory-attachments.js +0 -245
  187. package/dist/workspace-runtime/workspaces/directory-create.js +0 -57
  188. package/dist/workspace-runtime/workspaces/directory-maintenance.js +0 -111
  189. package/dist/workspace-runtime/workspaces/directory-mutations.js +0 -238
  190. package/dist/workspace-runtime/workspaces/directory-revisions.js +0 -56
  191. package/dist/workspace-runtime/workspaces/directory-stats.js +0 -49
  192. package/dist/workspace-runtime/workspaces/disk-snapshot.js +0 -31
  193. package/dist/workspace-runtime/workspaces/empty-template.js +0 -42
  194. package/dist/workspace-runtime/workspaces/file-content.js +0 -48
  195. package/dist/workspace-runtime/workspaces/files-search.js +0 -116
  196. package/dist/workspace-runtime/workspaces/files.js +0 -150
  197. package/dist/workspace-runtime/workspaces/git-credential-broker.js +0 -312
  198. package/dist/workspace-runtime/workspaces/git-credential-helper.js +0 -68
  199. package/dist/workspace-runtime/workspaces/git-direct-store.js +0 -155
  200. package/dist/workspace-runtime/workspaces/git.js +0 -670
  201. package/dist/workspace-runtime/workspaces/instructions.js +0 -56
  202. package/dist/workspace-runtime/workspaces/json5-edit.js +0 -313
  203. package/dist/workspace-runtime/workspaces/library-attachments.js +0 -268
  204. package/dist/workspace-runtime/workspaces/operation-log.js +0 -23
  205. package/dist/workspace-runtime/workspaces/optional-platform-skills.js +0 -14
  206. package/dist/workspace-runtime/workspaces/parameter-agent-inputs.js +0 -87
  207. package/dist/workspace-runtime/workspaces/parameter-agent-protocol.js +0 -29
  208. package/dist/workspace-runtime/workspaces/parameter-agent-store.js +0 -58
  209. package/dist/workspace-runtime/workspaces/parameter-agent.js +0 -282
  210. package/dist/workspace-runtime/workspaces/parameters.js +0 -295
  211. package/dist/workspace-runtime/workspaces/prepare.js +0 -278
  212. package/dist/workspace-runtime/workspaces/registry.js +0 -251
  213. package/dist/workspace-runtime/workspaces/remix-references.js +0 -301
  214. package/dist/workspace-runtime/workspaces/revisions.js +0 -31
  215. package/dist/workspace-runtime/workspaces/session-image.js +0 -104
  216. package/dist/workspace-runtime/workspaces/shared-git.js +0 -40
  217. package/dist/workspace-runtime/workspaces/skill-artifact-loader.js +0 -95
  218. package/dist/workspace-runtime/workspaces/skills.js +0 -191
  219. package/dist/workspace-runtime/workspaces/transfer-quota.js +0 -69
  220. package/dist/workspace-runtime/workspaces/transfer.js +0 -471
  221. package/dist/workspace-runtime/workspaces/turn-changes.js +0 -75
  222. package/dist/workspace-runtime/workspaces/video-attachments.js +0 -49
  223. package/project-template/.claude/skills/playcraft-replica-validation/SKILL.md +0 -25
  224. package/project-template/.claude/skills/playcraft-replica-validation/references/contracts.md +0 -79
  225. package/project-template/.claude/skills/playcraft-video-understanding/SKILL.md +0 -29
  226. package/project-template/.claude/skills/playcraft-video-understanding/references/contracts.md +0 -37
  227. package/project-template-v2/.claude/agents/artist.md +0 -82
  228. package/project-template-v2/.claude/agents/developer.md +0 -153
  229. package/project-template-v2/.claude/agents/game-designer.md +0 -264
  230. package/project-template-v2/.claude/agents/refs/artist-art-style-catalog.md +0 -533
  231. package/project-template-v2/.claude/agents/refs/artist-color-audio-recipes.md +0 -153
  232. package/project-template-v2/.claude/agents/refs/artist-dimension-axis.md +0 -27
  233. package/project-template-v2/.claude/agents/refs/artist-master-composite-recipes.md +0 -208
  234. package/project-template-v2/.claude/agents/refs/atom-skill-library.md +0 -81
  235. package/project-template-v2/.claude/agents/refs/developer-impl-cookbook.md +0 -432
  236. package/project-template-v2/.claude/agents/refs/framework-5-component-filter.md +0 -252
  237. package/project-template-v2/.claude/agents/refs/framework-game-feel-juice.md +0 -266
  238. package/project-template-v2/.claude/agents/refs/framework-mda.md +0 -147
  239. package/project-template-v2/.claude/agents/refs/game-designer-gameplay-sufficiency.md +0 -123
  240. package/project-template-v2/.claude/agents/refs/ta-3d-flip-recipe.md +0 -88
  241. package/project-template-v2/.claude/agents/refs/ta-atlas-deliverable-standard.md +0 -67
  242. package/project-template-v2/.claude/agents/refs/ta-batch-pipeline-recipes.md +0 -120
  243. package/project-template-v2/.claude/agents/refs/ta-image-generation-detail.md +0 -300
  244. package/project-template-v2/.claude/agents/refs/ta-image-ops-reference.md +0 -495
  245. package/project-template-v2/.claude/agents/refs/ta-pipeline-cookbook.md +0 -1141
  246. package/project-template-v2/.claude/agents/refs/ta-tools-reference.md +0 -111
  247. package/project-template-v2/.claude/agents/refs/ta-vfx-preset-catalog.md +0 -365
  248. package/project-template-v2/.claude/agents/refs/threejs-cannon-pitfalls.md +0 -412
  249. package/project-template-v2/.claude/agents/reviewer.md +0 -75
  250. package/project-template-v2/.claude/agents/technical-artist.md +0 -86
  251. package/project-template-v2/.claude/hooks/snapshot-milestone.mjs +0 -243
  252. package/project-template-v2/.claude/hooks/user-prompt.mjs +0 -133
  253. package/project-template-v2/.claude/settings.json +0 -33
  254. package/project-template-v2/.claude/skills/brainstorming/SKILL.md +0 -161
  255. package/project-template-v2/.claude/skills/brainstorming/scripts/frame-template.html +0 -270
  256. package/project-template-v2/.claude/skills/brainstorming/scripts/helper.js +0 -177
  257. package/project-template-v2/.claude/skills/brainstorming/scripts/server.cjs +0 -354
  258. package/project-template-v2/.claude/skills/brainstorming/scripts/start-server.sh +0 -148
  259. package/project-template-v2/.claude/skills/brainstorming/scripts/stop-server.sh +0 -56
  260. package/project-template-v2/.claude/skills/brainstorming/scripts/wait-for-selection.sh +0 -62
  261. package/project-template-v2/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
  262. package/project-template-v2/.claude/skills/brainstorming/visual-companion.md +0 -309
  263. package/project-template-v2/.claude/skills/playcraft-ad-psychology/SKILL.md +0 -182
  264. package/project-template-v2/.claude/skills/playcraft-art-style-guide/SKILL.md +0 -123
  265. package/project-template-v2/.claude/skills/playcraft-asset-state-sheet/SKILL.md +0 -205
  266. package/project-template-v2/.claude/skills/playcraft-audio-generation/SKILL.md +0 -280
  267. package/project-template-v2/.claude/skills/playcraft-batch-pipeline/SKILL.md +0 -184
  268. package/project-template-v2/.claude/skills/playcraft-build-optimizer/SKILL.md +0 -306
  269. package/project-template-v2/.claude/skills/playcraft-image-generation/SKILL.md +0 -298
  270. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +0 -123
  271. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +0 -254
  272. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +0 -324
  273. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +0 -97
  274. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +0 -118
  275. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +0 -137
  276. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +0 -397
  277. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +0 -296
  278. package/project-template-v2/.claude/skills/playcraft-image-ops/SKILL.md +0 -122
  279. package/project-template-v2/.claude/skills/playcraft-image-processing/SKILL.md +0 -219
  280. package/project-template-v2/.claude/skills/playcraft-masking/SKILL.md +0 -373
  281. package/project-template-v2/.claude/skills/playcraft-playable-optimization/SKILL.md +0 -161
  282. package/project-template-v2/.claude/skills/playcraft-research/SKILL.md +0 -215
  283. package/project-template-v2/.claude/skills/playcraft-skill-recommender/SKILL.md +0 -382
  284. package/project-template-v2/.claude/skills/playcraft-sprite-generation/SKILL.md +0 -423
  285. package/project-template-v2/.claude/skills/playcraft-sprite-remix/SKILL.md +0 -158
  286. package/project-template-v2/.claude/skills/playcraft-sprite-sheet/SKILL.md +0 -100
  287. package/project-template-v2/.claude/skills/playcraft-storyboard/SKILL.md +0 -167
  288. package/project-template-v2/.claude/skills/playcraft-style-qa/SKILL.md +0 -270
  289. package/project-template-v2/.claude/skills/playcraft-text-rendering/SKILL.md +0 -236
  290. package/project-template-v2/.claude/skills/playcraft-vfx-animation/SKILL.md +0 -130
  291. package/project-template-v2/.claude/skills/playwright-cli/SKILL.md +0 -390
  292. package/project-template-v2/.claude/skills/playwright-cli/references/element-attributes.md +0 -23
  293. package/project-template-v2/.claude/skills/playwright-cli/references/playwright-tests.md +0 -39
  294. package/project-template-v2/.claude/skills/playwright-cli/references/request-mocking.md +0 -87
  295. package/project-template-v2/.claude/skills/playwright-cli/references/running-code.md +0 -240
  296. package/project-template-v2/.claude/skills/playwright-cli/references/session-management.md +0 -226
  297. package/project-template-v2/.claude/skills/playwright-cli/references/spec-driven-testing.md +0 -308
  298. package/project-template-v2/.claude/skills/playwright-cli/references/storage-state.md +0 -275
  299. package/project-template-v2/.claude/skills/playwright-cli/references/test-generation.md +0 -134
  300. package/project-template-v2/.claude/skills/playwright-cli/references/tracing.md +0 -142
  301. package/project-template-v2/.claude/skills/playwright-cli/references/video-recording.md +0 -153
  302. package/project-template-v2/.claude/skills/session-analyzer/SKILL.md +0 -386
  303. package/project-template-v2/.claude/skills/session-analyzer/scripts/execution-breakdown.mjs +0 -182
  304. package/project-template-v2/.claude/skills/session-analyzer/scripts/find-turns.mjs +0 -72
  305. package/project-template-v2/.claude/skills/session-analyzer/scripts/heavy-output.mjs +0 -121
  306. package/project-template-v2/.claude/skills/session-analyzer/scripts/resolve-session.mjs +0 -102
  307. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-stats.mjs +0 -127
  308. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-tool-timeline.mjs +0 -106
  309. package/project-template-v2/.claude/skills/session-analyzer/scripts/time-gaps.mjs +0 -128
  310. package/project-template-v2/.claude/skills/session-analyzer/scripts/turn-timeline.mjs +0 -67
  311. package/project-template-v2/.claude/snapshot.mjs +0 -263
  312. package/project-template-v2/.playcraft/skills.lock.json +0 -152
  313. package/project-template-v2/CLAUDE.md +0 -146
  314. package/project-template-v2/assets/audio/bgm/.gitkeep +0 -0
  315. package/project-template-v2/assets/audio/sfx/.gitkeep +0 -0
  316. package/project-template-v2/assets/bundles/.gitkeep +0 -0
  317. package/project-template-v2/assets/images/bg/.gitkeep +0 -0
  318. package/project-template-v2/assets/images/reference/.gitkeep +0 -0
  319. package/project-template-v2/assets/images/storyboard/.gitkeep +0 -0
  320. package/project-template-v2/assets/images/tiles/.gitkeep +0 -0
  321. package/project-template-v2/assets/images/ui/.gitkeep +0 -0
  322. package/project-template-v2/assets/images/vfx/.gitkeep +0 -0
  323. package/project-template-v2/assets/models/.gitkeep +0 -0
  324. package/project-template-v2/docs/harness/iteration-1/context-flow.md +0 -254
  325. package/project-template-v2/docs/harness/iteration-1/generate-flow.md +0 -91
  326. package/project-template-v2/docs/harness/iteration-1/ideate-flow.md +0 -214
  327. package/project-template-v2/docs/harness/iteration-1/optimize-flow.md +0 -75
  328. package/project-template-v2/docs/harness/iteration-1/wrapup-flow.md +0 -63
  329. package/project-template-v2/docs/harness/iteration-2/context-flow.md +0 -223
  330. package/project-template-v2/docs/harness/iteration-2/generate-flow.md +0 -129
  331. package/project-template-v2/docs/harness/iteration-2/ideate-flow.md +0 -267
  332. package/project-template-v2/docs/harness/iteration-2/optimize-flow.md +0 -164
  333. package/project-template-v2/docs/harness/iteration-2/wrapup-flow.md +0 -115
  334. package/project-template-v2/docs/harness/orchestrator-flow.md +0 -364
  335. package/project-template-v2/docs/project-state.json +0 -60
  336. package/project-template-v2/docs/project-state.md +0 -72
  337. package/project-template-v2/docs/standards/README.md +0 -225
  338. package/project-template-v2/docs/standards/agent-behavior-standards.md +0 -174
  339. package/project-template-v2/docs/standards/artifacts/design-brief.md +0 -19
  340. package/project-template-v2/docs/standards/artifacts/design.md +0 -22
  341. package/project-template-v2/docs/standards/artifacts/game-code.md +0 -41
  342. package/project-template-v2/docs/standards/artifacts/todo-list.md +0 -41
  343. package/project-template-v2/docs/standards/iter1-agent-behavior-standards.md +0 -343
  344. package/project-template-v2/game/index.ts +0 -18
  345. package/project-template-v2/globals.d.ts +0 -51
  346. package/project-template-v2/index.css +0 -34
  347. package/project-template-v2/index.html +0 -18
  348. package/project-template-v2/main.ts +0 -9
  349. package/project-template-v2/package.json +0 -46
  350. package/project-template-v2/skills/_shared/scripts/dispatch-clear.mjs +0 -31
  351. package/project-template-v2/skills/_shared/scripts/dispatch-set.mjs +0 -86
  352. package/project-template-v2/skills/_shared/scripts/dod-check.mjs +0 -153
  353. package/project-template-v2/skills/_shared/scripts/handoff-append.mjs +0 -70
  354. package/project-template-v2/skills/_shared/scripts/lib/validator-artifacts.mjs +0 -91
  355. package/project-template-v2/skills/_shared/scripts/pipeline/dod-config.mjs +0 -131
  356. package/project-template-v2/skills/_shared/scripts/pipeline/index.mjs +0 -80
  357. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-1-core.mjs +0 -90
  358. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-2-wrap.mjs +0 -93
  359. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-3-visual.mjs +0 -23
  360. package/project-template-v2/skills/_shared/scripts/render-project-state.mjs +0 -230
  361. package/project-template-v2/skills/_shared/scripts/state-advance-stage.mjs +0 -58
  362. package/project-template-v2/skills/_shared/scripts/state-get.mjs +0 -339
  363. package/project-template-v2/skills/_shared/scripts/state-handoff.mjs +0 -39
  364. package/project-template-v2/skills/_shared/scripts/state-set.mjs +0 -94
  365. package/project-template-v2/skills/_shared/scripts/state-store.mjs +0 -783
  366. package/project-template-v2/skills/_shared/scripts/todo-add.mjs +0 -88
  367. package/project-template-v2/skills/_shared/scripts/todo-get.mjs +0 -130
  368. package/project-template-v2/skills/_shared/scripts/todo-remove.mjs +0 -33
  369. package/project-template-v2/skills/_shared/scripts/todo-set.mjs +0 -47
  370. package/project-template-v2/skills/_shared/scripts/verify-asset-code-sync.mjs +0 -268
  371. package/project-template-v2/skills/_shared/scripts/verify-env.mjs +0 -285
  372. package/project-template-v2/skills/_shared/scripts/verify-placeholders.mjs +0 -161
  373. package/project-template-v2/skills/playable-autoplay/SKILL.md +0 -176
  374. package/project-template-v2/skills/playable-autoplay/agents/openai.yaml +0 -4
  375. package/project-template-v2/skills/playable-debug/SKILL.md +0 -116
  376. package/project-template-v2/skills/playable-debug/agents/openai.yaml +0 -4
  377. package/project-template-v2/skills/playable-debug/references/debug-config.md +0 -40
  378. package/project-template-v2/skills/playable-record/SKILL.md +0 -140
  379. package/project-template-v2/skills/playable-record/scripts/lib/dev-server.mjs +0 -104
  380. package/project-template-v2/skills/playable-record/scripts/lib/record-audio-bridge.js +0 -141
  381. package/project-template-v2/skills/playable-record/scripts/record-playable.mjs +0 -425
  382. package/project-template-v2/skills/playable-record/scripts/verify-contract.mjs +0 -261
  383. package/project-template-v2/skills/playable-record/scripts/verify-firstwin.mjs +0 -398
  384. package/project-template-v2/skills/playable-record/scripts/verify-fusion.mjs +0 -322
  385. package/project-template-v2/skills/playable-record/scripts/verify-lifecycle.mjs +0 -105
  386. package/project-template-v2/skills/playable-record/scripts/verify-vlm-video.mjs +0 -230
  387. package/project-template-v2/skills/playable-validate/SKILL.md +0 -61
  388. package/project-template-v2/skills/playable-validate/validation-rules.md +0 -14
  389. package/project-template-v2/skills/playable-verify-ui/SKILL.md +0 -63
  390. package/project-template-v2/skills/playable-verify-ui/scripts/lib/__init__.py +0 -1
  391. package/project-template-v2/skills/playable-verify-ui/scripts/lib/config_expr.js +0 -218
  392. package/project-template-v2/skills/playable-verify-ui/scripts/lib/node_utils.js +0 -51
  393. package/project-template-v2/skills/playable-verify-ui/scripts/lib/profile_loader.py +0 -59
  394. package/project-template-v2/skills/playable-verify-ui/scripts/lib/report.py +0 -106
  395. package/project-template-v2/skills/playable-verify-ui/scripts/lib/runtime_contract.js +0 -116
  396. package/project-template-v2/skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py +0 -59
  397. package/project-template-v2/skills/playable-verify-ui/scripts/verify_hardcoded_layout.js +0 -64
  398. package/project-template-v2/skills/playable-verify-ui/scripts/verify_runtime_contract.js +0 -58
  399. package/project-template-v2/skills/playable-verify-ui/scripts/verify_text_overlap.py +0 -333
  400. package/project-template-v2/ta-workspace/scripts/.gitkeep +0 -0
  401. package/project-template-v2/tsconfig.json +0 -20
  402. package/project-template-v2/vite.config.ts +0 -27
  403. package/project-templates/batch-locks/phaser.yaml +0 -922
  404. package/project-templates/batch-locks/threejs.yaml +0 -978
  405. package/project-templates/empty/AGENTS.md +0 -41
  406. package/project-templates/empty/gitignore +0 -33
@@ -1,116 +0,0 @@
1
- ---
2
- name: playable-debug
3
- description: >-
4
- Step ⑤ auto-clear for playables. Agent checks game-config before record:mp4
5
- in video-validate-loop. Use when record fails to reach ENDCARD or user mentions
6
- 一键通关. Usually invoked by other skills, not directly by user.
7
- ---
8
-
9
- # Playable Debug Playback
10
-
11
- > **通常由 video-validate-loop / record-playback 在录屏前调用**,用户不单独跑。
12
-
13
- ---
14
-
15
- ## Agent 入口(录屏前 checklist)
16
-
17
- ### 1. 开发态录屏配置
18
-
19
- `game/config/game-config.ts`(或 legacy `.js`):
20
-
21
- | Key | 录屏优化时 |
22
- | ------------------- | ----------- |
23
- | `SHOW_DEBUG_BUTTON` | **`true`** |
24
- | `SKIP_TRANSITIONS` | **`false`** |
25
-
26
- ### 2. 验证可达 ENDCARD
27
-
28
- **Pass 标准**:`window.__playable.autoPlay()` + `getState().currentPhase === 'ENDCARD'`(见 `npm run verify:contract`)。
29
-
30
- Legacy 链路:`DebugButton` → `_onDebugAutoPlay()` → `autoPlayToWin()` → ENDCARD(仍可用,2026-Q3 移除)。
31
-
32
- 录屏脚本优先调用 `__playable.autoPlay()`;legacy 项目走 `evaluate _onDebugAutoPlay()`。
33
-
34
- ### 3. 发布前(build:html 前)
35
-
36
- 反向:`SHOW_DEBUG_BUTTON: false`,写进 validate 报告「发布配置已关 debug」。
37
-
38
- ---
39
-
40
- ## When to Apply
41
-
42
- - 「一键通关」按钮不见了
43
- - 需要快速跑完整局验证 end card / CTA / 动画
44
- - 发布前检查调试项是否关闭
45
- - 自动玩卡住、与教程/guide 冲突
46
-
47
- ## Config Switches (`game-config.js`)
48
-
49
- | Key | 开发 | 发布 |
50
- | ------------------- | ---------------- | ----------- |
51
- | `SHOW_DEBUG_BUTTON` | `true` | **`false`** |
52
- | `SKIP_TRANSITIONS` | 可选 `true` 加速 | `false` |
53
- | `IS_EASY_MODE` | 按需 | 按产品 |
54
-
55
- `SHOW_DEBUG_BUTTON: false` 时 **不会创建** `DebugButton`(不是隐藏,是 `null`)。
56
-
57
- ## 一键通关链路
58
-
59
- ```
60
- publishPlayableRuntime() → window.__playable.autoPlay() → ENDCARD ← pass 标准
61
- ↓ (legacy warn)
62
- game-config.ts SHOW_DEBUG_BUTTON
63
- ↓
64
- main-scene.js DebugButton → _onDebugAutoPlay()
65
- ↓
66
- match-system.js autoPlayToWin()
67
- ↓
68
- sceneManager 通关 → ENDCARD
69
- ```
70
-
71
- **按钮位置**:`GAME_CONFIG.DEBUG`(由 `applySafeLayout` 写在 CTA 上方左侧)。
72
-
73
- **相关文件**
74
-
75
- - `game/gameplay/debug-tools.js` — `DebugButton` UI
76
- - `game/scenes/main-scene.js` — `_onDebugAutoPlay`, `_prepareDebugAutoPlay`
77
- - `game/gameplay/match-system.js` — `autoPlayToWin`
78
-
79
- ## 恢复一键通关
80
-
81
- 1. 确认 `SHOW_DEBUG_BUTTON: true`
82
- 2. 确认 `index.html` 已加载 `debug-tools.js`(在 `main-scene.js` 之前)
83
- 3. 刷新页面;按钮在左下、CTA 上方
84
- 4. 若仍无:检查是否已进入 `ENDCARD`(`setEnabled(false)` 会隐藏)
85
-
86
- ## 自动玩行为
87
-
88
- `autoPlayToWin`:
89
-
90
- 1. 跳过教程 / `disableTutorialMode`
91
- 2. 循环 `findMatchablePair` 正常消除
92
- 3. 死局后静默扫尾
93
- 4. `board.isAllMatched()` 后结束
94
-
95
- `setBusy(true)` 期间按钮文案为「自动玩…」,结束后恢复。
96
-
97
- ## 发布前检查
98
-
99
- ```bash
100
- rg "SHOW_DEBUG_BUTTON:\s*true" game/config/game-config.js && echo "WARN: disable debug"
101
- ```
102
-
103
- 必做:
104
-
105
- - [ ] `SHOW_DEBUG_BUTTON: false`
106
- - [ ] `SKIP_TRANSITIONS: false`(除非产品要求)
107
- - [ ] 浏览器目视无绿色调试按钮
108
-
109
- ## Related Skills
110
-
111
- - [playable-record](../playable-record/SKILL.md) — `verify:contract`, `verify:firstwin`, `record:mp4`
112
- - [playable-validate](../playable-validate/SKILL.md) — 当前最小 video validation loop
113
-
114
- ## References
115
-
116
- - 配置与接入:[references/debug-config.md](references/debug-config.md)
@@ -1,4 +0,0 @@
1
- interface:
2
- display_name: 'Playable Debug Playback'
3
- short_description: 'Restore and manage playable debug auto-play.'
4
- default_prompt: 'Restore or configure playable debug controls including one-click auto-clear and pre-ship flag checks.'
@@ -1,40 +0,0 @@
1
- # Debug Config Reference
2
-
3
- ## MainScene 接入
4
-
5
- ```js
6
- this.debugButton = GAME_CONFIG.SHOW_DEBUG_BUTTON
7
- ? new DebugButton(this, () => this._onDebugAutoPlay())
8
- : null;
9
- ```
10
-
11
- ENDCARD 时禁用:
12
-
13
- ```js
14
- if (this.debugButton) this.debugButton.setEnabled(false);
15
- ```
16
-
17
- 点击穿透:board 点击前先判断 `debugButton.contains(x, y)`。
18
-
19
- ## DEBUG 布局块
20
-
21
- ```js
22
- DEBUG: { W: 120, H: 40, X: 0, Y: 0 } // X/Y 由 applySafeLayout 写入
23
- ```
24
-
25
- 默认位置:安全区左侧,连击条上方。
26
-
27
- ## \_prepareDebugAutoPlay 要点
28
-
29
- - `pairGuide.skip()` 若教程激活
30
- - `matchSystem.disableTutorialMode()`
31
- - 显示 HUD / 启动 countdown(若尚未开始)
32
-
33
- ## 扩展调试能力
34
-
35
- 新增调试按钮时:
36
-
37
- 1. 增加 `SHOW_*` 开关,默认 `false`
38
- 2. 在 `applySafeLayout` 派生坐标,勿硬编码 Y
39
- 3. 发布检查脚本加入 `rg` 规则
40
- 4. depth ≥ 500,避免被 board 遮挡
@@ -1,140 +0,0 @@
1
- ---
2
- name: playable-record
3
- description: >-
4
- Minimal runtime contract check and headed 60fps MP4 recording for playables.
5
- Use when iteration 1 optimize needs `verify:contract` or delivery evidence MP4.
6
- ---
7
-
8
- # Playable Record Playback (MP4)
9
-
10
- > 当前 template-v2 迁移只接入最小运行时验证与录屏路径。
11
-
12
- ---
13
-
14
- ## Agent 入口
15
-
16
- ### 0. 前置(record 前必做)
17
-
18
- ```bash
19
- npm run verify:contract # 快速断言 window.__playable 已接线
20
- npm run verify:lifecycle # 确认 phasePath: HOOK→…→ENDCARD 完整(iter2 DoD 必须项)
21
- ```
22
-
23
- **verify:lifecycle 检查**:phasePath 必须从 HOOK 出发,经过 TUTORIAL 和 GAMEPLAY,到达 ENDCARD,中间无跳跃。失败时输出缺失的 phase,路由回 generate 修复状态机骨架。
24
-
25
- **Harness 契约(pass 标准)** — 游戏须通过 `publishPlayableRuntime()` 暴露:
26
-
27
- ```js
28
- window.__playable.autoPlay();
29
- window.__playable.getState(); // { currentPhase, isGameOver }
30
- window.__playable.getCanvas?.(); // 可选,录屏取 canvas
31
- window.__playable.hideDebugUi?.(); // 可选,录屏前隐藏 debug UI
32
- ```
33
-
34
- Legacy:`MainScene._onDebugAutoPlay()` 仍可通过但会 warn。
35
-
36
- ### 1. 录屏
37
-
38
- ```bash
39
- npm run record:mp4 -- --headed --fps=60
40
- ```
41
-
42
- ### 2. 验收 spec
43
-
44
- ```bash
45
- ffprobe -v error -select_streams v:0 \
46
- -show_entries stream=width,height,r_frame_rate,duration \
47
- -of default=noprint_wrappers=1 recordings/*.mp4
48
- ```
49
-
50
- 要求:1080×1920,`60/1`,完整局 ~25s。禁止 Playwright 25fps `recordVideo`。
51
-
52
- ### 3. 产出
53
-
54
- `recordings/playable-YYYYMMDD-HHmmss.mp4`
55
-
56
- ## When to Apply
57
-
58
- - 需要自动跑完一局并导出视频(HOOK → 一键通关 → ENDCARD)
59
- - 成片需要 BGM / 消牌音效 / 胜利 jingle
60
- - 不想改游戏源码或打进发布包
61
-
62
- ## Quick Start
63
-
64
- ```bash
65
- brew install ffmpeg # 若未安装
66
- cd testN
67
- npm install
68
- npm run record:mp4:install # 安装 Chromium
69
- npm run record:mp4 -- --headed --fps=60
70
- # 或直接:
71
- node ../skills/playable-record/scripts/record-playable.mjs --root=. --headed --fps=60
72
- ```
73
-
74
- 输出:`recordings/playable-YYYYMMDD-HHmmss.mp4`
75
-
76
- 命令成功只代表 MP4 文件写出来了,不代表画面质量已经通过后期评审。
77
-
78
- ## 流程
79
-
80
- ```
81
- game/index.html 加载
82
- → 等待 window.__playable(或 legacy MainScene HOOK)
83
- → canvas.captureStream(60) + masterGain 单路 MediaRecorder
84
- → hook-delay 录入场动画(无声)
85
- → __playable.autoPlay()(或 legacy evaluate _onDebugAutoPlay())
86
- → 等待 ENDCARD + tail-delay
87
- → 停止录制 → ffmpeg 转 MP4
88
- ```
89
-
90
- ## CLI 参数
91
-
92
- | 参数 | 默认 | 说明 |
93
- | --------------------- | ----------- | ----------------------- |
94
- | `--port=8080` | 8080 | http-server 端口 |
95
- | `--out=recordings/` | recordings/ | MP4 输出目录 |
96
- | `--fps=60` | 60 | Canvas 采集帧率 |
97
- | `--hook-delay=1200` | 1200 | HOOK 后等待 ms 再自动玩 |
98
- | `--tail-delay=2500` | 2500 | ENDCARD 尾帧停留 ms |
99
- | `--timeout=180000` | 180000 | 整局超时 ms |
100
- | `--keep-intermediate` | off | 保留 capture.webm |
101
- | `--headed` | off | 有界面浏览器(排查用) |
102
-
103
- ## 音频原理
104
-
105
- Playwright `screencast` / `recordVideo` **不含音频且固定 25fps**,不适合游戏录屏。
106
-
107
- 改用浏览器内 **`canvas.captureStream(60)` + `MediaRecorder`**,单路同时采集画面与 Web Audio:
108
-
109
- ```
110
- game.canvas.captureStream(60) ──┐
111
- ├→ MediaRecorder → capture.webm → ffmpeg → MP4
112
- masterGain → MediaStreamDest ───┘
113
- ```
114
-
115
- [`scripts/lib/record-audio-bridge.js`](../../scripts/lib/record-audio-bridge.js) 在 HOOK 阶段注入 `startAvCapture(fps)`,音画同轨,无需手动对轨。
116
-
117
- 默认 **60fps**;可通过 `--fps=30` 降低体积。
118
-
119
- ## 故障排查
120
-
121
- | 现象 | 处理 |
122
- | ------------- | --------------------------------------------------------------------------- |
123
- | contract 失败 | 先 `npm run verify:contract` — 缺 `window.__playable` 时修 `game/contract/` |
124
- | MP4 无音轨 | 确认 runtime 已 boot;bridge 会 `audioContext.resume()` |
125
- | 全程静音 | 检查 `__playable.autoPlay()` 或 legacy `_onDebugAutoPlay` |
126
- | 音画漂移 | 确保 screencast 与 MediaRecorder 同时 start/stop |
127
- | WebGL 异常 | 加 `--headed` |
128
- | ffmpeg 找不到 | `brew install ffmpeg` |
129
-
130
- ## 已知限制
131
-
132
- - 音效为 Web Audio 振荡器合成 tone,与游戏内一致,非 MP3 素材
133
- - 默认不含 Boot loading(screencast 从 HOOK 开始)
134
- - 仅 dev 页 `game/index.html`
135
- - 跳过教程(与一键通关相同)
136
-
137
- ## Files
138
-
139
- - `scripts/record-playable.mjs` — 主脚本
140
- - `scripts/lib/record-audio-bridge.js` — 浏览器端音频桥
@@ -1,104 +0,0 @@
1
- /**
2
- * Shared dev-server helpers for verify / record / dev:start scripts.
3
- *
4
- * Single source of truth for how the harness boots a server and discovers the
5
- * real listening URL. Previously these were copy-pasted into verify-contract,
6
- * verify-firstwin and record-playable, which let the port-detection logic drift.
7
- *
8
- * Vite runs with strictPort:false, so when the preferred port (3000) is taken it
9
- * auto-increments. `detectDevUrl` parses Vite's `Local:` stdout line to recover
10
- * the actual port instead of guessing — this is what keeps devUrl correct under
11
- * port drift (see docs/harness/experiment-lessons.md §9.2).
12
- */
13
-
14
- import { spawn } from 'node:child_process';
15
-
16
- const LOCAL_URL_RE = /Local:\s+(http:\/\/(?:localhost|127\.0\.0\.1):\d+\/)/;
17
-
18
- /** Poll a URL with HEAD until it responds or the timeout elapses. */
19
- export async function waitForHttp(url, timeoutMs = 30000) {
20
- const start = Date.now();
21
- while (Date.now() - start < timeoutMs) {
22
- try {
23
- const res = await fetch(url, { method: 'HEAD' });
24
- if (res.ok) return;
25
- } catch {
26
- /* retry */
27
- }
28
- await new Promise((r) => setTimeout(r, 250));
29
- }
30
- throw new Error(`Server not ready: ${url}`);
31
- }
32
-
33
- /** Spawn `npm run dev` (Vite) bound to 127.0.0.1 with piped stdio for URL detection. */
34
- export function startDevServer(cwd) {
35
- return spawn('npm', ['run', 'dev', '--', '--host', '127.0.0.1'], {
36
- cwd,
37
- stdio: ['ignore', 'pipe', 'pipe'],
38
- });
39
- }
40
-
41
- /** Spawn a static http-server for the non-dev probe path. */
42
- export function startHttpServer(port, cwd) {
43
- return spawn('npx', ['http-server', '.', '-p', String(port), '-c-1', '--cors'], {
44
- cwd,
45
- stdio: ['ignore', 'pipe', 'pipe'],
46
- });
47
- }
48
-
49
- /**
50
- * Parse a chunk of dev-server output for Vite's `Local: http://…:PORT/` line.
51
- * Exposed for unit testing the port-drift case.
52
- * @param {string} text
53
- * @returns {string | null}
54
- */
55
- export function parseLocalUrl(text) {
56
- const m = String(text).match(LOCAL_URL_RE);
57
- return m ? m[1] : null;
58
- }
59
-
60
- /**
61
- * Resolve the actual dev-server URL by watching stdout/stderr for Vite's
62
- * `Local:` line. Falls back to `preferredUrl` if nothing is parsed in time.
63
- * @param {import('node:child_process').ChildProcess} child
64
- * @param {string} preferredUrl
65
- * @param {number} [timeoutMs]
66
- * @returns {Promise<string>}
67
- */
68
- export function detectDevUrl(child, preferredUrl, timeoutMs = 30000) {
69
- return new Promise((res) => {
70
- const timer = setTimeout(() => {
71
- cleanup();
72
- res(preferredUrl);
73
- }, timeoutMs);
74
- const onData = (data) => {
75
- const url = parseLocalUrl(data);
76
- if (url) {
77
- clearTimeout(timer);
78
- cleanup();
79
- res(url);
80
- }
81
- };
82
- const cleanup = () => {
83
- child.stdout?.off('data', onData);
84
- child.stderr?.off('data', onData);
85
- };
86
- child.stdout?.on('data', onData);
87
- child.stderr?.on('data', onData);
88
- });
89
- }
90
-
91
- /** Pick a free port starting at `preferred`; skips ports already serving `pathToProbe`. */
92
- export async function pickServerPort(preferred, pathToProbe = '/game/index.html') {
93
- for (let i = 0; i < 20; i += 1) {
94
- const port = preferred + i;
95
- try {
96
- await waitForHttp(`http://127.0.0.1:${port}${pathToProbe}`, 400);
97
- // Something already serves here — try the next port.
98
- continue;
99
- } catch {
100
- return port;
101
- }
102
- }
103
- return preferred + 20;
104
- }
@@ -1,141 +0,0 @@
1
- function pickAvMimeType() {
2
- const candidates = [
3
- 'video/webm;codecs=vp8',
4
- 'video/webm;codecs=vp9',
5
- 'video/webm'
6
- ];
7
- return candidates.find((mime) => MediaRecorder.isTypeSupported(mime)) || 'video/webm';
8
- }
9
-
10
- function resolveCaptureSurface(fps) {
11
- const playable = window.__playable;
12
- const game = window.__game;
13
-
14
- let canvas = null;
15
- let targetFps = fps;
16
-
17
- if (playable && typeof playable.getCanvas === 'function') {
18
- canvas = playable.getCanvas();
19
- }
20
- if (!canvas && game?.canvas) {
21
- canvas = game.canvas;
22
- }
23
- if (playable && typeof playable.getCaptureFps === 'function') {
24
- targetFps = playable.getCaptureFps() || targetFps;
25
- } else if (game?.loop) {
26
- game.loop.targetFps = targetFps;
27
- game.loop.forceSetTimeOut = false;
28
- }
29
-
30
- return { canvas, targetFps, hasGame: !!game, hasPlayable: !!playable };
31
- }
32
-
33
- function startAvCapture(fps) {
34
- try {
35
- const { canvas, targetFps, hasGame, hasPlayable } = resolveCaptureSurface(fps);
36
-
37
- window.__avCaptureDebug = {
38
- hasGame,
39
- hasPlayable,
40
- hasCanvas: !!canvas,
41
- canvasType: canvas?.constructor?.name,
42
- captureStreamType: typeof canvas?.captureStream,
43
- mimeType: null,
44
- recorderState: null,
45
- error: null,
46
- chunks: 0
47
- };
48
-
49
- if (!canvas) {
50
- throw new Error('Capture canvas not ready — implement window.__playable.getCanvas() or expose Phaser game.canvas');
51
- }
52
-
53
- const videoStream = canvas.captureStream(targetFps);
54
- const audioCtx = new (window.AudioContext || window.webkitAudioContext)({ sampleRate: 48000 });
55
- const dest = audioCtx.createMediaStreamDestination();
56
- const silence = audioCtx.createOscillator();
57
- silence.frequency.value = 0;
58
- const gain = audioCtx.createGain();
59
- gain.gain.value = 0.0001;
60
- silence.connect(gain);
61
- gain.connect(dest);
62
- silence.start();
63
- const combined = new MediaStream([
64
- ...videoStream.getVideoTracks(),
65
- ...dest.stream.getAudioTracks()
66
- ]);
67
- const mimeType = pickAvMimeType();
68
- window.__avCaptureDebug.mimeType = mimeType;
69
-
70
- const recorder = new MediaRecorder(combined, {
71
- mimeType,
72
- videoBitsPerSecond: 8_000_000
73
- });
74
-
75
- window.__recordAv = {
76
- chunks: [],
77
- recorder,
78
- videoStream: combined,
79
- audioCtx,
80
- silence,
81
- mimeType,
82
- fps
83
- };
84
-
85
- recorder.ondataavailable = (e) => {
86
- if (e.data.size) window.__recordAv.chunks.push(e.data);
87
- };
88
- recorder.start(100);
89
- window.__avCaptureDebug.recorderState = recorder.state;
90
- } catch (err) {
91
- if (window.__avCaptureDebug) window.__avCaptureDebug.error = err.message;
92
- else window.__avCaptureDebug = { error: err.message };
93
- throw err;
94
- }
95
- }
96
-
97
- function stopAvCapture() {
98
- const state = window.__recordAv;
99
- if (!state?.recorder) {
100
- throw new Error('AV capture was not started');
101
- }
102
-
103
- const { recorder, chunks, videoStream } = state;
104
-
105
- if (window.__avCaptureDebug) {
106
- window.__avCaptureDebug.chunks = chunks.length;
107
- window.__avCaptureDebug.totalBytes = chunks.reduce((a, c) => a + c.size, 0);
108
- }
109
-
110
- return new Promise((resolve, reject) => {
111
- recorder.onstop = async () => {
112
- try {
113
- const blob = new Blob(chunks, { type: state.mimeType || 'video/webm' });
114
- videoStream.getTracks().forEach((track) => track.stop());
115
- if (state.audioCtx) { try { state.audioCtx.close(); } catch {} }
116
- if (state.silence) { try { state.silence.stop(); } catch {} }
117
- window.__recordAv = null;
118
- const buf = await blob.arrayBuffer();
119
- resolve(Array.from(new Uint8Array(buf)));
120
- } catch (err) {
121
- reject(err);
122
- }
123
- };
124
- recorder.onerror = () => reject(new Error('MediaRecorder failed'));
125
- if (recorder.state === 'inactive') {
126
- reject(new Error('MediaRecorder already stopped'));
127
- return;
128
- }
129
- recorder.stop();
130
- });
131
- }
132
-
133
- /** @deprecated use startAvCapture */
134
- function startAudioCapture() {
135
- startAvCapture(25);
136
- }
137
-
138
- /** @deprecated use stopAvCapture */
139
- function stopAudioCapture() {
140
- return stopAvCapture();
141
- }