gsd-pi 2.80.0-dev.4ea7d80e7 → 2.80.0-dev.4edec4620

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 (659) 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-dashboard.js +18 -0
  25. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  26. package/dist/resources/extensions/gsd/auto-dispatch.js +16 -0
  27. package/dist/resources/extensions/gsd/auto-post-unit.js +104 -86
  28. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  29. package/dist/resources/extensions/gsd/auto-recovery.js +43 -1
  30. package/dist/resources/extensions/gsd/auto-start.js +238 -12
  31. package/dist/resources/extensions/gsd/auto-supervisor.js +8 -1
  32. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +2 -2
  33. package/dist/resources/extensions/gsd/auto-worktree.js +209 -81
  34. package/dist/resources/extensions/gsd/auto.js +159 -44
  35. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
  36. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  37. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  38. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  39. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  40. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  41. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  42. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  43. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +330 -54
  44. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  45. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  46. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
  47. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  48. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  49. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  50. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  51. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  52. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  53. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  54. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  55. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  56. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  57. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  58. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  59. package/dist/resources/extensions/gsd/detection.js +106 -0
  60. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  61. package/dist/resources/extensions/gsd/git-service.js +73 -5
  62. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  63. package/dist/resources/extensions/gsd/guided-flow.js +147 -46
  64. package/dist/resources/extensions/gsd/health-widget.js +3 -0
  65. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  66. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  67. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  68. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  69. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  70. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  71. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  72. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  73. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  74. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  75. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  76. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  77. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  78. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  79. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  80. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  81. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  82. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  83. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  84. package/dist/resources/extensions/gsd/quick.js +34 -2
  85. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  86. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  87. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  88. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  89. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  90. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  91. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  92. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  93. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  94. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  95. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  96. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  97. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  98. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  99. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  100. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  101. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  102. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  103. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  104. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  105. package/dist/web/standalone/.next/BUILD_ID +1 -1
  106. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  107. package/dist/web/standalone/.next/build-manifest.json +3 -3
  108. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  109. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  110. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  112. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  113. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  114. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  121. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/index.html +1 -1
  129. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  130. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  131. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  132. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  136. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  137. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/middleware.js +3 -3
  140. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  141. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  142. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  143. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  144. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  145. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.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-dashboard.ts +20 -0
  400. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  401. package/src/resources/extensions/gsd/auto-dispatch.ts +16 -0
  402. package/src/resources/extensions/gsd/auto-post-unit.ts +117 -88
  403. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  404. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  405. package/src/resources/extensions/gsd/auto-start.ts +286 -15
  406. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  407. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  408. package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
  409. package/src/resources/extensions/gsd/auto.ts +208 -39
  410. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  411. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  412. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  413. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  414. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  415. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  416. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  417. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  418. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +379 -54
  419. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  420. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  421. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  422. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  423. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  424. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  425. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  426. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  427. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  428. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  429. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  430. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  431. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  432. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  433. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  434. package/src/resources/extensions/gsd/detection.ts +128 -0
  435. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  436. package/src/resources/extensions/gsd/git-service.ts +87 -10
  437. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  438. package/src/resources/extensions/gsd/guided-flow.ts +173 -53
  439. package/src/resources/extensions/gsd/health-widget.ts +3 -0
  440. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  441. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  442. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  443. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  444. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  445. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  446. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  447. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  448. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  449. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  450. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  451. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  452. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  453. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  454. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  455. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  456. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  457. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  458. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  459. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  460. package/src/resources/extensions/gsd/quick.ts +37 -2
  461. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  462. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  463. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  464. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  465. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  466. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  467. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  468. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  469. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  470. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  471. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  472. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  473. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  474. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  475. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  476. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  477. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  478. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  479. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  480. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  481. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  482. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  483. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  484. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  485. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  486. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  487. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  488. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  489. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  490. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  491. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  492. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  493. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  494. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  495. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  496. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  497. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  498. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  499. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  500. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  501. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  502. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  503. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  504. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  505. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  506. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  507. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  508. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  509. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  510. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  511. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  512. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  513. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  514. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  515. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  516. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  517. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  518. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  519. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  520. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  521. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  522. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  523. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  524. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  525. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  526. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  527. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  528. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  529. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  530. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  531. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  532. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  533. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  534. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  535. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  536. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  537. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  538. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  539. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  540. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  541. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  542. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  543. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  544. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  545. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  546. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  547. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  548. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  549. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  550. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  551. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  552. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  553. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  554. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  555. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  556. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  557. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  558. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  559. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  560. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  561. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  562. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  563. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  564. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  565. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  566. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  567. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  568. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  569. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  570. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  571. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  572. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  573. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  574. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  575. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  576. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  577. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  578. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  579. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  580. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  581. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  582. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  583. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  584. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  585. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  586. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  587. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  588. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  589. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  590. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  591. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  592. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  593. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  594. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  595. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  596. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  597. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  598. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  599. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  600. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  601. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  602. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +55 -0
  603. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  604. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  605. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  606. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  607. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  608. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  609. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  610. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  611. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  612. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  613. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  614. package/src/resources/extensions/gsd/tests/tui-header-lifecycle.test.ts +210 -0
  615. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  616. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  617. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  618. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  619. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  620. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  621. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  622. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  623. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  624. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  625. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  626. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  627. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  628. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  629. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  630. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  631. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  632. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  633. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  634. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  635. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  636. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  637. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  638. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  639. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  640. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  641. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  642. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  643. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  644. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  645. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  646. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  647. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  648. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  649. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  650. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  651. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  652. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  653. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  654. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  655. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  656. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  657. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  658. /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → eeMbUJZnoHp7l3SZHeXY9}/_buildManifest.js +0 -0
  659. /package/dist/web/standalone/.next/static/{vIAZSyxIuvqNkCvXt9oqb → eeMbUJZnoHp7l3SZHeXY9}/_ssgManifest.js +0 -0
@@ -9,46 +9,42 @@
9
9
 
10
10
  import { describe, test } from 'node:test';
11
11
  import assert from 'node:assert/strict';
12
- import { readFileSync } from 'node:fs';
13
- import { fileURLToPath } from 'node:url';
14
- import { dirname, join } from 'node:path';
15
-
16
- const __filename = fileURLToPath(import.meta.url);
17
- const __dirname = dirname(__filename);
18
-
19
- const completeTaskSrc = readFileSync(
20
- join(__dirname, '..', 'tools', 'complete-task.ts'),
21
- 'utf-8',
22
- );
23
- const roadmapSlicesSrc = readFileSync(
24
- join(__dirname, '..', 'roadmap-slices.ts'),
25
- 'utf-8',
26
- );
12
+ import { normalizeListParam } from "../tools/complete-task.ts";
13
+ import { parseRoadmapSlices } from "../roadmap-slices.ts";
27
14
 
28
15
  describe('complete-task normalizeListParam (#3692)', () => {
29
- test('normalizeListParam function is defined', () => {
30
- assert.match(completeTaskSrc, /function normalizeListParam\(/,
31
- 'normalizeListParam function should be defined in complete-task.ts');
16
+ test('normalizes newline-delimited key file strings', () => {
17
+ assert.deepEqual(
18
+ normalizeListParam("- src/app.ts\n* tests/app.test.ts\n docs/notes.md"),
19
+ ["src/app.ts", "tests/app.test.ts", "docs/notes.md"],
20
+ );
32
21
  });
33
22
 
34
- test('normalizeListParam is applied to keyFiles', () => {
35
- assert.match(completeTaskSrc, /normalizeListParam\(params\.keyFiles\)/,
36
- 'normalizeListParam should be applied to keyFiles');
37
- });
38
-
39
- test('normalizeListParam is applied to keyDecisions', () => {
40
- assert.match(completeTaskSrc, /normalizeListParam\(params\.keyDecisions\)/,
41
- 'normalizeListParam should be applied to keyDecisions');
23
+ test('normalizes arrays and empty values', () => {
24
+ assert.deepEqual(normalizeListParam(["api", 42]), ["api", "42"]);
25
+ assert.deepEqual(normalizeListParam(" "), []);
26
+ assert.deepEqual(normalizeListParam(undefined), []);
42
27
  });
43
28
  });
44
29
 
45
30
  describe('roadmap-slices depColumnIndex detection (#3692)', () => {
46
- test('depColumnIndex is detected from header row', () => {
47
- assert.match(roadmapSlicesSrc, /depColumnIndex/,
48
- 'depColumnIndex variable should exist in roadmap-slices.ts');
49
- assert.match(roadmapSlicesSrc, /headerCells/,
50
- 'headerCells should be parsed from the header row');
51
- assert.match(roadmapSlicesSrc, /depends|deps|depend/i,
52
- 'header detection should match depends/deps/depend');
31
+ test('parses dependencies from the dependency table column only', () => {
32
+ const slices = parseRoadmapSlices([
33
+ "## Slices",
34
+ "| ID | Title | Risk | Depends | Status |",
35
+ "| -- | ----- | ---- | ------- | ------ |",
36
+ "| S01 | Foundation | low | none | Done |",
37
+ "| S02 | Title mentions S01 but no dependency | medium | none | Pending |",
38
+ "| S03 | Integration | high | S01, S02 | Pending |",
39
+ ].join("\n"));
40
+
41
+ assert.deepEqual(
42
+ slices.map((slice) => ({ id: slice.id, depends: slice.depends })),
43
+ [
44
+ { id: "S01", depends: [] },
45
+ { id: "S02", depends: [] },
46
+ { id: "S03", depends: ["S01", "S02"] },
47
+ ],
48
+ );
53
49
  });
54
50
  });
@@ -1,124 +1,61 @@
1
1
  /**
2
2
  * completed-units-metrics-sync.test.ts — Regression tests for #2313.
3
- *
4
- * 1. completed-units.json should be archived (not wiped) on milestone transition
5
- * 2. metrics.json should be in the worktree → project root sync file list
6
3
  */
7
4
 
8
5
  import test from "node:test";
9
6
  import assert from "node:assert/strict";
10
- import { readFileSync, mkdtempSync, mkdirSync, writeFileSync, existsSync, cpSync } from "node:fs";
7
+ import { readFileSync, mkdtempSync, mkdirSync, writeFileSync, existsSync, cpSync, rmSync } from "node:fs";
11
8
  import { join } from "node:path";
12
9
  import { tmpdir } from "node:os";
13
-
14
- // ─── Bug 1: completed-units.json should be archived, not wiped ─────────────
15
-
16
- const phasesSrcPath = join(import.meta.dirname, "..", "auto", "phases.ts");
17
- const phasesSrc = readFileSync(phasesSrcPath, "utf-8");
18
-
19
- test("#2313: completed-units.json should not be blindly wiped to [] on milestone transition", () => {
20
- // The milestone transition block should NOT write an empty array to completed-units.json
21
- // without first archiving the existing data. Look for the archive/rename pattern.
22
- const transitionIdx = phasesSrc.indexOf("Milestone transition");
23
- assert.ok(transitionIdx !== -1, "Milestone transition section exists");
24
-
25
- // Find the completed-units handling block
26
- const completedUnitsIdx = phasesSrc.indexOf("completed-units", transitionIdx);
27
- assert.ok(completedUnitsIdx !== -1, "completed-units handling exists in transition");
28
-
29
- // Get a window around the completed-units handling (1200 chars to
30
- // accommodate CRLF line endings on Windows which inflate byte offsets).
31
- const windowStart = Math.max(0, completedUnitsIdx - 300);
32
- const windowEnd = Math.min(phasesSrc.length, completedUnitsIdx + 900);
33
- const window = phasesSrc.slice(windowStart, windowEnd).toLowerCase();
34
-
35
- // Should archive/rename the old file before resetting
36
- const hasArchive = window.includes("archive") ||
37
- window.includes("rename") ||
38
- window.includes("cpsync") ||
39
- window.includes("safecopy") ||
40
- window.includes("completed-units-");
41
-
42
- assert.ok(
43
- hasArchive,
44
- "completed-units.json should be archived before reset during milestone transition",
45
- );
46
- });
47
-
48
- // ─── Bug 2: metrics.json should be in the sync file lists ──────────────────
49
-
50
- test("#2313: syncStateToProjectRoot should sync metrics.json", () => {
51
- const syncSrcPath = join(import.meta.dirname, "..", "auto-worktree.ts");
52
- const syncSrc = readFileSync(syncSrcPath, "utf-8");
53
-
54
- // syncStateToProjectRoot should copy metrics.json from worktree to project root
55
- assert.ok(
56
- syncSrc.includes("metrics.json"),
57
- "auto-worktree.ts should reference metrics.json for sync",
58
- );
59
- });
60
-
61
- test("syncStateToProjectRoot should back-sync completed-units.json", () => {
62
- const syncSrcPath = join(import.meta.dirname, "..", "auto-worktree.ts");
63
- const syncSrc = readFileSync(syncSrcPath, "utf-8");
64
- const fnIdx = syncSrc.indexOf("export function syncStateToProjectRoot(");
65
- assert.ok(fnIdx !== -1, "syncStateToProjectRoot exists");
66
- const fnBlock = syncSrc.slice(fnIdx, syncSrc.indexOf("// ─── Resource Staleness", fnIdx));
67
-
68
- assert.ok(
69
- fnBlock.includes('"completed-units.json"'),
70
- "syncStateToProjectRoot should copy completed-units.json back to the project root",
71
- );
72
- });
73
-
74
- test("#2313: syncWorktreeStateBack should include metrics.json in ROOT_DIAGNOSTIC_FILES", () => {
75
- const autoWorktreeSrcPath = join(import.meta.dirname, "..", "auto-worktree.ts");
76
- const autoWorktreeSrc = readFileSync(autoWorktreeSrcPath, "utf-8");
77
-
78
- // Find the ROOT_DIAGNOSTIC_FILES constant used for worktree copy-back.
79
- const constIdx = autoWorktreeSrc.indexOf("ROOT_DIAGNOSTIC_FILES");
80
- assert.ok(constIdx !== -1, "ROOT_DIAGNOSTIC_FILES constant exists");
81
-
82
- // Get the array content
83
- const arrayStart = autoWorktreeSrc.indexOf("[", constIdx);
84
- const arrayEnd = autoWorktreeSrc.indexOf("]", arrayStart);
85
- const rootFilesBlock = autoWorktreeSrc.slice(arrayStart, arrayEnd);
86
-
87
- assert.ok(
88
- rootFilesBlock.includes("metrics.json"),
89
- "metrics.json should be in ROOT_DIAGNOSTIC_FILES list",
90
- );
10
+ import { syncStateToProjectRoot } from "../auto-worktree.ts";
11
+
12
+ test("#2313: syncStateToProjectRoot copies metrics and completed-units to the project root", () => {
13
+ const root = mkdtempSync(join(tmpdir(), "gsd-sync-metrics-"));
14
+ const projectRoot = join(root, "project");
15
+ const worktree = join(root, "worktree");
16
+ mkdirSync(join(projectRoot, ".gsd"), { recursive: true });
17
+ mkdirSync(join(worktree, ".gsd"), { recursive: true });
18
+ writeFileSync(join(worktree, ".gsd", "metrics.json"), JSON.stringify({ tokens: 42 }));
19
+ writeFileSync(join(worktree, ".gsd", "completed-units.json"), JSON.stringify([{ id: "T01" }]));
20
+
21
+ try {
22
+ syncStateToProjectRoot(worktree, projectRoot, "M001");
23
+
24
+ assert.deepEqual(
25
+ JSON.parse(readFileSync(join(projectRoot, ".gsd", "metrics.json"), "utf-8")),
26
+ { tokens: 42 },
27
+ );
28
+ assert.deepEqual(
29
+ JSON.parse(readFileSync(join(projectRoot, ".gsd", "completed-units.json"), "utf-8")),
30
+ [{ id: "T01" }],
31
+ );
32
+ } finally {
33
+ rmSync(root, { recursive: true, force: true });
34
+ }
91
35
  });
92
36
 
93
- // ─── Functional test: completed-units archive ────────────────────────────────
94
-
95
37
  test("#2313: functional — completed-units archive creates milestone-specific file", () => {
96
38
  const tmpBase = mkdtempSync(join(tmpdir(), "gsd-completed-units-"));
97
39
  const gsdDir = join(tmpBase, ".gsd");
98
40
  mkdirSync(gsdDir, { recursive: true });
99
41
 
100
- // Simulate existing completed-units.json with data
101
- const existing = [
102
- { type: "task", id: "T01" },
103
- { type: "slice", id: "S01" },
104
- ];
105
- const completedKeysPath = join(gsdDir, "completed-units.json");
106
- writeFileSync(completedKeysPath, JSON.stringify(existing, null, 2));
107
-
108
- // Simulate the archive behavior: copy to milestone-specific file
109
- const milestoneId = "M001";
110
- const archivePath = join(gsdDir, `completed-units-${milestoneId}.json`);
111
- cpSync(completedKeysPath, archivePath);
112
-
113
- // Reset the main file
114
- writeFileSync(completedKeysPath, JSON.stringify([], null, 2));
115
-
116
- // Verify archive exists with original data
117
- assert.ok(existsSync(archivePath), "archive file should exist");
118
- const archived = JSON.parse(readFileSync(archivePath, "utf-8"));
119
- assert.deepEqual(archived, existing, "archived data should match original");
120
-
121
- // Verify main file is reset
122
- const current = JSON.parse(readFileSync(completedKeysPath, "utf-8"));
123
- assert.deepEqual(current, [], "current completed-units should be empty after transition");
42
+ try {
43
+ const existing = [
44
+ { type: "task", id: "T01" },
45
+ { type: "slice", id: "S01" },
46
+ ];
47
+ const completedKeysPath = join(gsdDir, "completed-units.json");
48
+ writeFileSync(completedKeysPath, JSON.stringify(existing, null, 2));
49
+
50
+ const milestoneId = "M001";
51
+ const archivePath = join(gsdDir, `completed-units-${milestoneId}.json`);
52
+ cpSync(completedKeysPath, archivePath);
53
+ writeFileSync(completedKeysPath, JSON.stringify([], null, 2));
54
+
55
+ assert.ok(existsSync(archivePath), "archive file should exist");
56
+ assert.deepEqual(JSON.parse(readFileSync(archivePath, "utf-8")), existing);
57
+ assert.deepEqual(JSON.parse(readFileSync(completedKeysPath, "utf-8")), []);
58
+ } finally {
59
+ rmSync(tmpBase, { recursive: true, force: true });
60
+ }
124
61
  });
@@ -4,7 +4,7 @@
4
4
  * No I/O, no extension context, no global state.
5
5
  */
6
6
 
7
- import { describe, it } from "node:test";
7
+ import { describe, it, beforeEach } from "node:test";
8
8
  import assert from "node:assert/strict";
9
9
 
10
10
  import {
@@ -16,8 +16,17 @@ import {
16
16
  computeBudgets,
17
17
  truncateAtSectionBoundary,
18
18
  resolveExecutorContextWindow,
19
+ _resetEmpiricalCacheForTest,
19
20
  } from "../context-budget.js";
20
21
 
22
+ // Reset the per-provider empirical chars-per-token cache before each test.
23
+ // The hardcoded char-ratio assertions below assume the static fallback path
24
+ // (3.5 / 4.0 chars/token) is used. Without this guard, a prior test that
25
+ // warms tiktoken would populate the cache and silently break these tests.
26
+ beforeEach(() => {
27
+ _resetEmpiricalCacheForTest();
28
+ });
29
+
21
30
  import type { TokenProvider } from "../token-counter.js";
22
31
 
23
32
  // ─── Test helpers ─────────────────────────────────────────────────────────────
@@ -1,3 +1,5 @@
1
+ // GSD-2 + context-store.test.ts — Regression coverage for DB-backed context query helpers.
2
+
1
3
  import { describe, test, afterEach } from "node:test";
2
4
  import assert from "node:assert/strict";
3
5
  import {
@@ -362,7 +364,11 @@ describe("context-store: sub-5ms query timing", () => {
362
364
 
363
365
  assert.strictEqual(decisions.length, 50, `got ${decisions.length} decisions (expected 50)`);
364
366
  assert.strictEqual(requirements.length, 50, `got ${requirements.length} requirements (expected 50)`);
365
- assert.ok(elapsed < 5, `query latency ${elapsed.toFixed(2)}ms should be < 5ms`);
367
+ const maxLatencyMs = process.env.NODE_V8_COVERAGE ? 15 : 5;
368
+ assert.ok(
369
+ elapsed < maxLatencyMs,
370
+ `query latency ${elapsed.toFixed(2)}ms should be < ${maxLatencyMs}ms`,
371
+ );
366
372
  });
367
373
  });
368
374
 
@@ -13,11 +13,8 @@ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync } from 'node:f
13
13
  import { join } from 'node:path';
14
14
  import { tmpdir } from 'node:os';
15
15
  import { randomUUID } from 'node:crypto';
16
- import { fileURLToPath } from 'node:url';
17
- import { dirname } from 'node:path';
18
16
 
19
- const __filename = fileURLToPath(import.meta.url);
20
- const __dirname = dirname(__filename);
17
+ import { installEpipeGuard } from "../bootstrap/register-extension.ts";
21
18
 
22
19
  function makeTmpBase(): string {
23
20
  const base = join(tmpdir(), `gsd-test-${randomUUID()}`);
@@ -25,13 +22,6 @@ function makeTmpBase(): string {
25
22
  return base;
26
23
  }
27
24
 
28
- // ─── register-extension source assertions ────────────────────────────────────
29
-
30
- const registerExtSrc = readFileSync(
31
- join(__dirname, '..', 'bootstrap', 'register-extension.ts'),
32
- 'utf-8',
33
- );
34
-
35
25
  describe('register-extension crash handler secondary fixes (#3348)', () => {
36
26
  test('writeCrashLog is exported and writes a file to the crash directory', async () => {
37
27
  // Dynamic import so GSD_HOME can be pointed at a temp dir without polluting ~/.gsd
@@ -60,30 +50,44 @@ describe('register-extension crash handler secondary fixes (#3348)', () => {
60
50
  });
61
51
 
62
52
  test('_gsdRejectionGuard is registered for unhandledRejection', () => {
63
- assert.match(
64
- registerExtSrc,
65
- /_gsdRejectionGuard/,
66
- '_gsdRejectionGuard handler should be defined',
67
- );
68
- assert.match(
69
- registerExtSrc,
70
- /unhandledRejection/,
71
- 'installEpipeGuard should register an unhandledRejection handler',
53
+ installEpipeGuard();
54
+ const listener = process.listeners("unhandledRejection").find((candidate) =>
55
+ candidate.name === "_gsdRejectionGuard"
72
56
  );
57
+ assert.ok(listener, 'installEpipeGuard should register an unhandledRejection handler');
73
58
  });
74
59
 
75
- test('_gsdEpipeGuard calls process.exit(1) for unrecoverable errors, not log-and-continue', () => {
76
- // The original #3696 fix replaced "throw err" with a log-and-continue.
77
- // The secondary fix replaces that with writeCrashLog + process.exit(1).
78
- assert.ok(
79
- !registerExtSrc.includes('process.stderr.write(`[gsd] uncaught extension error (non-fatal)'),
80
- '_gsdEpipeGuard should NOT log errors as non-fatal and continue',
81
- );
82
- assert.match(
83
- registerExtSrc,
84
- /process\.exit\(1\)/,
85
- '_gsdEpipeGuard should call process.exit(1) for unrecoverable errors',
60
+ test('_gsdEpipeGuard writes a crash log and exits for unrecoverable errors', () => {
61
+ installEpipeGuard();
62
+ const listener = process.listeners("uncaughtException").find((candidate) =>
63
+ candidate.name === "_gsdEpipeGuard"
86
64
  );
65
+ assert.ok(listener, '_gsdEpipeGuard should be registered');
66
+
67
+ const tmpHome = join(tmpdir(), `gsd-crash-exit-test-${randomUUID()}`);
68
+ const origHome = process.env.GSD_HOME;
69
+ const originalExit = process.exit;
70
+ let exitCode: number | string | null | undefined;
71
+ (process as any).exit = (code?: number | string | null | undefined): never => {
72
+ exitCode = code;
73
+ throw new Error("process.exit intercepted");
74
+ };
75
+ process.env.GSD_HOME = tmpHome;
76
+ try {
77
+ assert.throws(
78
+ () => listener(new Error("unrecoverable crash guard test"), "uncaughtException"),
79
+ /process\.exit intercepted/,
80
+ );
81
+ assert.equal(exitCode, 1);
82
+ const crashDir = join(tmpHome, "crash");
83
+ const logs = readdirSync(crashDir).filter((f) => f.endsWith(".log"));
84
+ assert.equal(logs.length, 1);
85
+ assert.match(readFileSync(join(crashDir, logs[0]), "utf-8"), /unrecoverable crash guard test/);
86
+ } finally {
87
+ (process as any).exit = originalExit;
88
+ process.env.GSD_HOME = origHome;
89
+ rmSync(tmpHome, { recursive: true, force: true });
90
+ }
87
91
  });
88
92
 
89
93
  test('writeCrashLog never throws even when directory is unwritable', async () => {
@@ -232,4 +236,59 @@ describe('emitCrashRecoveredUnitEnd (#3348)', () => {
232
236
  rmSync(base, { recursive: true, force: true });
233
237
  }
234
238
  });
239
+
240
+ test('emitOpenUnitEndForUnit closes the latest open start with error context', async () => {
241
+ const base = makeTmpBase();
242
+ try {
243
+ const { emitJournalEvent, queryJournal } = await import('../journal.ts');
244
+ const { emitOpenUnitEndForUnit } = await import('../crash-recovery.ts');
245
+
246
+ const firstFlowId = randomUUID();
247
+ const secondFlowId = randomUUID();
248
+ emitJournalEvent(base, {
249
+ ts: new Date().toISOString(),
250
+ flowId: firstFlowId,
251
+ seq: 1,
252
+ eventType: 'unit-start',
253
+ data: { unitType: 'execute-task', unitId: 'M008/S04/T02' },
254
+ });
255
+ emitJournalEvent(base, {
256
+ ts: new Date().toISOString(),
257
+ flowId: firstFlowId,
258
+ seq: 2,
259
+ eventType: 'unit-end',
260
+ data: { unitType: 'execute-task', unitId: 'M008/S04/T02', status: 'completed' },
261
+ causedBy: { flowId: firstFlowId, seq: 1 },
262
+ });
263
+ emitJournalEvent(base, {
264
+ ts: new Date().toISOString(),
265
+ flowId: secondFlowId,
266
+ seq: 3,
267
+ eventType: 'unit-start',
268
+ data: { unitType: 'execute-task', unitId: 'M008/S04/T02' },
269
+ });
270
+
271
+ const emitted = emitOpenUnitEndForUnit(
272
+ base,
273
+ 'execute-task',
274
+ 'M008/S04/T02',
275
+ 'cancelled',
276
+ { message: 'runUnitPhase exploded', category: 'unit-exception', isTransient: false },
277
+ );
278
+
279
+ assert.equal(emitted, true, 'open unit should be closed');
280
+ const ends = queryJournal(base).filter((e) => e.eventType === 'unit-end');
281
+ assert.equal(ends.length, 2, 'should preserve existing end and add one new end');
282
+ const newEnd = ends.find((e) => e.causedBy?.flowId === secondFlowId);
283
+ assert.ok(newEnd, 'new end should close the latest open start');
284
+ assert.equal(newEnd!.data?.status, 'cancelled');
285
+ assert.deepEqual(newEnd!.data?.errorContext, {
286
+ message: 'runUnitPhase exploded',
287
+ category: 'unit-exception',
288
+ isTransient: false,
289
+ });
290
+ } finally {
291
+ rmSync(base, { recursive: true, force: true });
292
+ }
293
+ });
235
294
  });
@@ -30,6 +30,7 @@ import {
30
30
  isLockProcessAlive,
31
31
  } from "../crash-recovery.ts";
32
32
  import { normalizeRealPath } from "../paths.ts";
33
+ import { writeUnitRuntimeRecord } from "../unit-runtime.ts";
33
34
 
34
35
  function makeBase(): string {
35
36
  const base = mkdtempSync(join(tmpdir(), "gsd-crash-recovery-"));
@@ -102,6 +103,27 @@ test("readCrashLock synthesizes LockData from a stale dead worker (no dispatches
102
103
  assert.ok(lock!.startedAt, "startedAt populated from workers.started_at");
103
104
  });
104
105
 
106
+ test("readCrashLock falls back to latest in-flight runtime record when dispatch claim is missing", (t) => {
107
+ const base = makeBase();
108
+ t.after(() => cleanup(base));
109
+ openDatabase(join(base, ".gsd", "gsd.db"));
110
+ const projectRoot = normalizeRealPath(base);
111
+ const workerId = registerAutoWorker({ projectRootRealpath: projectRoot });
112
+ writeUnitRuntimeRecord(base, "execute-task", "M008/S04/T02", 1778069087937, {
113
+ phase: "dispatched",
114
+ lastProgressAt: 1778069087937,
115
+ lastProgressKind: "dispatch",
116
+ });
117
+ setWorkerPid(workerId, 99999);
118
+ expireWorker(workerId);
119
+
120
+ const lock = readCrashLock(base);
121
+ assert.ok(lock, "stale worker surfaced as a crash lock");
122
+ assert.equal(lock!.unitType, "execute-task");
123
+ assert.equal(lock!.unitId, "M008/S04/T02");
124
+ assert.equal(lock!.unitStartedAt, new Date(1778069087937).toISOString());
125
+ });
126
+
105
127
  test("readCrashLock includes the most recent dispatch as unitType/unitId", (t) => {
106
128
  const base = makeBase();
107
129
  t.after(() => cleanup(base));
@@ -192,7 +192,11 @@ function makeMockDeps(overrides?: Partial<LoopDeps>): LoopDeps & { callLog: stri
192
192
  resolveMilestoneFile: () => null,
193
193
  reconcileMergeState: () => "clean",
194
194
  preflightCleanRoot: () => ({ stashPushed: false, summary: "" }),
195
- postflightPopStash: () => {},
195
+ postflightPopStash: () => ({
196
+ restored: true,
197
+ needsManualRecovery: false,
198
+ message: "restored",
199
+ }),
196
200
  getLedger: () => null,
197
201
  getProjectTotals: () => ({ cost: 0 }),
198
202
  formatCost: (c: number) => `$${c.toFixed(2)}`,
@@ -0,0 +1,138 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Behavior tests for deleted-cwd fallback handling.
3
+ import test from "node:test";
4
+ import assert from "node:assert/strict";
5
+ import { mkdtempSync, rmSync } from "node:fs";
6
+ import { tmpdir } from "node:os";
7
+ import { join } from "node:path";
8
+
9
+ import { registerDbTools } from "../bootstrap/db-tools.ts";
10
+ import { registerDynamicTools, ensureDbOpen, safeWorkspaceCwd } from "../bootstrap/dynamic-tools.ts";
11
+ import { registerExecTools } from "../bootstrap/exec-tools.ts";
12
+ import { registerJournalTools } from "../bootstrap/journal-tools.ts";
13
+ import { registerMemoryTools } from "../bootstrap/memory-tools.ts";
14
+ import { registerQueryTools } from "../bootstrap/query-tools.ts";
15
+
16
+ async function withDeletedCwd(fn: (projectRoot: string) => Promise<void> | void): Promise<void> {
17
+ const previousCwd = process.cwd();
18
+ const previousProjectRoot = process.env.GSD_PROJECT_ROOT;
19
+ const projectRoot = mkdtempSync(join(tmpdir(), "gsd-safe-cwd-project-"));
20
+ const removedCwd = mkdtempSync(join(tmpdir(), "gsd-removed-cwd-"));
21
+
22
+ process.env.GSD_PROJECT_ROOT = projectRoot;
23
+ process.chdir(removedCwd);
24
+ rmSync(removedCwd, { recursive: true, force: true });
25
+
26
+ try {
27
+ assert.throws(() => process.cwd(), /ENOENT/);
28
+ await fn(projectRoot);
29
+ } finally {
30
+ process.chdir(previousCwd);
31
+ if (previousProjectRoot === undefined) delete process.env.GSD_PROJECT_ROOT;
32
+ else process.env.GSD_PROJECT_ROOT = previousProjectRoot;
33
+ rmSync(projectRoot, { recursive: true, force: true });
34
+ }
35
+ }
36
+
37
+ function collectTools(register: (pi: any) => void): any[] {
38
+ const tools: any[] = [];
39
+ register({
40
+ registerTool(tool: any) {
41
+ tools.push(tool);
42
+ },
43
+ });
44
+ return tools;
45
+ }
46
+
47
+ test("safeWorkspaceCwd falls back to captured project root when cwd was removed", async () => {
48
+ await withDeletedCwd((projectRoot) => {
49
+ assert.equal(safeWorkspaceCwd(), projectRoot);
50
+ });
51
+ });
52
+
53
+ test("ensureDbOpen default path does not throw when cwd was removed", async () => {
54
+ await withDeletedCwd(async () => {
55
+ assert.equal(await ensureDbOpen(), false);
56
+ });
57
+ });
58
+
59
+ test("dynamic tools register when cwd was removed", async () => {
60
+ await withDeletedCwd(() => {
61
+ const tools = collectTools(registerDynamicTools);
62
+ assert.equal(tools.length, 4);
63
+ });
64
+ });
65
+
66
+ test("db-backed tool fallbacks return normal unavailable-db errors when cwd was removed", async () => {
67
+ await withDeletedCwd(async () => {
68
+ const tools = collectTools(registerDbTools);
69
+ const decisionSave = tools.find((tool) => tool.name === "gsd_decision_save");
70
+
71
+ const result = await decisionSave.execute(
72
+ "call-1",
73
+ {
74
+ scope: "test",
75
+ decision: "Handle deleted cwd",
76
+ choice: "Use captured project root",
77
+ rationale: "The worktree cwd may disappear during cleanup.",
78
+ },
79
+ undefined,
80
+ undefined,
81
+ undefined,
82
+ );
83
+
84
+ assert.equal(result.details.error, "db_unavailable");
85
+ });
86
+ });
87
+
88
+ test("memory and query tools do not throw when cwd was removed", async () => {
89
+ await withDeletedCwd(async () => {
90
+ const memoryTools = collectTools(registerMemoryTools);
91
+ const queryTools = collectTools(registerQueryTools);
92
+
93
+ await assert.doesNotReject(() =>
94
+ memoryTools.find((tool) => tool.name === "memory_query").execute(
95
+ "call-1",
96
+ { query: "cwd fallback" },
97
+ undefined,
98
+ undefined,
99
+ undefined,
100
+ ),
101
+ );
102
+ await assert.doesNotReject(() =>
103
+ queryTools.find((tool) => tool.name === "gsd_milestone_status").execute(
104
+ "call-2",
105
+ { milestoneId: "M001" },
106
+ undefined,
107
+ undefined,
108
+ undefined,
109
+ ),
110
+ );
111
+ });
112
+ });
113
+
114
+ test("journal and exec tools do not throw when cwd was removed", async () => {
115
+ await withDeletedCwd(async () => {
116
+ const journalTools = collectTools(registerJournalTools);
117
+ const execTools = collectTools(registerExecTools);
118
+
119
+ await assert.doesNotReject(() =>
120
+ journalTools.find((tool) => tool.name === "gsd_journal_query").execute(
121
+ "call-1",
122
+ { limit: 1 },
123
+ undefined,
124
+ undefined,
125
+ undefined,
126
+ ),
127
+ );
128
+ await assert.doesNotReject(() =>
129
+ execTools.find((tool) => tool.name === "gsd_resume").execute(
130
+ "call-2",
131
+ {},
132
+ undefined,
133
+ undefined,
134
+ undefined,
135
+ ),
136
+ );
137
+ });
138
+ });