@opengsd/gsd-pi 1.2.0-dev.fb12b103 → 1.2.0-dev.fbdca60b

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 (580) hide show
  1. package/dist/cli-model-override.d.ts +15 -0
  2. package/dist/cli-model-override.js +21 -0
  3. package/dist/cli.js +1 -18
  4. package/dist/headless-events.js +7 -5
  5. package/dist/loader.js +6 -4
  6. package/dist/mcp-server.js +2 -1
  7. package/dist/register-agent-bundles.d.ts +11 -2
  8. package/dist/register-agent-bundles.js +18 -4
  9. package/dist/resource-loader.d.ts +10 -5
  10. package/dist/resource-loader.js +121 -6
  11. package/dist/resources/.managed-resources-content-hash +1 -1
  12. package/dist/resources/GSD-WORKFLOW.md +5 -4
  13. package/dist/resources/extensions/ask-user-questions.js +3 -2
  14. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +447 -215
  15. package/dist/resources/extensions/claude-code-cli/turn-assembler.js +33 -1
  16. package/dist/resources/extensions/gsd/auto/closeout.js +215 -0
  17. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +17 -2
  18. package/dist/resources/extensions/gsd/auto/detect-stuck.js +33 -13
  19. package/dist/resources/extensions/gsd/auto/dispatch-history.js +120 -0
  20. package/dist/resources/extensions/gsd/auto/dispatch-key.js +37 -0
  21. package/dist/resources/extensions/gsd/auto/dispatch.js +365 -0
  22. package/dist/resources/extensions/gsd/auto/finalize.js +347 -0
  23. package/dist/resources/extensions/gsd/auto/loop.js +7 -1
  24. package/dist/resources/extensions/gsd/auto/milestone-lease-reclaim.js +56 -0
  25. package/dist/resources/extensions/gsd/auto/orchestrator.js +167 -64
  26. package/dist/resources/extensions/gsd/auto/phase-helpers.js +146 -0
  27. package/dist/resources/extensions/gsd/auto/phases.js +17 -2329
  28. package/dist/resources/extensions/gsd/auto/pre-dispatch.js +534 -0
  29. package/dist/resources/extensions/gsd/auto/session.js +3 -0
  30. package/dist/resources/extensions/gsd/auto/unit-phase.js +694 -0
  31. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +1 -1
  32. package/dist/resources/extensions/gsd/auto/worktree-safety-phase.js +125 -0
  33. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +11 -34
  34. package/dist/resources/extensions/gsd/auto-dispatch.js +39 -58
  35. package/dist/resources/extensions/gsd/auto-model-selection.js +11 -7
  36. package/dist/resources/extensions/gsd/auto-post-unit.js +30 -12
  37. package/dist/resources/extensions/gsd/auto-prompts.js +66 -9
  38. package/dist/resources/extensions/gsd/auto-start.js +26 -8
  39. package/dist/resources/extensions/gsd/auto-unit-closeout.js +45 -21
  40. package/dist/resources/extensions/gsd/auto-unit-tool-scope.js +5 -4
  41. package/dist/resources/extensions/gsd/auto-verification.js +23 -30
  42. package/dist/resources/extensions/gsd/auto-worktree.js +15 -2
  43. package/dist/resources/extensions/gsd/auto.js +52 -2
  44. package/dist/resources/extensions/gsd/blocked-models.js +28 -0
  45. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +26 -6
  46. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -7
  47. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  48. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +107 -45
  49. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +302 -80
  50. package/dist/resources/extensions/gsd/closeout-wizard.js +92 -0
  51. package/dist/resources/extensions/gsd/commands/context.js +16 -2
  52. package/dist/resources/extensions/gsd/commands-handlers.js +46 -3
  53. package/dist/resources/extensions/gsd/commands-mcp-status.js +2 -2
  54. package/dist/resources/extensions/gsd/commands-workflow-templates.js +9 -2
  55. package/dist/resources/extensions/gsd/consent-question.js +353 -0
  56. package/dist/resources/extensions/gsd/consent-verdict.js +63 -0
  57. package/dist/resources/extensions/gsd/crash-recovery.js +8 -3
  58. package/dist/resources/extensions/gsd/db/engine.js +24 -6
  59. package/dist/resources/extensions/gsd/db/queries.js +56 -0
  60. package/dist/resources/extensions/gsd/db-migration-backup.js +51 -8
  61. package/dist/resources/extensions/gsd/db-transaction.js +27 -23
  62. package/dist/resources/extensions/gsd/db-writer.js +8 -17
  63. package/dist/resources/extensions/gsd/dispatch-guard.js +10 -35
  64. package/dist/resources/extensions/gsd/doctor-engine-checks.js +5 -5
  65. package/dist/resources/extensions/gsd/doctor-environment.js +256 -125
  66. package/dist/resources/extensions/gsd/doctor-git-checks.js +2 -18
  67. package/dist/resources/extensions/gsd/engine-hook-contract.js +70 -0
  68. package/dist/resources/extensions/gsd/files.js +33 -19
  69. package/dist/resources/extensions/gsd/gsd-command-home.js +22 -12
  70. package/dist/resources/extensions/gsd/gsd-db.js +17 -21
  71. package/dist/resources/extensions/gsd/guidance.js +60 -0
  72. package/dist/resources/extensions/gsd/guided-flow.js +93 -4
  73. package/dist/resources/extensions/gsd/health-widget.js +87 -28
  74. package/dist/resources/extensions/gsd/markdown-renderer.js +10 -0
  75. package/dist/resources/extensions/gsd/mcp-bridge.js +10 -0
  76. package/dist/resources/extensions/gsd/memory-relations.js +1 -1
  77. package/dist/resources/extensions/gsd/milestone-closeout.js +85 -24
  78. package/dist/resources/extensions/gsd/milestone-planning-persistence.js +2 -2
  79. package/dist/resources/extensions/gsd/milestone-reopen-events.js +3 -5
  80. package/dist/resources/extensions/gsd/milestone-settlement.js +2 -2
  81. package/dist/resources/extensions/gsd/notifications.js +12 -7
  82. package/dist/resources/extensions/gsd/parsers-legacy.js +16 -4
  83. package/dist/resources/extensions/gsd/projection-flush.js +7 -0
  84. package/dist/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  85. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  86. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  87. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  88. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -1
  89. package/dist/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  90. package/dist/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  91. package/dist/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  92. package/dist/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  93. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -1
  94. package/dist/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  95. package/dist/resources/extensions/gsd/prompts/run-uat.md +8 -4
  96. package/dist/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  97. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  98. package/dist/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  99. package/dist/resources/extensions/gsd/reactive-graph.js +8 -1
  100. package/dist/resources/extensions/gsd/roadmap-slices.js +25 -3
  101. package/dist/resources/extensions/gsd/session-lock.js +1 -1
  102. package/dist/resources/extensions/gsd/skill-activation.js +3 -6
  103. package/dist/resources/extensions/gsd/state.js +11 -2
  104. package/dist/resources/extensions/gsd/tool-contract.js +14 -3
  105. package/dist/resources/extensions/gsd/tool-presentation-plan.js +4 -4
  106. package/dist/resources/extensions/gsd/tool-surface-readiness.js +83 -31
  107. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -2
  108. package/dist/resources/extensions/gsd/tools/complete-slice.js +22 -12
  109. package/dist/resources/extensions/gsd/tools/complete-task.js +65 -2
  110. package/dist/resources/extensions/gsd/tools/plan-slice.js +2 -2
  111. package/dist/resources/extensions/gsd/tools/plan-task.js +2 -2
  112. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +2 -2
  113. package/dist/resources/extensions/gsd/tools/reopen-milestone.js +2 -2
  114. package/dist/resources/extensions/gsd/tools/reopen-slice.js +2 -2
  115. package/dist/resources/extensions/gsd/tools/reopen-task.js +2 -2
  116. package/dist/resources/extensions/gsd/tools/replan-slice.js +2 -2
  117. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +67 -2
  118. package/dist/resources/extensions/gsd/uat-policy.js +40 -15
  119. package/dist/resources/extensions/gsd/unit-context-composer.js +1 -1
  120. package/dist/resources/extensions/gsd/unit-registry.js +34 -4
  121. package/dist/resources/extensions/gsd/verdict-parser.js +1 -1
  122. package/dist/resources/extensions/gsd/verification-verdict.js +2 -1
  123. package/dist/resources/extensions/gsd/workflow-event-ledger.js +91 -0
  124. package/dist/resources/extensions/gsd/workflow-event-vocabulary.js +46 -0
  125. package/dist/resources/extensions/gsd/workflow-events.js +6 -18
  126. package/dist/resources/extensions/gsd/workflow-mcp-auto-prep.js +2 -0
  127. package/dist/resources/extensions/gsd/workflow-mcp-readiness-cache.js +105 -0
  128. package/dist/resources/extensions/gsd/workflow-reconcile.js +21 -56
  129. package/dist/resources/extensions/gsd/worktree-lifecycle.js +3 -2
  130. package/dist/resources/extensions/gsd/worktree-manager.js +7 -1
  131. package/dist/resources/extensions/gsd/worktree-safety.js +28 -26
  132. package/dist/resources/extensions/gsd/worktree.js +8 -1
  133. package/dist/resources/extensions/mcp-client/manager.js +6 -1
  134. package/dist/resources/extensions/shared/gsd-browser-cli.js +21 -2
  135. package/dist/resources/shared/gsd-browser-path-sync.js +214 -0
  136. package/dist/resources/shared/package-manager-detection.js +1 -1
  137. package/dist/resources/skills/create-skill/SKILL.md +3 -0
  138. package/dist/resources/skills/create-skill/references/skill-structure.md +1 -0
  139. package/dist/runtime-checks.d.ts +10 -0
  140. package/dist/runtime-checks.js +27 -0
  141. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  142. package/dist/update-check.d.ts +2 -0
  143. package/dist/update-check.js +24 -1
  144. package/dist/update-cmd.js +20 -3
  145. package/dist/web/standalone/.next/BUILD_ID +1 -1
  146. package/dist/web/standalone/.next/app-path-routes-manifest.json +6 -6
  147. package/dist/web/standalone/.next/build-manifest.json +2 -2
  148. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  149. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  150. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  152. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  156. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  157. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  158. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  159. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  160. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  161. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  162. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  163. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  164. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  165. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  167. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  173. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  175. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  177. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  181. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  183. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  195. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/index.html +1 -1
  200. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  201. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  202. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  203. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  204. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  205. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  206. package/dist/web/standalone/.next/server/app-paths-manifest.json +6 -6
  207. package/dist/web/standalone/.next/server/chunks/{5942.js → 1128.js} +1 -1
  208. package/dist/web/standalone/.next/server/chunks/8357.js +2 -2
  209. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  211. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  212. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  213. package/dist/web/standalone/node_modules/node-pty/build/Makefile +1 -1
  214. package/dist/web/standalone/node_modules/postcss/lib/container.js +26 -18
  215. package/dist/web/standalone/node_modules/postcss/lib/css-syntax-error.js +47 -14
  216. package/dist/web/standalone/node_modules/postcss/lib/declaration.js +4 -4
  217. package/dist/web/standalone/node_modules/postcss/lib/fromJSON.js +3 -3
  218. package/dist/web/standalone/node_modules/postcss/lib/input.js +54 -29
  219. package/dist/web/standalone/node_modules/postcss/lib/lazy-result.js +47 -37
  220. package/dist/web/standalone/node_modules/postcss/lib/map-generator.js +26 -9
  221. package/dist/web/standalone/node_modules/postcss/lib/no-work-result.js +57 -55
  222. package/dist/web/standalone/node_modules/postcss/lib/node.js +99 -31
  223. package/dist/web/standalone/node_modules/postcss/lib/parse.js +1 -1
  224. package/dist/web/standalone/node_modules/postcss/lib/parser.js +10 -9
  225. package/dist/web/standalone/node_modules/postcss/lib/postcss.js +12 -12
  226. package/dist/web/standalone/node_modules/postcss/lib/previous-map.js +30 -11
  227. package/dist/web/standalone/node_modules/postcss/lib/processor.js +7 -7
  228. package/dist/web/standalone/node_modules/postcss/lib/result.js +5 -5
  229. package/dist/web/standalone/node_modules/postcss/lib/rule.js +6 -6
  230. package/dist/web/standalone/node_modules/postcss/lib/stringifier.js +69 -28
  231. package/dist/web/standalone/node_modules/postcss/lib/tokenize.js +6 -2
  232. package/dist/web/standalone/node_modules/postcss/package.json +48 -48
  233. package/package.json +3 -3
  234. package/packages/cloud-mcp-gateway/package.json +2 -2
  235. package/packages/contracts/package.json +1 -1
  236. package/packages/daemon/package.json +4 -4
  237. package/packages/gsd-agent-core/dist/sdk.d.ts.map +1 -1
  238. package/packages/gsd-agent-core/dist/sdk.js +6 -4
  239. package/packages/gsd-agent-core/dist/sdk.js.map +1 -1
  240. package/packages/gsd-agent-core/package.json +5 -5
  241. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  242. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  243. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js +10 -0
  244. package/packages/gsd-agent-modes/dist/modes/interactive/components/settings-selector.js.map +1 -1
  245. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts +8 -0
  246. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  247. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js +50 -6
  248. package/packages/gsd-agent-modes/dist/modes/interactive/components/tool-execution.js.map +1 -1
  249. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts +2 -0
  250. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.d.ts.map +1 -1
  251. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js +34 -5
  252. package/packages/gsd-agent-modes/dist/modes/interactive/components/transcript-design.js.map +1 -1
  253. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts +1 -0
  254. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  255. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js +17 -0
  256. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-mode.js.map +1 -1
  257. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.d.ts.map +1 -1
  258. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js +4 -0
  259. package/packages/gsd-agent-modes/dist/modes/interactive/interactive-selectors-settings.js.map +1 -1
  260. package/packages/gsd-agent-modes/package.json +7 -7
  261. package/packages/mcp-server/README.md +12 -3
  262. package/packages/mcp-server/dist/cli-runner.d.ts +40 -0
  263. package/packages/mcp-server/dist/cli-runner.d.ts.map +1 -0
  264. package/packages/mcp-server/dist/cli-runner.js +137 -0
  265. package/packages/mcp-server/dist/cli-runner.js.map +1 -0
  266. package/packages/mcp-server/dist/cli.js +2 -53
  267. package/packages/mcp-server/dist/cli.js.map +1 -1
  268. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts +29 -0
  269. package/packages/mcp-server/dist/moonshot-tool-schema.d.ts.map +1 -0
  270. package/packages/mcp-server/dist/moonshot-tool-schema.js +50 -0
  271. package/packages/mcp-server/dist/moonshot-tool-schema.js.map +1 -0
  272. package/packages/mcp-server/dist/pid-registry.d.ts +46 -0
  273. package/packages/mcp-server/dist/pid-registry.d.ts.map +1 -0
  274. package/packages/mcp-server/dist/pid-registry.js +459 -0
  275. package/packages/mcp-server/dist/pid-registry.js.map +1 -0
  276. package/packages/mcp-server/dist/probe-mode.d.ts +4 -0
  277. package/packages/mcp-server/dist/probe-mode.d.ts.map +1 -0
  278. package/packages/mcp-server/dist/probe-mode.js +10 -0
  279. package/packages/mcp-server/dist/probe-mode.js.map +1 -0
  280. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  281. package/packages/mcp-server/dist/server.js +4 -0
  282. package/packages/mcp-server/dist/server.js.map +1 -1
  283. package/packages/mcp-server/dist/stdio-watchdog.d.ts +8 -0
  284. package/packages/mcp-server/dist/stdio-watchdog.d.ts.map +1 -0
  285. package/packages/mcp-server/dist/stdio-watchdog.js +40 -0
  286. package/packages/mcp-server/dist/stdio-watchdog.js.map +1 -0
  287. package/packages/mcp-server/dist/workflow-tools.d.ts +18 -18
  288. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  289. package/packages/mcp-server/dist/workflow-tools.js +161 -81
  290. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  291. package/packages/mcp-server/package.json +5 -4
  292. package/packages/native/package.json +1 -1
  293. package/packages/pi-agent-core/dist/agent-loop.js +43 -2
  294. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  295. package/packages/pi-agent-core/package.json +1 -1
  296. package/packages/pi-ai/README.md +1 -0
  297. package/packages/pi-ai/dist/image-models.generated.d.ts +2 -2
  298. package/packages/pi-ai/dist/image-models.generated.js +6 -6
  299. package/packages/pi-ai/dist/image-models.generated.js.map +1 -1
  300. package/packages/pi-ai/dist/index.d.ts +2 -0
  301. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  302. package/packages/pi-ai/dist/index.js +2 -0
  303. package/packages/pi-ai/dist/index.js.map +1 -1
  304. package/packages/pi-ai/dist/models.generated.d.ts +419 -221
  305. package/packages/pi-ai/dist/models.generated.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/models.generated.js +468 -269
  307. package/packages/pi-ai/dist/models.generated.js.map +1 -1
  308. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  309. package/packages/pi-ai/dist/providers/anthropic.js +12 -7
  310. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  311. package/packages/pi-ai/dist/providers/google-shared.d.ts +5 -0
  312. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  313. package/packages/pi-ai/dist/providers/google-shared.js +12 -3
  314. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  315. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  316. package/packages/pi-ai/dist/providers/openai-completions.js +7 -3
  317. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  318. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts +9 -0
  319. package/packages/pi-ai/dist/utils/moonshot-tool-schema.d.ts.map +1 -0
  320. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js +34 -0
  321. package/packages/pi-ai/dist/utils/moonshot-tool-schema.js.map +1 -0
  322. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  323. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +6 -2
  324. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  325. package/packages/pi-ai/package.json +3 -2
  326. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +3 -0
  327. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/core/settings-manager.js +11 -0
  329. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/theme/theme.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/theme/theme.js +45 -17
  332. package/packages/pi-coding-agent/dist/theme/theme.js.map +1 -1
  333. package/packages/pi-coding-agent/package.json +7 -7
  334. package/packages/pi-tui/README.md +15 -0
  335. package/packages/pi-tui/dist/index.d.ts +2 -2
  336. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  337. package/packages/pi-tui/dist/index.js +2 -2
  338. package/packages/pi-tui/dist/index.js.map +1 -1
  339. package/packages/pi-tui/dist/terminal-image.d.ts +33 -0
  340. package/packages/pi-tui/dist/terminal-image.d.ts.map +1 -1
  341. package/packages/pi-tui/dist/terminal-image.js +54 -2
  342. package/packages/pi-tui/dist/terminal-image.js.map +1 -1
  343. package/packages/pi-tui/dist/terminal.d.ts +12 -0
  344. package/packages/pi-tui/dist/terminal.d.ts.map +1 -1
  345. package/packages/pi-tui/dist/terminal.js +70 -25
  346. package/packages/pi-tui/dist/terminal.js.map +1 -1
  347. package/packages/pi-tui/dist/tui.d.ts +15 -0
  348. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  349. package/packages/pi-tui/dist/tui.js +106 -21
  350. package/packages/pi-tui/dist/tui.js.map +1 -1
  351. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  352. package/packages/pi-tui/dist/utils.js +110 -36
  353. package/packages/pi-tui/dist/utils.js.map +1 -1
  354. package/packages/pi-tui/package.json +2 -2
  355. package/packages/rpc-client/package.json +2 -2
  356. package/pkg/dist/theme/theme.d.ts.map +1 -1
  357. package/pkg/dist/theme/theme.js +45 -17
  358. package/pkg/dist/theme/theme.js.map +1 -1
  359. package/pkg/package.json +1 -1
  360. package/src/resources/GSD-WORKFLOW.md +5 -4
  361. package/src/resources/extensions/ask-user-questions.ts +7 -2
  362. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +11 -0
  363. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +531 -226
  364. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +672 -7
  365. package/src/resources/extensions/claude-code-cli/turn-assembler.ts +38 -1
  366. package/src/resources/extensions/gsd/auto/closeout.ts +309 -0
  367. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +21 -3
  368. package/src/resources/extensions/gsd/auto/detect-stuck.ts +32 -9
  369. package/src/resources/extensions/gsd/auto/dispatch-history.ts +168 -0
  370. package/src/resources/extensions/gsd/auto/dispatch-key.ts +39 -0
  371. package/src/resources/extensions/gsd/auto/dispatch.ts +449 -0
  372. package/src/resources/extensions/gsd/auto/finalize.ts +445 -0
  373. package/src/resources/extensions/gsd/auto/loop.ts +7 -1
  374. package/src/resources/extensions/gsd/auto/milestone-lease-reclaim.ts +74 -0
  375. package/src/resources/extensions/gsd/auto/orchestrator.ts +186 -66
  376. package/src/resources/extensions/gsd/auto/phase-helpers.ts +199 -0
  377. package/src/resources/extensions/gsd/auto/phases.ts +58 -3022
  378. package/src/resources/extensions/gsd/auto/pre-dispatch.ts +704 -0
  379. package/src/resources/extensions/gsd/auto/session.ts +3 -0
  380. package/src/resources/extensions/gsd/auto/unit-phase.ts +910 -0
  381. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +1 -1
  382. package/src/resources/extensions/gsd/auto/worktree-safety-phase.ts +149 -0
  383. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +18 -48
  384. package/src/resources/extensions/gsd/auto-dispatch.ts +37 -62
  385. package/src/resources/extensions/gsd/auto-model-selection.ts +16 -7
  386. package/src/resources/extensions/gsd/auto-post-unit.ts +33 -12
  387. package/src/resources/extensions/gsd/auto-prompts.ts +78 -9
  388. package/src/resources/extensions/gsd/auto-start.ts +27 -11
  389. package/src/resources/extensions/gsd/auto-unit-closeout.ts +83 -28
  390. package/src/resources/extensions/gsd/auto-unit-tool-scope.ts +4 -4
  391. package/src/resources/extensions/gsd/auto-verification.ts +26 -28
  392. package/src/resources/extensions/gsd/auto-worktree.ts +15 -2
  393. package/src/resources/extensions/gsd/auto.ts +64 -2
  394. package/src/resources/extensions/gsd/blocked-models.ts +49 -0
  395. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +34 -5
  396. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +56 -6
  397. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  398. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +118 -50
  399. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +350 -86
  400. package/src/resources/extensions/gsd/closeout-wizard.ts +102 -0
  401. package/src/resources/extensions/gsd/commands/context.ts +16 -2
  402. package/src/resources/extensions/gsd/commands-handlers.ts +46 -3
  403. package/src/resources/extensions/gsd/commands-mcp-status.ts +2 -2
  404. package/src/resources/extensions/gsd/commands-workflow-templates.ts +11 -4
  405. package/src/resources/extensions/gsd/consent-question.ts +431 -0
  406. package/src/resources/extensions/gsd/consent-verdict.ts +86 -0
  407. package/src/resources/extensions/gsd/crash-recovery.ts +10 -2
  408. package/src/resources/extensions/gsd/db/engine.ts +26 -6
  409. package/src/resources/extensions/gsd/db/queries.ts +66 -0
  410. package/src/resources/extensions/gsd/db-migration-backup.ts +56 -7
  411. package/src/resources/extensions/gsd/db-transaction.ts +37 -20
  412. package/src/resources/extensions/gsd/db-writer.ts +11 -19
  413. package/src/resources/extensions/gsd/dispatch-guard.ts +8 -31
  414. package/src/resources/extensions/gsd/doctor-engine-checks.ts +5 -4
  415. package/src/resources/extensions/gsd/doctor-environment.ts +267 -142
  416. package/src/resources/extensions/gsd/doctor-git-checks.ts +2 -19
  417. package/src/resources/extensions/gsd/engine-hook-contract.ts +79 -0
  418. package/src/resources/extensions/gsd/files.ts +33 -12
  419. package/src/resources/extensions/gsd/gsd-command-home.ts +13 -3
  420. package/src/resources/extensions/gsd/gsd-db.ts +19 -22
  421. package/src/resources/extensions/gsd/guidance.ts +78 -0
  422. package/src/resources/extensions/gsd/guided-flow.ts +145 -24
  423. package/src/resources/extensions/gsd/health-widget.ts +91 -27
  424. package/src/resources/extensions/gsd/markdown-renderer.ts +11 -0
  425. package/src/resources/extensions/gsd/mcp-bridge.ts +39 -0
  426. package/src/resources/extensions/gsd/memory-relations.ts +1 -1
  427. package/src/resources/extensions/gsd/milestone-closeout.ts +109 -24
  428. package/src/resources/extensions/gsd/milestone-planning-persistence.ts +2 -2
  429. package/src/resources/extensions/gsd/milestone-reopen-events.ts +3 -6
  430. package/src/resources/extensions/gsd/milestone-settlement.ts +2 -2
  431. package/src/resources/extensions/gsd/notifications.ts +13 -6
  432. package/src/resources/extensions/gsd/parsers-legacy.ts +16 -4
  433. package/src/resources/extensions/gsd/projection-flush.ts +20 -0
  434. package/src/resources/extensions/gsd/prompts/complete-slice.md +3 -3
  435. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  436. package/src/resources/extensions/gsd/prompts/plan-milestone.md +1 -1
  437. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  438. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -1
  439. package/src/resources/extensions/gsd/prompts/reassess-roadmap.md +1 -1
  440. package/src/resources/extensions/gsd/prompts/refine-slice.md +1 -1
  441. package/src/resources/extensions/gsd/prompts/replan-slice.md +1 -1
  442. package/src/resources/extensions/gsd/prompts/research-milestone.md +1 -1
  443. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -1
  444. package/src/resources/extensions/gsd/prompts/rewrite-docs.md +1 -1
  445. package/src/resources/extensions/gsd/prompts/run-uat.md +8 -4
  446. package/src/resources/extensions/gsd/prompts/triage-captures.md +1 -1
  447. package/src/resources/extensions/gsd/prompts/validate-milestone.md +1 -1
  448. package/src/resources/extensions/gsd/prompts/workflow-start.md +2 -1
  449. package/src/resources/extensions/gsd/reactive-graph.ts +11 -1
  450. package/src/resources/extensions/gsd/roadmap-slices.ts +28 -3
  451. package/src/resources/extensions/gsd/session-lock.ts +1 -1
  452. package/src/resources/extensions/gsd/skill-activation.ts +3 -6
  453. package/src/resources/extensions/gsd/state.ts +12 -1
  454. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +1 -1
  455. package/src/resources/extensions/gsd/tests/auto-blocked-remediation-message.test.ts +1 -1
  456. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +206 -22
  457. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +75 -1
  458. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +257 -18
  459. package/src/resources/extensions/gsd/tests/auto-pause-double-entry-guard.test.ts +1 -1
  460. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +77 -1
  461. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +2 -1
  462. package/src/resources/extensions/gsd/tests/auto-remote-session-lock-cleanup.test.ts +65 -3
  463. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +236 -0
  464. package/src/resources/extensions/gsd/tests/auto-unit-closeout.test.ts +169 -1
  465. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +19 -0
  466. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +42 -0
  467. package/src/resources/extensions/gsd/tests/complete-task.test.ts +141 -5
  468. package/src/resources/extensions/gsd/tests/consent-question.test.ts +351 -0
  469. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +67 -0
  470. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +68 -19
  471. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +59 -0
  472. package/src/resources/extensions/gsd/tests/db-writer.test.ts +15 -4
  473. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +12 -11
  474. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +62 -0
  475. package/src/resources/extensions/gsd/tests/discuss-routing-fixes.test.ts +12 -2
  476. package/src/resources/extensions/gsd/tests/dispatch-history.test.ts +328 -0
  477. package/src/resources/extensions/gsd/tests/dist-redirect.mjs +8 -0
  478. package/src/resources/extensions/gsd/tests/doctor-git-checks-terminal.test.ts +73 -0
  479. package/src/resources/extensions/gsd/tests/engine-hook-contract.test.ts +148 -0
  480. package/src/resources/extensions/gsd/tests/engine-interfaces-contract.test.ts +117 -91
  481. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +113 -0
  482. package/src/resources/extensions/gsd/tests/gsd-command-home.test.ts +120 -0
  483. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +46 -0
  484. package/src/resources/extensions/gsd/tests/guidance.test.ts +23 -0
  485. package/src/resources/extensions/gsd/tests/guided-dispatch-root.test.ts +18 -6
  486. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +15 -0
  487. package/src/resources/extensions/gsd/tests/integration/doctor-environment-async.test.ts +104 -0
  488. package/src/resources/extensions/gsd/tests/integration/run-uat.test.ts +217 -0
  489. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +47 -16
  490. package/src/resources/extensions/gsd/tests/mcp-readiness-preflight.test.ts +205 -0
  491. package/src/resources/extensions/gsd/tests/mcp-status.test.ts +6 -5
  492. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +95 -4
  493. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +1 -1
  494. package/src/resources/extensions/gsd/tests/milestone-report-path.test.ts +1 -1
  495. package/src/resources/extensions/gsd/tests/milestone-settlement.test.ts +92 -0
  496. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +1 -1
  497. package/src/resources/extensions/gsd/tests/notifications.test.ts +64 -9
  498. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +18 -0
  499. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +2 -2
  500. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +143 -0
  501. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +1 -1
  502. package/src/resources/extensions/gsd/tests/phases-terminal-complete-idempotent.test.ts +242 -0
  503. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +3 -3
  504. package/src/resources/extensions/gsd/tests/post-exec-retry-bypass.test.ts +63 -2
  505. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +10 -2
  506. package/src/resources/extensions/gsd/tests/prompt-db.test.ts +124 -6
  507. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +2 -4
  508. package/src/resources/extensions/gsd/tests/remote-notification-from-desktop.test.ts +31 -81
  509. package/src/resources/extensions/gsd/tests/roadmap-slices.test.ts +68 -0
  510. package/src/resources/extensions/gsd/tests/runtime-invariant-modules.test.ts +26 -2
  511. package/src/resources/extensions/gsd/tests/single-writer-invariant.test.ts +170 -48
  512. package/src/resources/extensions/gsd/tests/skill-activation.test.ts +20 -17
  513. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +7 -3
  514. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +1 -1
  515. package/src/resources/extensions/gsd/tests/teardown-chdir-failure-clears-registry.test.ts +17 -0
  516. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +4 -2
  517. package/src/resources/extensions/gsd/tests/tool-surface-readiness.test.ts +184 -10
  518. package/src/resources/extensions/gsd/tests/tool-unavailable-retry.test.ts +33 -0
  519. package/src/resources/extensions/gsd/tests/transport-gate-double-complete.test.ts +139 -0
  520. package/src/resources/extensions/gsd/tests/uat-policy.test.ts +88 -0
  521. package/src/resources/extensions/gsd/tests/uok-audit-unified.test.ts +8 -0
  522. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +1 -1
  523. package/src/resources/extensions/gsd/tests/verification-verdict.test.ts +2 -0
  524. package/src/resources/extensions/gsd/tests/workflow-events.test.ts +19 -0
  525. package/src/resources/extensions/gsd/tests/workflow-mcp-readiness-cache.test.ts +119 -0
  526. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +65 -2
  527. package/src/resources/extensions/gsd/tests/workflow-phase-contract-matrix.test.ts +332 -0
  528. package/src/resources/extensions/gsd/tests/workflow-reconcile.test.ts +20 -0
  529. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +92 -0
  530. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +273 -38
  531. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +1 -1
  532. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +1 -1
  533. package/src/resources/extensions/gsd/tests/worktree-safety-phase.test.ts +100 -0
  534. package/src/resources/extensions/gsd/tests/worktree-safety.test.ts +72 -0
  535. package/src/resources/extensions/gsd/tests/worktree-teardown-safety.test.ts +22 -0
  536. package/src/resources/extensions/gsd/tests/worktree.test.ts +18 -0
  537. package/src/resources/extensions/gsd/tests/write-gate-seam.test.ts +358 -0
  538. package/src/resources/extensions/gsd/tests/write-gate.test.ts +67 -1
  539. package/src/resources/extensions/gsd/tool-contract.ts +38 -3
  540. package/src/resources/extensions/gsd/tool-presentation-plan.ts +4 -4
  541. package/src/resources/extensions/gsd/tool-surface-readiness.ts +126 -19
  542. package/src/resources/extensions/gsd/tools/complete-milestone.ts +3 -2
  543. package/src/resources/extensions/gsd/tools/complete-slice.ts +22 -12
  544. package/src/resources/extensions/gsd/tools/complete-task.ts +90 -2
  545. package/src/resources/extensions/gsd/tools/plan-slice.ts +2 -2
  546. package/src/resources/extensions/gsd/tools/plan-task.ts +2 -2
  547. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +2 -2
  548. package/src/resources/extensions/gsd/tools/reopen-milestone.ts +2 -2
  549. package/src/resources/extensions/gsd/tools/reopen-slice.ts +2 -2
  550. package/src/resources/extensions/gsd/tools/reopen-task.ts +2 -2
  551. package/src/resources/extensions/gsd/tools/replan-slice.ts +2 -2
  552. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +81 -2
  553. package/src/resources/extensions/gsd/uat-policy.ts +60 -15
  554. package/src/resources/extensions/gsd/unit-context-composer.ts +1 -1
  555. package/src/resources/extensions/gsd/unit-registry.ts +34 -4
  556. package/src/resources/extensions/gsd/verdict-parser.ts +1 -1
  557. package/src/resources/extensions/gsd/verification-verdict.ts +4 -2
  558. package/src/resources/extensions/gsd/workflow-event-ledger.ts +131 -0
  559. package/src/resources/extensions/gsd/workflow-event-vocabulary.ts +59 -0
  560. package/src/resources/extensions/gsd/workflow-events.ts +12 -20
  561. package/src/resources/extensions/gsd/workflow-mcp-auto-prep.ts +2 -0
  562. package/src/resources/extensions/gsd/workflow-mcp-readiness-cache.ts +150 -0
  563. package/src/resources/extensions/gsd/workflow-reconcile.ts +29 -62
  564. package/src/resources/extensions/gsd/worktree-lifecycle.ts +3 -8
  565. package/src/resources/extensions/gsd/worktree-manager.ts +6 -1
  566. package/src/resources/extensions/gsd/worktree-safety.ts +41 -39
  567. package/src/resources/extensions/gsd/worktree.ts +7 -1
  568. package/src/resources/extensions/mcp-client/manager.ts +7 -1
  569. package/src/resources/extensions/shared/gsd-browser-cli.ts +23 -2
  570. package/src/resources/shared/gsd-browser-path-sync.ts +273 -0
  571. package/src/resources/shared/package-manager-detection.ts +1 -1
  572. package/src/resources/skills/create-skill/SKILL.md +3 -0
  573. package/src/resources/skills/create-skill/references/skill-structure.md +1 -0
  574. package/dist/resources/extensions/gsd/user-input-boundary.js +0 -218
  575. package/dist/resources/skills/gsd-browser/SKILL.md +0 -41
  576. package/src/resources/extensions/gsd/tests/user-input-boundary.test.ts +0 -173
  577. package/src/resources/extensions/gsd/user-input-boundary.ts +0 -216
  578. package/src/resources/skills/gsd-browser/SKILL.md +0 -41
  579. /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_buildManifest.js +0 -0
  580. /package/dist/web/standalone/.next/static/{mU4QIDlpVHDdjDpeEKh5W → 2T9IOdiiM3o3gZ4UbPi8E}/_ssgManifest.js +0 -0
@@ -4,7 +4,8 @@
4
4
  import { describe, test } from "node:test";
5
5
  import assert from "node:assert/strict";
6
6
 
7
- import { getToolSurfaceReadinessError } from "../tool-surface-readiness.ts";
7
+ import { getToolSurfaceReadinessError, awaitWorkflowMcpToolRegistration } from "../tool-surface-readiness.ts";
8
+ import { clearWorkflowMcpProbeCache, recordWorkflowMcpProbe } from "../workflow-mcp-readiness-cache.ts";
8
9
  import { isToolUnavailableError } from "../auto-tool-tracking.ts";
9
10
  import { classifyError, isTransient } from "../error-classifier.ts";
10
11
  import { toMcpToolName } from "../mcp-tool-name.ts";
@@ -58,18 +59,82 @@ describe("getToolSurfaceReadinessError", () => {
58
59
  assert.match(error, /gsd_uat_exec/);
59
60
  });
60
61
 
61
- test("passes a still-connecting (pending) server through instead of aborting", () => {
62
- // The SDK reports still-connecting servers as "pending" at init — the
63
- // common healthy session. A genuine miss after pass-through is caught
64
- // in-session ("No such tool available" → tool-unavailable → retry).
62
+ test("still blocks pending init when required tools are absent from the live surface", () => {
65
63
  const error = getToolSurfaceReadinessError({
66
- unitType: "plan-slice",
64
+ unitType: "run-uat",
67
65
  workflowServerName: SERVER,
68
66
  observation: { tools: ["read", "bash"], mcpServers: [{ name: SERVER, status: "pending" }] },
69
67
  });
68
+ assert.ok(error);
69
+ assert.match(error!, /status is "pending"/);
70
+ assert.match(error!, /gsd_uat_exec/);
71
+ });
72
+
73
+ test("accepts pending server status when the live init surface already contains every required tool", () => {
74
+ const error = getToolSurfaceReadinessError({
75
+ unitType: "run-uat",
76
+ workflowServerName: SERVER,
77
+ observation: {
78
+ tools: [
79
+ prefixed("gsd_uat_exec"),
80
+ prefixed("gsd_uat_result_save"),
81
+ prefixed("gsd_resume"),
82
+ prefixed("gsd_milestone_status"),
83
+ prefixed("gsd_journal_query"),
84
+ ],
85
+ mcpServers: [{ name: SERVER, status: "pending" }],
86
+ },
87
+ });
70
88
  assert.equal(error, null);
71
89
  });
72
90
 
91
+ test("does not accept a pending live init surface just because a probe cache covers required tools", () => {
92
+ clearWorkflowMcpProbeCache();
93
+ const projectRoot = "/tmp/project-discuss-probe";
94
+ recordWorkflowMcpProbe(projectRoot, SERVER, [
95
+ "ask_user_questions",
96
+ "gsd_summary_save",
97
+ "gsd_requirement_save",
98
+ "gsd_requirement_update",
99
+ "gsd_plan_milestone",
100
+ "gsd_milestone_generate_id",
101
+ ]);
102
+
103
+ const error = getToolSurfaceReadinessError({
104
+ unitType: "discuss-milestone",
105
+ workflowServerName: SERVER,
106
+ projectRoot,
107
+ observation: {
108
+ tools: [],
109
+ mcpServers: [{ name: SERVER, status: "pending" }],
110
+ },
111
+ });
112
+
113
+ assert.ok(error, "expected live init tools to be authoritative over direct probe cache");
114
+ assert.match(error, /status is "pending"/);
115
+ assert.match(error, /ask_user_questions/);
116
+ });
117
+
118
+ test("pending server status reports only required tools missing from the live init surface", () => {
119
+ const error = getToolSurfaceReadinessError({
120
+ unitType: "run-uat",
121
+ workflowServerName: SERVER,
122
+ observation: {
123
+ tools: [
124
+ prefixed("gsd_uat_result_save"),
125
+ prefixed("gsd_resume"),
126
+ prefixed("gsd_milestone_status"),
127
+ prefixed("gsd_journal_query"),
128
+ ],
129
+ mcpServers: [{ name: SERVER, status: "pending" }],
130
+ },
131
+ });
132
+ assert.ok(error, "expected a readiness error while gsd_uat_exec is still absent");
133
+ assert.match(error, /status is "pending"/);
134
+ assert.match(error, /gsd_uat_exec/);
135
+ assert.doesNotMatch(error, /gsd_uat_result_save/);
136
+ });
137
+
73
138
  test("returns null when all required tools are registered under the MCP prefix", () => {
74
139
  const error = getToolSurfaceReadinessError({
75
140
  unitType: "run-uat",
@@ -82,7 +147,7 @@ describe("getToolSurfaceReadinessError", () => {
82
147
  assert.equal(error, null);
83
148
  });
84
149
 
85
- test("reports the failed server and the missing tools when the surface never registered", () => {
150
+ test("reports the failed server as terminal", () => {
86
151
  const error = getToolSurfaceReadinessError({
87
152
  unitType: "run-uat",
88
153
  workflowServerName: SERVER,
@@ -90,7 +155,20 @@ describe("getToolSurfaceReadinessError", () => {
90
155
  });
91
156
  assert.ok(error, "expected a readiness error");
92
157
  assert.match(error, /workflow tool surface not ready for run-uat/);
93
- assert.match(error, /status is "failed"/);
158
+ assert.match(error, /terminal/);
159
+ });
160
+
161
+ test("reports terminal status even when required tools are already on the init surface", () => {
162
+ const error = getToolSurfaceReadinessError({
163
+ unitType: "run-uat",
164
+ workflowServerName: SERVER,
165
+ observation: {
166
+ tools: RUN_UAT_TOOLS.map(prefixed),
167
+ mcpServers: [{ name: SERVER, status: "failed" }],
168
+ },
169
+ });
170
+ assert.ok(error, "expected a readiness error despite tools on the surface");
171
+ assert.match(error, /terminal/);
94
172
  assert.match(error, /gsd_uat_exec/);
95
173
  });
96
174
 
@@ -101,7 +179,7 @@ describe("getToolSurfaceReadinessError", () => {
101
179
  observation: { tools: ["read", "bash"], mcpServers: [{ name: SERVER, status: "needs-auth" }] },
102
180
  });
103
181
  assert.ok(error, "expected a readiness error for needs-auth");
104
- assert.match(error, /status is "needs-auth"/);
182
+ assert.match(error, /terminal/);
105
183
  });
106
184
 
107
185
  test("aborts on disabled (terminal — cannot self-heal)", () => {
@@ -111,7 +189,7 @@ describe("getToolSurfaceReadinessError", () => {
111
189
  observation: { tools: ["read", "bash"], mcpServers: [{ name: SERVER, status: "disabled" }] },
112
190
  });
113
191
  assert.ok(error, "expected a readiness error for disabled");
114
- assert.match(error, /status is "disabled"/);
192
+ assert.match(error, /terminal/);
115
193
  });
116
194
 
117
195
  test("reports partially-registered surfaces even when the server says connected", () => {
@@ -128,6 +206,102 @@ describe("getToolSurfaceReadinessError", () => {
128
206
  assert.match(error, /gsd_uat_result_save/);
129
207
  assert.doesNotMatch(error, /gsd_uat_exec,/);
130
208
  });
209
+
210
+ test("reports the screenshot case: result save registered but UAT exec missing", () => {
211
+ const error = getToolSurfaceReadinessError({
212
+ unitType: "run-uat",
213
+ workflowServerName: SERVER,
214
+ observation: {
215
+ tools: [
216
+ prefixed("gsd_uat_result_save"),
217
+ prefixed("gsd_resume"),
218
+ prefixed("gsd_milestone_status"),
219
+ prefixed("gsd_journal_query"),
220
+ ],
221
+ mcpServers: [{ name: SERVER, status: "connected" }],
222
+ },
223
+ });
224
+ assert.ok(error, "expected a readiness error when gsd_uat_exec is absent");
225
+ assert.match(error, /connected but has not registered/);
226
+ assert.match(error, /gsd_uat_exec/);
227
+ assert.doesNotMatch(error, /gsd_uat_result_save/);
228
+ });
229
+ });
230
+
231
+ describe("awaitWorkflowMcpToolRegistration", () => {
232
+ test("does not skip live probe when cache already covers required tools", async () => {
233
+ clearWorkflowMcpProbeCache();
234
+ const { recordWorkflowMcpProbe } = await import("../workflow-mcp-readiness-cache.ts");
235
+ recordWorkflowMcpProbe("/tmp/project-cache-hit", SERVER, RUN_UAT_TOOLS);
236
+
237
+ let probeCalls = 0;
238
+ const error = await awaitWorkflowMcpToolRegistration({
239
+ unitType: "run-uat",
240
+ workflowServerName: SERVER,
241
+ projectRoot: "/tmp/project-cache-hit",
242
+ timeoutMs: 1,
243
+ pollMs: 1,
244
+ probe: async () => {
245
+ probeCalls += 1;
246
+ return { ok: true, tools: RUN_UAT_TOOLS };
247
+ },
248
+ });
249
+ assert.equal(error, null);
250
+ assert.ok(probeCalls > 0, "preflight must probe the live MCP server even when cache is warm");
251
+ });
252
+
253
+ test("resolves when probe reports required tools", async () => {
254
+ clearWorkflowMcpProbeCache();
255
+ const error = await awaitWorkflowMcpToolRegistration({
256
+ unitType: "run-uat",
257
+ workflowServerName: SERVER,
258
+ projectRoot: "/tmp/project",
259
+ timeoutMs: 1_000,
260
+ pollMs: 1,
261
+ probe: async () => ({
262
+ ok: true,
263
+ tools: RUN_UAT_TOOLS,
264
+ }),
265
+ });
266
+ assert.equal(error, null);
267
+ });
268
+
269
+ test("times out when required tools never register", async () => {
270
+ clearWorkflowMcpProbeCache();
271
+ const error = await awaitWorkflowMcpToolRegistration({
272
+ unitType: "run-uat",
273
+ workflowServerName: SERVER,
274
+ projectRoot: "/tmp/project",
275
+ timeoutMs: 5,
276
+ pollMs: 1,
277
+ probe: async () => ({ ok: true, tools: ["gsd_uat_result_save"] }),
278
+ });
279
+ assert.ok(error);
280
+ assert.match(error!, /did not register required tools before session start/);
281
+ });
282
+
283
+ test("aborts while waiting for workflow MCP tools", async () => {
284
+ clearWorkflowMcpProbeCache();
285
+ const controller = new AbortController();
286
+ let probeCount = 0;
287
+ const wait = awaitWorkflowMcpToolRegistration({
288
+ unitType: "run-uat",
289
+ workflowServerName: SERVER,
290
+ projectRoot: "/tmp/project-abort",
291
+ timeoutMs: 10_000,
292
+ pollMs: 10_000,
293
+ signal: controller.signal,
294
+ probe: async () => {
295
+ probeCount += 1;
296
+ return { ok: true, tools: ["gsd_uat_result_save"] };
297
+ },
298
+ });
299
+
300
+ controller.abort();
301
+
302
+ await assert.rejects(wait, /AbortError/);
303
+ assert.equal(probeCount, 1);
304
+ });
131
305
  });
132
306
 
133
307
  describe("readiness error classification contract", () => {
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Regression test for MCP tool-availability race.
3
+ *
4
+ * When the MCP workflow server is still connecting, tool calls fail with
5
+ * "No such tool available". The bounded retry counter on AutoSession
6
+ * (toolUnavailableRetries) prevents infinite re-dispatch loops by capping
7
+ * retries at 3 with escalating delay, then pausing auto-mode.
8
+ */
9
+ import { describe, test } from "node:test";
10
+ import assert from "node:assert/strict";
11
+ import { AutoSession } from "../auto/session.ts";
12
+
13
+ describe("toolUnavailableRetries on AutoSession", () => {
14
+ test("defaults to 0", () => {
15
+ const s = new AutoSession();
16
+ assert.equal(s.toolUnavailableRetries, 0);
17
+ });
18
+
19
+ test("is cleared on reset()", () => {
20
+ const s = new AutoSession();
21
+ s.toolUnavailableRetries = 2;
22
+ s.reset();
23
+ assert.equal(s.toolUnavailableRetries, 0);
24
+ });
25
+
26
+ test("accumulates across assignments (simulates retry increments)", () => {
27
+ const s = new AutoSession();
28
+ s.toolUnavailableRetries = 1;
29
+ s.toolUnavailableRetries = 2;
30
+ s.toolUnavailableRetries = 3;
31
+ assert.equal(s.toolUnavailableRetries, 3);
32
+ });
33
+ });
@@ -0,0 +1,139 @@
1
+ // gsd-pi — Regression tests for the centralized transport gate and
2
+ // milestone double-complete guard (auto-dispatch.ts + phases.ts).
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+ import { mkdirSync, mkdtempSync, rmSync } from "node:fs";
7
+ import { join } from "node:path";
8
+ import { tmpdir } from "node:os";
9
+
10
+ import { resolveDispatch } from "../auto-dispatch.ts";
11
+ import { openDatabase, closeDatabase, insertMilestone, getMilestone } from "../gsd-db.ts";
12
+ import { isClosedStatus } from "../status-guards.ts";
13
+ import { getWorkflowTransportSupportError } from "../workflow-mcp.ts";
14
+
15
+ // ── transport gate: getWorkflowTransportSupportError blocks missing tools ────
16
+
17
+ test("getWorkflowTransportSupportError blocks when required non-surface tools are missing", () => {
18
+ const err = getWorkflowTransportSupportError(
19
+ "claude-code",
20
+ ["custom_non_surface_tool"],
21
+ {
22
+ projectRoot: process.cwd(),
23
+ surface: "auto-mode",
24
+ unitType: "execute-task",
25
+ authMode: "externalCli",
26
+ baseUrl: "local://claude-code",
27
+ activeTools: ["some_other_tool"],
28
+ },
29
+ );
30
+ assert.ok(err, "should return an error when required non-surface tools are missing from activeTools");
31
+ assert.match(err, /cannot run/i);
32
+ });
33
+
34
+ test("getWorkflowTransportSupportError passes for non-MCP transport", () => {
35
+ const err = getWorkflowTransportSupportError(
36
+ "claude-code",
37
+ ["custom_non_surface_tool"],
38
+ {
39
+ projectRoot: process.cwd(),
40
+ surface: "auto-mode",
41
+ unitType: "execute-task",
42
+ authMode: "apiKey",
43
+ baseUrl: "https://api.anthropic.com",
44
+ activeTools: [],
45
+ },
46
+ );
47
+ assert.equal(err, null, "non-MCP transport should not be blocked");
48
+ });
49
+
50
+ test("resolveDispatch allows dispatch when MCP tools are available", async (t) => {
51
+ const base = mkdtempSync(join(tmpdir(), "gsd-transport-pass-"));
52
+ mkdirSync(join(base, ".gsd"), { recursive: true });
53
+ openDatabase(join(base, ".gsd", "gsd.db"));
54
+ t.after(() => {
55
+ closeDatabase();
56
+ rmSync(base, { recursive: true, force: true });
57
+ });
58
+
59
+ insertMilestone({ id: "M001", title: "Test", status: "active" });
60
+
61
+ const action = await resolveDispatch({
62
+ basePath: base,
63
+ mid: "M001",
64
+ midTitle: "Test",
65
+ state: {
66
+ phase: "executing",
67
+ activeMilestone: { id: "M001", title: "Test", status: "active" },
68
+ activeSlice: { id: "S01", title: "Slice" },
69
+ activeTask: { id: "M001/S01/T01", title: "Task", status: "pending" },
70
+ registry: [],
71
+ blockers: [],
72
+ } as any,
73
+ prefs: undefined,
74
+ // No transport gate deps → no MCP check → dispatch should go through
75
+ });
76
+
77
+ assert.equal(action.action, "dispatch");
78
+ });
79
+
80
+ // ── double-complete guard: isClosedStatus prevents duplicate closeout ────────
81
+
82
+ test("isClosedStatus detects complete milestone status", () => {
83
+ assert.equal(isClosedStatus("complete"), true);
84
+ assert.equal(isClosedStatus("done"), true);
85
+ assert.equal(isClosedStatus("skipped"), true);
86
+ assert.equal(isClosedStatus("closed"), true);
87
+ assert.equal(isClosedStatus("active"), false);
88
+ assert.equal(isClosedStatus("pending"), false);
89
+ assert.equal(isClosedStatus(""), false);
90
+ });
91
+
92
+ test("getMilestone + isClosedStatus guards against double-complete dispatch", (t) => {
93
+ const base = mkdtempSync(join(tmpdir(), "gsd-double-complete-"));
94
+ mkdirSync(join(base, ".gsd"), { recursive: true });
95
+ openDatabase(join(base, ".gsd", "gsd.db"));
96
+ t.after(() => {
97
+ closeDatabase();
98
+ rmSync(base, { recursive: true, force: true });
99
+ });
100
+
101
+ insertMilestone({ id: "M001", title: "Test", status: "complete" });
102
+
103
+ // resolveDispatch itself checks for closed milestones at the top
104
+ // (before any dispatch rule fires), which is the same guard used
105
+ // by the phases.ts double-complete check.
106
+ const milestone = getMilestone("M001");
107
+ assert.ok(milestone, "milestone should exist in DB");
108
+ assert.equal(isClosedStatus(milestone.status), true, "closed milestone must be detected");
109
+ });
110
+
111
+ test("resolveDispatch stops on closed milestone before dispatching", async (t) => {
112
+ const base = mkdtempSync(join(tmpdir(), "gsd-closed-milestone-"));
113
+ mkdirSync(join(base, ".gsd"), { recursive: true });
114
+ openDatabase(join(base, ".gsd", "gsd.db"));
115
+ t.after(() => {
116
+ closeDatabase();
117
+ rmSync(base, { recursive: true, force: true });
118
+ });
119
+
120
+ insertMilestone({ id: "M001", title: "Test", status: "complete" });
121
+
122
+ const action = await resolveDispatch({
123
+ basePath: base,
124
+ mid: "M001",
125
+ midTitle: "Test",
126
+ state: {
127
+ phase: "complete",
128
+ activeMilestone: { id: "M001", title: "Test", status: "complete" },
129
+ activeSlice: null,
130
+ activeTask: null,
131
+ registry: [],
132
+ blockers: [],
133
+ } as any,
134
+ prefs: undefined,
135
+ });
136
+
137
+ assert.equal(action.action, "stop");
138
+ assert.match(action.reason ?? "", /closed/i);
139
+ });
@@ -3,6 +3,7 @@ import assert from "node:assert/strict";
3
3
 
4
4
  import {
5
5
  classifyUatContent,
6
+ classifyUatContentForRun,
6
7
  getDeclaredUatType,
7
8
  getUatBrowserToolSupportError,
8
9
  isPartialEligibleUatType,
@@ -24,6 +25,92 @@ describe("uat-policy", () => {
24
25
  assert.equal(getDeclaredUatType("# UAT\n\nCheck generated files."), "artifact-driven");
25
26
  });
26
27
 
28
+ it("parses a bare keyword under ## UAT Type (M006/S01 agent format drift)", () => {
29
+ const content = [
30
+ "# S01 UAT",
31
+ "",
32
+ "## UAT Type",
33
+ "browser-executable",
34
+ "",
35
+ "## Preconditions",
36
+ "- Run `node tests/browser/search-uat.mjs` (it starts its own server on an ephemeral port; do not start serve-static separately).",
37
+ ].join("\n");
38
+ assert.equal(getDeclaredUatType(content), "browser-executable");
39
+ assert.equal(shouldEscalateArtifactUatToBrowser(content), false);
40
+ });
41
+
42
+ it("promotes browser-executable UAT when slice context names test:uat but UAT only documents test:server (M007/S01)", () => {
43
+ const uatFile = [
44
+ "# S01 UAT",
45
+ "",
46
+ "## UAT Type",
47
+ "- UAT mode: browser-executable",
48
+ "",
49
+ "## Preconditions",
50
+ "- Start the dev/local verification server with `npm run test:server`.",
51
+ "- Open the app at the localhost URL printed by the server.",
52
+ ].join("\n");
53
+ const sliceContext = [
54
+ "Fresh slice-level verification ran via `gsd_exec` with `npm run test:uat` and passed.",
55
+ "The run produced PASS with browser diagnostics consoleErrors=0.",
56
+ ].join("\n");
57
+
58
+ assert.equal(classifyUatContentForRun(uatFile, sliceContext).effectiveType, "runtime-executable");
59
+ assert.equal(classifyUatContentForRun(uatFile).effectiveType, "browser-executable");
60
+ });
61
+
62
+ it("promotes browser-executable UAT to runtime-executable when a self-contained harness is named (M006/S01)", () => {
63
+ const content = [
64
+ "# S01 UAT",
65
+ "",
66
+ "## UAT Type",
67
+ "- UAT mode: browser-executable",
68
+ "",
69
+ "## Preconditions",
70
+ "- Start the local app server with `npm run start`.",
71
+ "- Open the app at `http://127.0.0.1:4173`.",
72
+ "",
73
+ "## Evidence",
74
+ "- Fresh closeout verification command: `node --check app.js && node --check tests/browser/search-uat.mjs && npm run test:uat`",
75
+ ].join("\n");
76
+
77
+ assert.equal(resolveEffectiveUatType(content), "runtime-executable");
78
+ assert.deepEqual(classifyUatContent(content), {
79
+ declaredType: "browser-executable",
80
+ modeDeclared: true,
81
+ effectiveType: "runtime-executable",
82
+ browserRequired: false,
83
+ shouldDispatchByDefault: true,
84
+ });
85
+ });
86
+
87
+ it("parses a UAT mode line case-insensitively with bold markers", () => {
88
+ const content = [
89
+ "## UAT Type",
90
+ "- **UAT Mode:** Runtime-Executable (npx playwright test)",
91
+ ].join("\n");
92
+ assert.equal(getDeclaredUatType(content), "runtime-executable");
93
+ });
94
+
95
+ it("does not parse prose in the section as a mode declaration", () => {
96
+ const content = [
97
+ "## UAT Type",
98
+ "- Why this mode is sufficient: static checks cover the schema.",
99
+ ].join("\n");
100
+ assert.equal(getDeclaredUatType(content), "artifact-driven");
101
+ });
102
+
103
+ it("treats an explicit UAT mode line with an unrecognised value as undeclared", () => {
104
+ const content = [
105
+ "## UAT Type",
106
+ "- UAT mode: manual-spot-check",
107
+ "- browser-executable would also work",
108
+ ].join("\n");
109
+ // The explicit declaration wins (and fails to parse) — the stray keyword
110
+ // bullet below it must not be promoted to the declared mode.
111
+ assert.equal(getDeclaredUatType(content), "artifact-driven");
112
+ });
113
+
27
114
  it("escalates artifact-driven UAT to browser-executable when the spec requires browser work", () => {
28
115
  const content = [
29
116
  "## UAT Type",
@@ -38,6 +125,7 @@ describe("uat-policy", () => {
38
125
  assert.equal(shouldDispatchUatForContent(content, undefined), true);
39
126
  assert.deepEqual(classifyUatContent(content), {
40
127
  declaredType: "artifact-driven",
128
+ modeDeclared: true,
41
129
  effectiveType: "browser-executable",
42
130
  browserRequired: true,
43
131
  shouldDispatchByDefault: true,
@@ -4,6 +4,7 @@ import { mkdtempSync, readFileSync, rmSync, existsSync } from "node:fs";
4
4
  import { tmpdir } from "node:os";
5
5
  import { join } from "node:path";
6
6
  import { emitJournalEvent } from "../journal.ts";
7
+ import { appendEvent } from "../workflow-events.ts";
7
8
  import { saveActivityLog } from "../activity-log.ts";
8
9
  import { initMetrics, resetMetrics, snapshotUnitMetrics } from "../metrics.ts";
9
10
  import { setLogBasePath, logWarning } from "../workflow-logger.ts";
@@ -38,6 +39,12 @@ test("unified audit plane bridges journal/activity/metrics/workflow logger into
38
39
  eventType: "iteration-start",
39
40
  data: { turnId: "turn-123", unitId: "M001/S01/T01" },
40
41
  });
42
+ appendEvent(basePath, {
43
+ cmd: "complete-task",
44
+ params: { milestoneId: "M001", sliceId: "S01", taskId: "T01" },
45
+ ts: new Date().toISOString(),
46
+ actor: "agent",
47
+ });
41
48
 
42
49
  const activityCtx = makeMockContext([
43
50
  { type: "message", message: { role: "assistant", content: [{ type: "text", text: "hello" }] } },
@@ -73,6 +80,7 @@ test("unified audit plane bridges journal/activity/metrics/workflow logger into
73
80
  const events = readAuditEvents(basePath);
74
81
  const types = new Set(events.map((event) => String(event.type ?? "")));
75
82
  assert.ok(types.has("journal-iteration-start"));
83
+ assert.ok(types.has("workflow-event-complete_task"));
76
84
  assert.ok(types.has("activity-log-saved"));
77
85
  assert.ok(types.has("unit-metrics-snapshot"));
78
86
  assert.ok(types.has("workflow-log-warn"));
@@ -22,7 +22,7 @@ import {
22
22
  _needsPlanV2GateForTest,
23
23
  _runPlanV2GateForTest,
24
24
  } from "../guided-flow.ts";
25
- import { shouldRunPlanV2Gate } from "../auto/phases.ts";
25
+ import { shouldRunPlanV2Gate } from "../auto/phase-helpers.ts";
26
26
  import { resolveUokFlags } from "../uok/flags.ts";
27
27
 
28
28
  const MILESTONE_ID = "M001";
@@ -24,6 +24,8 @@ test("execute-task fails closed when no host-owned checks are discovered", () =>
24
24
  assert.equal(verdict.reason, "no-host-checks");
25
25
  assert.equal(verdict.retryable, false);
26
26
  assert.match(verdict.failureContext, /No runnable host-owned verification command/);
27
+ assert.match(verdict.failureContext, /\.gsd\/PREFERENCES\.md/);
28
+ assert.match(verdict.failureContext, /\/gsd next/);
27
29
  });
28
30
 
29
31
  test("execute-task passes when non-runnable task-plan prose is the verification source", () => {
@@ -13,6 +13,7 @@ import {
13
13
  compactMilestoneEvents,
14
14
  type WorkflowEvent,
15
15
  } from '../workflow-events.ts';
16
+ import { workflowEventLogPath } from '../workflow-event-ledger.ts';
16
17
 
17
18
  function tempDir(): string {
18
19
  return fs.mkdtempSync(path.join(os.tmpdir(), 'gsd-events-'));
@@ -38,6 +39,24 @@ test('workflow-events: appendEvent creates .gsd dir and event-log.jsonl', () =>
38
39
  }
39
40
  });
40
41
 
42
+ test('workflow-events: appendEvent from canonical worktree writes project ledger', () => {
43
+ const base = tempDir();
44
+ try {
45
+ const worktree = path.join(base, '.gsd-worktrees', 'M001');
46
+ fs.mkdirSync(worktree, { recursive: true });
47
+
48
+ appendEvent(worktree, makeEvent('complete-task', { milestoneId: 'M001', taskId: 'T01' }));
49
+
50
+ const projectLog = path.join(base, '.gsd', 'event-log.jsonl');
51
+ const worktreeLog = path.join(worktree, '.gsd', 'event-log.jsonl');
52
+ assert.ok(fs.existsSync(projectLog), 'project event ledger should exist');
53
+ assert.equal(fs.existsSync(worktreeLog), false, 'worktree-local event log should not be the append target');
54
+ assert.equal(workflowEventLogPath(worktree), projectLog);
55
+ } finally {
56
+ cleanupDir(base);
57
+ }
58
+ });
59
+
41
60
  test('workflow-events: appendEvent writes valid JSON line', () => {
42
61
  const base = tempDir();
43
62
  try {