gsd-pi 2.80.0-dev.8b3a59f5c → 2.80.0-dev.b0acf17e9

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 +29 -0
  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 +26 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +103 -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 +240 -15
  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 +165 -28
  33. package/dist/resources/extensions/gsd/auto.js +165 -45
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +50 -37
  36. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +35 -10
  37. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +36 -20
  38. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +10 -1
  39. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +12 -4
  40. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +11 -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/system-context.js +82 -23
  44. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  45. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  46. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  47. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  48. package/dist/resources/extensions/gsd/commands-handlers.js +23 -9
  49. package/dist/resources/extensions/gsd/context-budget.js +37 -2
  50. package/dist/resources/extensions/gsd/crash-recovery.js +56 -10
  51. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  52. package/dist/resources/extensions/gsd/db/unit-dispatches.js +92 -0
  53. package/dist/resources/extensions/gsd/db-base-schema.js +4 -2
  54. package/dist/resources/extensions/gsd/db-migration-steps.js +6 -0
  55. package/dist/resources/extensions/gsd/detection.js +106 -0
  56. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +2 -0
  57. package/dist/resources/extensions/gsd/git-service.js +73 -5
  58. package/dist/resources/extensions/gsd/gsd-db.js +46 -13
  59. package/dist/resources/extensions/gsd/guided-flow.js +143 -48
  60. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  61. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  62. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  63. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  64. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  65. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  66. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  67. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  68. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  69. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  70. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  71. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  72. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  73. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  74. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  75. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  77. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  78. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  79. package/dist/resources/extensions/gsd/quick.js +34 -2
  80. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  81. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  82. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  83. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  84. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  85. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  86. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  87. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  88. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  89. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  90. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  91. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  92. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  93. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  94. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  95. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  96. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  97. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  98. package/dist/web/standalone/.next/BUILD_ID +1 -1
  99. package/dist/web/standalone/.next/app-path-routes-manifest.json +14 -14
  100. package/dist/web/standalone/.next/build-manifest.json +3 -3
  101. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  102. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  103. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  104. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  105. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  106. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  110. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  111. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  112. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  114. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  115. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  116. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  117. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  118. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  119. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/index.html +1 -1
  122. package/dist/web/standalone/.next/server/app/index.rsc +2 -2
  123. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  124. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +2 -2
  125. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  126. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  127. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  128. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app-paths-manifest.json +14 -14
  130. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  132. package/dist/web/standalone/.next/server/middleware.js +3 -3
  133. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  134. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  135. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  136. package/dist/web/standalone/.next/static/chunks/8359.e059d86b255fce1c.js +10 -0
  137. package/dist/web/standalone/.next/static/chunks/app/{page-fab3ebb85b006001.js → page-752f1e2ebdaa3e45.js} +1 -1
  138. package/dist/web/standalone/.next/static/chunks/{webpack-0481f1221120a7c6.js → webpack-de742b64187e13fe.js} +1 -1
  139. package/dist/welcome-screen.d.ts +2 -0
  140. package/dist/welcome-screen.js +9 -7
  141. package/package.json +6 -4
  142. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  143. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  144. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  145. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  146. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  147. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  148. package/packages/native/tsconfig.tsbuildinfo +1 -1
  149. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  150. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  151. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  152. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  153. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  154. package/packages/pi-agent-core/dist/agent.js +2 -0
  155. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  156. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  157. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  158. package/packages/pi-agent-core/dist/index.js +2 -0
  159. package/packages/pi-agent-core/dist/index.js.map +1 -1
  160. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  161. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  162. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  163. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  164. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  165. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  166. package/packages/pi-agent-core/dist/types.js.map +1 -1
  167. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  168. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  169. package/packages/pi-agent-core/src/agent.ts +8 -0
  170. package/packages/pi-agent-core/src/index.ts +2 -0
  171. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  172. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  173. package/packages/pi-agent-core/src/types.ts +14 -0
  174. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  175. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  176. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  177. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  178. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  179. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  180. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  181. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  182. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  183. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  184. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  185. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  186. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  187. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  188. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  189. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  190. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  191. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  192. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  193. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  194. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  195. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  196. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  197. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  198. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  199. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  200. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  201. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +18 -0
  202. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  203. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +12 -0
  204. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/agent-session.js +44 -7
  206. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +35 -1
  208. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  210. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  211. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  212. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  214. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  215. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  216. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  217. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  218. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  219. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  220. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  221. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  222. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  223. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  224. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  225. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  227. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  229. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  231. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  233. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -3
  235. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  238. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  240. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  241. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  242. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  243. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  244. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  245. package/packages/pi-coding-agent/dist/core/sdk.js +74 -2
  246. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  248. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  250. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  252. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  254. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  256. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  258. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  260. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  262. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  264. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  266. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  268. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  270. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  272. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  274. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  276. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  278. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  280. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  282. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  284. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  286. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  288. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  290. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  292. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  294. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  295. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  296. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  297. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  298. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  299. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  300. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  301. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  302. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  304. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  306. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  307. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +114 -22
  308. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  309. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  310. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  313. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  314. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  315. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  316. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +7 -6
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +6 -0
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +177 -19
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  323. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +33 -6
  324. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  326. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +3 -0
  329. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  331. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  332. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  333. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  334. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  335. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  336. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  337. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  338. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  339. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  340. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  341. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  342. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  343. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +25 -0
  344. package/packages/pi-coding-agent/src/core/agent-session.ts +48 -7
  345. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +41 -1
  346. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  347. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  348. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  349. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  350. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  351. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  352. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  353. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -2
  354. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  355. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  356. package/packages/pi-coding-agent/src/core/sdk.ts +85 -3
  357. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  358. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  359. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  360. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  361. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  362. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  363. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  364. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  365. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  366. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  367. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  368. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  369. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  370. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  371. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  372. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  373. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  374. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +144 -22
  375. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  376. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  377. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  378. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +10 -9
  379. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +208 -19
  380. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  381. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +41 -8
  382. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +3 -0
  383. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  384. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  385. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  386. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  387. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  388. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  389. package/packages/pi-tui/dist/tui.js +18 -8
  390. package/packages/pi-tui/dist/tui.js.map +1 -1
  391. package/packages/pi-tui/src/tui.ts +20 -8
  392. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  393. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  394. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  395. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  396. package/src/resources/GSD-WORKFLOW.md +2 -2
  397. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  398. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +30 -0
  399. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +26 -0
  400. package/src/resources/extensions/github-sync/sync.ts +8 -1
  401. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  402. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  403. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  404. package/src/resources/extensions/gsd/auto/phases.ts +328 -200
  405. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  406. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  407. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  408. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  409. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  410. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  411. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  412. package/src/resources/extensions/gsd/auto-post-unit.ts +116 -88
  413. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  414. package/src/resources/extensions/gsd/auto-recovery.ts +54 -0
  415. package/src/resources/extensions/gsd/auto-start.ts +293 -21
  416. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  417. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  418. package/src/resources/extensions/gsd/auto-worktree.ts +199 -30
  419. package/src/resources/extensions/gsd/auto.ts +216 -40
  420. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  421. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +51 -37
  422. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +35 -10
  423. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +38 -19
  424. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +11 -1
  425. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +13 -4
  426. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +12 -3
  427. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  428. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +369 -54
  429. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  430. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  431. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  432. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  433. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  434. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  435. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  436. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  437. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  438. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  439. package/src/resources/extensions/gsd/db-base-schema.ts +4 -2
  440. package/src/resources/extensions/gsd/db-migration-steps.ts +8 -0
  441. package/src/resources/extensions/gsd/detection.ts +128 -0
  442. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  443. package/src/resources/extensions/gsd/git-service.ts +87 -10
  444. package/src/resources/extensions/gsd/gsd-db.ts +50 -13
  445. package/src/resources/extensions/gsd/guided-flow.ts +169 -55
  446. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  447. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  448. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  449. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  450. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  451. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  452. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  453. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  454. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  455. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  456. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  457. package/src/resources/extensions/gsd/prompts/complete-milestone.md +21 -19
  458. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  459. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  460. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  461. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  462. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  463. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  464. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  465. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  466. package/src/resources/extensions/gsd/quick.ts +37 -2
  467. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  468. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  469. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  470. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  471. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  472. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  473. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  474. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  475. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  476. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  477. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  478. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  479. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  480. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  481. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +14 -1
  482. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  483. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  484. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  485. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  486. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  487. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  488. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  489. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  490. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  491. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  492. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  493. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  494. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  495. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  496. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  497. package/src/resources/extensions/gsd/tests/cmux.test.ts +42 -53
  498. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  499. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  500. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  501. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  502. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  503. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  504. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  505. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  506. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  507. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  508. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  509. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  510. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  511. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  512. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  513. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  514. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  515. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  516. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  517. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  518. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  519. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  520. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  521. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  522. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  523. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  524. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  525. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  526. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  527. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  528. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  529. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  530. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  531. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +35 -0
  532. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  533. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  534. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  535. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  536. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  537. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  538. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  539. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  540. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  541. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  542. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  543. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  544. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  545. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  546. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  547. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  548. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  549. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  550. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  551. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  552. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  553. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  554. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  555. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  556. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  557. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  558. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  559. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  560. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  561. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  562. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  563. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  564. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  565. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  566. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  567. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  568. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  569. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  570. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  571. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  572. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  573. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  574. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  575. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  576. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  577. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  578. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  579. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  580. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  581. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  582. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  583. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  584. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  585. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  586. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  587. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  588. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  589. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  590. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  591. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  592. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  593. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  594. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  595. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  596. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  597. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  598. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  599. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  600. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  601. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  602. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  603. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  604. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  605. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  606. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  607. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  608. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  609. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +36 -45
  610. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  611. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  612. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  613. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  614. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  615. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  616. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  617. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  618. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  619. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  620. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  621. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  622. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  623. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  624. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  625. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  626. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  627. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  628. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  629. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  630. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  631. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  632. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  633. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  634. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  635. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  636. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  637. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  638. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  639. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  640. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  641. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  642. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  643. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  644. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  645. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  646. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  647. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  648. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  649. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  650. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  651. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  652. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  653. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  654. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  655. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  656. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  657. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  658. /package/dist/web/standalone/.next/static/{k-MDjzPMF62Rg1-FR437h → naNyn5ToUBzCQtuLbEYXC}/_buildManifest.js +0 -0
  659. /package/dist/web/standalone/.next/static/{k-MDjzPMF62Rg1-FR437h → naNyn5ToUBzCQtuLbEYXC}/_ssgManifest.js +0 -0
@@ -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
+ });
@@ -1,21 +1,12 @@
1
1
  /**
2
- * dashboard-custom-engine.test.ts — Tests that the custom engine path
3
- * calls updateProgressWidget and that unitLabel handles "custom-step".
4
- *
5
- * Uses source-level assertions for the non-exported unitLabel function
6
- * and the updateProgressWidget call placement. Tests exported helpers
7
- * (unitVerb, unitPhaseLabel) directly.
2
+ * dashboard-custom-engine.test.ts — custom-step dashboard labels.
8
3
  */
9
4
 
10
5
  import { describe, it } from "node:test";
11
6
  import assert from "node:assert/strict";
12
- import { readFileSync } from "node:fs";
13
- import { resolve } from "node:path";
14
- import { fileURLToPath } from "node:url";
15
7
 
16
8
  import { unitVerb, unitPhaseLabel } from "../auto-dashboard.js";
17
-
18
- // ─── Tests ───────────────────────────────────────────────────────────────
9
+ import { unitLabel } from "../dashboard-overlay.ts";
19
10
 
20
11
  describe("Dashboard custom-engine: unitLabel and related helpers", () => {
21
12
  it('unitVerb("custom-step") returns "executing workflow step"', () => {
@@ -26,62 +17,7 @@ describe("Dashboard custom-engine: unitLabel and related helpers", () => {
26
17
  assert.equal(unitPhaseLabel("custom-step"), "WORKFLOW");
27
18
  });
28
19
 
29
- it('dashboard-overlay.ts contains a case for "custom-step" returning "Workflow Step"', () => {
30
- const __filename = fileURLToPath(import.meta.url);
31
- const overlayPath = resolve(__filename, "../../dashboard-overlay.ts");
32
- const source = readFileSync(overlayPath, "utf-8");
33
- assert.ok(
34
- source.includes('"custom-step"') && source.includes('"Workflow Step"'),
35
- 'dashboard-overlay.ts should contain case "custom-step": return "Workflow Step"',
36
- );
37
- });
38
- });
39
-
40
- describe("Dashboard custom-engine: updateProgressWidget in custom engine path", () => {
41
- it("loop.ts custom engine path includes updateProgressWidget call before runGuards", () => {
42
- const __filename = fileURLToPath(import.meta.url);
43
- const loopPath = resolve(__filename, "../../auto/loop.ts");
44
- const source = readFileSync(loopPath, "utf-8");
45
-
46
- // Find the custom engine block
47
- const customEngineStart = source.indexOf("shouldUseCustomEnginePath({");
48
- assert.ok(customEngineStart > -1, "Should find custom engine path in loop.ts");
49
-
50
- // The updateProgressWidget call should appear after the custom engine block start
51
- // and before the runGuards call in that block
52
- const afterCustomEngine = source.slice(customEngineStart);
53
- const widgetCallIndex = afterCustomEngine.indexOf(
54
- "deps.updateProgressWidget(ctx, iterData.unitType, iterData.unitId, iterData.state)",
55
- );
56
- const guardsCallIndex = afterCustomEngine.indexOf("runGuards(ic,");
57
- assert.ok(widgetCallIndex > -1, "updateProgressWidget should be called in custom engine path");
58
- assert.ok(
59
- widgetCallIndex < guardsCallIndex,
60
- "updateProgressWidget should be called before runGuards in custom engine path",
61
- );
62
- });
63
-
64
- it("updateProgressWidget call is placed after iterData is built", () => {
65
- const __filename = fileURLToPath(import.meta.url);
66
- const loopPath = resolve(__filename, "../../auto/loop.ts");
67
- const source = readFileSync(loopPath, "utf-8");
68
-
69
- const customEngineStart = source.indexOf("shouldUseCustomEnginePath({");
70
- const afterCustomEngine = source.slice(customEngineStart);
71
-
72
- // Verify custom engine path has iterData built before the widget call
73
- const iterDataIndex = afterCustomEngine.indexOf("buildCustomEngineIterationData({");
74
- const widgetIndex = afterCustomEngine.indexOf("deps.updateProgressWidget");
75
- assert.ok(iterDataIndex > -1 && widgetIndex > -1, "Both iterData and widget call should exist");
76
- assert.ok(
77
- iterDataIndex < widgetIndex,
78
- "iterData should be built before updateProgressWidget is called",
79
- );
80
-
81
- // Verify the call uses iterData.state (which holds the derived GSD state)
82
- assert.ok(
83
- afterCustomEngine.includes("iterData.state"),
84
- "Custom engine updateProgressWidget should reference iterData.state",
85
- );
20
+ it('unitLabel("custom-step") returns "Workflow Step"', () => {
21
+ assert.equal(unitLabel("custom-step"), "Workflow Step");
86
22
  });
87
23
  });