@playcraft/cli 0.1.50-beta → 0.1.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/README.md +3 -62
  2. package/dist/agent/local-backend.js +1 -1
  3. package/dist/cli-root-help.js +0 -2
  4. package/dist/commands/build-all.js +19 -5
  5. package/dist/commands/build.js +28 -15
  6. package/dist/commands/create.js +33 -26
  7. package/dist/commands/image.js +6 -2
  8. package/dist/commands/login.js +42 -84
  9. package/dist/commands/skills.js +0 -4
  10. package/dist/commands/tools-3d.js +0 -11
  11. package/dist/commands/tools-generation.js +137 -69
  12. package/dist/commands/tools-image-context.js +29 -0
  13. package/dist/commands/tools-utils.js +12 -0
  14. package/dist/commands/tools.js +2 -2
  15. package/dist/config.js +4 -59
  16. package/dist/index.js +3 -40
  17. package/dist/remix/clone.js +0 -2
  18. package/dist/remix/init-template.js +0 -2
  19. package/dist/remix/pull.js +0 -2
  20. package/dist/remix/push.js +1 -21
  21. package/dist/utils/agent-api-client.js +30 -210
  22. package/dist/utils/image-asset-context.js +228 -0
  23. package/dist/utils/playcraft-http-client.js +4 -6
  24. package/package.json +5 -15
  25. package/project-template/.claude/agents/refs/ta-image-generation-detail.md +67 -123
  26. package/project-template/.claude/skills/playcraft-image-generation/SKILL.md +135 -63
  27. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +42 -33
  28. package/project-template/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +18 -20
  29. package/project-template/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +6 -7
  30. package/project-template/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -39
  31. package/project-templates/phaser/.claude/agents/refs/ta-image-generation-detail.md +59 -59
  32. package/project-templates/phaser/.claude/skills/playcraft-image-generation/SKILL.md +135 -63
  33. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +42 -33
  34. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +18 -20
  35. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +6 -7
  36. package/project-templates/phaser/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -39
  37. package/project-templates/threejs/.claude/agents/refs/ta-image-generation-detail.md +59 -59
  38. package/project-templates/threejs/.claude/skills/playcraft-image-generation/SKILL.md +135 -63
  39. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +42 -33
  40. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +18 -20
  41. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +6 -7
  42. package/project-templates/threejs/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +39 -39
  43. package/SKILLS_REGISTRY.md +0 -149
  44. package/dist/auth/account-activation.js +0 -157
  45. package/dist/auth/messages.js +0 -30
  46. package/dist/commands/build-temp.js +0 -26
  47. package/dist/commands/platform-skills.generated.js +0 -19
  48. package/dist/commands/playable.js +0 -53
  49. package/dist/commands/tools-batch.js +0 -113
  50. package/dist/commands/video.js +0 -122
  51. package/dist/commands/workspace-runtime.js +0 -54
  52. package/dist/commands/workspace.js +0 -40
  53. package/dist/project-skills/builtin-import.js +0 -225
  54. package/dist/project-skills/commands.js +0 -77
  55. package/dist/project-skills/lifecycle.js +0 -28
  56. package/dist/project-skills/local-run.js +0 -112
  57. package/dist/project-skills/local-store.js +0 -221
  58. package/dist/project-skills/messages.js +0 -80
  59. package/dist/project-skills/reconcile.js +0 -62
  60. package/dist/project-skills/remote-cache.js +0 -51
  61. package/dist/project-skills/validation.js +0 -19
  62. package/dist/recording/messages.js +0 -40
  63. package/dist/recording/project-digest.js +0 -85
  64. package/dist/recording/recorder.js +0 -293
  65. package/dist/recording/scenario.js +0 -50
  66. package/dist/skill-registry/client.js +0 -345
  67. package/dist/skill-registry/commands.js +0 -180
  68. package/dist/skill-registry/evaluation-client.js +0 -156
  69. package/dist/skill-registry/evaluation-commands.js +0 -174
  70. package/dist/skill-registry/messages.js +0 -177
  71. package/dist/skill-registry/package.js +0 -275
  72. package/dist/skill-registry/platform-package.js +0 -100
  73. package/dist/utils/environment-endpoints.js +0 -17
  74. package/dist/utils/error-diagnostics.js +0 -20
  75. package/dist/utils/tool-operation-journal.js +0 -124
  76. package/dist/utils/video-evidence-git.js +0 -81
  77. package/dist/video-replication/client.js +0 -234
  78. package/dist/video-replication/comparison-evidence.js +0 -149
  79. package/dist/video-replication/comparison-files.js +0 -57
  80. package/dist/video-replication/comparison-log.js +0 -72
  81. package/dist/video-replication/comparison-messages.js +0 -104
  82. package/dist/video-replication/comparison-output.js +0 -63
  83. package/dist/video-replication/comparison-preflight.js +0 -66
  84. package/dist/video-replication/comparison.js +0 -230
  85. package/dist/video-replication/diagnostics.js +0 -41
  86. package/dist/video-replication/evidence.js +0 -165
  87. package/dist/video-replication/media.js +0 -112
  88. package/dist/video-replication/messages.js +0 -97
  89. package/dist/workspace/messages.js +0 -67
  90. package/dist/workspace/transfer-client.js +0 -233
  91. package/dist/workspace/transfer-errors.js +0 -48
  92. package/dist/workspace-runtime/batch/content-changes.js +0 -30
  93. package/dist/workspace-runtime/batch/control.js +0 -86
  94. package/dist/workspace-runtime/batch/deliver.js +0 -173
  95. package/dist/workspace-runtime/batch/freeze.js +0 -101
  96. package/dist/workspace-runtime/batch/generate.js +0 -249
  97. package/dist/workspace-runtime/batch/git.js +0 -40
  98. package/dist/workspace-runtime/batch/occupancy.js +0 -8
  99. package/dist/workspace-runtime/batch/policy.js +0 -70
  100. package/dist/workspace-runtime/batch/prepare.js +0 -317
  101. package/dist/workspace-runtime/batch/processes.js +0 -72
  102. package/dist/workspace-runtime/batch/records.js +0 -113
  103. package/dist/workspace-runtime/batch/routes.js +0 -61
  104. package/dist/workspace-runtime/batch/source-candidate.js +0 -86
  105. package/dist/workspace-runtime/batch/source-capture.js +0 -146
  106. package/dist/workspace-runtime/batch/source-failure.js +0 -43
  107. package/dist/workspace-runtime/batch/source-publish.js +0 -130
  108. package/dist/workspace-runtime/codex/app-server.js +0 -1065
  109. package/dist/workspace-runtime/codex/compact.js +0 -46
  110. package/dist/workspace-runtime/codex/config-toml.js +0 -107
  111. package/dist/workspace-runtime/codex/delivery-tools.js +0 -144
  112. package/dist/workspace-runtime/codex/jsonrpc-stdio.js +0 -145
  113. package/dist/workspace-runtime/codex/launcher-client.js +0 -177
  114. package/dist/workspace-runtime/codex/loopback.js +0 -146
  115. package/dist/workspace-runtime/codex/mcp-config.js +0 -39
  116. package/dist/workspace-runtime/codex/model-broker.js +0 -263
  117. package/dist/workspace-runtime/codex/native-adapter.js +0 -9
  118. package/dist/workspace-runtime/codex/permissions.js +0 -79
  119. package/dist/workspace-runtime/codex/thread-image.js +0 -38
  120. package/dist/workspace-runtime/codex/tool-response.js +0 -10
  121. package/dist/workspace-runtime/codex/ui-instructions.js +0 -4
  122. package/dist/workspace-runtime/codex/ui-tools.js +0 -203
  123. package/dist/workspace-runtime/codex/work-mode.js +0 -15
  124. package/dist/workspace-runtime/main.js +0 -10
  125. package/dist/workspace-runtime/persistence/journal.js +0 -365
  126. package/dist/workspace-runtime/persistence/native-subagents.js +0 -162
  127. package/dist/workspace-runtime/persistence/sqlite-client.js +0 -77
  128. package/dist/workspace-runtime/persistence/sqlite-worker.js +0 -1161
  129. package/dist/workspace-runtime/persistence/stopped-execution.js +0 -77
  130. package/dist/workspace-runtime/previews/diagnostics.js +0 -44
  131. package/dist/workspace-runtime/previews/output.js +0 -36
  132. package/dist/workspace-runtime/previews/publish.js +0 -283
  133. package/dist/workspace-runtime/previews/runtime-preview.js +0 -177
  134. package/dist/workspace-runtime/previews/single-file.js +0 -43
  135. package/dist/workspace-runtime/processes/managed-writes.js +0 -69
  136. package/dist/workspace-runtime/serve.js +0 -441
  137. package/dist/workspace-runtime/server/accept-operation.js +0 -61
  138. package/dist/workspace-runtime/server/asset-transfers.js +0 -63
  139. package/dist/workspace-runtime/server/auth.js +0 -21
  140. package/dist/workspace-runtime/server/connectivity.js +0 -209
  141. package/dist/workspace-runtime/server/desktop-host.js +0 -429
  142. package/dist/workspace-runtime/server/desktop-preview-config.js +0 -81
  143. package/dist/workspace-runtime/server/desktop-preview-service.js +0 -157
  144. package/dist/workspace-runtime/server/desktop-preview-static.js +0 -53
  145. package/dist/workspace-runtime/server/desktop-preview.js +0 -189
  146. package/dist/workspace-runtime/server/dispatch.js +0 -1632
  147. package/dist/workspace-runtime/server/endpoints.js +0 -21
  148. package/dist/workspace-runtime/server/execution-group.js +0 -90
  149. package/dist/workspace-runtime/server/http.js +0 -1340
  150. package/dist/workspace-runtime/server/lock.js +0 -53
  151. package/dist/workspace-runtime/server/operation-record.js +0 -33
  152. package/dist/workspace-runtime/server/rfb-watch-gate.js +0 -168
  153. package/dist/workspace-runtime/server/session-restore.js +0 -84
  154. package/dist/workspace-runtime/server/source-uploader.js +0 -138
  155. package/dist/workspace-runtime/server/submit-operation.js +0 -41
  156. package/dist/workspace-runtime/server/terminal-host.js +0 -366
  157. package/dist/workspace-runtime/server/types.js +0 -1
  158. package/dist/workspace-runtime/server/workspace-transfer.js +0 -168
  159. package/dist/workspace-runtime/verify-artifact.js +0 -59
  160. package/dist/workspace-runtime/workspaces/append-only-log.js +0 -62
  161. package/dist/workspace-runtime/workspaces/archive.js +0 -207
  162. package/dist/workspace-runtime/workspaces/artifact-events.js +0 -55
  163. package/dist/workspace-runtime/workspaces/artifact-files.js +0 -199
  164. package/dist/workspace-runtime/workspaces/artifact-receipts.js +0 -89
  165. package/dist/workspace-runtime/workspaces/artifacts.js +0 -282
  166. package/dist/workspace-runtime/workspaces/asset-library-import.js +0 -366
  167. package/dist/workspace-runtime/workspaces/asset-transfer-dependencies.js +0 -81
  168. package/dist/workspace-runtime/workspaces/asset-transfer-publish.js +0 -434
  169. package/dist/workspace-runtime/workspaces/asset-transfer-storage.js +0 -389
  170. package/dist/workspace-runtime/workspaces/attachment-content.js +0 -73
  171. package/dist/workspace-runtime/workspaces/attachments.js +0 -185
  172. package/dist/workspace-runtime/workspaces/batch-commit.js +0 -142
  173. package/dist/workspace-runtime/workspaces/binary-content.js +0 -65
  174. package/dist/workspace-runtime/workspaces/binary-write.js +0 -112
  175. package/dist/workspace-runtime/workspaces/cli-context.js +0 -23
  176. package/dist/workspace-runtime/workspaces/cli-credentials.js +0 -115
  177. package/dist/workspace-runtime/workspaces/composer-context.js +0 -147
  178. package/dist/workspace-runtime/workspaces/context-error.js +0 -2
  179. package/dist/workspace-runtime/workspaces/delivery-build.js +0 -331
  180. package/dist/workspace-runtime/workspaces/delivery-store.js +0 -168
  181. package/dist/workspace-runtime/workspaces/delivery.js +0 -64
  182. package/dist/workspace-runtime/workspaces/dependencies.js +0 -279
  183. package/dist/workspace-runtime/workspaces/developer-command.js +0 -98
  184. package/dist/workspace-runtime/workspaces/directories.js +0 -132
  185. package/dist/workspace-runtime/workspaces/directory-access.js +0 -37
  186. package/dist/workspace-runtime/workspaces/directory-attachments.js +0 -245
  187. package/dist/workspace-runtime/workspaces/directory-create.js +0 -57
  188. package/dist/workspace-runtime/workspaces/directory-maintenance.js +0 -111
  189. package/dist/workspace-runtime/workspaces/directory-mutations.js +0 -238
  190. package/dist/workspace-runtime/workspaces/directory-revisions.js +0 -56
  191. package/dist/workspace-runtime/workspaces/directory-stats.js +0 -49
  192. package/dist/workspace-runtime/workspaces/disk-snapshot.js +0 -31
  193. package/dist/workspace-runtime/workspaces/empty-template.js +0 -42
  194. package/dist/workspace-runtime/workspaces/file-content.js +0 -48
  195. package/dist/workspace-runtime/workspaces/files-search.js +0 -116
  196. package/dist/workspace-runtime/workspaces/files.js +0 -150
  197. package/dist/workspace-runtime/workspaces/git-credential-broker.js +0 -312
  198. package/dist/workspace-runtime/workspaces/git-credential-helper.js +0 -68
  199. package/dist/workspace-runtime/workspaces/git-direct-store.js +0 -155
  200. package/dist/workspace-runtime/workspaces/git.js +0 -670
  201. package/dist/workspace-runtime/workspaces/instructions.js +0 -56
  202. package/dist/workspace-runtime/workspaces/json5-edit.js +0 -313
  203. package/dist/workspace-runtime/workspaces/library-attachments.js +0 -268
  204. package/dist/workspace-runtime/workspaces/operation-log.js +0 -23
  205. package/dist/workspace-runtime/workspaces/optional-platform-skills.js +0 -14
  206. package/dist/workspace-runtime/workspaces/parameter-agent-inputs.js +0 -87
  207. package/dist/workspace-runtime/workspaces/parameter-agent-protocol.js +0 -29
  208. package/dist/workspace-runtime/workspaces/parameter-agent-store.js +0 -58
  209. package/dist/workspace-runtime/workspaces/parameter-agent.js +0 -282
  210. package/dist/workspace-runtime/workspaces/parameters.js +0 -295
  211. package/dist/workspace-runtime/workspaces/prepare.js +0 -278
  212. package/dist/workspace-runtime/workspaces/registry.js +0 -251
  213. package/dist/workspace-runtime/workspaces/remix-references.js +0 -301
  214. package/dist/workspace-runtime/workspaces/revisions.js +0 -31
  215. package/dist/workspace-runtime/workspaces/session-image.js +0 -104
  216. package/dist/workspace-runtime/workspaces/shared-git.js +0 -40
  217. package/dist/workspace-runtime/workspaces/skill-artifact-loader.js +0 -95
  218. package/dist/workspace-runtime/workspaces/skills.js +0 -191
  219. package/dist/workspace-runtime/workspaces/transfer-quota.js +0 -69
  220. package/dist/workspace-runtime/workspaces/transfer.js +0 -471
  221. package/dist/workspace-runtime/workspaces/turn-changes.js +0 -75
  222. package/dist/workspace-runtime/workspaces/video-attachments.js +0 -49
  223. package/project-template/.claude/skills/playcraft-replica-validation/SKILL.md +0 -25
  224. package/project-template/.claude/skills/playcraft-replica-validation/references/contracts.md +0 -79
  225. package/project-template/.claude/skills/playcraft-video-understanding/SKILL.md +0 -29
  226. package/project-template/.claude/skills/playcraft-video-understanding/references/contracts.md +0 -37
  227. package/project-template-v2/.claude/agents/artist.md +0 -82
  228. package/project-template-v2/.claude/agents/developer.md +0 -153
  229. package/project-template-v2/.claude/agents/game-designer.md +0 -264
  230. package/project-template-v2/.claude/agents/refs/artist-art-style-catalog.md +0 -533
  231. package/project-template-v2/.claude/agents/refs/artist-color-audio-recipes.md +0 -153
  232. package/project-template-v2/.claude/agents/refs/artist-dimension-axis.md +0 -27
  233. package/project-template-v2/.claude/agents/refs/artist-master-composite-recipes.md +0 -208
  234. package/project-template-v2/.claude/agents/refs/atom-skill-library.md +0 -81
  235. package/project-template-v2/.claude/agents/refs/developer-impl-cookbook.md +0 -432
  236. package/project-template-v2/.claude/agents/refs/framework-5-component-filter.md +0 -252
  237. package/project-template-v2/.claude/agents/refs/framework-game-feel-juice.md +0 -266
  238. package/project-template-v2/.claude/agents/refs/framework-mda.md +0 -147
  239. package/project-template-v2/.claude/agents/refs/game-designer-gameplay-sufficiency.md +0 -123
  240. package/project-template-v2/.claude/agents/refs/ta-3d-flip-recipe.md +0 -88
  241. package/project-template-v2/.claude/agents/refs/ta-atlas-deliverable-standard.md +0 -67
  242. package/project-template-v2/.claude/agents/refs/ta-batch-pipeline-recipes.md +0 -120
  243. package/project-template-v2/.claude/agents/refs/ta-image-generation-detail.md +0 -300
  244. package/project-template-v2/.claude/agents/refs/ta-image-ops-reference.md +0 -495
  245. package/project-template-v2/.claude/agents/refs/ta-pipeline-cookbook.md +0 -1141
  246. package/project-template-v2/.claude/agents/refs/ta-tools-reference.md +0 -111
  247. package/project-template-v2/.claude/agents/refs/ta-vfx-preset-catalog.md +0 -365
  248. package/project-template-v2/.claude/agents/refs/threejs-cannon-pitfalls.md +0 -412
  249. package/project-template-v2/.claude/agents/reviewer.md +0 -75
  250. package/project-template-v2/.claude/agents/technical-artist.md +0 -86
  251. package/project-template-v2/.claude/hooks/snapshot-milestone.mjs +0 -243
  252. package/project-template-v2/.claude/hooks/user-prompt.mjs +0 -133
  253. package/project-template-v2/.claude/settings.json +0 -33
  254. package/project-template-v2/.claude/skills/brainstorming/SKILL.md +0 -161
  255. package/project-template-v2/.claude/skills/brainstorming/scripts/frame-template.html +0 -270
  256. package/project-template-v2/.claude/skills/brainstorming/scripts/helper.js +0 -177
  257. package/project-template-v2/.claude/skills/brainstorming/scripts/server.cjs +0 -354
  258. package/project-template-v2/.claude/skills/brainstorming/scripts/start-server.sh +0 -148
  259. package/project-template-v2/.claude/skills/brainstorming/scripts/stop-server.sh +0 -56
  260. package/project-template-v2/.claude/skills/brainstorming/scripts/wait-for-selection.sh +0 -62
  261. package/project-template-v2/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
  262. package/project-template-v2/.claude/skills/brainstorming/visual-companion.md +0 -309
  263. package/project-template-v2/.claude/skills/playcraft-ad-psychology/SKILL.md +0 -182
  264. package/project-template-v2/.claude/skills/playcraft-art-style-guide/SKILL.md +0 -123
  265. package/project-template-v2/.claude/skills/playcraft-asset-state-sheet/SKILL.md +0 -205
  266. package/project-template-v2/.claude/skills/playcraft-audio-generation/SKILL.md +0 -280
  267. package/project-template-v2/.claude/skills/playcraft-batch-pipeline/SKILL.md +0 -184
  268. package/project-template-v2/.claude/skills/playcraft-build-optimizer/SKILL.md +0 -306
  269. package/project-template-v2/.claude/skills/playcraft-image-generation/SKILL.md +0 -298
  270. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +0 -123
  271. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +0 -254
  272. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +0 -324
  273. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +0 -97
  274. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +0 -118
  275. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +0 -137
  276. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +0 -397
  277. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +0 -296
  278. package/project-template-v2/.claude/skills/playcraft-image-ops/SKILL.md +0 -122
  279. package/project-template-v2/.claude/skills/playcraft-image-processing/SKILL.md +0 -219
  280. package/project-template-v2/.claude/skills/playcraft-masking/SKILL.md +0 -373
  281. package/project-template-v2/.claude/skills/playcraft-playable-optimization/SKILL.md +0 -161
  282. package/project-template-v2/.claude/skills/playcraft-research/SKILL.md +0 -215
  283. package/project-template-v2/.claude/skills/playcraft-skill-recommender/SKILL.md +0 -382
  284. package/project-template-v2/.claude/skills/playcraft-sprite-generation/SKILL.md +0 -423
  285. package/project-template-v2/.claude/skills/playcraft-sprite-remix/SKILL.md +0 -158
  286. package/project-template-v2/.claude/skills/playcraft-sprite-sheet/SKILL.md +0 -100
  287. package/project-template-v2/.claude/skills/playcraft-storyboard/SKILL.md +0 -167
  288. package/project-template-v2/.claude/skills/playcraft-style-qa/SKILL.md +0 -270
  289. package/project-template-v2/.claude/skills/playcraft-text-rendering/SKILL.md +0 -236
  290. package/project-template-v2/.claude/skills/playcraft-vfx-animation/SKILL.md +0 -130
  291. package/project-template-v2/.claude/skills/playwright-cli/SKILL.md +0 -390
  292. package/project-template-v2/.claude/skills/playwright-cli/references/element-attributes.md +0 -23
  293. package/project-template-v2/.claude/skills/playwright-cli/references/playwright-tests.md +0 -39
  294. package/project-template-v2/.claude/skills/playwright-cli/references/request-mocking.md +0 -87
  295. package/project-template-v2/.claude/skills/playwright-cli/references/running-code.md +0 -240
  296. package/project-template-v2/.claude/skills/playwright-cli/references/session-management.md +0 -226
  297. package/project-template-v2/.claude/skills/playwright-cli/references/spec-driven-testing.md +0 -308
  298. package/project-template-v2/.claude/skills/playwright-cli/references/storage-state.md +0 -275
  299. package/project-template-v2/.claude/skills/playwright-cli/references/test-generation.md +0 -134
  300. package/project-template-v2/.claude/skills/playwright-cli/references/tracing.md +0 -142
  301. package/project-template-v2/.claude/skills/playwright-cli/references/video-recording.md +0 -153
  302. package/project-template-v2/.claude/skills/session-analyzer/SKILL.md +0 -386
  303. package/project-template-v2/.claude/skills/session-analyzer/scripts/execution-breakdown.mjs +0 -182
  304. package/project-template-v2/.claude/skills/session-analyzer/scripts/find-turns.mjs +0 -72
  305. package/project-template-v2/.claude/skills/session-analyzer/scripts/heavy-output.mjs +0 -121
  306. package/project-template-v2/.claude/skills/session-analyzer/scripts/resolve-session.mjs +0 -102
  307. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-stats.mjs +0 -127
  308. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-tool-timeline.mjs +0 -106
  309. package/project-template-v2/.claude/skills/session-analyzer/scripts/time-gaps.mjs +0 -128
  310. package/project-template-v2/.claude/skills/session-analyzer/scripts/turn-timeline.mjs +0 -67
  311. package/project-template-v2/.claude/snapshot.mjs +0 -263
  312. package/project-template-v2/.playcraft/skills.lock.json +0 -152
  313. package/project-template-v2/CLAUDE.md +0 -146
  314. package/project-template-v2/assets/audio/bgm/.gitkeep +0 -0
  315. package/project-template-v2/assets/audio/sfx/.gitkeep +0 -0
  316. package/project-template-v2/assets/bundles/.gitkeep +0 -0
  317. package/project-template-v2/assets/images/bg/.gitkeep +0 -0
  318. package/project-template-v2/assets/images/reference/.gitkeep +0 -0
  319. package/project-template-v2/assets/images/storyboard/.gitkeep +0 -0
  320. package/project-template-v2/assets/images/tiles/.gitkeep +0 -0
  321. package/project-template-v2/assets/images/ui/.gitkeep +0 -0
  322. package/project-template-v2/assets/images/vfx/.gitkeep +0 -0
  323. package/project-template-v2/assets/models/.gitkeep +0 -0
  324. package/project-template-v2/docs/harness/iteration-1/context-flow.md +0 -254
  325. package/project-template-v2/docs/harness/iteration-1/generate-flow.md +0 -91
  326. package/project-template-v2/docs/harness/iteration-1/ideate-flow.md +0 -214
  327. package/project-template-v2/docs/harness/iteration-1/optimize-flow.md +0 -75
  328. package/project-template-v2/docs/harness/iteration-1/wrapup-flow.md +0 -63
  329. package/project-template-v2/docs/harness/iteration-2/context-flow.md +0 -223
  330. package/project-template-v2/docs/harness/iteration-2/generate-flow.md +0 -129
  331. package/project-template-v2/docs/harness/iteration-2/ideate-flow.md +0 -267
  332. package/project-template-v2/docs/harness/iteration-2/optimize-flow.md +0 -164
  333. package/project-template-v2/docs/harness/iteration-2/wrapup-flow.md +0 -115
  334. package/project-template-v2/docs/harness/orchestrator-flow.md +0 -364
  335. package/project-template-v2/docs/project-state.json +0 -60
  336. package/project-template-v2/docs/project-state.md +0 -72
  337. package/project-template-v2/docs/standards/README.md +0 -225
  338. package/project-template-v2/docs/standards/agent-behavior-standards.md +0 -174
  339. package/project-template-v2/docs/standards/artifacts/design-brief.md +0 -19
  340. package/project-template-v2/docs/standards/artifacts/design.md +0 -22
  341. package/project-template-v2/docs/standards/artifacts/game-code.md +0 -41
  342. package/project-template-v2/docs/standards/artifacts/todo-list.md +0 -41
  343. package/project-template-v2/docs/standards/iter1-agent-behavior-standards.md +0 -343
  344. package/project-template-v2/game/index.ts +0 -18
  345. package/project-template-v2/globals.d.ts +0 -51
  346. package/project-template-v2/index.css +0 -34
  347. package/project-template-v2/index.html +0 -18
  348. package/project-template-v2/main.ts +0 -9
  349. package/project-template-v2/package.json +0 -46
  350. package/project-template-v2/skills/_shared/scripts/dispatch-clear.mjs +0 -31
  351. package/project-template-v2/skills/_shared/scripts/dispatch-set.mjs +0 -86
  352. package/project-template-v2/skills/_shared/scripts/dod-check.mjs +0 -153
  353. package/project-template-v2/skills/_shared/scripts/handoff-append.mjs +0 -70
  354. package/project-template-v2/skills/_shared/scripts/lib/validator-artifacts.mjs +0 -91
  355. package/project-template-v2/skills/_shared/scripts/pipeline/dod-config.mjs +0 -131
  356. package/project-template-v2/skills/_shared/scripts/pipeline/index.mjs +0 -80
  357. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-1-core.mjs +0 -90
  358. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-2-wrap.mjs +0 -93
  359. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-3-visual.mjs +0 -23
  360. package/project-template-v2/skills/_shared/scripts/render-project-state.mjs +0 -230
  361. package/project-template-v2/skills/_shared/scripts/state-advance-stage.mjs +0 -58
  362. package/project-template-v2/skills/_shared/scripts/state-get.mjs +0 -339
  363. package/project-template-v2/skills/_shared/scripts/state-handoff.mjs +0 -39
  364. package/project-template-v2/skills/_shared/scripts/state-set.mjs +0 -94
  365. package/project-template-v2/skills/_shared/scripts/state-store.mjs +0 -783
  366. package/project-template-v2/skills/_shared/scripts/todo-add.mjs +0 -88
  367. package/project-template-v2/skills/_shared/scripts/todo-get.mjs +0 -130
  368. package/project-template-v2/skills/_shared/scripts/todo-remove.mjs +0 -33
  369. package/project-template-v2/skills/_shared/scripts/todo-set.mjs +0 -47
  370. package/project-template-v2/skills/_shared/scripts/verify-asset-code-sync.mjs +0 -268
  371. package/project-template-v2/skills/_shared/scripts/verify-env.mjs +0 -285
  372. package/project-template-v2/skills/_shared/scripts/verify-placeholders.mjs +0 -161
  373. package/project-template-v2/skills/playable-autoplay/SKILL.md +0 -176
  374. package/project-template-v2/skills/playable-autoplay/agents/openai.yaml +0 -4
  375. package/project-template-v2/skills/playable-debug/SKILL.md +0 -116
  376. package/project-template-v2/skills/playable-debug/agents/openai.yaml +0 -4
  377. package/project-template-v2/skills/playable-debug/references/debug-config.md +0 -40
  378. package/project-template-v2/skills/playable-record/SKILL.md +0 -140
  379. package/project-template-v2/skills/playable-record/scripts/lib/dev-server.mjs +0 -104
  380. package/project-template-v2/skills/playable-record/scripts/lib/record-audio-bridge.js +0 -141
  381. package/project-template-v2/skills/playable-record/scripts/record-playable.mjs +0 -425
  382. package/project-template-v2/skills/playable-record/scripts/verify-contract.mjs +0 -261
  383. package/project-template-v2/skills/playable-record/scripts/verify-firstwin.mjs +0 -398
  384. package/project-template-v2/skills/playable-record/scripts/verify-fusion.mjs +0 -322
  385. package/project-template-v2/skills/playable-record/scripts/verify-lifecycle.mjs +0 -105
  386. package/project-template-v2/skills/playable-record/scripts/verify-vlm-video.mjs +0 -230
  387. package/project-template-v2/skills/playable-validate/SKILL.md +0 -61
  388. package/project-template-v2/skills/playable-validate/validation-rules.md +0 -14
  389. package/project-template-v2/skills/playable-verify-ui/SKILL.md +0 -63
  390. package/project-template-v2/skills/playable-verify-ui/scripts/lib/__init__.py +0 -1
  391. package/project-template-v2/skills/playable-verify-ui/scripts/lib/config_expr.js +0 -218
  392. package/project-template-v2/skills/playable-verify-ui/scripts/lib/node_utils.js +0 -51
  393. package/project-template-v2/skills/playable-verify-ui/scripts/lib/profile_loader.py +0 -59
  394. package/project-template-v2/skills/playable-verify-ui/scripts/lib/report.py +0 -106
  395. package/project-template-v2/skills/playable-verify-ui/scripts/lib/runtime_contract.js +0 -116
  396. package/project-template-v2/skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py +0 -59
  397. package/project-template-v2/skills/playable-verify-ui/scripts/verify_hardcoded_layout.js +0 -64
  398. package/project-template-v2/skills/playable-verify-ui/scripts/verify_runtime_contract.js +0 -58
  399. package/project-template-v2/skills/playable-verify-ui/scripts/verify_text_overlap.py +0 -333
  400. package/project-template-v2/ta-workspace/scripts/.gitkeep +0 -0
  401. package/project-template-v2/tsconfig.json +0 -20
  402. package/project-template-v2/vite.config.ts +0 -27
  403. package/project-templates/batch-locks/phaser.yaml +0 -922
  404. package/project-templates/batch-locks/threejs.yaml +0 -978
  405. package/project-templates/empty/AGENTS.md +0 -41
  406. package/project-templates/empty/gitignore +0 -33
@@ -1,87 +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 inputExtension = /\.(?:[cm]?[jt]sx?|json5?|ya?ml|html|css|scss|glsl|wgsl|vert|frag|toml)$/i;
8
- export class ParameterAgentError extends Error {
9
- code;
10
- constructor(code) {
11
- super(code);
12
- this.code = code;
13
- this.name = 'ParameterAgentError';
14
- }
15
- }
16
- export function parameterInputPath(path) {
17
- if (!workspaceRelativePathSchema.safeParse(path).success)
18
- return false;
19
- const segments = path.split('/');
20
- if (segments.some(segment => skippedDirectories.has(segment)))
21
- return false;
22
- if (segments.some(segment => segment.startsWith('.') && segment !== '.playcraft'))
23
- return false;
24
- if (segments[0] === '.playcraft' && path !== '.playcraft/workspace.json')
25
- return false;
26
- if (segments.some(segment => /(?:secret|credential|private[-_.]?key|\.pem$|\.key$)/i.test(segment)))
27
- return false;
28
- return inputExtension.test(path);
29
- }
30
- export async function readParameterAgentFile(root, path, limit = 2 * 1024 * 1024) {
31
- const parsed = workspaceRelativePathSchema.safeParse(path);
32
- if (!parsed.success)
33
- throw new ParameterAgentError('parameter_agent_path_invalid');
34
- const base = await realpath(root);
35
- let target = base;
36
- const segments = parsed.data.split('/');
37
- for (let index = 0; index < segments.length; index++) {
38
- target = resolve(target, segments[index]);
39
- const stat = await lstat(target);
40
- if (stat.isSymbolicLink() || (index < segments.length - 1 ? !stat.isDirectory() : !stat.isFile()))
41
- throw new ParameterAgentError('parameter_agent_path_invalid');
42
- if (index === segments.length - 1 && stat.size > limit)
43
- throw new ParameterAgentError('parameter_agent_input_too_large');
44
- }
45
- const rel = relative(base, await realpath(target));
46
- if (rel === '..' || rel.startsWith(`..${sep}`))
47
- throw new ParameterAgentError('parameter_agent_path_invalid');
48
- const bytes = await readFile(target);
49
- if (bytes.byteLength > limit)
50
- throw new ParameterAgentError('parameter_agent_input_too_large');
51
- return bytes;
52
- }
53
- export async function parameterInputSnapshot(root) {
54
- const base = await realpath(root);
55
- const sources = [];
56
- let total = 0;
57
- let directories = 0;
58
- const walk = async (path, depth) => {
59
- if (depth > 24 || ++directories > 4096)
60
- throw new ParameterAgentError('parameter_agent_input_limit');
61
- const entries = await readdir(resolve(base, path), { withFileTypes: true });
62
- if (entries.length > 4096)
63
- throw new ParameterAgentError('parameter_agent_input_limit');
64
- for (const entry of entries) {
65
- const child = path ? `${path}/${entry.name}` : entry.name;
66
- if (entry.isSymbolicLink())
67
- continue;
68
- if (entry.isDirectory()) {
69
- if (skippedDirectories.has(entry.name) || (entry.name.startsWith('.') && entry.name !== '.playcraft'))
70
- continue;
71
- if (child.startsWith('.playcraft/'))
72
- continue;
73
- await walk(child, depth + 1);
74
- }
75
- else if (entry.isFile() && parameterInputPath(child)) {
76
- const bytes = await readParameterAgentFile(base, child);
77
- total += bytes.byteLength;
78
- if (total > 32 * 1024 * 1024 || sources.length >= 2048)
79
- throw new ParameterAgentError('parameter_agent_input_limit');
80
- sources.push({ path: child, sha256: parameterDigest(bytes) });
81
- }
82
- }
83
- };
84
- await walk('', 0);
85
- sources.sort((left, right) => left.path.localeCompare(right.path));
86
- return { sources, digest: parameterDigest(JSON.stringify(sources)) };
87
- }
@@ -1,29 +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
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. Do not add unsupported required/$ref/conditional composition merely for this workflow.
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
- - 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.
18
- - 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.
19
- - 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.
20
- - Do not claim a complete production module isolation proof without a trustworthy module report. Passing build/checks proves only their stated coverage.
21
-
22
- Report JSON contract (no second copy of parameter values):
23
- {version:1,taskId:"<exact platform task id>",sources:[{path:"relative/input.ts",sha256:"<current raw-file SHA-256>"}],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"]}]}
24
- - Candidate status is exactly candidate, implemented, or blocked. Completed integration candidates use implemented with an empty missing array; discovery keeps candidates unimplemented.
25
- - Include current file digests for every origin and consumer, and the actual schema/data/platform labels/manifest/check scripts/package and lock files when present. Paths must stay inside the engineering directory. Do not read credentials, dependency trees or build outputs as evidence.
26
- - 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.
27
- - No passed/ready/live/checks fields are accepted in the report. All implementation and validation statements remain claims until platform verification.
28
- - 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.
29
- `;
@@ -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,282 +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
- try {
123
- const report = await inspectReport(root, task, snapshot);
124
- if (task.record.sourceDigest && task.record.sourceDigest !== snapshot.digest)
125
- return { ...task.record, report, status: 'stale', error: 'parameter_agent_inputs_changed' };
126
- const bytes = await readParameterAgentFile(root, task.record.reportPath, 1024 * 1024);
127
- if (task.reportHash && task.reportHash !== parameterDigest(bytes))
128
- return { ...task.record, report, status: 'stale', error: 'parameter_agent_report_changed' };
129
- return { ...task.record, report };
130
- }
131
- catch (cause) {
132
- const code = errorCode(cause);
133
- if (code === 'ENOENT' && ['running', 'uncertain', 'interrupted', 'failed'].includes(task.record.status))
134
- return task.record;
135
- return { ...task.record, status: code === 'ENOENT' ? 'missing' : code === 'parameter_agent_report_stale' ? 'stale' : 'invalid', error: code === 'ENOENT' ? 'parameter_agent_report_missing' : code };
136
- }
137
- }
138
- export async function listParameterAgentTasks(state, workspaceId, directoryName, root) {
139
- if (directoryName === 'root')
140
- return [];
141
- const workspace = parameterTaskWorkspace(state, workspaceId);
142
- const ids = await listPrivateParameterTaskIds(state, workspace, directoryName, root);
143
- if (!ids.length)
144
- return [];
145
- const snapshot = await parameterInputSnapshot(root);
146
- const tasks = [];
147
- for (const id of ids) {
148
- let task = await readPrivateParameterTask(state, workspace, directoryName, id, root);
149
- if (task && ['running', 'uncertain'].includes(task.record.status) && current(state, task)) {
150
- const operation = state.journal.listOperations?.().map(item => item.operation).find(item => item.kind === 'session.turn'
151
- && item.clientRequestId === id && item.sessionId === task.record.sessionId
152
- && parameterTaskWorkspace(state, item.workspaceId) === workspace && (item.directoryName ?? 'basic') === directoryName);
153
- if (operation && ['completed', 'failed', 'interrupted', 'uncertain'].includes(operation.status)) {
154
- await finishParameterAgentTask(state, operation, operation.status, operation.error);
155
- task = await readPrivateParameterTask(state, workspace, directoryName, id, root);
156
- }
157
- }
158
- if (task && current(state, task) && task.instanceToken !== state.instanceToken) {
159
- if (task.record.status === 'checking') {
160
- await update(state, task, { status: 'needs-verification', receiptId: undefined, error: 'parameter_agent_check_interrupted' }, root);
161
- }
162
- else if (task.record.status === 'running') {
163
- await update(state, task, { status: 'uncertain', receiptId: undefined, error: 'parameter_agent_turn_unconfirmed_after_restart' }, root);
164
- }
165
- }
166
- if (task)
167
- tasks.push(await publicTask(state, task, root, snapshot));
168
- }
169
- return tasks.sort((left, right) => right.createdAt.localeCompare(left.createdAt));
170
- }
171
- function errorCode(cause) {
172
- return cause instanceof Error && 'code' in cause && typeof cause.code === 'string' ? cause.code : 'parameter_agent_verification_failed';
173
- }
174
- export async function verifyParameterAgentTask(state, operation, payload, root, options = {}) {
175
- if (operation.kind !== 'parameter.verify')
176
- throw new ParameterAgentError('parameter_agent_task_identity_invalid');
177
- const owner = scope(state, operation, false);
178
- const { taskId } = parameterAgentVerifyPayloadSchema.parse(payload);
179
- const task = await readPrivateParameterTask(state, owner.workspaceId, owner.directoryName, taskId, root);
180
- if (!task)
181
- throw new ParameterAgentError('parameter_agent_task_unknown');
182
- const instanceToken = state.instanceToken;
183
- const assertActive = () => {
184
- options.signal?.throwIfAborted();
185
- options.assertActive?.();
186
- if (!current(state, task) || state.journal.destroyed() || instanceToken !== state.instanceToken)
187
- throw new ParameterAgentError('parameter_agent_scope_expired');
188
- };
189
- assertActive();
190
- if (['running', 'uncertain', 'interrupted'].includes(task.record.status))
191
- throw new ParameterAgentError('parameter_agent_turn_not_completed');
192
- try {
193
- const before = await parameterInputSnapshot(root);
194
- const report = await inspectReport(root, task, before);
195
- task.record.report = report;
196
- task.reportHash = parameterDigest(await readParameterAgentFile(root, task.record.reportPath, 1024 * 1024));
197
- if (task.request.action === 'discover') {
198
- if (task.initialDigest !== before.digest)
199
- throw new ParameterAgentError('parameter_agent_discovery_modified_sources');
200
- assertActive();
201
- if ((await parameterInputSnapshot(root)).digest !== before.digest || parameterDigest(await readParameterAgentFile(root, task.record.reportPath, 1024 * 1024)) !== task.reportHash)
202
- throw new ParameterAgentError('parameter_agent_inputs_changed');
203
- return update(state, task, { status: 'candidates', sourceDigest: before.digest, checks: [], error: undefined, receiptId: undefined }, root);
204
- }
205
- const document = await readWorkspaceParameters(root, state.journal.fileRevisions(revisionScope(state, operation.workspaceId, owner.directoryName)));
206
- if (document.status !== 'ready')
207
- throw new ParameterAgentError('parameter_agent_parameters_not_ready');
208
- const catalog = parameterCatalog(document.schema, document.data);
209
- const implemented = report.candidates.filter(candidate => candidate.status === 'implemented');
210
- if (!implemented.length || report.candidates.some(candidate => candidate.status !== 'implemented' || candidate.missing.length))
211
- throw new ParameterAgentError('parameter_agent_integration_incomplete');
212
- const evidence = new Set(report.sources.map(source => source.path));
213
- for (const path of [document.schemaPath, document.dataPath, document.platformI18nPath, 'package.json']) {
214
- if (path && !evidence.has(path))
215
- throw new ParameterAgentError('parameter_agent_evidence_missing');
216
- }
217
- for (const candidate of implemented) {
218
- const field = catalog.find(entry => candidate.fieldPath && entry.key === candidate.fieldPath.join('.'));
219
- if (!field || !field.editable || !field.canReset)
220
- throw new ParameterAgentError('parameter_agent_field_not_ready');
221
- if (field.hasOverride && validateParameterChange(document.schema, document.data, { fieldPath: field.fieldPath, value: field.value }))
222
- throw new ParameterAgentError('parameter_agent_field_not_ready');
223
- if (!candidate.consumers.length)
224
- throw new ParameterAgentError('parameter_agent_consumer_missing');
225
- }
226
- const packageData = JSON.parse((await readParameterAgentFile(root, 'package.json')).toString('utf8'));
227
- for (const script of ['test:parameters', 'build']) {
228
- if (typeof packageData.scripts?.[script] !== 'string' || !packageData.scripts[script].trim())
229
- throw new ParameterAgentError('parameter_agent_check_script_missing');
230
- }
231
- task.instanceToken = state.instanceToken;
232
- await update(state, task, { status: 'checking', checks: [], error: undefined, receiptId: undefined, sourceDigest: before.digest }, root);
233
- const scripts = ['test:parameters', 'build', ...(typeof packageData.scripts?.typecheck === 'string' ? ['typecheck'] : [])];
234
- for (const script of scripts) {
235
- assertActive();
236
- const controller = new AbortController();
237
- const abort = () => controller.abort();
238
- options.signal?.addEventListener('abort', abort, { once: true });
239
- let activityError;
240
- const timer = setInterval(() => { try {
241
- assertActive();
242
- }
243
- catch (error) {
244
- activityError = error;
245
- controller.abort();
246
- } }, 200);
247
- const startedAt = now();
248
- const chunks = [];
249
- let outputSize = 0;
250
- let outcome;
251
- try {
252
- outcome = await (options.runCommand ?? runDeveloperCommand)(state, {
253
- processId: `parameter-check-${taskId}-${script.replace(':', '-')}`, cwd: root,
254
- command: `pnpm run ${script}`, timeoutMs: options.timeoutMs ?? 120_000, signal: controller.signal,
255
- onOutput(chunk) { const bytes = Buffer.from(chunk); outputSize += bytes.length; if (outputSize <= 1024 * 1024)
256
- chunks.push(bytes); },
257
- });
258
- }
259
- finally {
260
- clearInterval(timer);
261
- options.signal?.removeEventListener('abort', abort);
262
- }
263
- if (activityError)
264
- throw activityError;
265
- assertActive();
266
- 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() });
267
- await writePrivateParameterTask(state, task, root);
268
- if (outcome.code !== 0 || outcome.timedOut || outcome.canceled)
269
- throw new ParameterAgentError(outcome.timedOut ? 'parameter_agent_check_timeout' : outcome.canceled ? 'parameter_agent_check_canceled' : 'parameter_agent_check_failed');
270
- }
271
- assertActive();
272
- const after = await parameterInputSnapshot(root);
273
- if (after.digest !== before.digest || parameterDigest(await readParameterAgentFile(root, task.record.reportPath, 1024 * 1024)) !== task.reportHash)
274
- throw new ParameterAgentError('parameter_agent_inputs_changed');
275
- return update(state, task, { status: 'verified', sourceDigest: after.digest, receiptId: randomUUID(), error: undefined }, root);
276
- }
277
- catch (cause) {
278
- const code = errorCode(cause);
279
- 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';
280
- return update(state, task, { status, error: code === 'ENOENT' ? 'parameter_agent_report_missing' : code, receiptId: undefined }, root);
281
- }
282
- }