gsd-pi 2.79.0 → 2.80.0-dev.c2213c771

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 (634) hide show
  1. package/README.md +94 -47
  2. package/dist/loader.js +0 -0
  3. package/dist/resources/.managed-resources-content-hash +1 -1
  4. package/dist/resources/extensions/github-sync/templates.js +55 -70
  5. package/dist/resources/extensions/gsd/auto/contracts.js +1 -0
  6. package/dist/resources/extensions/gsd/auto/custom-verify-retry-store.js +53 -0
  7. package/dist/resources/extensions/gsd/auto/loop.js +359 -523
  8. package/dist/resources/extensions/gsd/auto/orchestrator.js +146 -0
  9. package/dist/resources/extensions/gsd/auto/phases.js +61 -7
  10. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  11. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
  21. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
  23. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
  24. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
  26. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
  27. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
  29. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
  30. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  31. package/dist/resources/extensions/gsd/auto-dashboard.js +3 -0
  32. package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
  33. package/dist/resources/extensions/gsd/auto-prompts.js +220 -32
  34. package/dist/resources/extensions/gsd/auto-recovery.js +63 -55
  35. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
  36. package/dist/resources/extensions/gsd/auto-start.js +3 -2
  37. package/dist/resources/extensions/gsd/auto-verification.js +2 -11
  38. package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
  39. package/dist/resources/extensions/gsd/auto.js +159 -2
  40. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +9 -1
  41. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  42. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  43. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +52 -50
  44. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +8 -8
  45. package/dist/resources/extensions/gsd/commands/context.js +1 -1
  46. package/dist/resources/extensions/gsd/commands-ship.js +23 -46
  47. package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
  48. package/dist/resources/extensions/gsd/component-loader.js +5 -11
  49. package/dist/resources/extensions/gsd/custom-workflow-engine.js +4 -0
  50. package/dist/resources/extensions/gsd/db-adapter.js +47 -0
  51. package/dist/resources/extensions/gsd/db-base-schema.js +337 -0
  52. package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
  53. package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
  54. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
  55. package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
  56. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
  57. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
  58. package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
  59. package/dist/resources/extensions/gsd/db-migration-steps.js +394 -0
  60. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
  61. package/dist/resources/extensions/gsd/db-open-state.js +32 -0
  62. package/dist/resources/extensions/gsd/db-provider.js +108 -0
  63. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
  64. package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
  65. package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
  66. package/dist/resources/extensions/gsd/db-transaction.js +63 -0
  67. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
  68. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
  69. package/dist/resources/extensions/gsd/escalation.js +2 -0
  70. package/dist/resources/extensions/gsd/gsd-db.js +215 -1519
  71. package/dist/resources/extensions/gsd/guided-flow.js +40 -0
  72. package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
  73. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
  74. package/dist/resources/extensions/gsd/model-router.js +9 -6
  75. package/dist/resources/extensions/gsd/notification-widget.js +21 -3
  76. package/dist/resources/extensions/gsd/paths.js +5 -1
  77. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
  78. package/dist/resources/extensions/gsd/pr-evidence.js +76 -0
  79. package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
  80. package/dist/resources/extensions/gsd/preferences-types.js +20 -2
  81. package/dist/resources/extensions/gsd/preferences-validation.js +3 -3
  82. package/dist/resources/extensions/gsd/process-task-path.js +61 -0
  83. package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
  84. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  85. package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  86. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  87. package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
  88. package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
  89. package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
  90. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  91. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  92. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  93. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  94. package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  95. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  96. package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  97. package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
  98. package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  99. package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
  100. package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
  101. package/dist/resources/extensions/gsd/prompts/system.md +65 -107
  102. package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  103. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  104. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  105. package/dist/resources/extensions/gsd/state.js +4 -0
  106. package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
  107. package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
  108. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +88 -3
  109. package/dist/resources/extensions/gsd/unit-context-composer.js +32 -0
  110. package/dist/resources/extensions/gsd/unit-context-manifest.js +21 -0
  111. package/dist/resources/extensions/gsd/uok/audit.js +23 -9
  112. package/dist/resources/extensions/gsd/uok/contracts.js +69 -1
  113. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +3 -0
  114. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  115. package/dist/resources/extensions/gsd/uok/loop-adapter.js +48 -33
  116. package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
  117. package/dist/resources/extensions/gsd/uok/timeline.js +125 -0
  118. package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
  119. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  120. package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
  121. package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
  122. package/dist/resources/extensions/shared/gsd-phase-state.js +45 -3
  123. package/dist/resources/extensions/shared/interview-ui.js +15 -4
  124. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  125. package/dist/web/standalone/.next/BUILD_ID +1 -1
  126. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  127. package/dist/web/standalone/.next/build-manifest.json +3 -3
  128. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  129. package/dist/web/standalone/.next/required-server-files.json +4 -4
  130. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  131. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  141. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  143. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  146. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  147. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  150. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  155. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  160. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  161. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  169. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  176. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  184. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  185. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  191. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  196. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  197. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  203. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  211. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  219. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  225. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  227. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  228. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  232. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  234. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  242. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  244. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  245. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  249. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  254. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  257. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  265. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/index.html +1 -1
  267. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  268. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  269. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  270. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  271. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  272. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  273. package/dist/web/standalone/.next/server/app/page.js +2 -2
  274. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  276. package/dist/web/standalone/.next/server/chunks/167.js +2 -0
  277. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  278. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  279. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/middleware.js +2 -2
  281. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  282. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  283. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  284. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  285. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  286. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  287. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  288. package/dist/web/standalone/.next/static/chunks/app/page-fab3ebb85b006001.js +1 -0
  289. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  290. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  291. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  292. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  293. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  294. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  295. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  296. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  297. package/dist/web/standalone/package.json +1 -0
  298. package/dist/web/standalone/server.js +1 -1
  299. package/package.json +12 -5
  300. package/packages/contracts/dist/index.d.ts +3 -0
  301. package/packages/contracts/dist/index.d.ts.map +1 -0
  302. package/packages/contracts/dist/index.js +5 -0
  303. package/packages/contracts/dist/index.js.map +1 -0
  304. package/packages/contracts/dist/rpc.d.ts +549 -0
  305. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  306. package/packages/contracts/dist/rpc.js +53 -0
  307. package/packages/contracts/dist/rpc.js.map +1 -0
  308. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  309. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  310. package/packages/contracts/dist/rpc.test.js +47 -0
  311. package/packages/contracts/dist/rpc.test.js.map +1 -0
  312. package/packages/contracts/dist/workflow.d.ts +180 -0
  313. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  314. package/packages/contracts/dist/workflow.js +201 -0
  315. package/packages/contracts/dist/workflow.js.map +1 -0
  316. package/packages/contracts/package.json +39 -0
  317. package/packages/contracts/src/index.ts +5 -0
  318. package/packages/contracts/src/rpc.test.ts +72 -0
  319. package/packages/contracts/src/rpc.ts +286 -0
  320. package/packages/contracts/src/workflow.ts +213 -0
  321. package/packages/contracts/tsconfig.json +25 -0
  322. package/packages/daemon/package.json +3 -2
  323. package/packages/daemon/src/event-bridge.test.ts +2 -1
  324. package/packages/daemon/src/event-bridge.ts +1 -1
  325. package/packages/daemon/src/event-formatter.test.ts +1 -2
  326. package/packages/daemon/src/event-formatter.ts +1 -2
  327. package/packages/daemon/src/session-manager.ts +2 -2
  328. package/packages/daemon/src/types.ts +3 -18
  329. package/packages/mcp-server/dist/server.d.ts +13 -0
  330. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  331. package/packages/mcp-server/dist/server.js +77 -0
  332. package/packages/mcp-server/dist/server.js.map +1 -1
  333. package/packages/mcp-server/dist/session-manager.js +1 -1
  334. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  335. package/packages/mcp-server/dist/types.d.ts +3 -11
  336. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  337. package/packages/mcp-server/dist/types.js.map +1 -1
  338. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  339. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  340. package/packages/mcp-server/dist/workflow-tools.js +52 -37
  341. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  342. package/packages/mcp-server/package.json +3 -2
  343. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  344. package/packages/mcp-server/src/server.ts +99 -1
  345. package/packages/mcp-server/src/session-manager.ts +2 -2
  346. package/packages/mcp-server/src/types.ts +7 -18
  347. package/packages/mcp-server/src/workflow-tools.test.ts +129 -2
  348. package/packages/mcp-server/src/workflow-tools.ts +80 -37
  349. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  350. package/packages/native/package.json +1 -1
  351. package/packages/pi-agent-core/package.json +1 -1
  352. package/packages/pi-ai/package.json +1 -1
  353. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +14 -0
  354. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  355. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +20 -0
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +6 -1
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +9 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -10
  363. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  365. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  367. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  368. package/packages/pi-coding-agent/package.json +2 -1
  369. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +23 -2
  370. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
  371. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +6 -1
  372. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -9
  373. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  374. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  375. package/packages/pi-tui/dist/tui.d.ts +1 -0
  376. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  377. package/packages/pi-tui/dist/tui.js +8 -2
  378. package/packages/pi-tui/dist/tui.js.map +1 -1
  379. package/packages/pi-tui/package.json +1 -1
  380. package/packages/pi-tui/src/tui.ts +8 -2
  381. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  382. package/packages/rpc-client/README.md +3 -3
  383. package/packages/rpc-client/dist/index.d.ts +1 -1
  384. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  385. package/packages/rpc-client/dist/index.js.map +1 -1
  386. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  387. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  388. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  389. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  390. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  391. package/packages/rpc-client/dist/rpc-types.js +3 -11
  392. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  393. package/packages/rpc-client/package.json +4 -1
  394. package/packages/rpc-client/src/index.ts +1 -1
  395. package/packages/rpc-client/src/rpc-client.ts +3 -6
  396. package/packages/rpc-client/src/rpc-types.ts +3 -398
  397. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  398. package/pkg/package.json +1 -1
  399. package/src/resources/extensions/github-sync/templates.ts +59 -84
  400. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  401. package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
  402. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  403. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
  404. package/src/resources/extensions/gsd/auto/loop.ts +411 -598
  405. package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
  406. package/src/resources/extensions/gsd/auto/phases.ts +88 -9
  407. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  408. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  409. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  410. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  411. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  412. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  413. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  414. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
  415. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  416. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  417. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  418. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  419. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  420. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  421. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  422. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  423. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  424. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  425. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  426. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
  427. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  428. package/src/resources/extensions/gsd/auto-dashboard.ts +4 -0
  429. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
  430. package/src/resources/extensions/gsd/auto-prompts.ts +276 -31
  431. package/src/resources/extensions/gsd/auto-recovery.ts +59 -53
  432. package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
  433. package/src/resources/extensions/gsd/auto-start.ts +3 -2
  434. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  435. package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
  436. package/src/resources/extensions/gsd/auto.ts +167 -1
  437. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +14 -1
  438. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
  439. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  440. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +62 -51
  441. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
  442. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +8 -4
  443. package/src/resources/extensions/gsd/commands/context.ts +1 -1
  444. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  445. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  446. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  447. package/src/resources/extensions/gsd/custom-workflow-engine.ts +6 -0
  448. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  449. package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
  450. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  451. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  452. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  453. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  454. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  455. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  456. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  457. package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
  458. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  459. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  460. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  461. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  462. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  463. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  464. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  465. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  466. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  467. package/src/resources/extensions/gsd/escalation.ts +3 -1
  468. package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
  469. package/src/resources/extensions/gsd/guided-flow.ts +47 -0
  470. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  471. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  472. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  473. package/src/resources/extensions/gsd/model-router.ts +10 -6
  474. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  475. package/src/resources/extensions/gsd/paths.ts +6 -1
  476. package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
  477. package/src/resources/extensions/gsd/pr-evidence.ts +124 -0
  478. package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
  479. package/src/resources/extensions/gsd/preferences-types.ts +23 -4
  480. package/src/resources/extensions/gsd/preferences-validation.ts +3 -3
  481. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  482. package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
  483. package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  484. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  485. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  486. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  487. package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
  488. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  489. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  490. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  491. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  492. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  493. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  494. package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  495. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  496. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  497. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  498. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  499. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  500. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  501. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  502. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  503. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  504. package/src/resources/extensions/gsd/state.ts +6 -3
  505. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +32 -0
  506. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +65 -0
  507. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +38 -0
  508. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
  509. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
  510. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +108 -1
  511. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
  512. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
  513. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -2
  514. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
  515. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
  516. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  517. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  518. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  519. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
  520. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  521. package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
  522. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +38 -0
  523. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  524. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +12 -0
  525. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
  526. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  527. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  528. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  529. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  530. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  531. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  532. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  533. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  534. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  535. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  536. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  537. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  538. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  539. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  540. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  541. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  542. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  543. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  544. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +42 -0
  545. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +63 -2
  546. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  547. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
  548. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
  549. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  550. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
  551. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  552. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  553. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  554. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +14 -0
  555. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
  556. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
  557. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  558. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
  559. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  560. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  561. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
  562. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  563. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  564. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  565. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +8 -0
  566. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
  567. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  568. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  569. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
  570. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
  571. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  572. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +3 -0
  573. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  574. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
  575. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  576. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +85 -0
  577. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +2 -0
  578. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +59 -0
  579. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  580. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +42 -4
  581. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +32 -0
  582. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +109 -1
  583. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  584. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +98 -0
  585. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  586. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  587. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  588. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  589. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  590. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  591. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
  592. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  593. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  594. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  595. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  596. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  597. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  598. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  599. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  600. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  601. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  602. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  603. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +164 -3
  604. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  605. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  606. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
  607. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +3 -0
  608. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  609. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  610. package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
  611. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +90 -2
  612. package/src/resources/extensions/gsd/unit-context-composer.ts +49 -0
  613. package/src/resources/extensions/gsd/unit-context-manifest.ts +34 -0
  614. package/src/resources/extensions/gsd/uok/audit.ts +25 -9
  615. package/src/resources/extensions/gsd/uok/contracts.ts +105 -0
  616. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +4 -0
  617. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  618. package/src/resources/extensions/gsd/uok/loop-adapter.ts +60 -45
  619. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  620. package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
  621. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  622. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  623. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  624. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  625. package/src/resources/extensions/shared/gsd-phase-state.ts +56 -3
  626. package/src/resources/extensions/shared/interview-ui.ts +18 -5
  627. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +43 -1
  628. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
  629. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  630. package/dist/web/standalone/.next/static/chunks/app/page-ff639266d978f2a0.js +0 -1
  631. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  632. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  633. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → HZXiuIbWQmvXjo4Tl3_zk}/_buildManifest.js +0 -0
  634. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → HZXiuIbWQmvXjo4Tl3_zk}/_ssgManifest.js +0 -0
@@ -0,0 +1,203 @@
1
+ // GSD-2 + Regression tests for checkAutoStartAfterDiscuss Gate 1a (R2)
2
+ //
3
+ // When a depth-verification gate is still pending (the LLM emitted the
4
+ // confirmation question via ask_user_questions or plain chat but the user has
5
+ // not answered), checkAutoStartAfterDiscuss must NOT advance — even if
6
+ // CONTEXT.md and STATE.md are present on disk. Otherwise the LLM can render
7
+ // the question and the "Milestone M001 ready" phrase in the same turn and
8
+ // race past the gate.
9
+
10
+ import { describe, test, beforeEach, afterEach } from "node:test";
11
+ import assert from "node:assert/strict";
12
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, realpathSync } from "node:fs";
13
+ import { join } from "node:path";
14
+ import { tmpdir } from "node:os";
15
+
16
+ import {
17
+ checkAutoStartAfterDiscuss,
18
+ setPendingAutoStart,
19
+ clearPendingAutoStart,
20
+ } from "../guided-flow.ts";
21
+ import { drainLogs } from "../workflow-logger.ts";
22
+ import {
23
+ openDatabase,
24
+ closeDatabase,
25
+ insertMilestone,
26
+ } from "../gsd-db.ts";
27
+ import {
28
+ setPendingGate,
29
+ clearPendingGate,
30
+ clearDiscussionFlowState,
31
+ } from "../bootstrap/write-gate.ts";
32
+
33
+ interface MockCapture {
34
+ notifies: Array<{ msg: string; level: string }>;
35
+ messages: Array<{ payload: any; options: any }>;
36
+ }
37
+
38
+ function mkCapture(): MockCapture {
39
+ return { notifies: [], messages: [] };
40
+ }
41
+
42
+ function mkCtx(cap: MockCapture): any {
43
+ return {
44
+ ui: {
45
+ notify: (msg: string, level: string) => {
46
+ cap.notifies.push({ msg, level });
47
+ },
48
+ },
49
+ };
50
+ }
51
+
52
+ function mkPi(cap: MockCapture): any {
53
+ return {
54
+ sendMessage: (payload: any, options: any) => {
55
+ cap.messages.push({ payload, options });
56
+ },
57
+ setActiveTools: () => undefined,
58
+ getActiveTools: () => [],
59
+ };
60
+ }
61
+
62
+ function mkBase(): string {
63
+ // realpathSync to normalize the macOS /var → /private/var symlink so the
64
+ // basePath we pass to setPendingGate matches what the workspace's
65
+ // realpath-normalized projectRoot will resolve to.
66
+ const base = realpathSync(mkdtempSync(join(tmpdir(), "gsd-gate1a-pending-")));
67
+ mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
68
+ // CONTEXT.md (Gate 1) and STATE.md (Gate 2) both present so the only
69
+ // possible blocker in these tests is the new Gate 1a.
70
+ writeFileSync(
71
+ join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"),
72
+ "# M001: Pending Gate Test\n\nContext.\n",
73
+ );
74
+ writeFileSync(
75
+ join(base, ".gsd", "STATE.md"),
76
+ "# State\n\nactive: M001\n",
77
+ );
78
+ return base;
79
+ }
80
+
81
+ describe("checkAutoStartAfterDiscuss Gate 1a (pending depth-verification gate)", () => {
82
+ let base: string;
83
+ let cap: MockCapture;
84
+
85
+ beforeEach(() => {
86
+ clearPendingAutoStart();
87
+ drainLogs();
88
+ });
89
+
90
+ afterEach(() => {
91
+ closeDatabase();
92
+ clearPendingAutoStart();
93
+ if (base) {
94
+ try { clearDiscussionFlowState(base); } catch { /* */ }
95
+ try { clearPendingGate(base); } catch { /* */ }
96
+ rmSync(base, { recursive: true, force: true });
97
+ }
98
+ });
99
+
100
+ test("returns false while a depth_verification gate is pending for the same milestone", () => {
101
+ base = mkBase();
102
+ openDatabase(":memory:");
103
+ // DB row present + active so Gate 1b is not the blocker
104
+ insertMilestone({ id: "M001", title: "Pending Gate Test", status: "active" });
105
+
106
+ cap = mkCapture();
107
+ setPendingAutoStart(base, {
108
+ basePath: base,
109
+ milestoneId: "M001",
110
+ ctx: mkCtx(cap),
111
+ pi: mkPi(cap),
112
+ });
113
+
114
+ // The depth-verification gate for THIS milestone is still pending.
115
+ setPendingGate("depth_verification_M001_confirm", base);
116
+
117
+ const result = checkAutoStartAfterDiscuss();
118
+ assert.equal(result, false, "must not advance while the milestone gate is pending");
119
+ // Must not have announced "ready" or kicked auto.
120
+ const readyNotify = cap.notifies.find((n) => /ready\.?$/i.test(n.msg) && n.level === "success");
121
+ assert.equal(readyNotify, undefined, "must not announce 'ready' while gate pending");
122
+ });
123
+
124
+ test("returns false while a depth_verification_project_confirm gate is pending (deep setup)", () => {
125
+ base = mkBase();
126
+ openDatabase(":memory:");
127
+ insertMilestone({ id: "M001", title: "Pending Gate Test", status: "active" });
128
+
129
+ cap = mkCapture();
130
+ setPendingAutoStart(base, {
131
+ basePath: base,
132
+ milestoneId: "M001",
133
+ ctx: mkCtx(cap),
134
+ pi: mkPi(cap),
135
+ });
136
+
137
+ // A project-level depth-verification gate (no milestone id encoded) is pending —
138
+ // deep-setup interview has not been confirmed yet.
139
+ setPendingGate("depth_verification_project_confirm", base);
140
+
141
+ const result = checkAutoStartAfterDiscuss();
142
+ assert.equal(result, false, "must not advance while a project-level gate is pending");
143
+ });
144
+
145
+ test("returns false while a depth_verification_requirements_confirm gate is pending", () => {
146
+ base = mkBase();
147
+ openDatabase(":memory:");
148
+ insertMilestone({ id: "M001", title: "Pending Gate Test", status: "active" });
149
+
150
+ cap = mkCapture();
151
+ setPendingAutoStart(base, {
152
+ basePath: base,
153
+ milestoneId: "M001",
154
+ ctx: mkCtx(cap),
155
+ pi: mkPi(cap),
156
+ });
157
+
158
+ setPendingGate("depth_verification_requirements_confirm", base);
159
+
160
+ const result = checkAutoStartAfterDiscuss();
161
+ assert.equal(result, false, "must not advance while the requirements gate is pending");
162
+ });
163
+
164
+ test("Gate 1a does NOT trip when the pending gate is for a DIFFERENT milestone", () => {
165
+ base = mkBase();
166
+ openDatabase(":memory:");
167
+ // status: "queued" so that Gate 1b downstream of Gate 1a fires its
168
+ // recovery notify ("context file exists but milestone is still queued") —
169
+ // observing that notify proves we advanced past Gate 1a. If Gate 1a
170
+ // wrongly tripped on the M999 gate it would `return false` immediately
171
+ // and Gate 1b would never run, so the notify would be absent.
172
+ insertMilestone({ id: "M001", title: "Pending Gate Test", status: "queued" });
173
+
174
+ cap = mkCapture();
175
+ setPendingAutoStart(base, {
176
+ basePath: base,
177
+ milestoneId: "M001",
178
+ ctx: mkCtx(cap),
179
+ pi: mkPi(cap),
180
+ });
181
+
182
+ setPendingGate("depth_verification_M999_confirm", base);
183
+
184
+ const result = checkAutoStartAfterDiscuss();
185
+ assert.equal(result, false, "Gate 1b returns false (expected) — but only if Gate 1a let us through");
186
+
187
+ // Positive proof we passed Gate 1a: Gate 1b emitted its recovery notify
188
+ // about M001 (not M999 — the pending-gate milestone is irrelevant here).
189
+ const gate1bNotify = cap.notifies.find(n =>
190
+ n.level === "warning" && /M001.*context file exists but milestone is still queued/i.test(n.msg)
191
+ );
192
+ assert.ok(
193
+ gate1bNotify,
194
+ `expected Gate 1b warning notify about M001; got: ${JSON.stringify(cap.notifies)}`,
195
+ );
196
+
197
+ // Negative proof: no Gate 1a notification path exists in source today, but
198
+ // also assert no notify mentions M999 (the pending-gate milestone) — that
199
+ // would suggest Gate 1a is leaking the wrong milestone into messaging.
200
+ const m999Notify = cap.notifies.find(n => /M999/i.test(n.msg));
201
+ assert.equal(m999Notify, undefined, "no notify should reference M999 (the pending-gate milestone)");
202
+ });
203
+ });
@@ -0,0 +1,148 @@
1
+ // GSD-2 + Regression tests for checkAutoStartAfterDiscuss "ready" notify guard (R3b)
2
+ //
3
+ // Belt-and-suspenders: even when CONTEXT.md and STATE.md exist on disk, the
4
+ // "Milestone X ready." success notify must not fire when the milestone DB row
5
+ // is absent. Otherwise the user sees "ready" and then /gsd reports
6
+ // "No Active Milestone" because the milestone was never registered.
7
+
8
+ import { describe, test, beforeEach, afterEach } from "node:test";
9
+ import assert from "node:assert/strict";
10
+ import { mkdtempSync, mkdirSync, rmSync, writeFileSync, realpathSync } from "node:fs";
11
+ import { join } from "node:path";
12
+ import { tmpdir } from "node:os";
13
+
14
+ import {
15
+ checkAutoStartAfterDiscuss,
16
+ setPendingAutoStart,
17
+ clearPendingAutoStart,
18
+ } from "../guided-flow.ts";
19
+ import { drainLogs } from "../workflow-logger.ts";
20
+ import {
21
+ openDatabase,
22
+ closeDatabase,
23
+ insertMilestone,
24
+ } from "../gsd-db.ts";
25
+ import {
26
+ clearDiscussionFlowState,
27
+ clearPendingGate,
28
+ } from "../bootstrap/write-gate.ts";
29
+
30
+ interface MockCapture {
31
+ notifies: Array<{ msg: string; level: string }>;
32
+ messages: Array<{ payload: any; options: any }>;
33
+ }
34
+
35
+ function mkCapture(): MockCapture {
36
+ return { notifies: [], messages: [] };
37
+ }
38
+
39
+ function mkCtx(cap: MockCapture): any {
40
+ return {
41
+ ui: {
42
+ notify: (msg: string, level: string) => {
43
+ cap.notifies.push({ msg, level });
44
+ },
45
+ },
46
+ };
47
+ }
48
+
49
+ function mkPi(cap: MockCapture): any {
50
+ return {
51
+ sendMessage: (payload: any, options: any) => {
52
+ cap.messages.push({ payload, options });
53
+ },
54
+ setActiveTools: () => undefined,
55
+ getActiveTools: () => [],
56
+ };
57
+ }
58
+
59
+ function mkBase(): string {
60
+ // realpathSync to normalize the macOS /var → /private/var symlink so the
61
+ // basePath we pass matches what the workspace projectRoot resolves to.
62
+ const base = realpathSync(mkdtempSync(join(tmpdir(), "gsd-ready-guard-")));
63
+ mkdirSync(join(base, ".gsd", "milestones", "M001"), { recursive: true });
64
+ writeFileSync(
65
+ join(base, ".gsd", "milestones", "M001", "M001-CONTEXT.md"),
66
+ "# M001: Ready Guard Test\n\nContext.\n",
67
+ );
68
+ writeFileSync(
69
+ join(base, ".gsd", "STATE.md"),
70
+ "# State\n\nactive: M001\n",
71
+ );
72
+ return base;
73
+ }
74
+
75
+ describe("checkAutoStartAfterDiscuss ready-notify DB guard (R3b)", () => {
76
+ let base: string;
77
+ let cap: MockCapture;
78
+
79
+ beforeEach(() => {
80
+ clearPendingAutoStart();
81
+ drainLogs();
82
+ });
83
+
84
+ afterEach(() => {
85
+ closeDatabase();
86
+ clearPendingAutoStart();
87
+ if (base) {
88
+ try { clearDiscussionFlowState(base); } catch { /* */ }
89
+ try { clearPendingGate(base); } catch { /* */ }
90
+ rmSync(base, { recursive: true, force: true });
91
+ }
92
+ });
93
+
94
+ test("does not announce 'ready' when the milestone DB row is absent", () => {
95
+ base = mkBase();
96
+ // Open a fresh in-memory DB but DO NOT insertMilestone for M001.
97
+ openDatabase(":memory:");
98
+
99
+ cap = mkCapture();
100
+ setPendingAutoStart(base, {
101
+ basePath: base,
102
+ milestoneId: "M001",
103
+ ctx: mkCtx(cap),
104
+ pi: mkPi(cap),
105
+ });
106
+
107
+ const result = checkAutoStartAfterDiscuss();
108
+ assert.equal(result, false, "must return false when DB row missing");
109
+
110
+ // No success "ready" notify
111
+ const successReady = cap.notifies.find(
112
+ (n) => n.level === "success" && /ready\.?$/i.test(n.msg),
113
+ );
114
+ assert.equal(successReady, undefined, "must not announce 'ready' when DB row missing");
115
+
116
+ // An error notify must explain the missing DB row
117
+ const errorNotify = cap.notifies.find((n) => n.level === "error");
118
+ assert.ok(errorNotify, "must emit an error notify when the DB row is missing");
119
+ assert.match(
120
+ errorNotify!.msg,
121
+ /no DB row exists/i,
122
+ "error notify must mention the missing DB row",
123
+ );
124
+ assert.match(errorNotify!.msg, /M001/, "error notify must mention the milestone id");
125
+ });
126
+
127
+ test("announces 'ready' when DB row exists", () => {
128
+ base = mkBase();
129
+ openDatabase(":memory:");
130
+ insertMilestone({ id: "M001", title: "Ready Guard Test", status: "active" });
131
+
132
+ cap = mkCapture();
133
+ setPendingAutoStart(base, {
134
+ basePath: base,
135
+ milestoneId: "M001",
136
+ ctx: mkCtx(cap),
137
+ pi: mkPi(cap),
138
+ });
139
+
140
+ const result = checkAutoStartAfterDiscuss();
141
+ assert.equal(result, true, "must return true on the happy path");
142
+
143
+ const successReady = cap.notifies.find(
144
+ (n) => n.level === "success" && /Milestone\s+M001\s+ready/i.test(n.msg),
145
+ );
146
+ assert.ok(successReady, "must announce 'Milestone M001 ready.' on success");
147
+ });
148
+ });
@@ -9,7 +9,7 @@
9
9
 
10
10
  import { describe, it, beforeEach, afterEach } from "node:test";
11
11
  import assert from "node:assert/strict";
12
- import { mkdirSync, writeFileSync, rmSync } from "node:fs";
12
+ import { mkdirSync, realpathSync, writeFileSync, rmSync } from "node:fs";
13
13
  import { join } from "node:path";
14
14
  import { tmpdir } from "node:os";
15
15
  import { randomUUID } from "node:crypto";
@@ -462,7 +462,7 @@ describe("findEvalReviewFile", () => {
462
462
  const target = join(basePath, ".gsd", "milestones", "M001", "slices", "S07", "S07-EVAL-REVIEW.md");
463
463
  writeFileSync(target, "---\nschema: eval-review/v1\n---\n", "utf-8");
464
464
  const found = findEvalReviewFile(basePath, "M001", "S07");
465
- assert.equal(found, target);
465
+ assert.equal(found, realpathSync(target));
466
466
  });
467
467
  });
468
468
 
@@ -12,7 +12,7 @@
12
12
 
13
13
  import { describe, it, beforeEach, afterEach } from "node:test";
14
14
  import assert from "node:assert/strict";
15
- import { mkdirSync, rmSync, writeFileSync, unlinkSync } from "node:fs";
15
+ import { mkdirSync, realpathSync, rmSync, writeFileSync, unlinkSync } from "node:fs";
16
16
  import { join } from "node:path";
17
17
  import { tmpdir } from "node:os";
18
18
  import { randomUUID } from "node:crypto";
@@ -129,7 +129,8 @@ describe("checkSliceEvalReview", () => {
129
129
  // points to a missing file — exactly the race a prior existsSync +
130
130
  // readFileSync sequence panicked on.
131
131
  const resolved = resolveSliceFile(basePath, "M001", "S07", "EVAL-REVIEW");
132
- assert.equal(resolved, path);
132
+ assert.ok(resolved);
133
+ assert.equal(realpathSync(resolved), realpathSync(path));
133
134
  unlinkSync(path);
134
135
  const result = await checkSliceEvalReview(basePath, "M001", "S07");
135
136
  assert.equal(result.kind, "absent");
@@ -0,0 +1,47 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Verifies the complete milestone prompt renders required completion and verification guardrails.
3
+
4
+ import test from "node:test";
5
+ import assert from "node:assert/strict";
6
+ import { mkdtempSync, rmSync } from "node:fs";
7
+ import { tmpdir } from "node:os";
8
+ import { join } from "node:path";
9
+
10
+ test("complete milestone prompt renders compact verification and completion guidance", async (t) => {
11
+ const previousGsdHome = process.env.GSD_HOME;
12
+ const providedGsdHome = process.env.GSD_TEST_HOME;
13
+ const isolatedHome = providedGsdHome ?? mkdtempSync(join(tmpdir(), "gsd-complete-milestone-render-"));
14
+ process.env.GSD_HOME = isolatedHome;
15
+ t.after(() => {
16
+ if (previousGsdHome === undefined) delete process.env.GSD_HOME;
17
+ else process.env.GSD_HOME = previousGsdHome;
18
+ if (!providedGsdHome) rmSync(isolatedHome, { recursive: true, force: true });
19
+ });
20
+
21
+ const { loadPrompt } = await import(`../prompt-loader.ts?test=${Date.now()}`);
22
+ const prompt = loadPrompt("complete-milestone", {
23
+ workingDirectory: process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd(),
24
+ milestoneId: "M001",
25
+ milestoneTitle: "Baseline And Safety",
26
+ roadmapPath: ".gsd/milestones/M001/M001-ROADMAP.md",
27
+ milestoneSummaryPath: ".gsd/milestones/M001/M001-SUMMARY.md",
28
+ inlinedContext: "## Milestone Summary\n\n## Horizontal Checklist\n\n## Decision Re-evaluation",
29
+ extractLearningsSteps: "Write M001-LEARNINGS.md and call capture_thought.",
30
+ });
31
+
32
+ assert.match(prompt, /Complete Milestone M001/);
33
+ assert.match(prompt, /Verification Gate/);
34
+ assert.match(prompt, /Do NOT call `gsd_complete_milestone`/);
35
+ assert.match(prompt, /verification FAILED/);
36
+ assert.match(prompt, /gsd_requirement_update/);
37
+ assert.match(prompt, /gsd_complete_milestone/);
38
+ assert.match(prompt, /verificationPassed/);
39
+ assert.match(prompt, /gsd_milestone_status/);
40
+ assert.match(prompt, /Do NOT query.*\.gsd\/gsd\.db/i);
41
+ assert.match(prompt, /Horizontal Checklist/);
42
+ assert.match(prompt, /Decision Re-evaluation/);
43
+ assert.match(prompt, /self-diff/i);
44
+ assert.match(prompt, /GSD-(?:Task|Unit)/);
45
+ assert.match(prompt, /Milestone M001 complete/);
46
+ assert.doesNotMatch(prompt, /\{\{[a-zA-Z][a-zA-Z0-9_]*\}\}/);
47
+ });
@@ -1,3 +1,4 @@
1
+ // GSD2 complete-milestone tests
1
2
  import { describe, test, afterEach } from "node:test";
2
3
  import assert from "node:assert/strict";
3
4
  import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync, existsSync } from "node:fs";
@@ -432,10 +433,9 @@ describe("complete-milestone", () => {
432
433
  }
433
434
  });
434
435
 
435
- test("handleCompleteMilestone does not overwrite existing SUMMARY.md on re-dispatch (#4598)", async () => {
436
+ test("handleCompleteMilestone treats already-complete milestone as idempotent re-dispatch (#4598)", async () => {
436
437
  // This test verifies that when SUMMARY.md already exists (from a prior completion),
437
438
  // re-calling handleCompleteMilestone does not overwrite it.
438
- // Before the fix this test FAILS because the handler unconditionally writes SUMMARY.md.
439
439
  const { handleCompleteMilestone } = await import("../tools/complete-milestone.ts");
440
440
  const base = createFixtureBase();
441
441
  const mid = "M001";
@@ -443,7 +443,7 @@ describe("complete-milestone", () => {
443
443
  try {
444
444
  // Set up DB with milestone and a complete slice + task
445
445
  openDatabase(dbPath);
446
- insertMilestone({ id: mid, title: "Test Milestone", status: "active" });
446
+ insertMilestone({ id: mid, title: "Test Milestone", status: "complete" });
447
447
  insertSlice({ id: "S01", milestoneId: mid, title: "Slice One", status: "complete" });
448
448
  insertTask({ id: "T01", sliceId: "S01", milestoneId: mid, title: "Task One", status: "complete" });
449
449
 
@@ -472,15 +472,29 @@ describe("complete-milestone", () => {
472
472
  };
473
473
 
474
474
  const result = await handleCompleteMilestone(params, base);
475
+ assert.ok(!("error" in result), `already-complete re-dispatch should succeed: ${JSON.stringify(result)}`);
476
+ assert.equal(result.alreadyComplete, true);
475
477
 
476
- // The call may return an error (milestone already complete) or success
477
- // but in either case the SUMMARY.md must NOT be overwritten.
478
478
  const actualContent = readFileSync(summaryPath, "utf-8");
479
479
  assert.strictEqual(
480
480
  actualContent,
481
481
  originalContent,
482
482
  "existing SUMMARY.md must not be overwritten on re-dispatch (#4598)",
483
483
  );
484
+
485
+ // Repeated re-dispatch should also be idempotent.
486
+ const repeatResult = await handleCompleteMilestone(params, base);
487
+ assert.ok(!("error" in repeatResult), "repeated re-dispatch should also succeed");
488
+ assert.strictEqual(repeatResult.alreadyComplete, true, "repeated re-dispatch is identified as already-complete");
489
+ assert.ok(
490
+ repeatResult.summaryPath.endsWith(join(".gsd", "milestones", mid, `${mid}-SUMMARY.md`)),
491
+ "repeated re-dispatch returns the existing summary path",
492
+ );
493
+ assert.strictEqual(
494
+ readFileSync(summaryPath, "utf-8"),
495
+ originalContent,
496
+ "repeated re-dispatch must not overwrite SUMMARY.md",
497
+ );
484
498
  } finally {
485
499
  try { closeDatabase(); } catch { /* */ }
486
500
  clearPathCache();
@@ -1,12 +1,5 @@
1
- /**
2
- * Component Loader Unit Tests
3
- *
4
- * Tests for multi-format component loading:
5
- * - New format (component.yaml)
6
- * - Legacy skill format (SKILL.md with frontmatter)
7
- * - Legacy agent format (.md with frontmatter)
8
- * - Directory scanning
9
- */
1
+ // Project/App: GSD-2
2
+ // File Purpose: Verifies component loading across modern and legacy formats.
10
3
 
11
4
  import { describe, it, beforeEach, afterEach } from 'node:test';
12
5
  import assert from 'node:assert/strict';
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Regression test — currentDirectoryRoot() uses os.homedir() as fallback
3
+ * when process.cwd() throws (e.g. worktree teardown deletes the cwd).
4
+ *
5
+ * Before the fix, the catch block used `process.env.HOME ?? "/"`. On
6
+ * Windows, HOME is typically unset so this resolved to "/", an invalid
7
+ * path. After the fix, os.homedir() is used — it checks USERPROFILE,
8
+ * HOMEDRIVE+HOMEPATH, etc., returning a valid path on all platforms.
9
+ *
10
+ * The test monkey-patches process.cwd() to throw ENOENT, simulating a
11
+ * deleted cwd. currentDirectoryRoot() must NOT propagate the raw error;
12
+ * instead it falls back to homedir(), which validateDirectory correctly
13
+ * rejects as "blocked", yielding GSDNoProjectError — the same controlled
14
+ * error path handlers already know how to catch.
15
+ *
16
+ * The error message is also asserted to match validateDirectory(homedir()),
17
+ * confirming the fallback resolved to homedir() specifically (not "/" or
18
+ * any other path).
19
+ */
20
+ import { describe, test, beforeEach, afterEach } from "node:test";
21
+ import assert from "node:assert/strict";
22
+ import { homedir } from "node:os";
23
+
24
+ import { currentDirectoryRoot, GSDNoProjectError } from "../commands/context.ts";
25
+ import { validateDirectory } from "../validate-directory.ts";
26
+
27
+ describe("currentDirectoryRoot() homedir() fallback on deleted cwd", () => {
28
+ const originalCwd = process.cwd.bind(process);
29
+
30
+ beforeEach(() => {
31
+ process.cwd = () => {
32
+ const err = new Error("ENOENT: no such file or directory, uv_cwd");
33
+ (err as NodeJS.ErrnoException).code = "ENOENT";
34
+ throw err;
35
+ };
36
+ });
37
+
38
+ afterEach(() => {
39
+ process.cwd = originalCwd;
40
+ });
41
+
42
+ test("does not propagate ENOENT — throws GSDNoProjectError via homedir() fallback", () => {
43
+ const expected = validateDirectory(homedir());
44
+ assert.equal(expected.severity, "blocked", "homedir() itself should be blocked");
45
+
46
+ assert.throws(
47
+ () => currentDirectoryRoot(),
48
+ (err: unknown) => {
49
+ assert.ok(
50
+ err instanceof GSDNoProjectError,
51
+ `expected GSDNoProjectError, got: ${err}`,
52
+ );
53
+ assert.equal(
54
+ (err as Error).message,
55
+ expected.reason ?? "GSD must be run inside a project directory.",
56
+ "error message must match validateDirectory(homedir()), confirming homedir() was the fallback",
57
+ );
58
+ return true;
59
+ },
60
+ "should throw GSDNoProjectError (homedir fallback validated), not raw ENOENT",
61
+ );
62
+ });
63
+ });
@@ -372,6 +372,44 @@ describe("Custom engine loop integration", () => {
372
372
  assert.ok(stopEntry?.includes("Workflow complete"), "Should stop with 'Workflow complete'");
373
373
  });
374
374
 
375
+ it("finishes custom-engine skip turns and clears current turn state", async () => {
376
+ _resetPendingResolve();
377
+
378
+ const runDir = makeTmpDir();
379
+ const graph = makeGraph([
380
+ makeStep({ id: "step-a", dependsOn: ["step-b"] }),
381
+ makeStep({ id: "step-b", dependsOn: ["step-a"] }),
382
+ ], "blocked-workflow");
383
+ writeGraph(runDir, graph);
384
+ writeDefinition(runDir, graph.steps, "blocked-workflow");
385
+
386
+ const ctx = makeMockCtx();
387
+ const pi = makeMockPi();
388
+ const s = makeLoopSession({
389
+ activeEngineId: "custom",
390
+ activeRunDir: runDir,
391
+ basePath: runDir,
392
+ });
393
+ const turnResults: Array<{ status: string }> = [];
394
+ const deps = makeMockDeps({
395
+ uokObserver: {
396
+ onTurnStart: () => {},
397
+ onTurnResult: (result) => {
398
+ turnResults.push({ status: result.status });
399
+ s.active = false;
400
+ },
401
+ onPhaseResult: () => {},
402
+ },
403
+ });
404
+
405
+ await autoLoop(ctx, pi, s, deps);
406
+
407
+ assert.deepEqual(turnResults, [{ status: "skipped" }]);
408
+ assert.equal(s.currentTraceId, null);
409
+ assert.equal(s.currentTurnId, null);
410
+ assert.equal(pi.calls.length, 0, "skip should not dispatch a custom step");
411
+ });
412
+
375
413
  it("does not call runPreDispatch or runFinalize on the custom path", async () => {
376
414
  _resetPendingResolve();
377
415