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
@@ -5,7 +5,7 @@ import type { ExtensionAPI } from "@gsd/pi-coding-agent";
5
5
  import { Text } from "@gsd/pi-tui";
6
6
 
7
7
  import { loadEffectiveGSDPreferences } from "../preferences.js";
8
- import { ensureDbOpen } from "./dynamic-tools.js";
8
+ import { ensureDbOpen, resolveCtxCwd } from "./dynamic-tools.js";
9
9
  import { loadWriteGateSnapshot, shouldBlockRootArtifactSaveInSnapshot } from "./write-gate.js";
10
10
  import { StringEnum } from "@gsd/pi-ai";
11
11
  import { logError } from "../workflow-logger.js";
@@ -16,6 +16,7 @@ async function loadWorkflowExecutors(): Promise<typeof import("../tools/workflow
16
16
  return import("../tools/workflow-tool-executors.js");
17
17
  }
18
18
 
19
+
19
20
  /**
20
21
  * Register an alias tool that shares the same execute function as its canonical counterpart.
21
22
  * The alias description and promptGuidelines direct the LLM to prefer the canonical name.
@@ -38,8 +39,8 @@ function registerAlias(pi: ExtensionAPI, toolDef: any, aliasName: string, canoni
38
39
  });
39
40
  }
40
41
 
41
- function requirementRootWriteGuard(operation: string): { content: Array<{ type: "text"; text: string }>; details: Record<string, unknown>; isError: true } | null {
42
- const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(process.cwd()), "REQUIREMENTS");
42
+ function requirementRootWriteGuard(operation: string, basePath: string): { content: Array<{ type: "text"; text: string }>; details: Record<string, unknown>; isError: true } | null {
43
+ const guard = shouldBlockRootArtifactSaveInSnapshot(loadWriteGateSnapshot(basePath), "REQUIREMENTS");
43
44
  if (!guard.block) return null;
44
45
  return {
45
46
  content: [{ type: "text", text: `Error ${operation} requirement: ${guard.reason ?? "requirements write blocked"}` }],
@@ -65,7 +66,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
65
66
  // ─── gsd_decision_save (formerly gsd_save_decision) ─────────────────────
66
67
 
67
68
  const decisionSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
68
- const dbAvailable = await ensureDbOpen();
69
+ const basePath = resolveCtxCwd(_ctx);
70
+ const dbAvailable = await ensureDbOpen(basePath);
69
71
  if (!dbAvailable) {
70
72
  return {
71
73
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot save decision." }],
@@ -84,7 +86,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
84
86
  when_context: params.when_context,
85
87
  made_by: params.made_by,
86
88
  },
87
- process.cwd(),
89
+ basePath,
88
90
  );
89
91
  return {
90
92
  content: [{ type: "text" as const, text: `Saved decision ${id}` }],
@@ -152,9 +154,10 @@ export function registerDbTools(pi: ExtensionAPI): void {
152
154
  // ─── gsd_requirement_update (formerly gsd_update_requirement) ───────────
153
155
 
154
156
  const requirementUpdateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
155
- const gateBlock = requirementRootWriteGuard("update_requirement");
157
+ const basePath = resolveCtxCwd(_ctx);
158
+ const gateBlock = requirementRootWriteGuard("update_requirement", basePath);
156
159
  if (gateBlock) return gateBlock;
157
- const dbAvailable = await ensureDbOpen();
160
+ const dbAvailable = await ensureDbOpen(basePath);
158
161
  if (!dbAvailable) {
159
162
  return {
160
163
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot update requirement." }],
@@ -170,7 +173,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
170
173
  if (params.description !== undefined) updates.description = params.description;
171
174
  if (params.primary_owner !== undefined) updates.primary_owner = params.primary_owner;
172
175
  if (params.supporting_slices !== undefined) updates.supporting_slices = params.supporting_slices;
173
- await updateRequirementInDb(params.id, updates, process.cwd());
176
+ await updateRequirementInDb(params.id, updates, basePath);
174
177
  return {
175
178
  content: [{ type: "text" as const, text: `Updated requirement ${params.id}` }],
176
179
  details: { operation: "update_requirement", id: params.id } as any,
@@ -232,9 +235,10 @@ export function registerDbTools(pi: ExtensionAPI): void {
232
235
  // ─── gsd_requirement_save ─────────────────────────────────────────────
233
236
 
234
237
  const requirementSaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
235
- const gateBlock = requirementRootWriteGuard("save_requirement");
238
+ const basePath = resolveCtxCwd(_ctx);
239
+ const gateBlock = requirementRootWriteGuard("save_requirement", basePath);
236
240
  if (gateBlock) return gateBlock;
237
- const dbAvailable = await ensureDbOpen();
241
+ const dbAvailable = await ensureDbOpen(basePath);
238
242
  if (!dbAvailable) {
239
243
  return {
240
244
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot save requirement." }],
@@ -255,7 +259,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
255
259
  validation: params.validation,
256
260
  notes: params.notes,
257
261
  },
258
- process.cwd(),
262
+ basePath,
259
263
  );
260
264
  return {
261
265
  content: [{ type: "text" as const, text: `Saved requirement ${result.id}` }],
@@ -335,7 +339,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
335
339
 
336
340
  const summarySaveExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
337
341
  const { executeSummarySave } = await loadWorkflowExecutors();
338
- return executeSummarySave(params, process.cwd());
342
+ return executeSummarySave(params, resolveCtxCwd(_ctx));
339
343
  };
340
344
 
341
345
  const summarySaveTool = {
@@ -386,24 +390,24 @@ export function registerDbTools(pi: ExtensionAPI): void {
386
390
 
387
391
  const milestoneGenerateIdExecute = async (_toolCallId: string, _params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
388
392
  try {
393
+ const basePath = resolveCtxCwd(_ctx);
389
394
  // Claim a reserved ID if the guided-flow already previewed one to the user.
390
395
  // This guarantees the ID shown in the UI matches the one materialised on disk.
391
396
  const { claimReservedId, findMilestoneIds, getReservedMilestoneIds, nextMilestoneId } = await import("../guided-flow.js");
392
397
  const reserved = claimReservedId();
393
398
  if (reserved) {
394
- await ensureMilestoneDbRow(reserved);
399
+ await ensureMilestoneDbRow(reserved, basePath);
395
400
  return {
396
401
  content: [{ type: "text" as const, text: reserved }],
397
402
  details: { operation: "generate_milestone_id", id: reserved, source: "reserved" } as any,
398
403
  };
399
404
  }
400
405
 
401
- const basePath = process.cwd();
402
406
  const existingIds = findMilestoneIds(basePath);
403
- const uniqueEnabled = !!loadEffectiveGSDPreferences()?.preferences?.unique_milestone_ids;
407
+ const uniqueEnabled = !!loadEffectiveGSDPreferences(basePath)?.preferences?.unique_milestone_ids;
404
408
  const allIds = [...new Set([...existingIds, ...getReservedMilestoneIds()])];
405
409
  const newId = nextMilestoneId(allIds, uniqueEnabled);
406
- await ensureMilestoneDbRow(newId);
410
+ await ensureMilestoneDbRow(newId, basePath);
407
411
  return {
408
412
  content: [{ type: "text" as const, text: newId }],
409
413
  details: { operation: "generate_milestone_id", id: newId, existingCount: existingIds.length, uniqueEnabled } as any,
@@ -423,8 +427,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
423
427
  * later writes the full row. Silently skips if the DB isn't available yet
424
428
  * (pre-migration).
425
429
  */
426
- async function ensureMilestoneDbRow(milestoneId: string): Promise<void> {
427
- const dbAvailable = await ensureDbOpen();
430
+ async function ensureMilestoneDbRow(milestoneId: string, basePath: string): Promise<void> {
431
+ const dbAvailable = await ensureDbOpen(basePath);
428
432
  if (!dbAvailable) return;
429
433
  try {
430
434
  const { insertMilestone } = await import("../gsd-db.js");
@@ -471,7 +475,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
471
475
 
472
476
  const planMilestoneExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
473
477
  const { executePlanMilestone } = await loadWorkflowExecutors();
474
- return executePlanMilestone(params, process.cwd());
478
+ return executePlanMilestone(params, resolveCtxCwd(_ctx));
475
479
  };
476
480
 
477
481
  const planMilestoneTool = {
@@ -541,7 +545,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
541
545
 
542
546
  const planSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
543
547
  const { executePlanSlice } = await loadWorkflowExecutors();
544
- return executePlanSlice(params, process.cwd());
548
+ return executePlanSlice(params, resolveCtxCwd(_ctx));
545
549
  };
546
550
 
547
551
  const planSliceTool = {
@@ -590,7 +594,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
590
594
  // ─── gsd_plan_task (gsd_task_plan alias) ───────────────────────────────
591
595
 
592
596
  const planTaskExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
593
- const dbAvailable = await ensureDbOpen();
597
+ const basePath = resolveCtxCwd(_ctx);
598
+ const dbAvailable = await ensureDbOpen(basePath);
594
599
  if (!dbAvailable) {
595
600
  return {
596
601
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot plan task." }],
@@ -599,7 +604,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
599
604
  }
600
605
  try {
601
606
  const { handlePlanTask } = await import("../tools/plan-task.js");
602
- const result = await handlePlanTask(params, process.cwd());
607
+ const result = await handlePlanTask(params, basePath);
603
608
  if ("error" in result) {
604
609
  return {
605
610
  content: [{ type: "text" as const, text: `Error planning task: ${result.error}` }],
@@ -664,7 +669,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
664
669
 
665
670
  const taskCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
666
671
  const { executeTaskComplete } = await loadWorkflowExecutors();
667
- return executeTaskComplete(params, process.cwd());
672
+ return executeTaskComplete(params, resolveCtxCwd(_ctx));
668
673
  };
669
674
 
670
675
  const taskCompleteTool = {
@@ -735,7 +740,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
735
740
 
736
741
  const sliceCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
737
742
  const { executeSliceComplete } = await loadWorkflowExecutors();
738
- return executeSliceComplete(params, process.cwd());
743
+ return executeSliceComplete(params, resolveCtxCwd(_ctx));
739
744
  };
740
745
 
741
746
  const sliceCompleteTool = {
@@ -835,7 +840,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
835
840
  // ─── gsd_skip_slice (#3477 / #3487) ───────────────────────────────────
836
841
 
837
842
  const skipSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
838
- const dbAvailable = await ensureDbOpen();
843
+ const basePath = resolveCtxCwd(_ctx);
844
+ const dbAvailable = await ensureDbOpen(basePath);
839
845
  if (!dbAvailable) {
840
846
  return {
841
847
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot skip slice." }],
@@ -868,7 +874,6 @@ export function registerDbTools(pi: ExtensionAPI): void {
868
874
  // Rebuild STATE.md so it reflects the skip immediately (#3477).
869
875
  // Without this, /gsd auto reads stale STATE.md and resumes the skipped slice.
870
876
  try {
871
- const basePath = process.cwd();
872
877
  const { rebuildState } = await import("../doctor.js");
873
878
  await rebuildState(basePath);
874
879
  } catch (err) {
@@ -928,7 +933,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
928
933
 
929
934
  const milestoneCompleteExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
930
935
  const { executeCompleteMilestone } = await loadWorkflowExecutors();
931
- return executeCompleteMilestone(params, process.cwd());
936
+ return executeCompleteMilestone(params, resolveCtxCwd(_ctx));
932
937
  };
933
938
 
934
939
  const milestoneCompleteTool = {
@@ -974,7 +979,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
974
979
 
975
980
  const milestoneValidateExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
976
981
  const { executeValidateMilestone } = await loadWorkflowExecutors();
977
- return executeValidateMilestone(params, process.cwd());
982
+ return executeValidateMilestone(params, resolveCtxCwd(_ctx));
978
983
  };
979
984
 
980
985
  const milestoneValidateTool = {
@@ -1012,7 +1017,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1012
1017
 
1013
1018
  const replanSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1014
1019
  const { executeReplanSlice } = await loadWorkflowExecutors();
1015
- return executeReplanSlice(params, process.cwd());
1020
+ return executeReplanSlice(params, resolveCtxCwd(_ctx));
1016
1021
  };
1017
1022
 
1018
1023
  const replanSliceTool = {
@@ -1063,7 +1068,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1063
1068
 
1064
1069
  const reassessRoadmapExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1065
1070
  const { executeReassessRoadmap } = await loadWorkflowExecutors();
1066
- return executeReassessRoadmap(params, process.cwd());
1071
+ return executeReassessRoadmap(params, resolveCtxCwd(_ctx));
1067
1072
  };
1068
1073
 
1069
1074
  const reassessRoadmapTool = {
@@ -1122,7 +1127,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
1122
1127
  // Single-writer v3, Stream 3: reversibility tools for closed units.
1123
1128
 
1124
1129
  const reopenTaskExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1125
- const dbAvailable = await ensureDbOpen();
1130
+ const basePath = resolveCtxCwd(_ctx);
1131
+ const dbAvailable = await ensureDbOpen(basePath);
1126
1132
  if (!dbAvailable) {
1127
1133
  return {
1128
1134
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot reopen task." }],
@@ -1131,7 +1137,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1131
1137
  }
1132
1138
  try {
1133
1139
  const { handleReopenTask } = await import("../tools/reopen-task.js");
1134
- const result = await handleReopenTask(params, process.cwd());
1140
+ const result = await handleReopenTask(params, basePath);
1135
1141
  if ("error" in result) {
1136
1142
  return {
1137
1143
  content: [{ type: "text" as const, text: `Error reopening task: ${result.error}` }],
@@ -1188,7 +1194,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
1188
1194
  // ─── gsd_slice_reopen (gsd_reopen_slice alias) ─────────────────────────
1189
1195
 
1190
1196
  const reopenSliceExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1191
- const dbAvailable = await ensureDbOpen();
1197
+ const basePath = resolveCtxCwd(_ctx);
1198
+ const dbAvailable = await ensureDbOpen(basePath);
1192
1199
  if (!dbAvailable) {
1193
1200
  return {
1194
1201
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot reopen slice." }],
@@ -1197,7 +1204,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1197
1204
  }
1198
1205
  try {
1199
1206
  const { handleReopenSlice } = await import("../tools/reopen-slice.js");
1200
- const result = await handleReopenSlice(params, process.cwd());
1207
+ const result = await handleReopenSlice(params, basePath);
1201
1208
  if ("error" in result) {
1202
1209
  return {
1203
1210
  content: [{ type: "text" as const, text: `Error reopening slice: ${result.error}` }],
@@ -1254,7 +1261,8 @@ export function registerDbTools(pi: ExtensionAPI): void {
1254
1261
  // ─── gsd_milestone_reopen (gsd_reopen_milestone alias) ─────────────────
1255
1262
 
1256
1263
  const reopenMilestoneExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1257
- const dbAvailable = await ensureDbOpen();
1264
+ const basePath = resolveCtxCwd(_ctx);
1265
+ const dbAvailable = await ensureDbOpen(basePath);
1258
1266
  if (!dbAvailable) {
1259
1267
  return {
1260
1268
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot reopen milestone." }],
@@ -1263,7 +1271,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1263
1271
  }
1264
1272
  try {
1265
1273
  const { handleReopenMilestone } = await import("../tools/reopen-milestone.js");
1266
- const result = await handleReopenMilestone(params, process.cwd());
1274
+ const result = await handleReopenMilestone(params, basePath);
1267
1275
  if ("error" in result) {
1268
1276
  return {
1269
1277
  content: [{ type: "text" as const, text: `Error reopening milestone: ${result.error}` }],
@@ -1319,7 +1327,7 @@ export function registerDbTools(pi: ExtensionAPI): void {
1319
1327
 
1320
1328
  const saveGateResultExecute = async (_toolCallId: string, params: any, _signal: AbortSignal | undefined, _onUpdate: unknown, _ctx: unknown) => {
1321
1329
  const { executeSaveGateResult } = await loadWorkflowExecutors();
1322
- return executeSaveGateResult(params, process.cwd());
1330
+ return executeSaveGateResult(params, resolveCtxCwd(_ctx));
1323
1331
  };
1324
1332
 
1325
1333
  const saveGateResultTool = {
@@ -1,4 +1,7 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers workspace-aware dynamic filesystem and shell tools.
1
3
  import { existsSync } from "node:fs";
4
+ import { homedir } from "node:os";
2
5
  import { dirname } from "node:path";
3
6
 
4
7
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
@@ -8,6 +11,24 @@ import { DEFAULT_BASH_TIMEOUT_SECS } from "../constants.js";
8
11
  import { setLogBasePath, logWarning } from "../workflow-logger.js";
9
12
  import { resolveGsdPathContract } from "../paths.js";
10
13
 
14
+ export function safeWorkspaceCwd(): string {
15
+ try {
16
+ return process.cwd();
17
+ } catch {
18
+ const projectRoot = process.env.GSD_PROJECT_ROOT;
19
+ if (projectRoot && existsSync(projectRoot)) return projectRoot;
20
+ return homedir();
21
+ }
22
+ }
23
+
24
+ export function resolveCtxCwd(ctx?: unknown): string {
25
+ if (ctx && typeof ctx === "object" && typeof (ctx as { cwd?: unknown }).cwd === "string") {
26
+ const cwd = (ctx as { cwd: string }).cwd;
27
+ if (existsSync(cwd)) return cwd;
28
+ }
29
+ return safeWorkspaceCwd();
30
+ }
31
+
11
32
  /**
12
33
  * Resolve the correct DB path for the current working directory.
13
34
  * If `basePath` is inside a `.gsd/worktrees/<MID>/` directory, returns
@@ -18,7 +39,7 @@ export function resolveProjectRootDbPath(basePath: string): string {
18
39
  return resolveGsdPathContract(basePath).projectDb;
19
40
  }
20
41
 
21
- export async function ensureDbOpen(basePath: string = process.cwd()): Promise<boolean> {
42
+ export async function ensureDbOpen(basePath: string = safeWorkspaceCwd()): Promise<boolean> {
22
43
  try {
23
44
  const db = await import("../gsd-db.js");
24
45
  const contract = resolveGsdPathContract(basePath);
@@ -50,8 +71,9 @@ export async function ensureDbOpen(basePath: string = process.cwd()): Promise<bo
50
71
  }
51
72
 
52
73
  export function registerDynamicTools(pi: ExtensionAPI): void {
53
- const baseBash = createBashTool(process.cwd(), {
54
- spawnHook: (ctx) => ({ ...ctx, cwd: process.cwd() }),
74
+ const fallbackRoot = safeWorkspaceCwd();
75
+ const baseBash = createBashTool(fallbackRoot, {
76
+ spawnHook: (ctx) => ctx,
55
77
  });
56
78
  const dynamicBash = {
57
79
  ...baseBash,
@@ -62,16 +84,20 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
62
84
  onUpdate?: unknown,
63
85
  ctx?: unknown,
64
86
  ) => {
87
+ const basePath = resolveCtxCwd(ctx);
88
+ const fresh = createBashTool(basePath, {
89
+ spawnHook: (spawnCtx) => ({ ...spawnCtx, cwd: basePath }),
90
+ });
65
91
  const paramsWithTimeout = {
66
92
  ...params,
67
93
  timeout: params.timeout ?? DEFAULT_BASH_TIMEOUT_SECS,
68
94
  };
69
- return (baseBash as any).execute(toolCallId, paramsWithTimeout, signal, onUpdate, ctx);
95
+ return (fresh as any).execute(toolCallId, paramsWithTimeout, signal, onUpdate, ctx);
70
96
  },
71
97
  };
72
98
  pi.registerTool(dynamicBash as any);
73
99
 
74
- const baseWrite = createWriteTool(process.cwd());
100
+ const baseWrite = createWriteTool(fallbackRoot);
75
101
  pi.registerTool({
76
102
  ...baseWrite,
77
103
  execute: async (
@@ -81,12 +107,12 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
81
107
  onUpdate?: unknown,
82
108
  ctx?: unknown,
83
109
  ) => {
84
- const fresh = createWriteTool(process.cwd());
110
+ const fresh = createWriteTool(resolveCtxCwd(ctx));
85
111
  return (fresh as any).execute(toolCallId, params, signal, onUpdate, ctx);
86
112
  },
87
113
  } as any);
88
114
 
89
- const baseRead = createReadTool(process.cwd());
115
+ const baseRead = createReadTool(fallbackRoot);
90
116
  pi.registerTool({
91
117
  ...baseRead,
92
118
  execute: async (
@@ -96,12 +122,12 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
96
122
  onUpdate?: unknown,
97
123
  ctx?: unknown,
98
124
  ) => {
99
- const fresh = createReadTool(process.cwd());
125
+ const fresh = createReadTool(resolveCtxCwd(ctx));
100
126
  return (fresh as any).execute(toolCallId, params, signal, onUpdate, ctx);
101
127
  },
102
128
  } as any);
103
129
 
104
- const baseEdit = createEditTool(process.cwd());
130
+ const baseEdit = createEditTool(fallbackRoot);
105
131
  pi.registerTool({
106
132
  ...baseEdit,
107
133
  execute: async (
@@ -111,7 +137,7 @@ export function registerDynamicTools(pi: ExtensionAPI): void {
111
137
  onUpdate?: unknown,
112
138
  ctx?: unknown,
113
139
  ) => {
114
- const fresh = createEditTool(process.cwd());
140
+ const fresh = createEditTool(resolveCtxCwd(ctx));
115
141
  return (fresh as any).execute(toolCallId, params, signal, onUpdate, ctx);
116
142
  },
117
143
  } as any);
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers Context Mode execution tools.
1
3
  // GSD2 — Exec (context-mode) tool registration.
2
4
  //
3
5
  // Exposes the Context Mode runtime tools in-process. Default-on; opt out with
@@ -6,23 +8,39 @@
6
8
  import { Type } from "@sinclair/typebox";
7
9
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
8
10
 
11
+ import { resolveCtxCwd } from "./dynamic-tools.js";
12
+
13
+
14
+ async function loadContextModePreferences(baseDir: string) {
15
+ const [{ loadEffectiveGSDPreferences }, { logWarning }] = await Promise.all([
16
+ import("../preferences.js"),
17
+ import("../workflow-logger.js"),
18
+ ]);
19
+ try {
20
+ return loadEffectiveGSDPreferences(baseDir)?.preferences ?? null;
21
+ } catch (err) {
22
+ logWarning("tool", `Context Mode tool could not load preferences: ${err instanceof Error ? err.message : String(err)}`);
23
+ return null;
24
+ }
25
+ }
26
+
9
27
  export function registerExecTools(pi: ExtensionAPI): void {
10
28
  pi.registerTool({
11
29
  name: "gsd_exec",
12
30
  label: "Exec (Sandboxed)",
13
31
  description:
14
- "Run a short script (bash/node/python) in a subprocess. Full stdout/stderr persist to " +
32
+ "Run a short script (bash/node/python) in a subprocess. Capped stdout/stderr and metadata persist to " +
15
33
  ".gsd/exec/<id>.{stdout,stderr,meta.json}; only a short digest returns in context. Use " +
16
34
  "this instead of reading many files or emitting large tool outputs — e.g. have the script " +
17
35
  "count/grep/summarize and log the finding. Enabled by default; opt out via " +
18
36
  "preferences.context_mode.enabled=false.",
19
37
  promptSnippet:
20
- "Run a bash/node/python script in a sandbox; full output is saved to disk and only a digest returns",
38
+ "Run a bash/node/python script in a sandbox; capped output is saved to disk and only a digest returns",
21
39
  promptGuidelines: [
22
40
  "Prefer gsd_exec for analyses that would otherwise read >3 files or produce large tool output.",
23
41
  "Write scripts that log the finding (counts, matches, summaries) rather than raw dumps.",
24
42
  "The digest is the last ~300 chars of stdout — size your log output accordingly.",
25
- "Need the full output? Read the stdout_path returned in details (file on local disk).",
43
+ "Need persisted output? Read the stdout_path returned in details (file on local disk).",
26
44
  ],
27
45
  parameters: Type.Object({
28
46
  runtime: Type.Union(
@@ -40,20 +58,11 @@ export function registerExecTools(pi: ExtensionAPI): void {
40
58
  ),
41
59
  }),
42
60
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
43
- const [{ executeGsdExec }, { loadEffectiveGSDPreferences }, { logWarning }] = await Promise.all([
44
- import("../tools/exec-tool.js"),
45
- import("../preferences.js"),
46
- import("../workflow-logger.js"),
47
- ]);
48
- let prefs: ReturnType<typeof loadEffectiveGSDPreferences> | null = null;
49
- try {
50
- prefs = loadEffectiveGSDPreferences();
51
- } catch (err) {
52
- logWarning("tool", `gsd_exec could not load preferences: ${err instanceof Error ? err.message : String(err)}`);
53
- }
61
+ const { executeGsdExec } = await import("../tools/exec-tool.js");
62
+ const baseDir = resolveCtxCwd(_ctx);
54
63
  return executeGsdExec(params as Parameters<typeof executeGsdExec>[0], {
55
- baseDir: process.cwd(),
56
- preferences: prefs?.preferences ?? null,
64
+ baseDir,
65
+ preferences: await loadContextModePreferences(baseDir),
57
66
  });
58
67
  },
59
68
  });
@@ -67,7 +76,7 @@ export function registerExecTools(pi: ExtensionAPI): void {
67
76
  promptSnippet: "Search prior gsd_exec runs by substring, runtime, or failing-only filter",
68
77
  promptGuidelines: [
69
78
  "Use this before re-running an expensive analysis — the prior run's stdout file may still answer.",
70
- "The preview shows the trailing ~300 chars of stdout; read stdout_path for the full transcript.",
79
+ "The preview shows the trailing ~300 chars of stdout; read stdout_path for persisted output.",
71
80
  ],
72
81
  parameters: Type.Object({
73
82
  query: Type.Optional(Type.String({ description: "Substring matched against id and purpose (case-insensitive)." })),
@@ -81,8 +90,10 @@ export function registerExecTools(pi: ExtensionAPI): void {
81
90
  }),
82
91
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
83
92
  const { executeExecSearch } = await import("../tools/exec-search-tool.js");
93
+ const baseDir = resolveCtxCwd(_ctx);
84
94
  return executeExecSearch(params as Parameters<typeof executeExecSearch>[0], {
85
- baseDir: process.cwd(),
95
+ baseDir,
96
+ preferences: await loadContextModePreferences(baseDir),
86
97
  });
87
98
  },
88
99
  });
@@ -102,8 +113,10 @@ export function registerExecTools(pi: ExtensionAPI): void {
102
113
  parameters: Type.Object({}),
103
114
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
104
115
  const { executeResume } = await import("../tools/resume-tool.js");
116
+ const baseDir = resolveCtxCwd(_ctx);
105
117
  return executeResume(params as Parameters<typeof executeResume>[0], {
106
- baseDir: process.cwd(),
118
+ baseDir,
119
+ preferences: await loadContextModePreferences(baseDir),
107
120
  });
108
121
  },
109
122
  });
@@ -1,8 +1,12 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers journal query tools.
1
3
  import { Type } from "@sinclair/typebox";
2
4
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
3
5
 
4
6
  import { queryJournal } from "../journal.js";
5
7
  import { logWarning } from "../workflow-logger.js";
8
+ import { resolveCtxCwd } from "./dynamic-tools.js";
9
+
6
10
 
7
11
  export function registerJournalTools(pi: ExtensionAPI): void {
8
12
  pi.registerTool({
@@ -36,7 +40,7 @@ export function registerJournalTools(pi: ExtensionAPI): void {
36
40
  if (params.after !== undefined) filters.after = params.after;
37
41
  if (params.before !== undefined) filters.before = params.before;
38
42
 
39
- const entries = queryJournal(process.cwd(), filters);
43
+ const entries = queryJournal(resolveCtxCwd(_ctx), filters);
40
44
  const limited = entries.slice(0, params.limit ?? 100);
41
45
 
42
46
  if (limited.length === 0) {
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers memory-layer tools.
1
3
  // GSD2 — Memory tool registration
2
4
  //
3
5
  // Exposes the memory-layer tools (capture_thought, memory_query, gsd_graph)
@@ -7,13 +9,14 @@
7
9
  import { Type } from "@sinclair/typebox";
8
10
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
9
11
 
10
- import { ensureDbOpen } from "./dynamic-tools.js";
12
+ import { ensureDbOpen, resolveCtxCwd } from "./dynamic-tools.js";
11
13
  import {
12
14
  executeGsdGraph,
13
15
  executeMemoryCapture,
14
16
  executeMemoryQuery,
15
17
  } from "../tools/memory-tools.js";
16
18
 
19
+
17
20
  export function registerMemoryTools(pi: ExtensionAPI): void {
18
21
  // ─── capture_thought ────────────────────────────────────────────────────
19
22
 
@@ -57,7 +60,7 @@ export function registerMemoryTools(pi: ExtensionAPI): void {
57
60
  ),
58
61
  }),
59
62
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
60
- const ok = await ensureDbOpen();
63
+ const ok = await ensureDbOpen(resolveCtxCwd(_ctx));
61
64
  if (!ok) {
62
65
  return {
63
66
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot capture memory." }],
@@ -108,7 +111,7 @@ export function registerMemoryTools(pi: ExtensionAPI): void {
108
111
  ),
109
112
  }),
110
113
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
111
- const ok = await ensureDbOpen();
114
+ const ok = await ensureDbOpen(resolveCtxCwd(_ctx));
112
115
  if (!ok) {
113
116
  return {
114
117
  content: [{ type: "text" as const, text: "Error: GSD database is not available. Cannot query memory." }],
@@ -149,7 +152,7 @@ export function registerMemoryTools(pi: ExtensionAPI): void {
149
152
  ], { description: "Only include edges with this relation type" })),
150
153
  }),
151
154
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
152
- const ok = await ensureDbOpen();
155
+ const ok = await ensureDbOpen(resolveCtxCwd(_ctx));
153
156
  if (!ok) {
154
157
  return {
155
158
  content: [{ type: "text" as const, text: "Error: GSD database is not available." }],
@@ -1,8 +1,11 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Registers read-only DB query tools.
1
3
  // GSD2 — Read-only query tools exposing DB state to the LLM via the WAL connection
2
4
 
3
5
  import { Type } from "@sinclair/typebox";
4
6
  import type { ExtensionAPI } from "@gsd/pi-coding-agent";
5
- import { ensureDbOpen } from "./dynamic-tools.js";
7
+ import { ensureDbOpen, resolveCtxCwd } from "./dynamic-tools.js";
8
+
6
9
 
7
10
  export function registerQueryTools(pi: ExtensionAPI): void {
8
11
  pi.registerTool({
@@ -20,7 +23,7 @@ export function registerQueryTools(pi: ExtensionAPI): void {
20
23
  milestoneId: Type.String({ description: "Milestone ID to query (e.g. M001)" }),
21
24
  }),
22
25
  async execute(_toolCallId, params, _signal, _onUpdate, _ctx) {
23
- const dbAvailable = await ensureDbOpen();
26
+ const dbAvailable = await ensureDbOpen(resolveCtxCwd(_ctx));
24
27
  if (!dbAvailable) {
25
28
  return {
26
29
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot read milestone status." }],
@@ -47,7 +50,7 @@ export function registerQueryTools(pi: ExtensionAPI): void {
47
50
  ],
48
51
  parameters: Type.Object({}),
49
52
  async execute(_toolCallId, _params, _signal, _onUpdate, _ctx) {
50
- const dbAvailable = await ensureDbOpen();
53
+ const dbAvailable = await ensureDbOpen(resolveCtxCwd(_ctx));
51
54
  if (!dbAvailable) {
52
55
  return {
53
56
  content: [{ type: "text", text: "Error: GSD database is not available. Cannot checkpoint." }],
@@ -43,7 +43,7 @@ export function handleRecoverableExtensionProcessError(err: Error): boolean {
43
43
  return false;
44
44
  }
45
45
 
46
- function installEpipeGuard(): void {
46
+ export function installEpipeGuard(): void {
47
47
  if (!process.listeners("uncaughtException").some((listener) => listener.name === "_gsdEpipeGuard")) {
48
48
  const _gsdEpipeGuard = (err: Error): void => {
49
49
  if (handleRecoverableExtensionProcessError(err)) return;