@playcraft/cli 0.1.23 → 0.1.24

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 (278) hide show
  1. package/README.md +3 -38
  2. package/dist/agent/local-backend.js +1 -1
  3. package/dist/cli-root-help.js +0 -1
  4. package/dist/commands/build.js +4 -9
  5. package/dist/commands/create.js +33 -26
  6. package/dist/commands/image.js +6 -2
  7. package/dist/commands/login.js +42 -84
  8. package/dist/commands/skills.js +0 -2
  9. package/dist/commands/tools-generation.js +4 -2
  10. package/dist/commands/tools.js +0 -2
  11. package/dist/config.js +4 -59
  12. package/dist/index.js +1 -6
  13. package/dist/remix/clone.js +0 -2
  14. package/dist/remix/init-template.js +0 -2
  15. package/dist/remix/pull.js +0 -2
  16. package/dist/remix/push.js +1 -21
  17. package/dist/utils/agent-api-client.js +29 -148
  18. package/dist/utils/playcraft-http-client.js +4 -6
  19. package/package.json +2 -8
  20. package/project-template/.claude/skills/playcraft-image-generation/SKILL.md +61 -23
  21. package/project-templates/phaser/.claude/skills/playcraft-image-generation/SKILL.md +61 -23
  22. package/project-templates/threejs/.claude/skills/playcraft-image-generation/SKILL.md +61 -23
  23. package/dist/auth/account-activation.js +0 -157
  24. package/dist/auth/messages.js +0 -30
  25. package/dist/commands/platform-skills.generated.js +0 -19
  26. package/dist/commands/tools-batch.js +0 -59
  27. package/dist/commands/workspace-runtime.js +0 -54
  28. package/dist/project-skills/commands.js +0 -72
  29. package/dist/project-skills/lifecycle.js +0 -28
  30. package/dist/project-skills/local-run.js +0 -112
  31. package/dist/project-skills/local-store.js +0 -149
  32. package/dist/project-skills/messages.js +0 -72
  33. package/dist/project-skills/reconcile.js +0 -62
  34. package/dist/project-skills/remote-cache.js +0 -51
  35. package/dist/project-skills/validation.js +0 -19
  36. package/dist/utils/environment-endpoints.js +0 -17
  37. package/dist/utils/tool-operation-journal.js +0 -124
  38. package/dist/workspace-runtime/codex/app-server.js +0 -574
  39. package/dist/workspace-runtime/codex/config-toml.js +0 -108
  40. package/dist/workspace-runtime/codex/jsonrpc-stdio.js +0 -123
  41. package/dist/workspace-runtime/codex/launcher-client.js +0 -163
  42. package/dist/workspace-runtime/codex/loopback.js +0 -143
  43. package/dist/workspace-runtime/codex/model-broker.js +0 -239
  44. package/dist/workspace-runtime/codex/native-adapter.js +0 -9
  45. package/dist/workspace-runtime/main.js +0 -10
  46. package/dist/workspace-runtime/persistence/journal.js +0 -355
  47. package/dist/workspace-runtime/persistence/sqlite-client.js +0 -61
  48. package/dist/workspace-runtime/persistence/sqlite-worker.js +0 -1015
  49. package/dist/workspace-runtime/previews/publish.js +0 -259
  50. package/dist/workspace-runtime/previews/single-file.js +0 -43
  51. package/dist/workspace-runtime/processes/managed-writes.js +0 -69
  52. package/dist/workspace-runtime/production/contracts.js +0 -17
  53. package/dist/workspace-runtime/production/controller.js +0 -207
  54. package/dist/workspace-runtime/production/dependencies.js +0 -60
  55. package/dist/workspace-runtime/production/native.js +0 -70
  56. package/dist/workspace-runtime/production/processes.js +0 -86
  57. package/dist/workspace-runtime/production/save-command.js +0 -20
  58. package/dist/workspace-runtime/production/stages.js +0 -175
  59. package/dist/workspace-runtime/production/storage.js +0 -32
  60. package/dist/workspace-runtime/serve.js +0 -199
  61. package/dist/workspace-runtime/server/auth.js +0 -21
  62. package/dist/workspace-runtime/server/connectivity.js +0 -201
  63. package/dist/workspace-runtime/server/desktop-host.js +0 -429
  64. package/dist/workspace-runtime/server/desktop-preview-config.js +0 -81
  65. package/dist/workspace-runtime/server/desktop-preview-service.js +0 -157
  66. package/dist/workspace-runtime/server/desktop-preview-static.js +0 -53
  67. package/dist/workspace-runtime/server/desktop-preview.js +0 -189
  68. package/dist/workspace-runtime/server/dispatch.js +0 -848
  69. package/dist/workspace-runtime/server/endpoints.js +0 -19
  70. package/dist/workspace-runtime/server/execution-group.js +0 -85
  71. package/dist/workspace-runtime/server/http.js +0 -919
  72. package/dist/workspace-runtime/server/lock.js +0 -53
  73. package/dist/workspace-runtime/server/rfb-watch-gate.js +0 -168
  74. package/dist/workspace-runtime/server/terminal-host.js +0 -294
  75. package/dist/workspace-runtime/server/types.js +0 -1
  76. package/dist/workspace-runtime/workspaces/attachments.js +0 -109
  77. package/dist/workspace-runtime/workspaces/batch-commit.js +0 -142
  78. package/dist/workspace-runtime/workspaces/cli-credentials.js +0 -111
  79. package/dist/workspace-runtime/workspaces/context-error.js +0 -2
  80. package/dist/workspace-runtime/workspaces/dependencies.js +0 -264
  81. package/dist/workspace-runtime/workspaces/developer-command.js +0 -64
  82. package/dist/workspace-runtime/workspaces/directories.js +0 -106
  83. package/dist/workspace-runtime/workspaces/directory-access.js +0 -20
  84. package/dist/workspace-runtime/workspaces/directory-maintenance.js +0 -111
  85. package/dist/workspace-runtime/workspaces/directory-stats.js +0 -49
  86. package/dist/workspace-runtime/workspaces/empty-template.js +0 -32
  87. package/dist/workspace-runtime/workspaces/files.js +0 -113
  88. package/dist/workspace-runtime/workspaces/git-credential-broker.js +0 -312
  89. package/dist/workspace-runtime/workspaces/git-credential-helper.js +0 -68
  90. package/dist/workspace-runtime/workspaces/git-direct-store.js +0 -155
  91. package/dist/workspace-runtime/workspaces/git.js +0 -471
  92. package/dist/workspace-runtime/workspaces/json5-edit.js +0 -170
  93. package/dist/workspace-runtime/workspaces/parameters.js +0 -272
  94. package/dist/workspace-runtime/workspaces/prepare.js +0 -263
  95. package/dist/workspace-runtime/workspaces/registry.js +0 -192
  96. package/dist/workspace-runtime/workspaces/revisions.js +0 -31
  97. package/dist/workspace-runtime/workspaces/skill-artifact-loader.js +0 -46
  98. package/dist/workspace-runtime/workspaces/skills.js +0 -179
  99. package/project-template-v2/.claude/agents/artist.md +0 -82
  100. package/project-template-v2/.claude/agents/developer.md +0 -153
  101. package/project-template-v2/.claude/agents/game-designer.md +0 -264
  102. package/project-template-v2/.claude/agents/refs/artist-art-style-catalog.md +0 -533
  103. package/project-template-v2/.claude/agents/refs/artist-color-audio-recipes.md +0 -153
  104. package/project-template-v2/.claude/agents/refs/artist-dimension-axis.md +0 -27
  105. package/project-template-v2/.claude/agents/refs/artist-master-composite-recipes.md +0 -208
  106. package/project-template-v2/.claude/agents/refs/atom-skill-library.md +0 -81
  107. package/project-template-v2/.claude/agents/refs/developer-impl-cookbook.md +0 -432
  108. package/project-template-v2/.claude/agents/refs/framework-5-component-filter.md +0 -252
  109. package/project-template-v2/.claude/agents/refs/framework-game-feel-juice.md +0 -266
  110. package/project-template-v2/.claude/agents/refs/framework-mda.md +0 -147
  111. package/project-template-v2/.claude/agents/refs/game-designer-gameplay-sufficiency.md +0 -123
  112. package/project-template-v2/.claude/agents/refs/ta-3d-flip-recipe.md +0 -88
  113. package/project-template-v2/.claude/agents/refs/ta-atlas-deliverable-standard.md +0 -67
  114. package/project-template-v2/.claude/agents/refs/ta-batch-pipeline-recipes.md +0 -120
  115. package/project-template-v2/.claude/agents/refs/ta-image-generation-detail.md +0 -300
  116. package/project-template-v2/.claude/agents/refs/ta-image-ops-reference.md +0 -495
  117. package/project-template-v2/.claude/agents/refs/ta-pipeline-cookbook.md +0 -1141
  118. package/project-template-v2/.claude/agents/refs/ta-tools-reference.md +0 -111
  119. package/project-template-v2/.claude/agents/refs/ta-vfx-preset-catalog.md +0 -365
  120. package/project-template-v2/.claude/agents/refs/threejs-cannon-pitfalls.md +0 -412
  121. package/project-template-v2/.claude/agents/reviewer.md +0 -75
  122. package/project-template-v2/.claude/agents/technical-artist.md +0 -86
  123. package/project-template-v2/.claude/hooks/snapshot-milestone.mjs +0 -243
  124. package/project-template-v2/.claude/hooks/user-prompt.mjs +0 -133
  125. package/project-template-v2/.claude/settings.json +0 -33
  126. package/project-template-v2/.claude/skills/brainstorming/SKILL.md +0 -161
  127. package/project-template-v2/.claude/skills/brainstorming/scripts/frame-template.html +0 -270
  128. package/project-template-v2/.claude/skills/brainstorming/scripts/helper.js +0 -177
  129. package/project-template-v2/.claude/skills/brainstorming/scripts/server.cjs +0 -354
  130. package/project-template-v2/.claude/skills/brainstorming/scripts/start-server.sh +0 -148
  131. package/project-template-v2/.claude/skills/brainstorming/scripts/stop-server.sh +0 -56
  132. package/project-template-v2/.claude/skills/brainstorming/scripts/wait-for-selection.sh +0 -62
  133. package/project-template-v2/.claude/skills/brainstorming/spec-document-reviewer-prompt.md +0 -49
  134. package/project-template-v2/.claude/skills/brainstorming/visual-companion.md +0 -309
  135. package/project-template-v2/.claude/skills/playcraft-ad-psychology/SKILL.md +0 -182
  136. package/project-template-v2/.claude/skills/playcraft-art-style-guide/SKILL.md +0 -123
  137. package/project-template-v2/.claude/skills/playcraft-asset-state-sheet/SKILL.md +0 -205
  138. package/project-template-v2/.claude/skills/playcraft-audio-generation/SKILL.md +0 -280
  139. package/project-template-v2/.claude/skills/playcraft-batch-pipeline/SKILL.md +0 -184
  140. package/project-template-v2/.claude/skills/playcraft-build-optimizer/SKILL.md +0 -306
  141. package/project-template-v2/.claude/skills/playcraft-image-generation/SKILL.md +0 -298
  142. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/build-sprite-sheet.template.mjs +0 -123
  143. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/compare-style.template.mjs +0 -254
  144. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch-sprite.template.mjs +0 -324
  145. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-batch.template.mjs +0 -97
  146. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/gen-edit-variants.template.mjs +0 -118
  147. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/process-batch.template.mjs +0 -137
  148. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/prompt-cookbook.md +0 -397
  149. package/project-template-v2/.claude/skills/playcraft-image-generation/reference/validate-sprite-sheet.template.mjs +0 -296
  150. package/project-template-v2/.claude/skills/playcraft-image-ops/SKILL.md +0 -122
  151. package/project-template-v2/.claude/skills/playcraft-image-processing/SKILL.md +0 -219
  152. package/project-template-v2/.claude/skills/playcraft-masking/SKILL.md +0 -373
  153. package/project-template-v2/.claude/skills/playcraft-playable-optimization/SKILL.md +0 -161
  154. package/project-template-v2/.claude/skills/playcraft-research/SKILL.md +0 -215
  155. package/project-template-v2/.claude/skills/playcraft-skill-recommender/SKILL.md +0 -382
  156. package/project-template-v2/.claude/skills/playcraft-sprite-generation/SKILL.md +0 -423
  157. package/project-template-v2/.claude/skills/playcraft-sprite-remix/SKILL.md +0 -158
  158. package/project-template-v2/.claude/skills/playcraft-sprite-sheet/SKILL.md +0 -100
  159. package/project-template-v2/.claude/skills/playcraft-storyboard/SKILL.md +0 -167
  160. package/project-template-v2/.claude/skills/playcraft-style-qa/SKILL.md +0 -270
  161. package/project-template-v2/.claude/skills/playcraft-text-rendering/SKILL.md +0 -236
  162. package/project-template-v2/.claude/skills/playcraft-vfx-animation/SKILL.md +0 -130
  163. package/project-template-v2/.claude/skills/playwright-cli/SKILL.md +0 -390
  164. package/project-template-v2/.claude/skills/playwright-cli/references/element-attributes.md +0 -23
  165. package/project-template-v2/.claude/skills/playwright-cli/references/playwright-tests.md +0 -39
  166. package/project-template-v2/.claude/skills/playwright-cli/references/request-mocking.md +0 -87
  167. package/project-template-v2/.claude/skills/playwright-cli/references/running-code.md +0 -240
  168. package/project-template-v2/.claude/skills/playwright-cli/references/session-management.md +0 -226
  169. package/project-template-v2/.claude/skills/playwright-cli/references/spec-driven-testing.md +0 -308
  170. package/project-template-v2/.claude/skills/playwright-cli/references/storage-state.md +0 -275
  171. package/project-template-v2/.claude/skills/playwright-cli/references/test-generation.md +0 -134
  172. package/project-template-v2/.claude/skills/playwright-cli/references/tracing.md +0 -142
  173. package/project-template-v2/.claude/skills/playwright-cli/references/video-recording.md +0 -153
  174. package/project-template-v2/.claude/skills/session-analyzer/SKILL.md +0 -386
  175. package/project-template-v2/.claude/skills/session-analyzer/scripts/execution-breakdown.mjs +0 -182
  176. package/project-template-v2/.claude/skills/session-analyzer/scripts/find-turns.mjs +0 -72
  177. package/project-template-v2/.claude/skills/session-analyzer/scripts/heavy-output.mjs +0 -121
  178. package/project-template-v2/.claude/skills/session-analyzer/scripts/resolve-session.mjs +0 -102
  179. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-stats.mjs +0 -127
  180. package/project-template-v2/.claude/skills/session-analyzer/scripts/subagent-tool-timeline.mjs +0 -106
  181. package/project-template-v2/.claude/skills/session-analyzer/scripts/time-gaps.mjs +0 -128
  182. package/project-template-v2/.claude/skills/session-analyzer/scripts/turn-timeline.mjs +0 -67
  183. package/project-template-v2/.claude/snapshot.mjs +0 -263
  184. package/project-template-v2/.playcraft/skills.lock.json +0 -152
  185. package/project-template-v2/CLAUDE.md +0 -146
  186. package/project-template-v2/assets/audio/bgm/.gitkeep +0 -0
  187. package/project-template-v2/assets/audio/sfx/.gitkeep +0 -0
  188. package/project-template-v2/assets/bundles/.gitkeep +0 -0
  189. package/project-template-v2/assets/images/bg/.gitkeep +0 -0
  190. package/project-template-v2/assets/images/reference/.gitkeep +0 -0
  191. package/project-template-v2/assets/images/storyboard/.gitkeep +0 -0
  192. package/project-template-v2/assets/images/tiles/.gitkeep +0 -0
  193. package/project-template-v2/assets/images/ui/.gitkeep +0 -0
  194. package/project-template-v2/assets/images/vfx/.gitkeep +0 -0
  195. package/project-template-v2/assets/models/.gitkeep +0 -0
  196. package/project-template-v2/docs/harness/iteration-1/context-flow.md +0 -254
  197. package/project-template-v2/docs/harness/iteration-1/generate-flow.md +0 -91
  198. package/project-template-v2/docs/harness/iteration-1/ideate-flow.md +0 -214
  199. package/project-template-v2/docs/harness/iteration-1/optimize-flow.md +0 -75
  200. package/project-template-v2/docs/harness/iteration-1/wrapup-flow.md +0 -63
  201. package/project-template-v2/docs/harness/iteration-2/context-flow.md +0 -223
  202. package/project-template-v2/docs/harness/iteration-2/generate-flow.md +0 -129
  203. package/project-template-v2/docs/harness/iteration-2/ideate-flow.md +0 -267
  204. package/project-template-v2/docs/harness/iteration-2/optimize-flow.md +0 -164
  205. package/project-template-v2/docs/harness/iteration-2/wrapup-flow.md +0 -115
  206. package/project-template-v2/docs/harness/orchestrator-flow.md +0 -364
  207. package/project-template-v2/docs/project-state.json +0 -60
  208. package/project-template-v2/docs/project-state.md +0 -72
  209. package/project-template-v2/docs/standards/README.md +0 -225
  210. package/project-template-v2/docs/standards/agent-behavior-standards.md +0 -174
  211. package/project-template-v2/docs/standards/artifacts/design-brief.md +0 -19
  212. package/project-template-v2/docs/standards/artifacts/design.md +0 -22
  213. package/project-template-v2/docs/standards/artifacts/game-code.md +0 -41
  214. package/project-template-v2/docs/standards/artifacts/todo-list.md +0 -41
  215. package/project-template-v2/docs/standards/iter1-agent-behavior-standards.md +0 -343
  216. package/project-template-v2/game/index.ts +0 -18
  217. package/project-template-v2/globals.d.ts +0 -51
  218. package/project-template-v2/index.css +0 -34
  219. package/project-template-v2/index.html +0 -18
  220. package/project-template-v2/main.ts +0 -9
  221. package/project-template-v2/package.json +0 -46
  222. package/project-template-v2/skills/_shared/scripts/dispatch-clear.mjs +0 -31
  223. package/project-template-v2/skills/_shared/scripts/dispatch-set.mjs +0 -86
  224. package/project-template-v2/skills/_shared/scripts/dod-check.mjs +0 -153
  225. package/project-template-v2/skills/_shared/scripts/handoff-append.mjs +0 -70
  226. package/project-template-v2/skills/_shared/scripts/lib/validator-artifacts.mjs +0 -91
  227. package/project-template-v2/skills/_shared/scripts/pipeline/dod-config.mjs +0 -131
  228. package/project-template-v2/skills/_shared/scripts/pipeline/index.mjs +0 -80
  229. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-1-core.mjs +0 -90
  230. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-2-wrap.mjs +0 -93
  231. package/project-template-v2/skills/_shared/scripts/pipeline/iteration-3-visual.mjs +0 -23
  232. package/project-template-v2/skills/_shared/scripts/render-project-state.mjs +0 -230
  233. package/project-template-v2/skills/_shared/scripts/state-advance-stage.mjs +0 -58
  234. package/project-template-v2/skills/_shared/scripts/state-get.mjs +0 -339
  235. package/project-template-v2/skills/_shared/scripts/state-handoff.mjs +0 -39
  236. package/project-template-v2/skills/_shared/scripts/state-set.mjs +0 -94
  237. package/project-template-v2/skills/_shared/scripts/state-store.mjs +0 -783
  238. package/project-template-v2/skills/_shared/scripts/todo-add.mjs +0 -88
  239. package/project-template-v2/skills/_shared/scripts/todo-get.mjs +0 -130
  240. package/project-template-v2/skills/_shared/scripts/todo-remove.mjs +0 -33
  241. package/project-template-v2/skills/_shared/scripts/todo-set.mjs +0 -47
  242. package/project-template-v2/skills/_shared/scripts/verify-asset-code-sync.mjs +0 -268
  243. package/project-template-v2/skills/_shared/scripts/verify-env.mjs +0 -285
  244. package/project-template-v2/skills/_shared/scripts/verify-placeholders.mjs +0 -161
  245. package/project-template-v2/skills/playable-autoplay/SKILL.md +0 -176
  246. package/project-template-v2/skills/playable-autoplay/agents/openai.yaml +0 -4
  247. package/project-template-v2/skills/playable-debug/SKILL.md +0 -116
  248. package/project-template-v2/skills/playable-debug/agents/openai.yaml +0 -4
  249. package/project-template-v2/skills/playable-debug/references/debug-config.md +0 -40
  250. package/project-template-v2/skills/playable-record/SKILL.md +0 -140
  251. package/project-template-v2/skills/playable-record/scripts/lib/dev-server.mjs +0 -104
  252. package/project-template-v2/skills/playable-record/scripts/lib/record-audio-bridge.js +0 -141
  253. package/project-template-v2/skills/playable-record/scripts/record-playable.mjs +0 -425
  254. package/project-template-v2/skills/playable-record/scripts/verify-contract.mjs +0 -261
  255. package/project-template-v2/skills/playable-record/scripts/verify-firstwin.mjs +0 -398
  256. package/project-template-v2/skills/playable-record/scripts/verify-fusion.mjs +0 -322
  257. package/project-template-v2/skills/playable-record/scripts/verify-lifecycle.mjs +0 -105
  258. package/project-template-v2/skills/playable-record/scripts/verify-vlm-video.mjs +0 -230
  259. package/project-template-v2/skills/playable-validate/SKILL.md +0 -61
  260. package/project-template-v2/skills/playable-validate/validation-rules.md +0 -14
  261. package/project-template-v2/skills/playable-verify-ui/SKILL.md +0 -63
  262. package/project-template-v2/skills/playable-verify-ui/scripts/lib/__init__.py +0 -1
  263. package/project-template-v2/skills/playable-verify-ui/scripts/lib/config_expr.js +0 -218
  264. package/project-template-v2/skills/playable-verify-ui/scripts/lib/node_utils.js +0 -51
  265. package/project-template-v2/skills/playable-verify-ui/scripts/lib/profile_loader.py +0 -59
  266. package/project-template-v2/skills/playable-verify-ui/scripts/lib/report.py +0 -106
  267. package/project-template-v2/skills/playable-verify-ui/scripts/lib/runtime_contract.js +0 -116
  268. package/project-template-v2/skills/playable-verify-ui/scripts/verify_fetch_antipatterns.py +0 -59
  269. package/project-template-v2/skills/playable-verify-ui/scripts/verify_hardcoded_layout.js +0 -64
  270. package/project-template-v2/skills/playable-verify-ui/scripts/verify_runtime_contract.js +0 -58
  271. package/project-template-v2/skills/playable-verify-ui/scripts/verify_text_overlap.py +0 -333
  272. package/project-template-v2/ta-workspace/scripts/.gitkeep +0 -0
  273. package/project-template-v2/tsconfig.json +0 -20
  274. package/project-template-v2/vite.config.ts +0 -27
  275. package/project-templates/batch-locks/phaser.yaml +0 -922
  276. package/project-templates/batch-locks/threejs.yaml +0 -978
  277. package/project-templates/empty/AGENTS.md +0 -23
  278. package/project-templates/empty/gitignore +0 -31
@@ -1,339 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Read project state from docs/project-state.json.
4
- *
5
- * Outputs two views:
6
- * - Orchestrator view (default): pipeline, stageExit, dispatchableRoles,
7
- * canWriteTodo, todo pool summary, todosCleared, gate, recent handoff history tail.
8
- * - Subagent view (--json dispatch): just state.dispatch (the workticket).
9
- * Must NOT include exit/dispatchableRoles.
10
- *
11
- * Usage:
12
- * npm run state:get
13
- * node skills/_shared/scripts/state-get.mjs --root=. --json dispatch
14
- * node skills/_shared/scripts/state-get.mjs --root=. iteration stage
15
- */
16
-
17
- import {
18
- flatHandoff,
19
- readState,
20
- stateExists,
21
- todosCleared,
22
- } from './state-store.mjs';
23
- import {
24
- specForIteration,
25
- stageConfig,
26
- dispatchableRoles,
27
- canWriteTodo,
28
- stageExit,
29
- subagentFieldsForStage,
30
- STAGES,
31
- dodKeysForStage,
32
- dodDefinition,
33
- routeForFailedDoDKeys,
34
- } from './pipeline/index.mjs';
35
-
36
- function parseArgs(argv) {
37
- const opts = { root: process.cwd(), keys: [], json: false, jsonTarget: null };
38
- for (let i = 0; i < argv.length; i += 1) {
39
- const arg = argv[i];
40
- if (arg.startsWith('--root=')) {
41
- opts.root = arg.slice('--root='.length);
42
- } else if (arg === '--json') {
43
- opts.json = true;
44
- // Check if next arg is a target (not a flag)
45
- if (i + 1 < argv.length && !argv[i + 1].startsWith('--')) {
46
- opts.jsonTarget = argv[++i];
47
- }
48
- } else if (arg === '--help' || arg === '-h') {
49
- console.log('Usage: state-get.mjs [--root=.] [--json [dispatch|orchestrator]] [key ...]');
50
- console.log(' --json dispatch Emit only state.dispatch (subagent workticket)');
51
- console.log(' --json Emit full orchestrator view as JSON');
52
- process.exit(0);
53
- } else if (!arg.startsWith('-')) {
54
- opts.keys.push(arg);
55
- }
56
- }
57
- return opts;
58
- }
59
-
60
- /** Summarize todo pool for the current iteration in orchestrator view. */
61
- function buildTodoSummary(todos, iteration) {
62
- const currentIteration = Number(iteration) || 1;
63
- const all = (todos || []).filter((t) => Number(t.iteration ?? currentIteration) === currentIteration);
64
- const byStatus = { pending: [], in_progress: [], done: [], failed: [] };
65
- for (const t of all) {
66
- const bucket = byStatus[t.status] ?? (byStatus[t.status] = []);
67
- bucket.push(t.id);
68
- }
69
- return {
70
- total: all.length,
71
- pending: byStatus.pending,
72
- in_progress: byStatus.in_progress,
73
- done: byStatus.done,
74
- failed: byStatus.failed,
75
- contextReuse: all
76
- .filter((t) => t.contextReuse)
77
- .map((t) => ({
78
- id: t.id,
79
- status: t.status,
80
- key: t.contextReuse || '',
81
- })),
82
- };
83
- }
84
-
85
- function buildContextReuseHint(todos, iteration, stage, handoff) {
86
- if (stage !== 'generate') return null;
87
-
88
- const currentIteration = Number(iteration) || 1;
89
- const all = (todos || []).filter((t) => Number(t.iteration ?? currentIteration) === currentIteration);
90
- const nextPendingIndex = all.findIndex((t) => t.status === 'pending');
91
- if (nextPendingIndex < 0) return null;
92
-
93
- const candidate = all[nextPendingIndex];
94
- const previous = nextPendingIndex > 0 ? all[nextPendingIndex - 1] : null;
95
- const limit = 3;
96
- const recent = handoff?.history?.length ? handoff.history[handoff.history.length - 1] : null;
97
- const blockers = Array.isArray(recent?.blockers) ? recent.blockers : [];
98
-
99
- const base = {
100
- nextTodoId: candidate.id,
101
- reusable: Boolean(candidate.contextReuse),
102
- key: candidate.contextReuse || '',
103
- limit,
104
- eligibleForSendMessage: false,
105
- reason: '',
106
- };
107
-
108
- if (!candidate.contextReuse) return { ...base, reason: 'next todo has no contextReuse' };
109
- if (!previous) return { ...base, reason: 'next todo has no previous contiguous todo' };
110
- if (previous.status !== 'done') return { ...base, reason: 'previous contiguous todo is not done' };
111
- if (!previous.contextReuse || previous.contextReuse !== candidate.contextReuse) {
112
- return { ...base, reason: 'previous contiguous todo has different reuse key' };
113
- }
114
- if (!recent) return { ...base, reason: 'no latest handoff to resume with sendMessage' };
115
- if (recent.role !== candidate.role) {
116
- return { ...base, reason: 'latest handoff role does not match next todo role' };
117
- }
118
- if (blockers.length > 0) return { ...base, reason: 'latest handoff has blockers' };
119
-
120
- let contiguousCount = 1;
121
- for (let idx = nextPendingIndex - 1; idx >= 0; idx -= 1) {
122
- const todo = all[idx];
123
- if (
124
- todo.status !== 'done'
125
- || !todo.contextReuse
126
- || todo.contextReuse !== candidate.contextReuse
127
- || todo.role !== candidate.role
128
- ) {
129
- break;
130
- }
131
- contiguousCount += 1;
132
- }
133
-
134
- if (contiguousCount > limit) {
135
- return {
136
- ...base,
137
- contiguousCount,
138
- reason: `contiguous reusable run ${contiguousCount} exceeds limit ${limit}`,
139
- };
140
- }
141
-
142
- return {
143
- ...base,
144
- contiguousCount,
145
- previousTodoId: previous.id,
146
- eligibleForSendMessage: true,
147
- reason: 'same role, contiguous done todo, same reuse key, within limit, no blocker',
148
- };
149
- }
150
-
151
- function isRealTodoId(id) {
152
- return id && id !== 'none' && !id.startsWith('stage:');
153
- }
154
-
155
- function findTodoForDispatch(state) {
156
- const id = state.dispatch?.activeTodoId;
157
- if (!isRealTodoId(id)) return null;
158
- return (state.todos || []).find((t) => t.id === id && t.iteration === state.pipeline.iteration)
159
- ?? (state.todos || []).find((t) => t.id === id)
160
- ?? null;
161
- }
162
-
163
- function buildDispatchView(state) {
164
- const dispatch = state.dispatch || {};
165
- const todo = findTodoForDispatch(state);
166
- if (!todo) return dispatch;
167
-
168
- return {
169
- activeTodoId: dispatch.activeTodoId || todo.id,
170
- role: dispatch.role || todo.role,
171
- title: todo.title || todo.id,
172
- goal: dispatch.goal || todo.goal || todo.title || '',
173
- context: todo.context || '',
174
- guidance: dispatch.guidance || '',
175
- skillHints: dispatch.skillHints || [],
176
- requiredContext: dispatch.requiredContext?.length ? dispatch.requiredContext : todo.requiredContext || [],
177
- contextReuse: dispatch.contextReuse || todo.contextReuse || '',
178
- allowedFiles: dispatch.allowedFiles || [],
179
- forbiddenTasks: dispatch.forbiddenTasks || [],
180
- acceptance: dispatch.acceptance?.length ? dispatch.acceptance : todo.acceptance || [],
181
- verifier: dispatch.verifier || todo.verifier || '',
182
- };
183
- }
184
-
185
- function omitEmptyDispatchFields(dispatch) {
186
- const out = {};
187
- for (const [key, value] of Object.entries(dispatch || {})) {
188
- if (value === '') continue;
189
- if (Array.isArray(value) && value.length === 0) continue;
190
- out[key] = value;
191
- }
192
- return out;
193
- }
194
-
195
- /** Build stageDod summary for orchestrator view. */
196
- function buildStageDod(iteration, stage, stageDoD) {
197
- const keys = dodKeysForStage(iteration, stage);
198
- if (!keys.length) return null;
199
-
200
- const current = stageDoD || {};
201
- const pending = keys.filter((k) => !current[k]);
202
- const passed = keys.filter((k) => current[k] === true || current[k] === 'passed' || current[k] === 'pass');
203
- const failed = keys.filter((k) => current[k] === false || current[k] === 'failed' || current[k] === 'fail');
204
-
205
- const scripts = {};
206
- const routing = {};
207
- for (const k of keys) {
208
- const def = dodDefinition(k);
209
- if (def?.script) scripts[k] = def.script;
210
- routing[k] = { routeTo: def?.routeTo ?? 'developer', nextAction: def?.nextAction ?? '' };
211
- }
212
-
213
- const failRoute = failed.length ? routeForFailedDoDKeys(failed) : null;
214
-
215
- return { keys, scripts, pending, passed, failed, routing, failRoute };
216
- }
217
-
218
- function buildOrchestratorAction(dispatch, pendingUserInput) {
219
- if (
220
- dispatch?.activeTodoId
221
- && dispatch.activeTodoId !== 'none'
222
- && pendingUserInput?.status === 'awaiting_user_input'
223
- ) {
224
- return 'ask_user_then_sendMessage_to_active_subagent';
225
- }
226
- if (
227
- dispatch?.activeTodoId
228
- && dispatch.activeTodoId !== 'none'
229
- && pendingUserInput?.status === 'answered'
230
- ) {
231
- return 'sendMessage_answer_to_active_subagent';
232
- }
233
- if (dispatch?.activeTodoId && dispatch.activeTodoId !== 'none') {
234
- return 'resume_active_dispatch';
235
- }
236
- return 'select_next_dispatch_or_stage_action';
237
- }
238
-
239
- /** Build orchestrator view. */
240
- function buildOrchestratorView(state) {
241
- const { pipeline, todos, gate, handoff, dispatch, devPreview } = state;
242
- const iteration = pipeline.iteration;
243
- const stage = pipeline.stage;
244
-
245
- const exitStr = stageExit(iteration, stage);
246
- const roles = dispatchableRoles(iteration, stage);
247
- const todoWriteRoles = canWriteTodo(iteration, stage);
248
- const cleared = todosCleared(state);
249
- const todoSummary = buildTodoSummary(todos, iteration);
250
-
251
- // recent handoff history tail (last 3)
252
- const history = handoff.history || [];
253
- const recentHistory = history.slice(-3).map((e) => ({
254
- seq: e.seq,
255
- role: e.role,
256
- stage: e.stage,
257
- status: e.status,
258
- summary: e.summary,
259
- artifactRefs: e.artifactRefs,
260
- pendingUserInput: e.pendingUserInput?.status && e.pendingUserInput.status !== 'none'
261
- ? e.pendingUserInput
262
- : null,
263
- }));
264
-
265
- return {
266
- // 主线指针
267
- pipeline: {
268
- iteration: pipeline.iteration,
269
- stage: pipeline.stage,
270
- stageStatus: pipeline.stageStatus,
271
- userConfirm: pipeline.userConfirm,
272
- },
273
- // 退出条件(只给调度者,不给 subagent)
274
- stageExit: exitStr,
275
- // 调度者可派角色
276
- dispatchableRoles: roles,
277
- // todo 写权限角色
278
- canWriteTodo: todoWriteRoles,
279
- // todo 池摘要
280
- todoPool: todoSummary,
281
- todosCleared: cleared,
282
- // 闸门
283
- gate: gate,
284
- // 用户输入等待态:dispatch 仍 active,调度者问用户后用 sendMessage 恢复同一个 subagent
285
- pendingUserInput: handoff.pendingUserInput || null,
286
- orchestratorAction: buildOrchestratorAction(dispatch, handoff.pendingUserInput),
287
- contextReuseHint: buildContextReuseHint(todos, iteration, stage, handoff),
288
- // 最近 handoff 轨
289
- recentHandoffHistory: recentHistory,
290
- // 共享决策
291
- sharedDecisions: handoff.sharedDecisions || {},
292
- // dev server 状态
293
- devStatus: devPreview?.devStatus ?? null,
294
- devUrl: devPreview?.devUrl ?? null,
295
- loadCheck: devPreview?.loadCheck ?? null,
296
- // 当前 dispatch(调度者写的工单摘要)
297
- activeTodoId: dispatch?.activeTodoId ?? 'none',
298
- dispatchedRole: dispatch?.role ?? '',
299
- // DoD 检查(只在有定义的阶段非 null)
300
- stageDod: buildStageDod(iteration, stage, gate?.stageDoD),
301
- };
302
- }
303
-
304
- function main() {
305
- const opts = parseArgs(process.argv.slice(2));
306
- if (!stateExists(opts.root)) {
307
- console.error('Missing docs/project-state.json (run npm run ensure:project)');
308
- process.exit(1);
309
- }
310
- const state = readState(opts.root);
311
-
312
- // Subagent dispatch view: only state.dispatch, nothing else
313
- if (opts.jsonTarget === 'dispatch' || (opts.json && opts.jsonTarget === 'dispatch')) {
314
- console.log(JSON.stringify(omitEmptyDispatchFields(buildDispatchView(state)), null, 2));
315
- return;
316
- }
317
-
318
- const view = buildOrchestratorView(state);
319
-
320
- if (opts.json) {
321
- // Full JSON orchestrator view, optionally filtered by keys
322
- const keys = opts.keys.length > 0 ? opts.keys : Object.keys(view);
323
- const out = {};
324
- for (const key of keys) {
325
- out[key] = view[key] ?? null;
326
- }
327
- console.log(JSON.stringify(out, null, 2));
328
- return;
329
- }
330
-
331
- // Text output
332
- const keys = opts.keys.length > 0 ? opts.keys : Object.keys(view);
333
- for (const key of keys) {
334
- const value = view[key];
335
- console.log(`${key}: ${typeof value === 'string' ? value : JSON.stringify(value)}`);
336
- }
337
- }
338
-
339
- main();
@@ -1,39 +0,0 @@
1
- /**
2
- * state-handoff — thin façade over state-store for hooks/callers that only need
3
- * the flat handoff map.
4
- *
5
- * Process backing file is docs/project-state.json; the md is a rendered, read-only
6
- * view. Hooks read state via flatHandoff; they never parse the md. This module
7
- * exists so read-only hooks and dev-start can import a stable, store-backed API
8
- * instead of touching state-store internals directly.
9
- */
10
-
11
- import path from 'node:path';
12
- import { applyStateUpdates, flatHandoff, readState } from './state-store.mjs';
13
-
14
- export function resolveProjectStatePath(root) {
15
- return path.join(path.resolve(root), 'docs/project-state.md');
16
- }
17
-
18
- /** Derive the project root from a docs/project-state.md path. */
19
- function rootFromStatePath(statePath) {
20
- // statePath = <root>/docs/project-state.md
21
- return path.dirname(path.dirname(path.resolve(statePath)));
22
- }
23
-
24
- /**
25
- * Apply flat key/value updates through the store (JSON truth + rendered md).
26
- * Takes the md path; resolves the project root from it internally.
27
- * @param {string} statePath path to docs/project-state.md
28
- * @param {Record<string, string>} updates
29
- * @returns {object} flattened handoff view
30
- */
31
- export function applyHandoffUpdates(statePath, updates) {
32
- const state = applyStateUpdates(rootFromStatePath(statePath), updates);
33
- return flatHandoff(state);
34
- }
35
-
36
- /** Read the flat handoff view (pipeline+dispatch+todos+gate) for a project root. */
37
- export function readHandoffForRoot(root) {
38
- return flatHandoff(readState(root));
39
- }
@@ -1,94 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Update project state without hand-editing markdown.
4
- *
5
- * Writes into docs/project-state.json (process backing file) and re-renders
6
- * docs/project-state.md. Keys are routed to the right section automatically.
7
- *
8
- * Usage:
9
- * npm run state:set -- stage=generate stageStatus=in_progress
10
- * npm run state:set -- devStatus=ready
11
- * npm run state:set -- canAskUser=yes
12
- * npm run state:set -- pipelinePatch='{"userConfirm":"confirmed"}'
13
- * npm run state:set -- dispatchPatch='{"role":"developer","goal":"..."}'
14
- * node skills/_shared/scripts/state-set.mjs --root=. key=value [...]
15
- *
16
- * Flat keys:
17
- * iteration, stage, stageStatus, userConfirm → pipeline.*
18
- * canAskUser → gate.canAskUser
19
- * devPreview keys (devStatus, devUrl, loadCheck, etc.)
20
- * userIntent
21
- * JSON-patch keys (merge):
22
- * pipelinePatch, dispatchPatch, handoffPatch, pendingUserInputPatch,
23
- * sharedDecisionsPatch, gatePatch
24
- * Array-replace key:
25
- * todosPatch (JSON array)
26
- */
27
-
28
- import {
29
- applyStateUpdates,
30
- readState,
31
- } from './state-store.mjs';
32
-
33
- function parseArgs(argv) {
34
- const opts = { root: process.cwd(), pairs: [] };
35
- for (let i = 0; i < argv.length; i += 1) {
36
- const arg = argv[i];
37
- if (arg.startsWith('--root=')) {
38
- opts.root = arg.slice('--root='.length);
39
- } else if (arg === '--help' || arg === '-h') {
40
- console.log('Usage: state-set.mjs [--root=.] key=value [...]');
41
- console.log('Flat keys: iteration, stage, stageStatus, userConfirm, canAskUser, userIntent, devStatus, devUrl, loadCheck, ...');
42
- console.log('JSON-patch keys: pipelinePatch, dispatchPatch, handoffPatch, pendingUserInputPatch, sharedDecisionsPatch, gatePatch, todosPatch');
43
- process.exit(0);
44
- } else if (arg.includes('=')) {
45
- const eq = arg.indexOf('=');
46
- opts.pairs.push({ key: arg.slice(0, eq), value: arg.slice(eq + 1) });
47
- }
48
- }
49
- return opts;
50
- }
51
-
52
- function flattenForPrint(state) {
53
- return {
54
- // pipeline fields
55
- iteration: state.pipeline?.iteration,
56
- stage: state.pipeline?.stage,
57
- stageStatus: state.pipeline?.stageStatus,
58
- userConfirm: state.pipeline?.userConfirm,
59
- // gate
60
- canAskUser: state.gate?.canAskUser,
61
- // top-level
62
- userIntent: state.userIntent,
63
- // devPreview
64
- ...state.devPreview,
65
- devBlockers: JSON.stringify(state.devPreview?.devBlockers ?? []),
66
- // dispatch summary
67
- dispatch: JSON.stringify(state.dispatch || {}),
68
- pendingUserInput: JSON.stringify(state.handoff?.pendingUserInput || {}),
69
- pendingUserInputPatch: JSON.stringify(state.handoff?.pendingUserInput || {}),
70
- };
71
- }
72
-
73
- function main() {
74
- const opts = parseArgs(process.argv.slice(2));
75
-
76
- if (opts.pairs.length === 0) {
77
- console.error('Nothing to set. Example: npm run state:set -- stage=generate');
78
- process.exit(1);
79
- }
80
-
81
- const updates = {};
82
- for (const { key, value } of opts.pairs) {
83
- updates[key] = value;
84
- }
85
- applyStateUpdates(opts.root, updates);
86
-
87
- const printable = flattenForPrint(readState(opts.root));
88
- for (const { key } of opts.pairs) {
89
- const v = printable[key];
90
- console.log(`${key}: ${v != null ? v : ''}`);
91
- }
92
- }
93
-
94
- main();