@playcraft/cli 0.1.54 → 0.1.55-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/README.md +83 -15
  2. package/SKILLS_REGISTRY.md +149 -0
  3. package/dist/agent/local-backend.js +1 -1
  4. package/dist/assets/client.js +157 -0
  5. package/dist/assets/messages.js +48 -0
  6. package/dist/auth/account-activation.js +157 -0
  7. package/dist/auth/messages.js +30 -0
  8. package/dist/cli-root-help.js +4 -0
  9. package/dist/commands/assets.js +123 -0
  10. package/dist/commands/build-all.js +5 -19
  11. package/dist/commands/build-temp.js +26 -0
  12. package/dist/commands/build.js +15 -28
  13. package/dist/commands/create.js +26 -33
  14. package/dist/commands/image-layer-messages.js +37 -0
  15. package/dist/commands/image-layer-tools.js +185 -0
  16. package/dist/commands/image.js +2 -73
  17. package/dist/commands/library-messages.js +46 -0
  18. package/dist/commands/library.js +130 -0
  19. package/dist/commands/login.js +84 -42
  20. package/dist/commands/platform-skills.generated.js +19 -0
  21. package/dist/commands/playable.js +53 -0
  22. package/dist/commands/preview-runtime.js +21 -0
  23. package/dist/commands/skills.js +4 -0
  24. package/dist/commands/tools-3d.js +11 -0
  25. package/dist/commands/tools-batch.js +113 -0
  26. package/dist/commands/tools-generation.js +6 -0
  27. package/dist/commands/tools.js +2 -0
  28. package/dist/commands/video.js +122 -0
  29. package/dist/commands/workspace-runtime.js +54 -0
  30. package/dist/commands/workspace.js +40 -0
  31. package/dist/config.js +59 -4
  32. package/dist/index.js +47 -3
  33. package/dist/preview-runtime/distribution.js +77 -0
  34. package/dist/project-skills/builtin-import.js +225 -0
  35. package/dist/project-skills/commands.js +77 -0
  36. package/dist/project-skills/lifecycle.js +28 -0
  37. package/dist/project-skills/local-run.js +112 -0
  38. package/dist/project-skills/local-store.js +221 -0
  39. package/dist/project-skills/messages.js +80 -0
  40. package/dist/project-skills/reconcile.js +62 -0
  41. package/dist/project-skills/remote-cache.js +51 -0
  42. package/dist/project-skills/validation.js +19 -0
  43. package/dist/recording/messages.js +40 -0
  44. package/dist/recording/project-digest.js +85 -0
  45. package/dist/recording/recorder.js +293 -0
  46. package/dist/recording/scenario.js +50 -0
  47. package/dist/remix/clone.js +2 -0
  48. package/dist/remix/init-template.js +2 -0
  49. package/dist/remix/pull.js +2 -0
  50. package/dist/remix/push.js +21 -1
  51. package/dist/skill-registry/client.js +345 -0
  52. package/dist/skill-registry/commands.js +180 -0
  53. package/dist/skill-registry/evaluation-client.js +156 -0
  54. package/dist/skill-registry/evaluation-commands.js +174 -0
  55. package/dist/skill-registry/messages.js +177 -0
  56. package/dist/skill-registry/package.js +275 -0
  57. package/dist/skill-registry/platform-package.js +100 -0
  58. package/dist/utils/agent-api-client.js +245 -30
  59. package/dist/utils/environment-endpoints.js +17 -0
  60. package/dist/utils/error-diagnostics.js +20 -0
  61. package/dist/utils/playcraft-http-client.js +6 -4
  62. package/dist/utils/tool-operation-journal.js +124 -0
  63. package/dist/utils/video-evidence-git.js +81 -0
  64. package/dist/video-replication/client.js +234 -0
  65. package/dist/video-replication/comparison-evidence.js +149 -0
  66. package/dist/video-replication/comparison-files.js +57 -0
  67. package/dist/video-replication/comparison-log.js +72 -0
  68. package/dist/video-replication/comparison-messages.js +104 -0
  69. package/dist/video-replication/comparison-output.js +63 -0
  70. package/dist/video-replication/comparison-preflight.js +66 -0
  71. package/dist/video-replication/comparison.js +230 -0
  72. package/dist/video-replication/diagnostics.js +41 -0
  73. package/dist/video-replication/evidence.js +165 -0
  74. package/dist/video-replication/media.js +112 -0
  75. package/dist/video-replication/messages.js +97 -0
  76. package/dist/workspace/messages.js +67 -0
  77. package/dist/workspace/transfer-client.js +237 -0
  78. package/dist/workspace/transfer-errors.js +48 -0
  79. package/dist/workspace-runtime/batch/content-changes.js +30 -0
  80. package/dist/workspace-runtime/batch/control.js +86 -0
  81. package/dist/workspace-runtime/batch/deliver.js +173 -0
  82. package/dist/workspace-runtime/batch/freeze.js +101 -0
  83. package/dist/workspace-runtime/batch/generate.js +249 -0
  84. package/dist/workspace-runtime/batch/git.js +40 -0
  85. package/dist/workspace-runtime/batch/occupancy.js +8 -0
  86. package/dist/workspace-runtime/batch/policy.js +70 -0
  87. package/dist/workspace-runtime/batch/prepare.js +317 -0
  88. package/dist/workspace-runtime/batch/processes.js +72 -0
  89. package/dist/workspace-runtime/batch/records.js +113 -0
  90. package/dist/workspace-runtime/batch/routes.js +61 -0
  91. package/dist/workspace-runtime/batch/source-candidate.js +86 -0
  92. package/dist/workspace-runtime/batch/source-capture.js +146 -0
  93. package/dist/workspace-runtime/batch/source-failure.js +43 -0
  94. package/dist/workspace-runtime/batch/source-publish.js +130 -0
  95. package/dist/workspace-runtime/codex/app-server.js +1065 -0
  96. package/dist/workspace-runtime/codex/compact.js +46 -0
  97. package/dist/workspace-runtime/codex/config-toml.js +107 -0
  98. package/dist/workspace-runtime/codex/delivery-tools.js +144 -0
  99. package/dist/workspace-runtime/codex/jsonrpc-stdio.js +145 -0
  100. package/dist/workspace-runtime/codex/launcher-client.js +177 -0
  101. package/dist/workspace-runtime/codex/loopback.js +146 -0
  102. package/dist/workspace-runtime/codex/mcp-config.js +39 -0
  103. package/dist/workspace-runtime/codex/model-broker.js +263 -0
  104. package/dist/workspace-runtime/codex/native-adapter.js +9 -0
  105. package/dist/workspace-runtime/codex/permissions.js +79 -0
  106. package/dist/workspace-runtime/codex/thread-image.js +38 -0
  107. package/dist/workspace-runtime/codex/tool-response.js +10 -0
  108. package/dist/workspace-runtime/codex/ui-instructions.js +4 -0
  109. package/dist/workspace-runtime/codex/ui-tools.js +203 -0
  110. package/dist/workspace-runtime/codex/work-mode.js +15 -0
  111. package/dist/workspace-runtime/main.js +10 -0
  112. package/dist/workspace-runtime/persistence/journal.js +365 -0
  113. package/dist/workspace-runtime/persistence/native-subagents.js +162 -0
  114. package/dist/workspace-runtime/persistence/sqlite-client.js +77 -0
  115. package/dist/workspace-runtime/persistence/sqlite-worker.js +1161 -0
  116. package/dist/workspace-runtime/persistence/stopped-execution.js +77 -0
  117. package/dist/workspace-runtime/previews/diagnostics.js +44 -0
  118. package/dist/workspace-runtime/previews/output.js +36 -0
  119. package/dist/workspace-runtime/previews/publish.js +283 -0
  120. package/dist/workspace-runtime/previews/runtime-preview.js +251 -0
  121. package/dist/workspace-runtime/previews/single-file.js +43 -0
  122. package/dist/workspace-runtime/processes/managed-writes.js +69 -0
  123. package/dist/workspace-runtime/serve.js +441 -0
  124. package/dist/workspace-runtime/server/accept-operation.js +61 -0
  125. package/dist/workspace-runtime/server/asset-transfers.js +63 -0
  126. package/dist/workspace-runtime/server/auth.js +21 -0
  127. package/dist/workspace-runtime/server/connectivity.js +211 -0
  128. package/dist/workspace-runtime/server/desktop-host.js +429 -0
  129. package/dist/workspace-runtime/server/desktop-preview-config.js +81 -0
  130. package/dist/workspace-runtime/server/desktop-preview-service.js +157 -0
  131. package/dist/workspace-runtime/server/desktop-preview-static.js +53 -0
  132. package/dist/workspace-runtime/server/desktop-preview.js +189 -0
  133. package/dist/workspace-runtime/server/dispatch.js +1655 -0
  134. package/dist/workspace-runtime/server/endpoints.js +21 -0
  135. package/dist/workspace-runtime/server/execution-group.js +90 -0
  136. package/dist/workspace-runtime/server/http.js +1363 -0
  137. package/dist/workspace-runtime/server/lock.js +53 -0
  138. package/dist/workspace-runtime/server/operation-record.js +33 -0
  139. package/dist/workspace-runtime/server/rfb-watch-gate.js +168 -0
  140. package/dist/workspace-runtime/server/session-restore.js +84 -0
  141. package/dist/workspace-runtime/server/source-uploader.js +138 -0
  142. package/dist/workspace-runtime/server/submit-operation.js +41 -0
  143. package/dist/workspace-runtime/server/terminal-host.js +366 -0
  144. package/dist/workspace-runtime/server/types.js +1 -0
  145. package/dist/workspace-runtime/server/workspace-transfer.js +168 -0
  146. package/dist/workspace-runtime/verify-artifact.js +59 -0
  147. package/dist/workspace-runtime/workspaces/append-only-log.js +62 -0
  148. package/dist/workspace-runtime/workspaces/archive.js +207 -0
  149. package/dist/workspace-runtime/workspaces/artifact-events.js +55 -0
  150. package/dist/workspace-runtime/workspaces/artifact-files.js +199 -0
  151. package/dist/workspace-runtime/workspaces/artifact-receipts.js +89 -0
  152. package/dist/workspace-runtime/workspaces/artifacts.js +282 -0
  153. package/dist/workspace-runtime/workspaces/asset-library-import.js +387 -0
  154. package/dist/workspace-runtime/workspaces/asset-publication-access.js +25 -0
  155. package/dist/workspace-runtime/workspaces/asset-transfer-dependencies.js +81 -0
  156. package/dist/workspace-runtime/workspaces/asset-transfer-publish.js +438 -0
  157. package/dist/workspace-runtime/workspaces/asset-transfer-storage.js +389 -0
  158. package/dist/workspace-runtime/workspaces/attachment-content.js +73 -0
  159. package/dist/workspace-runtime/workspaces/attachments.js +185 -0
  160. package/dist/workspace-runtime/workspaces/batch-commit.js +142 -0
  161. package/dist/workspace-runtime/workspaces/binary-content.js +65 -0
  162. package/dist/workspace-runtime/workspaces/binary-write.js +117 -0
  163. package/dist/workspace-runtime/workspaces/cli-context.js +23 -0
  164. package/dist/workspace-runtime/workspaces/cli-credentials.js +115 -0
  165. package/dist/workspace-runtime/workspaces/composer-context.js +147 -0
  166. package/dist/workspace-runtime/workspaces/context-error.js +2 -0
  167. package/dist/workspace-runtime/workspaces/delivery-build.js +331 -0
  168. package/dist/workspace-runtime/workspaces/delivery-store.js +168 -0
  169. package/dist/workspace-runtime/workspaces/delivery.js +64 -0
  170. package/dist/workspace-runtime/workspaces/dependencies.js +279 -0
  171. package/dist/workspace-runtime/workspaces/developer-command.js +98 -0
  172. package/dist/workspace-runtime/workspaces/directories.js +135 -0
  173. package/dist/workspace-runtime/workspaces/directory-access.js +37 -0
  174. package/dist/workspace-runtime/workspaces/directory-attachments.js +245 -0
  175. package/dist/workspace-runtime/workspaces/directory-create.js +57 -0
  176. package/dist/workspace-runtime/workspaces/directory-maintenance.js +111 -0
  177. package/dist/workspace-runtime/workspaces/directory-mutations.js +238 -0
  178. package/dist/workspace-runtime/workspaces/directory-revisions.js +56 -0
  179. package/dist/workspace-runtime/workspaces/directory-stats.js +49 -0
  180. package/dist/workspace-runtime/workspaces/disk-snapshot.js +31 -0
  181. package/dist/workspace-runtime/workspaces/empty-template.js +43 -0
  182. package/dist/workspace-runtime/workspaces/file-content.js +48 -0
  183. package/dist/workspace-runtime/workspaces/files-search.js +116 -0
  184. package/dist/workspace-runtime/workspaces/files.js +150 -0
  185. package/dist/workspace-runtime/workspaces/git-credential-broker.js +312 -0
  186. package/dist/workspace-runtime/workspaces/git-credential-helper.js +68 -0
  187. package/dist/workspace-runtime/workspaces/git-direct-store.js +155 -0
  188. package/dist/workspace-runtime/workspaces/git.js +670 -0
  189. package/dist/workspace-runtime/workspaces/instructions.js +56 -0
  190. package/dist/workspace-runtime/workspaces/json5-edit.js +313 -0
  191. package/dist/workspace-runtime/workspaces/library-attachments.js +268 -0
  192. package/dist/workspace-runtime/workspaces/operation-log.js +23 -0
  193. package/dist/workspace-runtime/workspaces/optional-platform-skills.js +14 -0
  194. package/dist/workspace-runtime/workspaces/parameter-agent-inputs.js +97 -0
  195. package/dist/workspace-runtime/workspaces/parameter-agent-protocol.js +40 -0
  196. package/dist/workspace-runtime/workspaces/parameter-agent-store.js +58 -0
  197. package/dist/workspace-runtime/workspaces/parameter-agent.js +284 -0
  198. package/dist/workspace-runtime/workspaces/parameter-assets.js +189 -0
  199. package/dist/workspace-runtime/workspaces/parameters.js +329 -0
  200. package/dist/workspace-runtime/workspaces/prepare.js +284 -0
  201. package/dist/workspace-runtime/workspaces/registry.js +251 -0
  202. package/dist/workspace-runtime/workspaces/remix-references.js +301 -0
  203. package/dist/workspace-runtime/workspaces/revisions.js +31 -0
  204. package/dist/workspace-runtime/workspaces/session-image.js +104 -0
  205. package/dist/workspace-runtime/workspaces/shared-git.js +40 -0
  206. package/dist/workspace-runtime/workspaces/skill-artifact-loader.js +95 -0
  207. package/dist/workspace-runtime/workspaces/skills.js +191 -0
  208. package/dist/workspace-runtime/workspaces/theme-asset-index.js +157 -0
  209. package/dist/workspace-runtime/workspaces/transfer-quota.js +69 -0
  210. package/dist/workspace-runtime/workspaces/transfer.js +471 -0
  211. package/dist/workspace-runtime/workspaces/turn-changes.js +75 -0
  212. package/dist/workspace-runtime/workspaces/video-attachments.js +49 -0
  213. package/dist/workspace-runtime/workspaces/worktree-attachments.js +74 -0
  214. package/dist/workspace-runtime/workspaces/worktree-checkout.js +67 -0
  215. package/dist/workspace-runtime/workspaces/worktrees.js +73 -0
  216. package/package.json +16 -5
  217. package/project-template/.claude/skills/playcraft-audio-generation/SKILL.md +31 -4
  218. package/project-template/.claude/skills/playcraft-image-generation/SKILL.md +36 -5
  219. package/project-template/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +1 -1
  220. package/project-template/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +1 -1
  221. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +1 -1
  222. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +1 -1
  223. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +1 -1
  224. package/project-template/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +1 -1
  225. package/project-template/.claude/skills/playcraft-image-generation/reference/ta-image-generation-detail.md +300 -0
  226. package/project-template/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +1 -1
  227. package/project-template/.claude/skills/playcraft-image-processing/SKILL.md +50 -25
  228. package/project-template/.claude/skills/playcraft-replica-validation/SKILL.md +25 -0
  229. package/project-template/.claude/skills/playcraft-replica-validation/references/contracts.md +79 -0
  230. package/project-template/.claude/skills/playcraft-video-understanding/SKILL.md +29 -0
  231. package/project-template/.claude/skills/playcraft-video-understanding/references/contracts.md +37 -0
  232. package/project-template/.claude/skills/playcraft-workspace-assets/SKILL.md +53 -0
  233. package/project-template/.claude/skills/playcraft-workspace-assets/references/requests.json +32 -0
  234. package/project-template-v2/.claude/agents/artist.md +82 -0
  235. package/project-template-v2/.claude/agents/developer.md +153 -0
  236. package/project-template-v2/.claude/agents/game-designer.md +264 -0
  237. package/project-template-v2/.claude/agents/refs/artist-art-style-catalog.md +533 -0
  238. package/project-template-v2/.claude/agents/refs/artist-color-audio-recipes.md +153 -0
  239. package/project-template-v2/.claude/agents/refs/artist-dimension-axis.md +27 -0
  240. package/project-template-v2/.claude/agents/refs/artist-master-composite-recipes.md +208 -0
  241. package/project-template-v2/.claude/agents/refs/atom-skill-library.md +81 -0
  242. package/project-template-v2/.claude/agents/refs/developer-impl-cookbook.md +432 -0
  243. package/project-template-v2/.claude/agents/refs/framework-5-component-filter.md +252 -0
  244. package/project-template-v2/.claude/agents/refs/framework-game-feel-juice.md +266 -0
  245. package/project-template-v2/.claude/agents/refs/framework-mda.md +147 -0
  246. package/project-template-v2/.claude/agents/refs/game-designer-gameplay-sufficiency.md +123 -0
  247. package/project-template-v2/.claude/agents/refs/ta-3d-flip-recipe.md +88 -0
  248. package/project-template-v2/.claude/agents/refs/ta-atlas-deliverable-standard.md +67 -0
  249. package/project-template-v2/.claude/agents/refs/ta-batch-pipeline-recipes.md +120 -0
  250. package/project-template-v2/.claude/agents/refs/ta-image-generation-detail.md +300 -0
  251. package/project-template-v2/.claude/agents/refs/ta-image-ops-reference.md +495 -0
  252. package/project-template-v2/.claude/agents/refs/ta-pipeline-cookbook.md +1141 -0
  253. package/project-template-v2/.claude/agents/refs/ta-tools-reference.md +111 -0
  254. package/project-template-v2/.claude/agents/refs/ta-vfx-preset-catalog.md +365 -0
  255. package/project-template-v2/.claude/agents/refs/threejs-cannon-pitfalls.md +412 -0
  256. package/project-template-v2/.claude/agents/reviewer.md +75 -0
  257. package/project-template-v2/.claude/agents/technical-artist.md +86 -0
  258. package/project-template-v2/.claude/hooks/snapshot-milestone.mjs +243 -0
  259. package/project-template-v2/.claude/hooks/user-prompt.mjs +133 -0
  260. package/project-template-v2/.claude/settings.json +33 -0
  261. package/project-template-v2/.claude/skills/brainstorming/SKILL.md +161 -0
  262. package/project-template-v2/.claude/skills/brainstorming/scripts/frame-template.html +270 -0
  263. package/project-template-v2/.claude/skills/brainstorming/scripts/helper.js +177 -0
  264. package/project-template-v2/.claude/skills/brainstorming/scripts/server.cjs +354 -0
  265. package/project-template-v2/.claude/skills/brainstorming/scripts/start-server.sh +148 -0
  266. package/project-template-v2/.claude/skills/brainstorming/scripts/stop-server.sh +56 -0
  267. package/project-template-v2/.claude/skills/brainstorming/scripts/wait-for-selection.sh +62 -0
  268. package/project-template-v2/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  269. package/project-template-v2/.claude/skills/brainstorming/visual-companion.md +309 -0
  270. package/project-template-v2/.claude/skills/playcraft-ad-psychology/SKILL.md +182 -0
  271. package/project-template-v2/.claude/skills/playcraft-art-style-guide/SKILL.md +123 -0
  272. package/project-template-v2/.claude/skills/playcraft-asset-state-sheet/SKILL.md +205 -0
  273. package/project-template-v2/.claude/skills/playcraft-audio-generation/SKILL.md +307 -0
  274. package/project-template-v2/.claude/skills/playcraft-batch-pipeline/SKILL.md +184 -0
  275. package/project-template-v2/.claude/skills/playcraft-build-optimizer/SKILL.md +306 -0
  276. package/project-template-v2/.claude/skills/playcraft-image-generation/SKILL.md +401 -0
  277. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +123 -0
  278. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +254 -0
  279. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +333 -0
  280. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +95 -0
  281. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +118 -0
  282. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +136 -0
  283. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +397 -0
  284. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/ta-image-generation-detail.md +300 -0
  285. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +296 -0
  286. package/project-template-v2/.claude/skills/playcraft-image-ops/SKILL.md +122 -0
  287. package/project-template-v2/.claude/skills/playcraft-image-processing/SKILL.md +244 -0
  288. package/project-template-v2/.claude/skills/playcraft-masking/SKILL.md +373 -0
  289. package/project-template-v2/.claude/skills/playcraft-playable-optimization/SKILL.md +161 -0
  290. package/project-template-v2/.claude/skills/playcraft-research/SKILL.md +215 -0
  291. package/project-template-v2/.claude/skills/playcraft-skill-recommender/SKILL.md +382 -0
  292. package/project-template-v2/.claude/skills/playcraft-sprite-generation/SKILL.md +423 -0
  293. package/project-template-v2/.claude/skills/playcraft-sprite-remix/SKILL.md +158 -0
  294. package/project-template-v2/.claude/skills/playcraft-sprite-sheet/SKILL.md +100 -0
  295. package/project-template-v2/.claude/skills/playcraft-storyboard/SKILL.md +167 -0
  296. package/project-template-v2/.claude/skills/playcraft-style-qa/SKILL.md +270 -0
  297. package/project-template-v2/.claude/skills/playcraft-text-rendering/SKILL.md +236 -0
  298. package/project-template-v2/.claude/skills/playcraft-vfx-animation/SKILL.md +130 -0
  299. package/project-template-v2/.claude/skills/playcraft-workspace-assets/SKILL.md +53 -0
  300. package/project-template-v2/.claude/skills/playcraft-workspace-assets/references/requests.json +32 -0
  301. package/project-template-v2/.claude/skills/playwright-cli/SKILL.md +390 -0
  302. package/project-template-v2/.claude/skills/playwright-cli/references/element-attributes.md +23 -0
  303. package/project-template-v2/.claude/skills/playwright-cli/references/playwright-tests.md +39 -0
  304. package/project-template-v2/.claude/skills/playwright-cli/references/request-mocking.md +87 -0
  305. package/project-template-v2/.claude/skills/playwright-cli/references/running-code.md +240 -0
  306. package/project-template-v2/.claude/skills/playwright-cli/references/session-management.md +226 -0
  307. package/project-template-v2/.claude/skills/playwright-cli/references/spec-driven-testing.md +308 -0
  308. package/project-template-v2/.claude/skills/playwright-cli/references/storage-state.md +275 -0
  309. package/project-template-v2/.claude/skills/playwright-cli/references/test-generation.md +134 -0
  310. package/project-template-v2/.claude/skills/playwright-cli/references/tracing.md +142 -0
  311. package/project-template-v2/.claude/skills/playwright-cli/references/video-recording.md +153 -0
  312. package/project-template-v2/.claude/skills/session-analyzer/SKILL.md +386 -0
  313. package/project-template-v2/.claude/skills/session-analyzer/scripts/execution-breakdown.mjs +182 -0
  314. package/project-template-v2/.claude/skills/session-analyzer/scripts/find-turns.mjs +72 -0
  315. package/project-template-v2/.claude/skills/session-analyzer/scripts/heavy-output.mjs +121 -0
  316. package/project-template-v2/.claude/skills/session-analyzer/scripts/resolve-session.mjs +102 -0
  317. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-stats.mjs +127 -0
  318. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-tool-timeline.mjs +106 -0
  319. package/project-template-v2/.claude/skills/session-analyzer/scripts/time-gaps.mjs +128 -0
  320. package/project-template-v2/.claude/skills/session-analyzer/scripts/turn-timeline.mjs +67 -0
  321. package/project-template-v2/.claude/snapshot.mjs +263 -0
  322. package/project-template-v2/.playcraft/skills.lock.json +152 -0
  323. package/project-template-v2/CLAUDE.md +146 -0
  324. package/project-template-v2/assets/audio/bgm/.gitkeep +0 -0
  325. package/project-template-v2/assets/audio/sfx/.gitkeep +0 -0
  326. package/project-template-v2/assets/bundles/.gitkeep +0 -0
  327. package/project-template-v2/assets/images/bg/.gitkeep +0 -0
  328. package/project-template-v2/assets/images/reference/.gitkeep +0 -0
  329. package/project-template-v2/assets/images/storyboard/.gitkeep +0 -0
  330. package/project-template-v2/assets/images/tiles/.gitkeep +0 -0
  331. package/project-template-v2/assets/images/ui/.gitkeep +0 -0
  332. package/project-template-v2/assets/images/vfx/.gitkeep +0 -0
  333. package/project-template-v2/assets/models/.gitkeep +0 -0
  334. package/project-template-v2/docs/harness/iteration-1/context-flow.md +254 -0
  335. package/project-template-v2/docs/harness/iteration-1/generate-flow.md +91 -0
  336. package/project-template-v2/docs/harness/iteration-1/ideate-flow.md +214 -0
  337. package/project-template-v2/docs/harness/iteration-1/optimize-flow.md +75 -0
  338. package/project-template-v2/docs/harness/iteration-1/wrapup-flow.md +63 -0
  339. package/project-template-v2/docs/harness/iteration-2/context-flow.md +223 -0
  340. package/project-template-v2/docs/harness/iteration-2/generate-flow.md +129 -0
  341. package/project-template-v2/docs/harness/iteration-2/ideate-flow.md +267 -0
  342. package/project-template-v2/docs/harness/iteration-2/optimize-flow.md +164 -0
  343. package/project-template-v2/docs/harness/iteration-2/wrapup-flow.md +115 -0
  344. package/project-template-v2/docs/harness/orchestrator-flow.md +364 -0
  345. package/project-template-v2/docs/project-state.json +60 -0
  346. package/project-template-v2/docs/project-state.md +72 -0
  347. package/project-template-v2/docs/standards/README.md +225 -0
  348. package/project-template-v2/docs/standards/agent-behavior-standards.md +174 -0
  349. package/project-template-v2/docs/standards/artifacts/design-brief.md +19 -0
  350. package/project-template-v2/docs/standards/artifacts/design.md +22 -0
  351. package/project-template-v2/docs/standards/artifacts/game-code.md +41 -0
  352. package/project-template-v2/docs/standards/artifacts/todo-list.md +41 -0
  353. package/project-template-v2/docs/standards/iter1-agent-behavior-standards.md +343 -0
  354. package/project-template-v2/game/index.ts +18 -0
  355. package/project-template-v2/globals.d.ts +51 -0
  356. package/project-template-v2/index.css +34 -0
  357. package/project-template-v2/index.html +18 -0
  358. package/project-template-v2/main.ts +9 -0
  359. package/project-template-v2/package.json +46 -0
  360. package/project-template-v2/skills/_shared/scripts/dispatch-clear.mjs +31 -0
  361. package/project-template-v2/skills/_shared/scripts/dispatch-set.mjs +86 -0
  362. package/project-template-v2/skills/_shared/scripts/dod-check.mjs +153 -0
  363. package/project-template-v2/skills/_shared/scripts/handoff-append.mjs +70 -0
  364. package/project-template-v2/skills/_shared/scripts/lib/validator-artifacts.mjs +91 -0
  365. package/project-template-v2/skills/_shared/scripts/pipeline/dod-config.mjs +131 -0
  366. package/project-template-v2/skills/_shared/scripts/pipeline/index.mjs +80 -0
  367. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-1-core.mjs +90 -0
  368. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-2-wrap.mjs +93 -0
  369. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-3-visual.mjs +23 -0
  370. package/project-template-v2/skills/_shared/scripts/render-project-state.mjs +230 -0
  371. package/project-template-v2/skills/_shared/scripts/state-advance-stage.mjs +58 -0
  372. package/project-template-v2/skills/_shared/scripts/state-get.mjs +339 -0
  373. package/project-template-v2/skills/_shared/scripts/state-handoff.mjs +39 -0
  374. package/project-template-v2/skills/_shared/scripts/state-set.mjs +94 -0
  375. package/project-template-v2/skills/_shared/scripts/state-store.mjs +783 -0
  376. package/project-template-v2/skills/_shared/scripts/todo-add.mjs +88 -0
  377. package/project-template-v2/skills/_shared/scripts/todo-get.mjs +130 -0
  378. package/project-template-v2/skills/_shared/scripts/todo-remove.mjs +33 -0
  379. package/project-template-v2/skills/_shared/scripts/todo-set.mjs +47 -0
  380. package/project-template-v2/skills/_shared/scripts/verify-asset-code-sync.mjs +268 -0
  381. package/project-template-v2/skills/_shared/scripts/verify-env.mjs +285 -0
  382. package/project-template-v2/skills/_shared/scripts/verify-placeholders.mjs +161 -0
  383. package/project-template-v2/skills/playable-autoplay/SKILL.md +176 -0
  384. package/project-template-v2/skills/playable-autoplay/agents/openai.yaml +4 -0
  385. package/project-template-v2/skills/playable-debug/SKILL.md +116 -0
  386. package/project-template-v2/skills/playable-debug/agents/openai.yaml +4 -0
  387. package/project-template-v2/skills/playable-debug/references/debug-config.md +40 -0
  388. package/project-template-v2/skills/playable-record/SKILL.md +140 -0
  389. package/project-template-v2/skills/playable-record/scripts/lib/dev-server.mjs +104 -0
  390. package/project-template-v2/skills/playable-record/scripts/lib/record-audio-bridge.js +141 -0
  391. package/project-template-v2/skills/playable-record/scripts/record-playable.mjs +425 -0
  392. package/project-template-v2/skills/playable-record/scripts/verify-contract.mjs +261 -0
  393. package/project-template-v2/skills/playable-record/scripts/verify-firstwin.mjs +398 -0
  394. package/project-template-v2/skills/playable-record/scripts/verify-fusion.mjs +322 -0
  395. package/project-template-v2/skills/playable-record/scripts/verify-lifecycle.mjs +105 -0
  396. package/project-template-v2/skills/playable-record/scripts/verify-vlm-video.mjs +230 -0
  397. package/project-template-v2/skills/playable-validate/SKILL.md +61 -0
  398. package/project-template-v2/skills/playable-validate/validation-rules.md +14 -0
  399. package/project-template-v2/skills/playable-verify-ui/SKILL.md +63 -0
  400. package/project-template-v2/skills/playable-verify-ui/scripts/lib/__init__.py +1 -0
  401. package/project-template-v2/skills/playable-verify-ui/scripts/lib/config_expr.js +218 -0
  402. package/project-template-v2/skills/playable-verify-ui/scripts/lib/node_utils.js +51 -0
  403. package/project-template-v2/skills/playable-verify-ui/scripts/lib/profile_loader.py +59 -0
  404. package/project-template-v2/skills/playable-verify-ui/scripts/lib/report.py +106 -0
  405. package/project-template-v2/skills/playable-verify-ui/scripts/lib/runtime_contract.js +116 -0
  406. package/project-template-v2/skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py +59 -0
  407. package/project-template-v2/skills/playable-verify-ui/scripts/verify_hardcoded_layout.js +64 -0
  408. package/project-template-v2/skills/playable-verify-ui/scripts/verify_runtime_contract.js +58 -0
  409. package/project-template-v2/skills/playable-verify-ui/scripts/verify_text_overlap.py +333 -0
  410. package/project-template-v2/ta-workspace/scripts/.gitkeep +0 -0
  411. package/project-template-v2/tsconfig.json +20 -0
  412. package/project-template-v2/vite.config.ts +27 -0
  413. package/project-templates/batch-locks/phaser.yaml +922 -0
  414. package/project-templates/batch-locks/threejs.yaml +978 -0
  415. package/project-templates/empty/AGENTS.md +53 -0
  416. package/project-templates/empty/gitignore +33 -0
  417. package/project-templates/phaser/.claude/skills/playcraft-audio-generation/SKILL.md +31 -4
  418. package/project-templates/phaser/.claude/skills/playcraft-image-generation/SKILL.md +36 -5
  419. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +1 -1
  420. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +1 -1
  421. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +1 -1
  422. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +1 -1
  423. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +1 -1
  424. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +1 -1
  425. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/ta-image-generation-detail.md +300 -0
  426. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +1 -1
  427. package/project-templates/phaser/.claude/skills/playcraft-image-processing/SKILL.md +50 -25
  428. package/project-templates/phaser/.claude/skills/playcraft-workspace-assets/SKILL.md +53 -0
  429. package/project-templates/phaser/.claude/skills/playcraft-workspace-assets/references/requests.json +32 -0
  430. package/project-templates/threejs/.claude/skills/playcraft-audio-generation/SKILL.md +31 -4
  431. package/project-templates/threejs/.claude/skills/playcraft-image-generation/SKILL.md +36 -5
  432. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +1 -1
  433. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +1 -1
  434. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +1 -1
  435. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +1 -1
  436. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +1 -1
  437. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +1 -1
  438. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/ta-image-generation-detail.md +300 -0
  439. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +1 -1
  440. package/project-templates/threejs/.claude/skills/playcraft-image-processing/SKILL.md +50 -25
  441. package/project-templates/threejs/.claude/skills/playcraft-workspace-assets/SKILL.md +53 -0
  442. package/project-templates/threejs/.claude/skills/playcraft-workspace-assets/references/requests.json +32 -0
  443. package/templates/preview-runtime/v1/README.md +71 -0
  444. package/templates/preview-runtime/v1/build-preview.mjs +1324 -0
  445. package/templates/preview-runtime/v1/manifest.json +17 -0
  446. package/templates/preview-runtime/v1/release-guard.mjs +87 -0
  447. package/templates/preview-runtime/v1/runtime.d.mts +3 -0
  448. package/templates/preview-runtime/v1/runtime.d.ts +3 -0
  449. package/templates/preview-runtime/v1/runtime.mjs +1121 -0
  450. package/templates/preview-runtime/v1/types/adapters.d.ts +26 -0
  451. package/templates/preview-runtime/v1/types/preview.d.ts +23 -0
  452. package/templates/preview-runtime/v1/types/protocol.d.ts +94 -0
  453. package/templates/preview-runtime/v1/types/runtime.d.ts +14 -0
@@ -0,0 +1,74 @@
1
+ import { constants } from 'node:fs';
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { lstat, mkdir, open, rename, rm, writeFile } from 'node:fs/promises';
4
+ import { dirname, join, relative } from 'node:path';
5
+ import { attachmentIdsSchema, WORKSPACE_USER_UPLOADS_DIRECTORY } from '@playcraft/common/cloud-workspace/runtime';
6
+ import { resolveWorkspaceAttachments } from './attachments.js';
7
+ import { excludeFromGit } from './dependencies.js';
8
+ async function safeParents(root, path, create = false) {
9
+ let current = root;
10
+ for (const segment of path.split('/')) {
11
+ if (!segment || segment === '.' || segment === '..')
12
+ throw new Error('workspace_worktree_attachment_unavailable');
13
+ current = join(current, segment);
14
+ if (create)
15
+ await mkdir(current, { mode: 0o755 }).catch(error => { if (error.code !== 'EEXIST')
16
+ throw error; });
17
+ const stat = await lstat(current);
18
+ if (!stat.isDirectory() || stat.isSymbolicLink())
19
+ throw new Error('workspace_worktree_attachment_unavailable');
20
+ }
21
+ }
22
+ async function readSafe(root, path, max) {
23
+ await safeParents(root, dirname(path));
24
+ const handle = await open(join(root, path), constants.O_RDONLY | constants.O_NOFOLLOW);
25
+ try {
26
+ const stat = await handle.stat();
27
+ if (!stat.isFile() || stat.nlink !== 1 || stat.size > max)
28
+ throw new Error('workspace_worktree_attachment_unavailable');
29
+ return await handle.readFile();
30
+ }
31
+ finally {
32
+ await handle.close();
33
+ }
34
+ }
35
+ async function copyExact(source, target, path, limit) {
36
+ const body = await readSafe(source, path, limit);
37
+ await safeParents(target, dirname(path), true);
38
+ const existing = await lstat(join(target, path)).catch(() => undefined);
39
+ if (existing) {
40
+ const previous = await readSafe(target, path, limit);
41
+ if (!createHash('sha256').update(previous).digest().equals(createHash('sha256').update(body).digest()))
42
+ throw new Error('workspace_worktree_attachment_conflict');
43
+ return;
44
+ }
45
+ const temporary = `${join(target, path)}.${randomUUID()}.tmp`;
46
+ try {
47
+ await writeFile(temporary, body, { flag: 'wx', mode: 0o644 });
48
+ await rename(temporary, join(target, path));
49
+ }
50
+ finally {
51
+ await rm(temporary, { force: true });
52
+ }
53
+ }
54
+ /** Copy only the selected, fully validated attachment files; retries never replace different content. */
55
+ export async function copyWorktreeAttachments(source, target, input) {
56
+ const ids = [...new Set(attachmentIdsSchema.parse(input ?? []))];
57
+ if (!ids.length)
58
+ return;
59
+ const attachments = await resolveWorkspaceAttachments(source, ids);
60
+ await excludeFromGit(target, `/${WORKSPACE_USER_UPLOADS_DIRECTORY}/`);
61
+ for (const attachment of attachments) {
62
+ const prefix = `${WORKSPACE_USER_UPLOADS_DIRECTORY}/${attachment.id}/`;
63
+ const files = attachment.files
64
+ ? attachment.files.map(file => ({ path: `${prefix}${attachment.kind === 'directory' ? `${attachment.name}/` : ''}${file.path}`, size: file.size }))
65
+ : [{ path: relative(source, attachment.path), size: attachment.size }];
66
+ for (const file of files) {
67
+ if (!file.path.startsWith(prefix) || file.path.split('/').some(segment => segment === '..' || !segment))
68
+ throw new Error('workspace_worktree_attachment_unavailable');
69
+ await copyExact(source, target, file.path, file.size);
70
+ }
71
+ await copyExact(source, target, `${WORKSPACE_USER_UPLOADS_DIRECTORY}/.metadata/${attachment.id}.json`, 1024 * 1024);
72
+ }
73
+ await resolveWorkspaceAttachments(target, ids);
74
+ }
@@ -0,0 +1,67 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { createHash } from 'node:crypto';
3
+ import { constants } from 'node:fs';
4
+ import { lstat, mkdir, open, realpath, writeFile } from 'node:fs/promises';
5
+ import { dirname, join } from 'node:path';
6
+ import { promisify } from 'node:util';
7
+ import { validateProjectSkillsSnapshot } from '@playcraft/common/project-skills';
8
+ import { readWorkspaceSkills } from './skills.js';
9
+ const execute = promisify(execFile);
10
+ async function archiveDirectory(root) {
11
+ let directory = root;
12
+ for (const segment of ['.playcraft', 'skill-artifacts']) {
13
+ directory = join(directory, segment);
14
+ await mkdir(directory, { mode: 0o755 }).catch(error => { if (error.code !== 'EEXIST')
15
+ throw error; });
16
+ const stat = await lstat(directory);
17
+ if (!stat.isDirectory() || stat.isSymbolicLink())
18
+ throw new Error('workspace_worktree_skill_archive_unavailable');
19
+ }
20
+ }
21
+ /** Clone the saved commit and its exact skill archives, without copying unsaved files or credentials. */
22
+ export async function checkoutChatWorktree(source, destination, commit, stateDir) {
23
+ const options = { timeout: 90_000, maxBuffer: 8 * 1024 * 1024,
24
+ env: { PATH: process.env.PATH, HOME: stateDir, GIT_CONFIG_GLOBAL: '/dev/null', GIT_CONFIG_NOSYSTEM: '1', GIT_TERMINAL_PROMPT: '0' } };
25
+ const git = async (root, ...args) => (await execute('git', ['-c', 'core.hooksPath=/dev/null', '-c', 'core.fsmonitor=false', '-C', root, ...args], options)).stdout;
26
+ await execute('git', ['-c', 'core.hooksPath=/dev/null', 'clone', '--local', '--no-hardlinks', '--no-checkout', '--', source, destination], options);
27
+ await git(destination, 'checkout', '--detach', commit);
28
+ const management = await lstat(join(destination, '.playcraft')).catch(() => undefined);
29
+ if (management && (!management.isDirectory() || management.isSymbolicLink()))
30
+ throw new Error('workspace_worktree_skill_archive_unavailable');
31
+ const lock = await lstat(join(destination, '.playcraft/skills.lock.json')).catch(() => undefined);
32
+ if (!lock)
33
+ return;
34
+ const snapshot = validateProjectSkillsSnapshot(await git(destination, 'show', `${commit}:.playcraft/skills.json`), await git(destination, 'show', `${commit}:.playcraft/skills.lock.json`));
35
+ const copied = new Set();
36
+ for (const entry of snapshot.lock.entries) {
37
+ const path = `.playcraft/skill-artifacts/${entry.revision.artifactHash}.tar.gz`;
38
+ if (copied.has(path))
39
+ continue;
40
+ copied.add(path);
41
+ const saved = join(destination, path);
42
+ if (await lstat(saved).catch(() => undefined))
43
+ throw new Error('workspace_worktree_skill_archive_tracked');
44
+ const original = join(source, path);
45
+ if (!await lstat(original).catch(() => undefined))
46
+ continue;
47
+ if (await realpath(dirname(original)).catch(() => '') !== join(source, '.playcraft/skill-artifacts'))
48
+ throw new Error('workspace_worktree_skill_archive_unavailable');
49
+ const handle = await open(original, constants.O_RDONLY | constants.O_NOFOLLOW);
50
+ let archive;
51
+ try {
52
+ const stat = await handle.stat();
53
+ if (!stat.isFile() || stat.nlink !== 1 || stat.size > 80 * 1024 * 1024)
54
+ throw new Error('workspace_worktree_skill_archive_unavailable');
55
+ archive = await handle.readFile();
56
+ }
57
+ finally {
58
+ await handle.close();
59
+ }
60
+ if (createHash('sha256').update(archive).digest('hex') !== entry.revision.artifactHash)
61
+ throw new Error('workspace_worktree_skill_archive_unavailable');
62
+ await archiveDirectory(destination);
63
+ await writeFile(saved, archive, { flag: 'wx', mode: 0o644 });
64
+ }
65
+ // Existing locked repository bytes and the exact runtime cache can fill missing archives.
66
+ await readWorkspaceSkills(destination, join(stateDir, 'skill-artifacts'));
67
+ }
@@ -0,0 +1,73 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ import { workspaceDirectoryNameSchema, workspaceDirectoryRegistrationSchema, workspaceWorktreeSourceSchema } from '@playcraft/common/cloud-workspace/runtime';
4
+ import { workspaceDirectoryOccupied } from './directory-maintenance.js';
5
+ import { registerWorkspaceDirectory } from './directories.js';
6
+ import { copyWorktreeAttachments } from './worktree-attachments.js';
7
+ import { revisionScope, workspaceRoot, WorkspaceContextError } from './registry.js';
8
+ import { scheduleDependencyInstall } from './dependencies.js';
9
+ const execute = promisify(execFile);
10
+ async function git(state, root, ...args) {
11
+ return (await execute('git', ['-c', 'core.hooksPath=/dev/null', '-c', 'core.fsmonitor=false', '-C', root, ...args], {
12
+ timeout: 30_000, maxBuffer: 1024 * 1024,
13
+ env: { PATH: process.env.PATH, HOME: state.config.stateDir, GIT_CONFIG_GLOBAL: '/dev/null', GIT_CONFIG_NOSYSTEM: '1', GIT_TERMINAL_PROMPT: '0', GIT_OPTIONAL_LOCKS: '0' },
14
+ })).stdout.trim();
15
+ }
16
+ function assertLease(state, leaseFence) {
17
+ if (state.config.workspaceMode !== 'multi')
18
+ throw new WorkspaceContextError('multi_workspace_unavailable');
19
+ if (state.journal.destroyed())
20
+ throw new WorkspaceContextError('runtime_destroyed');
21
+ if (!Number.isSafeInteger(leaseFence) || leaseFence < state.acceptedLeaseFence)
22
+ throw new WorkspaceContextError('stale_lease');
23
+ }
24
+ async function sourceRoot(state, workspaceId, sourceDirectoryName, branchName) {
25
+ workspaceDirectoryNameSchema.parse(sourceDirectoryName);
26
+ const binding = state.journal.getWorkspace(workspaceId);
27
+ if (!binding || binding.targetKind === 'standalone')
28
+ throw new WorkspaceContextError('workspace_not_registered');
29
+ const directory = binding.directories?.find(item => item.directoryName === sourceDirectoryName);
30
+ if (directory?.status && directory.status !== 'ready')
31
+ throw new WorkspaceContextError('workspace_not_prepared');
32
+ if (await workspaceDirectoryOccupied(state, workspaceId, sourceDirectoryName))
33
+ throw new WorkspaceContextError('directory_busy');
34
+ const root = await workspaceRoot(state, workspaceId, sourceDirectoryName);
35
+ const expected = sourceDirectoryName === 'basic' ? binding.branchName : directory?.branchName;
36
+ const current = await git(state, root, 'symbolic-ref', '--quiet', '--short', 'HEAD').catch(() => '');
37
+ if (!expected || current !== expected || (branchName !== undefined && branchName !== expected)
38
+ || await git(state, root, 'config', '--get', 'remote.origin.url').catch(() => '') !== binding.repositoryUrl)
39
+ throw new WorkspaceContextError('workspace_checkout_mismatch');
40
+ if (await git(state, root, 'status', '--porcelain', '--untracked-files=all', '--', '.playcraft/skills.json', '.playcraft/skills.lock.json'))
41
+ throw new WorkspaceContextError('workspace_worktree_skills_uncommitted');
42
+ return { root, branchName: current };
43
+ }
44
+ /** Capture the selected checkout's saved commit without changing its branch, index or files. */
45
+ export async function readWorktreeSource(state, workspaceId, sourceDirectoryName, leaseFence, branchName) {
46
+ assertLease(state, leaseFence);
47
+ return state.journal.exclusive(`directory:${workspaceId}:${sourceDirectoryName}`, async () => {
48
+ const source = await sourceRoot(state, workspaceId, sourceDirectoryName, branchName);
49
+ const sourceCommit = await git(state, source.root, 'rev-parse', '--verify', 'HEAD^{commit}');
50
+ assertLease(state, leaseFence);
51
+ return workspaceWorktreeSourceSchema.parse({ workspaceId, sourceDirectoryName, branchName: source.branchName, sourceCommit });
52
+ });
53
+ }
54
+ /** Materialize only the trusted identity and fixed commit. The regular session path binds the chat later. */
55
+ export async function registerChatWorktree(state, input, leaseFence, sourceDirectoryName, branchName, attachmentIds) {
56
+ const directory = workspaceDirectoryRegistrationSchema.parse(input);
57
+ assertLease(state, leaseFence);
58
+ if (directory.directoryName === sourceDirectoryName || directory.directoryName === 'basic' || !directory.remixId || !directory.sourceCommit)
59
+ throw new WorkspaceContextError('workspace_directory_binding_conflict');
60
+ return state.journal.exclusive(`directory:${directory.workspaceId}:${sourceDirectoryName}`, async () => {
61
+ const source = await sourceRoot(state, directory.workspaceId, sourceDirectoryName, branchName);
62
+ if (await workspaceDirectoryOccupied(state, directory.workspaceId, directory.directoryName))
63
+ throw new WorkspaceContextError('directory_busy');
64
+ await git(state, source.root, 'check-ref-format', '--branch', directory.branchName);
65
+ await git(state, source.root, 'cat-file', '-e', `${directory.sourceCommit}^{commit}`);
66
+ const result = await registerWorkspaceDirectory(state, directory, leaseFence, sourceDirectoryName, true);
67
+ const target = await workspaceRoot(state, directory.workspaceId, directory.directoryName);
68
+ await copyWorktreeAttachments(source.root, target, attachmentIds);
69
+ assertLease(state, leaseFence);
70
+ void scheduleDependencyInstall(state, revisionScope(state, directory.workspaceId, directory.directoryName), target);
71
+ return { ...result, status: 'ready' };
72
+ });
73
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcraft/cli",
3
- "version": "0.1.54",
3
+ "version": "0.1.55-beta",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "engines": {
@@ -14,16 +14,18 @@
14
14
  "dist",
15
15
  "templates",
16
16
  "project-template",
17
+ "project-template-v2",
17
18
  "engine-packs",
18
19
  "project-templates",
19
20
  "REMIX.md",
21
+ "SKILLS_REGISTRY.md",
20
22
  "README.md"
21
23
  ],
22
24
  "scripts": {
23
25
  "dev": "tsc -w",
24
- "build": "tsc",
26
+ "build": "node scripts/generate-asset-skills.mjs && node scripts/generate-video-skills.mjs && node scripts/generate-preview-runtime.mjs && tsc",
25
27
  "start": "node dist/index.js",
26
- "test": "vitest run",
28
+ "test": "pnpm build && vitest run",
27
29
  "test:agent": "node scripts/run-agent-tests.mjs --list",
28
30
  "test:agent:designer": "node scripts/run-agent-tests.mjs game-designer",
29
31
  "test:agent:developer": "node scripts/run-agent-tests.mjs developer",
@@ -35,6 +37,11 @@
35
37
  "test:agent:gate": "node scripts/run-agent-tests.mjs gate",
36
38
  "test:agent:vlm": "node scripts/run-agent-tests.mjs vlm",
37
39
  "test:agent:stop": "node scripts/run-agent-tests.mjs stop",
40
+ "generate:platform-skills": "node scripts/generate-platform-skills.mjs",
41
+ "verify:platform-skills": "node scripts/generate-platform-skills.mjs --check",
42
+ "generate:video-skills": "node scripts/generate-video-skills.mjs",
43
+ "verify:video-skills": "node scripts/generate-video-skills.mjs --check && node --test scripts/generate-video-skills.test.mjs",
44
+ "verify:asset-skills": "node scripts/generate-asset-skills.mjs --check && node --test scripts/generate-asset-skills.test.mjs",
38
45
  "verify:agent-stop": "node scripts/verify-agent-stop.mjs",
39
46
  "verify-sprite-overlay": "node scripts/verify-sprite-overlay.mjs",
40
47
  "link": "node scripts/bump-local.js && pnpm build && npm link",
@@ -45,8 +52,9 @@
45
52
  "@gltf-transform/core": "^4.3.0",
46
53
  "@gltf-transform/extensions": "^4.3.0",
47
54
  "@gltf-transform/functions": "^4.3.0",
48
- "@playcraft/build": "^0.1.54",
49
- "@playcraft/common": "^0.1.54",
55
+ "@playcraft/build": "0.1.55-beta",
56
+ "@playcraft/common": "0.1.55-beta",
57
+ "better-sqlite3-pinned": "npm:better-sqlite3@13.0.3",
50
58
  "chokidar": "^4.0.3",
51
59
  "commander": "^13.1.0",
52
60
  "cors": "^2.8.6",
@@ -62,8 +70,10 @@
62
70
  "json5": "^2.2.3",
63
71
  "latest-version": "^7.0.0",
64
72
  "music-metadata": "^11.12.3",
73
+ "node-pty": "1.0.0",
65
74
  "ora": "^8.2.0",
66
75
  "picocolors": "^1.1.1",
76
+ "playwright-core": "1.52.0",
67
77
  "sharp": "^0.34.5",
68
78
  "update-notifier": "^7.3.1",
69
79
  "ws": "^8.19.0",
@@ -79,6 +89,7 @@
79
89
  "@types/sharp": "^0.32.0",
80
90
  "@types/update-notifier": "^6.0.8",
81
91
  "@types/ws": "^8.18.1",
92
+ "esbuild": "^0.28.1",
82
93
  "typescript": "^5.9.3",
83
94
  "vitest": "^3.2.4"
84
95
  }
@@ -1,13 +1,40 @@
1
1
  ---
2
2
  name: playcraft-audio-generation
3
- description: PlayCraft AI 音频生成完整指南。涵盖 SFX 音效生成、BGM 背景音乐生成(prompt 套路、时长、风格参数)、本地音频后处理(compress/fade/loop/normalize/mix),以及完整的音频管线。Artist 和 TA 在生成音频资产前必读。
3
+ description: Use when generating or replacing playable audio, reusing library audio, managing durable audio tasks, or locally compressing, trimming, looping, normalizing, and mixing sound.
4
4
  triggers: 生成音效,生成bgm,生成背景音乐,generate sfx,generate bgm,generate audio,音频,音效,背景音乐,sfx,bgm,loop音频,音频压缩,音频处理,audio,compress audio,fade,normalize,音频后处理,音频管线
5
+ compatibility: agent,opencode
6
+ version: 1.1.1
7
+ surfaces:
8
+ - sandbox-agent
5
9
  ---
6
10
 
7
11
  # PlayCraft AI 音频生成指南
8
12
 
9
13
  ## 0. 开始前必读
10
14
 
15
+ AI (Artificial Intelligence, 人工智能) 音频包含 SFX (Sound Effects, 音效) 与 BGM (Background Music, 背景音乐)。工作素材写入当前工程的 `assets/audio/` 或当前主题素材目录;最终交付导出到工程根目录 `dist/`。请求文件和工作记录保存在 `dist/` 外。
16
+
17
+ ### 复用素材与持久化音频任务
18
+
19
+ ```bash
20
+ # 共享素材按名称、路径与标签检索;保留返回的素材编号
21
+ playcraft library search "reward" --type audio --json
22
+ playcraft library get <assetId> --json
23
+ playcraft library files <assetId> --json
24
+ playcraft library download <assetId> --output ./assets/audio/reward.mp3
25
+
26
+ # 需要任务记录和断线恢复时使用工作区任务
27
+ playcraft assets estimate --request audio-request.json
28
+ playcraft assets generate --request audio-request.json --client-request-id <stable-request-id>
29
+ playcraft assets get <taskId>
30
+ playcraft assets wait <taskId> --timeout 1800
31
+ playcraft assets download <taskId> --output ./assets/audio/generated-reward.mp3
32
+ ```
33
+
34
+ `audio-request.json` 使用 JSON (JavaScript Object Notation, 数据交换格式),例如 `{"kind":"audio","category":"sfx","description":"A short bright reward chime","duration":1}`;背景音乐改用 `category: "bgm"`,可带 `style` 与 `bpm`。持久化任务请求使用 `description`,直接生成命令使用 `--prompt`,不要混用两条入口的参数。
35
+
36
+ 任务命令自动读取 `.playcraft/workspace-context.json`;工程外需指定 `--workspace <workspaceId> --directory basic` 或实际变体目录。一次提交复用同一 `--client-request-id` 与原请求;拿到任务编号后用 `get` / `wait` 恢复。等待超时返回状态码 75,任务仍可查询。下载目标必须尚不存在;素材包使用新目录并保留相对路径。下载只保存文件,平台采纳状态仍由有效写入回执确认。任务取消、保存到素材库和恢复保存任务见当前可用的 `playcraft-workspace-assets` 技能。
37
+
11
38
  音频资产分两类,使用不同工具:
12
39
 
13
40
  | 类型 | 工具 | 是否需要后端 |
@@ -37,7 +64,7 @@ playcraft tools generate-sfx \
37
64
  | ------------ | --------------------------- | -------------------------- |
38
65
  | `--prompt` | 音效描述(**必须英文**) | 见下方 prompt 套路 |
39
66
  | `--output` | 保存路径(`.mp3` / `.wav`) | — |
40
- | `--duration` | 时长(秒) | SFX:0.3–3.0;环境音:3–10 |
67
+ | `--duration` | 时长(秒) | SFX:0.5–3.0;环境音:3–10 |
41
68
  | `--loop` | 是否循环友好 | 环境音、引擎声用 `--loop` |
42
69
 
43
70
  ### SFX Prompt 套路
@@ -80,7 +107,7 @@ const SFX_LIST = [
80
107
  {
81
108
  name: 'click',
82
109
  prompt: 'button click, game UI, soft satisfying, short',
83
- duration: 0.3,
110
+ duration: 0.5,
84
111
  },
85
112
  {
86
113
  name: 'win',
@@ -95,7 +122,7 @@ const SFX_LIST = [
95
122
  {
96
123
  name: 'jump',
97
124
  prompt: 'jump sound, platform game, light spring bounce',
98
- duration: 0.4,
125
+ duration: 0.5,
99
126
  },
100
127
  ];
101
128
 
@@ -1,13 +1,42 @@
1
1
  ---
2
2
  name: playcraft-image-generation
3
- description: PlayCraft AI (Artificial Intelligence, 人工智能) 图片生成与素材替换指南。默认使用可用的 Image 2.5;替换素材时读取参考图,全新素材可无参考文生图;验证背景要求、目标尺寸和最终文件。
3
+ description: Use when generating or replacing playable images, reusing shared visual assets, or managing durable image tasks. AI (Artificial Intelligence, 人工智能) 图片生成与替换指南,保持参考图、背景要求、目标尺寸和交付文件一致。
4
4
  triggers: 生成图片,generate image,选模型,model selection,reference image,参考图,风格一致,图生图,文生图,AI生图,图片质量,模型选择,500错误,模型失败,generate-image,list-image-models,ta-workspace,batch,批量,脚本,nodejs,edit模型,变体,绿幕,去背景,透明PNG,prompt,提示词,prompt套路,提示词技巧
5
+ compatibility: agent,opencode
6
+ version: 1.1.2
7
+ surfaces:
8
+ - sandbox-agent
5
9
  ---
6
10
 
7
11
  # PlayCraft AI 图片生成指南
8
12
 
9
13
  ## 0. 开始前必读
10
14
 
15
+ 工作素材和脚本保存在当前工程,素材通常写 `assets/` 或当前主题目录;最终交付导出到工程根目录 `dist/`。云工作区的素材检索和持久化任务使用下列入口;任务请求文件和回执保存在 `dist/` 外。
16
+
17
+ ### 素材复用与可恢复生成
18
+
19
+ ```bash
20
+ # 需要复用已有图片时,按名称、路径和标签查找共享素材
21
+ playcraft library search "角色" --type texture --json
22
+ playcraft library get <assetId> --json
23
+ playcraft library files <assetId> --json
24
+ playcraft library download <assetId> --output ./assets/library-character
25
+
26
+ # 需要持久任务、精灵图或帧动画时,提交工作区任务
27
+ playcraft assets estimate --request image-request.json
28
+ playcraft assets generate --request image-request.json --client-request-id <stable-request-id>
29
+ playcraft assets get <taskId>
30
+ playcraft assets wait <taskId> --timeout 1800
31
+ playcraft assets download <taskId> --output ./assets/generated-character
32
+ ```
33
+
34
+ `image-request.json` 使用 JSON (JavaScript Object Notation, 数据交换格式),例如 `{"kind":"image","prompt":"A cheerful game character","removeBackground":true}`。请求中的透明背景开关由下文交付约束决定;素材替换需要读取字段参考图和规格时,继续使用下文的 `tools image-context` 与 `tools generate-image`。这两条入口没有可互换的参数表。
35
+
36
+ 任务命令从 `.playcraft/workspace-context.json` 推断当前工作区和工程目录;在工程外运行时传 `--workspace <workspaceId> --directory basic`,或实际变体目录。提交结果不确定时复用同一个 `--client-request-id` 与原请求;已有任务编号后通过 `get` / `wait` 恢复。等待超时以状态码 75 退出,任务仍可查询。精灵图和动画必须下载完整包并保留相对路径;`download` 保存文件不代表平台已确认采纳。
37
+
38
+ 普通单图生成和替换使用本技能下方的直接工具与命令;素材库检索、生成任务保存到素材库、动画草稿及版本的详细流程见当前可用的 `playcraft-workspace-assets` 技能。下载目标必须尚不存在。
39
+
11
40
  替换现有素材时先读取目标字段的 schema 配置(resolution、ratio、prompt、remove_background、reference_image)及当前素材。全新素材按用户需求确定尺寸、格式和输出路径,不假定所有素材都是透明 PNG (Portable Network Graphics, 便携式网络图形)。
12
41
 
13
42
  项目没有素材 schema 时,从目标素材的尺寸、格式和用户需求确定交付规格;参考图只提供内容和风格,不改变目标画布。不要套用其他游戏的字段、路径或尺寸。
@@ -214,7 +243,7 @@ Artist 生成 MC 时**不得**套用上方通用决策树里的 gemini / flux /
214
243
  | `mulerouter/gpt-image-2` | `gemini-*`、`flux-*`、`hy-image-*`、`wan*`、`qwen*` |
215
244
  | `mulerouter/nano-banana-2` | 裸 `gpt-image-2`(会走 iegg-litellm 压扁五格) |
216
245
 
217
- 完整 prompt / 尺寸规范见 **`playcraft-storyboard`** skill。ASR 双板 `--image-model` 须与已选 MC **完全一致**。
246
+ 故事板的提示词与尺寸依据本节规格和当前工程的制作要求。ASR 双板 `--image-model` 须与已选 MC **完全一致**。
218
247
 
219
248
  **Phase 1(概念图)**:纯文生图,`--image-size 4K` + MC 白名单内模型。
220
249
  **Phase 2(批量生产)**:必须带 `--reference-image` 指向 Phase 1 确认的概念图,同一批次使用**相同模型 + 相同 reference image + 相同 image-size**。
@@ -325,13 +354,13 @@ playcraft image overlay \
325
354
  # 目视检查:无白边、无色幕残留色、无黑色不透明块、边缘干净
326
355
  ```
327
356
 
328
- **不通过时的修复**:见 `ta-pipeline-cookbook.md` Step 0e §3 及 Compliance Gate 失败修复表。
357
+ **不通过时的修复**:检查实际模型、源图背景和去背参数,保留原始图与失败回执;按下方进阶参考的错误恢复策略处理。透明验收仍失败时报告具体阶段并停止,不交付未通过的文件。
329
358
 
330
359
  ---
331
360
 
332
361
  ## 3.1 ASR 专用分支(Artist · ring 3 build)
333
362
 
334
- > **Read `playcraft-asset-state-sheet` Skill first.** ASR 是制作期参考板,不是 runtime 透明资产。
363
+ > 先核对当前工程素材状态表中的槽位、状态和交付尺寸。ASR 是制作期参考板,不是 runtime 透明资产。
335
364
 
336
365
  | 阶段 | Artist | TA |
337
366
  | ----------------- | ------------------------------------- | ----------------------------- |
@@ -354,11 +383,13 @@ playcraft image overlay \
354
383
  - **<=5 个文件** → 直接使用 CLI 命令
355
384
  - **>5 个文件** → 编写 Node.js 脚本放入 `ta-workspace/scripts/`。脚本模板见 `reference/` 目录;使用本次选定的模型与参考图,不直接沿用脚本中旧的默认模型。
356
385
 
386
+ 复制模板时,`SKILL_DIR` 表示本次实际加载的 `SKILL.md` 所在目录,由技能加载回执确定。将示例中的该变量设为真实目录后再运行;项目安装与冻结安装的目录可能不同。
387
+
357
388
  ---
358
389
 
359
390
  ## 5. 进阶参考
360
391
 
361
- 需要以下进阶内容时,查阅 [`refs/ta-image-generation-detail.md`](../../agents/refs/ta-image-generation-detail.md):
392
+ 需要以下进阶内容时,查阅 [`reference/ta-image-generation-detail.md`](reference/ta-image-generation-detail.md):
362
393
 
363
394
  | 主题 | 说明 |
364
395
  | --------------------- | ---------------------------------------------------------------- |
@@ -3,7 +3,7 @@
3
3
  // 用途:将处理好的图片目录合并为精灵图(PNG + JSON 元数据)
4
4
  //
5
5
  // 使用方式:
6
- // 1. cp .claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs ta-workspace/scripts/build-<name>-atlas.mjs
6
+ // 1. cp "$SKILL_DIR/reference/build-sprite-sheet.template.mjs" ta-workspace/scripts/build-<name>-atlas.mjs
7
7
  // 2. 修改下方 CONFIG 区域
8
8
  // 3. 如需控制帧顺序,填写 ORDERED_NAMES 数组(留空则按文件名排序)
9
9
  // 4. node ta-workspace/scripts/build-<name>-atlas.mjs
@@ -5,7 +5,7 @@
5
5
  * 用途:TA Micro-Batch Validation 辅助工具,对 AI 补全素材与 Artist 样本做客观色彩比较。
6
6
  *
7
7
  * 使用方法:
8
- * cp .claude/skills/playcraft-image-generation/reference/compare-style.template.mjs \
8
+ * cp "$SKILL_DIR/reference/compare-style.template.mjs" \
9
9
  * ta-workspace/scripts/compare-style.mjs
10
10
  * # 修改下方 CONFIG 区域后运行:
11
11
  * node ta-workspace/scripts/compare-style.mjs
@@ -10,7 +10,7 @@
10
10
  // - 数字/字母贴图:一批 ≤16 个
11
11
  //
12
12
  // 使用方式:
13
- // 1. cp .claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs ta-workspace/scripts/gen-<name>-sprite.mjs
13
+ // 1. cp "$SKILL_DIR/reference/gen-batch-sprite.template.mjs" ta-workspace/scripts/gen-<name>-sprite.mjs
14
14
  // 2. 修改下方 CONFIG 和 BATCHES 区域
15
15
  // 3. node ta-workspace/scripts/gen-<name>-sprite.mjs
16
16
  // ============================================================
@@ -3,7 +3,7 @@
3
3
  // 用途:从零批量生成一组风格一致的素材(reference-image 模式)
4
4
  //
5
5
  // 使用方式:
6
- // 1. cp .claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs ta-workspace/scripts/gen-<name>.mjs
6
+ // 1. cp "$SKILL_DIR/reference/gen-batch.template.mjs" ta-workspace/scripts/gen-<name>.mjs
7
7
  // 2. 修改下方 CONFIG 和 ITEMS 区域
8
8
  // 3. node ta-workspace/scripts/gen-<name>.mjs
9
9
  // ============================================================
@@ -8,7 +8,7 @@
8
8
  // - 图标集(换内容符号)
9
9
  //
10
10
  // 使用方式:
11
- // 1. cp .claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs ta-workspace/scripts/gen-<name>-variants.mjs
11
+ // 1. cp "$SKILL_DIR/reference/gen-edit-variants.template.mjs" ta-workspace/scripts/gen-<name>-variants.mjs
12
12
  // 2. Phase 1:先手动生成基图(见下方说明),存为 CONFIG.baseImage 路径
13
13
  // 3. 填写 CONFIG 和 VARIANTS,然后 node ta-workspace/scripts/gen-<name>-variants.mjs
14
14
  //
@@ -3,7 +3,7 @@
3
3
  // 用途:对一批图片执行去背景 / trim + resize + 验证
4
4
  //
5
5
  // 使用方式:
6
- // 1. cp .claude/skills/playcraft-image-generation/reference/process-batch.template.mjs ta-workspace/scripts/process-<name>.mjs
6
+ // 1. cp "$SKILL_DIR/reference/process-batch.template.mjs" ta-workspace/scripts/process-<name>.mjs
7
7
  // 2. 修改下方 CONFIG 区域(特别是 SKIP_REMOVE_BG 选项)
8
8
  // 3. node ta-workspace/scripts/process-<name>.mjs
9
9
  //