gsd-pi 2.79.0 → 2.80.0-dev.8b3a59f5c

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 (780) 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 +90 -74
  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 +365 -522
  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/run-unit.js +19 -15
  11. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  12. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.js +12 -0
  13. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-iteration.js +24 -0
  14. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.js +33 -0
  15. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.js +26 -0
  16. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-retry.js +49 -0
  17. package/dist/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.js +25 -0
  18. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +48 -0
  19. package/dist/resources/extensions/gsd/auto/workflow-dispatch-ledger.js +26 -0
  20. package/dist/resources/extensions/gsd/auto/workflow-iteration-completion.js +10 -0
  21. package/dist/resources/extensions/gsd/auto/workflow-journal-reporter.js +16 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-kernel.js +263 -0
  23. package/dist/resources/extensions/gsd/auto/workflow-memory-pressure.js +36 -0
  24. package/dist/resources/extensions/gsd/auto/workflow-phase-reporter.js +9 -0
  25. package/dist/resources/extensions/gsd/auto/workflow-session-lock.js +35 -0
  26. package/dist/resources/extensions/gsd/auto/workflow-sidecar-iteration.js +24 -0
  27. package/dist/resources/extensions/gsd/auto/workflow-sidecar-queue.js +26 -0
  28. package/dist/resources/extensions/gsd/auto/workflow-turn-reporter.js +36 -0
  29. package/dist/resources/extensions/gsd/auto/workflow-unit-dispatch.js +44 -0
  30. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +15 -0
  31. package/dist/resources/extensions/gsd/auto-artifact-paths.js +2 -2
  32. package/dist/resources/extensions/gsd/auto-dashboard.js +54 -15
  33. package/dist/resources/extensions/gsd/auto-dispatch.js +2 -0
  34. package/dist/resources/extensions/gsd/auto-prompts.js +220 -32
  35. package/dist/resources/extensions/gsd/auto-recovery.js +216 -62
  36. package/dist/resources/extensions/gsd/auto-runtime-state.js +4 -0
  37. package/dist/resources/extensions/gsd/auto-start.js +3 -2
  38. package/dist/resources/extensions/gsd/auto-verification.js +2 -11
  39. package/dist/resources/extensions/gsd/auto-worktree.js +87 -38
  40. package/dist/resources/extensions/gsd/auto.js +159 -2
  41. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +24 -2
  42. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +10 -0
  43. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +2 -2
  44. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +63 -51
  45. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +137 -9
  46. package/dist/resources/extensions/gsd/commands/context.js +1 -1
  47. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  48. package/dist/resources/extensions/gsd/commands-ship.js +23 -46
  49. package/dist/resources/extensions/gsd/commands-workflow-templates.js +12 -7
  50. package/dist/resources/extensions/gsd/component-loader.js +5 -11
  51. package/dist/resources/extensions/gsd/custom-workflow-engine.js +25 -1
  52. package/dist/resources/extensions/gsd/db-adapter.js +47 -0
  53. package/dist/resources/extensions/gsd/db-base-schema.js +351 -0
  54. package/dist/resources/extensions/gsd/db-connection-cache.js +31 -0
  55. package/dist/resources/extensions/gsd/db-coordination-schema.js +104 -0
  56. package/dist/resources/extensions/gsd/db-decision-requirement-rows.js +71 -0
  57. package/dist/resources/extensions/gsd/db-gate-rows.js +16 -0
  58. package/dist/resources/extensions/gsd/db-lightweight-query-rows.js +29 -0
  59. package/dist/resources/extensions/gsd/db-memory-fts-schema.js +56 -0
  60. package/dist/resources/extensions/gsd/db-migration-backup.js +22 -0
  61. package/dist/resources/extensions/gsd/db-migration-steps.js +410 -0
  62. package/dist/resources/extensions/gsd/db-milestone-artifact-rows.js +35 -0
  63. package/dist/resources/extensions/gsd/db-open-state.js +32 -0
  64. package/dist/resources/extensions/gsd/db-provider.js +108 -0
  65. package/dist/resources/extensions/gsd/db-runtime-kv-schema.js +27 -0
  66. package/dist/resources/extensions/gsd/db-schema-metadata.js +23 -0
  67. package/dist/resources/extensions/gsd/db-task-slice-rows.js +86 -0
  68. package/dist/resources/extensions/gsd/db-transaction.js +63 -0
  69. package/dist/resources/extensions/gsd/db-verification-evidence-rows.js +3 -0
  70. package/dist/resources/extensions/gsd/db-verification-evidence-schema.js +19 -0
  71. package/dist/resources/extensions/gsd/escalation.js +2 -0
  72. package/dist/resources/extensions/gsd/graph.js +9 -3
  73. package/dist/resources/extensions/gsd/gsd-db.js +316 -1520
  74. package/dist/resources/extensions/gsd/guided-flow.js +40 -0
  75. package/dist/resources/extensions/gsd/legacy-telemetry.js +70 -0
  76. package/dist/resources/extensions/gsd/markdown-renderer.js +2 -0
  77. package/dist/resources/extensions/gsd/model-router.js +9 -6
  78. package/dist/resources/extensions/gsd/notification-widget.js +21 -3
  79. package/dist/resources/extensions/gsd/paths.js +5 -1
  80. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -6
  81. package/dist/resources/extensions/gsd/pr-evidence.js +117 -0
  82. package/dist/resources/extensions/gsd/pre-execution-checks.js +2 -0
  83. package/dist/resources/extensions/gsd/preferences-types.js +20 -2
  84. package/dist/resources/extensions/gsd/preferences-validation.js +3 -3
  85. package/dist/resources/extensions/gsd/process-task-path.js +61 -0
  86. package/dist/resources/extensions/gsd/prompt-loader.js +9 -5
  87. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  88. package/dist/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  89. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  90. package/dist/resources/extensions/gsd/prompts/discuss.md +81 -181
  91. package/dist/resources/extensions/gsd/prompts/execute-task.md +40 -67
  92. package/dist/resources/extensions/gsd/prompts/forensics.md +41 -84
  93. package/dist/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  94. package/dist/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  95. package/dist/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  96. package/dist/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  97. package/dist/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  98. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  99. package/dist/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  100. package/dist/resources/extensions/gsd/prompts/queue.md +46 -53
  101. package/dist/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  102. package/dist/resources/extensions/gsd/prompts/research-slice.md +23 -23
  103. package/dist/resources/extensions/gsd/prompts/rethink.md +10 -10
  104. package/dist/resources/extensions/gsd/prompts/system.md +65 -107
  105. package/dist/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  106. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  107. package/dist/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  108. package/dist/resources/extensions/gsd/state.js +4 -0
  109. package/dist/resources/extensions/gsd/tools/complete-milestone.js +14 -9
  110. package/dist/resources/extensions/gsd/tools/complete-task.js +2 -0
  111. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +88 -3
  112. package/dist/resources/extensions/gsd/unit-context-composer.js +32 -0
  113. package/dist/resources/extensions/gsd/unit-context-manifest.js +21 -0
  114. package/dist/resources/extensions/gsd/uok/audit.js +23 -9
  115. package/dist/resources/extensions/gsd/uok/contracts.js +69 -1
  116. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +3 -0
  117. package/dist/resources/extensions/gsd/uok/kernel.js +8 -3
  118. package/dist/resources/extensions/gsd/uok/loop-adapter.js +48 -33
  119. package/dist/resources/extensions/gsd/uok/plan-v2.js +2 -0
  120. package/dist/resources/extensions/gsd/uok/timeline.js +125 -0
  121. package/dist/resources/extensions/gsd/workflow-logger.js +13 -13
  122. package/dist/resources/extensions/gsd/workflow-manifest.js +2 -0
  123. package/dist/resources/extensions/gsd/workflow-projections.js +2 -0
  124. package/dist/resources/extensions/gsd/workflow-templates.js +9 -0
  125. package/dist/resources/extensions/gsd/working-output-messages.js +64 -0
  126. package/dist/resources/extensions/shared/gsd-phase-state.js +45 -3
  127. package/dist/resources/extensions/shared/interview-ui.js +15 -4
  128. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  129. package/dist/web/standalone/.next/BUILD_ID +1 -1
  130. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  131. package/dist/web/standalone/.next/build-manifest.json +4 -4
  132. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  133. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  134. package/dist/web/standalone/.next/required-server-files.json +4 -4
  135. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  136. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  138. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  139. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  140. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  141. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  143. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  146. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  148. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  149. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  150. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  151. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  152. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  153. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  154. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  155. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  157. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  158. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  163. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  164. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  165. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  171. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  178. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  179. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  180. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  181. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  182. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  199. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  204. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  205. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  210. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  211. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  217. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  219. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  220. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  222. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  223. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  224. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  226. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  227. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  229. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  230. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  232. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  233. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  235. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  236. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  238. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  239. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  240. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  241. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  247. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  249. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  250. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +1 -1
  252. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  254. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  257. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  259. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  262. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  263. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  265. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  266. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  267. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  269. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  270. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  271. package/dist/web/standalone/.next/server/app/index.html +1 -1
  272. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  273. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  274. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  275. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  276. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  277. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  278. package/dist/web/standalone/.next/server/app/page.js +2 -2
  279. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  280. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  281. package/dist/web/standalone/.next/server/chunks/167.js +2 -0
  282. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  283. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  284. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  285. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  286. package/dist/web/standalone/.next/server/middleware.js +2 -2
  287. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  288. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  289. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  290. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  291. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  292. package/dist/web/standalone/.next/static/chunks/{8336.6f6f30e410419aff.js → 8336.631939fb583761fa.js} +1 -1
  293. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  294. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  295. package/dist/web/standalone/.next/static/chunks/app/page-fab3ebb85b006001.js +1 -0
  296. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  297. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  298. package/dist/web/standalone/.next/static/chunks/{webpack-d82dbee6356c1733.js → webpack-0481f1221120a7c6.js} +1 -1
  299. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  300. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  301. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  302. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  303. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  304. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  305. package/dist/web/standalone/package.json +1 -0
  306. package/dist/web/standalone/server.js +1 -1
  307. package/package.json +15 -6
  308. package/packages/contracts/dist/index.d.ts +3 -0
  309. package/packages/contracts/dist/index.d.ts.map +1 -0
  310. package/packages/contracts/dist/index.js +5 -0
  311. package/packages/contracts/dist/index.js.map +1 -0
  312. package/packages/contracts/dist/rpc.d.ts +549 -0
  313. package/packages/contracts/dist/rpc.d.ts.map +1 -0
  314. package/packages/contracts/dist/rpc.js +53 -0
  315. package/packages/contracts/dist/rpc.js.map +1 -0
  316. package/packages/contracts/dist/rpc.test.d.ts +2 -0
  317. package/packages/contracts/dist/rpc.test.d.ts.map +1 -0
  318. package/packages/contracts/dist/rpc.test.js +47 -0
  319. package/packages/contracts/dist/rpc.test.js.map +1 -0
  320. package/packages/contracts/dist/workflow.d.ts +180 -0
  321. package/packages/contracts/dist/workflow.d.ts.map +1 -0
  322. package/packages/contracts/dist/workflow.js +201 -0
  323. package/packages/contracts/dist/workflow.js.map +1 -0
  324. package/packages/contracts/package.json +39 -0
  325. package/packages/contracts/src/index.ts +5 -0
  326. package/packages/contracts/src/rpc.test.ts +72 -0
  327. package/packages/contracts/src/rpc.ts +286 -0
  328. package/packages/contracts/src/workflow.ts +213 -0
  329. package/packages/contracts/tsconfig.json +25 -0
  330. package/packages/daemon/package.json +3 -2
  331. package/packages/daemon/src/event-bridge.test.ts +2 -1
  332. package/packages/daemon/src/event-bridge.ts +1 -1
  333. package/packages/daemon/src/event-formatter.test.ts +1 -2
  334. package/packages/daemon/src/event-formatter.ts +1 -2
  335. package/packages/daemon/src/session-manager.ts +2 -2
  336. package/packages/daemon/src/types.ts +3 -18
  337. package/packages/mcp-server/dist/server.d.ts +13 -0
  338. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  339. package/packages/mcp-server/dist/server.js +77 -0
  340. package/packages/mcp-server/dist/server.js.map +1 -1
  341. package/packages/mcp-server/dist/session-manager.js +1 -1
  342. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  343. package/packages/mcp-server/dist/types.d.ts +3 -11
  344. package/packages/mcp-server/dist/types.d.ts.map +1 -1
  345. package/packages/mcp-server/dist/types.js.map +1 -1
  346. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  347. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  348. package/packages/mcp-server/dist/workflow-tools.js +52 -37
  349. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  350. package/packages/mcp-server/package.json +3 -2
  351. package/packages/mcp-server/src/mcp-server.test.ts +138 -0
  352. package/packages/mcp-server/src/server.ts +99 -1
  353. package/packages/mcp-server/src/session-manager.ts +2 -2
  354. package/packages/mcp-server/src/types.ts +7 -18
  355. package/packages/mcp-server/src/workflow-tools.test.ts +129 -2
  356. package/packages/mcp-server/src/workflow-tools.ts +80 -37
  357. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  358. package/packages/native/package.json +1 -1
  359. package/packages/pi-agent-core/package.json +1 -1
  360. package/packages/pi-ai/dist/models/fake-model.d.ts +12 -0
  361. package/packages/pi-ai/dist/models/fake-model.d.ts.map +1 -0
  362. package/packages/pi-ai/dist/models/fake-model.js +27 -0
  363. package/packages/pi-ai/dist/models/fake-model.js.map +1 -0
  364. package/packages/pi-ai/dist/models/index.d.ts.map +1 -1
  365. package/packages/pi-ai/dist/models/index.js +8 -0
  366. package/packages/pi-ai/dist/models/index.js.map +1 -1
  367. package/packages/pi-ai/dist/providers/fake.d.ts +42 -0
  368. package/packages/pi-ai/dist/providers/fake.d.ts.map +1 -0
  369. package/packages/pi-ai/dist/providers/fake.js +319 -0
  370. package/packages/pi-ai/dist/providers/fake.js.map +1 -0
  371. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  372. package/packages/pi-ai/dist/providers/register-builtins.js +24 -0
  373. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  374. package/packages/pi-ai/package.json +1 -1
  375. package/packages/pi-ai/src/models/fake-model.ts +30 -0
  376. package/packages/pi-ai/src/models/index.ts +9 -0
  377. package/packages/pi-ai/src/providers/fake.ts +376 -0
  378. package/packages/pi-ai/src/providers/register-builtins.ts +23 -0
  379. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  380. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +44 -0
  381. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  382. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  383. package/packages/pi-coding-agent/dist/core/model-registry.js +5 -0
  384. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +4 -0
  386. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  387. package/packages/pi-coding-agent/dist/core/settings-manager.js +8 -0
  388. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  389. package/packages/pi-coding-agent/dist/core/slash-commands.d.ts.map +1 -1
  390. package/packages/pi-coding-agent/dist/core/slash-commands.js +1 -0
  391. package/packages/pi-coding-agent/dist/core/slash-commands.js.map +1 -1
  392. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +49 -1
  393. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  394. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts +26 -0
  395. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.d.ts.map +1 -0
  396. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +112 -0
  397. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -0
  398. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts +2 -0
  399. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.d.ts.map +1 -0
  400. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js +51 -0
  401. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.test.js.map +1 -0
  402. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +8 -8
  403. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  404. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts +3 -0
  405. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  406. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js +11 -0
  407. package/packages/pi-coding-agent/dist/modes/interactive/components/settings-selector.js.map +1 -1
  408. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +20 -0
  409. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +16 -0
  411. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +99 -15
  413. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  414. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +58 -1
  416. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  417. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +40 -1
  418. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  419. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -0
  420. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  421. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts +1 -0
  422. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode-state.js.map +1 -1
  424. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +12 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  426. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +54 -10
  427. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  428. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +20 -0
  430. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -1
  431. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts +2 -0
  432. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.d.ts.map +1 -0
  433. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js +79 -0
  434. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.test.js.map +1 -0
  435. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  436. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  437. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +13 -0
  438. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  439. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  440. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  441. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +18 -1
  442. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  443. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts +11 -0
  444. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.d.ts.map +1 -0
  445. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js +18 -0
  446. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.js.map +1 -0
  447. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts +2 -0
  448. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.d.ts.map +1 -0
  449. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +27 -0
  450. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -0
  451. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts +1 -512
  452. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  453. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js +3 -7
  454. package/packages/pi-coding-agent/dist/modes/rpc/rpc-types.js.map +1 -1
  455. package/packages/pi-coding-agent/package.json +2 -1
  456. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +51 -0
  457. package/packages/pi-coding-agent/src/core/model-registry.ts +4 -0
  458. package/packages/pi-coding-agent/src/core/settings-manager.ts +12 -0
  459. package/packages/pi-coding-agent/src/core/slash-commands.ts +1 -0
  460. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +82 -3
  461. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.test.ts +59 -0
  462. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +160 -0
  463. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +8 -8
  464. package/packages/pi-coding-agent/src/modes/interactive/components/settings-selector.ts +15 -0
  465. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -0
  466. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +105 -15
  467. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +43 -1
  468. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +73 -1
  469. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -0
  470. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode-state.ts +1 -1
  471. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +75 -9
  472. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.test.ts +95 -0
  473. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +24 -1
  474. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +13 -0
  475. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +32 -2
  476. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +40 -0
  477. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.ts +29 -0
  478. package/packages/pi-coding-agent/src/modes/rpc/rpc-types.ts +3 -336
  479. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  480. package/packages/pi-tui/dist/__tests__/style.test.d.ts +2 -0
  481. package/packages/pi-tui/dist/__tests__/style.test.d.ts.map +1 -0
  482. package/packages/pi-tui/dist/__tests__/style.test.js +63 -0
  483. package/packages/pi-tui/dist/__tests__/style.test.js.map +1 -0
  484. package/packages/pi-tui/dist/__tests__/tui.test.js +24 -3
  485. package/packages/pi-tui/dist/__tests__/tui.test.js.map +1 -1
  486. package/packages/pi-tui/dist/index.d.ts +1 -0
  487. package/packages/pi-tui/dist/index.d.ts.map +1 -1
  488. package/packages/pi-tui/dist/index.js +2 -0
  489. package/packages/pi-tui/dist/index.js.map +1 -1
  490. package/packages/pi-tui/dist/style.d.ts +41 -0
  491. package/packages/pi-tui/dist/style.d.ts.map +1 -0
  492. package/packages/pi-tui/dist/style.js +158 -0
  493. package/packages/pi-tui/dist/style.js.map +1 -0
  494. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  495. package/packages/pi-tui/dist/tui.js +1 -0
  496. package/packages/pi-tui/dist/tui.js.map +1 -1
  497. package/packages/pi-tui/package.json +1 -1
  498. package/packages/pi-tui/src/__tests__/style.test.ts +76 -0
  499. package/packages/pi-tui/src/__tests__/tui.test.ts +29 -3
  500. package/packages/pi-tui/src/index.ts +9 -0
  501. package/packages/pi-tui/src/style.ts +225 -0
  502. package/packages/pi-tui/src/tui.ts +1 -0
  503. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  504. package/packages/rpc-client/README.md +3 -3
  505. package/packages/rpc-client/dist/index.d.ts +1 -1
  506. package/packages/rpc-client/dist/index.d.ts.map +1 -1
  507. package/packages/rpc-client/dist/index.js.map +1 -1
  508. package/packages/rpc-client/dist/rpc-client.d.ts +2 -6
  509. package/packages/rpc-client/dist/rpc-client.d.ts.map +1 -1
  510. package/packages/rpc-client/dist/rpc-client.js.map +1 -1
  511. package/packages/rpc-client/dist/rpc-types.d.ts +1 -565
  512. package/packages/rpc-client/dist/rpc-types.d.ts.map +1 -1
  513. package/packages/rpc-client/dist/rpc-types.js +3 -11
  514. package/packages/rpc-client/dist/rpc-types.js.map +1 -1
  515. package/packages/rpc-client/package.json +4 -1
  516. package/packages/rpc-client/src/index.ts +1 -1
  517. package/packages/rpc-client/src/rpc-client.ts +3 -6
  518. package/packages/rpc-client/src/rpc-types.ts +3 -398
  519. package/packages/rpc-client/tsconfig.tsbuildinfo +1 -1
  520. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +12 -0
  521. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  522. package/pkg/dist/modes/interactive/theme/theme-schema.js +13 -0
  523. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  524. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  525. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  526. package/pkg/dist/modes/interactive/theme/theme.js +18 -1
  527. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  528. package/pkg/package.json +1 -1
  529. package/src/resources/extensions/github-sync/templates.ts +93 -88
  530. package/src/resources/extensions/github-sync/tests/inline-code.test.ts +66 -0
  531. package/src/resources/extensions/github-sync/tests/templates.test.ts +10 -2
  532. package/src/resources/extensions/gsd/auto/contracts.ts +87 -0
  533. package/src/resources/extensions/gsd/auto/custom-verify-retry-store.ts +72 -0
  534. package/src/resources/extensions/gsd/auto/loop-deps.ts +10 -3
  535. package/src/resources/extensions/gsd/auto/loop.ts +416 -596
  536. package/src/resources/extensions/gsd/auto/orchestrator.ts +161 -0
  537. package/src/resources/extensions/gsd/auto/phases.ts +88 -9
  538. package/src/resources/extensions/gsd/auto/run-unit.ts +24 -14
  539. package/src/resources/extensions/gsd/auto/session.ts +11 -0
  540. package/src/resources/extensions/gsd/auto/workflow-custom-engine-dispatch-outcome.ts +28 -0
  541. package/src/resources/extensions/gsd/auto/workflow-custom-engine-iteration.ts +52 -0
  542. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile-outcome.ts +58 -0
  543. package/src/resources/extensions/gsd/auto/workflow-custom-engine-reconcile.ts +71 -0
  544. package/src/resources/extensions/gsd/auto/workflow-custom-engine-retry.ts +90 -0
  545. package/src/resources/extensions/gsd/auto/workflow-custom-engine-verify-outcome.ts +50 -0
  546. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +97 -0
  547. package/src/resources/extensions/gsd/auto/workflow-dispatch-ledger.ts +45 -0
  548. package/src/resources/extensions/gsd/auto/workflow-iteration-completion.ts +26 -0
  549. package/src/resources/extensions/gsd/auto/workflow-journal-reporter.ts +33 -0
  550. package/src/resources/extensions/gsd/auto/workflow-kernel.ts +520 -0
  551. package/src/resources/extensions/gsd/auto/workflow-memory-pressure.ts +58 -0
  552. package/src/resources/extensions/gsd/auto/workflow-phase-reporter.ts +22 -0
  553. package/src/resources/extensions/gsd/auto/workflow-session-lock.ts +68 -0
  554. package/src/resources/extensions/gsd/auto/workflow-sidecar-iteration.ts +46 -0
  555. package/src/resources/extensions/gsd/auto/workflow-sidecar-queue.ts +46 -0
  556. package/src/resources/extensions/gsd/auto/workflow-turn-reporter.ts +68 -0
  557. package/src/resources/extensions/gsd/auto/workflow-unit-dispatch.ts +89 -0
  558. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +38 -0
  559. package/src/resources/extensions/gsd/auto-artifact-paths.ts +2 -2
  560. package/src/resources/extensions/gsd/auto-dashboard.ts +61 -8
  561. package/src/resources/extensions/gsd/auto-dispatch.ts +1 -0
  562. package/src/resources/extensions/gsd/auto-prompts.ts +276 -31
  563. package/src/resources/extensions/gsd/auto-recovery.ts +211 -59
  564. package/src/resources/extensions/gsd/auto-runtime-state.ts +7 -0
  565. package/src/resources/extensions/gsd/auto-start.ts +3 -2
  566. package/src/resources/extensions/gsd/auto-verification.ts +5 -1
  567. package/src/resources/extensions/gsd/auto-worktree.ts +85 -36
  568. package/src/resources/extensions/gsd/auto.ts +167 -1
  569. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +30 -2
  570. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +11 -0
  571. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +2 -2
  572. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +79 -52
  573. package/src/resources/extensions/gsd/bootstrap/tests/write-gate-shouldblock-basepath.test.ts +97 -0
  574. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +143 -5
  575. package/src/resources/extensions/gsd/commands/context.ts +1 -1
  576. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  577. package/src/resources/extensions/gsd/commands-ship.ts +24 -51
  578. package/src/resources/extensions/gsd/commands-workflow-templates.ts +13 -0
  579. package/src/resources/extensions/gsd/component-loader.ts +5 -11
  580. package/src/resources/extensions/gsd/custom-workflow-engine.ts +29 -0
  581. package/src/resources/extensions/gsd/db-adapter.ts +75 -0
  582. package/src/resources/extensions/gsd/db-base-schema.ts +383 -0
  583. package/src/resources/extensions/gsd/db-connection-cache.ts +45 -0
  584. package/src/resources/extensions/gsd/db-coordination-schema.ts +109 -0
  585. package/src/resources/extensions/gsd/db-decision-requirement-rows.ts +77 -0
  586. package/src/resources/extensions/gsd/db-gate-rows.ts +19 -0
  587. package/src/resources/extensions/gsd/db-lightweight-query-rows.ts +50 -0
  588. package/src/resources/extensions/gsd/db-memory-fts-schema.ts +66 -0
  589. package/src/resources/extensions/gsd/db-migration-backup.ts +34 -0
  590. package/src/resources/extensions/gsd/db-migration-steps.ts +451 -0
  591. package/src/resources/extensions/gsd/db-milestone-artifact-rows.ts +70 -0
  592. package/src/resources/extensions/gsd/db-open-state.ts +47 -0
  593. package/src/resources/extensions/gsd/db-provider.ts +148 -0
  594. package/src/resources/extensions/gsd/db-runtime-kv-schema.ts +30 -0
  595. package/src/resources/extensions/gsd/db-schema-metadata.ts +33 -0
  596. package/src/resources/extensions/gsd/db-task-slice-rows.ts +146 -0
  597. package/src/resources/extensions/gsd/db-transaction.ts +76 -0
  598. package/src/resources/extensions/gsd/db-verification-evidence-rows.ts +14 -0
  599. package/src/resources/extensions/gsd/db-verification-evidence-schema.ts +22 -0
  600. package/src/resources/extensions/gsd/escalation.ts +3 -1
  601. package/src/resources/extensions/gsd/graph.ts +12 -5
  602. package/src/resources/extensions/gsd/gsd-db.ts +379 -1660
  603. package/src/resources/extensions/gsd/guided-flow.ts +47 -0
  604. package/src/resources/extensions/gsd/interrupted-session.ts +1 -0
  605. package/src/resources/extensions/gsd/legacy-telemetry.ts +99 -0
  606. package/src/resources/extensions/gsd/markdown-renderer.ts +4 -1
  607. package/src/resources/extensions/gsd/model-router.ts +10 -6
  608. package/src/resources/extensions/gsd/notification-widget.ts +25 -4
  609. package/src/resources/extensions/gsd/paths.ts +6 -1
  610. package/src/resources/extensions/gsd/post-execution-checks.ts +35 -7
  611. package/src/resources/extensions/gsd/pr-evidence.ts +182 -0
  612. package/src/resources/extensions/gsd/pre-execution-checks.ts +4 -1
  613. package/src/resources/extensions/gsd/preferences-types.ts +23 -4
  614. package/src/resources/extensions/gsd/preferences-validation.ts +3 -3
  615. package/src/resources/extensions/gsd/process-task-path.ts +81 -0
  616. package/src/resources/extensions/gsd/prompt-loader.ts +9 -5
  617. package/src/resources/extensions/gsd/prompts/complete-milestone.md +32 -30
  618. package/src/resources/extensions/gsd/prompts/complete-slice.md +23 -34
  619. package/src/resources/extensions/gsd/prompts/discuss-headless.md +50 -96
  620. package/src/resources/extensions/gsd/prompts/discuss.md +81 -181
  621. package/src/resources/extensions/gsd/prompts/execute-task.md +40 -67
  622. package/src/resources/extensions/gsd/prompts/forensics.md +41 -84
  623. package/src/resources/extensions/gsd/prompts/guided-discuss-milestone.md +29 -39
  624. package/src/resources/extensions/gsd/prompts/guided-discuss-project.md +30 -65
  625. package/src/resources/extensions/gsd/prompts/guided-discuss-requirements.md +25 -52
  626. package/src/resources/extensions/gsd/prompts/guided-discuss-slice.md +36 -36
  627. package/src/resources/extensions/gsd/prompts/guided-research-project.md +20 -38
  628. package/src/resources/extensions/gsd/prompts/plan-milestone.md +45 -59
  629. package/src/resources/extensions/gsd/prompts/plan-slice.md +25 -87
  630. package/src/resources/extensions/gsd/prompts/queue.md +46 -53
  631. package/src/resources/extensions/gsd/prompts/refine-slice.md +23 -23
  632. package/src/resources/extensions/gsd/prompts/research-slice.md +23 -23
  633. package/src/resources/extensions/gsd/prompts/rethink.md +10 -10
  634. package/src/resources/extensions/gsd/prompts/system.md +65 -107
  635. package/src/resources/extensions/gsd/prompts/triage-captures.md +15 -15
  636. package/src/resources/extensions/gsd/prompts/validate-milestone.md +24 -24
  637. package/src/resources/extensions/gsd/prompts/worktree-merge.md +35 -35
  638. package/src/resources/extensions/gsd/state.ts +6 -3
  639. package/src/resources/extensions/gsd/tests/auto-abort-pause-regression.test.ts +38 -0
  640. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +98 -0
  641. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +117 -0
  642. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +353 -0
  643. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +19 -0
  644. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +277 -1
  645. package/src/resources/extensions/gsd/tests/auto-runtime-state.test.ts +39 -0
  646. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +3 -0
  647. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +2 -2
  648. package/src/resources/extensions/gsd/tests/check-auto-start-pending-gate.test.ts +203 -0
  649. package/src/resources/extensions/gsd/tests/check-auto-start-ready-guard.test.ts +148 -0
  650. package/src/resources/extensions/gsd/tests/commands-eval-review.test.ts +2 -2
  651. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  652. package/src/resources/extensions/gsd/tests/commands-ship-eval-warn.test.ts +3 -2
  653. package/src/resources/extensions/gsd/tests/complete-milestone-prompt-rendering.test.ts +47 -0
  654. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +19 -5
  655. package/src/resources/extensions/gsd/tests/component-loader.test.ts +2 -9
  656. package/src/resources/extensions/gsd/tests/current-directory-root-homedir-fallback.test.ts +63 -0
  657. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +144 -0
  658. package/src/resources/extensions/gsd/tests/custom-verify-retry-store.test.ts +139 -0
  659. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +50 -0
  660. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +3 -3
  661. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +82 -0
  662. package/src/resources/extensions/gsd/tests/db-base-schema.test.ts +62 -0
  663. package/src/resources/extensions/gsd/tests/db-connection-cache.test.ts +60 -0
  664. package/src/resources/extensions/gsd/tests/db-coordination-schema.test.ts +39 -0
  665. package/src/resources/extensions/gsd/tests/db-decision-requirement-rows.test.ts +135 -0
  666. package/src/resources/extensions/gsd/tests/db-gate-rows.test.ts +53 -0
  667. package/src/resources/extensions/gsd/tests/db-lightweight-query-rows.test.ts +45 -0
  668. package/src/resources/extensions/gsd/tests/db-memory-fts-schema.test.ts +86 -0
  669. package/src/resources/extensions/gsd/tests/db-migration-backup.test.ts +105 -0
  670. package/src/resources/extensions/gsd/tests/db-migration-steps.integration.test.ts +428 -0
  671. package/src/resources/extensions/gsd/tests/db-migration-steps.test.ts +159 -0
  672. package/src/resources/extensions/gsd/tests/db-milestone-artifact-rows.test.ts +53 -0
  673. package/src/resources/extensions/gsd/tests/db-open-state.test.ts +56 -0
  674. package/src/resources/extensions/gsd/tests/db-provider.test.ts +105 -0
  675. package/src/resources/extensions/gsd/tests/db-runtime-kv-schema.test.ts +37 -0
  676. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +115 -0
  677. package/src/resources/extensions/gsd/tests/db-task-slice-rows.test.ts +128 -0
  678. package/src/resources/extensions/gsd/tests/db-transaction.test.ts +110 -0
  679. package/src/resources/extensions/gsd/tests/db-verification-evidence-schema.test.ts +76 -0
  680. package/src/resources/extensions/gsd/tests/deep-planning-mode-dispatch.test.ts +42 -0
  681. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +63 -2
  682. package/src/resources/extensions/gsd/tests/discuss-headless-rendering.test.ts +37 -0
  683. package/src/resources/extensions/gsd/tests/execute-summary-save-empty-project.test.ts +109 -0
  684. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +59 -0
  685. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-basic.md +52 -0
  686. package/src/resources/extensions/gsd/tests/fixtures/pr-body/commands-ship-empty-optionals.md +42 -0
  687. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-no-blockers.md +55 -0
  688. package/src/resources/extensions/gsd/tests/fixtures/pr-body/swarm-lane-with-blockers.md +60 -0
  689. package/src/resources/extensions/gsd/tests/forensics-prompt-rendering.test.ts +36 -0
  690. package/src/resources/extensions/gsd/tests/graph-operations.test.ts +10 -0
  691. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +139 -0
  692. package/src/resources/extensions/gsd/tests/guided-discuss-milestone-prompt-rendering.test.ts +43 -0
  693. package/src/resources/extensions/gsd/tests/guided-discuss-project-prompt-rendering.test.ts +41 -0
  694. package/src/resources/extensions/gsd/tests/guided-discuss-requirements-prompt-rendering.test.ts +45 -0
  695. package/src/resources/extensions/gsd/tests/guided-flow-prompt-consolidation.test.ts +14 -0
  696. package/src/resources/extensions/gsd/tests/integration/auto-recovery.test.ts +79 -0
  697. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +37 -0
  698. package/src/resources/extensions/gsd/tests/integration/state-machine-live-validation.test.ts +5 -3
  699. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +134 -0
  700. package/src/resources/extensions/gsd/tests/legacy-component-format-telemetry.test.ts +62 -0
  701. package/src/resources/extensions/gsd/tests/legacy-telemetry.test.ts +144 -0
  702. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +40 -16
  703. package/src/resources/extensions/gsd/tests/model-router.test.ts +33 -12
  704. package/src/resources/extensions/gsd/tests/notification-store.test.ts +8 -0
  705. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +40 -1
  706. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +8 -0
  707. package/src/resources/extensions/gsd/tests/paused-session-via-db.test.ts +2 -0
  708. package/src/resources/extensions/gsd/tests/plan-milestone-rendering.test.ts +45 -0
  709. package/src/resources/extensions/gsd/tests/plan-slice-prompt.test.ts +65 -16
  710. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +27 -0
  711. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +46 -0
  712. package/src/resources/extensions/gsd/tests/pr-evidence-equivalence.test.ts +102 -0
  713. package/src/resources/extensions/gsd/tests/pr-evidence-hardening.test.ts +165 -0
  714. package/src/resources/extensions/gsd/tests/pr-evidence.test.ts +79 -0
  715. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +3 -0
  716. package/src/resources/extensions/gsd/tests/process-task-path.test.ts +51 -0
  717. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +16 -1
  718. package/src/resources/extensions/gsd/tests/queue-prompt-rendering.test.ts +37 -0
  719. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +85 -0
  720. package/src/resources/extensions/gsd/tests/run-uat-composer.test.ts +2 -0
  721. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +59 -0
  722. package/src/resources/extensions/gsd/tests/tool-naming.test.ts +32 -9
  723. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +42 -4
  724. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +32 -0
  725. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +109 -1
  726. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +12 -0
  727. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +98 -0
  728. package/src/resources/extensions/gsd/tests/workflow-custom-engine-dispatch-outcome.test.ts +55 -0
  729. package/src/resources/extensions/gsd/tests/workflow-custom-engine-iteration.test.ts +93 -0
  730. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile-outcome.test.ts +108 -0
  731. package/src/resources/extensions/gsd/tests/workflow-custom-engine-reconcile.test.ts +146 -0
  732. package/src/resources/extensions/gsd/tests/workflow-custom-engine-retry.test.ts +136 -0
  733. package/src/resources/extensions/gsd/tests/workflow-custom-engine-verify-outcome.test.ts +95 -0
  734. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +158 -0
  735. package/src/resources/extensions/gsd/tests/workflow-dispatch-ledger.test.ts +82 -0
  736. package/src/resources/extensions/gsd/tests/workflow-iteration-completion.test.ts +44 -0
  737. package/src/resources/extensions/gsd/tests/workflow-journal-reporter.test.ts +49 -0
  738. package/src/resources/extensions/gsd/tests/workflow-kernel.test.ts +607 -0
  739. package/src/resources/extensions/gsd/tests/workflow-logger.test.ts +20 -4
  740. package/src/resources/extensions/gsd/tests/workflow-memory-pressure.test.ts +71 -0
  741. package/src/resources/extensions/gsd/tests/workflow-phase-reporter.test.ts +40 -0
  742. package/src/resources/extensions/gsd/tests/workflow-session-lock.test.ts +135 -0
  743. package/src/resources/extensions/gsd/tests/workflow-sidecar-iteration.test.ts +110 -0
  744. package/src/resources/extensions/gsd/tests/workflow-sidecar-queue.test.ts +116 -0
  745. package/src/resources/extensions/gsd/tests/workflow-templates.test.ts +21 -0
  746. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +164 -3
  747. package/src/resources/extensions/gsd/tests/workflow-turn-reporter.test.ts +87 -0
  748. package/src/resources/extensions/gsd/tests/workflow-unit-dispatch.test.ts +160 -0
  749. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +123 -0
  750. package/src/resources/extensions/gsd/tests/working-output-messages.test.ts +93 -0
  751. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +3 -0
  752. package/src/resources/extensions/gsd/tests/worktree-submodule-safety.test.ts +17 -33
  753. package/src/resources/extensions/gsd/tests/worktree-write-gate.test.ts +179 -0
  754. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  755. package/src/resources/extensions/gsd/tools/complete-task.ts +4 -1
  756. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +90 -2
  757. package/src/resources/extensions/gsd/unit-context-composer.ts +49 -0
  758. package/src/resources/extensions/gsd/unit-context-manifest.ts +34 -0
  759. package/src/resources/extensions/gsd/uok/audit.ts +25 -9
  760. package/src/resources/extensions/gsd/uok/contracts.ts +105 -0
  761. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +4 -0
  762. package/src/resources/extensions/gsd/uok/kernel.ts +10 -3
  763. package/src/resources/extensions/gsd/uok/loop-adapter.ts +60 -45
  764. package/src/resources/extensions/gsd/uok/plan-v2.ts +5 -1
  765. package/src/resources/extensions/gsd/uok/timeline.ts +158 -0
  766. package/src/resources/extensions/gsd/workflow-logger.ts +13 -13
  767. package/src/resources/extensions/gsd/workflow-manifest.ts +6 -15
  768. package/src/resources/extensions/gsd/workflow-projections.ts +5 -1
  769. package/src/resources/extensions/gsd/workflow-templates.ts +11 -0
  770. package/src/resources/extensions/gsd/working-output-messages.ts +120 -0
  771. package/src/resources/extensions/shared/gsd-phase-state.ts +56 -3
  772. package/src/resources/extensions/shared/interview-ui.ts +18 -5
  773. package/src/resources/extensions/shared/tests/gsd-phase-state.test.ts +43 -1
  774. package/src/resources/extensions/shared/tests/interview-notes-loop.test.ts +41 -0
  775. package/dist/web/standalone/.next/server/chunks/6336.js +0 -1
  776. package/dist/web/standalone/.next/static/chunks/app/page-ff639266d978f2a0.js +0 -1
  777. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  778. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  779. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → k-MDjzPMF62Rg1-FR437h}/_buildManifest.js +0 -0
  780. /package/dist/web/standalone/.next/static/{J-CU-p_sp45CJHT3R9TJS → k-MDjzPMF62Rg1-FR437h}/_ssgManifest.js +0 -0
@@ -0,0 +1,39 @@
1
+ import test from "node:test";
2
+ import assert from "node:assert/strict";
3
+
4
+ import { autoSession, getAutoRuntimeSnapshot } from "../auto-runtime-state.ts";
5
+
6
+ test("getAutoRuntimeSnapshot includes orchestration phase when available", () => {
7
+ autoSession.reset();
8
+ autoSession.active = true;
9
+ autoSession.basePath = "/tmp/project";
10
+ autoSession.orchestration = {
11
+ async start() { return { kind: "advanced" as const }; },
12
+ async advance() { return { kind: "advanced" as const }; },
13
+ async resume() { return { kind: "advanced" as const }; },
14
+ async stop() { return { kind: "stopped" as const }; },
15
+ getStatus() {
16
+ return { phase: "running" as const, transitionCount: 3, lastTransitionAt: 123 };
17
+ },
18
+ };
19
+
20
+ const snap = getAutoRuntimeSnapshot();
21
+
22
+ assert.equal(snap.active, true);
23
+ assert.equal(snap.basePath, "/tmp/project");
24
+ assert.equal(snap.orchestrationPhase, "running");
25
+ assert.equal(snap.orchestrationTransitionCount, 3);
26
+ assert.equal(snap.orchestrationLastTransitionAt, 123);
27
+
28
+ autoSession.reset();
29
+ });
30
+
31
+ test("getAutoRuntimeSnapshot omits orchestration phase when seam not wired", () => {
32
+ autoSession.reset();
33
+
34
+ const snap = getAutoRuntimeSnapshot();
35
+
36
+ assert.equal(snap.orchestrationPhase, undefined);
37
+ assert.equal(snap.orchestrationTransitionCount, undefined);
38
+ assert.equal(snap.orchestrationLastTransitionAt, undefined);
39
+ });
@@ -201,6 +201,9 @@ test("AutoSession.toJSON() includes key diagnostic properties", () => {
201
201
  "basePath",
202
202
  "currentMilestoneId",
203
203
  "currentUnit",
204
+ "orchestrationPhase",
205
+ "orchestrationTransitionCount",
206
+ "orchestrationLastTransitionAt",
204
207
  ];
205
208
 
206
209
  const missing = requiredDiagnostics.filter(prop => !toJSONBody.includes(prop));
@@ -31,9 +31,9 @@ describe("bootstrap deriveState DB guards (#3844)", () => {
31
31
  const compactIdx = registerHooksSrc.indexOf('pi.on("session_before_compact"');
32
32
  assert.ok(compactIdx > -1, "register-hooks should define session_before_compact");
33
33
  const compactSection = extractSourceRegion(registerHooksSrc, 'pi.on("session_before_compact"');
34
- const ensureIdx = compactSection.indexOf("ensureDbOpen()");
34
+ const ensureIdx = compactSection.indexOf("ensureDbOpen(basePath)");
35
35
  const deriveIdx = compactSection.indexOf("deriveGsdState(basePath)");
36
- assert.ok(ensureIdx > -1, "session_before_compact should call ensureDbOpen()");
36
+ assert.ok(ensureIdx > -1, "session_before_compact should call ensureDbOpen(basePath)");
37
37
  assert.ok(deriveIdx > -1, "session_before_compact should derive state");
38
38
  assert.ok(ensureIdx < deriveIdx, "session_before_compact should open DB before deriveState");
39
39
  });
@@ -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
 
@@ -1,3 +1,4 @@
1
+ // GSD2 commands-extract-learnings tests
1
2
  import { describe, it, beforeEach, afterEach } from "node:test";
2
3
  import assert from "node:assert/strict";
3
4
  import { mkdirSync, writeFileSync, rmSync, readFileSync } from "node:fs";
@@ -484,6 +485,14 @@ describe("buildExtractionStepsBlock", () => {
484
485
  assert.ok(/skip/i.test(block));
485
486
  });
486
487
 
488
+ it("limits duplicate checks to one milestone-scoped memory query", () => {
489
+ const block = buildExtractionStepsBlock(ctx);
490
+ const memoryQueryMatches = block.match(/memory_query/g) ?? [];
491
+ assert.equal(memoryQueryMatches.length, 1);
492
+ assert.ok(block.includes("Do not re-read milestone artefacts or repeat memory queries category-by-category"));
493
+ assert.ok(!block.includes("Before each `capture_thought` call, optionally call `memory_query`"));
494
+ });
495
+
487
496
  it("instructs capture_thought as the sole persistence path for Patterns, Lessons, and Decisions (ADR-013 step 6 cutover)", () => {
488
497
  const block = buildExtractionStepsBlock(ctx);
489
498
  // Each of the three persistence steps must call capture_thought.
@@ -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
+ });