@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,97 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import { lstat, readdir, readFile, realpath } from 'node:fs/promises';
3
- import { relative, resolve, sep } from 'node:path';
4
- import { workspaceRelativePathSchema } from '@playcraft/common/cloud-workspace/runtime';
5
- export const parameterDigest = (content) => createHash('sha256').update(content).digest('hex');
6
- const skippedDirectories = new Set(['node_modules', '.git', 'dist', 'build', 'coverage', '.next', '.vite', '.cache', '.playcraft-editor-preview', '.playcraft-delivery', '.playcraft-temp', 'parameter-admission']);
7
- const snapshotByteLimit = 32 * 1024 * 1024;
8
- const inputExtension = /\.(?:[cm]?[jt]sx?|json5?|ya?ml|html|css|scss|glsl|wgsl|vert|frag|toml)$/i;
9
- export class ParameterAgentError extends Error {
10
- code;
11
- constructor(code) {
12
- super(code);
13
- this.code = code;
14
- this.name = 'ParameterAgentError';
15
- }
16
- }
17
- export function parameterInputPath(path) {
18
- if (!workspaceRelativePathSchema.safeParse(path).success)
19
- return false;
20
- const segments = path.split('/');
21
- if (segments.some(segment => skippedDirectories.has(segment)))
22
- return false;
23
- if (segments.some(segment => segment.startsWith('.') && segment !== '.playcraft'))
24
- return false;
25
- if (segments[0] === '.playcraft' && path !== '.playcraft/workspace.json')
26
- return false;
27
- if (segments.some(segment => /(?:secret|credential|private[-_.]?key|\.pem$|\.key$)/i.test(segment)))
28
- return false;
29
- return inputExtension.test(path);
30
- }
31
- export async function readParameterAgentFile(root, path, limit = 2 * 1024 * 1024) {
32
- const parsed = workspaceRelativePathSchema.safeParse(path);
33
- if (!parsed.success)
34
- throw new ParameterAgentError('parameter_agent_path_invalid');
35
- const base = await realpath(root);
36
- let target = base;
37
- const segments = parsed.data.split('/');
38
- for (let index = 0; index < segments.length; index++) {
39
- target = resolve(target, segments[index]);
40
- const stat = await lstat(target);
41
- if (stat.isSymbolicLink() || (index < segments.length - 1 ? !stat.isDirectory() : !stat.isFile()))
42
- throw new ParameterAgentError('parameter_agent_path_invalid');
43
- if (index === segments.length - 1 && stat.size > limit)
44
- throw new ParameterAgentError('parameter_agent_input_too_large');
45
- }
46
- const rel = relative(base, await realpath(target));
47
- if (rel === '..' || rel.startsWith(`..${sep}`))
48
- throw new ParameterAgentError('parameter_agent_path_invalid');
49
- const bytes = await readFile(target);
50
- if (bytes.byteLength > limit)
51
- throw new ParameterAgentError('parameter_agent_input_too_large');
52
- return bytes;
53
- }
54
- export async function parameterInputSnapshot(root) {
55
- const base = await realpath(root);
56
- const sources = [];
57
- let total = 0;
58
- let directories = 0;
59
- const walk = async (path, depth) => {
60
- if (depth > 24 || ++directories > 4096)
61
- throw new ParameterAgentError('parameter_agent_input_limit');
62
- const entries = await readdir(resolve(base, path), { withFileTypes: true });
63
- if (entries.length > 4096)
64
- throw new ParameterAgentError('parameter_agent_input_limit');
65
- for (const entry of entries) {
66
- const child = path ? `${path}/${entry.name}` : entry.name;
67
- if (entry.isSymbolicLink())
68
- continue;
69
- if (entry.isDirectory()) {
70
- if (skippedDirectories.has(entry.name) || (entry.name.startsWith('.') && entry.name !== '.playcraft'))
71
- continue;
72
- if (child.startsWith('.playcraft/'))
73
- continue;
74
- await walk(child, depth + 1);
75
- }
76
- else if (entry.isFile() && parameterInputPath(child)) {
77
- if (sources.length >= 2048)
78
- throw new ParameterAgentError('parameter_agent_input_limit');
79
- let bytes;
80
- try {
81
- // Snapshot hashing shares a total budget; report evidence keeps the reader's default limit.
82
- bytes = await readParameterAgentFile(base, child, snapshotByteLimit - total);
83
- }
84
- catch (error) {
85
- if (error instanceof ParameterAgentError && error.code === 'parameter_agent_input_too_large')
86
- throw new ParameterAgentError('parameter_agent_input_limit');
87
- throw error;
88
- }
89
- total += bytes.byteLength;
90
- sources.push({ path: child, sha256: parameterDigest(bytes) });
91
- }
92
- }
93
- };
94
- await walk('', 0);
95
- sources.sort((left, right) => left.path.localeCompare(right.path));
96
- return { sources, digest: parameterDigest(JSON.stringify(sources)) };
97
- }
@@ -1,40 +0,0 @@
1
- /** Versioned product protocol reference, compiled into the published CLI (Command Line Interface, 命令行接口). */
2
- export const PARAMETER_AGENT_PROTOCOL = `PlayCraft parameter integration protocol v1.1
3
- This is a product configuration reference, not a skill activation. Preserve the current project skill lock and permission/work modes.
4
- Work only in the current authorized engineering directory. Never edit Remix Editor or a different workspace directory.
5
-
6
- Configuration:
7
- - Reuse existing schema and sparse theme data. .playcraft/workspace.json may declare parameters:{schemaPath,dataPath,themeId}; preserve all unrelated manifest keys. parameters accepts only those three keys.
8
- - A schema already declares configurable fields. Do not add a parallel xplatform.parameter protocol. Reuse existing field paths and synonymous parameters first.
9
- - For a new project, create a schema, a sparse data file ({} is valid), matching platform text, and explicit manifest paths. Use gamePlay.preloaded / gamePlay.sections / gamePlay.settlement for the three-screen tree. Preserve existing project paths instead of migrating gratuitously.
10
- - Object nodes use type:object/properties; leaves declare a supported primitive type and a valid default. Preserve units, known bounds/enum and meaning; do not invent verified limits without code evidence. Basic leaves support string, finite number, integer, boolean and null. Preserve valid standard required arrays without inventing unrelated requiredness. Malformed required declarations and unsupported $ref/conditional composition remain invalid.
11
- - Missing theme values inherit schema defaults; editing creates a raw override and restoring defaults removes that override. Never flatten resolved values into theme.data. Preserve comments, unknown data and unrelated overrides.
12
- - Platform labels use i18n.platform.json5 beside the schema, same tree, with _self.title/description text for zh/en. Preserve xplatform.ext.readonly and xplatform.showIf/showIfAny. Resources (xplatform.value_type:path), multilingual references (i18n), arrays and complex structures retain their semantics; do not disguise them as primitive controls.
13
-
14
- Consumption and checks:
15
- - Modify real game consumers and the neutral configuration resolver, shared by production and preview. A schema-only field or a new getter with no real consumer is incomplete.
16
- - The development preview runtime is separate from advertising code. Do not route debugging through advertising configuration caches. Production must not depend on the preview runtime.
17
- - For an add/admit integration that needs instant preview, obtain the supported development SDK (Software Development Kit, 软件开发工具包) with playcraft preview-runtime init --dir . in this engineering directory. It copies versioned modules/types/helpers to .playcraft/preview-runtime without changing game entries; refuse to overwrite modified managed files. Discovery remains read-only and must not run initialization.
18
- - Read .playcraft/preview-runtime/README.md. Create a separate preview entry importing connectPreviewRuntime/readWorkspacePreviewContext from its relative runtime.mjs; adapt the real resolver/store/game callbacks and explicitly register consumed fields. Add a build:cloud-preview script invoking node .playcraft/preview-runtime/build-preview.mjs --entry <relative-preview-entry> with optional --config <project-vite-preview-config> and --mount-id <container>. The project needs a compatible development Vite; legacy webpack/playable-scripts projects require explicit preview plugins/aliases/constants, not a production build migration.
19
- - Preserve unrelated .playcraft/workspace.json keys and declare previewRuntime:{version:1,buildScript:"build:cloud-preview",outputPath:".playcraft-editor-preview/index.html",reportPath:".playcraft-editor-preview/report.json",configContractVersion:"<actual-contract-version>",entryPath:"<actual-preview-entry>",viteConfigPath:"<preview-build-config>",mountId:"game",gameFilePaths:["<actual-preview-entry>","<real-resolver>","<real-consumer>","<preview-build-config>",".playcraft/preview-runtime/runtime.mjs",".playcraft/preview-runtime/build-preview.mjs"]}. List actual existing input paths rather than these placeholders; omit viteConfigPath when no custom configuration is needed. For the copied SDK, entryPath is required and the platform directly invokes its trusted packaged helper with the declared entry/config/mount arguments; the project buildScript is not executed for admission and cannot self-author its module evidence. Managed SDK files belong to the separate preview module report, not parameter-admission origin/consumer evidence. The platform supplies PLAYCRAFT_RUNTIME_PREVIEW_CONTEXT and verifies the helper's independent SDK/module report; do not fabricate context or a successful live report.
20
- - Keep production independent. Vite production builds may import previewRuntimeReleaseGuard from .playcraft/preview-runtime/release-guard.mjs and register it with root and actual previewEntries. Other builders need equivalent real module-graph evidence. If preview adaptation, a production boundary or a dependency is unavailable, report the concrete missing work instead of claiming isolation.
21
- - Instant capability requires real field registration and a version-matched preview handshake. Reports cannot declare live capability. A newly integrated field may require one preview build first.
22
- - Add or extend package.json script test:parameters with meaningful tests of schema/default/sparse overrides and real consumer behavior; changing the requested value must affect its consumer. Preserve an existing test script. Ensure the production build script build exists and succeeds. Optional typecheck is also run by the platform.
23
- - The platform independently runs only pnpm run test:parameters, pnpm run build, and optional pnpm run typecheck. Reports cannot choose executable commands. Do not replace checks with successful echo statements or self-reported flags.
24
- - Do not claim a complete production module isolation proof without a trustworthy module report. Passing build/checks proves only their stated coverage.
25
-
26
- Report JSON (JavaScript Object Notation, JavaScript 对象表示法) contract (no second copy of parameter values):
27
- {version:1,taskId:"<exact platform task id>",sources:[{path:"relative/input.ts",sha256:"<current raw-file digest>"}],candidates:[{id:"stable-id",title:"User-facing title",description:"Optional purpose",fieldPath:["gamePlay","sections","board","speed"],origins:[{path:"relative/input.ts",line:1,summary:"Actual origin evidence"}],consumers:[{path:"src/game.ts",line:1,summary:"Actual production consumer and behavior"}],status:"candidate",missing:["Concrete incomplete steps"]}]}
28
- - Candidate status is exactly candidate, implemented, or blocked. Completed integration candidates use implemented with an empty missing array; discovery keeps candidates unimplemented.
29
- - Include current raw-file SHA-256 (Secure Hash Algorithm 256-bit, 256位安全散列算法) digests for every origin and consumer. Include relevant schema/data/platform labels/workspace manifest/check scripts/package files only when they pass the eligible input path filter below. Package lock evidence is limited to eligible package locks such as pnpm-lock.yaml and package-lock.json; a general skill lock or other metadata lock is not package evidence.
30
- - sources must use only platform-snapshot input paths: engineering-relative regular files with no symlink parents, no absolute paths, backslashes, colon, empty segments, . or .. segments; paths are at most 512 characters. Eligible suffixes are [cm]?[jt]sx? (JavaScript/TypeScript and their c/m variants), json, json5, yaml, yml, html, css, scss, glsl, wgsl, vert, frag and toml, case-insensitive.
31
- - Skip these directories anywhere in a path: node_modules, .git, dist, build, coverage, .next, .vite, .cache, .playcraft-editor-preview, .playcraft-delivery, .playcraft-temp and parameter-admission. Hidden path segments are excluded except the workspace manifest rule: .playcraft/workspace.json is the only .playcraft evidence input. Exclude any segment containing secret, credential, private[-_.]?key, or ending in .pem or .key, case-insensitive. Do not read credentials, dependency trees or build outputs as evidence.
32
- - AGENTS.md, SKILL.md (including SKILL/SKILL.md), .playcraft/skills.lock.json, other Markdown instructions and managed .playcraft/preview-runtime files must not appear in sources, origins or consumers. Reading workspace instructions does not make them eligible evidence inputs. Keep those documents as working instructions, not report sources.
33
- - Eligible source snapshots remain bounded by 33,554,432 total bytes, 2048 files, 4096 directories, 4096 entries per directory and depth 24. The platform may hash a large eligible source within that total budget, but an individual origin/consumer evidence file must fit the 2,097,152-byte read limit. Choose the actual small production consumer instead of citing a large vendor bundle.
34
- - Discovery writes only its exact development report: do not alter schema/data to make discovery or validation pass, and do not claim an integration or successful checks. The platform derives the complete catalog from the existing schema. Do not copy every existing schema field into the discovery report. The first discovery batch must contain at most 12 distinct, valuable candidates, prioritizing missing meaningful controls or concrete integration gaps; do not manufacture duplicates or filler. Explain additional discovery work in the final response rather than expanding this report into a catalog.
35
- - Keep the complete report at most 1,048,576 bytes encoded as UTF-8 (Unicode Transformation Format 8-bit, 8位Unicode转换格式). The strict structure accepts only the shown keys: 1..2048 unique sources with unique paths and 64-character lowercase hexadecimal digests; 0..128 candidates with unique ids (discovery is further limited to the first 12).
36
- - Each candidate id is 1..128 characters matching [A-Za-z0-9][A-Za-z0-9._-]*, title 1..256, optional description at most 4000; origins 1..32, consumers 0..32, missing 0..32 strings of 1..1000 characters. Each evidence summary is 1..2000 characters; an optional line is a positive integer no greater than 1,000,000 and must exist in the current file. A fieldPath, when present, contains 1..16 identifier segments of 1..128 characters, excluding __proto__, prototype and constructor. Every origin/consumer path must have its current digest declared in sources.
37
- - Summaries and source snippets are evidence claims, not proof of semantics. The platform checks current files, declared defaults, write support, and independently executed check exits.
38
- - No passed/ready/live/checks fields are accepted in the report. All implementation and validation statements remain claims until platform verification.
39
- - If blocked or partial, preserve reviewable changes and list concrete missing work. Do not overwrite later user edits or claim multi-file changes were atomic.
40
- `;
@@ -1,58 +0,0 @@
1
- import { mkdir, readFile, readdir, rename, lstat, writeFile } from 'node:fs/promises';
2
- import { isAbsolute, join, relative, resolve, sep } from 'node:path';
3
- import { randomUUID } from 'node:crypto';
4
- import { parameterAgentTaskRecordSchema, parameterAgentTaskRequestSchema } from '@playcraft/common/cloud-workspace/runtime';
5
- import { ParameterAgentError, parameterDigest } from './parameter-agent-inputs.js';
6
- export function parameterTaskWorkspace(state, workspaceId) {
7
- if (!workspaceId && state.config.workspaceMode === 'multi')
8
- throw new ParameterAgentError('parameter_agent_scope_invalid');
9
- return workspaceId ?? 'local';
10
- }
11
- async function taskDirectory(state, workspaceId, directoryName, root) {
12
- const parent = resolve(state.config.stateDir, 'parameter-agent');
13
- if (root) {
14
- const rel = relative(resolve(root), parent);
15
- if (rel === '' || (rel !== '..' && !rel.startsWith(`..${sep}`) && !isAbsolute(rel)))
16
- throw new ParameterAgentError('parameter_agent_state_not_private');
17
- }
18
- const scope = [state.config.environment, state.config.userId, state.config.runtimeId, workspaceId, directoryName];
19
- const directory = join(parent, parameterDigest(JSON.stringify(scope)));
20
- await mkdir(directory, { recursive: true, mode: 0o700 });
21
- if ((await lstat(parent)).isSymbolicLink() || (await lstat(directory)).isSymbolicLink())
22
- throw new ParameterAgentError('parameter_agent_state_invalid');
23
- return directory;
24
- }
25
- export async function readPrivateParameterTask(state, workspaceId, directoryName, taskId, root) {
26
- if (!/^[a-f0-9-]{36}$/i.test(taskId))
27
- throw new ParameterAgentError('parameter_agent_task_invalid');
28
- const file = join(await taskDirectory(state, workspaceId, directoryName, root), `${taskId}.json`);
29
- try {
30
- const stat = await lstat(file);
31
- if (!stat.isFile() || stat.isSymbolicLink() || stat.size > 1024 * 1024)
32
- throw new ParameterAgentError('parameter_agent_state_invalid');
33
- const value = JSON.parse(await readFile(file, 'utf8'));
34
- value.record = parameterAgentTaskRecordSchema.parse(value.record);
35
- value.request = parameterAgentTaskRequestSchema.parse(value.request);
36
- if (value.record.taskId !== taskId || value.request.taskId !== taskId || value.record.workspaceId !== workspaceId || value.record.directoryName !== directoryName || !/^[a-f0-9]{64}$/.test(value.initialDigest))
37
- throw new ParameterAgentError('parameter_agent_state_invalid');
38
- return value;
39
- }
40
- catch (error) {
41
- if (error.code === 'ENOENT')
42
- return undefined;
43
- throw error;
44
- }
45
- }
46
- export async function writePrivateParameterTask(state, task, root) {
47
- const directory = await taskDirectory(state, task.record.workspaceId, task.record.directoryName, root);
48
- const record = parameterAgentTaskRecordSchema.parse(task.record);
49
- const temporary = join(directory, `.${record.taskId}.${randomUUID()}.tmp`);
50
- await writeFile(temporary, JSON.stringify({ ...task, record }), { mode: 0o600 });
51
- await rename(temporary, join(directory, `${record.taskId}.json`));
52
- }
53
- export async function listPrivateParameterTaskIds(state, workspaceId, directoryName, root) {
54
- const names = (await readdir(await taskDirectory(state, workspaceId, directoryName, root))).filter(name => /^[a-f0-9-]{36}\.json$/i.test(name));
55
- if (names.length > 256)
56
- throw new ParameterAgentError('parameter_agent_task_limit');
57
- return names.map(name => name.slice(0, -5));
58
- }
@@ -1,284 +0,0 @@
1
- import { randomUUID } from 'node:crypto';
2
- import { parameterAgentReportSchema, parameterAgentTaskRequestSchema, parameterAgentVerifyPayloadSchema, parameterCatalog, stableStringify, validateParameterChange, } from '@playcraft/common/cloud-workspace/runtime';
3
- import { readWorkspaceParameters } from './parameters.js';
4
- import { revisionScope } from './registry.js';
5
- import { runDeveloperCommand } from './developer-command.js';
6
- import { PARAMETER_AGENT_PROTOCOL } from './parameter-agent-protocol.js';
7
- import { ParameterAgentError, parameterDigest, parameterInputSnapshot, readParameterAgentFile } from './parameter-agent-inputs.js';
8
- import { listPrivateParameterTaskIds, parameterTaskWorkspace, readPrivateParameterTask, writePrivateParameterTask } from './parameter-agent-store.js';
9
- export { ParameterAgentError } from './parameter-agent-inputs.js';
10
- const reportPath = (taskId) => `.playcraft/parameter-admission/${taskId}.json`;
11
- const now = () => new Date().toISOString();
12
- function scope(state, operation, requireSession = true) {
13
- const workspaceId = parameterTaskWorkspace(state, operation.workspaceId);
14
- const directoryName = operation.directoryName ?? 'basic';
15
- if ((requireSession && !operation.sessionId) || directoryName === 'root' || !/^(basic|remix-[a-z0-9][a-z0-9-]{3,63})$/.test(directoryName))
16
- throw new ParameterAgentError('parameter_agent_scope_invalid');
17
- if (operation.environment !== state.config.environment || operation.userId !== state.config.userId
18
- || (operation.generation !== undefined && operation.generation !== state.config.generation)
19
- || (operation.runtimeEpoch !== undefined && operation.runtimeEpoch !== state.runtimeEpoch))
20
- throw new ParameterAgentError('parameter_agent_scope_expired');
21
- return { workspaceId, directoryName, sessionId: operation.sessionId ?? '' };
22
- }
23
- function current(state, task) {
24
- return task.record.generation === state.config.generation && task.record.runtimeEpoch === state.runtimeEpoch;
25
- }
26
- async function update(state, task, patch, root) {
27
- task.record = { ...task.record, ...patch, updatedAt: now() };
28
- await writePrivateParameterTask(state, task, root);
29
- return task.record;
30
- }
31
- async function inspectReport(root, task, snapshot) {
32
- const bytes = await readParameterAgentFile(root, task.record.reportPath, 1024 * 1024);
33
- let report;
34
- try {
35
- report = parameterAgentReportSchema.parse(JSON.parse(bytes.toString('utf8')));
36
- }
37
- catch {
38
- throw new ParameterAgentError('parameter_agent_report_invalid');
39
- }
40
- if (report.taskId !== task.record.taskId)
41
- throw new ParameterAgentError('parameter_agent_report_task_mismatch');
42
- const inputs = new Map(snapshot.sources.map(source => [source.path, source.sha256]));
43
- const declared = new Map(report.sources.map(source => [source.path, source.sha256]));
44
- for (const source of report.sources) {
45
- if (!inputs.has(source.path))
46
- throw new ParameterAgentError('parameter_agent_evidence_invalid');
47
- if (inputs.get(source.path) !== source.sha256)
48
- throw new ParameterAgentError('parameter_agent_report_stale');
49
- }
50
- for (const candidate of report.candidates) {
51
- for (const evidence of [...candidate.origins, ...candidate.consumers]) {
52
- if (!declared.has(evidence.path))
53
- throw new ParameterAgentError('parameter_agent_evidence_missing');
54
- const content = await readParameterAgentFile(root, evidence.path);
55
- if (!content.toString('utf8').trim() || (evidence.line && evidence.line > content.toString('utf8').split('\n').length))
56
- throw new ParameterAgentError('parameter_agent_evidence_invalid');
57
- }
58
- }
59
- return report;
60
- }
61
- export async function prepareParameterAgentTask(state, operation, value, root) {
62
- const request = parameterAgentTaskRequestSchema.parse(value);
63
- if (operation.kind !== 'session.turn' || operation.clientRequestId !== request.taskId)
64
- throw new ParameterAgentError('parameter_agent_task_identity_invalid');
65
- const owner = scope(state, operation);
66
- const existing = await readPrivateParameterTask(state, owner.workspaceId, owner.directoryName, request.taskId, root);
67
- if (existing && (existing.record.sessionId !== owner.sessionId || !current(state, existing) || stableStringify(existing.request) !== stableStringify(request)))
68
- throw new ParameterAgentError('parameter_agent_task_conflict');
69
- const document = await readWorkspaceParameters(root, state.journal.fileRevisions(revisionScope(state, operation.workspaceId, owner.directoryName)));
70
- if (request.sourceFingerprint && request.sourceFingerprint !== document.sourceFingerprint)
71
- throw new ParameterAgentError('parameter_source_conflict');
72
- let selected;
73
- if (request.candidate) {
74
- const parent = await readPrivateParameterTask(state, owner.workspaceId, owner.directoryName, request.candidate.taskId, root);
75
- if (!parent || !current(state, parent) || ['running', 'uncertain', 'interrupted'].includes(parent.record.status))
76
- throw new ParameterAgentError('parameter_agent_candidate_unavailable');
77
- const snapshot = await parameterInputSnapshot(root);
78
- const report = await inspectReport(root, parent, snapshot);
79
- selected = report.candidates.find(candidate => candidate.id === request.candidate.candidateId);
80
- if (!selected || !parent.record.sourceDigest || parent.record.sourceDigest !== snapshot.digest)
81
- throw new ParameterAgentError('parameter_agent_candidate_stale');
82
- }
83
- const initial = await parameterInputSnapshot(root);
84
- const timestamp = now();
85
- const task = existing ?? {
86
- request, initialDigest: initial.digest, instanceToken: state.instanceToken,
87
- record: { version: 1, taskId: request.taskId, action: request.action, ...(request.goal ? { goal: request.goal } : {}), ...owner, generation: state.config.generation, runtimeEpoch: state.runtimeEpoch, status: 'running', reportPath: reportPath(request.taskId), checks: [], createdAt: timestamp, updatedAt: timestamp },
88
- };
89
- if (!existing) {
90
- if ((await listPrivateParameterTaskIds(state, owner.workspaceId, owner.directoryName, root)).length >= 256)
91
- throw new ParameterAgentError('parameter_agent_task_limit');
92
- await writePrivateParameterTask(state, task, root);
93
- }
94
- const instructions = [
95
- PARAMETER_AGENT_PROTOCOL,
96
- `Platform task identity: ${JSON.stringify({ version: 1, taskId: request.taskId, action: request.action, reportPath: task.record.reportPath })}. Write only this exact report identity.`,
97
- request.action === 'discover' ? 'Discovery is read-only for business source/schema/data/manifest. Write only the requested development report. Discover actual useful candidates and consumer evidence; do not implement them yet.' : 'Complete the requested integration using existing engineering tools: reuse an existing equivalent field or implement declaration, valid defaults, sparse data semantics, labels, real production consumers and meaningful parameter tests. Leave precise blocked work if incomplete.',
98
- `User goal (task data): ${JSON.stringify(request.goal ?? '')}`,
99
- ...(selected ? [`Selected current candidate (reference data): ${JSON.stringify(selected)}`] : []),
100
- 'After finishing files, calculate current raw-file hashes and write the report. The platform will execute independent checks after this turn. Do not claim those checks already passed.',
101
- ].join('\n\n');
102
- return { instructions, task: task.record };
103
- }
104
- export async function finishParameterAgentTask(state, operation, status, error) {
105
- if (operation.kind !== 'session.turn' || !operation.sessionId || operation.directoryName === 'root' || !/^[a-f0-9-]{36}$/i.test(operation.clientRequestId))
106
- return;
107
- let owner;
108
- try {
109
- owner = scope(state, operation);
110
- }
111
- catch {
112
- return;
113
- }
114
- const task = await readPrivateParameterTask(state, owner.workspaceId, owner.directoryName, operation.clientRequestId);
115
- if (!task || !current(state, task) || task.record.sessionId !== owner.sessionId || !['running', 'uncertain'].includes(task.record.status))
116
- return;
117
- await update(state, task, { status: status === 'completed' ? 'reported' : status, error: error?.slice(0, 256) });
118
- }
119
- async function publicTask(state, task, root, snapshot) {
120
- if (!current(state, task))
121
- return { ...task.record, status: 'stale', error: 'parameter_agent_runtime_expired' };
122
- if (task.record.status === 'checking')
123
- return task.record;
124
- try {
125
- const report = await inspectReport(root, task, snapshot);
126
- if (task.record.sourceDigest && task.record.sourceDigest !== snapshot.digest)
127
- return { ...task.record, report, status: 'stale', error: 'parameter_agent_inputs_changed' };
128
- const bytes = await readParameterAgentFile(root, task.record.reportPath, 1024 * 1024);
129
- if (task.reportHash && task.reportHash !== parameterDigest(bytes))
130
- return { ...task.record, report, status: 'stale', error: 'parameter_agent_report_changed' };
131
- return { ...task.record, report };
132
- }
133
- catch (cause) {
134
- const code = errorCode(cause);
135
- if (code === 'ENOENT' && ['running', 'uncertain', 'interrupted', 'failed'].includes(task.record.status))
136
- return task.record;
137
- return { ...task.record, status: code === 'ENOENT' ? 'missing' : code === 'parameter_agent_report_stale' ? 'stale' : 'invalid', error: code === 'ENOENT' ? 'parameter_agent_report_missing' : code };
138
- }
139
- }
140
- export async function listParameterAgentTasks(state, workspaceId, directoryName, root) {
141
- if (directoryName === 'root')
142
- return [];
143
- const workspace = parameterTaskWorkspace(state, workspaceId);
144
- const ids = await listPrivateParameterTaskIds(state, workspace, directoryName, root);
145
- if (!ids.length)
146
- return [];
147
- const snapshot = await parameterInputSnapshot(root);
148
- const tasks = [];
149
- for (const id of ids) {
150
- let task = await readPrivateParameterTask(state, workspace, directoryName, id, root);
151
- if (task && ['running', 'uncertain'].includes(task.record.status) && current(state, task)) {
152
- const operation = state.journal.listOperations?.().map(item => item.operation).find(item => item.kind === 'session.turn'
153
- && item.clientRequestId === id && item.sessionId === task.record.sessionId
154
- && parameterTaskWorkspace(state, item.workspaceId) === workspace && (item.directoryName ?? 'basic') === directoryName);
155
- if (operation && ['completed', 'failed', 'interrupted', 'uncertain'].includes(operation.status)) {
156
- await finishParameterAgentTask(state, operation, operation.status, operation.error);
157
- task = await readPrivateParameterTask(state, workspace, directoryName, id, root);
158
- }
159
- }
160
- if (task && current(state, task) && task.instanceToken !== state.instanceToken) {
161
- if (task.record.status === 'checking') {
162
- await update(state, task, { status: 'needs-verification', receiptId: undefined, error: 'parameter_agent_check_interrupted' }, root);
163
- }
164
- else if (task.record.status === 'running') {
165
- await update(state, task, { status: 'uncertain', receiptId: undefined, error: 'parameter_agent_turn_unconfirmed_after_restart' }, root);
166
- }
167
- }
168
- if (task)
169
- tasks.push(await publicTask(state, task, root, snapshot));
170
- }
171
- return tasks.sort((left, right) => right.createdAt.localeCompare(left.createdAt));
172
- }
173
- function errorCode(cause) {
174
- return cause instanceof Error && 'code' in cause && typeof cause.code === 'string' ? cause.code : 'parameter_agent_verification_failed';
175
- }
176
- export async function verifyParameterAgentTask(state, operation, payload, root, options = {}) {
177
- if (operation.kind !== 'parameter.verify')
178
- throw new ParameterAgentError('parameter_agent_task_identity_invalid');
179
- const owner = scope(state, operation, false);
180
- const { taskId } = parameterAgentVerifyPayloadSchema.parse(payload);
181
- const task = await readPrivateParameterTask(state, owner.workspaceId, owner.directoryName, taskId, root);
182
- if (!task)
183
- throw new ParameterAgentError('parameter_agent_task_unknown');
184
- const instanceToken = state.instanceToken;
185
- const assertActive = () => {
186
- options.signal?.throwIfAborted();
187
- options.assertActive?.();
188
- if (!current(state, task) || state.journal.destroyed() || instanceToken !== state.instanceToken)
189
- throw new ParameterAgentError('parameter_agent_scope_expired');
190
- };
191
- assertActive();
192
- if (['running', 'uncertain', 'interrupted'].includes(task.record.status))
193
- throw new ParameterAgentError('parameter_agent_turn_not_completed');
194
- try {
195
- const before = await parameterInputSnapshot(root);
196
- const report = await inspectReport(root, task, before);
197
- task.record.report = report;
198
- task.reportHash = parameterDigest(await readParameterAgentFile(root, task.record.reportPath, 1024 * 1024));
199
- if (task.request.action === 'discover') {
200
- if (task.initialDigest !== before.digest)
201
- throw new ParameterAgentError('parameter_agent_discovery_modified_sources');
202
- assertActive();
203
- if ((await parameterInputSnapshot(root)).digest !== before.digest || parameterDigest(await readParameterAgentFile(root, task.record.reportPath, 1024 * 1024)) !== task.reportHash)
204
- throw new ParameterAgentError('parameter_agent_inputs_changed');
205
- return update(state, task, { status: 'candidates', sourceDigest: before.digest, checks: [], error: undefined, receiptId: undefined }, root);
206
- }
207
- const document = await readWorkspaceParameters(root, state.journal.fileRevisions(revisionScope(state, operation.workspaceId, owner.directoryName)));
208
- if (document.status !== 'ready')
209
- throw new ParameterAgentError('parameter_agent_parameters_not_ready');
210
- const catalog = parameterCatalog(document.schema, document.data);
211
- const implemented = report.candidates.filter(candidate => candidate.status === 'implemented');
212
- if (!implemented.length || report.candidates.some(candidate => candidate.status !== 'implemented' || candidate.missing.length))
213
- throw new ParameterAgentError('parameter_agent_integration_incomplete');
214
- const evidence = new Set(report.sources.map(source => source.path));
215
- for (const path of [document.schemaPath, document.dataPath, document.platformI18nPath, 'package.json']) {
216
- if (path && !evidence.has(path))
217
- throw new ParameterAgentError('parameter_agent_evidence_missing');
218
- }
219
- for (const candidate of implemented) {
220
- const field = catalog.find(entry => candidate.fieldPath && entry.key === candidate.fieldPath.join('.'));
221
- if (!field || !field.editable || !field.canReset)
222
- throw new ParameterAgentError('parameter_agent_field_not_ready');
223
- if (field.hasOverride && validateParameterChange(document.schema, document.data, { fieldPath: field.fieldPath, value: field.value }))
224
- throw new ParameterAgentError('parameter_agent_field_not_ready');
225
- if (!candidate.consumers.length)
226
- throw new ParameterAgentError('parameter_agent_consumer_missing');
227
- }
228
- const packageData = JSON.parse((await readParameterAgentFile(root, 'package.json')).toString('utf8'));
229
- for (const script of ['test:parameters', 'build']) {
230
- if (typeof packageData.scripts?.[script] !== 'string' || !packageData.scripts[script].trim())
231
- throw new ParameterAgentError('parameter_agent_check_script_missing');
232
- }
233
- task.instanceToken = state.instanceToken;
234
- await update(state, task, { status: 'checking', checks: [], error: undefined, receiptId: undefined, sourceDigest: before.digest }, root);
235
- const scripts = ['test:parameters', 'build', ...(typeof packageData.scripts?.typecheck === 'string' ? ['typecheck'] : [])];
236
- for (const script of scripts) {
237
- assertActive();
238
- const controller = new AbortController();
239
- const abort = () => controller.abort();
240
- options.signal?.addEventListener('abort', abort, { once: true });
241
- let activityError;
242
- const timer = setInterval(() => { try {
243
- assertActive();
244
- }
245
- catch (error) {
246
- activityError = error;
247
- controller.abort();
248
- } }, 200);
249
- const startedAt = now();
250
- const chunks = [];
251
- let outputSize = 0;
252
- let outcome;
253
- try {
254
- outcome = await (options.runCommand ?? runDeveloperCommand)(state, {
255
- processId: `parameter-check-${taskId}-${script.replace(':', '-')}`, cwd: root,
256
- command: `pnpm run ${script}`, timeoutMs: options.timeoutMs ?? (script === 'build' ? 300_000 : 120_000), signal: controller.signal,
257
- onOutput(chunk) { const bytes = Buffer.from(chunk); outputSize += bytes.length; if (outputSize <= 1024 * 1024)
258
- chunks.push(bytes); },
259
- });
260
- }
261
- finally {
262
- clearInterval(timer);
263
- options.signal?.removeEventListener('abort', abort);
264
- }
265
- if (activityError)
266
- throw activityError;
267
- assertActive();
268
- task.record.checks.push({ script: script, code: outcome.code ?? null, timedOut: outcome.timedOut, ...(outcome.canceled ? { canceled: true } : {}), logDigest: parameterDigest(Buffer.concat(chunks)), startedAt, finishedAt: now() });
269
- await writePrivateParameterTask(state, task, root);
270
- if (outcome.code !== 0 || outcome.timedOut || outcome.canceled)
271
- throw new ParameterAgentError(outcome.timedOut ? 'parameter_agent_check_timeout' : outcome.canceled ? 'parameter_agent_check_canceled' : 'parameter_agent_check_failed');
272
- }
273
- assertActive();
274
- const after = await parameterInputSnapshot(root);
275
- if (after.digest !== before.digest || parameterDigest(await readParameterAgentFile(root, task.record.reportPath, 1024 * 1024)) !== task.reportHash)
276
- throw new ParameterAgentError('parameter_agent_inputs_changed');
277
- return update(state, task, { status: 'verified', sourceDigest: after.digest, receiptId: randomUUID(), error: undefined }, root);
278
- }
279
- catch (cause) {
280
- const code = errorCode(cause);
281
- const status = code === 'ENOENT' ? 'missing' : /stale|changed|expired/.test(code) ? 'stale' : /(?:not_ready|incomplete|consumer_missing|script_missing|evidence_missing)$/.test(code) ? 'needs-verification' : /report_|evidence_invalid|path_invalid/.test(code) ? 'invalid' : 'failed';
282
- return update(state, task, { status, error: code === 'ENOENT' ? 'parameter_agent_report_missing' : code, receiptId: undefined }, root);
283
- }
284
- }