gsd-pi 2.80.0-dev.710c06e97 → 2.80.0-dev.7582bf37a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/README.md +4 -2
  2. package/dist/claude-cli-check.d.ts +30 -0
  3. package/dist/claude-cli-check.js +18 -7
  4. package/dist/cli.js +0 -19
  5. package/dist/headless-query.d.ts +10 -0
  6. package/dist/headless-query.js +6 -4
  7. package/dist/loader-entrypoint.d.ts +8 -0
  8. package/dist/loader-entrypoint.js +27 -0
  9. package/dist/loader.js +2 -11
  10. package/dist/mcp-server.d.ts +1 -0
  11. package/dist/mcp-server.js +6 -3
  12. package/dist/resources/.managed-resources-content-hash +1 -1
  13. package/dist/resources/GSD-WORKFLOW.md +2 -2
  14. package/dist/resources/extensions/claude-code-cli/readiness.js +18 -7
  15. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +40 -3
  16. package/dist/resources/extensions/github-sync/sync.js +4 -1
  17. package/dist/resources/extensions/gsd/auto/loop.js +103 -9
  18. package/dist/resources/extensions/gsd/auto/phases.js +240 -139
  19. package/dist/resources/extensions/gsd/auto/resolve.js +29 -0
  20. package/dist/resources/extensions/gsd/auto/run-unit.js +22 -30
  21. package/dist/resources/extensions/gsd/auto/session.js +8 -0
  22. package/dist/resources/extensions/gsd/auto/workflow-dispatch-claim.js +33 -1
  23. package/dist/resources/extensions/gsd/auto/workflow-worker-heartbeat.js +9 -1
  24. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +5 -32
  25. package/dist/resources/extensions/gsd/auto-dispatch.js +26 -0
  26. package/dist/resources/extensions/gsd/auto-post-unit.js +104 -86
  27. package/dist/resources/extensions/gsd/auto-prompts.js +214 -17
  28. package/dist/resources/extensions/gsd/auto-recovery.js +174 -10
  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 +209 -81
  33. package/dist/resources/extensions/gsd/auto.js +168 -45
  34. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +99 -10
  35. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +44 -37
  36. package/dist/resources/extensions/gsd/bootstrap/dynamic-tools.js +37 -10
  37. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +30 -20
  38. package/dist/resources/extensions/gsd/bootstrap/journal-tools.js +4 -1
  39. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +6 -4
  40. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +5 -3
  41. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +1 -1
  42. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +319 -54
  43. package/dist/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.js +4 -0
  44. package/dist/resources/extensions/gsd/bootstrap/system-context.js +82 -23
  45. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +19 -2
  46. package/dist/resources/extensions/gsd/clean-root-preflight.js +65 -9
  47. package/dist/resources/extensions/gsd/commands/dispatcher.js +5 -0
  48. package/dist/resources/extensions/gsd/commands/handlers/ops.js +2 -2
  49. package/dist/resources/extensions/gsd/commands-config.js +1 -1
  50. package/dist/resources/extensions/gsd/commands-eval-review.js +2 -2
  51. package/dist/resources/extensions/gsd/commands-extract-learnings.js +17 -12
  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 +18 -2
  58. package/dist/resources/extensions/gsd/db-migration-steps.js +22 -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 +146 -13
  63. package/dist/resources/extensions/gsd/guided-flow.js +143 -48
  64. package/dist/resources/extensions/gsd/init-wizard.js +4 -1
  65. package/dist/resources/extensions/gsd/memory-store.js +69 -12
  66. package/dist/resources/extensions/gsd/migrate/command.js +40 -1
  67. package/dist/resources/extensions/gsd/migration-auto-check.js +87 -0
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +32 -8
  69. package/dist/resources/extensions/gsd/orphan-stash-audit.js +101 -0
  70. package/dist/resources/extensions/gsd/parallel-orchestrator.js +13 -3
  71. package/dist/resources/extensions/gsd/planning-path-scope.js +26 -0
  72. package/dist/resources/extensions/gsd/pre-execution-checks.js +22 -0
  73. package/dist/resources/extensions/gsd/prompt-loader.js +28 -2
  74. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  75. package/dist/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  76. package/dist/resources/extensions/gsd/prompts/execute-task.md +4 -2
  77. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  78. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  79. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  80. package/dist/resources/extensions/gsd/prompts/quick-task.md +1 -5
  81. package/dist/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  82. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  83. package/dist/resources/extensions/gsd/quick.js +34 -2
  84. package/dist/resources/extensions/gsd/safety/evidence-collector.js +10 -2
  85. package/dist/resources/extensions/gsd/slice-cadence.js +45 -2
  86. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +15 -9
  87. package/dist/resources/extensions/gsd/tools/complete-milestone.js +6 -7
  88. package/dist/resources/extensions/gsd/tools/complete-task.js +1 -1
  89. package/dist/resources/extensions/gsd/tools/context-mode-tool-result.js +15 -0
  90. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +5 -0
  91. package/dist/resources/extensions/gsd/tools/exec-tool.js +3 -15
  92. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -0
  93. package/dist/resources/extensions/gsd/tools/plan-slice.js +9 -0
  94. package/dist/resources/extensions/gsd/tools/plan-task.js +9 -0
  95. package/dist/resources/extensions/gsd/tools/resume-tool.js +5 -0
  96. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +1 -1
  97. package/dist/resources/extensions/gsd/unit-context-composer.js +12 -3
  98. package/dist/resources/extensions/gsd/unit-runtime.js +22 -0
  99. package/dist/resources/extensions/gsd/workflow-protocol.js +131 -0
  100. package/dist/resources/extensions/gsd/worktree-manager.js +16 -14
  101. package/dist/resources/extensions/gsd/worktree-resolver.js +90 -22
  102. package/dist/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  103. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  104. package/dist/web/standalone/.next/BUILD_ID +1 -1
  105. package/dist/web/standalone/.next/app-path-routes-manifest.json +16 -16
  106. package/dist/web/standalone/.next/build-manifest.json +3 -3
  107. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  108. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  109. package/dist/web/standalone/.next/required-server-files.json +1 -1
  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 +16 -16
  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/web/standalone/server.js +1 -1
  147. package/dist/welcome-screen.d.ts +2 -0
  148. package/dist/welcome-screen.js +9 -7
  149. package/package.json +6 -4
  150. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  151. package/packages/mcp-server/dist/workflow-tools.js +22 -17
  152. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  153. package/packages/mcp-server/src/workflow-tools.test.ts +75 -2
  154. package/packages/mcp-server/src/workflow-tools.ts +30 -16
  155. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  156. package/packages/native/tsconfig.tsbuildinfo +1 -1
  157. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  158. package/packages/pi-agent-core/dist/agent-loop.js +4 -1
  159. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  160. package/packages/pi-agent-core/dist/agent.d.ts +5 -0
  161. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  162. package/packages/pi-agent-core/dist/agent.js +2 -0
  163. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  164. package/packages/pi-agent-core/dist/index.d.ts +1 -0
  165. package/packages/pi-agent-core/dist/index.d.ts.map +1 -1
  166. package/packages/pi-agent-core/dist/index.js +2 -0
  167. package/packages/pi-agent-core/dist/index.js.map +1 -1
  168. package/packages/pi-agent-core/dist/token-audit.d.ts +47 -0
  169. package/packages/pi-agent-core/dist/token-audit.d.ts.map +1 -0
  170. package/packages/pi-agent-core/dist/token-audit.js +221 -0
  171. package/packages/pi-agent-core/dist/token-audit.js.map +1 -0
  172. package/packages/pi-agent-core/dist/types.d.ts +9 -0
  173. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  174. package/packages/pi-agent-core/dist/types.js.map +1 -1
  175. package/packages/pi-agent-core/src/agent-loop.test.ts +128 -0
  176. package/packages/pi-agent-core/src/agent-loop.ts +4 -1
  177. package/packages/pi-agent-core/src/agent.ts +8 -0
  178. package/packages/pi-agent-core/src/index.ts +2 -0
  179. package/packages/pi-agent-core/src/token-audit.test.ts +189 -0
  180. package/packages/pi-agent-core/src/token-audit.ts +287 -0
  181. package/packages/pi-agent-core/src/types.ts +14 -0
  182. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  183. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +35 -13
  184. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  185. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +21 -11
  186. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -1
  187. package/packages/pi-ai/dist/providers/anthropic.d.ts +7 -0
  188. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  189. package/packages/pi-ai/dist/providers/anthropic.js +9 -7
  190. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  191. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +23 -14
  192. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -1
  193. package/packages/pi-ai/dist/types.d.ts +2 -0
  194. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  195. package/packages/pi-ai/dist/types.js.map +1 -1
  196. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +48 -21
  197. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  198. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +22 -21
  199. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -1
  200. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +22 -21
  201. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -1
  202. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +39 -25
  203. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -22
  204. package/packages/pi-ai/src/providers/anthropic.ts +22 -9
  205. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +34 -21
  206. package/packages/pi-ai/src/types.ts +3 -0
  207. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +56 -22
  208. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +24 -28
  209. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +24 -28
  210. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  211. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +32 -0
  212. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  213. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js +30 -1
  214. package/packages/pi-coding-agent/dist/core/agent-session-tool-refresh.test.js.map +1 -1
  215. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +17 -0
  216. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  217. package/packages/pi-coding-agent/dist/core/agent-session.js +52 -7
  218. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  219. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +78 -0
  220. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  221. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +11 -0
  222. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  223. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +9 -0
  224. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  225. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts +2 -0
  226. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.d.ts.map +1 -0
  227. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js +103 -0
  228. package/packages/pi-coding-agent/dist/core/compaction-threshold.test.js.map +1 -0
  229. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts +15 -0
  230. package/packages/pi-coding-agent/dist/core/db-snapshot.d.ts.map +1 -0
  231. package/packages/pi-coding-agent/dist/core/db-snapshot.js +66 -0
  232. package/packages/pi-coding-agent/dist/core/db-snapshot.js.map +1 -0
  233. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts +2 -0
  234. package/packages/pi-coding-agent/dist/core/db-snapshot.test.d.ts.map +1 -0
  235. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js +24 -0
  236. package/packages/pi-coding-agent/dist/core/db-snapshot.test.js.map +1 -0
  237. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  238. package/packages/pi-coding-agent/dist/core/extensions/loader.js +8 -0
  239. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  240. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +5 -0
  241. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  242. package/packages/pi-coding-agent/dist/core/extensions/runner.js +20 -7
  243. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  244. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js +102 -3
  245. package/packages/pi-coding-agent/dist/core/extensions/runner.test.js.map +1 -1
  246. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +41 -3
  247. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  248. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  249. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +2 -0
  250. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -1
  251. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts +2 -0
  252. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.d.ts.map +1 -0
  253. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js +46 -0
  254. package/packages/pi-coding-agent/dist/core/sdk-tool-filter.test.js.map +1 -0
  255. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -2
  256. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/sdk.js +81 -4
  258. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +20 -0
  260. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/settings-manager.js +25 -0
  262. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/skill-tool.test.js +22 -0
  264. package/packages/pi-coding-agent/dist/core/skill-tool.test.js.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +6 -7
  266. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/system-prompt.js +2 -3
  268. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js +22 -56
  270. package/packages/pi-coding-agent/dist/core/tools/bash-spawn-windows.test.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts +1 -0
  272. package/packages/pi-coding-agent/dist/core/tools/bash.d.ts.map +1 -1
  273. package/packages/pi-coding-agent/dist/core/tools/bash.js +3 -1
  274. package/packages/pi-coding-agent/dist/core/tools/bash.js.map +1 -1
  275. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts +2 -0
  276. package/packages/pi-coding-agent/dist/core/tools/edit.d.ts.map +1 -1
  277. package/packages/pi-coding-agent/dist/core/tools/edit.js +12 -1
  278. package/packages/pi-coding-agent/dist/core/tools/edit.js.map +1 -1
  279. package/packages/pi-coding-agent/dist/core/tools/find.d.ts +2 -0
  280. package/packages/pi-coding-agent/dist/core/tools/find.d.ts.map +1 -1
  281. package/packages/pi-coding-agent/dist/core/tools/find.js +14 -6
  282. package/packages/pi-coding-agent/dist/core/tools/find.js.map +1 -1
  283. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts +2 -0
  284. package/packages/pi-coding-agent/dist/core/tools/grep.d.ts.map +1 -1
  285. package/packages/pi-coding-agent/dist/core/tools/grep.js +12 -3
  286. package/packages/pi-coding-agent/dist/core/tools/grep.js.map +1 -1
  287. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts +2 -0
  288. package/packages/pi-coding-agent/dist/core/tools/hashline-read.d.ts.map +1 -1
  289. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js +3 -1
  290. package/packages/pi-coding-agent/dist/core/tools/hashline-read.js.map +1 -1
  291. package/packages/pi-coding-agent/dist/core/tools/index.d.ts +2 -1
  292. package/packages/pi-coding-agent/dist/core/tools/index.d.ts.map +1 -1
  293. package/packages/pi-coding-agent/dist/core/tools/index.js +1 -0
  294. package/packages/pi-coding-agent/dist/core/tools/index.js.map +1 -1
  295. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts +2 -0
  296. package/packages/pi-coding-agent/dist/core/tools/ls.d.ts.map +1 -1
  297. package/packages/pi-coding-agent/dist/core/tools/ls.js +10 -3
  298. package/packages/pi-coding-agent/dist/core/tools/ls.js.map +1 -1
  299. package/packages/pi-coding-agent/dist/core/tools/read.d.ts +2 -0
  300. package/packages/pi-coding-agent/dist/core/tools/read.d.ts.map +1 -1
  301. package/packages/pi-coding-agent/dist/core/tools/read.js +3 -1
  302. package/packages/pi-coding-agent/dist/core/tools/read.js.map +1 -1
  303. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js +7 -62
  304. package/packages/pi-coding-agent/dist/core/tools/spawn-shell-windows.test.js.map +1 -1
  305. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts +2 -0
  306. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.d.ts.map +1 -0
  307. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js +115 -0
  308. package/packages/pi-coding-agent/dist/core/tools/tool-target-metadata.test.js.map +1 -0
  309. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts +19 -0
  310. package/packages/pi-coding-agent/dist/core/tools/tool-target.d.ts.map +1 -0
  311. package/packages/pi-coding-agent/dist/core/tools/tool-target.js +20 -0
  312. package/packages/pi-coding-agent/dist/core/tools/tool-target.js.map +1 -0
  313. package/packages/pi-coding-agent/dist/core/tools/write.d.ts +4 -0
  314. package/packages/pi-coding-agent/dist/core/tools/write.d.ts.map +1 -1
  315. package/packages/pi-coding-agent/dist/core/tools/write.js +9 -1
  316. package/packages/pi-coding-agent/dist/core/tools/write.js.map +1 -1
  317. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js +6 -4
  318. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.js.map +1 -1
  319. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js +137 -19
  320. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/tool-execution.test.js.map +1 -1
  321. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js +2 -2
  322. package/packages/pi-coding-agent/dist/modes/interactive/components/adaptive-layout.js.map +1 -1
  323. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/modes/interactive/components/assistant-message.js.map +1 -1
  325. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  326. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +2 -1
  327. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  328. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +32 -7
  329. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +1 -1
  330. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts +18 -0
  331. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +225 -16
  333. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  335. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +85 -2
  336. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  337. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js +71 -0
  338. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.test.js.map +1 -1
  339. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +2 -0
  340. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  341. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +22 -0
  342. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  343. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  344. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +36 -27
  345. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  346. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js +21 -0
  347. package/packages/pi-coding-agent/dist/modes/interactive/tui-mode.test.js.map +1 -1
  348. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts +2 -0
  349. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.d.ts.map +1 -0
  350. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js +28 -0
  351. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage-safety-guard.test.js.map +1 -0
  352. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.d.ts.map +1 -1
  353. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js +3 -2
  354. package/packages/pi-coding-agent/dist/resources/extensions/memory/storage.js.map +1 -1
  355. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +36 -0
  356. package/packages/pi-coding-agent/src/core/agent-session-tool-refresh.test.ts +40 -1
  357. package/packages/pi-coding-agent/src/core/agent-session.ts +59 -7
  358. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +91 -0
  359. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +18 -0
  360. package/packages/pi-coding-agent/src/core/compaction-threshold.test.ts +121 -0
  361. package/packages/pi-coding-agent/src/core/db-snapshot.test.ts +32 -0
  362. package/packages/pi-coding-agent/src/core/db-snapshot.ts +66 -0
  363. package/packages/pi-coding-agent/src/core/extensions/loader.ts +10 -0
  364. package/packages/pi-coding-agent/src/core/extensions/runner.test.ts +113 -3
  365. package/packages/pi-coding-agent/src/core/extensions/runner.ts +24 -6
  366. package/packages/pi-coding-agent/src/core/extensions/types.ts +44 -2
  367. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +2 -0
  368. package/packages/pi-coding-agent/src/core/sdk-tool-filter.test.ts +60 -0
  369. package/packages/pi-coding-agent/src/core/sdk.ts +92 -4
  370. package/packages/pi-coding-agent/src/core/settings-manager.ts +39 -1
  371. package/packages/pi-coding-agent/src/core/skill-tool.test.ts +28 -0
  372. package/packages/pi-coding-agent/src/core/system-prompt.ts +8 -10
  373. package/packages/pi-coding-agent/src/core/tools/bash-spawn-windows.test.ts +22 -66
  374. package/packages/pi-coding-agent/src/core/tools/bash.ts +4 -1
  375. package/packages/pi-coding-agent/src/core/tools/edit.ts +13 -1
  376. package/packages/pi-coding-agent/src/core/tools/find.ts +15 -6
  377. package/packages/pi-coding-agent/src/core/tools/grep.ts +13 -3
  378. package/packages/pi-coding-agent/src/core/tools/hashline-read.ts +4 -1
  379. package/packages/pi-coding-agent/src/core/tools/index.ts +8 -0
  380. package/packages/pi-coding-agent/src/core/tools/ls.ts +11 -3
  381. package/packages/pi-coding-agent/src/core/tools/read.ts +4 -1
  382. package/packages/pi-coding-agent/src/core/tools/spawn-shell-windows.test.ts +11 -72
  383. package/packages/pi-coding-agent/src/core/tools/tool-target-metadata.test.ts +127 -0
  384. package/packages/pi-coding-agent/src/core/tools/tool-target.ts +48 -0
  385. package/packages/pi-coding-agent/src/core/tools/write.ts +14 -2
  386. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/chat-frame-compaction-tone.test.ts +7 -5
  387. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/tool-execution.test.ts +185 -19
  388. package/packages/pi-coding-agent/src/modes/interactive/components/adaptive-layout.ts +2 -2
  389. package/packages/pi-coding-agent/src/modes/interactive/components/assistant-message.ts +1 -0
  390. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +2 -1
  391. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +41 -10
  392. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +260 -16
  393. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.test.ts +75 -0
  394. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +107 -3
  395. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +24 -0
  396. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +36 -27
  397. package/packages/pi-coding-agent/src/modes/interactive/tui-mode.test.ts +25 -0
  398. package/packages/pi-coding-agent/src/resources/extensions/memory/storage-safety-guard.test.ts +31 -0
  399. package/packages/pi-coding-agent/src/resources/extensions/memory/storage.ts +3 -2
  400. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  401. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  402. package/packages/pi-tui/dist/tui.js +18 -8
  403. package/packages/pi-tui/dist/tui.js.map +1 -1
  404. package/packages/pi-tui/src/tui.ts +20 -8
  405. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  406. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  407. package/pkg/dist/modes/interactive/theme/themes.js +36 -27
  408. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  409. package/src/resources/GSD-WORKFLOW.md +2 -2
  410. package/src/resources/extensions/claude-code-cli/readiness.ts +25 -7
  411. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +42 -3
  412. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +67 -0
  413. package/src/resources/extensions/github-sync/sync.ts +8 -1
  414. package/src/resources/extensions/github-sync/tests/sync-source.test.ts +6 -18
  415. package/src/resources/extensions/gsd/auto/loop-deps.ts +3 -2
  416. package/src/resources/extensions/gsd/auto/loop.ts +134 -16
  417. package/src/resources/extensions/gsd/auto/phases.ts +328 -200
  418. package/src/resources/extensions/gsd/auto/resolve.ts +42 -1
  419. package/src/resources/extensions/gsd/auto/run-unit.ts +28 -30
  420. package/src/resources/extensions/gsd/auto/session.ts +8 -0
  421. package/src/resources/extensions/gsd/auto/workflow-dispatch-claim.ts +63 -1
  422. package/src/resources/extensions/gsd/auto/workflow-worker-heartbeat.ts +14 -1
  423. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +8 -34
  424. package/src/resources/extensions/gsd/auto-dispatch.ts +33 -0
  425. package/src/resources/extensions/gsd/auto-post-unit.ts +117 -88
  426. package/src/resources/extensions/gsd/auto-prompts.ts +228 -16
  427. package/src/resources/extensions/gsd/auto-recovery.ts +185 -7
  428. package/src/resources/extensions/gsd/auto-start.ts +293 -21
  429. package/src/resources/extensions/gsd/auto-supervisor.ts +7 -0
  430. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +2 -2
  431. package/src/resources/extensions/gsd/auto-worktree.ts +241 -72
  432. package/src/resources/extensions/gsd/auto.ts +220 -40
  433. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +120 -8
  434. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +45 -37
  435. package/src/resources/extensions/gsd/bootstrap/dynamic-tools.ts +36 -10
  436. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +32 -19
  437. package/src/resources/extensions/gsd/bootstrap/journal-tools.ts +5 -1
  438. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +7 -4
  439. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +6 -3
  440. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +1 -1
  441. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +369 -54
  442. package/src/resources/extensions/gsd/bootstrap/sanitize-complete-milestone.ts +4 -0
  443. package/src/resources/extensions/gsd/bootstrap/system-context.ts +90 -22
  444. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +19 -2
  445. package/src/resources/extensions/gsd/clean-root-preflight.ts +72 -9
  446. package/src/resources/extensions/gsd/commands/dispatcher.ts +6 -0
  447. package/src/resources/extensions/gsd/commands/handlers/ops.ts +4 -2
  448. package/src/resources/extensions/gsd/commands-config.ts +1 -1
  449. package/src/resources/extensions/gsd/commands-eval-review.ts +2 -2
  450. package/src/resources/extensions/gsd/commands-extract-learnings.ts +17 -12
  451. package/src/resources/extensions/gsd/commands-handlers.ts +34 -15
  452. package/src/resources/extensions/gsd/context-budget.ts +44 -2
  453. package/src/resources/extensions/gsd/crash-recovery.ts +67 -10
  454. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  455. package/src/resources/extensions/gsd/db/unit-dispatches.ts +107 -0
  456. package/src/resources/extensions/gsd/db-base-schema.ts +19 -2
  457. package/src/resources/extensions/gsd/db-migration-steps.ts +25 -0
  458. package/src/resources/extensions/gsd/detection.ts +128 -0
  459. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +3 -0
  460. package/src/resources/extensions/gsd/git-service.ts +87 -10
  461. package/src/resources/extensions/gsd/gsd-db.ts +168 -13
  462. package/src/resources/extensions/gsd/guided-flow.ts +169 -55
  463. package/src/resources/extensions/gsd/init-wizard.ts +5 -1
  464. package/src/resources/extensions/gsd/memory-store.ts +77 -12
  465. package/src/resources/extensions/gsd/migrate/command.ts +47 -1
  466. package/src/resources/extensions/gsd/migration-auto-check.ts +129 -0
  467. package/src/resources/extensions/gsd/native-git-bridge.ts +39 -6
  468. package/src/resources/extensions/gsd/orphan-stash-audit.ts +117 -0
  469. package/src/resources/extensions/gsd/parallel-orchestrator.ts +13 -3
  470. package/src/resources/extensions/gsd/planning-path-scope.ts +35 -0
  471. package/src/resources/extensions/gsd/pre-execution-checks.ts +23 -0
  472. package/src/resources/extensions/gsd/preferences-types.ts +1 -1
  473. package/src/resources/extensions/gsd/prompt-loader.ts +27 -2
  474. package/src/resources/extensions/gsd/prompts/complete-milestone.md +27 -23
  475. package/src/resources/extensions/gsd/prompts/complete-slice.md +1 -1
  476. package/src/resources/extensions/gsd/prompts/execute-task.md +4 -2
  477. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +1 -1
  478. package/src/resources/extensions/gsd/prompts/plan-milestone.md +3 -1
  479. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -1
  480. package/src/resources/extensions/gsd/prompts/quick-task.md +1 -5
  481. package/src/resources/extensions/gsd/prompts/replan-slice.md +2 -2
  482. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -2
  483. package/src/resources/extensions/gsd/quick.ts +37 -2
  484. package/src/resources/extensions/gsd/safety/evidence-collector.ts +11 -2
  485. package/src/resources/extensions/gsd/slice-cadence.ts +49 -2
  486. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +23 -9
  487. package/src/resources/extensions/gsd/tests/agent-end-retry.test.ts +59 -89
  488. package/src/resources/extensions/gsd/tests/artifact-retry-cap.test.ts +47 -172
  489. package/src/resources/extensions/gsd/tests/artifacts-table-preserved-on-cache-invalidate.test.ts +0 -35
  490. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +35 -9
  491. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +433 -11
  492. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +80 -59
  493. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +3 -47
  494. package/src/resources/extensions/gsd/tests/auto-paused-ui-cleanup.test.ts +76 -18
  495. package/src/resources/extensions/gsd/tests/auto-phases-lifecycle.test.ts +160 -11
  496. package/src/resources/extensions/gsd/tests/auto-pr-bugs.test.ts +54 -95
  497. package/src/resources/extensions/gsd/tests/auto-project-root-env.test.ts +67 -26
  498. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +139 -2
  499. package/src/resources/extensions/gsd/tests/auto-remediate-slice-status.test.ts +32 -30
  500. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +32 -128
  501. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +20 -54
  502. package/src/resources/extensions/gsd/tests/auto-start-cold-db-bootstrap.test.ts +20 -30
  503. package/src/resources/extensions/gsd/tests/auto-start-index-lock.test.ts +17 -29
  504. package/src/resources/extensions/gsd/tests/auto-start-orphan-bootstrap.test.ts +138 -0
  505. package/src/resources/extensions/gsd/tests/auto-start-time-persistence.test.ts +21 -39
  506. package/src/resources/extensions/gsd/tests/auto-start-worktree-db-path.test.ts +15 -24
  507. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +44 -29
  508. package/src/resources/extensions/gsd/tests/auto-warning-noise-regression.test.ts +39 -51
  509. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +159 -213
  510. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +15 -32
  511. package/src/resources/extensions/gsd/tests/browser-teardown.test.ts +0 -41
  512. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +97 -2
  513. package/src/resources/extensions/gsd/tests/clear-stale-autostart.test.ts +34 -27
  514. package/src/resources/extensions/gsd/tests/cmux.test.ts +51 -53
  515. package/src/resources/extensions/gsd/tests/cold-resume-db-reopen.test.ts +39 -61
  516. package/src/resources/extensions/gsd/tests/commands-config.test.ts +26 -19
  517. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +9 -0
  518. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +14 -1
  519. package/src/resources/extensions/gsd/tests/complete-milestone-excerpt.test.ts +31 -0
  520. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +140 -0
  521. package/src/resources/extensions/gsd/tests/complete-slice-composer.test.ts +3 -2
  522. package/src/resources/extensions/gsd/tests/complete-task-normalize-lists.test.ts +29 -33
  523. package/src/resources/extensions/gsd/tests/completed-units-metrics-sync.test.ts +45 -108
  524. package/src/resources/extensions/gsd/tests/context-budget.test.ts +10 -1
  525. package/src/resources/extensions/gsd/tests/context-store.test.ts +7 -1
  526. package/src/resources/extensions/gsd/tests/crash-handler-secondary.test.ts +90 -31
  527. package/src/resources/extensions/gsd/tests/crash-recovery-via-db.test.ts +22 -0
  528. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +5 -1
  529. package/src/resources/extensions/gsd/tests/cwd-fallback-hardening.test.ts +138 -0
  530. package/src/resources/extensions/gsd/tests/dashboard-custom-engine.test.ts +4 -68
  531. package/src/resources/extensions/gsd/tests/db-schema-metadata.test.ts +2 -2
  532. package/src/resources/extensions/gsd/tests/deep-project-auto-loop.test.ts +4 -9
  533. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +14 -65
  534. package/src/resources/extensions/gsd/tests/detection.test.ts +140 -0
  535. package/src/resources/extensions/gsd/tests/discuss-tool-scoping.test.ts +44 -37
  536. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +58 -40
  537. package/src/resources/extensions/gsd/tests/dispatch-guard-closed-status.test.ts +25 -15
  538. package/src/resources/extensions/gsd/tests/dispatch-rule-coverage.test.ts +313 -0
  539. package/src/resources/extensions/gsd/tests/dispatcher-stuck-planning.test.ts +35 -17
  540. package/src/resources/extensions/gsd/tests/error-success-mask.test.ts +16 -21
  541. package/src/resources/extensions/gsd/tests/est-annotation-timeout.test.ts +15 -82
  542. package/src/resources/extensions/gsd/tests/exec-history.test.ts +15 -0
  543. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +65 -0
  544. package/src/resources/extensions/gsd/tests/execute-task-rendering.test.ts +5 -2
  545. package/src/resources/extensions/gsd/tests/fast-forward-reused-milestone-branch.test.ts +219 -0
  546. package/src/resources/extensions/gsd/tests/finalize-survivor-branch.test.ts +132 -0
  547. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +2 -20
  548. package/src/resources/extensions/gsd/tests/frontmatter-parse-noise.test.ts +18 -26
  549. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -0
  550. package/src/resources/extensions/gsd/tests/has-pending-deep-stage.test.ts +33 -1
  551. package/src/resources/extensions/gsd/tests/init-skip-git.test.ts +9 -12
  552. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +40 -0
  553. package/src/resources/extensions/gsd/tests/integration/commands-eval-review.integration.test.ts +4 -2
  554. package/src/resources/extensions/gsd/tests/integration/git-locale.test.ts +31 -20
  555. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +66 -0
  556. package/src/resources/extensions/gsd/tests/integration/milestone-transition-worktree.test.ts +0 -47
  557. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +60 -202
  558. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +13 -56
  559. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +239 -1
  560. package/src/resources/extensions/gsd/tests/journal-query-tool.test.ts +32 -0
  561. package/src/resources/extensions/gsd/tests/knowledge.test.ts +47 -0
  562. package/src/resources/extensions/gsd/tests/lazy-pi-tui-import.test.ts +44 -6
  563. package/src/resources/extensions/gsd/tests/memory-decay-factor.test.ts +90 -0
  564. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +21 -35
  565. package/src/resources/extensions/gsd/tests/merge-conflict-stops-loop.test.ts +1 -0
  566. package/src/resources/extensions/gsd/tests/migrate-writer-integration.test.ts +48 -0
  567. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +127 -0
  568. package/src/resources/extensions/gsd/tests/milestone-merge-stash-restore.test.ts +242 -0
  569. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +79 -98
  570. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +70 -278
  571. package/src/resources/extensions/gsd/tests/native-git-bridge-exec-fallback.test.ts +34 -2
  572. package/src/resources/extensions/gsd/tests/needs-remediation-revalidation.test.ts +37 -30
  573. package/src/resources/extensions/gsd/tests/note-captures-executed.test.ts +32 -28
  574. package/src/resources/extensions/gsd/tests/originalbase-path-comparison.test.ts +3 -0
  575. package/src/resources/extensions/gsd/tests/orphan-merge-bootstrap.test.ts +133 -0
  576. package/src/resources/extensions/gsd/tests/orphan-stash-audit.test.ts +201 -0
  577. package/src/resources/extensions/gsd/tests/parallel-orchestrator-fast-forward.test.ts +113 -0
  578. package/src/resources/extensions/gsd/tests/phantom-ghost-detection.test.ts +24 -37
  579. package/src/resources/extensions/gsd/tests/phantom-milestone-default-queued.test.ts +9 -24
  580. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +91 -75
  581. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +50 -0
  582. package/src/resources/extensions/gsd/tests/plan-task.test.ts +21 -0
  583. package/src/resources/extensions/gsd/tests/post-unit-state-rebuild.test.ts +36 -22
  584. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +36 -30
  585. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +45 -5
  586. package/src/resources/extensions/gsd/tests/pre-execution-pause-wiring.test.ts +74 -4
  587. package/src/resources/extensions/gsd/tests/preferences-worktree-sync.test.ts +20 -22
  588. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +130 -32
  589. package/src/resources/extensions/gsd/tests/project-root-cwd-crash.test.ts +18 -36
  590. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +35 -73
  591. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +76 -138
  592. package/src/resources/extensions/gsd/tests/prompt-duplication-cuts.test.ts +230 -0
  593. package/src/resources/extensions/gsd/tests/prompt-path-audit.test.ts +40 -0
  594. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +70 -106
  595. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +59 -161
  596. package/src/resources/extensions/gsd/tests/query-tools-db-open.test.ts +33 -29
  597. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +22 -196
  598. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +23 -93
  599. package/src/resources/extensions/gsd/tests/quick-external-gsd.test.ts +40 -0
  600. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +50 -79
  601. package/src/resources/extensions/gsd/tests/reassess-default-optin.test.ts +27 -13
  602. package/src/resources/extensions/gsd/tests/remote-questions.test.ts +151 -251
  603. package/src/resources/extensions/gsd/tests/resource-loader-import-path.test.ts +41 -29
  604. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +58 -69
  605. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +32 -164
  606. package/src/resources/extensions/gsd/tests/right-sized-workflow-prompts.test.ts +192 -0
  607. package/src/resources/extensions/gsd/tests/run-uat-replay-cap.test.ts +57 -41
  608. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +29 -0
  609. package/src/resources/extensions/gsd/tests/schema-v27-v28-sequence.test.ts +156 -0
  610. package/src/resources/extensions/gsd/tests/select-resumable-milestone.test.ts +96 -0
  611. package/src/resources/extensions/gsd/tests/session-model-override.test.ts +14 -9
  612. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +77 -0
  613. package/src/resources/extensions/gsd/tests/session-switch-abort-misclassification.test.ts +166 -0
  614. package/src/resources/extensions/gsd/tests/show-config-command.test.ts +44 -42
  615. package/src/resources/extensions/gsd/tests/signal-handlers.test.ts +27 -0
  616. package/src/resources/extensions/gsd/tests/skip-slice-state-rebuild.test.ts +56 -24
  617. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +51 -11
  618. package/src/resources/extensions/gsd/tests/slice-cadence.test.ts +23 -0
  619. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +66 -50
  620. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +68 -107
  621. package/src/resources/extensions/gsd/tests/slice-sequence-insert.test.ts +115 -42
  622. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +21 -59
  623. package/src/resources/extensions/gsd/tests/smart-entry-draft.test.ts +25 -116
  624. package/src/resources/extensions/gsd/tests/sqlite-unavailable-gate.test.ts +21 -57
  625. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +29 -76
  626. package/src/resources/extensions/gsd/tests/stale-lockfile-recovery.test.ts +33 -24
  627. package/src/resources/extensions/gsd/tests/stale-slice-rows.test.ts +39 -30
  628. package/src/resources/extensions/gsd/tests/stalled-tool-recovery.test.ts +49 -1
  629. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +101 -2
  630. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +1 -0
  631. package/src/resources/extensions/gsd/tests/status-db-open.test.ts +35 -40
  632. package/src/resources/extensions/gsd/tests/stop-auto-merge-back.test.ts +48 -46
  633. package/src/resources/extensions/gsd/tests/stop-auto-race-null-unit.test.ts +14 -102
  634. package/src/resources/extensions/gsd/tests/subagent-model-dispatch.test.ts +78 -232
  635. package/src/resources/extensions/gsd/tests/sync-worktree-skip-current.test.ts +32 -35
  636. package/src/resources/extensions/gsd/tests/system-context-memory.test.ts +112 -0
  637. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +7 -9
  638. package/src/resources/extensions/gsd/tests/token-profile.test.ts +84 -309
  639. package/src/resources/extensions/gsd/tests/token-tool-gating.test.ts +291 -0
  640. package/src/resources/extensions/gsd/tests/triage-dispatch.test.ts +134 -341
  641. package/src/resources/extensions/gsd/tests/unit-context-composer.test.ts +136 -4
  642. package/src/resources/extensions/gsd/tests/unit-context-manifest.test.ts +8 -25
  643. package/src/resources/extensions/gsd/tests/unit-dispatches.test.ts +80 -1
  644. package/src/resources/extensions/gsd/tests/unit-runtime.test.ts +37 -0
  645. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +5 -99
  646. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +43 -36
  647. package/src/resources/extensions/gsd/tests/visualizer-data.test.ts +84 -444
  648. package/src/resources/extensions/gsd/tests/workflow-dispatch-claim.test.ts +142 -0
  649. package/src/resources/extensions/gsd/tests/workflow-logger-wiring.test.ts +44 -189
  650. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +2 -57
  651. package/src/resources/extensions/gsd/tests/workflow-protocol-excerpt.test.ts +99 -0
  652. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +3 -0
  653. package/src/resources/extensions/gsd/tests/workflow-worker-heartbeat.test.ts +32 -1
  654. package/src/resources/extensions/gsd/tests/worktree-db-same-file.test.ts +21 -44
  655. package/src/resources/extensions/gsd/tests/worktree-expected-warnings.test.ts +27 -26
  656. package/src/resources/extensions/gsd/tests/worktree-health-dispatch.test.ts +38 -6
  657. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +1 -0
  658. package/src/resources/extensions/gsd/tests/worktree-main-branch.test.ts +20 -18
  659. package/src/resources/extensions/gsd/tests/worktree-manager.test.ts +7 -0
  660. package/src/resources/extensions/gsd/tests/worktree-nested-git-safety.test.ts +9 -2
  661. package/src/resources/extensions/gsd/tests/worktree-path-injection.test.ts +22 -19
  662. package/src/resources/extensions/gsd/tests/worktree-project-root-degrade.test.ts +66 -0
  663. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +203 -4
  664. package/src/resources/extensions/gsd/tests/write-gate.test.ts +40 -1
  665. package/src/resources/extensions/gsd/tests/zero-slice-roadmap-guided.test.ts +19 -13
  666. package/src/resources/extensions/gsd/tools/complete-milestone.ts +14 -15
  667. package/src/resources/extensions/gsd/tools/complete-task.ts +1 -1
  668. package/src/resources/extensions/gsd/tools/context-mode-tool-result.ts +25 -0
  669. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +7 -7
  670. package/src/resources/extensions/gsd/tools/exec-tool.ts +4 -23
  671. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -0
  672. package/src/resources/extensions/gsd/tools/plan-slice.ts +13 -0
  673. package/src/resources/extensions/gsd/tools/plan-task.ts +10 -0
  674. package/src/resources/extensions/gsd/tools/resume-tool.ts +7 -7
  675. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +1 -1
  676. package/src/resources/extensions/gsd/unit-context-composer.ts +19 -4
  677. package/src/resources/extensions/gsd/unit-runtime.ts +25 -0
  678. package/src/resources/extensions/gsd/workflow-protocol.ts +160 -0
  679. package/src/resources/extensions/gsd/worktree-manager.ts +15 -4
  680. package/src/resources/extensions/gsd/worktree-resolver.ts +119 -20
  681. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +86 -40
  682. package/src/resources/skills/web-quality-audit/scripts/analyze.sh +0 -0
  683. package/dist/web/standalone/.next/static/chunks/8336.631939fb583761fa.js +0 -10
  684. /package/dist/web/standalone/.next/static/{CaMwumvGbBPZrJicfsCzV → Y9yOOsO4ZA5BPTOS8ixvP}/_buildManifest.js +0 -0
  685. /package/dist/web/standalone/.next/static/{CaMwumvGbBPZrJicfsCzV → Y9yOOsO4ZA5BPTOS8ixvP}/_ssgManifest.js +0 -0
@@ -29,6 +29,7 @@ import { _getAdapter, isDbAvailable } from "./gsd-db.js";
29
29
  import { gsdRoot, normalizeRealPath } from "./paths.js";
30
30
  import { atomicWriteSync } from "./atomic-write.js";
31
31
  import { effectiveLockFile } from "./session-lock.js";
32
+ import { isInFlightRuntimePhase, listUnitRuntimeRecords } from "./unit-runtime.js";
32
33
  const SESSION_FILE_KV_KEY = "session_file";
33
34
  function lockPath(basePath) {
34
35
  return join(gsdRoot(basePath), effectiveLockFile());
@@ -72,9 +73,37 @@ function getLatestDispatchForWorker(workerId) {
72
73
  LIMIT 1`).get({ ":worker_id": workerId });
73
74
  return row ?? null;
74
75
  }
75
- function workerToLockData(worker) {
76
+ function latestInFlightRuntimeRecord(basePath) {
77
+ const records = listUnitRuntimeRecords(basePath).filter((record) => isInFlightRuntimePhase(record.phase));
78
+ if (records.length === 0)
79
+ return null;
80
+ return records.sort((a, b) => {
81
+ const bTime = b.updatedAt || b.startedAt || 0;
82
+ const aTime = a.updatedAt || a.startedAt || 0;
83
+ return bTime - aTime;
84
+ })[0] ?? null;
85
+ }
86
+ function runtimeRecordToLockData(worker, record, sessionFile) {
87
+ const startedAt = Number.isFinite(record.startedAt)
88
+ ? new Date(record.startedAt).toISOString()
89
+ : worker.started_at;
90
+ return {
91
+ pid: worker.pid,
92
+ startedAt: worker.started_at,
93
+ unitType: record.unitType,
94
+ unitId: record.unitId,
95
+ unitStartedAt: startedAt,
96
+ sessionFile,
97
+ };
98
+ }
99
+ function workerToLockData(basePath, worker) {
76
100
  const dispatch = getLatestDispatchForWorker(worker.worker_id);
77
101
  const sessionFile = getRuntimeKv("worker", worker.worker_id, SESSION_FILE_KV_KEY) ?? undefined;
102
+ if (!dispatch) {
103
+ const runtimeRecord = latestInFlightRuntimeRecord(basePath);
104
+ if (runtimeRecord)
105
+ return runtimeRecordToLockData(worker, runtimeRecord, sessionFile);
106
+ }
78
107
  return {
79
108
  pid: worker.pid,
80
109
  startedAt: worker.started_at,
@@ -172,7 +201,7 @@ export function readCrashLock(basePath) {
172
201
  const projectRoot = normalizeRealPath(basePath);
173
202
  const stale = findStaleWorkerForProject(projectRoot);
174
203
  if (stale)
175
- return workerToLockData(stale);
204
+ return workerToLockData(basePath, stale);
176
205
  }
177
206
  catch {
178
207
  // Fall through to the legacy lock-file compatibility path.
@@ -232,18 +261,32 @@ export function formatCrashInfo(lock) {
232
261
  export function emitCrashRecoveredUnitEnd(basePath, lock) {
233
262
  if (!lock.unitType || !lock.unitId || lock.unitType === "starting")
234
263
  return;
264
+ emitOpenUnitEndForUnit(basePath, lock.unitType, lock.unitId, "crash-recovered");
265
+ }
266
+ export function emitOpenUnitEndForUnit(basePath, unitType, unitId, status, errorContext) {
235
267
  try {
236
268
  const all = queryJournal(basePath);
237
- const starts = all.filter((e) => e.eventType === "unit-start" && e.data?.unitId === lock.unitId);
269
+ const starts = all.filter((e) => e.eventType === "unit-start" &&
270
+ e.data?.unitType === unitType &&
271
+ e.data?.unitId === unitId);
238
272
  if (starts.length === 0)
239
- return;
240
- const lastStart = starts[starts.length - 1];
273
+ return false;
274
+ const lastStart = [...starts].reverse().find((start) => {
275
+ return !all.some((e) => e.eventType === "unit-end" &&
276
+ e.data?.unitType === unitType &&
277
+ e.data?.unitId === unitId &&
278
+ e.causedBy?.flowId === start.flowId &&
279
+ e.causedBy?.seq === start.seq);
280
+ });
281
+ if (!lastStart)
282
+ return false;
241
283
  const alreadyClosed = all.some((e) => e.eventType === "unit-end" &&
242
- e.data?.unitId === lock.unitId &&
284
+ e.data?.unitType === unitType &&
285
+ e.data?.unitId === unitId &&
243
286
  e.causedBy?.flowId === lastStart.flowId &&
244
287
  e.causedBy?.seq === lastStart.seq);
245
288
  if (alreadyClosed)
246
- return;
289
+ return false;
247
290
  const maxSeq = all
248
291
  .filter((e) => e.flowId === lastStart.flowId)
249
292
  .reduce((max, e) => Math.max(max, e.seq), lastStart.seq);
@@ -253,16 +296,19 @@ export function emitCrashRecoveredUnitEnd(basePath, lock) {
253
296
  seq: maxSeq + 1,
254
297
  eventType: "unit-end",
255
298
  data: {
256
- unitType: lock.unitType,
257
- unitId: lock.unitId,
258
- status: "crash-recovered",
299
+ unitType,
300
+ unitId,
301
+ status,
259
302
  artifactVerified: false,
303
+ ...(errorContext ? { errorContext } : {}),
260
304
  },
261
305
  causedBy: { flowId: lastStart.flowId, seq: lastStart.seq },
262
306
  });
307
+ return true;
263
308
  }
264
309
  catch {
265
310
  // Never throw from crash recovery path.
311
+ return false;
266
312
  }
267
313
  }
268
314
  /**
@@ -21,7 +21,7 @@ import { estimateTimeRemaining } from "./auto-dashboard.js";
21
21
  import { computeProgressScore } from "./progress-score.js";
22
22
  import { runEnvironmentChecks } from "./doctor-environment.js";
23
23
  import { formattedShortcutPair } from "./shortcut-defs.js";
24
- function unitLabel(type) {
24
+ export function unitLabel(type) {
25
25
  switch (type) {
26
26
  case "discuss-milestone":
27
27
  case "discuss-slice": return "Discuss";
@@ -26,6 +26,58 @@ function isAlreadyActiveConstraintError(err) {
26
26
  }
27
27
  return /\bUNIQUE\b|\bconstraint failed\b/i.test(msg);
28
28
  }
29
+ function settleStaleActiveDispatchForUnit(input, now) {
30
+ const db = _getAdapter();
31
+ const active = db.prepare(`SELECT id, status, worker_id, milestone_lease_token
32
+ FROM unit_dispatches
33
+ WHERE unit_id = :unit_id
34
+ AND status IN ('claimed','running')
35
+ ORDER BY id DESC
36
+ LIMIT 1`).get({ ":unit_id": input.unitId });
37
+ if (!active)
38
+ return;
39
+ if (active.worker_id === input.workerId &&
40
+ active.milestone_lease_token === input.milestoneLeaseToken) {
41
+ return;
42
+ }
43
+ const reason = "stale-dispatch-lease-takeover";
44
+ const result = db.prepare(`UPDATE unit_dispatches
45
+ SET status = 'canceled',
46
+ ended_at = :ended_at,
47
+ exit_reason = :reason
48
+ WHERE id = :id
49
+ AND status IN ('claimed','running')
50
+ AND (worker_id != :worker_id OR milestone_lease_token != :token)`).run({
51
+ ":id": active.id,
52
+ ":ended_at": now,
53
+ ":reason": reason,
54
+ ":worker_id": input.workerId,
55
+ ":token": input.milestoneLeaseToken,
56
+ });
57
+ const changes = typeof result.changes === "number"
58
+ ? result.changes
59
+ : 0;
60
+ if (changes < 1)
61
+ return;
62
+ insertAuditEvent({
63
+ eventId: randomUUID(),
64
+ traceId: input.traceId,
65
+ turnId: input.turnId ?? undefined,
66
+ category: "orchestration",
67
+ type: "dispatch-stale-canceled",
68
+ ts: now,
69
+ payload: {
70
+ dispatchId: active.id,
71
+ unitId: input.unitId,
72
+ priorStatus: active.status,
73
+ priorWorkerId: active.worker_id,
74
+ priorMilestoneLeaseToken: active.milestone_lease_token,
75
+ takeoverWorkerId: input.workerId,
76
+ takeoverMilestoneLeaseToken: input.milestoneLeaseToken,
77
+ reason,
78
+ },
79
+ });
80
+ }
29
81
  /**
30
82
  * Insert a new dispatch row in `claimed` state. Atomic guard against
31
83
  * double-claim (B2): the partial unique index
@@ -58,6 +110,7 @@ export function recordDispatchClaim(input) {
58
110
  milestoneLeaseToken: input.milestoneLeaseToken,
59
111
  };
60
112
  }
113
+ settleStaleActiveDispatchForUnit(input, now);
61
114
  try {
62
115
  const result = db.prepare(`INSERT INTO unit_dispatches (
63
116
  trace_id, turn_id, worker_id, milestone_lease_token,
@@ -253,6 +306,45 @@ export function markCanceled(dispatchId, reason) {
253
306
  SET status = 'canceled', ended_at = :ended_at, exit_reason = :reason
254
307
  WHERE id = :id AND status IN ('pending','claimed','running')`).run({ ":id": dispatchId, ":ended_at": now, ":reason": reason });
255
308
  }
309
+ /**
310
+ * Best-effort signal/crash cleanup: cancel the latest active dispatch owned by
311
+ * a worker when the process is exiting before the normal loop can settle it.
312
+ */
313
+ export function markLatestActiveForWorkerCanceled(workerId, reason) {
314
+ if (!isDbAvailable())
315
+ return false;
316
+ const now = new Date().toISOString();
317
+ const db = _getAdapter();
318
+ const result = transaction(() => {
319
+ return db.prepare(`UPDATE unit_dispatches
320
+ SET status = 'canceled', ended_at = :ended_at, exit_reason = :reason
321
+ WHERE id = (
322
+ SELECT id FROM unit_dispatches
323
+ WHERE worker_id = :worker_id
324
+ AND status IN ('pending','claimed','running')
325
+ ORDER BY id DESC
326
+ LIMIT 1
327
+ )`).run({
328
+ ":ended_at": now,
329
+ ":reason": reason,
330
+ ":worker_id": workerId,
331
+ });
332
+ });
333
+ const changes = typeof result.changes === "number"
334
+ ? result.changes
335
+ : 0;
336
+ if (changes <= 0)
337
+ return false;
338
+ insertAuditEvent({
339
+ eventId: randomUUID(),
340
+ traceId: workerId,
341
+ category: "orchestration",
342
+ type: "dispatch-canceled",
343
+ ts: now,
344
+ payload: { workerId, reason },
345
+ });
346
+ return true;
347
+ }
256
348
  /**
257
349
  * Fetch the most recent N dispatches for a unit. Used by recordDispatchClaim
258
350
  * callers to compute attempt_n and by detect-stuck.ts (B3) to consult
@@ -46,7 +46,8 @@ export function createBaseSchemaObjects(db, hooks) {
46
46
  slice_id TEXT DEFAULT NULL,
47
47
  task_id TEXT DEFAULT NULL,
48
48
  full_content TEXT NOT NULL DEFAULT '',
49
- imported_at TEXT NOT NULL DEFAULT ''
49
+ imported_at TEXT NOT NULL DEFAULT '',
50
+ content_hash TEXT DEFAULT NULL
50
51
  )
51
52
  `);
52
53
  db.exec(`
@@ -64,7 +65,8 @@ export function createBaseSchemaObjects(db, hooks) {
64
65
  hit_count INTEGER NOT NULL DEFAULT 0,
65
66
  scope TEXT NOT NULL DEFAULT 'project',
66
67
  tags TEXT NOT NULL DEFAULT '[]',
67
- structured_fields TEXT DEFAULT NULL
68
+ structured_fields TEXT DEFAULT NULL,
69
+ last_hit_at TEXT DEFAULT NULL
68
70
  )
69
71
  `);
70
72
  db.exec(`
@@ -294,6 +296,19 @@ export function createBaseSchemaObjects(db, hooks) {
294
296
  updated_at TEXT NOT NULL DEFAULT '',
295
297
  PRIMARY KEY (trace_id, turn_id, stage)
296
298
  )
299
+ `);
300
+ db.exec(`
301
+ CREATE TABLE IF NOT EXISTS milestone_commit_attributions (
302
+ commit_sha TEXT NOT NULL,
303
+ milestone_id TEXT NOT NULL,
304
+ slice_id TEXT DEFAULT NULL,
305
+ task_id TEXT DEFAULT NULL,
306
+ source TEXT NOT NULL DEFAULT 'recorded',
307
+ confidence REAL NOT NULL DEFAULT 1.0,
308
+ files_json TEXT NOT NULL DEFAULT '[]',
309
+ created_at TEXT NOT NULL DEFAULT '',
310
+ PRIMARY KEY (commit_sha, milestone_id)
311
+ )
297
312
  `);
298
313
  db.exec(`
299
314
  CREATE TABLE IF NOT EXISTS audit_events (
@@ -329,6 +344,7 @@ export function createBaseSchemaObjects(db, hooks) {
329
344
  db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_turn ON gate_runs(trace_id, turn_id)");
330
345
  db.exec("CREATE INDEX IF NOT EXISTS idx_gate_runs_lookup ON gate_runs(milestone_id, slice_id, task_id, gate_id)");
331
346
  db.exec("CREATE INDEX IF NOT EXISTS idx_turn_git_tx_turn ON turn_git_transactions(trace_id, turn_id)");
347
+ db.exec("CREATE INDEX IF NOT EXISTS idx_milestone_commit_attr_milestone ON milestone_commit_attributions(milestone_id)");
332
348
  db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_trace ON audit_events(trace_id, ts)");
333
349
  db.exec("CREATE INDEX IF NOT EXISTS idx_audit_events_turn ON audit_events(trace_id, turn_id, ts)");
334
350
  db.exec("CREATE VIEW IF NOT EXISTS active_decisions AS SELECT * FROM decisions WHERE superseded_by IS NULL");
@@ -363,6 +363,28 @@ export function applyMigrationV21StructuredMemories(db) {
363
363
  export function applyMigrationV23MilestoneQueue(db) {
364
364
  ensureColumn(db, "milestones", "sequence", "ALTER TABLE milestones ADD COLUMN sequence INTEGER DEFAULT 0");
365
365
  }
366
+ export function applyMigrationV26MilestoneCommitAttributions(db) {
367
+ db.exec(`
368
+ CREATE TABLE IF NOT EXISTS milestone_commit_attributions (
369
+ commit_sha TEXT NOT NULL,
370
+ milestone_id TEXT NOT NULL,
371
+ slice_id TEXT DEFAULT NULL,
372
+ task_id TEXT DEFAULT NULL,
373
+ source TEXT NOT NULL DEFAULT 'recorded',
374
+ confidence REAL NOT NULL DEFAULT 1.0,
375
+ files_json TEXT NOT NULL DEFAULT '[]',
376
+ created_at TEXT NOT NULL DEFAULT '',
377
+ PRIMARY KEY (commit_sha, milestone_id)
378
+ )
379
+ `);
380
+ db.exec("CREATE INDEX IF NOT EXISTS idx_milestone_commit_attr_milestone ON milestone_commit_attributions(milestone_id)");
381
+ }
382
+ export function applyMigrationV27ArtifactHash(db) {
383
+ ensureColumn(db, "artifacts", "content_hash", "ALTER TABLE artifacts ADD COLUMN content_hash TEXT DEFAULT NULL");
384
+ }
385
+ export function applyMigrationV28MemoryLastHitAt(db) {
386
+ ensureColumn(db, "memories", "last_hit_at", "ALTER TABLE memories ADD COLUMN last_hit_at TEXT DEFAULT NULL");
387
+ }
366
388
  export function applyMigrationV22QualityGateRepair(db, hooks) {
367
389
  const qgInfo = db.prepare("PRAGMA table_info(quality_gates)").all();
368
390
  const taskIdCol = qgInfo.find((r) => r["name"] === "task_id");
@@ -5,6 +5,7 @@
5
5
  * Used by init-wizard.ts and guided-flow.ts to determine what onboarding
6
6
  * flow to show when entering a project directory.
7
7
  */
8
+ import { execFileSync } from "node:child_process";
8
9
  import { existsSync, openSync, readSync, closeSync, readdirSync, readFileSync, statSync } from "node:fs";
9
10
  import { dirname, join, parse as parsePath } from "node:path";
10
11
  import { homedir } from "node:os";
@@ -171,6 +172,7 @@ const TEST_MARKERS = [
171
172
  const RECURSIVE_SCAN_IGNORED_DIRS = new Set([
172
173
  ".git",
173
174
  ".gsd",
175
+ ".bg-shell",
174
176
  ".planning",
175
177
  ".plans",
176
178
  ".claude",
@@ -194,6 +196,7 @@ const RECURSIVE_SCAN_IGNORED_DIRS = new Set([
194
196
  "DerivedData",
195
197
  "out",
196
198
  ]);
199
+ const PROJECT_CONTENT_EXCLUDE_DIRS = RECURSIVE_SCAN_IGNORED_DIRS;
197
200
  /** Project file markers safe to detect recursively via suffix matching. */
198
201
  const ROOT_ONLY_PROJECT_FILES = new Set([
199
202
  ".github/workflows",
@@ -429,6 +432,109 @@ export function detectProjectSignals(basePath) {
429
432
  verificationCommands,
430
433
  };
431
434
  }
435
+ function normalizeGitPath(file) {
436
+ return file.replaceAll("\\", "/").replace(/^\.\//, "");
437
+ }
438
+ function isProjectContentFile(file) {
439
+ const normalized = normalizeGitPath(file);
440
+ if (!normalized || normalized.endsWith("/"))
441
+ return false;
442
+ if (normalized === ".gitignore" || normalized === ".gitattributes")
443
+ return false;
444
+ const parts = normalized.split("/");
445
+ if (parts.some((part) => PROJECT_CONTENT_EXCLUDE_DIRS.has(part)))
446
+ return false;
447
+ if (normalized.endsWith(".DS_Store"))
448
+ return false;
449
+ return true;
450
+ }
451
+ function runGitLines(basePath, args) {
452
+ try {
453
+ const output = execFileSync("git", args, {
454
+ cwd: basePath,
455
+ stdio: ["ignore", "pipe", "ignore"],
456
+ encoding: "utf-8",
457
+ }).trim();
458
+ return output ? output.split("\n").map((line) => line.trim()).filter(Boolean) : [];
459
+ }
460
+ catch {
461
+ return [];
462
+ }
463
+ }
464
+ function listTrackedProjectFiles(basePath) {
465
+ return runGitLines(basePath, ["ls-files"])
466
+ .map(normalizeGitPath)
467
+ .filter(isProjectContentFile);
468
+ }
469
+ function listUntrackedProjectFiles(basePath) {
470
+ return runGitLines(basePath, ["ls-files", "--others", "--exclude-standard"])
471
+ .map(normalizeGitPath)
472
+ .filter(isProjectContentFile);
473
+ }
474
+ function hasKnownProjectMarkers(basePath, signals) {
475
+ if (signals.detectedFiles.length > 0)
476
+ return true;
477
+ if (signals.xcodePlatforms.length > 0)
478
+ return true;
479
+ return false;
480
+ }
481
+ /**
482
+ * Classify repo presence separately from ecosystem/tooling markers.
483
+ *
484
+ * Known project files identify tooling. Git-tracked/non-ignored content
485
+ * identifies whether this is an existing project at all. This keeps small
486
+ * static or documentation repos from being mislabeled as greenfield.
487
+ */
488
+ export function classifyProject(basePath) {
489
+ const signals = detectProjectSignals(basePath);
490
+ const markers = [...signals.detectedFiles];
491
+ if (!signals.isGitRepo) {
492
+ return {
493
+ kind: "invalid-repo",
494
+ signals,
495
+ trackedFiles: [],
496
+ untrackedFiles: [],
497
+ contentFiles: [],
498
+ markers,
499
+ reason: "missing .git",
500
+ };
501
+ }
502
+ const trackedFiles = listTrackedProjectFiles(basePath);
503
+ const untrackedFiles = listUntrackedProjectFiles(basePath);
504
+ const contentFiles = [...new Set([...trackedFiles, ...untrackedFiles])];
505
+ const hasMarkers = hasKnownProjectMarkers(basePath, signals);
506
+ if (hasMarkers) {
507
+ return {
508
+ kind: "typed-existing",
509
+ signals,
510
+ trackedFiles,
511
+ untrackedFiles,
512
+ contentFiles,
513
+ markers,
514
+ reason: markers.length > 0 ? `detected markers: ${markers.join(", ")}` : "detected project structure",
515
+ };
516
+ }
517
+ if (contentFiles.length > 0) {
518
+ return {
519
+ kind: "untyped-existing",
520
+ signals,
521
+ trackedFiles,
522
+ untrackedFiles,
523
+ contentFiles,
524
+ markers,
525
+ reason: "project content exists but no recognized tooling markers were found",
526
+ };
527
+ }
528
+ return {
529
+ kind: "greenfield",
530
+ signals,
531
+ trackedFiles,
532
+ untrackedFiles,
533
+ contentFiles,
534
+ markers,
535
+ reason: "no tracked or non-ignored project content",
536
+ };
537
+ }
432
538
  // ─── Xcode Platform Detection ───────────────────────────────────────────────────
433
539
  /** Known SDKROOT values → canonical platform names. */
434
540
  const SDKROOT_MAP = {
@@ -127,6 +127,8 @@ export function createGSDExtensionAPI(pi, sharedHandlers) {
127
127
  getActiveTools: () => pi.getActiveTools(),
128
128
  getAllTools: () => pi.getAllTools(),
129
129
  setActiveTools: (...args) => pi.setActiveTools(...args),
130
+ getVisibleSkills: () => pi.getVisibleSkills(),
131
+ setVisibleSkills: (...args) => pi.setVisibleSkills(...args),
130
132
  getCommands: () => pi.getCommands(),
131
133
  // ── Model & thinking ───────────────────────────────────────────────
132
134
  setModel: (...args) => pi.setModel(...args),
@@ -1,3 +1,5 @@
1
+ // Project/App: GSD-2
2
+ // File Purpose: Git operations, commit-message formatting, and turn git actions.
1
3
  /**
2
4
  * GSD Git Service
3
5
  *
@@ -13,6 +15,7 @@ import { isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
13
15
  import { gsdRoot } from "./paths.js";
14
16
  import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
15
17
  import { loadEffectiveGSDPreferences } from "./preferences.js";
18
+ import { logWarning } from "./workflow-logger.js";
16
19
  import { detectWorktreeName, } from "./worktree.js";
17
20
  import { SLICE_BRANCH_RE, QUICK_BRANCH_RE, WORKFLOW_BRANCH_RE } from "./branch-patterns.js";
18
21
  import { nativeGetCurrentBranch, nativeDetectMainBranch, nativeBranchExists, nativeHasChanges, nativeAddAllWithExclusions, nativeHasStagedChanges, nativeCommit, nativeRmCached, nativeUpdateRef, nativeAddPaths, nativeResetSoft, nativeCommitSubject, _resetHasChangesCache, } from "./native-git-bridge.js";
@@ -48,6 +51,10 @@ export function buildTaskCommitMessage(ctx) {
48
51
  .join("\n");
49
52
  bodyParts.push(fileLines);
50
53
  }
54
+ const contextLines = buildTaskCommitContextLines(ctx);
55
+ if (contextLines.length > 0) {
56
+ bodyParts.push(`GSD context:\n${contextLines.join("\n")}`);
57
+ }
51
58
  // Trailers: GSD-Task first, then Resolves
52
59
  bodyParts.push(`GSD-Task: ${ctx.taskId}`);
53
60
  if (ctx.issueNumber) {
@@ -55,6 +62,31 @@ export function buildTaskCommitMessage(ctx) {
55
62
  }
56
63
  return `${subject}\n\n${bodyParts.join("\n\n")}`;
57
64
  }
65
+ function buildTaskCommitContextLines(ctx) {
66
+ const lines = [];
67
+ const milestone = formatNamedContext(ctx.milestoneId, ctx.milestoneTitle);
68
+ const slice = formatNamedContext(ctx.sliceId, ctx.sliceTitle);
69
+ const taskId = ctx.taskDisplayId ?? ctx.taskId.split("/").pop();
70
+ const task = formatNamedContext(taskId, ctx.taskTitle);
71
+ if (milestone)
72
+ lines.push(`- Milestone: ${milestone}`);
73
+ if (slice)
74
+ lines.push(`- Slice: ${slice}`);
75
+ if (task)
76
+ lines.push(`- Task: ${task}`);
77
+ return lines;
78
+ }
79
+ function formatNamedContext(id, title) {
80
+ const cleanId = id?.trim();
81
+ const cleanTitle = title?.trim();
82
+ if (!cleanId && !cleanTitle)
83
+ return null;
84
+ if (!cleanId)
85
+ return cleanTitle ?? null;
86
+ if (!cleanTitle || cleanTitle === cleanId)
87
+ return cleanId;
88
+ return `${cleanId} - ${cleanTitle}`;
89
+ }
58
90
  function sanitizeCommitSubjectDescription(value) {
59
91
  const cleaned = value
60
92
  .replace(/[\x00-\x1F\x7F]+/g, " ")
@@ -535,14 +567,45 @@ export class GitServiceImpl {
535
567
  if (keyFiles.length === 0)
536
568
  return false;
537
569
  const allExclusions = [...RUNTIME_EXCLUSION_PATHS, ...extraExclusions];
538
- const paths = Array.from(new Set(keyFiles
570
+ const normalized = keyFiles
539
571
  .map(file => normalizeRepoRelativePath(this.basePath, file))
540
572
  .filter((file) => file !== null)
541
- .filter(file => !isExcludedScopedPath(file, allExclusions))));
573
+ .filter(file => !isExcludedScopedPath(file, allExclusions));
574
+ // Drop entries that don't exist on disk. The LLM occasionally lists files
575
+ // it intended to write but didn't (or names them with wrong casing/path).
576
+ // Pre-`b304f738b` `git add -A` swallowed these silently; the scoped
577
+ // pathspec form passes each path explicitly, so a single bad entry made
578
+ // the whole commit fail (see #5500). Filter so valid paths still commit.
579
+ const missing = [];
580
+ const existing = [];
581
+ for (const path of normalized) {
582
+ if (existsSync(join(this.basePath, path))) {
583
+ existing.push(path);
584
+ }
585
+ else {
586
+ missing.push(path);
587
+ }
588
+ }
589
+ if (missing.length > 0) {
590
+ logWarning("engine", `scoped stage: dropping ${missing.length} non-existent keyFile(s) from task commit: ${missing.join(", ")}`, { file: "git-service.ts" });
591
+ }
592
+ const paths = Array.from(new Set(existing));
542
593
  if (paths.length === 0)
543
594
  return false;
544
- nativeAddPaths(this.basePath, paths);
545
- return true;
595
+ try {
596
+ nativeAddPaths(this.basePath, paths);
597
+ return true;
598
+ }
599
+ catch (err) {
600
+ // Defense-in-depth: even after existence filtering, libgit2/git can
601
+ // still reject paths (gitignore matches, case-only differences on
602
+ // case-insensitive FS, submodule boundaries). Returning false lets
603
+ // autoCommit fall through to smartStage so the commit still goes out
604
+ // — restoring the resilience the unscoped path used to provide.
605
+ const msg = err instanceof Error ? err.message : String(err);
606
+ logWarning("engine", `scoped stage failed (${msg}); falling back to smartStage`, { file: "git-service.ts" });
607
+ return false;
608
+ }
546
609
  }
547
610
  /** Tracks whether runtime file cleanup has run this session. */
548
611
  _runtimeFilesCleanedUp = false;
@@ -823,7 +886,12 @@ export function createDraftPR(basePath, milestoneId, title, body, opts) {
823
886
  args.push("--head", opts.head);
824
887
  if (opts?.base)
825
888
  args.push("--base", opts.base);
826
- const result = execFileSync("gh", args, { cwd: basePath, encoding: "utf8", timeout: 30000, env: GIT_NO_PROMPT_ENV });
889
+ const result = execFileSync("gh", args, {
890
+ cwd: basePath,
891
+ encoding: "utf8",
892
+ timeout: 30000,
893
+ env: opts?.env ?? GIT_NO_PROMPT_ENV,
894
+ });
827
895
  return result.trim();
828
896
  }
829
897
  catch {