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
@@ -13,6 +13,7 @@ import {
13
13
  } from "./edit-diff.js";
14
14
  import { notifyFileChanged } from "../lsp/client.js";
15
15
  import { resolveToCwd } from "./path-utils.js";
16
+ import { createToolTarget, type ToolTargetMetadata } from "./tool-target.js";
16
17
 
17
18
  const editSchema = Type.Object({
18
19
  path: Type.String({ description: "Path to the file to edit (relative or absolute)" }),
@@ -27,6 +28,7 @@ export interface EditToolDetails {
27
28
  diff: string;
28
29
  /** Line number of the first change in the new file (for editor navigation) */
29
30
  firstChangedLine?: number;
31
+ target?: ToolTargetMetadata;
30
32
  }
31
33
 
32
34
  /**
@@ -208,7 +210,17 @@ export function createEditTool(cwd: string, options?: EditToolOptions): AgentToo
208
210
  text: `Successfully replaced text in ${path}.`,
209
211
  },
210
212
  ],
211
- details: { diff: diffResult.diff, firstChangedLine: diffResult.firstChangedLine },
213
+ details: {
214
+ diff: diffResult.diff,
215
+ firstChangedLine: diffResult.firstChangedLine,
216
+ target: createToolTarget({
217
+ kind: "file",
218
+ action: "edit",
219
+ inputPath: path,
220
+ resolvedPath: absolutePath,
221
+ line: diffResult.firstChangedLine,
222
+ }),
223
+ },
212
224
  });
213
225
  } catch (error: any) {
214
226
  // Clean up abort handler
@@ -5,6 +5,7 @@ import { existsSync } from "fs";
5
5
  import path from "path";
6
6
  import { FIND_DEFAULT_LIMIT } from "../constants.js";
7
7
  import { resolveToCwd } from "./path-utils.js";
8
+ import { createToolTarget, type ToolTargetMetadata } from "./tool-target.js";
8
9
  import { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from "./truncate.js";
9
10
 
10
11
  const findSchema = Type.Object({
@@ -20,6 +21,7 @@ export type FindToolInput = Static<typeof findSchema>;
20
21
  const DEFAULT_LIMIT = FIND_DEFAULT_LIMIT;
21
22
 
22
23
  export interface FindToolDetails {
24
+ target?: ToolTargetMetadata;
23
25
  truncation?: TruncationResult;
24
26
  resultLimitReached?: number;
25
27
  }
@@ -73,6 +75,13 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
73
75
  (async () => {
74
76
  try {
75
77
  const searchPath = resolveToCwd(searchDir || ".", cwd);
78
+ const target = createToolTarget({
79
+ kind: "search",
80
+ action: "find",
81
+ inputPath: searchDir || ".",
82
+ resolvedPath: searchPath,
83
+ pattern,
84
+ });
76
85
  const effectiveLimit = limit ?? DEFAULT_LIMIT;
77
86
  const ops = customOps ?? defaultFindOperations;
78
87
 
@@ -93,7 +102,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
93
102
  if (results.length === 0) {
94
103
  resolve({
95
104
  content: [{ type: "text", text: "No files found matching pattern" }],
96
- details: undefined,
105
+ details: { target },
97
106
  });
98
107
  return;
99
108
  }
@@ -111,7 +120,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
111
120
  const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
112
121
 
113
122
  let resultOutput = truncation.content;
114
- const details: FindToolDetails = {};
123
+ const details: FindToolDetails = { target };
115
124
  const notices: string[] = [];
116
125
 
117
126
  if (resultLimitReached) {
@@ -130,7 +139,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
130
139
 
131
140
  resolve({
132
141
  content: [{ type: "text", text: resultOutput }],
133
- details: Object.keys(details).length > 0 ? details : undefined,
142
+ details,
134
143
  });
135
144
  return;
136
145
  }
@@ -150,7 +159,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
150
159
  if (globResult.matches.length === 0) {
151
160
  resolve({
152
161
  content: [{ type: "text", text: "No files found matching pattern" }],
153
- details: undefined,
162
+ details: { target },
154
163
  });
155
164
  return;
156
165
  }
@@ -163,7 +172,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
163
172
  const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
164
173
 
165
174
  let resultOutput = truncation.content;
166
- const details: FindToolDetails = {};
175
+ const details: FindToolDetails = { target };
167
176
  const notices: string[] = [];
168
177
 
169
178
  if (resultLimitReached) {
@@ -184,7 +193,7 @@ export function createFindTool(cwd: string, options?: FindToolOptions): AgentToo
184
193
 
185
194
  resolve({
186
195
  content: [{ type: "text", text: resultOutput }],
187
- details: Object.keys(details).length > 0 ? details : undefined,
196
+ details,
188
197
  });
189
198
  } catch (e: any) {
190
199
  signal?.removeEventListener("abort", onAbort);
@@ -6,6 +6,7 @@ import { readFileSync, statSync } from "fs";
6
6
  import path from "path";
7
7
  import { ensureTool } from "../../utils/tools-manager.js";
8
8
  import { resolveToCwd } from "./path-utils.js";
9
+ import { createToolTarget, type ToolTargetMetadata } from "./tool-target.js";
9
10
  import {
10
11
  DEFAULT_MAX_BYTES,
11
12
  formatSize,
@@ -34,6 +35,7 @@ export type GrepToolInput = Static<typeof grepSchema>;
34
35
  const DEFAULT_LIMIT = 100;
35
36
 
36
37
  export interface GrepToolDetails {
38
+ target?: ToolTargetMetadata;
37
39
  truncation?: TruncationResult;
38
40
  matchLimitReached?: number;
39
41
  linesTruncated?: boolean;
@@ -112,6 +114,14 @@ export function createGrepTool(cwd: string, options?: GrepToolOptions): AgentToo
112
114
  }
113
115
 
114
116
  const searchPath = resolveToCwd(searchDir || ".", cwd);
117
+ const target = createToolTarget({
118
+ kind: "search",
119
+ action: "grep",
120
+ inputPath: searchDir || ".",
121
+ resolvedPath: searchPath,
122
+ pattern,
123
+ glob,
124
+ });
115
125
  const ops = customOps ?? defaultGrepOperations;
116
126
 
117
127
  let isDirectory: boolean;
@@ -282,7 +292,7 @@ export function createGrepTool(cwd: string, options?: GrepToolOptions): AgentToo
282
292
 
283
293
  if (matchCount === 0) {
284
294
  settle(() =>
285
- resolve({ content: [{ type: "text", text: "No matches found" }], details: undefined }),
295
+ resolve({ content: [{ type: "text", text: "No matches found" }], details: { target } }),
286
296
  );
287
297
  return;
288
298
  }
@@ -298,7 +308,7 @@ export function createGrepTool(cwd: string, options?: GrepToolOptions): AgentToo
298
308
  const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
299
309
 
300
310
  let output = truncation.content;
301
- const details: GrepToolDetails = {};
311
+ const details: GrepToolDetails = { target };
302
312
 
303
313
  // Build notices
304
314
  const notices: string[] = [];
@@ -329,7 +339,7 @@ export function createGrepTool(cwd: string, options?: GrepToolOptions): AgentToo
329
339
  settle(() =>
330
340
  resolve({
331
341
  content: [{ type: "text", text: output }],
332
- details: Object.keys(details).length > 0 ? details : undefined,
342
+ details,
333
343
  }),
334
344
  );
335
345
  });
@@ -17,6 +17,7 @@ import { formatDimensionNote, resizeImage } from "../../utils/image-resize.js";
17
17
  import { detectSupportedImageMimeTypeFromFile } from "../../utils/mime.js";
18
18
  import { formatHashLines } from "./hashline.js";
19
19
  import { resolveReadPath } from "./path-utils.js";
20
+ import { createReadFileTarget, type ToolTargetMetadata } from "./tool-target.js";
20
21
  import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from "./truncate.js";
21
22
 
22
23
  const readSchema = Type.Object({
@@ -28,6 +29,7 @@ const readSchema = Type.Object({
28
29
  export type HashlineReadToolInput = Static<typeof readSchema>;
29
30
 
30
31
  export interface HashlineReadToolDetails {
32
+ target?: ToolTargetMetadata;
31
33
  truncation?: TruncationResult;
32
34
  }
33
35
 
@@ -66,6 +68,7 @@ export function createHashlineReadTool(cwd: string, options?: HashlineReadToolOp
66
68
  signal?: AbortSignal,
67
69
  ) => {
68
70
  const absolutePath = resolveReadPath(path, cwd);
71
+ const target = createReadFileTarget(path, absolutePath, offset, limit);
69
72
 
70
73
  return new Promise<{ content: (TextContent | ImageContent)[]; details: HashlineReadToolDetails | undefined }>(
71
74
  (resolve, reject) => {
@@ -186,7 +189,7 @@ export function createHashlineReadTool(cwd: string, options?: HashlineReadToolOp
186
189
  if (aborted) return;
187
190
 
188
191
  if (signal) signal.removeEventListener("abort", onAbort);
189
- resolve({ content, details });
192
+ resolve({ content, details: { ...details, target } });
190
193
  } catch (error: any) {
191
194
  if (signal) signal.removeEventListener("abort", onAbort);
192
195
  if (!aborted) {
@@ -70,10 +70,18 @@ export {
70
70
  export {
71
71
  createWriteTool,
72
72
  type WriteOperations,
73
+ type WriteToolDetails,
73
74
  type WriteToolInput,
74
75
  type WriteToolOptions,
75
76
  writeTool,
76
77
  } from "./write.js";
78
+ export {
79
+ createToolTarget,
80
+ type ToolTargetAction,
81
+ type ToolTargetKind,
82
+ type ToolTargetMetadata,
83
+ type ToolTargetRange,
84
+ } from "./tool-target.js";
77
85
  export {
78
86
  createHashlineEditTool,
79
87
  type HashlineEditInput,
@@ -3,6 +3,7 @@ import { type Static, Type } from "@sinclair/typebox";
3
3
  import { existsSync, readdirSync, statSync } from "fs";
4
4
  import nodePath from "path";
5
5
  import { resolveToCwd } from "./path-utils.js";
6
+ import { createToolTarget, type ToolTargetMetadata } from "./tool-target.js";
6
7
  import { DEFAULT_MAX_BYTES, formatSize, type TruncationResult, truncateHead } from "./truncate.js";
7
8
 
8
9
  const lsSchema = Type.Object({
@@ -15,6 +16,7 @@ export type LsToolInput = Static<typeof lsSchema>;
15
16
  const DEFAULT_LIMIT = 500;
16
17
 
17
18
  export interface LsToolDetails {
19
+ target?: ToolTargetMetadata;
18
20
  truncation?: TruncationResult;
19
21
  entryLimitReached?: number;
20
22
  }
@@ -68,6 +70,12 @@ export function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<ty
68
70
  (async () => {
69
71
  try {
70
72
  const dirPath = resolveToCwd(path || ".", cwd);
73
+ const target = createToolTarget({
74
+ kind: "directory",
75
+ action: "list",
76
+ inputPath: path || ".",
77
+ resolvedPath: dirPath,
78
+ });
71
79
  const effectiveLimit = limit ?? DEFAULT_LIMIT;
72
80
 
73
81
  // Check if path exists
@@ -124,7 +132,7 @@ export function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<ty
124
132
  signal?.removeEventListener("abort", onAbort);
125
133
 
126
134
  if (results.length === 0) {
127
- resolve({ content: [{ type: "text", text: "(empty directory)" }], details: undefined });
135
+ resolve({ content: [{ type: "text", text: "(empty directory)" }], details: { target } });
128
136
  return;
129
137
  }
130
138
 
@@ -133,7 +141,7 @@ export function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<ty
133
141
  const truncation = truncateHead(rawOutput, { maxLines: Number.MAX_SAFE_INTEGER });
134
142
 
135
143
  let output = truncation.content;
136
- const details: LsToolDetails = {};
144
+ const details: LsToolDetails = { target };
137
145
 
138
146
  // Build notices
139
147
  const notices: string[] = [];
@@ -154,7 +162,7 @@ export function createLsTool(cwd: string, options?: LsToolOptions): AgentTool<ty
154
162
 
155
163
  resolve({
156
164
  content: [{ type: "text", text: output }],
157
- details: Object.keys(details).length > 0 ? details : undefined,
165
+ details,
158
166
  });
159
167
  } catch (e: any) {
160
168
  signal?.removeEventListener("abort", onAbort);
@@ -6,6 +6,7 @@ import { access as fsAccess, readFile as fsReadFile } from "fs/promises";
6
6
  import { formatDimensionNote, resizeImage } from "../../utils/image-resize.js";
7
7
  import { detectSupportedImageMimeTypeFromFile } from "../../utils/mime.js";
8
8
  import { resolveReadPath } from "./path-utils.js";
9
+ import { createReadFileTarget, type ToolTargetMetadata } from "./tool-target.js";
9
10
  import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, formatSize, type TruncationResult, truncateHead } from "./truncate.js";
10
11
 
11
12
  const readSchema = Type.Object({
@@ -17,6 +18,7 @@ const readSchema = Type.Object({
17
18
  export type ReadToolInput = Static<typeof readSchema>;
18
19
 
19
20
  export interface ReadToolDetails {
21
+ target?: ToolTargetMetadata;
20
22
  truncation?: TruncationResult;
21
23
  }
22
24
 
@@ -61,6 +63,7 @@ export function createReadTool(cwd: string, options?: ReadToolOptions): AgentToo
61
63
  signal?: AbortSignal,
62
64
  ) => {
63
65
  const absolutePath = resolveReadPath(path, cwd);
66
+ const target = createReadFileTarget(path, absolutePath, offset, limit);
64
67
 
65
68
  return new Promise<{ content: (TextContent | ImageContent)[]; details: ReadToolDetails | undefined }>(
66
69
  (resolve, reject) => {
@@ -210,7 +213,7 @@ export function createReadTool(cwd: string, options?: ReadToolOptions): AgentToo
210
213
  signal.removeEventListener("abort", onAbort);
211
214
  }
212
215
 
213
- resolve({ content, details });
216
+ resolve({ content, details: { ...details, target } });
214
217
  } catch (error: any) {
215
218
  // Clean up abort handler
216
219
  if (signal) {
@@ -15,78 +15,17 @@
15
15
 
16
16
  import test from "node:test";
17
17
  import assert from "node:assert/strict";
18
- import { readFileSync } from "node:fs";
19
- import { join, dirname, relative } from "node:path";
20
- import { fileURLToPath } from "node:url";
18
+ import { execCommand } from "../exec.js";
21
19
 
22
- const __dirname = dirname(fileURLToPath(import.meta.url));
23
- const coreDir = join(__dirname, "..");
24
-
25
- /**
26
- * Files that call `spawn()` with a user-facing binary (not `node`, `sh`, `bash`,
27
- * or `cmd`) and therefore need the Windows shell guard.
28
- *
29
- * If a file spawns only hardcoded system binaries (like `node` in rpc-client.ts),
30
- * it does not need the guard and should NOT appear here.
31
- */
32
- const SPAWN_FILES_NEEDING_SHELL_GUARD = [
33
- // Extension's GSD client — spawns the `gsd` binary which is a .cmd on Windows
34
- join(coreDir, "..", "..", "..", "vscode-extension", "src", "gsd-client.ts"),
35
- // exec.ts — used by extensions to run arbitrary commands
36
- join(coreDir, "exec.ts"),
37
- // LSP index — spawns project-type commands (tsc, cargo, etc.)
38
- join(coreDir, "lsp", "index.ts"),
39
- // LSP client — spawns LSP server binaries (npx, etc.)
40
- join(coreDir, "lsp", "client.ts"),
41
- // LSP mux — spawns lspmux binary
42
- join(coreDir, "lsp", "lspmux.ts"),
43
- // Package manager — spawns npm/yarn/pnpm
44
- join(coreDir, "package-manager.ts"),
45
- ];
46
-
47
- test("all spawn sites that invoke user-facing binaries include shell: process.platform === 'win32'", () => {
48
- const failures: string[] = [];
49
-
50
- for (const file of SPAWN_FILES_NEEDING_SHELL_GUARD) {
51
- let content: string;
52
- try {
53
- content = readFileSync(file, "utf-8");
54
- } catch {
55
- // File may not exist in this checkout — skip
56
- continue;
57
- }
58
-
59
- const lines = content.split("\n");
60
-
61
- // Find all spawn(..., { ... }) call sites and check each one
62
- // for the presence of `shell: process.platform === "win32"` within
63
- // 5 lines after the spawn call.
64
- for (let i = 0; i < lines.length; i++) {
65
- const line = lines[i]!;
66
- // Skip comments
67
- if (line.trim().startsWith("//") || line.trim().startsWith("*")) continue;
68
-
69
- // Detect a spawn() call
70
- if (/\bspawn\(/.test(line)) {
71
- // Look ahead up to 8 lines for the shell guard
72
- const lookahead = lines.slice(i, i + 8).join("\n");
73
- const hasShellGuard =
74
- /shell:\s*process\.platform\s*===\s*["']win32["']/.test(lookahead);
75
-
76
- if (!hasShellGuard) {
77
- const relPath = relative(join(coreDir, "..", ".."), file);
78
- failures.push(`${relPath}:${i + 1}`);
79
- }
80
- }
81
- }
82
- }
83
-
84
- assert.deepEqual(
85
- failures,
86
- [],
87
- `The following spawn sites are missing 'shell: process.platform === "win32"':\n` +
88
- failures.map(f => ` - ${f}`).join("\n") +
89
- `\nOn Windows, .cmd wrapper scripts (npm, npx, tsc, gsd) require shell ` +
90
- `resolution. Without this guard, spawn fails with ENOENT or EINVAL.`,
20
+ test("execCommand runs a user-facing binary and captures stdout", async () => {
21
+ const result = await execCommand(
22
+ process.execPath,
23
+ ["-e", "process.stdout.write('ok')"],
24
+ process.cwd(),
91
25
  );
26
+
27
+ assert.equal(result.stdout, "ok");
28
+ assert.equal(result.stderr, "");
29
+ assert.equal(result.code, 0);
30
+ assert.equal(result.killed, false);
92
31
  });
@@ -0,0 +1,127 @@
1
+ // GSD-2 - Behavior coverage for tool target metadata.
2
+
3
+ import assert from "node:assert/strict";
4
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
5
+ import { tmpdir } from "node:os";
6
+ import { join } from "node:path";
7
+ import test from "node:test";
8
+
9
+ import { createEditTool } from "./edit.js";
10
+ import { createFindTool } from "./find.js";
11
+ import { createGrepTool } from "./grep.js";
12
+ import { createLsTool } from "./ls.js";
13
+ import { createReadTool } from "./read.js";
14
+ import { createWriteTool } from "./write.js";
15
+
16
+ test("read metadata records resolved path without changing output text", async () => {
17
+ const cwd = mkdtempSync(join(tmpdir(), "gsd-read-target-"));
18
+ try {
19
+ const filePath = join(cwd, "fixture.txt");
20
+ writeFileSync(filePath, "one\ntwo\nthree\n", "utf8");
21
+
22
+ const result = await createReadTool(cwd).execute("read-1", {
23
+ path: "fixture.txt",
24
+ offset: 2,
25
+ limit: 1,
26
+ });
27
+
28
+ assert.equal(result.details?.target?.resolvedPath, filePath);
29
+ assert.deepEqual(result.details?.target?.range, { start: 2, end: 2 });
30
+ assert.equal(result.content[0]?.type, "text");
31
+ assert.match(result.content[0]?.text ?? "", /^two/);
32
+ assert.equal((result.content[0]?.text ?? "").includes(filePath), false);
33
+
34
+ const zeroOffsetResult = await createReadTool(cwd).execute("read-zero-offset", {
35
+ path: "fixture.txt",
36
+ offset: 0,
37
+ limit: 1,
38
+ });
39
+
40
+ assert.deepEqual(zeroOffsetResult.details?.target?.range, { start: 1, end: 1 });
41
+ } finally {
42
+ rmSync(cwd, { recursive: true, force: true });
43
+ }
44
+ });
45
+
46
+ test("write metadata records resolved path without changing output text", async () => {
47
+ const cwd = mkdtempSync(join(tmpdir(), "gsd-write-target-"));
48
+ try {
49
+ const filePath = join(cwd, "out.txt");
50
+ const result = await createWriteTool(cwd).execute("write-1", {
51
+ path: "out.txt",
52
+ content: "hello",
53
+ });
54
+
55
+ assert.equal(result.details?.target?.resolvedPath, filePath);
56
+ assert.equal(result.content[0]?.type, "text");
57
+ assert.equal(result.content[0]?.text, "Successfully wrote 5 bytes to out.txt");
58
+ } finally {
59
+ rmSync(cwd, { recursive: true, force: true });
60
+ }
61
+ });
62
+
63
+ test("edit metadata records first changed line and resolved path", async () => {
64
+ const cwd = mkdtempSync(join(tmpdir(), "gsd-edit-target-"));
65
+ try {
66
+ const filePath = join(cwd, "edit.txt");
67
+ writeFileSync(filePath, "alpha\nbeta\ngamma\n", "utf8");
68
+
69
+ const result = await createEditTool(cwd).execute("edit-1", {
70
+ path: "edit.txt",
71
+ oldText: "beta",
72
+ newText: "delta",
73
+ });
74
+
75
+ assert.equal(result.details?.target?.resolvedPath, filePath);
76
+ assert.equal(result.details?.target?.line, 2);
77
+ assert.equal(result.details?.firstChangedLine, 2);
78
+ } finally {
79
+ rmSync(cwd, { recursive: true, force: true });
80
+ }
81
+ });
82
+
83
+ test("list and find metadata record resolved targets", async () => {
84
+ const cwd = mkdtempSync(join(tmpdir(), "gsd-search-target-"));
85
+ try {
86
+ const srcPath = join(cwd, "src");
87
+ const filePath = join(srcPath, "needle.txt");
88
+ mkdirSync(srcPath);
89
+ writeFileSync(filePath, "needle\n", "utf8");
90
+
91
+ const lsResult = await createLsTool(cwd).execute("ls-1", { path: "src" });
92
+ assert.equal(lsResult.details?.target?.resolvedPath, srcPath);
93
+
94
+ const findResult = await createFindTool(cwd, {
95
+ operations: {
96
+ exists: () => true,
97
+ glob: async () => [filePath],
98
+ },
99
+ }).execute("find-1", { path: "src", pattern: "needle" });
100
+ assert.equal(findResult.details?.target?.resolvedPath, srcPath);
101
+ assert.equal(findResult.details?.target?.pattern, "needle");
102
+ } finally {
103
+ rmSync(cwd, { recursive: true, force: true });
104
+ }
105
+ });
106
+
107
+ test("grep metadata records resolved search target", async () => {
108
+ const cwd = mkdtempSync(join(tmpdir(), "gsd-grep-target-"));
109
+ try {
110
+ const srcPath = join(cwd, "src");
111
+ mkdirSync(srcPath);
112
+ writeFileSync(join(srcPath, "needle.txt"), "needle\n", "utf8");
113
+
114
+ const result = await createGrepTool(cwd).execute("grep-1", {
115
+ path: "src",
116
+ pattern: "needle",
117
+ literal: true,
118
+ });
119
+
120
+ assert.equal(result.details?.target?.resolvedPath, srcPath);
121
+ assert.equal(result.details?.target?.pattern, "needle");
122
+ assert.equal(result.content[0]?.type, "text");
123
+ assert.match(result.content[0]?.text ?? "", /needle\.txt:1: needle/);
124
+ } finally {
125
+ rmSync(cwd, { recursive: true, force: true });
126
+ }
127
+ });
@@ -0,0 +1,48 @@
1
+ // GSD-2 - Shared target metadata for tool output rendering.
2
+
3
+ export type ToolTargetKind = "file" | "directory" | "search" | "command";
4
+
5
+ export type ToolTargetAction = "read" | "write" | "edit" | "list" | "find" | "grep" | "bash";
6
+
7
+ export interface ToolTargetRange {
8
+ start: number;
9
+ end?: number;
10
+ }
11
+
12
+ export interface ToolTargetMetadata {
13
+ kind: ToolTargetKind;
14
+ action: ToolTargetAction;
15
+ inputPath?: string;
16
+ resolvedPath?: string;
17
+ pattern?: string;
18
+ glob?: string;
19
+ line?: number;
20
+ range?: ToolTargetRange;
21
+ }
22
+
23
+ export function createToolTarget(target: ToolTargetMetadata): ToolTargetMetadata {
24
+ return target;
25
+ }
26
+
27
+ export function createReadFileTarget(
28
+ inputPath: string,
29
+ resolvedPath: string,
30
+ offset?: number,
31
+ limit?: number,
32
+ ): ToolTargetMetadata {
33
+ const effectiveOffset = Math.max(1, offset ?? 1);
34
+
35
+ return createToolTarget({
36
+ kind: "file",
37
+ action: "read",
38
+ inputPath,
39
+ resolvedPath,
40
+ range:
41
+ offset !== undefined || limit !== undefined
42
+ ? {
43
+ start: effectiveOffset,
44
+ end: limit !== undefined ? effectiveOffset + Math.max(0, limit - 1) : undefined,
45
+ }
46
+ : undefined,
47
+ });
48
+ }
@@ -4,6 +4,7 @@ import { mkdir as fsMkdir, writeFile as fsWriteFile } from "fs/promises";
4
4
  import { dirname } from "path";
5
5
  import { notifyFileChanged } from "../lsp/client.js";
6
6
  import { resolveToCwd } from "./path-utils.js";
7
+ import { createToolTarget, type ToolTargetMetadata } from "./tool-target.js";
7
8
 
8
9
  const writeSchema = Type.Object({
9
10
  path: Type.String({ description: "Path to the file to write (relative or absolute)" }),
@@ -12,6 +13,10 @@ const writeSchema = Type.Object({
12
13
 
13
14
  export type WriteToolInput = Static<typeof writeSchema>;
14
15
 
16
+ export interface WriteToolDetails {
17
+ target?: ToolTargetMetadata;
18
+ }
19
+
15
20
  /**
16
21
  * Pluggable operations for the write tool.
17
22
  * Override these to delegate file writing to remote systems (e.g., SSH).
@@ -50,7 +55,7 @@ export function createWriteTool(cwd: string, options?: WriteToolOptions): AgentT
50
55
  const absolutePath = resolveToCwd(path, cwd);
51
56
  const dir = dirname(absolutePath);
52
57
 
53
- return new Promise<{ content: Array<{ type: "text"; text: string }>; details: undefined }>(
58
+ return new Promise<{ content: Array<{ type: "text"; text: string }>; details: WriteToolDetails | undefined }>(
54
59
  (resolve, reject) => {
55
60
  // Check if already aborted
56
61
  if (signal?.aborted) {
@@ -98,7 +103,14 @@ export function createWriteTool(cwd: string, options?: WriteToolOptions): AgentT
98
103
 
99
104
  resolve({
100
105
  content: [{ type: "text", text: `Successfully wrote ${content.length} bytes to ${path}` }],
101
- details: undefined,
106
+ details: {
107
+ target: createToolTarget({
108
+ kind: "file",
109
+ action: "write",
110
+ inputPath: path,
111
+ resolvedPath: absolutePath,
112
+ }),
113
+ },
102
114
  });
103
115
  } catch (error: any) {
104
116
  // Clean up abort handler
@@ -1,3 +1,4 @@
1
+ // GSD2 TUI Tests - Chat frame card visual contract coverage.
1
2
  import { test, describe } from "node:test";
2
3
  import assert from "node:assert/strict";
3
4
  import stripAnsi from "strip-ansi";
@@ -8,12 +9,12 @@ initTheme("dark", false);
8
9
 
9
10
  // Regression tests for the "compaction" tone added to renderChatFrame.
10
11
  // The compaction notice shares the same visual frame as user / assistant
11
- // messages (top rule, `• label` header, `│ ` body prefix) but uses the
12
+ // messages (top rule, label header, `│ ` body prefix) but uses the
12
13
  // purple `customMessageLabel` color key so it is visually distinct from
13
14
  // conversation turns.
14
15
 
15
16
  describe("renderChatFrame — compaction tone", () => {
16
- test("produces a top rule, `• compaction` header row, and a │ body margin", () => {
17
+ test("produces a top rule, compaction header row, and a │ body margin", () => {
17
18
  const lines = renderChatFrame(
18
19
  ["Compacted from 1,224,262 tokens (ctrl+o to expand)"],
19
20
  60,
@@ -33,11 +34,12 @@ describe("renderChatFrame — compaction tone", () => {
33
34
  // Top rule is a solid horizontal bar
34
35
  assert.match(plain[0], /^─+$/, "first line should be the solid top rule");
35
36
 
36
- // Header row contains `• compaction`
37
+ // Header row contains `compaction`
37
38
  assert.ok(
38
- plain[1].includes("compaction"),
39
- `expected header to contain "compaction", got ${JSON.stringify(plain[1])}`,
39
+ plain[1].includes("compaction"),
40
+ `expected header to contain "compaction", got ${JSON.stringify(plain[1])}`,
40
41
  );
42
+ assert.ok(!plain[1].includes("•"), `header should not render a bullet prefix, got ${JSON.stringify(plain[1])}`);
41
43
 
42
44
  // Body line(s) start with `│ `
43
45
  assert.ok(