gsd-pi 2.80.0-dev.4ea7d80e7 → 2.80.0-dev.7582bf37a

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 (656) hide show
  1. package/README.md +4 -2
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  18. package/dist/resources/extensions/gsd/auto/phases.js +240 -139
  19. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  21. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  23. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  24. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +104 -86
  27. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  28. package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
  29. package/dist/resources/extensions/gsd/auto-start.js +238 -12
  30. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  31. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  32. package/dist/resources/extensions/gsd/auto-worktree.js +209 -81
  33. package/dist/resources/extensions/gsd/auto.js +159 -44
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  36. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  37. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  38. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  39. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  40. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  41. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  42. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +319 -54
  43. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  44. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  45. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
  46. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  47. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  48. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  49. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  50. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  51. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  52. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  53. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  54. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  55. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  56. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  57. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  58. package/dist/resources/extensions/gsd/detection.js +106 -0
  59. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  60. package/dist/resources/extensions/gsd/git-service.js +73 -5
  61. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  62. package/dist/resources/extensions/gsd/guided-flow.js +141 -46
  63. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  64. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  65. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  66. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  67. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  68. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  69. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  70. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  71. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  72. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  73. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  74. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  75. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  76. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  77. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  78. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  80. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  81. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  82. package/dist/resources/extensions/gsd/quick.js +34 -2
  83. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  84. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  85. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  86. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  87. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  88. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  89. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  90. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  91. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  92. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  93. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  94. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  95. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  96. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  97. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  98. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  99. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  100. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  101. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  102. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  103. package/dist/web/standalone/.next/BUILD_ID +1 -1
  104. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  105. package/dist/web/standalone/.next/build-manifest.json +3 -3
  106. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  107. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  108. package/dist/web/standalone/.next/required-server-files.json +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/index.html +1 -1
  128. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  129. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  130. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  131. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  136. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/middleware.js +3 -3
  139. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  140. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  141. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  142. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  143. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  144. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  145. package/dist/web/standalone/server.js +1 -1
  146. package/dist/welcome-screen.d.ts +2 -0
  147. package/dist/welcome-screen.js +9 -7
  148. package/package.json +3 -3
  149. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  150. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  151. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  152. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  153. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  154. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  155. package/packages/native/tsconfig.tsbuildinfo +1 -1
  156. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  157. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  158. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  159. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  160. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  161. package/packages/pi-agent-core/dist/agent.js +2 -0
  162. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  163. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  164. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  165. package/packages/pi-agent-core/dist/index.js +2 -0
  166. package/packages/pi-agent-core/dist/index.js.map +1 -1
  167. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  168. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  169. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  170. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  171. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  172. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  173. package/packages/pi-agent-core/dist/types.js.map +1 -1
  174. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  175. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  176. package/packages/pi-agent-core/src/agent.ts +8 -0
  177. package/packages/pi-agent-core/src/index.ts +2 -0
  178. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  179. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  180. package/packages/pi-agent-core/src/types.ts +14 -0
  181. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  182. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  183. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  184. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  185. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  186. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  187. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  188. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  189. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  190. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  191. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  192. package/packages/pi-ai/dist/types.d.ts +2 -0
  193. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  194. package/packages/pi-ai/dist/types.js.map +1 -1
  195. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  196. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  197. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  198. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  199. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  200. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  201. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  202. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  203. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  204. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  205. package/packages/pi-ai/src/types.ts +3 -0
  206. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  207. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  208. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  209. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  210. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  211. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  212. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  213. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +17 -0
  215. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/agent-session.js +52 -7
  217. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +6 -2
  219. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  221. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  223. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  225. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  226. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  227. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  228. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  229. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  230. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  231. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  232. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  233. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  234. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  235. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  236. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  238. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +3 -0
  240. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/extensions/runner.js +6 -6
  242. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  243. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +5 -3
  244. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  245. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -3
  246. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  249. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  250. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  251. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  252. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  253. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  254. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  255. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  257. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  259. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  260. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  261. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  263. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  264. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  265. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  266. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  267. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  268. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  269. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  271. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  273. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  275. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  277. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  279. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  280. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  281. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  282. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  283. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  284. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  285. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  286. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  287. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  288. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  289. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  290. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  291. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  292. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  293. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  294. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  295. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  296. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  297. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  298. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  299. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  300. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  301. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  302. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  303. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  304. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  305. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  306. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  307. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  308. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  309. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  310. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  311. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  312. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  313. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  315. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +89 -2
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +25 -1
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +155 -7
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +31 -6
  326. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  328. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  329. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  330. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +22 -0
  332. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  334. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  335. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  336. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  337. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  338. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  339. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  340. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  341. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  342. package/packages/pi-coding-agent/src/core/agent-session.ts +59 -7
  343. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +6 -2
  344. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  345. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  346. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  347. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  348. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  349. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +5 -3
  350. package/packages/pi-coding-agent/src/core/extensions/runner.ts +8 -5
  351. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -2
  352. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  353. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  354. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  355. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  356. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  357. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  358. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  359. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  360. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  361. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  362. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  363. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  364. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  365. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  366. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  367. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  368. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  369. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  370. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  371. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +119 -2
  372. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +31 -1
  373. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +180 -7
  374. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  375. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +39 -8
  376. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +24 -0
  377. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  378. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  379. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  380. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  381. package/packages/pi-tui/dist/tui.js +18 -8
  382. package/packages/pi-tui/dist/tui.js.map +1 -1
  383. package/packages/pi-tui/src/tui.ts +20 -8
  384. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  385. package/src/resources/GSD-WORKFLOW.md +2 -2
  386. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  387. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  388. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  389. package/src/resources/extensions/github-sync/sync.ts +8 -1
  390. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  391. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  392. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  393. package/src/resources/extensions/gsd/auto/phases.ts +328 -200
  394. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  395. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  396. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  397. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  398. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  399. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  400. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
  401. package/src/resources/extensions/gsd/auto-post-unit.ts +117 -88
  402. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  403. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  404. package/src/resources/extensions/gsd/auto-start.ts +286 -15
  405. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  406. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  407. package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
  408. package/src/resources/extensions/gsd/auto.ts +208 -39
  409. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  410. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  411. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  412. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  413. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  414. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  415. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  416. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  417. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +369 -54
  418. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  419. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  420. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  421. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  422. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  423. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  424. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  425. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  426. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  427. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  428. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  429. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  430. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  431. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  432. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  433. package/src/resources/extensions/gsd/detection.ts +128 -0
  434. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  435. package/src/resources/extensions/gsd/git-service.ts +87 -10
  436. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  437. package/src/resources/extensions/gsd/guided-flow.ts +167 -53
  438. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  439. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  440. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  441. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  442. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  443. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  444. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  445. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  446. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  447. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  448. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  449. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  450. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  451. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  452. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  453. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  454. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  455. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  456. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  457. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  458. package/src/resources/extensions/gsd/quick.ts +37 -2
  459. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  460. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  461. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  462. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  463. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  464. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  465. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  466. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  467. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  468. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  469. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  470. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  471. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  472. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  473. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  474. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  475. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  476. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  477. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  478. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  479. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  480. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  481. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  482. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  483. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  484. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  485. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  486. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  487. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  488. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  489. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  490. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  491. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  492. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  493. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  494. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  495. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  496. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  497. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  498. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  499. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  500. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  501. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  502. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  503. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  504. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  505. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  506. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  507. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  508. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  509. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  510. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  511. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  512. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  513. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  514. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  515. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  516. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  517. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  518. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  519. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  520. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  521. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  522. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  523. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  524. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  525. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  526. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  527. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  528. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  529. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  530. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  531. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  532. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  533. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  534. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  535. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  536. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  537. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  538. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  539. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  540. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  541. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  542. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  543. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  544. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  545. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  546. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  547. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  548. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  549. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  550. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  551. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  552. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  553. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  554. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  555. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  556. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  557. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  558. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  559. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  560. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  561. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  562. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  563. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  564. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  565. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  566. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  567. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  568. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  569. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  570. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  571. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  572. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  573. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  574. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  575. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  576. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  577. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  578. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  579. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  580. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  581. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  582. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  583. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  584. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  585. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  586. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  587. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  588. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  589. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  590. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  591. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  592. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  593. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  594. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  595. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  596. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  597. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  598. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  599. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  600. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
  601. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  602. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  603. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  604. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  605. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  606. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  607. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  608. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  609. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  610. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  611. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  612. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  613. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  614. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  615. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  616. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  617. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  618. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  619. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  620. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  621. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  622. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  623. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  624. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  625. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  626. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  627. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  628. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  629. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  630. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  631. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  632. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  633. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  634. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  635. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  636. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  637. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  638. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  639. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  640. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  641. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  642. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  643. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  644. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  645. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  646. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  647. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  648. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  649. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  650. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  651. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  652. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  653. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  654. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  655. /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → Y9yOOsO4ZA5BPTOS8ixvP}/_buildManifest.js +0 -0
  656. /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → Y9yOOsO4ZA5BPTOS8ixvP}/_ssgManifest.js +0 -0
@@ -3,223 +3,169 @@
3
3
 
4
4
  import { describe, test } from "node:test";
5
5
  import assert from "node:assert/strict";
6
- import { readFileSync } from "node:fs";
6
+ import { mkdtempSync, mkdirSync, realpathSync, rmSync } from "node:fs";
7
7
  import { join } from "node:path";
8
-
9
- const autoTimersPath = join(import.meta.dirname, "..", "auto-timers.ts");
10
- const autoTimersSrc = readFileSync(autoTimersPath, "utf-8");
11
-
12
- const autoPath = join(import.meta.dirname, "..", "auto.ts");
13
- const autoSrc = readFileSync(autoPath, "utf-8");
14
-
15
- const runUnitPath = join(import.meta.dirname, "..", "auto", "run-unit.ts");
16
- const runUnitSrc = readFileSync(runUnitPath, "utf-8");
17
-
18
- const registerHooksPath = join(import.meta.dirname, "..", "bootstrap", "register-hooks.ts");
19
- const registerHooksSrc = readFileSync(registerHooksPath, "utf-8");
20
-
21
- describe("#3512: gsd-auto-wrapup must not interrupt in-flight tool calls", () => {
22
- test("soft timeout wrapup gates triggerTurn on getInFlightToolCount() === 0", () => {
23
- // The soft timeout sendMessage must NOT use a hardcoded `triggerTurn: true`.
24
- // It must check getInFlightToolCount() before deciding whether to trigger.
25
- // Use the section marker comment to isolate the soft timeout block.
26
- const startMarker = "── 1. Soft timeout warning";
27
- const endMarker = "── 2. Idle watchdog";
28
- const softTimeoutSection = autoTimersSrc.slice(
29
- autoTimersSrc.indexOf(startMarker),
30
- autoTimersSrc.indexOf(endMarker),
31
- );
32
- assert.ok(
33
- softTimeoutSection.length > 0,
34
- "Could not locate soft timeout section",
35
- );
36
-
37
- // Must reference getInFlightToolCount to gate the trigger
38
- assert.ok(
39
- softTimeoutSection.includes("getInFlightToolCount"),
40
- "Soft timeout wrapup must gate triggerTurn behind getInFlightToolCount() check",
41
- );
42
-
43
- // Must NOT have a hardcoded triggerTurn: true
44
- assert.ok(
45
- !softTimeoutSection.includes("triggerTurn: true"),
46
- "Soft timeout wrapup must not use hardcoded triggerTurn: true",
47
- );
48
- });
49
-
50
- test("context-pressure wrapup gates triggerTurn on getInFlightToolCount() === 0", () => {
51
- // The context budget sendMessage must NOT use a hardcoded `triggerTurn: true`.
52
- // Use the section marker to isolate the context-pressure block.
53
- const startMarker = "── 4. Context-pressure continue-here monitor";
54
- const contextSection = autoTimersSrc.slice(
55
- autoTimersSrc.indexOf(startMarker),
56
- );
57
- assert.ok(
58
- contextSection.length > 0,
59
- "Could not locate context budget section",
60
- );
61
-
62
- // Must reference getInFlightToolCount to gate the trigger
63
- assert.ok(
64
- contextSection.includes("getInFlightToolCount"),
65
- "Context budget wrapup must gate triggerTurn behind getInFlightToolCount() check",
66
- );
67
-
68
- // Must NOT have a hardcoded triggerTurn: true
69
- assert.ok(
70
- !contextSection.includes("triggerTurn: true"),
71
- "Context budget wrapup must not use hardcoded triggerTurn: true",
72
- );
73
- });
74
- });
75
-
76
- describe("#4276: pending/skipped tools stay visible to auto-mode hooks", () => {
77
- test("tool_call handler marks GSD tools in-flight before execution_start", () => {
78
- const startMarker = 'pi.on("tool_call", async (event, ctx) => {';
79
- const endMarker = 'pi.on("tool_result", async (event) => {';
80
- const toolCallSection = registerHooksSrc.slice(
81
- registerHooksSrc.indexOf(startMarker),
82
- registerHooksSrc.indexOf(endMarker),
83
- );
84
-
85
- assert.ok(toolCallSection.length > 0, "Could not locate tool_call handler section");
86
- assert.ok(
87
- toolCallSection.includes("markToolStart(event.toolCallId, event.toolName)"),
88
- "tool_call handler must mark tools pending before tool_execution_start fires",
89
- );
90
- });
91
-
92
- test("tool_result handler clears pending tools and records queued-skip errors", () => {
93
- const startMarker = 'pi.on("tool_result", async (event) => {';
94
- const endMarker = 'pi.on("tool_execution_start", async (event) => {';
95
- const toolResultSection = registerHooksSrc.slice(
96
- registerHooksSrc.indexOf(startMarker),
97
- registerHooksSrc.indexOf(endMarker),
98
- );
99
-
100
- assert.ok(toolResultSection.length > 0, "Could not locate tool_result handler section");
101
- assert.ok(
102
- toolResultSection.includes("markToolEnd(event.toolCallId)"),
103
- "tool_result handler must clear pending tool tracking even when execution hooks never fire",
104
- );
105
- assert.ok(
106
- toolResultSection.includes("recordToolInvocationError(event.toolName, errorText)"),
107
- "tool_result handler must surface queued-skip errors for GSD tools",
108
- );
109
- });
110
- });
111
-
112
- describe("#3512: pauseAuto and stopAuto must flush queued follow-up messages", () => {
113
- test("stopAuto calls clearQueue()", () => {
114
- // stopAuto must flush queued messages to prevent late async_job_result
115
- // notifications from triggering extra LLM turns after stop.
116
- const stopAutoSection = autoSrc.slice(
117
- autoSrc.indexOf("export async function stopAuto("),
118
- autoSrc.indexOf("export async function pauseAuto("),
119
- );
120
- assert.ok(stopAutoSection, "Could not locate stopAuto function");
121
- assert.ok(
122
- stopAutoSection.includes("clearQueue"),
123
- "stopAuto must call clearQueue() to flush queued follow-up messages",
124
- );
125
- });
126
-
127
- test("pauseAuto calls clearQueue()", () => {
128
- // pauseAuto must also flush queued messages — same issue as stopAuto.
129
- const pauseAutoSection = autoSrc.slice(
130
- autoSrc.indexOf("export async function pauseAuto("),
131
- );
132
- assert.ok(pauseAutoSection, "Could not locate pauseAuto function");
133
- assert.ok(
134
- pauseAutoSection.includes("clearQueue"),
135
- "pauseAuto must call clearQueue() to flush queued follow-up messages",
136
- );
137
- });
138
-
139
- test("pauseAuto rebuilds STATE.md before releasing the session lock", () => {
140
- // pauseAuto must persist the DB-backed state projection so resume/debugging
141
- // does not see a stale STATE.md after a mid-unit interruption.
142
- const start = autoSrc.indexOf("export async function pauseAuto(");
143
- const end = autoSrc.indexOf("/**\n * Build a WorktreeResolverDeps", start);
144
- const pauseAutoSection = autoSrc.slice(start, end);
145
- assert.ok(pauseAutoSection.length > 0, "Could not locate pauseAuto function");
146
-
147
- const rebuildIndex = pauseAutoSection.indexOf("await rebuildState(s.basePath)");
148
- const releaseIndex = pauseAutoSection.indexOf("releaseSessionLock(lockBase())");
149
- assert.ok(
150
- rebuildIndex >= 0,
151
- "pauseAuto must rebuild STATE.md from DB-backed state before pause completes",
152
- );
153
- assert.ok(
154
- releaseIndex >= 0,
155
- "pauseAuto must still release the session lock",
156
- );
157
- assert.ok(
158
- rebuildIndex < releaseIndex,
159
- "pauseAuto must rebuild state before releasing the session lock",
160
- );
161
- });
162
-
163
- test("run-unit.ts still has its existing clearQueue() call (baseline)", () => {
164
- // Verify the original clearQueue pattern in run-unit.ts hasn't been removed.
165
- assert.ok(
166
- runUnitSrc.includes("clearQueue"),
167
- "run-unit.ts must retain its clearQueue() call after unit completion",
168
- );
169
- });
170
- });
171
-
172
- describe("#4365: tool_execution_start hook must pass toolName to markToolStart", () => {
173
- test("tool_execution_start handler passes event.toolName to markToolStart", () => {
174
- // The tool_execution_start handler must forward toolName so that
175
- // hasInteractiveToolInFlight() can correctly identify ask_user_questions
176
- // and prevent the idle watchdog from firing during interactive tool calls.
177
- const startMarker = 'pi.on("tool_execution_start", async (event) => {';
178
- const endMarker = 'pi.on("tool_execution_end", async (event) => {';
179
- const toolExecutionStartSection = registerHooksSrc.slice(
180
- registerHooksSrc.indexOf(startMarker),
181
- registerHooksSrc.indexOf(endMarker),
182
- );
183
-
184
- assert.ok(
185
- toolExecutionStartSection.length > 0,
186
- "Could not locate tool_execution_start handler section",
187
- );
188
- assert.ok(
189
- toolExecutionStartSection.includes("markToolStart(event.toolCallId, event.toolName)"),
190
- "tool_execution_start handler must pass event.toolName to markToolStart so hasInteractiveToolInFlight() works correctly",
191
- );
8
+ import { tmpdir } from "node:os";
9
+
10
+ import { autoSession } from "../auto-runtime-state.ts";
11
+ import { dispatchHookUnit } from "../auto.ts";
12
+ import { registerHooks } from "../bootstrap/register-hooks.ts";
13
+ import { clearDiscussionFlowState, getPendingGate } from "../bootstrap/write-gate.ts";
14
+
15
+ function makeHookHarness() {
16
+ const handlers = new Map<string, Array<(event: any, ctx: any) => Promise<any>>>();
17
+ const pi = {
18
+ on(name: string, handler: (event: any, ctx: any) => Promise<any>) {
19
+ const current = handlers.get(name) ?? [];
20
+ current.push(handler);
21
+ handlers.set(name, current);
22
+ },
23
+ };
24
+ const ctx = {
25
+ ui: {
26
+ notify: () => {},
27
+ setStatus: () => {},
28
+ setWidget: () => {},
29
+ },
30
+ modelRegistry: {
31
+ setDisabledModelProviders: () => {},
32
+ },
33
+ setCompactionThresholdOverride: () => {},
34
+ };
35
+ async function emit(name: string, event: any): Promise<any> {
36
+ for (const handler of handlers.get(name) ?? []) {
37
+ const result = await handler(event, ctx);
38
+ if (result?.block) return result;
39
+ }
40
+ return undefined;
41
+ }
42
+ registerHooks(pi as any, []);
43
+ return { emit };
44
+ }
45
+
46
+ describe("hook dispatch session workspace root", () => {
47
+ test("dispatchHookUnit passes basePath explicitly to newSession", async (t) => {
48
+ const originalCwd = process.cwd();
49
+ const basePath = mkdtempSync(join(tmpdir(), "gsd-hook-cwd-"));
50
+ mkdirSync(join(basePath, ".gsd"), { recursive: true });
51
+ autoSession.reset();
52
+ t.after(() => {
53
+ try {
54
+ process.chdir(originalCwd);
55
+ } catch {
56
+ // best effort cleanup after cwd-sensitive dispatch tests
57
+ }
58
+ autoSession.reset();
59
+ rmSync(basePath, { recursive: true, force: true });
60
+ });
61
+
62
+ let newSessionOptions: unknown;
63
+ const ctx = {
64
+ ui: {
65
+ notify: () => {},
66
+ setStatus: () => {},
67
+ setWidget: () => {},
68
+ },
69
+ modelRegistry: {
70
+ getAvailable: () => [],
71
+ },
72
+ sessionManager: {
73
+ getSessionFile: () => join(basePath, "session.jsonl"),
74
+ },
75
+ newSession: async (options?: unknown) => {
76
+ newSessionOptions = options;
77
+ return { cancelled: false };
78
+ },
79
+ };
80
+ const pi = {
81
+ sendMessage: () => {},
82
+ setModel: async () => true,
83
+ };
84
+
85
+ const dispatched = await dispatchHookUnit(
86
+ ctx as any,
87
+ pi as any,
88
+ "review",
89
+ "execute-task",
90
+ "M001/S01/T01",
91
+ "review the completed unit",
92
+ undefined,
93
+ basePath,
94
+ );
95
+
96
+ assert.equal(dispatched, true);
97
+ assert.deepEqual(newSessionOptions, { workspaceRoot: basePath });
192
98
  });
193
99
  });
194
100
 
195
101
  describe("deep setup approval questions pause immediately", () => {
196
- test("register-hooks sets pending gate during message_update without aborting the stream", () => {
197
- const startMarker = 'pi.on("message_update"';
198
- const endMarker = 'pi.on("session_shutdown"';
199
- const messageUpdateSection = registerHooksSrc.slice(
200
- registerHooksSrc.indexOf(startMarker),
201
- registerHooksSrc.indexOf(endMarker),
202
- );
203
-
204
- assert.ok(
205
- messageUpdateSection.length > 0,
206
- "Could not locate message_update approval pause handler",
207
- );
208
- assert.ok(
209
- messageUpdateSection.includes("shouldPauseForUserApprovalQuestion"),
210
- "message_update must detect approval/question boundaries",
211
- );
212
- assert.ok(
213
- messageUpdateSection.includes("approvalGateIdForUnit") && messageUpdateSection.includes("setPendingGate"),
214
- "plain-text approval questions must set the durable write gate",
215
- );
216
- assert.ok(
217
- messageUpdateSection.includes("getDiscussionMilestoneIdFor") && messageUpdateSection.includes('"discuss-milestone"'),
218
- "foreground milestone discussion questions must also set the durable write gate",
219
- );
220
- assert.ok(
221
- !messageUpdateSection.includes("ctx.abort()"),
222
- "message_update must NOT abort the stream — aborting eats the model's question text on external CLI providers; the pending gate set above blocks subsequent tool calls instead",
223
- );
102
+ test("plain-text approval boundary defers durable gate until same-turn CONTEXT-DRAFT can save", async () => {
103
+ const base = realpathSync(mkdtempSync(join(tmpdir(), "gsd-deferred-approval-")));
104
+ const previousCwd = process.cwd();
105
+ try {
106
+ mkdirSync(join(base, ".gsd", "milestones", "M003"), { recursive: true });
107
+ process.chdir(base);
108
+ clearDiscussionFlowState(base);
109
+ autoSession.reset();
110
+ autoSession.basePath = base;
111
+ autoSession.currentUnit = {
112
+ type: "discuss-milestone",
113
+ id: "M003",
114
+ startedAt: Date.now(),
115
+ };
116
+
117
+ const { emit } = makeHookHarness();
118
+ await emit("message_update", {
119
+ message: {
120
+ role: "assistant",
121
+ content: [{ type: "text", text: "Did I capture that correctly? If not, tell me what I missed." }],
122
+ },
123
+ });
124
+
125
+ assert.equal(
126
+ getPendingGate(base),
127
+ null,
128
+ "approval text should not install the durable pending gate until the assistant turn ends",
129
+ );
130
+
131
+ const draftResult = await emit("tool_call", {
132
+ toolCallId: "draft-save",
133
+ toolName: "gsd_summary_save",
134
+ input: {
135
+ milestone_id: "M003",
136
+ artifact_type: "CONTEXT-DRAFT",
137
+ content: "# M003 Draft\n",
138
+ },
139
+ });
140
+ assert.equal(
141
+ draftResult?.block,
142
+ undefined,
143
+ "same-turn CONTEXT-DRAFT persistence should remain allowed after the approval text streams",
144
+ );
145
+
146
+ const finalContextResult = await emit("tool_call", {
147
+ toolCallId: "final-context",
148
+ toolName: "gsd_summary_save",
149
+ input: {
150
+ milestone_id: "M003",
151
+ artifact_type: "CONTEXT",
152
+ content: "# M003 Context\n",
153
+ },
154
+ });
155
+ assert.equal(finalContextResult?.block, true, "final CONTEXT must still wait for approval");
156
+ assert.match(finalContextResult.reason, /Approval question "depth_verification_M003_confirm"/);
157
+
158
+ await emit("agent_end", { messages: [] });
159
+ assert.equal(
160
+ getPendingGate(base),
161
+ "depth_verification_M003_confirm",
162
+ "agent_end should activate the durable pending gate for the next turn",
163
+ );
164
+ } finally {
165
+ process.chdir(previousCwd);
166
+ autoSession.reset();
167
+ clearDiscussionFlowState(base);
168
+ rmSync(base, { recursive: true, force: true });
169
+ }
224
170
  });
225
171
  });
@@ -1,40 +1,23 @@
1
- import { describe, test } from "node:test";
1
+ import { describe, test, afterEach } from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { readFileSync } from "node:fs";
3
+ import { mkdtempSync, mkdirSync, realpathSync, rmSync } from "node:fs";
4
4
  import { join } from "node:path";
5
- import { extractSourceRegion } from "./test-helpers.ts";
5
+ import { tmpdir } from "node:os";
6
6
 
7
- const systemContextSrc = readFileSync(
8
- join(import.meta.dirname, "..", "bootstrap", "system-context.ts"),
9
- "utf-8",
10
- );
11
- const registerHooksSrc = readFileSync(
12
- join(import.meta.dirname, "..", "bootstrap", "register-hooks.ts"),
13
- "utf-8",
14
- );
7
+ import { ensureDbOpen } from "../bootstrap/dynamic-tools.ts";
8
+ import { closeDatabase, isDbAvailable } from "../gsd-db.ts";
9
+
10
+ afterEach(() => {
11
+ if (isDbAvailable()) closeDatabase();
12
+ });
15
13
 
16
14
  describe("bootstrap deriveState DB guards (#3844)", () => {
17
- test("system-context opens DB before deriveState in resume flows", () => {
18
- const helperIdx = systemContextSrc.indexOf("const ensureStateDbOpen = async () => {");
19
- const firstDeriveIdx = systemContextSrc.indexOf("const state = await deriveState(basePath);");
20
- assert.ok(helperIdx > -1, "system-context should define a DB-open helper for deriveState callers");
21
- assert.ok(firstDeriveIdx > -1, "system-context should still derive state for resume flows");
22
- assert.ok(helperIdx < firstDeriveIdx, "system-context should prepare DB opening before deriveState resume calls");
23
- assert.match(
24
- systemContextSrc,
25
- /await ensureStateDbOpen\(\);\s*\n\s*const state = await deriveState\(basePath\);/g,
26
- "system-context resume flows should open DB before deriveState",
27
- );
28
- });
15
+ test("ensureDbOpen creates and opens the project DB when .gsd exists", async (t) => {
16
+ const base = realpathSync(mkdtempSync(join(tmpdir(), "gsd-ensure-db-")));
17
+ t.after(() => rmSync(base, { recursive: true, force: true }));
18
+ mkdirSync(join(base, ".gsd"), { recursive: true });
29
19
 
30
- test("register-hooks opens DB before deriveState in session_before_compact", () => {
31
- const compactIdx = registerHooksSrc.indexOf('pi.on("session_before_compact"');
32
- assert.ok(compactIdx > -1, "register-hooks should define session_before_compact");
33
- const compactSection = extractSourceRegion(registerHooksSrc, 'pi.on("session_before_compact"');
34
- const ensureIdx = compactSection.indexOf("ensureDbOpen(basePath)");
35
- const deriveIdx = compactSection.indexOf("deriveGsdState(basePath)");
36
- assert.ok(ensureIdx > -1, "session_before_compact should call ensureDbOpen(basePath)");
37
- assert.ok(deriveIdx > -1, "session_before_compact should derive state");
38
- assert.ok(ensureIdx < deriveIdx, "session_before_compact should open DB before deriveState");
20
+ assert.equal(await ensureDbOpen(base), true);
21
+ assert.equal(isDbAvailable(), true);
39
22
  });
40
23
  });
@@ -90,44 +90,3 @@ test("getBrowser() guard triggers closeBrowser when browser is active", async ()
90
90
  assert.equal(closeCalled, true, "browser.close() should have been called");
91
91
  assert.equal(getBrowser(), null, "browser should be null after guarded teardown");
92
92
  });
93
-
94
- // ─── Source code verification ───────────────────────────────────────────────
95
-
96
- test("stopAuto finally block includes browser teardown", async () => {
97
- // Verify the source code contains the browser teardown call
98
- const { readFileSync } = await import("node:fs");
99
- const { resolve } = await import("node:path");
100
- const autoSource = readFileSync(resolve(import.meta.dirname, "..", "auto.ts"), "utf-8");
101
-
102
- assert.ok(
103
- autoSource.includes("closeBrowser"),
104
- "auto.ts should reference closeBrowser for teardown in stopAuto",
105
- );
106
- assert.ok(
107
- autoSource.includes("getBrowser"),
108
- "auto.ts should check getBrowser() before calling closeBrowser",
109
- );
110
- assert.ok(
111
- autoSource.includes("browser-tools/lifecycle"),
112
- "auto.ts should import from browser-tools/lifecycle",
113
- );
114
- });
115
-
116
- test("postUnitPreVerification includes browser teardown between units", async () => {
117
- const { readFileSync } = await import("node:fs");
118
- const { resolve } = await import("node:path");
119
- const postUnitSource = readFileSync(resolve(import.meta.dirname, "..", "auto-post-unit.ts"), "utf-8");
120
-
121
- assert.ok(
122
- postUnitSource.includes("closeBrowser"),
123
- "auto-post-unit.ts should reference closeBrowser for inter-unit teardown",
124
- );
125
- assert.ok(
126
- postUnitSource.includes("getBrowser"),
127
- "auto-post-unit.ts should check getBrowser() before calling closeBrowser",
128
- );
129
- assert.ok(
130
- postUnitSource.includes("browser-teardown"),
131
- "auto-post-unit.ts should have browser-teardown debug phase",
132
- );
133
- });
@@ -131,9 +131,11 @@ test("postflightPopStash — restores stashed changes and emits info notificatio
131
131
  run('git commit -m "simulate merge"', repo);
132
132
 
133
133
  const postNotifications: Array<{ msg: string; level: string }> = [];
134
- postflightPopStash(repo, "M004", (msg, level) => {
134
+ const postflight = postflightPopStash(repo, "M004", preflight.stashMarker, (msg, level) => {
135
135
  postNotifications.push({ msg, level });
136
136
  });
137
+ assert.equal(postflight.restored, true, "postflight must report successful restore");
138
+ assert.equal(postflight.needsManualRecovery, false, "successful restore must not need manual recovery");
137
139
 
138
140
  // The stashed README.md change must be restored
139
141
  const content = readFileSync(join(repo, "README.md"), "utf-8");
@@ -171,7 +173,8 @@ test("preflight + merge + postflight round-trip preserves uncommitted changes",
171
173
  run('git commit -m "feat: add feature"', repo);
172
174
 
173
175
  // Postflight: pop stash
174
- postflightPopStash(repo, "M005", () => {});
176
+ const postflight = postflightPopStash(repo, "M005", preflight.stashMarker, () => {});
177
+ assert.equal(postflight.needsManualRecovery, false, "clean restore must not stop auto-mode");
175
178
 
176
179
  // README.md must still have our local content
177
180
  const restored = readFileSync(join(repo, "README.md"), "utf-8");
@@ -184,3 +187,95 @@ test("preflight + merge + postflight round-trip preserves uncommitted changes",
184
187
  try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
185
188
  }
186
189
  });
190
+
191
+ test("postflightPopStash conflict warning names the exact stash ref", () => {
192
+ const repo = createTempRepo();
193
+ try {
194
+ writeFileSync(join(repo, "README.md"), "# local work\n");
195
+ const preflight = preflightCleanRoot(repo, "M005C", () => {});
196
+ assert.equal(preflight.stashPushed, true, "must have stashed");
197
+
198
+ writeFileSync(join(repo, "README.md"), "# merged work\n");
199
+ run("git add README.md", repo);
200
+ run('git commit -m "simulate conflicting merge"', repo);
201
+
202
+ const notifications: Array<{ msg: string; level: string }> = [];
203
+ const postflight = postflightPopStash(repo, "M005C", preflight.stashMarker, (msg, level) => {
204
+ notifications.push({ msg, level });
205
+ });
206
+ assert.equal(postflight.restored, false, "conflicted restore must report restored=false");
207
+ assert.equal(postflight.needsManualRecovery, true, "conflicted restore must require manual recovery");
208
+ assert.match(postflight.message, /failed after merge of milestone M005C/);
209
+
210
+ const warning = notifications.find((n) => n.level === "warning")?.msg ?? "";
211
+ assert.match(warning, /git stash pop stash@\{\d+\}/);
212
+ assert.match(warning, /git stash apply stash@\{\d+\}/);
213
+ } finally {
214
+ try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
215
+ }
216
+ });
217
+
218
+ test("postflightPopStash restores the matching GSD stash, not stash@{0}", () => {
219
+ const repo = createTempRepo();
220
+ try {
221
+ writeFileSync(join(repo, "README.md"), "# target stash\n");
222
+ const preflight = preflightCleanRoot(repo, "M006", () => {});
223
+ assert.equal(preflight.stashPushed, true, "must have stashed target change");
224
+
225
+ writeFileSync(join(repo, "other.txt"), "other stash\n");
226
+ run('git stash push --include-untracked -m "unrelated newer stash"', repo);
227
+
228
+ const postflight = postflightPopStash(repo, "M006", preflight.stashMarker, () => {});
229
+ assert.equal(postflight.needsManualRecovery, false, "targeted restore must not need manual recovery");
230
+
231
+ const content = readFileSync(join(repo, "README.md"), "utf-8");
232
+ assert.equal(content.replace(/\r\n/g, "\n"), "# target stash\n");
233
+ const stashList = run("git stash list", repo);
234
+ assert.ok(stashList.includes("unrelated newer stash"), "unrelated newer stash must remain");
235
+ assert.ok(!stashList.includes("gsd-preflight-stash [gsd-preflight-stash:M006"), "target stash should be consumed");
236
+ } finally {
237
+ try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
238
+ }
239
+ });
240
+
241
+ test("postflightPopStash restores the exact preflight marker when another same-milestone stash exists", () => {
242
+ const repo = createTempRepo();
243
+ try {
244
+ writeFileSync(join(repo, "README.md"), "# target stash\n");
245
+ const preflight = preflightCleanRoot(repo, "M007", () => {});
246
+ assert.equal(preflight.stashPushed, true, "must have stashed target change");
247
+ assert.ok(preflight.stashMarker, "preflight must expose exact stash marker");
248
+
249
+ writeFileSync(join(repo, "same-milestone.txt"), "newer same milestone stash\n");
250
+ run('git stash push --include-untracked -m "gsd-preflight-stash [gsd-preflight-stash:M007:other]"', repo);
251
+
252
+ const postflight = postflightPopStash(repo, "M007", preflight.stashMarker, () => {});
253
+ assert.equal(postflight.needsManualRecovery, false, "exact marker restore must not need manual recovery");
254
+
255
+ const content = readFileSync(join(repo, "README.md"), "utf-8");
256
+ assert.equal(content.replace(/\r\n/g, "\n"), "# target stash\n");
257
+ const stashList = run("git stash list", repo);
258
+ assert.ok(stashList.includes("gsd-preflight-stash:M007:other"), "newer same-milestone stash must remain");
259
+ assert.ok(!stashList.includes(preflight.stashMarker), "exact target stash should be consumed");
260
+ } finally {
261
+ try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
262
+ }
263
+ });
264
+
265
+ test("postflightPopStash falls back to milestone marker prefix when exact marker is unavailable", () => {
266
+ const repo = createTempRepo();
267
+ try {
268
+ writeFileSync(join(repo, "README.md"), "# fallback stash\n");
269
+ run('git stash push --include-untracked -m "gsd-preflight-stash [gsd-preflight-stash:M008:fallback]"', repo);
270
+
271
+ const postflight = postflightPopStash(repo, "M008", undefined, () => {});
272
+ assert.equal(postflight.needsManualRecovery, false, "fallback marker restore must not need manual recovery");
273
+
274
+ const content = readFileSync(join(repo, "README.md"), "utf-8");
275
+ assert.equal(content.replace(/\r\n/g, "\n"), "# fallback stash\n");
276
+ const stashList = run("git stash list", repo);
277
+ assert.ok(!stashList.includes("gsd-preflight-stash:M008:fallback"), "fallback stash should be consumed");
278
+ } finally {
279
+ try { rmSync(repo, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 }); } catch { /* ignore */ }
280
+ }
281
+ });