gsd-pi 2.79.0 → 2.80.0-dev.c5f2443b3

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 (635) 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 +11 -11
  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 +11 -11
  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 +9 -2
  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/contracts/tsconfig.tsbuildinfo +1 -0
  323. package/packages/daemon/package.json +3 -2
  324. package/packages/daemon/src/event-bridge.test.ts +2 -1
  325. package/packages/daemon/src/event-bridge.ts +1 -1
  326. package/packages/daemon/src/event-formatter.test.ts +1 -2
  327. package/packages/daemon/src/event-formatter.ts +1 -2
  328. package/packages/daemon/src/session-manager.ts +2 -2
  329. package/packages/daemon/src/types.ts +3 -18
  330. package/packages/mcp-server/dist/server.d.ts +13 -0
  331. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  332. package/packages/mcp-server/dist/server.js +77 -0
  333. package/packages/mcp-server/dist/server.js.map +1 -1
  334. package/packages/mcp-server/dist/session-manager.js +1 -1
  335. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  336. package/packages/mcp-server/dist/types.d.ts +3 -11
  337. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  338. package/packages/mcp-server/dist/types.js.map +1 -1
  339. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  340. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  341. package/packages/mcp-server/dist/workflow-tools.js +52 -37
  342. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  343. package/packages/mcp-server/package.json +3 -2
  344. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  345. package/packages/mcp-server/src/server.ts +99 -1
  346. package/packages/mcp-server/src/session-manager.ts +2 -2
  347. package/packages/mcp-server/src/types.ts +7 -18
  348. package/packages/mcp-server/src/workflow-tools.test.ts +129 -2
  349. package/packages/mcp-server/src/workflow-tools.ts +80 -37
  350. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  351. package/packages/native/package.json +1 -1
  352. package/packages/pi-agent-core/package.json +1 -1
  353. package/packages/pi-ai/package.json +1 -1
  354. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +14 -0
  355. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  356. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +20 -0
  357. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  358. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  359. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +6 -1
  360. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  361. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +9 -1
  362. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  363. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +31 -10
  364. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  365. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  366. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  367. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  368. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  369. package/packages/pi-coding-agent/package.json +2 -1
  370. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +23 -2
  371. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
  372. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +6 -1
  373. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -9
  374. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  375. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  376. package/packages/pi-tui/dist/tui.d.ts +1 -0
  377. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  378. package/packages/pi-tui/dist/tui.js +8 -2
  379. package/packages/pi-tui/dist/tui.js.map +1 -1
  380. package/packages/pi-tui/package.json +1 -1
  381. package/packages/pi-tui/src/tui.ts +8 -2
  382. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  383. package/packages/rpc-client/README.md +3 -3
  384. package/packages/rpc-client/dist/index.d.ts +1 -1
  385. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  386. package/packages/rpc-client/dist/index.js.map +1 -1
  387. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  388. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  389. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  390. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  391. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  392. package/packages/rpc-client/dist/rpc-types.js +3 -11
  393. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  394. package/packages/rpc-client/package.json +4 -1
  395. package/packages/rpc-client/src/index.ts +1 -1
  396. package/packages/rpc-client/src/rpc-client.ts +3 -6
  397. package/packages/rpc-client/src/rpc-types.ts +3 -398
  398. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  399. package/pkg/package.json +1 -1
  400. package/src/resources/extensions/github-sync/templates.ts +59 -84
  401. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  402. package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
  403. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  404. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
  405. package/src/resources/extensions/gsd/auto/loop.ts +411 -598
  406. package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
  407. package/src/resources/extensions/gsd/auto/phases.ts +88 -9
  408. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  409. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  410. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  411. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  412. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  413. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  414. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  415. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
  416. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  417. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  418. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  419. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  420. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  421. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  422. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  423. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  424. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  425. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  426. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  427. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
  428. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  429. package/src/resources/extensions/gsd/auto-dashboard.ts +4 -0
  430. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
  431. package/src/resources/extensions/gsd/auto-prompts.ts +276 -31
  432. package/src/resources/extensions/gsd/auto-recovery.ts +59 -53
  433. package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
  434. package/src/resources/extensions/gsd/auto-start.ts +3 -2
  435. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  436. package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
  437. package/src/resources/extensions/gsd/auto.ts +167 -1
  438. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +14 -1
  439. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
  440. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  441. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +62 -51
  442. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
  443. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +8 -4
  444. package/src/resources/extensions/gsd/commands/context.ts +1 -1
  445. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  446. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  447. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  448. package/src/resources/extensions/gsd/custom-workflow-engine.ts +6 -0
  449. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  450. package/src/resources/extensions/gsd/db-base-schema.ts +368 -0
  451. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  452. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  453. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  454. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  455. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  456. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  457. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  458. package/src/resources/extensions/gsd/db-migration-steps.ts +434 -0
  459. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  460. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  461. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  462. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  463. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  464. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  465. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  466. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  467. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  468. package/src/resources/extensions/gsd/escalation.ts +3 -1
  469. package/src/resources/extensions/gsd/gsd-db.ts +260 -1659
  470. package/src/resources/extensions/gsd/guided-flow.ts +47 -0
  471. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  472. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  473. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  474. package/src/resources/extensions/gsd/model-router.ts +10 -6
  475. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  476. package/src/resources/extensions/gsd/paths.ts +6 -1
  477. package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
  478. package/src/resources/extensions/gsd/pr-evidence.ts +124 -0
  479. package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
  480. package/src/resources/extensions/gsd/preferences-types.ts +23 -4
  481. package/src/resources/extensions/gsd/preferences-validation.ts +3 -3
  482. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  483. package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
  484. package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  485. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  486. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  487. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  488. package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
  489. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  490. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  491. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  492. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  493. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  494. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  495. package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  496. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  497. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  498. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  499. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  500. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  501. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  502. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  503. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  504. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  505. package/src/resources/extensions/gsd/state.ts +6 -3
  506. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +32 -0
  507. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +65 -0
  508. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +38 -0
  509. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
  510. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
  511. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +108 -1
  512. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
  513. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
  514. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -2
  515. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
  516. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
  517. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  518. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  519. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  520. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
  521. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  522. package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
  523. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +38 -0
  524. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  525. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +12 -0
  526. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
  527. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  528. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  529. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  530. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  531. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  532. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  533. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  534. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  535. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  536. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  537. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  538. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  539. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  540. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  541. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  542. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  543. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  544. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  545. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +42 -0
  546. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +63 -2
  547. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  548. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
  549. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
  550. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  551. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +95 -0
  552. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  553. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  554. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  555. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +14 -0
  556. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
  557. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
  558. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  559. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
  560. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  561. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  562. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
  563. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  564. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  565. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  566. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +8 -0
  567. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
  568. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  569. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  570. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
  571. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
  572. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  573. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +3 -0
  574. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  575. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
  576. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  577. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +85 -0
  578. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +2 -0
  579. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +59 -0
  580. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  581. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +42 -4
  582. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +32 -0
  583. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +109 -1
  584. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  585. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +98 -0
  586. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  587. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  588. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  589. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  590. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  591. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  592. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
  593. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  594. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  595. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  596. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  597. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  598. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  599. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  600. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  601. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  602. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  603. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  604. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +164 -3
  605. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  606. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  607. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
  608. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +3 -0
  609. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  610. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  611. package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
  612. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +90 -2
  613. package/src/resources/extensions/gsd/unit-context-composer.ts +49 -0
  614. package/src/resources/extensions/gsd/unit-context-manifest.ts +34 -0
  615. package/src/resources/extensions/gsd/uok/audit.ts +25 -9
  616. package/src/resources/extensions/gsd/uok/contracts.ts +105 -0
  617. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +4 -0
  618. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  619. package/src/resources/extensions/gsd/uok/loop-adapter.ts +60 -45
  620. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  621. package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
  622. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  623. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  624. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  625. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  626. package/src/resources/extensions/shared/gsd-phase-state.ts +56 -3
  627. package/src/resources/extensions/shared/interview-ui.ts +18 -5
  628. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +43 -1
  629. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
  630. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  631. package/dist/web/standalone/.next/static/chunks/app/page-ff639266d978f2a0.js +0 -1
  632. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  633. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  634. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → bQDK5_LtkGVS64AirQgQG}/_buildManifest.js +0 -0
  635. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → bQDK5_LtkGVS64AirQgQG}/_ssgManifest.js +0 -0
@@ -0,0 +1,109 @@
1
+ // gsd-2 / execute-summary-save PROJECT registration hard-fail tests
2
+ import test from "node:test";
3
+ import assert from "node:assert/strict";
4
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
5
+ import { join } from "node:path";
6
+ import { tmpdir } from "node:os";
7
+ import { randomUUID } from "node:crypto";
8
+
9
+ import { openDatabase, closeDatabase, getAllMilestones } from "../gsd-db.ts";
10
+ import { markApprovalGateVerified, clearDiscussionFlowState } from "../bootstrap/write-gate.ts";
11
+ import { executeSummarySave } from "../tools/workflow-tool-executors.ts";
12
+
13
+ function makeTmpBase(): string {
14
+ const base = join(tmpdir(), `gsd-summary-save-empty-project-${randomUUID()}`);
15
+ mkdirSync(join(base, ".gsd"), { recursive: true });
16
+ return base;
17
+ }
18
+
19
+ function cleanup(base: string): void {
20
+ try { rmSync(base, { recursive: true, force: true }); } catch { /* swallow */ }
21
+ }
22
+
23
+ function openTestDb(base: string): void {
24
+ openDatabase(join(base, ".gsd", "gsd.db"));
25
+ }
26
+
27
+ async function inProjectDir<T>(dir: string, fn: () => Promise<T>): Promise<T> {
28
+ const originalCwd = process.cwd();
29
+ try {
30
+ process.chdir(dir);
31
+ return await fn();
32
+ } finally {
33
+ process.chdir(originalCwd);
34
+ }
35
+ }
36
+
37
+ function setupBase(t: { after: (fn: () => void) => void }): string {
38
+ const base = makeTmpBase();
39
+ // Force deep planning so the root-artifact guard requires a verified approval gate,
40
+ // matching the production flow that surfaces the regression.
41
+ writeFileSync(join(base, ".gsd", "PREFERENCES.md"), "---\nplanning_depth: deep\n---\n");
42
+ openTestDb(base);
43
+ markApprovalGateVerified("depth_verification_project_confirm", base);
44
+ t.after(() => {
45
+ clearDiscussionFlowState(base);
46
+ closeDatabase();
47
+ cleanup(base);
48
+ });
49
+ return base;
50
+ }
51
+
52
+ test("executeSummarySave returns isError when PROJECT.md content has zero parseable milestone lines", async (t) => {
53
+ const base = setupBase(t);
54
+
55
+ const content = [
56
+ "# Project",
57
+ "",
58
+ "## What This Is",
59
+ "",
60
+ "Bad-separator regression fixture.",
61
+ "",
62
+ "## Milestone Sequence",
63
+ "",
64
+ // Wrong separator: " : " instead of em-dash / -- / - → MILESTONE_LINE_RE matches zero lines.
65
+ "- [ ] M001: Foundation : Establish the first runnable slice.",
66
+ "",
67
+ "## Next Section",
68
+ "",
69
+ "Trailing prose with no list bullets so MILESTONE_LINE_RE cannot bridge across lines.",
70
+ "",
71
+ ].join("\n");
72
+
73
+ const result = await inProjectDir(base, () => executeSummarySave({
74
+ artifact_type: "PROJECT",
75
+ content,
76
+ }, base));
77
+
78
+ assert.equal(result.isError, true);
79
+ assert.equal(result.details.error, "milestone_registration_empty_parse");
80
+ assert.match(result.content[0].text, /zero parseable milestone lines/);
81
+ assert.equal(getAllMilestones().length, 0);
82
+ });
83
+
84
+ test("executeSummarySave registers milestones when PROJECT.md uses canonical em-dash format", async (t) => {
85
+ const base = setupBase(t);
86
+
87
+ const content = [
88
+ "# Project",
89
+ "",
90
+ "## What This Is",
91
+ "",
92
+ "Canonical milestone-sequence fixture.",
93
+ "",
94
+ "## Milestone Sequence",
95
+ "",
96
+ "- [ ] M001: Foo — bar",
97
+ "- [ ] M002: Baz — qux",
98
+ "",
99
+ ].join("\n");
100
+
101
+ const result = await inProjectDir(base, () => executeSummarySave({
102
+ artifact_type: "PROJECT",
103
+ content,
104
+ }, base));
105
+
106
+ assert.notEqual(result.isError, true);
107
+ assert.deepEqual(result.details.registeredMilestones, ["M001", "M002"]);
108
+ assert.equal(getAllMilestones().length, 2);
109
+ });
@@ -0,0 +1,59 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Verifies the execution prompt renders compact required guidance.
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("execute-task prompt renders compact execution and completion gates", 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-execute-task-render-"));
14
+ const fixtureRoot = process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd();
15
+ process.env.GSD_HOME = isolatedHome;
16
+ t.after(() => {
17
+ if (previousGsdHome === undefined) delete process.env.GSD_HOME;
18
+ else process.env.GSD_HOME = previousGsdHome;
19
+ if (!providedGsdHome) rmSync(isolatedHome, { recursive: true, force: true });
20
+ });
21
+
22
+ const { loadPrompt } = await import(`../prompt-loader.ts?test=${Date.now()}`);
23
+ const prompt = loadPrompt("execute-task", {
24
+ taskId: "T01",
25
+ taskTitle: "Implement compact prompts",
26
+ sliceId: "S01",
27
+ sliceTitle: "Prompt reduction",
28
+ milestoneId: "M001",
29
+ workingDirectory: fixtureRoot,
30
+ overridesSection: "",
31
+ runtimeContext: "Runtime context.",
32
+ phaseAnchorSection: "",
33
+ resumeSection: "",
34
+ carryForwardSection: "",
35
+ taskPlanInline: "## Task Plan\n\n1. Edit prompt.",
36
+ slicePlanExcerpt: "## Slice Plan\n\nReduce prompt size.",
37
+ gatesToClose: "- Gate: prompt markers retained.",
38
+ planPath: ".gsd/milestones/M001/slices/S01/S01-PLAN.md",
39
+ taskPlanPath: ".gsd/milestones/M001/slices/S01/tasks/T01-PLAN.md",
40
+ priorTaskLines: "- None",
41
+ skillActivation: "Load relevant skills.",
42
+ templatesDir: join(fixtureRoot, "templates"),
43
+ taskSummaryTemplatePath: "C:\\Users\\Test\\.gsd\\agent\\extensions\\gsd\\templates\\task-summary.md",
44
+ verificationBudget: "~10K chars",
45
+ taskSummaryPath: ".gsd/milestones/M001/slices/S01/tasks/T01-SUMMARY.md",
46
+ });
47
+
48
+ assert.match(prompt, /You execute\./);
49
+ assert.match(prompt, /Call `memory_query`/);
50
+ assert.match(prompt, /Before any `Write` that creates an artifact or output file/);
51
+ assert.match(prompt, /Build real behavior/);
52
+ assert.match(prompt, /Background process rule/);
53
+ assert.match(prompt, /blocker_discovered: true/);
54
+ assert.match(prompt, /C:\\Users\\Test\\.gsd\\agent\\extensions\\gsd\\templates\\task-summary\.md/);
55
+ assert.doesNotMatch(prompt, /\{\{templatesDir\}\}\/task-summary\.md/);
56
+ assert.match(prompt, /Call `gsd_task_complete`/);
57
+ assert.match(prompt, /Do not run git commands/);
58
+ assert.doesNotMatch(prompt, /\{\{[a-zA-Z][a-zA-Z0-9_]*\}\}/);
59
+ });
@@ -0,0 +1,36 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Verifies the forensics prompt renders required investigation and issue-routing guidance.
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("forensics prompt renders compact investigation and issue routing 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-forensics-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("forensics", {
23
+ problemDescription: "Auto-mode repeats the same unit.",
24
+ forensicData: "stuck-detected event for execute-task/M001/S01/T01",
25
+ gsdSourceDir: process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd(),
26
+ dedupSection: "No duplicate issue found.",
27
+ });
28
+
29
+ assert.match(prompt, /Investigation Protocol/);
30
+ assert.match(prompt, /gsd_milestone_status/);
31
+ assert.match(prompt, /sqlite3 .gsd\/gsd.db/);
32
+ assert.match(prompt, /gh issue create --repo gsd-build\/gsd-2/);
33
+ assert.match(prompt, /Do NOT use the `github_issues` tool/);
34
+ assert.match(prompt, /Redaction Rules/);
35
+ assert.doesNotMatch(prompt, /\{\{[a-zA-Z][a-zA-Z0-9_]*\}\}/);
36
+ });
@@ -1,3 +1,5 @@
1
+ // GSD Extension - Database regression tests.
2
+
1
3
  import { describe, test } from 'node:test';
2
4
  import assert from 'node:assert/strict';
3
5
  import * as fs from 'node:fs';
@@ -29,7 +31,10 @@ import {
29
31
  getTask,
30
32
  getSliceTasks,
31
33
  checkpointDatabase,
34
+ refreshOpenDatabaseFromDisk,
35
+ tryCreateMemoriesFts,
32
36
  } from '../gsd-db.ts';
37
+ import { _resetLogs, peekLogs, setStderrLoggingEnabled } from '../workflow-logger.ts';
33
38
 
34
39
  const _require = createRequire(import.meta.url);
35
40
 
@@ -910,6 +915,31 @@ describe('gsd-db', () => {
910
915
  closeDatabase();
911
916
  });
912
917
 
918
+ test('gsd-db: FTS5 unavailable warning normalizes provider typo', () => {
919
+ const previousStderr = setStderrLoggingEnabled(false);
920
+ _resetLogs();
921
+ try {
922
+ const ok = tryCreateMemoriesFts({
923
+ exec(): void {
924
+ throw new Error('no such moduel : fts5');
925
+ },
926
+ prepare(): never {
927
+ throw new Error('prepare should not be called');
928
+ },
929
+ close(): void {},
930
+ });
931
+
932
+ assert.equal(ok, false, 'FTS5 creation should report fallback');
933
+ const warning = peekLogs().find((entry) => entry.component === 'db' && entry.message.includes('FTS5 unavailable'));
934
+ assert.ok(warning, 'FTS5 fallback warning should be logged');
935
+ assert.match(warning!.message, /no such module: fts5/);
936
+ assert.doesNotMatch(warning!.message, /moduel/);
937
+ } finally {
938
+ _resetLogs();
939
+ setStderrLoggingEnabled(previousStderr);
940
+ }
941
+ });
942
+
913
943
  // ─── checkpointDatabase ────────────────────────────────────────────────────
914
944
 
915
945
  describe('checkpointDatabase', () => {
@@ -952,6 +982,71 @@ describe('gsd-db', () => {
952
982
  });
953
983
  });
954
984
 
985
+ // ─── refreshOpenDatabaseFromDisk ───────────────────────────────────────────
986
+
987
+ describe('refreshOpenDatabaseFromDisk', () => {
988
+ test('refreshOpenDatabaseFromDisk: reopens the active file-backed database and sees external writes', (t) => {
989
+ const dbPath = tempDbPath();
990
+ t.after(() => cleanup(dbPath));
991
+
992
+ openDatabase(dbPath);
993
+ insertMilestone({ id: 'M001', title: 'Test', status: 'active' });
994
+ insertSlice({
995
+ id: 'S01',
996
+ milestoneId: 'M001',
997
+ title: 'Slice 1',
998
+ status: 'pending',
999
+ sequence: 1,
1000
+ });
1001
+ insertTask({
1002
+ id: 'T01',
1003
+ milestoneId: 'M001',
1004
+ sliceId: 'S01',
1005
+ title: 'Task 1',
1006
+ status: 'pending',
1007
+ sequence: 1,
1008
+ });
1009
+
1010
+ const adapterBefore = _getAdapter()!;
1011
+
1012
+ const externalDb = openRawSqliteForTest(dbPath);
1013
+ try {
1014
+ externalDb.exec(`
1015
+ INSERT INTO tasks (milestone_id, slice_id, id, title, status, sequence)
1016
+ VALUES ('M001', 'S01', 'T02', 'Task 2', 'pending', 2)
1017
+ `);
1018
+ } finally {
1019
+ externalDb.close();
1020
+ }
1021
+
1022
+ const visibleBeforeRefresh = getSliceTasks('M001', 'S01').map(task => task.id);
1023
+ assert.ok(visibleBeforeRefresh.includes('T01'));
1024
+
1025
+ assert.equal(refreshOpenDatabaseFromDisk(), true);
1026
+ assert.notEqual(_getAdapter(), adapterBefore, 'refresh must replace the active adapter rather than becoming a no-op');
1027
+ const sliceTaskIds = getSliceTasks('M001', 'S01').map(task => task.id);
1028
+ assert.deepEqual(sliceTaskIds, ['T01', 'T02']);
1029
+ assert.equal(isDbAvailable(), true);
1030
+ });
1031
+
1032
+ test('refreshOpenDatabaseFromDisk: refuses in-memory databases without closing them', () => {
1033
+ openDatabase(':memory:');
1034
+ insertMilestone({ id: 'M001', title: 'Test', status: 'active' });
1035
+
1036
+ assert.equal(refreshOpenDatabaseFromDisk(), false);
1037
+ assert.equal(isDbAvailable(), true);
1038
+ assert.ok(_getAdapter()!.prepare("SELECT 1 FROM milestones WHERE id = 'M001'").get());
1039
+
1040
+ closeDatabase();
1041
+ });
1042
+
1043
+ test('refreshOpenDatabaseFromDisk: is a no-op when no database is open', () => {
1044
+ closeDatabase();
1045
+ assert.equal(refreshOpenDatabaseFromDisk(), false);
1046
+ assert.equal(isDbAvailable(), false);
1047
+ });
1048
+ });
1049
+
955
1050
  // ─── getDbStatus ───────────────────────────────────────────────────────────
956
1051
 
957
1052
  describe('getDbStatus', () => {
@@ -0,0 +1,43 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Verifies the guided milestone discussion prompt renders its core interview and persistence contracts.
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("guided milestone prompt renders compact interview and context 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-guided-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("guided-discuss-milestone", {
23
+ workingDirectory: process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd(),
24
+ milestoneId: "M001",
25
+ milestoneTitle: "Baseline And Safety",
26
+ structuredQuestionsAvailable: "true",
27
+ fastPathInstruction: "No fast path in this test.",
28
+ inlinedTemplates: "## Context\n\n## Decisions\n\n## Open Questions",
29
+ commitInstruction: "Do not commit during this test.",
30
+ });
31
+
32
+ assert.match(prompt, /M001 context written/);
33
+ assert.match(prompt, /Project Shape/);
34
+ assert.match(prompt, /default to `complex`/i);
35
+ assert.match(prompt, /3 or 4 concrete, researched options/);
36
+ assert.match(prompt, /"Other — let me discuss"/);
37
+ assert.match(prompt, /CONTEXT-DRAFT/);
38
+ assert.match(prompt, /Do NOT mention this save to the user/);
39
+ assert.match(prompt, /depth_verification_M001_confirm/);
40
+ assert.match(prompt, /artifact_type: "CONTEXT"/);
41
+ assert.match(prompt, /milestone_id: M001/);
42
+ assert.doesNotMatch(prompt, /\{\{[a-zA-Z][a-zA-Z0-9_]*\}\}/);
43
+ });
@@ -0,0 +1,41 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Verifies the guided project discussion prompt renders its core interview and persistence contracts.
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("guided project prompt renders compact interview and artifact 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-guided-project-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("guided-discuss-project", {
23
+ workingDirectory: process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd(),
24
+ structuredQuestionsAvailable: "true",
25
+ inlinedTemplates: "## Project\n\n## Project Shape\n\n## Capability Contract\n\n## Milestone Sequence",
26
+ commitInstruction: "Do not commit during this test.",
27
+ });
28
+
29
+ assert.match(prompt, /What do you want to build\?/);
30
+ assert.match(prompt, /Project shape: simple/);
31
+ assert.match(prompt, /Default to `complex` when uncertain/);
32
+ assert.match(prompt, /3 or 4 concrete, researched options/);
33
+ assert.match(prompt, /"Other — let me discuss"/);
34
+ assert.match(prompt, /depth_verification_project_confirm/);
35
+ assert.match(prompt, /artifact_type: "PROJECT"/);
36
+ assert.match(prompt, /omit `milestone_id`/);
37
+ assert.match(prompt, /Do NOT use `artifact_type: "CONTEXT"` and do NOT pass `milestone_id: "PROJECT"`/);
38
+ assert.match(prompt, /\*\*Complexity:\*\* simple/);
39
+ assert.match(prompt, /\*\*Complexity:\*\* complex/);
40
+ assert.doesNotMatch(prompt, /\{\{[a-zA-Z][a-zA-Z0-9_]*\}\}/);
41
+ });
@@ -0,0 +1,45 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Verifies the guided requirements discussion prompt renders core requirements and persistence contracts.
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("guided requirements prompt renders compact capability and persistence 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-guided-requirements-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("guided-discuss-requirements", {
23
+ workingDirectory: process.env.GSD_TEST_WORKSPACE_ROOT ?? process.cwd(),
24
+ structuredQuestionsAvailable: "true",
25
+ inlinedTemplates: "## Active\n\n## Validated\n\n## Deferred\n\n## Out of Scope\n\n## Traceability\n\n## Coverage Summary",
26
+ commitInstruction: "Do not commit during this test.",
27
+ });
28
+
29
+ assert.match(prompt, /PROJECT\.md missing/);
30
+ assert.match(prompt, /Project Shape/);
31
+ assert.match(prompt, /R###/);
32
+ assert.match(prompt, /M###\/none yet/);
33
+ assert.match(prompt, /never bare `none yet`/);
34
+ assert.match(prompt, /3 or 4 concrete, researched options/);
35
+ assert.match(prompt, /"Other — let me discuss"/);
36
+ assert.match(prompt, /class-assignment and status questions are exempt/);
37
+ assert.match(prompt, /artifact_type: "REQUIREMENTS-DRAFT"/);
38
+ assert.match(prompt, /depth_verification_requirements_confirm/);
39
+ assert.match(prompt, /gsd_requirement_save/);
40
+ assert.match(prompt, /gsd_summary_save/);
41
+ assert.match(prompt, /artifact_type: "REQUIREMENTS"/);
42
+ assert.match(prompt, /Do NOT use `artifact_type: "CONTEXT"`/);
43
+ assert.match(prompt, /Requirements written\./);
44
+ assert.doesNotMatch(prompt, /\{\{[a-zA-Z][a-zA-Z0-9_]*\}\}/);
45
+ });
@@ -101,6 +101,20 @@ describe("guided-flow → auto-prompts consolidation (#5183)", () => {
101
101
  prompt.includes("Implement the thing"),
102
102
  "must include task plan body content from disk",
103
103
  );
104
+ assert.ok(prompt.includes("## Context Mode"), "execute-task should include standalone Context Mode guidance");
105
+ assert.ok(prompt.includes("execution lane"), "execute-task should render the execution lane");
106
+ });
107
+
108
+ test("buildExecuteTaskPrompt omits Context Mode when disabled", async () => {
109
+ writeFileSync(
110
+ join(base, ".gsd", "PREFERENCES.md"),
111
+ ["---", "context_mode:", " enabled: false", "---", ""].join("\n"),
112
+ );
113
+
114
+ const prompt = await buildExecuteTaskPrompt(MID, SID, S_TITLE, TID, T_TITLE, base);
115
+
116
+ assert.ok(!prompt.includes("## Context Mode"));
117
+ assert.ok(!prompt.includes("Context Mode (execution lane)"));
104
118
  });
105
119
 
106
120
  test("buildCompleteSlicePrompt carries the complete-slice contract", async () => {
@@ -1,3 +1,5 @@
1
+ // GSD Extension — Auto recovery integration tests.
2
+
1
3
  import test from "node:test";
2
4
  import assert from "node:assert/strict";
3
5
  import { mkdirSync, writeFileSync, existsSync, readFileSync, rmSync, chmodSync } from "node:fs";
@@ -401,6 +403,57 @@ test("verifyExpectedArtifact plan-slice fails for plan with no tasks (#699)", (t
401
403
  assert.equal(result, false, "should fail when plan has no task entries (empty scaffold, #699)");
402
404
  });
403
405
 
406
+ test("verifyExpectedArtifact plan-slice trusts DB tasks over legacy plan syntax", (t) => {
407
+ const base = makeTmpBase();
408
+ t.after(() => {
409
+ closeDatabase();
410
+ cleanup(base);
411
+ });
412
+
413
+ openDatabase(join(base, ".gsd", "gsd.db"));
414
+ insertMilestone({ id: "M001", title: "Milestone", status: "active" });
415
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "pending" });
416
+ insertTask({ id: "T01", milestoneId: "M001", sliceId: "S01", title: "First task", status: "pending" });
417
+ insertTask({ id: "T02", milestoneId: "M001", sliceId: "S01", title: "Second task", status: "pending" });
418
+
419
+ const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
420
+ const tasksDir = join(sliceDir, "tasks");
421
+ writeFileSync(
422
+ join(sliceDir, "S01-PLAN.md"),
423
+ "# S01: Slice\n\n## Tasks\n\nTask rows live in the DB; this projection intentionally has no legacy task syntax.\n",
424
+ );
425
+ writeFileSync(join(tasksDir, "T01-PLAN.md"), "# T01 Plan\n");
426
+ writeFileSync(join(tasksDir, "T02-PLAN.md"), "# T02 Plan\n");
427
+
428
+ const result = verifyExpectedArtifact("plan-slice", "M001/S01", base);
429
+ assert.equal(result, true, "DB task rows plus task plan files should verify plan-slice");
430
+ });
431
+
432
+ test("verifyExpectedArtifact plan-slice still fails when a DB-backed task plan file is missing", (t) => {
433
+ const base = makeTmpBase();
434
+ t.after(() => {
435
+ closeDatabase();
436
+ cleanup(base);
437
+ });
438
+
439
+ openDatabase(join(base, ".gsd", "gsd.db"));
440
+ insertMilestone({ id: "M001", title: "Milestone", status: "active" });
441
+ insertSlice({ id: "S01", milestoneId: "M001", title: "Slice", status: "pending" });
442
+ insertTask({ id: "T01", milestoneId: "M001", sliceId: "S01", title: "First task", status: "pending" });
443
+ insertTask({ id: "T02", milestoneId: "M001", sliceId: "S01", title: "Second task", status: "pending" });
444
+
445
+ const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
446
+ const tasksDir = join(sliceDir, "tasks");
447
+ writeFileSync(
448
+ join(sliceDir, "S01-PLAN.md"),
449
+ "# S01: Slice\n\n## Tasks\n\nTask rows live in the DB; this projection intentionally has no legacy task syntax.\n",
450
+ );
451
+ writeFileSync(join(tasksDir, "T01-PLAN.md"), "# T01 Plan\n");
452
+
453
+ const result = verifyExpectedArtifact("plan-slice", "M001/S01", base);
454
+ assert.equal(result, false, "DB task rows must still require matching task plan files");
455
+ });
456
+
404
457
  // ─── verifyExpectedArtifact: heading-style plan tasks (#1691) ─────────────
405
458
 
406
459
  test("verifyExpectedArtifact accepts plan-slice with heading-style tasks (### T01 --)", (t) => {
@@ -456,6 +509,32 @@ test("verifyExpectedArtifact accepts plan-slice with colon-style heading tasks (
456
509
  );
457
510
  });
458
511
 
512
+ test("verifyExpectedArtifact accepts indented legacy plan-slice task markers", (t) => {
513
+ const base = makeTmpBase();
514
+ t.after(() => cleanup(base));
515
+
516
+ const sliceDir = join(base, ".gsd", "milestones", "M001", "slices", "S01");
517
+ const tasksDir = join(sliceDir, "tasks");
518
+ mkdirSync(tasksDir, { recursive: true });
519
+ writeFileSync(join(sliceDir, "S01-PLAN.md"), [
520
+ "# S01: Test Slice",
521
+ "",
522
+ "## Tasks",
523
+ "",
524
+ " - [ ] **T01: Implement feature** `est:1h`",
525
+ "",
526
+ " ### T02 -- Write tests",
527
+ ].join("\n"));
528
+ writeFileSync(join(tasksDir, "T01-PLAN.md"), "# T01 Plan");
529
+ writeFileSync(join(tasksDir, "T02-PLAN.md"), "# T02 Plan");
530
+
531
+ assert.strictEqual(
532
+ verifyExpectedArtifact("plan-slice", "M001/S01", base),
533
+ true,
534
+ "Indented legacy task markers should be treated as completed plan-slice artifacts",
535
+ );
536
+ });
537
+
459
538
  test("verifyExpectedArtifact execute-task rejects heading-style plan without checked checkbox (#3607)", (t) => {
460
539
  const base = makeTmpBase();
461
540
  t.after(() => cleanup(base));
@@ -24,6 +24,7 @@ import {
24
24
  } from "../../auto-worktree.ts";
25
25
  import { getSliceBranchName } from "../../worktree.ts";
26
26
  import { nativeMergeSquash } from "../../native-git-bridge.ts";
27
+ import { drainLogs, setStderrLoggingEnabled } from "../../workflow-logger.ts";
27
28
 
28
29
  function run(cmd: string, cwd: string): string {
29
30
  // Safe: all inputs are hardcoded test strings, not user input
@@ -251,6 +252,42 @@ describe("auto-worktree-milestone-merge", { timeout: 300_000 }, () => {
251
252
  assert.strictEqual(typeof result.pushed, "boolean", "pushed flag remains boolean");
252
253
  });
253
254
 
255
+ test("external .gsd and local-only auto_push closeout without cleanup or push warnings", () => {
256
+ const { repo, externalState } = freshRepoWithExternalGsd();
257
+ const previousStderr = setStderrLoggingEnabled(false);
258
+ drainLogs();
259
+
260
+ try {
261
+ writeFileSync(
262
+ join(externalState, "PREFERENCES.md"),
263
+ "---\nversion: 1\n---\n\ngit:\n auto_push: true\n",
264
+ );
265
+ mkdirSync(join(externalState, "milestones", "M041"), { recursive: true });
266
+ mkdirSync(join(externalState, "runtime", "units"), { recursive: true });
267
+ writeFileSync(join(externalState, "runtime", "units", "leftover.json"), "{}\n");
268
+
269
+ const wtPath = createAutoWorktree(repo, "M041");
270
+ addSliceToMilestone(repo, wtPath, "M041", "S01", "Local-only push", [
271
+ { file: "local-only.ts", content: "export const localOnly = true;\n", message: "add local only file" },
272
+ ]);
273
+
274
+ const roadmap = makeRoadmap("M041", "Local-only closeout", [
275
+ { id: "S01", title: "Local-only push" },
276
+ ]);
277
+
278
+ const result = mergeMilestoneToMain(repo, "M041", roadmap);
279
+ const logs = drainLogs();
280
+ const messages = logs.map((entry) => entry.message).join("\n");
281
+
282
+ assert.equal(result.pushed, false, "local-only repo should not report pushed");
283
+ assert.ok(!messages.includes("untracked file cleanup failed"), "external .gsd cleanup should not call git on paths outside the repo");
284
+ assert.ok(!messages.includes("git push failed"), "missing origin should skip auto-push instead of running git push");
285
+ } finally {
286
+ drainLogs();
287
+ setStderrLoggingEnabled(previousStderr);
288
+ }
289
+ });
290
+
254
291
  test("auto-resolve .gsd/ state file conflicts", () => {
255
292
  const repo = freshRepo();
256
293
  const wtPath = createAutoWorktree(repo, "M050");
@@ -575,7 +575,7 @@ describe("state-machine-live-validation", () => {
575
575
  assert.match((result as any).error, /verification did not pass/);
576
576
  });
577
577
 
578
- test("double milestone completion returns error", async () => {
578
+ test("double milestone completion is idempotent", async () => {
579
579
  base = createFullFixture();
580
580
  openDatabase(join(base, ".gsd", "gsd.db"));
581
581
  insertMilestone({ id: "M001", title: "Done", status: "complete" });
@@ -583,8 +583,10 @@ describe("state-machine-live-validation", () => {
583
583
  insertTask({ id: "T01", sliceId: "S01", milestoneId: "M001", status: "complete" });
584
584
 
585
585
  const result = await handleCompleteMilestone(makeMilestoneParams("M001") as any, base);
586
- assert.ok("error" in result);
587
- assert.match((result as any).error, /already complete/);
586
+ assert.ok(!("error" in result), `already-complete milestone should be accepted: ${JSON.stringify(result)}`);
587
+ assert.equal(result.alreadyComplete, true);
588
+ assert.match(result.summaryPath, /M001-SUMMARY\.md$/);
589
+ assert.ok(isClosedStatus(getMilestone("M001")!.status), "milestone remains closed");
588
590
  });
589
591
  });
590
592