@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,221 +0,0 @@
1
- import { createHash, randomUUID } from 'node:crypto';
2
- import { mkdir, readFile, rename, rm, writeFile, lstat } from 'node:fs/promises';
3
- import { join, resolve } from 'node:path';
4
- import { homedir } from 'node:os';
5
- import { projectSkillsMessage as t } from './messages.js';
6
- import { buildLocalProjectSkillsSnapshot, canonicalProjectSkillsJson, extractBundleArchive, createCanonicalBundleArchive, readProjectSkillSource, sourceTreeDigest, readProjectSkillsLockFile, inspectProjectSkills, setProjectSkillEnabled, validateProjectSkillsSnapshot, declarationDigest, effectiveProjectSkills, PROJECT_SKILLS_DECLARATION_PATH, PROJECT_SKILLS_LOCK_PATH, } from '@playcraft/common/project-skills';
7
- export const projectSkillsCache = () => process.env.PLAYCRAFT_SKILLS_CACHE_DIR
8
- ? resolve(process.env.PLAYCRAFT_SKILLS_CACHE_DIR) : join(homedir(), '.playcraft', 'skill-artifacts');
9
- export async function readLocalProjectSkillSnapshot(directory) {
10
- const inventory = await inspectProjectSkills(directory);
11
- if (inventory.issues.length)
12
- throw new Error(JSON.stringify(inventory.issues));
13
- return validateProjectSkillsSnapshot(inventory.declaration, await readProjectSkillsLockFile(directory));
14
- }
15
- /** Serializes local writers; an interrupted pair is diagnosed by the declaration digest. */
16
- async function change(directory, action) {
17
- const management = join(directory, '.playcraft');
18
- await mkdir(management, { recursive: true });
19
- if ((await lstat(management)).isSymbolicLink())
20
- throw new Error('Linked project management directory');
21
- const lease = join(management, 'skills-write.lock');
22
- await writeFile(lease, `${process.pid}\n`, { flag: 'wx', mode: 0o600 });
23
- try {
24
- return await action();
25
- }
26
- finally {
27
- await rm(lease);
28
- }
29
- }
30
- async function writeSnapshot(directory, snapshot) {
31
- validateProjectSkillsSnapshot(snapshot.declaration, snapshot.lock);
32
- for (const [file, value] of [[PROJECT_SKILLS_DECLARATION_PATH, snapshot.declaration], [PROJECT_SKILLS_LOCK_PATH, snapshot.lock]]) {
33
- const target = join(directory, file), temporary = `${target}.${randomUUID()}.tmp`;
34
- await writeFile(temporary, `${canonicalProjectSkillsJson(value)}\n`, { flag: 'wx', mode: 0o644 });
35
- await rename(temporary, target);
36
- }
37
- }
38
- /** Initializes an unmanaged checkout with one complete source and release snapshot under the existing writer lease. */
39
- export async function initializeLocalProjectSkills(directory, cache, options) {
40
- return change(directory, async () => {
41
- if (await readProjectSkillsLockFile(directory) !== null)
42
- throw new Error('skills_revision_conflict');
43
- const declarationPath = join(directory, PROJECT_SKILLS_DECLARATION_PATH);
44
- let originalDeclaration;
45
- try {
46
- const stat = await lstat(declarationPath);
47
- if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 1024 * 1024)
48
- throw new Error('workspace_skills_invalid');
49
- originalDeclaration = await readFile(declarationPath);
50
- }
51
- catch (error) {
52
- if (error.code !== 'ENOENT')
53
- throw error;
54
- }
55
- let configurationWriteStarted = false;
56
- try {
57
- await options.prepareSources?.();
58
- const snapshot = buildLocalProjectSkillsSnapshot(await inspectProjectSkills(directory));
59
- for (const entry of snapshot.declaration.entries)
60
- if (entry.source.kind === 'repository' && options.enabledRoots.has(entry.source.root))
61
- entry.enabled = true;
62
- if (options.platform) {
63
- const platform = validateProjectSkillsSnapshot(options.platform.declaration, options.platform.lock);
64
- if (platform.declaration.entries.some(entry => entry.source.kind !== 'registry'))
65
- throw new Error('workspace_skills_invalid');
66
- snapshot.declaration.entries.push(...platform.declaration.entries);
67
- snapshot.lock.entries.push(...platform.lock.entries);
68
- }
69
- snapshot.lock.declarationHash = declarationDigest(snapshot.declaration);
70
- validateProjectSkillsSnapshot(snapshot.declaration, snapshot.lock);
71
- await mkdir(cache, { recursive: true, mode: 0o700 });
72
- // Every artifact is ready before the first configuration write; an input/output failure cannot leave a valid subset lock.
73
- for (const artifact of [...snapshot.artifacts, ...(options.platform?.artifacts ?? [])]) {
74
- if (createHash('sha256').update(artifact.archive).digest('hex') !== artifact.artifactHash)
75
- throw new Error('workspace_skills_digest_mismatch');
76
- const target = join(cache, `${artifact.artifactHash}.tar.gz`), temporary = `${target}.${randomUUID()}.tmp`;
77
- try {
78
- await writeFile(temporary, artifact.archive, { flag: 'wx', mode: 0o600 });
79
- await rename(temporary, target);
80
- }
81
- finally {
82
- await rm(temporary, { force: true });
83
- }
84
- }
85
- configurationWriteStarted = true;
86
- await writeSnapshot(directory, snapshot);
87
- return { declaration: snapshot.declaration, lock: snapshot.lock };
88
- }
89
- catch (error) {
90
- if (configurationWriteStarted) {
91
- if (originalDeclaration === undefined)
92
- await rm(declarationPath, { force: true });
93
- else {
94
- const temporary = `${declarationPath}.${randomUUID()}.tmp`;
95
- try {
96
- await writeFile(temporary, originalDeclaration, { flag: 'wx', mode: 0o644 });
97
- await rename(temporary, declarationPath);
98
- }
99
- finally {
100
- await rm(temporary, { force: true });
101
- }
102
- }
103
- await rm(join(directory, PROJECT_SKILLS_LOCK_PATH), { force: true });
104
- }
105
- await options.rollbackSources?.();
106
- throw error;
107
- }
108
- });
109
- }
110
- export async function syncLocalProjectSkills(directory, cache = projectSkillsCache()) {
111
- return change(directory, async () => {
112
- let previous;
113
- try {
114
- previous = await readProjectSkillsLockFile(directory) ?? undefined;
115
- }
116
- catch (error) {
117
- if (error.code !== 'ENOENT')
118
- throw error;
119
- }
120
- const snapshot = buildLocalProjectSkillsSnapshot(await inspectProjectSkills(directory), previous);
121
- await mkdir(cache, { recursive: true, mode: 0o700 });
122
- for (const artifact of snapshot.artifacts) {
123
- const target = join(cache, `${artifact.artifactHash}.tar.gz`);
124
- const temporary = `${target}.${randomUUID()}.tmp`;
125
- await writeFile(temporary, artifact.archive, { flag: 'wx', mode: 0o600 });
126
- await rename(temporary, target);
127
- }
128
- await writeSnapshot(directory, snapshot);
129
- return { declaration: snapshot.declaration, lock: snapshot.lock };
130
- });
131
- }
132
- export async function enableLocalProjectSkill(directory, entryKey, enabled) {
133
- return change(directory, async () => {
134
- const previous = await readLocalProjectSkillSnapshot(directory);
135
- const next = setProjectSkillEnabled(previous.declaration, previous.lock, entryKey, enabled);
136
- // Disabled required dependencies are shown immediately, before changing either file.
137
- for (const surface of ['portal-agent', 'sandbox-agent', 'build-time'])
138
- effectiveProjectSkills(next.declaration, next.lock, surface);
139
- await writeSnapshot(directory, next);
140
- return next;
141
- });
142
- }
143
- /** Restores exact cached bytes to a new generation. Never writes source directories. */
144
- export async function installFrozenProjectSkills(directory, cache = projectSkillsCache()) {
145
- const snapshot = await readLocalProjectSkillSnapshot(directory);
146
- const generation = join(cache, 'runs', randomUUID());
147
- const effective = effectiveProjectSkills(snapshot.declaration, snapshot.lock, 'sandbox-agent');
148
- try {
149
- await mkdir(generation, { recursive: true, mode: 0o700 });
150
- for (const entry of effective) {
151
- const cached = join(cache, `${entry.revision.artifactHash}.tar.gz`);
152
- let archive;
153
- try {
154
- archive = await readFile(cached);
155
- }
156
- catch (error) {
157
- if (error.code !== 'ENOENT' || entry.revision.kind !== 'source')
158
- throw error;
159
- const declaration = snapshot.declaration.entries.find(item => item.entryKey === entry.entryKey);
160
- const source = await readProjectSkillSource(directory, declaration);
161
- if (source.sourceTreeHash !== entry.sourceTreeHash)
162
- throw new Error(`Source digest mismatch: ${entry.entryKey}`);
163
- archive = createCanonicalBundleArchive(source.files.map(file => ({ path: file.path, data: Buffer.from(file.content) })));
164
- if (createHash('sha256').update(archive).digest('hex') !== entry.revision.artifactHash)
165
- throw new Error(`Artifact digest mismatch: ${entry.entryKey}`);
166
- await writeFile(cached, archive, { flag: 'wx', mode: 0o600 }).catch(error => { if (error.code !== 'EEXIST')
167
- throw error; });
168
- }
169
- if (createHash('sha256').update(archive).digest('hex') !== entry.revision.artifactHash)
170
- throw new Error(`Artifact digest mismatch: ${entry.entryKey}`);
171
- const extracted = extractBundleArchive(archive);
172
- if (extracted.issues.length)
173
- throw new Error(JSON.stringify(extracted.issues));
174
- if (entry.revision.kind === 'source' && sourceTreeDigest(extracted.files.map(file => ({ path: file.path, content: file.data }))) !== entry.sourceTreeHash)
175
- throw new Error(`Source digest mismatch: ${entry.entryKey}`);
176
- for (const file of extracted.files) {
177
- const target = join(generation, entry.entryKey, file.path);
178
- await mkdir(join(target, '..'), { recursive: true });
179
- await writeFile(target, file.data, { flag: 'wx', mode: 0o444 });
180
- }
181
- }
182
- return { generation, entries: effective.length, declarationHash: snapshot.lock.declarationHash };
183
- }
184
- catch (error) {
185
- await rm(generation, { recursive: true, force: true });
186
- throw error;
187
- }
188
- }
189
- export async function explainLocalProjectSkills(directory) {
190
- const { declaration, lock } = await readLocalProjectSkillSnapshot(directory);
191
- return declaration.entries.map((entry) => ({ ...entry, locked: lock.entries.find((locked) => locked.entryKey === entry.entryKey), reason: entry.enabled ? 'enabled_in_project' : 'disabled_in_project' }));
192
- }
193
- export async function adoptServerProjectSkillSnapshot(directory, expected, response, checkpoint) {
194
- const next = validateProjectSkillsSnapshot(response.declaration, response.lock);
195
- const withoutIdentity = (snapshot) => ({
196
- declaration: { ...snapshot.declaration, entries: snapshot.declaration.entries.map(entry => ({ ...entry,
197
- source: entry.source.kind === 'repository' ? { kind: entry.source.kind, root: entry.source.root } : entry.source })) },
198
- entries: snapshot.lock.entries.map(entry => ({ entryKey: entry.entryKey, sourceTreeHash: entry.sourceTreeHash,
199
- dependencies: entry.dependencies,
200
- revision: entry.revision.kind === 'source' ? { ...entry.revision, skillRef: undefined } : entry.revision })),
201
- });
202
- if (canonicalProjectSkillsJson(withoutIdentity(expected)) !== canonicalProjectSkillsJson(withoutIdentity(next)))
203
- throw new Error(t('reconcileChanged'));
204
- return change(directory, async () => {
205
- const current = await readLocalProjectSkillSnapshot(directory);
206
- if (canonicalProjectSkillsJson(current) !== canonicalProjectSkillsJson(expected))
207
- throw new Error(t('reconcileChanged'));
208
- for (const entry of current.declaration.entries) {
209
- if (entry.source.kind !== 'repository')
210
- continue;
211
- const source = await readProjectSkillSource(directory, entry);
212
- if (source.sourceTreeHash !== current.lock.entries.find(item => item.entryKey === entry.entryKey)?.sourceTreeHash)
213
- throw new Error(t('reconcileChanged'));
214
- }
215
- checkpoint();
216
- const changed = canonicalProjectSkillsJson(current) !== canonicalProjectSkillsJson(next);
217
- if (changed)
218
- await writeSnapshot(directory, next);
219
- return { changed };
220
- });
221
- }
@@ -1,80 +0,0 @@
1
- const messages = {
2
- en: {
3
- importBuiltins: 'Import published platform skills in Cloud Workspace; preserve exact existing revisions',
4
- platformRequired: 'Use Cloud Workspace’s Skills panel to import published platform skills. Local template import is unavailable.',
5
- expectedDeclarationHash: 'Expected declaration digest from the current skill lock',
6
- expectedLockHash: 'Expected digest of the canonical current skill lock',
7
- reconcile: 'Register the pushed commit and adopt verified platform skill identities',
8
- reconcileChanged: 'The branch, source bytes, or settings changed. Sync, commit and push the current project before reconciling.',
9
- reconcilePending: 'Indexing continues on the server. Retry reconcile later. Operation:',
10
- reconcileFailed: 'Skill indexing failed. Inspect the project adoption operation and retry it.',
11
- reconcileNext: 'Skills are registered. Run skills project reconcile to adopt the verified identities locally.',
12
- reconcileCommit: 'Verified skill identities saved. Commit the declaration and lock, then run remix push.',
13
- reconcileUnchanged: 'Local skills match the registered platform revisions.',
14
- pushIndexFailed: 'Git push succeeded, but skill indexing did not finish. Run skills project reconcile to retry.',
15
- unregistered: 'New skill sources are not in the project lock. Run skills project sync before starting a task.',
16
- online: 'Download missing exact artifacts using this Remix’s platform authorization',
17
- downloadMismatch: 'The server has no authorized artifact matching this local lock. Sync the project first.',
18
- commitRequired: 'Skill source or lock changes are ready. Commit them, then run remix push again.',
19
- run: 'Run a task with the frozen project skills in OpenCode 1.18.31',
20
- usage: 'Show locally reported skill deliveries (no chat upload)',
21
- model: 'OpenCode model identifier; credentials come from the local environment',
22
- runner: 'Managed skills require OpenCode 1.18.31.',
23
- sync: 'Save source revisions and cache their exact artifacts offline',
24
- install: 'Restore exactly the saved lock from the local cache',
25
- frozen: 'Require exact locked artifacts',
26
- enable: 'Enable a project skill for the next run',
27
- disable: 'Disable a project skill for the next run',
28
- explain: 'Explain configured revisions, sources and enablement',
29
- description: 'Inspect and validate this project’s managed skills',
30
- inspect: 'Inspect source directories and declarations without changing files',
31
- verify: 'Validate the saved lock and local source bytes',
32
- directory: 'Project directory',
33
- json: 'Print structured output',
34
- verified: 'Local skill sources and configuration match the lock. Server authorization and runner verification are separate checks.',
35
- failed: 'Skill verification failed',
36
- missing: 'The project does not have a managed declaration and lock yet.',
37
- changed: 'Source files have changed since the saved revision',
38
- },
39
- zh: {
40
- importBuiltins: '在云工作区导入已发布平台技能,保留已有精确修订',
41
- platformRequired: '请在云工作区的技能面板导入已发布平台技能;本地模板导入已停用。',
42
- expectedDeclarationHash: '当前技能锁中的声明摘要',
43
- expectedLockHash: '当前技能锁规范化内容的摘要',
44
- reconcile: '登记已推送的提交,并采用平台核验后的技能身份',
45
- reconcileChanged: '分支、源文件或配置发生变化,请同步、提交并推送当前项目后再对账。',
46
- reconcilePending: '服务端仍在登记,请稍后重新运行 reconcile。操作编号:',
47
- reconcileFailed: '技能登记失败,请检查项目接管操作并重试。',
48
- reconcileNext: '技能源已登记,请运行 skills project reconcile 在本地采用已核验的身份。',
49
- reconcileCommit: '已保存核验后的技能身份,请提交声明和锁文件,然后运行 remix push。',
50
- reconcileUnchanged: '本地技能与平台登记的修订一致。',
51
- pushIndexFailed: 'Git 推送成功,但技能登记未完成。请运行 skills project reconcile 重试。',
52
- unregistered: '发现尚未登记到项目锁的技能源,请先运行 skills project sync 再开始任务。',
53
- online: '使用此 Remix 的平台权限下载缺失的精确制品',
54
- downloadMismatch: '服务端没有与此本地锁匹配的授权制品,请先同步项目。',
55
- commitRequired: '技能源或锁文件已更新,请提交这些修改后再次运行 remix push。',
56
- run: '使用固定项目技能和 OpenCode 1.18.31 运行任务',
57
- usage: '查看本地自报的技能加载记录(不上传聊天)',
58
- model: 'OpenCode 模型标识;凭据使用本地环境',
59
- runner: '受控技能需要 OpenCode 1.18.31。',
60
- sync: '保存源修订并离线缓存精确制品',
61
- install: '按锁从本地缓存还原精确制品',
62
- frozen: '要求精确锁定制品',
63
- enable: '在下次运行中启用项目技能',
64
- disable: '在下次运行中停用项目技能',
65
- explain: '解释配置的修订、来源与启停状态',
66
- description: '检查和验证当前项目的受控技能',
67
- inspect: '检查技能源目录和声明,不修改文件',
68
- verify: '验证已保存的锁和本地源文件',
69
- directory: '项目目录',
70
- json: '输出结构化结果',
71
- verified: '本地技能源和配置与锁一致。服务端授权和运行器验证仍需单独检查。',
72
- failed: '技能验证失败',
73
- missing: '此项目还没有受控技能声明和锁。',
74
- changed: '源文件与已保存的修订不一致',
75
- },
76
- };
77
- export function projectSkillsMessage(key) {
78
- const locale = process.env.PLAYCRAFT_LANGUAGE || process.env.LANG || 'en';
79
- return messages[locale.startsWith('zh') ? 'zh' : 'en'][key];
80
- }
@@ -1,62 +0,0 @@
1
- import { spawnSync } from 'node:child_process';
2
- import { PlayCraftHttpClient } from '../utils/playcraft-http-client.js';
3
- import { readRemixLocalMeta } from '../remix/local-git.js';
4
- import { readLocalProjectSkillSnapshot, adoptServerProjectSkillSnapshot } from './local-store.js';
5
- import { projectSkillsMessage as t } from './messages.js';
6
- /** Register the saved commit, then adopt only identity changes for the same local bytes and settings. */
7
- export async function reconcileLocalProjectSkills(directory, options = {}) {
8
- const metadata = readRemixLocalMeta(directory);
9
- const git = (args) => {
10
- const result = spawnSync('git', args, { cwd: directory, encoding: 'utf8' });
11
- if (result.status !== 0)
12
- throw new Error(t('reconcileChanged'));
13
- return result.stdout.trim();
14
- };
15
- if (git(['branch', '--show-current']) !== metadata.branch)
16
- throw new Error(t('reconcileChanged'));
17
- const commit = git(['rev-parse', 'HEAD']);
18
- const snapshot = await readLocalProjectSkillSnapshot(directory);
19
- const paths = [
20
- '.playcraft/skills.json',
21
- '.playcraft/skills.lock.json',
22
- ...snapshot.declaration.entries.flatMap((entry) => entry.source.kind === 'repository' ? [entry.source.root, ...(entry.projectFiles ?? [])] : []),
23
- ];
24
- if (git(['status', '--porcelain', '--', ...paths]))
25
- throw new Error(t('commitRequired'));
26
- const client = new PlayCraftHttpClient(options);
27
- const base = `/projects/${encodeURIComponent(metadata.projectId)}/skills`;
28
- const query = new URLSearchParams({ branch: metadata.branch });
29
- const request = () => ({ signal: AbortSignal.timeout(30_000), redirect: 'error' });
30
- const view = await client.get(`${base}/config?${query}`, undefined, request());
31
- let operation = await client.post(`${base}/index`, { branch: metadata.branch, commit, expectedRevisionId: view.configuration?.id ?? null }, request());
32
- const deadline = Date.now() + 15 * 60_000;
33
- while (!['completed', 'failed', 'blocked', 'cancelled'].includes(operation.phase)) {
34
- if (Date.now() > deadline)
35
- throw new Error(`${t('reconcilePending')} ${operation.id}`);
36
- await new Promise((resolve) => setTimeout(resolve, 1000));
37
- operation = await client.get(`${base}/adoptions/${operation.id}?${query}`, undefined, request());
38
- }
39
- if (operation.phase !== 'completed')
40
- throw new Error(operation.issues?.[0]?.detail || t('reconcileFailed'));
41
- const updated = await client.get(`${base}/config?${query}`, undefined, request());
42
- if (!updated.configuration || updated.configuration.id !== operation.configRevisionId)
43
- throw new Error(t('reconcileChanged'));
44
- if (!options.write)
45
- return {
46
- operationId: operation.id,
47
- configRevisionId: operation.configRevisionId,
48
- commit,
49
- message: t('reconcileNext'),
50
- };
51
- const result = await adoptServerProjectSkillSnapshot(directory, snapshot, updated.configuration, () => {
52
- if (git(['rev-parse', 'HEAD']) !== commit || git(['status', '--porcelain', '--', ...paths]))
53
- throw new Error(t('reconcileChanged'));
54
- });
55
- return {
56
- ...result,
57
- operationId: operation.id,
58
- configRevisionId: operation.configRevisionId,
59
- commit,
60
- message: result.changed ? t('reconcileCommit') : t('reconcileUnchanged'),
61
- };
62
- }
@@ -1,51 +0,0 @@
1
- import { createHash, randomUUID } from 'node:crypto';
2
- import { mkdir, writeFile, rename, readFile } from 'node:fs/promises';
3
- import { join } from 'node:path';
4
- import { PlayCraftHttpClient } from '../utils/playcraft-http-client.js';
5
- import { readRemixLocalMeta } from '../remix/local-git.js';
6
- import { readLocalProjectSkillSnapshot, projectSkillsCache } from './local-store.js';
7
- import { projectSkillsMessage as t } from './messages.js';
8
- /** Only exact project-authorized revisions; identifiers inside Git never grant download access. */
9
- export async function downloadLocalProjectSkillArtifacts(directory, cache = projectSkillsCache()) {
10
- const meta = readRemixLocalMeta(directory), client = new PlayCraftHttpClient();
11
- const snapshot = await readLocalProjectSkillSnapshot(directory);
12
- const query = new URLSearchParams({ branch: meta.branch });
13
- const view = await client.get(`/projects/${encodeURIComponent(meta.projectId)}/skills/config?${query}`);
14
- await mkdir(cache, { recursive: true, mode: 0o700 });
15
- let downloaded = 0;
16
- for (const locked of snapshot.lock.entries) {
17
- const file = join(cache, `${locked.revision.artifactHash}.tar.gz`);
18
- try {
19
- if (createHash('sha256').update(await readFile(file)).digest('hex') === locked.revision.artifactHash)
20
- continue;
21
- }
22
- catch (error) {
23
- if (error.code !== 'ENOENT')
24
- throw error;
25
- }
26
- const authorized = view.entries?.find(entry => entry.entryKey === locked.entryKey && entry.artifactHash === locked.revision.artifactHash);
27
- if (!authorized)
28
- throw new Error(t('downloadMismatch'));
29
- const response = await fetch(client.url(`/projects/${encodeURIComponent(meta.projectId)}/skills/versions/${authorized.versionId}/archive?${query}`), {
30
- headers: { Authorization: `Bearer ${client.token}`, 'X-Request-Id': client.requestId }, redirect: 'error', signal: AbortSignal.timeout(60000),
31
- });
32
- if (!response.ok || !response.body)
33
- throw new Error(`${t('downloadMismatch')} (${response.status})`);
34
- const parts = [];
35
- let size = 0;
36
- for await (const chunk of response.body) {
37
- size += chunk.byteLength;
38
- if (size > 80 * 1024 * 1024)
39
- throw new Error(t('downloadMismatch'));
40
- parts.push(Buffer.from(chunk));
41
- }
42
- const archive = Buffer.concat(parts);
43
- if (createHash('sha256').update(archive).digest('hex') !== locked.revision.artifactHash)
44
- throw new Error(t('downloadMismatch'));
45
- const temporary = `${file}.${randomUUID()}.tmp`;
46
- await writeFile(temporary, archive, { mode: 0o600, flag: 'wx' });
47
- await rename(temporary, file);
48
- downloaded++;
49
- }
50
- return { downloaded };
51
- }
@@ -1,19 +0,0 @@
1
- import { readProjectSkillSource, inspectProjectSkills } from '@playcraft/common/project-skills';
2
- import { readLocalProjectSkillSnapshot } from './local-store.js';
3
- import { projectSkillsMessage as t } from './messages.js';
4
- export async function verifyLocalProjectSkills(directory) {
5
- const snapshot = await readLocalProjectSkillSnapshot(directory);
6
- const inventory = await inspectProjectSkills(directory);
7
- if (inventory.sources.length !== snapshot.declaration.entries.filter(entry => entry.source.kind === 'repository').length) {
8
- throw new Error(t('unregistered'));
9
- }
10
- for (const entry of snapshot.declaration.entries) {
11
- if (entry.source.kind !== 'repository')
12
- continue;
13
- const actual = await readProjectSkillSource(directory, entry);
14
- const expected = snapshot.lock.entries.find((locked) => locked.entryKey === entry.entryKey);
15
- if (actual.sourceTreeHash !== expected?.sourceTreeHash)
16
- throw new Error(`${t('changed')}: ${entry.entryKey}`);
17
- }
18
- return { valid: true, declarationHash: snapshot.lock.declarationHash, entries: snapshot.lock.entries.length, scope: 'local-source-and-config' };
19
- }
@@ -1,40 +0,0 @@
1
- const messages = {
2
- en: {
3
- topic: 'Record a playable with real browser input', record: 'Record a scenario and fresh-context interaction controls',
4
- url: 'Running playable URL on this workspace loopback interface', scenario: 'Validated scenario JSON file',
5
- out: 'Empty artifact directory', browser: 'Absolute Chromium executable path', timeout: 'Maximum recording time in seconds',
6
- invalidArguments: 'Invalid recording arguments or scenario.', invalidUrl: 'The playable URL must use HTTP on the workspace loopback interface without credentials.',
7
- browserUnavailable: 'Chromium or the Playwright video encoder is unavailable. Check the workspace image.',
8
- navigationFailed: 'The playable did not navigate successfully or left its authorized origin.',
9
- projectChanged: 'Project inputs changed while recording. Record the current project again.',
10
- projectUnavailable: 'The project input digest could not be completed safely.',
11
- recordingFailed: 'Recording failed. Inspect the partial recording and runtime logs.',
12
- outputConflict: 'The recording output directory must be empty.',
13
- recording: 'Recording the playable and interaction controls',
14
- timedOut: 'Recording timed out. Partial evidence was preserved.', interrupted: 'Recording was interrupted. Partial evidence was preserved.',
15
- },
16
- zh: {
17
- topic: '使用真实浏览器输入录制可玩作品', record: '录制操作场景和使用独立空上下文的交互对照',
18
- url: '当前工作区回环地址上的作品服务', scenario: '经过验证的操作场景文件', out: '空的证据输出目录',
19
- browser: 'Chromium 可执行文件的绝对路径', timeout: '录制最长秒数', invalidArguments: '录制参数或场景无效。',
20
- invalidUrl: '作品地址必须使用工作区回环接口的 HTTP 协议,不能包含凭据。',
21
- browserUnavailable: 'Chromium 或 Playwright 视频编码器不可用,请检查工作区镜像。',
22
- navigationFailed: '作品导航失败,或跳转离开了授权来源。', projectChanged: '录制时工程输入发生了变化,请基于当前工程重新录制。',
23
- projectUnavailable: '无法安全完成工程输入摘要。', recordingFailed: '录制失败,请检查保留的局部录像和运行日志。',
24
- outputConflict: '录制输出目录必须为空。', recording: '正在录制作品和交互对照',
25
- timedOut: '录制超时,已保留局部证据。', interrupted: '录制已中断,已保留局部证据。',
26
- },
27
- };
28
- export function recordingMessage(key) {
29
- const language = process.env.PLAYCRAFT_LANGUAGE || process.env.LANG || 'en';
30
- return messages[language.startsWith('zh') ? 'zh' : 'en'][key];
31
- }
32
- export class RecordingError extends Error {
33
- code;
34
- exitCode;
35
- constructor(code, exitCode = 4) {
36
- super(recordingMessage(code));
37
- this.code = code;
38
- this.exitCode = exitCode;
39
- }
40
- }
@@ -1,85 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import { execFile } from 'node:child_process';
3
- import { lstat, open, readdir, realpath } from 'node:fs/promises';
4
- import { basename, dirname, relative, resolve, sep } from 'node:path';
5
- import { promisify } from 'node:util';
6
- import { RecordingError } from './messages.js';
7
- const execute = promisify(execFile);
8
- const excludedNames = new Set(['.git', 'node_modules', '.DS_Store']);
9
- const excludedRoots = new Set(['.agents', '.claude', '.codex', '.next', '.vite', '.cache', '.tmp', 'tmp', 'temp', 'dist', 'build', 'coverage', '.playcraft-preview-out', '.playcraft-temp']);
10
- const excludedInternalPaths = ['.playcraft/video-replication', '.playcraft/skills', '.playcraft/skill-artifacts', '.playcraft/skills.json', '.playcraft/skills.lock.json', '.playcraft/workspace-context.json'];
11
- const inside = (root, path) => path === root || path.startsWith(`${root}${sep}`);
12
- const canonicalPath = async (path) => {
13
- const absolute = resolve(path);
14
- try {
15
- return await realpath(absolute);
16
- }
17
- catch {
18
- const parent = dirname(absolute);
19
- if (parent === absolute)
20
- throw new RecordingError('projectUnavailable', 64);
21
- return resolve(await canonicalPath(parent), basename(absolute));
22
- }
23
- };
24
- /** Hash source, resources, configuration and dependency manifests, including untracked inputs. */
25
- export async function computeProjectInputDigest(root, excludedOutputDirectories = []) {
26
- try {
27
- const actualRoot = await realpath(root);
28
- const excluded = await Promise.all(excludedOutputDirectories.map(canonicalPath));
29
- if (excluded.some(target => inside(target, actualRoot)))
30
- throw new RecordingError('projectUnavailable', 64);
31
- const hash = createHash('sha256');
32
- let fileCount = 0;
33
- let totalBytes = 0;
34
- const walk = async (directory) => {
35
- const entries = (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name, 'en'));
36
- for (const entry of entries) {
37
- if (excludedNames.has(entry.name) || directory === actualRoot && excludedRoots.has(entry.name))
38
- continue;
39
- const path = resolve(directory, entry.name);
40
- if (excluded.some(target => inside(target, path)))
41
- continue;
42
- const rel = relative(actualRoot, path).split(sep).join('/');
43
- if (excludedInternalPaths.some(target => rel === target || rel.startsWith(`${target}/`)))
44
- continue;
45
- const before = await lstat(path);
46
- if (before.isDirectory()) {
47
- await walk(path);
48
- continue;
49
- }
50
- if (before.isSymbolicLink()) {
51
- const target = await realpath(path);
52
- if (!inside(actualRoot, target) || (await lstat(target)).isDirectory())
53
- throw new RecordingError('projectUnavailable', 64);
54
- }
55
- else if (!before.isFile())
56
- throw new RecordingError('projectUnavailable', 64);
57
- const file = await open(path, 'r');
58
- try {
59
- const initial = await file.stat();
60
- totalBytes += initial.size;
61
- if (++fileCount > 50_000 || totalBytes > 1024 * 1024 * 1024)
62
- throw new RecordingError('projectUnavailable', 64);
63
- const content = createHash('sha256');
64
- for await (const bytes of file.createReadStream({ autoClose: false }))
65
- content.update(bytes);
66
- const after = await file.stat();
67
- if (initial.size !== after.size || initial.mtimeMs !== after.mtimeMs || initial.ino !== after.ino)
68
- throw new RecordingError('projectChanged', 64);
69
- hash.update(`${JSON.stringify(rel)}:${initial.mode & 0o777}:${initial.size}:${content.digest('hex')}\n`);
70
- }
71
- finally {
72
- await file.close();
73
- }
74
- }
75
- };
76
- await walk(actualRoot);
77
- const gitCommit = await execute('git', ['-C', actualRoot, 'rev-parse', 'HEAD'], { timeout: 5000, maxBuffer: 1024, encoding: 'utf8' }).then(value => value.stdout.trim()).catch(() => null);
78
- return { root: actualRoot, gitCommit: gitCommit && /^[a-f0-9]{40,64}$/.test(gitCommit) ? gitCommit : null, sha256: hash.digest('hex'), fileCount };
79
- }
80
- catch (error) {
81
- if (error instanceof RecordingError)
82
- throw error;
83
- throw new RecordingError('projectUnavailable', 64);
84
- }
85
- }