@playcraft/cli 0.1.53-beta → 0.1.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (400) hide show
  1. package/README.md +3 -62
  2. package/dist/agent/local-backend.js +1 -1
  3. package/dist/cli-root-help.js +0 -2
  4. package/dist/commands/build-all.js +19 -5
  5. package/dist/commands/build.js +28 -15
  6. package/dist/commands/create.js +33 -26
  7. package/dist/commands/login.js +42 -84
  8. package/dist/commands/skills.js +0 -4
  9. package/dist/commands/tools-3d.js +0 -11
  10. package/dist/commands/tools-generation.js +0 -6
  11. package/dist/commands/tools.js +0 -2
  12. package/dist/config.js +4 -59
  13. package/dist/index.js +3 -42
  14. package/dist/remix/clone.js +0 -2
  15. package/dist/remix/init-template.js +0 -2
  16. package/dist/remix/pull.js +0 -2
  17. package/dist/remix/push.js +1 -21
  18. package/dist/utils/agent-api-client.js +30 -210
  19. package/dist/utils/playcraft-http-client.js +4 -6
  20. package/package.json +5 -15
  21. package/SKILLS_REGISTRY.md +0 -149
  22. package/dist/auth/account-activation.js +0 -157
  23. package/dist/auth/messages.js +0 -30
  24. package/dist/commands/build-temp.js +0 -26
  25. package/dist/commands/platform-skills.generated.js +0 -19
  26. package/dist/commands/playable.js +0 -53
  27. package/dist/commands/preview-runtime.js +0 -21
  28. package/dist/commands/tools-batch.js +0 -113
  29. package/dist/commands/video.js +0 -122
  30. package/dist/commands/workspace-runtime.js +0 -54
  31. package/dist/commands/workspace.js +0 -40
  32. package/dist/preview-runtime/distribution.js +0 -77
  33. package/dist/project-skills/builtin-import.js +0 -225
  34. package/dist/project-skills/commands.js +0 -77
  35. package/dist/project-skills/lifecycle.js +0 -28
  36. package/dist/project-skills/local-run.js +0 -112
  37. package/dist/project-skills/local-store.js +0 -221
  38. package/dist/project-skills/messages.js +0 -80
  39. package/dist/project-skills/reconcile.js +0 -62
  40. package/dist/project-skills/remote-cache.js +0 -51
  41. package/dist/project-skills/validation.js +0 -19
  42. package/dist/recording/messages.js +0 -40
  43. package/dist/recording/project-digest.js +0 -85
  44. package/dist/recording/recorder.js +0 -293
  45. package/dist/recording/scenario.js +0 -50
  46. package/dist/skill-registry/client.js +0 -345
  47. package/dist/skill-registry/commands.js +0 -180
  48. package/dist/skill-registry/evaluation-client.js +0 -156
  49. package/dist/skill-registry/evaluation-commands.js +0 -174
  50. package/dist/skill-registry/messages.js +0 -177
  51. package/dist/skill-registry/package.js +0 -275
  52. package/dist/skill-registry/platform-package.js +0 -100
  53. package/dist/utils/environment-endpoints.js +0 -17
  54. package/dist/utils/error-diagnostics.js +0 -20
  55. package/dist/utils/tool-operation-journal.js +0 -124
  56. package/dist/utils/video-evidence-git.js +0 -81
  57. package/dist/video-replication/client.js +0 -234
  58. package/dist/video-replication/comparison-evidence.js +0 -149
  59. package/dist/video-replication/comparison-files.js +0 -57
  60. package/dist/video-replication/comparison-log.js +0 -72
  61. package/dist/video-replication/comparison-messages.js +0 -104
  62. package/dist/video-replication/comparison-output.js +0 -63
  63. package/dist/video-replication/comparison-preflight.js +0 -66
  64. package/dist/video-replication/comparison.js +0 -230
  65. package/dist/video-replication/diagnostics.js +0 -41
  66. package/dist/video-replication/evidence.js +0 -165
  67. package/dist/video-replication/media.js +0 -112
  68. package/dist/video-replication/messages.js +0 -97
  69. package/dist/workspace/messages.js +0 -67
  70. package/dist/workspace/transfer-client.js +0 -237
  71. package/dist/workspace/transfer-errors.js +0 -48
  72. package/dist/workspace-runtime/batch/content-changes.js +0 -30
  73. package/dist/workspace-runtime/batch/control.js +0 -86
  74. package/dist/workspace-runtime/batch/deliver.js +0 -173
  75. package/dist/workspace-runtime/batch/freeze.js +0 -101
  76. package/dist/workspace-runtime/batch/generate.js +0 -249
  77. package/dist/workspace-runtime/batch/git.js +0 -40
  78. package/dist/workspace-runtime/batch/occupancy.js +0 -8
  79. package/dist/workspace-runtime/batch/policy.js +0 -70
  80. package/dist/workspace-runtime/batch/prepare.js +0 -317
  81. package/dist/workspace-runtime/batch/processes.js +0 -72
  82. package/dist/workspace-runtime/batch/records.js +0 -113
  83. package/dist/workspace-runtime/batch/routes.js +0 -61
  84. package/dist/workspace-runtime/batch/source-candidate.js +0 -86
  85. package/dist/workspace-runtime/batch/source-capture.js +0 -146
  86. package/dist/workspace-runtime/batch/source-failure.js +0 -43
  87. package/dist/workspace-runtime/batch/source-publish.js +0 -130
  88. package/dist/workspace-runtime/codex/app-server.js +0 -1065
  89. package/dist/workspace-runtime/codex/compact.js +0 -46
  90. package/dist/workspace-runtime/codex/config-toml.js +0 -107
  91. package/dist/workspace-runtime/codex/delivery-tools.js +0 -144
  92. package/dist/workspace-runtime/codex/jsonrpc-stdio.js +0 -145
  93. package/dist/workspace-runtime/codex/launcher-client.js +0 -177
  94. package/dist/workspace-runtime/codex/loopback.js +0 -146
  95. package/dist/workspace-runtime/codex/mcp-config.js +0 -39
  96. package/dist/workspace-runtime/codex/model-broker.js +0 -263
  97. package/dist/workspace-runtime/codex/native-adapter.js +0 -9
  98. package/dist/workspace-runtime/codex/permissions.js +0 -79
  99. package/dist/workspace-runtime/codex/thread-image.js +0 -38
  100. package/dist/workspace-runtime/codex/tool-response.js +0 -10
  101. package/dist/workspace-runtime/codex/ui-instructions.js +0 -4
  102. package/dist/workspace-runtime/codex/ui-tools.js +0 -203
  103. package/dist/workspace-runtime/codex/work-mode.js +0 -15
  104. package/dist/workspace-runtime/main.js +0 -10
  105. package/dist/workspace-runtime/persistence/journal.js +0 -365
  106. package/dist/workspace-runtime/persistence/native-subagents.js +0 -162
  107. package/dist/workspace-runtime/persistence/sqlite-client.js +0 -77
  108. package/dist/workspace-runtime/persistence/sqlite-worker.js +0 -1161
  109. package/dist/workspace-runtime/persistence/stopped-execution.js +0 -77
  110. package/dist/workspace-runtime/previews/diagnostics.js +0 -44
  111. package/dist/workspace-runtime/previews/output.js +0 -36
  112. package/dist/workspace-runtime/previews/publish.js +0 -283
  113. package/dist/workspace-runtime/previews/runtime-preview.js +0 -251
  114. package/dist/workspace-runtime/previews/single-file.js +0 -43
  115. package/dist/workspace-runtime/processes/managed-writes.js +0 -69
  116. package/dist/workspace-runtime/serve.js +0 -441
  117. package/dist/workspace-runtime/server/accept-operation.js +0 -61
  118. package/dist/workspace-runtime/server/asset-transfers.js +0 -63
  119. package/dist/workspace-runtime/server/auth.js +0 -21
  120. package/dist/workspace-runtime/server/connectivity.js +0 -211
  121. package/dist/workspace-runtime/server/desktop-host.js +0 -429
  122. package/dist/workspace-runtime/server/desktop-preview-config.js +0 -81
  123. package/dist/workspace-runtime/server/desktop-preview-service.js +0 -157
  124. package/dist/workspace-runtime/server/desktop-preview-static.js +0 -53
  125. package/dist/workspace-runtime/server/desktop-preview.js +0 -189
  126. package/dist/workspace-runtime/server/dispatch.js +0 -1655
  127. package/dist/workspace-runtime/server/endpoints.js +0 -21
  128. package/dist/workspace-runtime/server/execution-group.js +0 -90
  129. package/dist/workspace-runtime/server/http.js +0 -1339
  130. package/dist/workspace-runtime/server/lock.js +0 -53
  131. package/dist/workspace-runtime/server/operation-record.js +0 -33
  132. package/dist/workspace-runtime/server/rfb-watch-gate.js +0 -168
  133. package/dist/workspace-runtime/server/session-restore.js +0 -84
  134. package/dist/workspace-runtime/server/source-uploader.js +0 -138
  135. package/dist/workspace-runtime/server/submit-operation.js +0 -41
  136. package/dist/workspace-runtime/server/terminal-host.js +0 -366
  137. package/dist/workspace-runtime/server/types.js +0 -1
  138. package/dist/workspace-runtime/server/workspace-transfer.js +0 -168
  139. package/dist/workspace-runtime/verify-artifact.js +0 -59
  140. package/dist/workspace-runtime/workspaces/append-only-log.js +0 -62
  141. package/dist/workspace-runtime/workspaces/archive.js +0 -207
  142. package/dist/workspace-runtime/workspaces/artifact-events.js +0 -55
  143. package/dist/workspace-runtime/workspaces/artifact-files.js +0 -199
  144. package/dist/workspace-runtime/workspaces/artifact-receipts.js +0 -89
  145. package/dist/workspace-runtime/workspaces/artifacts.js +0 -282
  146. package/dist/workspace-runtime/workspaces/asset-library-import.js +0 -387
  147. package/dist/workspace-runtime/workspaces/asset-publication-access.js +0 -25
  148. package/dist/workspace-runtime/workspaces/asset-transfer-dependencies.js +0 -81
  149. package/dist/workspace-runtime/workspaces/asset-transfer-publish.js +0 -438
  150. package/dist/workspace-runtime/workspaces/asset-transfer-storage.js +0 -389
  151. package/dist/workspace-runtime/workspaces/attachment-content.js +0 -73
  152. package/dist/workspace-runtime/workspaces/attachments.js +0 -185
  153. package/dist/workspace-runtime/workspaces/batch-commit.js +0 -142
  154. package/dist/workspace-runtime/workspaces/binary-content.js +0 -65
  155. package/dist/workspace-runtime/workspaces/binary-write.js +0 -117
  156. package/dist/workspace-runtime/workspaces/cli-context.js +0 -23
  157. package/dist/workspace-runtime/workspaces/cli-credentials.js +0 -115
  158. package/dist/workspace-runtime/workspaces/composer-context.js +0 -147
  159. package/dist/workspace-runtime/workspaces/context-error.js +0 -2
  160. package/dist/workspace-runtime/workspaces/delivery-build.js +0 -331
  161. package/dist/workspace-runtime/workspaces/delivery-store.js +0 -168
  162. package/dist/workspace-runtime/workspaces/delivery.js +0 -64
  163. package/dist/workspace-runtime/workspaces/dependencies.js +0 -279
  164. package/dist/workspace-runtime/workspaces/developer-command.js +0 -98
  165. package/dist/workspace-runtime/workspaces/directories.js +0 -132
  166. package/dist/workspace-runtime/workspaces/directory-access.js +0 -37
  167. package/dist/workspace-runtime/workspaces/directory-attachments.js +0 -245
  168. package/dist/workspace-runtime/workspaces/directory-create.js +0 -57
  169. package/dist/workspace-runtime/workspaces/directory-maintenance.js +0 -111
  170. package/dist/workspace-runtime/workspaces/directory-mutations.js +0 -238
  171. package/dist/workspace-runtime/workspaces/directory-revisions.js +0 -56
  172. package/dist/workspace-runtime/workspaces/directory-stats.js +0 -49
  173. package/dist/workspace-runtime/workspaces/disk-snapshot.js +0 -31
  174. package/dist/workspace-runtime/workspaces/empty-template.js +0 -42
  175. package/dist/workspace-runtime/workspaces/file-content.js +0 -48
  176. package/dist/workspace-runtime/workspaces/files-search.js +0 -116
  177. package/dist/workspace-runtime/workspaces/files.js +0 -150
  178. package/dist/workspace-runtime/workspaces/git-credential-broker.js +0 -312
  179. package/dist/workspace-runtime/workspaces/git-credential-helper.js +0 -68
  180. package/dist/workspace-runtime/workspaces/git-direct-store.js +0 -155
  181. package/dist/workspace-runtime/workspaces/git.js +0 -670
  182. package/dist/workspace-runtime/workspaces/instructions.js +0 -56
  183. package/dist/workspace-runtime/workspaces/json5-edit.js +0 -313
  184. package/dist/workspace-runtime/workspaces/library-attachments.js +0 -268
  185. package/dist/workspace-runtime/workspaces/operation-log.js +0 -23
  186. package/dist/workspace-runtime/workspaces/optional-platform-skills.js +0 -14
  187. package/dist/workspace-runtime/workspaces/parameter-agent-inputs.js +0 -97
  188. package/dist/workspace-runtime/workspaces/parameter-agent-protocol.js +0 -40
  189. package/dist/workspace-runtime/workspaces/parameter-agent-store.js +0 -58
  190. package/dist/workspace-runtime/workspaces/parameter-agent.js +0 -284
  191. package/dist/workspace-runtime/workspaces/parameter-assets.js +0 -189
  192. package/dist/workspace-runtime/workspaces/parameters.js +0 -329
  193. package/dist/workspace-runtime/workspaces/prepare.js +0 -278
  194. package/dist/workspace-runtime/workspaces/registry.js +0 -251
  195. package/dist/workspace-runtime/workspaces/remix-references.js +0 -301
  196. package/dist/workspace-runtime/workspaces/revisions.js +0 -31
  197. package/dist/workspace-runtime/workspaces/session-image.js +0 -104
  198. package/dist/workspace-runtime/workspaces/shared-git.js +0 -40
  199. package/dist/workspace-runtime/workspaces/skill-artifact-loader.js +0 -95
  200. package/dist/workspace-runtime/workspaces/skills.js +0 -191
  201. package/dist/workspace-runtime/workspaces/theme-asset-index.js +0 -157
  202. package/dist/workspace-runtime/workspaces/transfer-quota.js +0 -69
  203. package/dist/workspace-runtime/workspaces/transfer.js +0 -471
  204. package/dist/workspace-runtime/workspaces/turn-changes.js +0 -75
  205. package/dist/workspace-runtime/workspaces/video-attachments.js +0 -49
  206. package/project-template/.claude/skills/playcraft-replica-validation/SKILL.md +0 -25
  207. package/project-template/.claude/skills/playcraft-replica-validation/references/contracts.md +0 -79
  208. package/project-template/.claude/skills/playcraft-video-understanding/SKILL.md +0 -29
  209. package/project-template/.claude/skills/playcraft-video-understanding/references/contracts.md +0 -37
  210. package/project-template-v2/.claude/agents/artist.md +0 -82
  211. package/project-template-v2/.claude/agents/developer.md +0 -153
  212. package/project-template-v2/.claude/agents/game-designer.md +0 -264
  213. package/project-template-v2/.claude/agents/refs/artist-art-style-catalog.md +0 -533
  214. package/project-template-v2/.claude/agents/refs/artist-color-audio-recipes.md +0 -153
  215. package/project-template-v2/.claude/agents/refs/artist-dimension-axis.md +0 -27
  216. package/project-template-v2/.claude/agents/refs/artist-master-composite-recipes.md +0 -208
  217. package/project-template-v2/.claude/agents/refs/atom-skill-library.md +0 -81
  218. package/project-template-v2/.claude/agents/refs/developer-impl-cookbook.md +0 -432
  219. package/project-template-v2/.claude/agents/refs/framework-5-component-filter.md +0 -252
  220. package/project-template-v2/.claude/agents/refs/framework-game-feel-juice.md +0 -266
  221. package/project-template-v2/.claude/agents/refs/framework-mda.md +0 -147
  222. package/project-template-v2/.claude/agents/refs/game-designer-gameplay-sufficiency.md +0 -123
  223. package/project-template-v2/.claude/agents/refs/ta-3d-flip-recipe.md +0 -88
  224. package/project-template-v2/.claude/agents/refs/ta-atlas-deliverable-standard.md +0 -67
  225. package/project-template-v2/.claude/agents/refs/ta-batch-pipeline-recipes.md +0 -120
  226. package/project-template-v2/.claude/agents/refs/ta-image-generation-detail.md +0 -300
  227. package/project-template-v2/.claude/agents/refs/ta-image-ops-reference.md +0 -495
  228. package/project-template-v2/.claude/agents/refs/ta-pipeline-cookbook.md +0 -1141
  229. package/project-template-v2/.claude/agents/refs/ta-tools-reference.md +0 -111
  230. package/project-template-v2/.claude/agents/refs/ta-vfx-preset-catalog.md +0 -365
  231. package/project-template-v2/.claude/agents/refs/threejs-cannon-pitfalls.md +0 -412
  232. package/project-template-v2/.claude/agents/reviewer.md +0 -75
  233. package/project-template-v2/.claude/agents/technical-artist.md +0 -86
  234. package/project-template-v2/.claude/hooks/snapshot-milestone.mjs +0 -243
  235. package/project-template-v2/.claude/hooks/user-prompt.mjs +0 -133
  236. package/project-template-v2/.claude/settings.json +0 -33
  237. package/project-template-v2/.claude/skills/brainstorming/SKILL.md +0 -161
  238. package/project-template-v2/.claude/skills/brainstorming/scripts/frame-template.html +0 -270
  239. package/project-template-v2/.claude/skills/brainstorming/scripts/helper.js +0 -177
  240. package/project-template-v2/.claude/skills/brainstorming/scripts/server.cjs +0 -354
  241. package/project-template-v2/.claude/skills/brainstorming/scripts/start-server.sh +0 -148
  242. package/project-template-v2/.claude/skills/brainstorming/scripts/stop-server.sh +0 -56
  243. package/project-template-v2/.claude/skills/brainstorming/scripts/wait-for-selection.sh +0 -62
  244. package/project-template-v2/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
  245. package/project-template-v2/.claude/skills/brainstorming/visual-companion.md +0 -309
  246. package/project-template-v2/.claude/skills/playcraft-ad-psychology/SKILL.md +0 -182
  247. package/project-template-v2/.claude/skills/playcraft-art-style-guide/SKILL.md +0 -123
  248. package/project-template-v2/.claude/skills/playcraft-asset-state-sheet/SKILL.md +0 -205
  249. package/project-template-v2/.claude/skills/playcraft-audio-generation/SKILL.md +0 -280
  250. package/project-template-v2/.claude/skills/playcraft-batch-pipeline/SKILL.md +0 -184
  251. package/project-template-v2/.claude/skills/playcraft-build-optimizer/SKILL.md +0 -306
  252. package/project-template-v2/.claude/skills/playcraft-image-generation/SKILL.md +0 -370
  253. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +0 -123
  254. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +0 -254
  255. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +0 -333
  256. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +0 -95
  257. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +0 -118
  258. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +0 -136
  259. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +0 -397
  260. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +0 -296
  261. package/project-template-v2/.claude/skills/playcraft-image-ops/SKILL.md +0 -122
  262. package/project-template-v2/.claude/skills/playcraft-image-processing/SKILL.md +0 -219
  263. package/project-template-v2/.claude/skills/playcraft-masking/SKILL.md +0 -373
  264. package/project-template-v2/.claude/skills/playcraft-playable-optimization/SKILL.md +0 -161
  265. package/project-template-v2/.claude/skills/playcraft-research/SKILL.md +0 -215
  266. package/project-template-v2/.claude/skills/playcraft-skill-recommender/SKILL.md +0 -382
  267. package/project-template-v2/.claude/skills/playcraft-sprite-generation/SKILL.md +0 -423
  268. package/project-template-v2/.claude/skills/playcraft-sprite-remix/SKILL.md +0 -158
  269. package/project-template-v2/.claude/skills/playcraft-sprite-sheet/SKILL.md +0 -100
  270. package/project-template-v2/.claude/skills/playcraft-storyboard/SKILL.md +0 -167
  271. package/project-template-v2/.claude/skills/playcraft-style-qa/SKILL.md +0 -270
  272. package/project-template-v2/.claude/skills/playcraft-text-rendering/SKILL.md +0 -236
  273. package/project-template-v2/.claude/skills/playcraft-vfx-animation/SKILL.md +0 -130
  274. package/project-template-v2/.claude/skills/playwright-cli/SKILL.md +0 -390
  275. package/project-template-v2/.claude/skills/playwright-cli/references/element-attributes.md +0 -23
  276. package/project-template-v2/.claude/skills/playwright-cli/references/playwright-tests.md +0 -39
  277. package/project-template-v2/.claude/skills/playwright-cli/references/request-mocking.md +0 -87
  278. package/project-template-v2/.claude/skills/playwright-cli/references/running-code.md +0 -240
  279. package/project-template-v2/.claude/skills/playwright-cli/references/session-management.md +0 -226
  280. package/project-template-v2/.claude/skills/playwright-cli/references/spec-driven-testing.md +0 -308
  281. package/project-template-v2/.claude/skills/playwright-cli/references/storage-state.md +0 -275
  282. package/project-template-v2/.claude/skills/playwright-cli/references/test-generation.md +0 -134
  283. package/project-template-v2/.claude/skills/playwright-cli/references/tracing.md +0 -142
  284. package/project-template-v2/.claude/skills/playwright-cli/references/video-recording.md +0 -153
  285. package/project-template-v2/.claude/skills/session-analyzer/SKILL.md +0 -386
  286. package/project-template-v2/.claude/skills/session-analyzer/scripts/execution-breakdown.mjs +0 -182
  287. package/project-template-v2/.claude/skills/session-analyzer/scripts/find-turns.mjs +0 -72
  288. package/project-template-v2/.claude/skills/session-analyzer/scripts/heavy-output.mjs +0 -121
  289. package/project-template-v2/.claude/skills/session-analyzer/scripts/resolve-session.mjs +0 -102
  290. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-stats.mjs +0 -127
  291. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-tool-timeline.mjs +0 -106
  292. package/project-template-v2/.claude/skills/session-analyzer/scripts/time-gaps.mjs +0 -128
  293. package/project-template-v2/.claude/skills/session-analyzer/scripts/turn-timeline.mjs +0 -67
  294. package/project-template-v2/.claude/snapshot.mjs +0 -263
  295. package/project-template-v2/.playcraft/skills.lock.json +0 -152
  296. package/project-template-v2/CLAUDE.md +0 -146
  297. package/project-template-v2/assets/audio/bgm/.gitkeep +0 -0
  298. package/project-template-v2/assets/audio/sfx/.gitkeep +0 -0
  299. package/project-template-v2/assets/bundles/.gitkeep +0 -0
  300. package/project-template-v2/assets/images/bg/.gitkeep +0 -0
  301. package/project-template-v2/assets/images/reference/.gitkeep +0 -0
  302. package/project-template-v2/assets/images/storyboard/.gitkeep +0 -0
  303. package/project-template-v2/assets/images/tiles/.gitkeep +0 -0
  304. package/project-template-v2/assets/images/ui/.gitkeep +0 -0
  305. package/project-template-v2/assets/images/vfx/.gitkeep +0 -0
  306. package/project-template-v2/assets/models/.gitkeep +0 -0
  307. package/project-template-v2/docs/harness/iteration-1/context-flow.md +0 -254
  308. package/project-template-v2/docs/harness/iteration-1/generate-flow.md +0 -91
  309. package/project-template-v2/docs/harness/iteration-1/ideate-flow.md +0 -214
  310. package/project-template-v2/docs/harness/iteration-1/optimize-flow.md +0 -75
  311. package/project-template-v2/docs/harness/iteration-1/wrapup-flow.md +0 -63
  312. package/project-template-v2/docs/harness/iteration-2/context-flow.md +0 -223
  313. package/project-template-v2/docs/harness/iteration-2/generate-flow.md +0 -129
  314. package/project-template-v2/docs/harness/iteration-2/ideate-flow.md +0 -267
  315. package/project-template-v2/docs/harness/iteration-2/optimize-flow.md +0 -164
  316. package/project-template-v2/docs/harness/iteration-2/wrapup-flow.md +0 -115
  317. package/project-template-v2/docs/harness/orchestrator-flow.md +0 -364
  318. package/project-template-v2/docs/project-state.json +0 -60
  319. package/project-template-v2/docs/project-state.md +0 -72
  320. package/project-template-v2/docs/standards/README.md +0 -225
  321. package/project-template-v2/docs/standards/agent-behavior-standards.md +0 -174
  322. package/project-template-v2/docs/standards/artifacts/design-brief.md +0 -19
  323. package/project-template-v2/docs/standards/artifacts/design.md +0 -22
  324. package/project-template-v2/docs/standards/artifacts/game-code.md +0 -41
  325. package/project-template-v2/docs/standards/artifacts/todo-list.md +0 -41
  326. package/project-template-v2/docs/standards/iter1-agent-behavior-standards.md +0 -343
  327. package/project-template-v2/game/index.ts +0 -18
  328. package/project-template-v2/globals.d.ts +0 -51
  329. package/project-template-v2/index.css +0 -34
  330. package/project-template-v2/index.html +0 -18
  331. package/project-template-v2/main.ts +0 -9
  332. package/project-template-v2/package.json +0 -46
  333. package/project-template-v2/skills/_shared/scripts/dispatch-clear.mjs +0 -31
  334. package/project-template-v2/skills/_shared/scripts/dispatch-set.mjs +0 -86
  335. package/project-template-v2/skills/_shared/scripts/dod-check.mjs +0 -153
  336. package/project-template-v2/skills/_shared/scripts/handoff-append.mjs +0 -70
  337. package/project-template-v2/skills/_shared/scripts/lib/validator-artifacts.mjs +0 -91
  338. package/project-template-v2/skills/_shared/scripts/pipeline/dod-config.mjs +0 -131
  339. package/project-template-v2/skills/_shared/scripts/pipeline/index.mjs +0 -80
  340. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-1-core.mjs +0 -90
  341. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-2-wrap.mjs +0 -93
  342. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-3-visual.mjs +0 -23
  343. package/project-template-v2/skills/_shared/scripts/render-project-state.mjs +0 -230
  344. package/project-template-v2/skills/_shared/scripts/state-advance-stage.mjs +0 -58
  345. package/project-template-v2/skills/_shared/scripts/state-get.mjs +0 -339
  346. package/project-template-v2/skills/_shared/scripts/state-handoff.mjs +0 -39
  347. package/project-template-v2/skills/_shared/scripts/state-set.mjs +0 -94
  348. package/project-template-v2/skills/_shared/scripts/state-store.mjs +0 -783
  349. package/project-template-v2/skills/_shared/scripts/todo-add.mjs +0 -88
  350. package/project-template-v2/skills/_shared/scripts/todo-get.mjs +0 -130
  351. package/project-template-v2/skills/_shared/scripts/todo-remove.mjs +0 -33
  352. package/project-template-v2/skills/_shared/scripts/todo-set.mjs +0 -47
  353. package/project-template-v2/skills/_shared/scripts/verify-asset-code-sync.mjs +0 -268
  354. package/project-template-v2/skills/_shared/scripts/verify-env.mjs +0 -285
  355. package/project-template-v2/skills/_shared/scripts/verify-placeholders.mjs +0 -161
  356. package/project-template-v2/skills/playable-autoplay/SKILL.md +0 -176
  357. package/project-template-v2/skills/playable-autoplay/agents/openai.yaml +0 -4
  358. package/project-template-v2/skills/playable-debug/SKILL.md +0 -116
  359. package/project-template-v2/skills/playable-debug/agents/openai.yaml +0 -4
  360. package/project-template-v2/skills/playable-debug/references/debug-config.md +0 -40
  361. package/project-template-v2/skills/playable-record/SKILL.md +0 -140
  362. package/project-template-v2/skills/playable-record/scripts/lib/dev-server.mjs +0 -104
  363. package/project-template-v2/skills/playable-record/scripts/lib/record-audio-bridge.js +0 -141
  364. package/project-template-v2/skills/playable-record/scripts/record-playable.mjs +0 -425
  365. package/project-template-v2/skills/playable-record/scripts/verify-contract.mjs +0 -261
  366. package/project-template-v2/skills/playable-record/scripts/verify-firstwin.mjs +0 -398
  367. package/project-template-v2/skills/playable-record/scripts/verify-fusion.mjs +0 -322
  368. package/project-template-v2/skills/playable-record/scripts/verify-lifecycle.mjs +0 -105
  369. package/project-template-v2/skills/playable-record/scripts/verify-vlm-video.mjs +0 -230
  370. package/project-template-v2/skills/playable-validate/SKILL.md +0 -61
  371. package/project-template-v2/skills/playable-validate/validation-rules.md +0 -14
  372. package/project-template-v2/skills/playable-verify-ui/SKILL.md +0 -63
  373. package/project-template-v2/skills/playable-verify-ui/scripts/lib/__init__.py +0 -1
  374. package/project-template-v2/skills/playable-verify-ui/scripts/lib/config_expr.js +0 -218
  375. package/project-template-v2/skills/playable-verify-ui/scripts/lib/node_utils.js +0 -51
  376. package/project-template-v2/skills/playable-verify-ui/scripts/lib/profile_loader.py +0 -59
  377. package/project-template-v2/skills/playable-verify-ui/scripts/lib/report.py +0 -106
  378. package/project-template-v2/skills/playable-verify-ui/scripts/lib/runtime_contract.js +0 -116
  379. package/project-template-v2/skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py +0 -59
  380. package/project-template-v2/skills/playable-verify-ui/scripts/verify_hardcoded_layout.js +0 -64
  381. package/project-template-v2/skills/playable-verify-ui/scripts/verify_runtime_contract.js +0 -58
  382. package/project-template-v2/skills/playable-verify-ui/scripts/verify_text_overlap.py +0 -333
  383. package/project-template-v2/ta-workspace/scripts/.gitkeep +0 -0
  384. package/project-template-v2/tsconfig.json +0 -20
  385. package/project-template-v2/vite.config.ts +0 -27
  386. package/project-templates/batch-locks/phaser.yaml +0 -922
  387. package/project-templates/batch-locks/threejs.yaml +0 -978
  388. package/project-templates/empty/AGENTS.md +0 -41
  389. package/project-templates/empty/gitignore +0 -33
  390. package/templates/preview-runtime/v1/README.md +0 -71
  391. package/templates/preview-runtime/v1/build-preview.mjs +0 -1324
  392. package/templates/preview-runtime/v1/manifest.json +0 -17
  393. package/templates/preview-runtime/v1/release-guard.mjs +0 -87
  394. package/templates/preview-runtime/v1/runtime.d.mts +0 -3
  395. package/templates/preview-runtime/v1/runtime.d.ts +0 -3
  396. package/templates/preview-runtime/v1/runtime.mjs +0 -1121
  397. package/templates/preview-runtime/v1/types/adapters.d.ts +0 -26
  398. package/templates/preview-runtime/v1/types/preview.d.ts +0 -23
  399. package/templates/preview-runtime/v1/types/protocol.d.ts +0 -94
  400. package/templates/preview-runtime/v1/types/runtime.d.ts +0 -14
@@ -1,13 +1,8 @@
1
1
  import { readFileSync, existsSync } from 'fs';
2
- import { dirname, join } from 'path';
2
+ import { join } from 'path';
3
3
  import { homedir } from 'os';
4
4
  import { loadGlobalConfig } from '../config.js';
5
5
  import { DEFAULT_PLAYCRAFT_CLOUD_BASE } from '../commands/login.js';
6
- import { AGENT_TOOL_OPERATION_PROTOCOL, AGENT_TOOL_OPERATION_HEADERS, AGENT_TOOL_OPERATION_CAPABILITIES_PATH, } from '@playcraft/common/agent-tools';
7
- import { beginToolOperation } from './tool-operation-journal.js';
8
- import { businessEndpoint } from './environment-endpoints.js';
9
- import { redactDiagnosticText } from './error-diagnostics.js';
10
- import { AccountActivationError, parseErrorPayload, pendingAccountActivationError, } from '../auth/account-activation.js';
11
6
  /**
12
7
  * 判断 token 是否为用户 PAT(Personal Access Token)。
13
8
  * PAT 以 "playcraft_pat_" 开头;沙箱 JWT 为三段式 base64。
@@ -20,8 +15,8 @@ function isPatToken(token) {
20
15
  * or from the CLI after `playcraft login`.
21
16
  *
22
17
  * 凭证解析优先级:
23
- * API URL : PLAYCRAFT_API_URL → sandbox global .playcraft.json → project .playcraft.json → ~/.playcraft/config.json → DEFAULT_PLAYCRAFT_CLOUD_BASE
24
- * Token : PLAYCRAFT_SANDBOX_TOKEN → sandbox global .playcraft.json → project .playcraft.json → ~/.playcraft/config.json token (PAT)
18
+ * API URL : PLAYCRAFT_API_URL → .playcraft.json → ~/.playcraft/config.json → DEFAULT_PLAYCRAFT_CLOUD_BASE
19
+ * Token : PLAYCRAFT_SANDBOX_TOKEN → .playcraft.json token → ~/.playcraft/config.json token (PAT)
25
20
  *
26
21
  * 鉴权 header 自动选择:
27
22
  * - 沙箱 JWT (非 PAT) → X-Sandbox-Token: <token>(后端 @SandboxToken 路由的沙箱分支)
@@ -30,7 +25,7 @@ function isPatToken(token) {
30
25
  export class AgentApiClient {
31
26
  apiUrl;
32
27
  token;
33
- credentialFile;
28
+ isPat;
34
29
  playcraftEnv;
35
30
  constructor() {
36
31
  const localConfig = AgentApiClient.loadLocalConfig();
@@ -41,7 +36,7 @@ export class AgentApiClient {
41
36
  globalConfig.backendUrl ||
42
37
  globalConfig.url ||
43
38
  DEFAULT_PLAYCRAFT_CLOUD_BASE).replace(/\/+$/, '');
44
- // Token: 环境变量 → 沙箱全局配置 → 项目配置 → 用户登录配置
39
+ // Token: 沙箱 token 环境变量 → 本地 .playcraft.json → 全局 login 配置(PAT)
45
40
  const token = process.env.PLAYCRAFT_SANDBOX_TOKEN ||
46
41
  localConfig.token ||
47
42
  globalConfig.token ||
@@ -52,149 +47,43 @@ export class AgentApiClient {
52
47
  }
53
48
  this.apiUrl = apiUrl;
54
49
  this.token = token;
55
- this.credentialFile = localConfig.credentialFile;
56
- this.playcraftEnv = (process.env.PLAYCRAFT_ENV || localConfig.env || '').trim();
50
+ this.isPat = isPatToken(token);
51
+ this.playcraftEnv = (process.env.PLAYCRAFT_ENV ||
52
+ localConfig.env ||
53
+ '').trim();
57
54
  }
58
55
  /** 根据 token 类型构造鉴权 headers */
59
56
  authHeaders() {
60
- let token = this.token;
61
- // Polling commands can outlive a credential: read the atomically refreshed file per request.
62
- if (this.credentialFile && !process.env.PLAYCRAFT_SANDBOX_TOKEN) {
63
- try {
64
- token = JSON.parse(readFileSync(this.credentialFile, 'utf8')).token || token;
65
- }
66
- catch { /* Keep the last credential if a local file is temporarily unavailable. */ }
67
- }
68
- const headers = isPatToken(token)
69
- ? { Authorization: `Bearer ${token}` }
70
- : { 'X-Sandbox-Token': token };
57
+ const headers = this.isPat
58
+ ? { Authorization: `Bearer ${this.token}` }
59
+ : { 'X-Sandbox-Token': this.token };
71
60
  if (this.playcraftEnv) {
72
61
  headers['playcraft-env'] = this.playcraftEnv;
73
62
  }
74
63
  return headers;
75
64
  }
76
- /** Deployment-relative pathname under /api/agent/tools (path may omit leading slash). */
65
+ /** Absolute pathname under /api/agent/tools (path may omit leading slash). */
77
66
  toolsRequestUrl(path) {
78
67
  const p = path.startsWith('/') ? path : `/${path}`;
79
- return businessEndpoint(this.apiUrl, `/api/agent/tools${p}`);
68
+ return new URL(`/api/agent/tools${p}`, this.apiUrl);
80
69
  }
81
- async post(path, body, options) {
82
- const url = this.toolsRequestUrl(path);
83
- const serializedBody = JSON.stringify(body);
84
- if (serializedBody === undefined)
85
- throw new Error('Tool request body is required');
86
- const recoverId = options?.requestId ?? process.env.PLAYCRAFT_TOOL_REQUEST_ID;
87
- const operation = beginToolOperation(url.pathname, serializedBody, recoverId, {
88
- newRequest: options?.newRequest ?? process.env.PLAYCRAFT_TOOL_NEW_REQUEST === '1',
70
+ async post(path, body) {
71
+ const url = this.toolsRequestUrl(path).href;
72
+ const res = await fetch(url, {
73
+ method: 'POST',
74
+ headers: {
75
+ 'Content-Type': 'application/json',
76
+ ...this.authHeaders(),
77
+ },
78
+ body: JSON.stringify(body),
89
79
  });
90
- const unknownOutcome = `Tool request ${operation.requestId}: the outcome is unknown. Rerun the same command to ` +
91
- `continue this request: it returns the result if the request finished, or finishes it if ` +
92
- `the tool can be safely redone; it never starts a second operation. Record: ${operation.file}.`;
93
- try {
94
- try {
95
- await options?.onPrepared?.({ requestId: operation.requestId, file: operation.file });
96
- }
97
- catch {
98
- operation.reject();
99
- throw new ToolRequestError('Tool request preparation failed; no operation was sent');
100
- }
101
- const capabilityResponse = await fetch(this.toolsRequestUrl(AGENT_TOOL_OPERATION_CAPABILITIES_PATH), {
102
- headers: this.authHeaders(),
103
- redirect: 'error',
104
- signal: options?.signal
105
- ? AbortSignal.any([options.signal, AbortSignal.timeout(30_000)])
106
- : AbortSignal.timeout(30_000),
107
- });
108
- if (!capabilityResponse.ok) {
109
- if (capabilityResponse.status === 403) {
110
- const pending = pendingAccountActivationError(403, parseErrorPayload(await capabilityResponse.clone().text().catch(() => '')));
111
- if (pending) {
112
- if (operation.createdNew && !operation.settledOnly)
113
- operation.reject();
114
- throw pending;
115
- }
116
- }
117
- await capabilityResponse.body?.cancel();
118
- throw new ToolRequestError(`Business tool protocol unavailable (${capabilityResponse.status}); no operation was sent`);
119
- }
120
- const capabilities = (await capabilityResponse.json());
121
- if (capabilities.protocol !== AGENT_TOOL_OPERATION_PROTOCOL ||
122
- capabilities.settledOnly !== true)
123
- throw new ToolRequestError('Business tool protocol is incompatible; no operation was sent');
124
- const res = await fetch(url, {
125
- method: 'POST',
126
- redirect: 'error',
127
- signal: options?.signal
128
- ? AbortSignal.any([options.signal, AbortSignal.timeout(30 * 60_000)])
129
- : AbortSignal.timeout(30 * 60_000),
130
- headers: {
131
- 'Content-Type': 'application/json',
132
- ...this.authHeaders(),
133
- [AGENT_TOOL_OPERATION_HEADERS.protocol]: AGENT_TOOL_OPERATION_PROTOCOL,
134
- [AGENT_TOOL_OPERATION_HEADERS.requestId]: operation.requestId,
135
- ...(operation.settledOnly ? { [AGENT_TOOL_OPERATION_HEADERS.settledOnly]: 'true' } : {}),
136
- },
137
- body: serializedBody,
138
- });
139
- if (res.headers.get(AGENT_TOOL_OPERATION_HEADERS.protocol) !== AGENT_TOOL_OPERATION_PROTOCOL ||
140
- res.headers.get(AGENT_TOOL_OPERATION_HEADERS.requestId) !== operation.requestId) {
141
- const text = await res.text().catch(() => res.statusText);
142
- if (res.status === 403) {
143
- const pending = pendingAccountActivationError(403, parseErrorPayload(text));
144
- if (pending) {
145
- if (operation.createdNew && !operation.settledOnly)
146
- operation.reject();
147
- throw pending;
148
- }
149
- }
150
- // Possibly an instance that ignores identities: a rerun may only read the receipt.
151
- operation.requireReceipt();
152
- const reason = responseErrorReason(text) || redactDiagnosticText(res.statusText);
153
- throw new Error(`Server response ${res.status}${reason ? `: ${reason}` : ''}; ` +
154
- 'Business did not acknowledge a durable receipt; outcome remains unconfirmed');
155
- }
156
- if (!res.ok) {
157
- const text = await res.text().catch(() => res.statusText);
158
- const pending = pendingAccountActivationError(res.status, parseErrorPayload(text));
159
- if (pending)
160
- throw pending;
161
- const code = errorCode(text);
162
- if (res.status === 409 && code === 'business_operation_in_progress')
163
- throw new ToolRequestError(`API 409: ${text}\nTool request ${operation.requestId} is still running. Rerun the ` +
164
- 'same command later to get its result.');
165
- if (res.status === 409 && code === 'business_operation_requires_reconciliation')
166
- throw new ToolRequestError(recoverId !== undefined
167
- ? // A receipt query never runs the request, even for a tool that can be safely redone.
168
- `API 409: ${text}\nTool request ${operation.requestId} has no settled result yet. ` +
169
- 'Rerun the same command without PLAYCRAFT_TOOL_REQUEST_ID: a tool that can be ' +
170
- 'safely redone continues this request; any other tool then needs reconciliation.'
171
- : `API 409: ${text}\nTool request ${operation.requestId} needs reconciliation: its ` +
172
- 'outcome is unknown, and rerunning the same command will not run it again. Only ' +
173
- 'after confirming it had no effect, rerun with PLAYCRAFT_TOOL_NEW_REQUEST=1 to ' +
174
- 'start a new operation.');
175
- if (res.status >= 400 && res.status < 500) {
176
- // The request itself was refused and not carried out: a rerun is a new operation.
177
- operation.reject();
178
- throw new ToolRequestError(`API ${res.status}: ${text}`);
179
- }
180
- throw new Error(`API ${res.status}: ${text}`);
181
- }
182
- const result = (await res.json());
183
- operation.complete();
184
- return result;
185
- }
186
- catch (error) {
187
- if (error instanceof ToolRequestError || error instanceof AccountActivationError)
188
- throw error;
189
- throw new Error(`${error instanceof Error ? error.message : String(error)}\n${operation.settledOnly
190
- ? `Tool request ${operation.requestId}; record: ${operation.file}. Its settled result is not available yet.`
191
- : unknownOutcome}`, { cause: error });
192
- }
193
- finally {
194
- operation.release();
80
+ if (!res.ok) {
81
+ const text = await res.text().catch(() => res.statusText);
82
+ throw new Error(`API ${res.status}: ${text}`);
195
83
  }
84
+ return res.json();
196
85
  }
197
- async get(path, params, options) {
86
+ async get(path, params) {
198
87
  const url = this.toolsRequestUrl(path);
199
88
  if (params) {
200
89
  for (const [k, v] of Object.entries(params)) {
@@ -204,66 +93,27 @@ export class AgentApiClient {
204
93
  }
205
94
  const res = await fetch(url, {
206
95
  headers: this.authHeaders(),
207
- redirect: 'error',
208
- signal: options?.signal ?? AbortSignal.timeout(30_000),
209
96
  });
210
97
  if (!res.ok) {
211
98
  const text = await res.text().catch(() => res.statusText);
212
- const pending = pendingAccountActivationError(res.status, parseErrorPayload(text));
213
- if (pending)
214
- throw pending;
215
99
  throw new Error(`API ${res.status}: ${text}`);
216
100
  }
217
101
  return res.json();
218
102
  }
219
- /** Stream only to the authenticated, same-service video upload endpoint. */
220
- async putVideoMedia(path, body, headers, signal) {
221
- if (!/^\/video-media\/[a-f0-9-]{36}\/content\?/.test(path))
222
- throw new Error('invalid_video_upload_target');
223
- const url = this.toolsRequestUrl(path);
224
- const keys = [...url.searchParams.keys()].sort();
225
- if (keys.join(',') !== 'expires,signature,workspaceId')
226
- throw new Error('invalid_video_upload_target');
227
- const allowed = new Set(['content-type', 'content-md5', 'content-length']);
228
- if (Object.keys(headers).some(key => !allowed.has(key.toLowerCase())))
229
- throw new Error('invalid_video_upload_headers');
230
- const response = await fetch(url, {
231
- method: 'PUT', redirect: 'error', signal,
232
- headers: { ...headers, ...this.authHeaders() },
233
- body: body,
234
- duplex: 'half',
235
- });
236
- if (!response.ok) {
237
- const text = await response.text().catch(() => response.statusText);
238
- const pending = pendingAccountActivationError(response.status, parseErrorPayload(text));
239
- if (pending)
240
- throw pending;
241
- const reason = responseErrorReason(text) || redactDiagnosticText(response.statusText);
242
- throw new Error(`video_upload_failed:${response.status}${reason ? `: ${reason}` : ''}`);
243
- }
244
- await response.body?.cancel();
245
- }
246
103
  /**
247
104
  * 按顺序搜索本地 .playcraft.json 文件(沙箱内或项目目录)。
248
105
  * 与全局 login 配置(~/.playcraft/config.json)不同,前者专用于沙箱 token。
249
106
  */
250
107
  static loadLocalConfig() {
251
- const ancestors = [];
252
- for (let directory = process.cwd();; directory = dirname(directory)) {
253
- ancestors.push(join(directory, '.playcraft.json'));
254
- if (dirname(directory) === directory)
255
- break;
256
- }
257
108
  const searchPaths = [
258
- process.env.PLAYCRAFT_SANDBOX_CONFIG_PATH || '/workspaces/.playcraft.json',
259
- ...ancestors,
109
+ join(process.cwd(), '.playcraft.json'),
260
110
  '/project/.playcraft.json',
261
111
  join(homedir(), '.playcraft.json'),
262
112
  ];
263
113
  for (const p of searchPaths) {
264
114
  if (existsSync(p)) {
265
115
  try {
266
- return { ...JSON.parse(readFileSync(p, 'utf-8')), credentialFile: p };
116
+ return JSON.parse(readFileSync(p, 'utf-8'));
267
117
  }
268
118
  catch {
269
119
  continue;
@@ -273,33 +123,3 @@ export class AgentApiClient {
273
123
  return { apiUrl: '', token: '' };
274
124
  }
275
125
  }
276
- /** A failure whose meaning is settled; no recovery hint applies. */
277
- class ToolRequestError extends Error {
278
- }
279
- function responseErrorReason(text) {
280
- const payload = parseErrorPayload(text);
281
- const readable = (value, depth = 0) => {
282
- if (typeof value === 'string')
283
- return value;
284
- if (Array.isArray(value))
285
- return value.filter(item => typeof item === 'string').join('; ');
286
- if (!value || typeof value !== 'object' || depth > 2)
287
- return '';
288
- const fields = value;
289
- const message = readable(fields.message, depth + 1) || readable(fields.reason, depth + 1) ||
290
- readable(fields.detail, depth + 1) || readable(fields.error, depth + 1);
291
- const code = typeof fields.code === 'string' ? fields.code : '';
292
- return code && message && code !== message ? `${code}: ${message}` : message || code;
293
- };
294
- // Select diagnostic fields instead of printing the response object and its other data.
295
- return redactDiagnosticText(payload === undefined ? text : readable(payload)).slice(0, 2_000);
296
- }
297
- function errorCode(text) {
298
- try {
299
- const message = JSON.parse(text).message;
300
- return typeof message === 'string' ? message : undefined;
301
- }
302
- catch {
303
- return undefined;
304
- }
305
- }
@@ -1,7 +1,6 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { loadGlobalConfig } from '../config.js';
3
3
  import { DEFAULT_PLAYCRAFT_CLOUD_BASE } from '../commands/login.js';
4
- import { pendingAccountActivationError } from '../auth/account-activation.js';
5
4
  export class PlayCraftApiError extends Error {
6
5
  code;
7
6
  status;
@@ -96,20 +95,19 @@ export class PlayCraftHttpClient {
96
95
  }
97
96
  if (!response.ok) {
98
97
  const error = payload?.error;
99
- const pending = pendingAccountActivationError(response.status, payload);
100
- const code = pending?.code ?? (typeof error?.code === 'string' ? error.code : statusCode(response.status));
101
- const message = pending?.message ?? (typeof error?.message === 'string'
98
+ const code = typeof error?.code === 'string' ? error.code : statusCode(response.status);
99
+ const message = typeof error?.message === 'string'
102
100
  ? error.message
103
101
  : typeof payload?.message === 'string'
104
102
  ? payload.message
105
103
  : typeof payload === 'string'
106
104
  ? payload
107
- : response.statusText || 'PlayCraft request failed');
105
+ : response.statusText || 'PlayCraft request failed';
108
106
  throw new PlayCraftApiError({
109
107
  code,
110
108
  message,
111
109
  status: response.status,
112
- details: pending ? { loginCommand: 'playcraft login --activate' } : error?.details ?? payload,
110
+ details: error?.details ?? payload,
113
111
  retryable: response.status >= 500,
114
112
  });
115
113
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playcraft/cli",
3
- "version": "0.1.53-beta",
3
+ "version": "0.1.54",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "engines": {
@@ -14,18 +14,16 @@
14
14
  "dist",
15
15
  "templates",
16
16
  "project-template",
17
- "project-template-v2",
18
17
  "engine-packs",
19
18
  "project-templates",
20
19
  "REMIX.md",
21
- "SKILLS_REGISTRY.md",
22
20
  "README.md"
23
21
  ],
24
22
  "scripts": {
25
23
  "dev": "tsc -w",
26
- "build": "node scripts/generate-video-skills.mjs && node scripts/generate-preview-runtime.mjs && tsc",
24
+ "build": "tsc",
27
25
  "start": "node dist/index.js",
28
- "test": "pnpm build && vitest run",
26
+ "test": "vitest run",
29
27
  "test:agent": "node scripts/run-agent-tests.mjs --list",
30
28
  "test:agent:designer": "node scripts/run-agent-tests.mjs game-designer",
31
29
  "test:agent:developer": "node scripts/run-agent-tests.mjs developer",
@@ -37,10 +35,6 @@
37
35
  "test:agent:gate": "node scripts/run-agent-tests.mjs gate",
38
36
  "test:agent:vlm": "node scripts/run-agent-tests.mjs vlm",
39
37
  "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
38
  "verify:agent-stop": "node scripts/verify-agent-stop.mjs",
45
39
  "verify-sprite-overlay": "node scripts/verify-sprite-overlay.mjs",
46
40
  "link": "node scripts/bump-local.js && pnpm build && npm link",
@@ -51,9 +45,8 @@
51
45
  "@gltf-transform/core": "^4.3.0",
52
46
  "@gltf-transform/extensions": "^4.3.0",
53
47
  "@gltf-transform/functions": "^4.3.0",
54
- "@playcraft/build": "0.1.53-beta",
55
- "@playcraft/common": "0.1.53-beta",
56
- "better-sqlite3-pinned": "npm:better-sqlite3@13.0.3",
48
+ "@playcraft/build": "^0.1.54",
49
+ "@playcraft/common": "^0.1.54",
57
50
  "chokidar": "^4.0.3",
58
51
  "commander": "^13.1.0",
59
52
  "cors": "^2.8.6",
@@ -69,10 +62,8 @@
69
62
  "json5": "^2.2.3",
70
63
  "latest-version": "^7.0.0",
71
64
  "music-metadata": "^11.12.3",
72
- "node-pty": "1.0.0",
73
65
  "ora": "^8.2.0",
74
66
  "picocolors": "^1.1.1",
75
- "playwright-core": "1.52.0",
76
67
  "sharp": "^0.34.5",
77
68
  "update-notifier": "^7.3.1",
78
69
  "ws": "^8.19.0",
@@ -88,7 +79,6 @@
88
79
  "@types/sharp": "^0.32.0",
89
80
  "@types/update-notifier": "^6.0.8",
90
81
  "@types/ws": "^8.18.1",
91
- "esbuild": "^0.28.1",
92
82
  "typescript": "^5.9.3",
93
83
  "vitest": "^3.2.4"
94
84
  }
@@ -1,149 +0,0 @@
1
- # 远程技能管理
2
-
3
- `playcraft skills registry` 管理已部署注册表中的技能、不可变版本和发行审核。它与现有离线 `skills list/match/read`、项目 `skills project` 命令并存。服务端需要提供 `/api/agent/skill-registry/managed` 路由。
4
-
5
- 网页管理复用现有技能控制台的“发布与更新”页签:系统管理入口为 `/admin/system?tab=agentSkills`,技能工作台入口为 `/agent/skills?view=management`。不新增 Skills 一级导航,旧 `/skills` 仅保留兼容重定向。
6
-
7
- 2026-10-15 已在当前开发配置指定的目标数据库执行并验证 0186 和 [0187_add_skill_scope_governance.sql](../backend-business-server/drizzle/migrations/0187_add_skill_scope_governance.sql)。其他环境启用前仍须应用对应迁移,并部署配套服务与客户端。本次目标数据库升级不代表生产已上线或命令包已发行。
8
-
9
- ## 登录与目标环境
10
-
11
- ```bash
12
- playcraft login --url 'https://playcraft.example.com/__env/test-a'
13
- playcraft skills registry list --scope private --json
14
- ```
15
-
16
- 命令复用登录保存的 PAT (Personal Access Token, 个人访问令牌)。所有命令支持 `--url`、`--token`、`--json`、`--scope private|team|platform` 和 `--team <teamId>`。环境地址顺序为 `--url`、`PLAYCRAFT_API_URL`、`PLAYCRAFT_URL`、已保存地址、默认云端。令牌优先使用 `--token` 或 `PLAYCRAFT_TOKEN`,否则仅使用该环境保存的凭据。环境路径前缀完整保留,向其他环境不会自动发送原环境令牌。
17
-
18
- `private` 是默认范围;`team` 必须明确传入 `--team`,其他范围不能携带 `--team`。`--json` 成功时只输出一个结果对象,运行错误时只输出一个 `error` 对象并以非零状态退出。未知参数或缺少必填参数由命令解析器报告到标准错误。
19
-
20
- ## 查询与下载
21
-
22
- ```bash
23
- playcraft skills registry list --scope private --query video --limit 20 --json
24
- playcraft skills registry list --scope team --team '<teamId>' --cursor '<nextCursor>' --json
25
- playcraft skills registry list --scope platform --json
26
- playcraft skills registry info author/video-helper@1.2.0 --files --json
27
- playcraft skills registry info author/video-helper --versions --json
28
- playcraft skills registry pull author/video-helper@1.2.0 --out ./downloaded-skill --json
29
- ```
30
-
31
- `list` 支持关键词、1–100 条分页和返回的 `nextCursor`;不会自动取完所有页面。`info` 默认省略正文与文件清单,`--files` 返回文件清单,`--versions` 返回可访问版本。查询与下载可省略版本,此时先解析所选发行范围的当前版本,再按其精确版本标识下载。
32
-
33
- `pull` 同时验证元数据、响应头和压缩包的 SHA-256 (Secure Hash Algorithm 256-bit, 256 位安全散列算法) 摘要。包内已声明的 `skillRef/version` 必须匹配;历史制品可缺少声明,仍按服务端精确版本与摘要校验,不重写原制品。内容先写入临时目录,校验完成后原子落地;目标须不存在或为空,路径不能包含符号链接。拉取不会执行资源中的脚本,不修改项目声明、锁或运行时绑定。`.playcraft-skill.json` 保存环境、身份、版本和摘要,不含凭据;再次打包时自动排除。
34
-
35
- ## 上传与发布
36
-
37
- 技能目录必须包含非空 `SKILL.md`,可包含 `manifest.json`、`references/`、`scripts/`、`assets/` 等完整资源。`manifest.json` 可直接声明 `skillRef/version`;否则通过参数明确提供。标识必须是小写 `namespace/slug`,以字母或数字开头,允许连字符和下划线,slug 还允许点号。版本目前支持无前导零的精确 `x.y.z`,最多 32 字符;不支持预发行、构建后缀、`latest` 或版本范围。
38
-
39
- 首期上传接受 Markdown 技能包(`bundleType: "markdown"`),Atom 技能的查询与下载可用,上传管理尚未开放。正式发行还要求有效名称和描述,建议在 `SKILL.md` 的 frontmatter 中声明 `name` 与 `description`,或在清单中声明。平台发行还要求上传时通过 `--changelog` 提供变更说明,并完成平台评估与管理员审核。
40
-
41
- ```bash
42
- # 只登记草稿,不发布
43
- playcraft skills registry push ./my-skill --ref author/video-helper --version 1.2.0 --json
44
-
45
- # 上传后发布到本人范围;本人发布与更新免管理员审核
46
- playcraft skills registry publish ./my-skill --ref author/video-helper --version 1.2.0 --scope private --json
47
-
48
- # 上传新版本,明确旧版本;先同步修改清单中的 version(若已声明)
49
- playcraft skills registry update author/video-helper --from ./my-skill --version 1.3.0 --base-version 1.2.0 --changelog 'Improve examples' --json
50
- playcraft skills registry publish author/video-helper@1.3.0 --scope private --json
51
-
52
- # 同一精确版本推广到团队或平台,不重新分配身份
53
- playcraft skills registry publish author/video-helper@1.3.0 --scope team --team '<teamId>' --json
54
- playcraft skills registry publish author/video-helper@1.3.0 --scope platform --json
55
- ```
56
-
57
- 目录打包仅在内存中补充缺失的清单字段,不改动源目录。显式参数与现有清单身份或版本冲突时拒绝上传。`publish <ref>@<version>` 只发布已上传版本,不能同时传入目录上传参数 `--ref`、`--version`、`--base-version` 或 `--changelog`。排除根目录 `.git`、`node_modules` 和拉取回执;其他文件按目录完整收录,发布前应确保目录只包含需要分享的技能资源。拒绝符号链接、硬链接、不安全路径及大小超限:最多 512 个文件,单文件 16 MiB (Mebibyte, 二进制兆字节),内容总量与压缩包各 64 MiB。清单中的文件引用和显式摘要必须匹配实际文件。
58
-
59
- 全平台同一 `skillRef@version` 唯一;同内容重传复用版本,改内容必须增加版本号。已有命名空间占用或所有权冲突不会转换为更新他人技能。平台保留标识和新建平台归属技能由服务端管理员权限控制,普通作者可先上传本人技能,再向平台发行提审。
60
-
61
- `push/update` 返回 `published: false`。`publish` 先检查当前发行指针,再携带该指针提交;并发发行变更由服务端拒绝。本人发行免审核;团队发行须目标团队管理员批准;平台发行须平台管理员批准。没有有效批准时,发布返回 `status: "review_pending"`、`published: false` 和审核标识。以返回字段为准,命令成功不代表已经发行。
62
-
63
- ## 审核、历史与回滚
64
-
65
- ```bash
66
- playcraft skills registry publish-check author/video-helper@1.3.0 --scope team --team '<teamId>' --json
67
- playcraft skills registry review submit author/video-helper@1.3.0 --scope team --team '<teamId>' --json
68
- playcraft skills registry review list --scope team --team '<teamId>' --json
69
- playcraft skills registry review approve '<reviewId>' --json
70
- playcraft skills registry review reject '<reviewId>' --reason 'Add usage examples' --json
71
-
72
- # 审核后显式发布相同版本、相同目标范围
73
- playcraft skills registry publish author/video-helper@1.3.0 --scope team --team '<teamId>' --json
74
- playcraft skills registry history author/video-helper --scope team --team '<teamId>' --json
75
- playcraft skills registry rollback author/video-helper@1.2.0 --scope team --team '<teamId>' --reason 'Regression in 1.3.0' --json
76
- ```
77
-
78
- 审核决定只批准或拒绝指定申请,不自动执行发布。审核授权与申请目标范围由服务端校验。`publish-check` 显示硬性问题、评估问题、审核要求和当前发行指针;检查通过仍可能因发布时权限或指针改变而失败。回滚只移动选定范围的发行指针,复用已有精确版本,仍受该范围授权、审核和并发检查约束,不重写旧项目锁。
79
-
80
- ## 中断与恢复
81
-
82
- 修改请求不自动重试。命令在发出请求前将请求键及 `pending` 状态写入 `~/.playcraft/registry-requests/`,收到明确结果后记录 `completed/rejected`;回执不保存令牌或技能内容。发布与回滚同时保存操作目标、精确版本、摘要和首次检查得到的发行指针。超时、断线或响应无法确认目标时保留 `pending`;相同环境、凭据和操作的重试复用原请求键及原发行指针,不重新检查后覆盖其他人后来发布的版本。已明确完成或拒绝后,再次执行属于新的操作,会重新检查并分配请求键。服务端精确版本、内容摘要及发行指针是最终事实来源。上传后发布中断时,也可运行 `info <ref>@<version>`、`publish-check` 和 `history` 核对,再继续精确版本发布。
83
-
84
- ## 原生平台视频技能首次登记
85
-
86
- 云工作区默认使用的两个引用是 `remix/playcraft-video-understanding` 和 `remix/playcraft-replica-validation`。它们必须通过 `platform push` 登记,服务端会创建 `kind=platform`、`source=platform` 的原生身份。普通 `push --scope platform` 创建的是托管工作区技能,不能替代这一入口。
87
-
88
- ```bash
89
- playcraft skills registry platform push ./playcraft-video-understanding-1.0.1.tar.gz --changelog '更新视频理解指引与评估用例' --json
90
- playcraft skills registry platform push ./playcraft-replica-validation-1.0.1.tar.gz --changelog '更新复刻验收指引与评估用例' --json
91
- ```
92
-
93
- `platform push <source>` 接受完整目录或已准备的压缩包。目录必须已含原生 `manifest.json`;命令保留其文件内容,不补充托管技能默认字段。已有压缩包原样发送,不重打包。可选的 `--ref`、`--version` 必须与清单一致;可用 `--evaluation-template <templateId>` 指定初始评估模板。原生入口当前仅接受上述两个引用,要求平台类型、单一 `sandbox-agent` surface、对齐的名称与版本、无 imports/relationships;服务端执行完整校验与摘要归一化,并返回最终 `artifactHash`。登记不会自动评估、审核或发布。
94
-
95
- 此入口要求具有平台管理权限的真实账号凭据;命令复用目标环境登录,不发送本地身份模拟请求头。服务端需已部署允许真实管理员个人访问令牌访问原生登记和评估接口的版本。
96
-
97
- ## 真实评估
98
-
99
- 评估会使用指定工作区的模型和配置,在服务端评估执行器中实际运行用例。命令不构造通过记录,也不调用内部执行步骤接口。评估队列、执行器、模型和证据存储均须可用。先明确目标环境、工作区以及精确 `ref@version`,再选择模板和模型:
100
-
101
- ```bash
102
- playcraft skills registry evaluation templates list --json
103
- playcraft skills registry evaluation models --workspace '<workspaceId>' --json
104
- playcraft skills registry evaluation config get remix/playcraft-video-understanding@1.0.1 --scope platform --json
105
- ```
106
-
107
- 没有可用模板时,管理员可创建并启用模板:
108
-
109
- ```bash
110
- playcraft skills registry evaluation templates create --input ./evaluation-template.json --json
111
- playcraft skills registry evaluation templates enable '<templateId>' --json
112
- # 停用模板会使相关发布检查不再接受该模板
113
- playcraft skills registry evaluation templates disable '<templateId>' --json
114
- ```
115
-
116
- 模板输入文件只接受 `{ "key": "...", "name": "...", "spec": { ... } }`。`spec` 使用现有评估模板字段:`executor`、`dockerImage`、`cloudTemplateId`、`nodeVersion`、`opencodeVersion`、`modelConfigId`、`graderVersion`、`caseTimeoutSeconds`、`runTimeoutSeconds`、`globalConcurrency`。填写实际运行镜像与工具版本;使用本地 Docker 时不要填写虚构的云模板标识。运行平台如何选择执行器由部署配置决定,命令不会自动切换。模板创建会分配新修订,**不保证请求键幂等**;若响应丢失,先用 `templates list` 核对,再决定是否重试。
117
-
118
- 配置输入文件只接受 `{ "templateId": "...", "expectedRevision": 0, "spec": { ... } }`。`expectedRevision` 使用 `config get` 返回的修订号;`spec` 包含 `modelConfigId`、`caseTimeoutSeconds`、`cases`。用例结构及断言种类见 [共享评估类型](../common/src/skill-evaluation.ts)。填写有意义的真实提示词、输入文件、断言和必要的模型评审要求;服务端校验完整性、运行证据与发布条件。
119
-
120
- ```bash
121
- playcraft skills registry evaluation config set remix/playcraft-video-understanding@1.0.1 --scope platform --input ./video-evaluation-config.json --json
122
- playcraft skills registry evaluation run remix/playcraft-video-understanding@1.0.1 --scope platform --workspace '<workspaceId>' --config '<configId>' --request-key 'video-1-0-1-run-001' --wait --timeout 1800 --interval 3 --json
123
- ```
124
-
125
- `--config` 必须是保存返回的精确配置标识;工作区标识不要求是通用唯一标识符。请求键允许 8–128 位字母、数字、下划线或连字符;重新执行一次评估需新键,断线恢复同一次评估需复用原键及全部原参数。`--compare` 可同时评估当前稳定版作为基线。省略 `--wait` 时返回已创建评估;带 `--wait` 时只有 `phase=completed` 且 `verdict=passed` 才成功退出,失败或取消会返回包含评估记录的结构化错误并非零退出。
126
-
127
- ```bash
128
- playcraft skills registry evaluation status '<runId>' --json
129
- playcraft skills registry evaluation runs remix/playcraft-video-understanding@1.0.1 --scope platform --workspace '<workspaceId>' --json
130
- playcraft skills registry evaluation wait '<runId>' --timeout 1800 --interval 3 --json
131
- playcraft skills registry evaluation evidence '<runId>' --case '<caseResultId>' --json
132
- playcraft skills registry evaluation cancel '<runId>' --json
133
- ```
134
-
135
- `--case` 使用状态结果中的 `results[].id`,不是逻辑用例名 `normal/boundary/regression`。状态含用例结果和检查项;`evidence` 读取对应归档证据。轮询默认最多 600 秒、间隔 3 秒;超时只停止等待,不取消后台评估,也不自动重新发起。修改请求不自动重试;配置写入使用预期修订号,断线后先读取配置确认实际结果。
136
-
137
- ## 同一原生版本的正式发布
138
-
139
- 应用治理迁移后,原生平台身份也使用托管注册表的审核、检查和发布命令;不要调用旧发布接口。评估配置变化会使旧配置的审核和证据失效。完成真实评估后,对同一精确版本提交审核、查看证据并由有权限的管理员批准,然后发布:
140
-
141
- ```bash
142
- playcraft skills registry review submit remix/playcraft-video-understanding@1.0.1 --scope platform --json
143
- playcraft skills registry review approve '<reviewId>' --json
144
- playcraft skills registry publish-check remix/playcraft-video-understanding@1.0.1 --scope platform --json
145
- playcraft skills registry publish remix/playcraft-video-understanding@1.0.1 --scope platform --json
146
- playcraft skills registry history remix/playcraft-video-understanding --scope platform --json
147
- ```
148
-
149
- 对 `remix/playcraft-replica-validation@1.0.1` 独立完成同样流程。检查必须没有硬性或评估问题;最终核对 `published: true`、返回的精确版本与摘要,以及发行历史。命令没有例外发布选项,不跳过真实评估或审核。这里描述的是操作流程,新增命令的自动测试通过不代表任一环境已完成真实评估或正式发布。工作区预览绑定仍不属于本命令组。