gsd-pi 2.34.0 → 2.35.0-dev.39eee32

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 (505) hide show
  1. package/dist/cli.js +7 -2
  2. package/dist/resource-loader.d.ts +1 -1
  3. package/dist/resource-loader.js +13 -1
  4. package/dist/resources/extensions/async-jobs/await-tool.js +0 -2
  5. package/dist/resources/extensions/async-jobs/job-manager.js +0 -6
  6. package/dist/resources/extensions/bg-shell/output-formatter.js +1 -19
  7. package/dist/resources/extensions/bg-shell/process-manager.js +0 -4
  8. package/dist/resources/extensions/bg-shell/types.js +0 -2
  9. package/dist/resources/extensions/context7/index.js +5 -0
  10. package/dist/resources/extensions/get-secrets-from-user.js +2 -30
  11. package/dist/resources/extensions/google-search/index.js +5 -0
  12. package/dist/resources/extensions/gsd/auto-dispatch.js +43 -1
  13. package/dist/resources/extensions/gsd/auto-loop.js +10 -1
  14. package/dist/resources/extensions/gsd/auto-recovery.js +35 -0
  15. package/dist/resources/extensions/gsd/auto-start.js +35 -2
  16. package/dist/resources/extensions/gsd/auto.js +59 -4
  17. package/dist/resources/extensions/gsd/changelog.js +162 -0
  18. package/dist/resources/extensions/gsd/commands-bootstrap.js +1 -0
  19. package/dist/resources/extensions/gsd/commands-handlers.js +2 -2
  20. package/dist/resources/extensions/gsd/commands-inspect.js +10 -3
  21. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +5 -1
  22. package/dist/resources/extensions/gsd/commands.js +8 -1
  23. package/dist/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  24. package/dist/resources/extensions/gsd/doctor-checks.js +113 -5
  25. package/dist/resources/extensions/gsd/doctor-environment.js +26 -17
  26. package/dist/resources/extensions/gsd/doctor-proactive.js +22 -0
  27. package/dist/resources/extensions/gsd/doctor.js +36 -0
  28. package/dist/resources/extensions/gsd/files.js +11 -2
  29. package/dist/resources/extensions/gsd/gitignore.js +54 -7
  30. package/dist/resources/extensions/gsd/guided-flow.js +5 -3
  31. package/dist/resources/extensions/gsd/health-widget-core.js +96 -0
  32. package/dist/resources/extensions/gsd/health-widget.js +97 -46
  33. package/dist/resources/extensions/gsd/index.js +10 -1
  34. package/dist/resources/extensions/gsd/migrate-external.js +55 -2
  35. package/dist/resources/extensions/gsd/milestone-ids.js +3 -2
  36. package/dist/resources/extensions/gsd/paths.js +74 -7
  37. package/dist/resources/extensions/gsd/post-unit-hooks.js +4 -1
  38. package/dist/resources/extensions/gsd/preferences-validation.js +54 -1
  39. package/dist/resources/extensions/gsd/preferences.js +2 -0
  40. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
  41. package/dist/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  42. package/dist/resources/extensions/gsd/roadmap-mutations.js +55 -0
  43. package/dist/resources/extensions/gsd/session-lock.js +26 -2
  44. package/dist/resources/extensions/gsd/state.js +2 -1
  45. package/dist/resources/extensions/gsd/templates/plan.md +8 -0
  46. package/dist/resources/extensions/gsd/worktree-resolver.js +12 -0
  47. package/dist/resources/extensions/mcp-client/index.js +2 -1
  48. package/dist/resources/extensions/remote-questions/remote-command.js +2 -22
  49. package/dist/resources/extensions/shared/mod.js +1 -1
  50. package/dist/resources/extensions/shared/sanitize.js +30 -0
  51. package/dist/resources/extensions/subagent/index.js +6 -14
  52. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +4 -4
  53. package/package.json +2 -1
  54. package/packages/native/dist/native.d.ts +0 -2
  55. package/packages/native/dist/native.js +0 -2
  56. package/packages/native/src/native.ts +0 -3
  57. package/packages/pi-agent-core/dist/agent-loop.d.ts +14 -0
  58. package/packages/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  59. package/packages/pi-agent-core/dist/agent-loop.js +24 -27
  60. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  61. package/packages/pi-agent-core/dist/agent.d.ts +1 -0
  62. package/packages/pi-agent-core/dist/agent.d.ts.map +1 -1
  63. package/packages/pi-agent-core/dist/agent.js +11 -22
  64. package/packages/pi-agent-core/dist/agent.js.map +1 -1
  65. package/packages/pi-agent-core/dist/proxy.d.ts +1 -25
  66. package/packages/pi-agent-core/dist/proxy.d.ts.map +1 -1
  67. package/packages/pi-agent-core/dist/proxy.js +3 -9
  68. package/packages/pi-agent-core/dist/proxy.js.map +1 -1
  69. package/packages/pi-agent-core/src/agent-loop.ts +30 -27
  70. package/packages/pi-agent-core/src/agent.ts +12 -23
  71. package/packages/pi-agent-core/src/proxy.ts +3 -9
  72. package/packages/pi-ai/dist/api-registry.d.ts +0 -2
  73. package/packages/pi-ai/dist/api-registry.d.ts.map +1 -1
  74. package/packages/pi-ai/dist/api-registry.js +0 -10
  75. package/packages/pi-ai/dist/api-registry.js.map +1 -1
  76. package/packages/pi-ai/dist/providers/anthropic.d.ts +0 -8
  77. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  78. package/packages/pi-ai/dist/providers/anthropic.js +1 -1
  79. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  80. package/packages/pi-ai/dist/providers/azure-openai-responses.d.ts.map +1 -1
  81. package/packages/pi-ai/dist/providers/azure-openai-responses.js +5 -41
  82. package/packages/pi-ai/dist/providers/azure-openai-responses.js.map +1 -1
  83. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts +0 -1
  84. package/packages/pi-ai/dist/providers/github-copilot-headers.d.ts.map +1 -1
  85. package/packages/pi-ai/dist/providers/github-copilot-headers.js +1 -1
  86. package/packages/pi-ai/dist/providers/github-copilot-headers.js.map +1 -1
  87. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts +1 -43
  88. package/packages/pi-ai/dist/providers/google-gemini-cli.d.ts.map +1 -1
  89. package/packages/pi-ai/dist/providers/google-gemini-cli.js +2 -2
  90. package/packages/pi-ai/dist/providers/google-gemini-cli.js.map +1 -1
  91. package/packages/pi-ai/dist/providers/google-shared.d.ts +0 -4
  92. package/packages/pi-ai/dist/providers/google-shared.d.ts.map +1 -1
  93. package/packages/pi-ai/dist/providers/google-shared.js +1 -1
  94. package/packages/pi-ai/dist/providers/google-shared.js.map +1 -1
  95. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  96. package/packages/pi-ai/dist/providers/openai-completions.js +10 -73
  97. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  98. package/packages/pi-ai/dist/providers/openai-responses.d.ts.map +1 -1
  99. package/packages/pi-ai/dist/providers/openai-responses.js +9 -80
  100. package/packages/pi-ai/dist/providers/openai-responses.js.map +1 -1
  101. package/packages/pi-ai/dist/providers/openai-shared.d.ts +65 -0
  102. package/packages/pi-ai/dist/providers/openai-shared.d.ts.map +1 -0
  103. package/packages/pi-ai/dist/providers/openai-shared.js +146 -0
  104. package/packages/pi-ai/dist/providers/openai-shared.js.map +1 -0
  105. package/packages/pi-ai/dist/providers/register-builtins.d.ts +0 -1
  106. package/packages/pi-ai/dist/providers/register-builtins.d.ts.map +1 -1
  107. package/packages/pi-ai/dist/providers/register-builtins.js +1 -1
  108. package/packages/pi-ai/dist/providers/register-builtins.js.map +1 -1
  109. package/packages/pi-ai/dist/utils/event-stream.d.ts +0 -2
  110. package/packages/pi-ai/dist/utils/event-stream.d.ts.map +1 -1
  111. package/packages/pi-ai/dist/utils/event-stream.js +0 -4
  112. package/packages/pi-ai/dist/utils/event-stream.js.map +1 -1
  113. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  114. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +7 -135
  115. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  116. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  117. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +7 -135
  118. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  119. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.d.ts +46 -0
  120. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.d.ts.map +1 -0
  121. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.js +160 -0
  122. package/packages/pi-ai/dist/utils/oauth/google-oauth-utils.js.map +1 -0
  123. package/packages/pi-ai/dist/utils/overflow.d.ts +0 -4
  124. package/packages/pi-ai/dist/utils/overflow.d.ts.map +1 -1
  125. package/packages/pi-ai/dist/utils/overflow.js +0 -6
  126. package/packages/pi-ai/dist/utils/overflow.js.map +1 -1
  127. package/packages/pi-ai/dist/utils/validation.d.ts +0 -8
  128. package/packages/pi-ai/dist/utils/validation.d.ts.map +1 -1
  129. package/packages/pi-ai/dist/utils/validation.js +0 -14
  130. package/packages/pi-ai/dist/utils/validation.js.map +1 -1
  131. package/packages/pi-ai/src/api-registry.ts +0 -12
  132. package/packages/pi-ai/src/providers/anthropic.ts +1 -1
  133. package/packages/pi-ai/src/providers/azure-openai-responses.ts +11 -45
  134. package/packages/pi-ai/src/providers/github-copilot-headers.ts +1 -1
  135. package/packages/pi-ai/src/providers/google-gemini-cli.ts +2 -2
  136. package/packages/pi-ai/src/providers/google-shared.ts +1 -1
  137. package/packages/pi-ai/src/providers/openai-completions.ts +16 -86
  138. package/packages/pi-ai/src/providers/openai-responses.ts +16 -96
  139. package/packages/pi-ai/src/providers/openai-shared.ts +193 -0
  140. package/packages/pi-ai/src/providers/register-builtins.ts +1 -1
  141. package/packages/pi-ai/src/utils/event-stream.ts +0 -5
  142. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +14 -162
  143. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +13 -161
  144. package/packages/pi-ai/src/utils/oauth/google-oauth-utils.ts +201 -0
  145. package/packages/pi-ai/src/utils/overflow.ts +1 -8
  146. package/packages/pi-ai/src/utils/validation.ts +0 -15
  147. package/packages/pi-coding-agent/dist/config.d.ts +0 -9
  148. package/packages/pi-coding-agent/dist/config.d.ts.map +1 -1
  149. package/packages/pi-coding-agent/dist/config.js +4 -8
  150. package/packages/pi-coding-agent/dist/config.js.map +1 -1
  151. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +16 -63
  152. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  153. package/packages/pi-coding-agent/dist/core/agent-session.js +104 -641
  154. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  155. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +0 -1
  156. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  157. package/packages/pi-coding-agent/dist/core/auth-storage.js +4 -35
  158. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  159. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  160. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js +5 -43
  161. package/packages/pi-coding-agent/dist/core/compaction/branch-summarization.js.map +1 -1
  162. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  163. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +11 -69
  164. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  165. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +40 -0
  166. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  167. package/packages/pi-coding-agent/dist/core/compaction/utils.js +78 -0
  168. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  169. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +77 -0
  170. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -0
  171. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +331 -0
  172. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -0
  173. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts +0 -4
  174. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  175. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js +1 -1
  176. package/packages/pi-coding-agent/dist/core/export-html/ansi-to-html.js.map +1 -1
  177. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +2 -2
  178. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  179. package/packages/pi-coding-agent/dist/core/extensions/index.js +1 -1
  180. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  181. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +15 -5
  182. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  183. package/packages/pi-coding-agent/dist/core/extensions/runner.js +129 -256
  184. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  185. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +49 -42
  186. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  187. package/packages/pi-coding-agent/dist/core/extensions/types.js +2 -21
  188. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  189. package/packages/pi-coding-agent/dist/core/keybindings.d.ts +0 -8
  190. package/packages/pi-coding-agent/dist/core/keybindings.d.ts.map +1 -1
  191. package/packages/pi-coding-agent/dist/core/keybindings.js +2 -2
  192. package/packages/pi-coding-agent/dist/core/keybindings.js.map +1 -1
  193. package/packages/pi-coding-agent/dist/core/lock-utils.d.ts +39 -0
  194. package/packages/pi-coding-agent/dist/core/lock-utils.d.ts.map +1 -0
  195. package/packages/pi-coding-agent/dist/core/lock-utils.js +89 -0
  196. package/packages/pi-coding-agent/dist/core/lock-utils.js.map +1 -0
  197. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts +0 -17
  198. package/packages/pi-coding-agent/dist/core/lsp/client.d.ts.map +1 -1
  199. package/packages/pi-coding-agent/dist/core/lsp/client.js +3 -62
  200. package/packages/pi-coding-agent/dist/core/lsp/client.js.map +1 -1
  201. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts +1 -1
  202. package/packages/pi-coding-agent/dist/core/lsp/config.d.ts.map +1 -1
  203. package/packages/pi-coding-agent/dist/core/lsp/config.js +2 -6
  204. package/packages/pi-coding-agent/dist/core/lsp/config.js.map +1 -1
  205. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts +0 -5
  206. package/packages/pi-coding-agent/dist/core/lsp/edits.d.ts.map +1 -1
  207. package/packages/pi-coding-agent/dist/core/lsp/edits.js +1 -1
  208. package/packages/pi-coding-agent/dist/core/lsp/edits.js.map +1 -1
  209. package/packages/pi-coding-agent/dist/core/lsp/index.d.ts.map +1 -1
  210. package/packages/pi-coding-agent/dist/core/lsp/index.js +52 -107
  211. package/packages/pi-coding-agent/dist/core/lsp/index.js.map +1 -1
  212. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts +0 -1
  213. package/packages/pi-coding-agent/dist/core/lsp/lspmux.d.ts.map +1 -1
  214. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js +3 -22
  215. package/packages/pi-coding-agent/dist/core/lsp/lspmux.js.map +1 -1
  216. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts +0 -1
  217. package/packages/pi-coding-agent/dist/core/lsp/types.d.ts.map +1 -1
  218. package/packages/pi-coding-agent/dist/core/lsp/types.js +0 -28
  219. package/packages/pi-coding-agent/dist/core/lsp/types.js.map +1 -1
  220. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts +1 -6
  221. package/packages/pi-coding-agent/dist/core/lsp/utils.d.ts.map +1 -1
  222. package/packages/pi-coding-agent/dist/core/lsp/utils.js +1 -28
  223. package/packages/pi-coding-agent/dist/core/lsp/utils.js.map +1 -1
  224. package/packages/pi-coding-agent/dist/core/messages.d.ts +0 -8
  225. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  226. package/packages/pi-coding-agent/dist/core/messages.js +5 -5
  227. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  228. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -3
  229. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  230. package/packages/pi-coding-agent/dist/core/model-registry.js +1 -3
  231. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  232. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts +1 -26
  233. package/packages/pi-coding-agent/dist/core/model-resolver.d.ts.map +1 -1
  234. package/packages/pi-coding-agent/dist/core/model-resolver.js +3 -59
  235. package/packages/pi-coding-agent/dist/core/model-resolver.js.map +1 -1
  236. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  237. package/packages/pi-coding-agent/dist/core/package-manager.js +2 -4
  238. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  239. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts +0 -17
  240. package/packages/pi-coding-agent/dist/core/prompt-templates.d.ts.map +1 -1
  241. package/packages/pi-coding-agent/dist/core/prompt-templates.js +2 -2
  242. package/packages/pi-coding-agent/dist/core/prompt-templates.js.map +1 -1
  243. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +2 -4
  244. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  245. package/packages/pi-coding-agent/dist/core/resource-loader.js +46 -60
  246. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  247. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts +87 -0
  248. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -0
  249. package/packages/pi-coding-agent/dist/core/retry-handler.js +295 -0
  250. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -0
  251. package/packages/pi-coding-agent/dist/core/session-manager.d.ts +0 -5
  252. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  253. package/packages/pi-coding-agent/dist/core/session-manager.js +5 -32
  254. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  255. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +8 -12
  256. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  257. package/packages/pi-coding-agent/dist/core/settings-manager.js +78 -168
  258. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  260. package/packages/pi-coding-agent/dist/core/skills.js +1 -3
  261. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  262. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  263. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  264. package/packages/pi-coding-agent/dist/index.js +1 -1
  265. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  266. package/packages/pi-coding-agent/dist/migrations.d.ts +0 -16
  267. package/packages/pi-coding-agent/dist/migrations.d.ts.map +1 -1
  268. package/packages/pi-coding-agent/dist/migrations.js +2 -2
  269. package/packages/pi-coding-agent/dist/migrations.js.map +1 -1
  270. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts +0 -2
  271. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js +2 -2
  273. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  274. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.d.ts +1 -1
  275. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  276. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js +9 -26
  277. package/packages/pi-coding-agent/dist/modes/interactive/components/session-selector.js.map +1 -1
  278. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  279. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js +1 -13
  280. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-execution.js.map +1 -1
  281. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.d.ts +44 -0
  282. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.d.ts.map +1 -0
  283. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js +61 -0
  284. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-render-utils.js.map +1 -0
  285. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  286. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js +6 -9
  287. package/packages/pi-coding-agent/dist/modes/interactive/components/tree-selector.js.map +1 -1
  288. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts +1 -24
  289. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  290. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +50 -512
  291. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  292. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts +71 -0
  293. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.d.ts.map +1 -0
  294. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js +514 -0
  295. package/packages/pi-coding-agent/dist/modes/interactive/slash-command-handlers.js.map +1 -0
  296. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +65 -4
  297. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  298. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js +6 -23
  299. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  300. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts +12 -0
  301. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  302. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +175 -0
  303. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -0
  304. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.d.ts +6 -0
  305. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.d.ts.map +1 -0
  306. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js +15 -0
  307. package/packages/pi-coding-agent/dist/modes/interactive/utils/shorten-path.js.map +1 -0
  308. package/packages/pi-coding-agent/dist/modes/print-mode.d.ts.map +1 -1
  309. package/packages/pi-coding-agent/dist/modes/print-mode.js +2 -30
  310. package/packages/pi-coding-agent/dist/modes/print-mode.js.map +1 -1
  311. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  312. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js +2 -28
  313. package/packages/pi-coding-agent/dist/modes/rpc/rpc-mode.js.map +1 -1
  314. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.d.ts +19 -0
  315. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.d.ts.map +1 -0
  316. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.js +45 -0
  317. package/packages/pi-coding-agent/dist/modes/shared/command-context-actions.js.map +1 -0
  318. package/packages/pi-coding-agent/dist/utils/changelog.d.ts +0 -4
  319. package/packages/pi-coding-agent/dist/utils/changelog.d.ts.map +1 -1
  320. package/packages/pi-coding-agent/dist/utils/changelog.js +1 -1
  321. package/packages/pi-coding-agent/dist/utils/changelog.js.map +1 -1
  322. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts +0 -1
  323. package/packages/pi-coding-agent/dist/utils/clipboard-image.d.ts.map +1 -1
  324. package/packages/pi-coding-agent/dist/utils/clipboard-image.js +1 -1
  325. package/packages/pi-coding-agent/dist/utils/clipboard-image.js.map +1 -1
  326. package/packages/pi-coding-agent/dist/utils/error.d.ts +5 -0
  327. package/packages/pi-coding-agent/dist/utils/error.d.ts.map +1 -0
  328. package/packages/pi-coding-agent/dist/utils/error.js +7 -0
  329. package/packages/pi-coding-agent/dist/utils/error.js.map +1 -0
  330. package/packages/pi-coding-agent/dist/utils/photon.d.ts +0 -19
  331. package/packages/pi-coding-agent/dist/utils/photon.d.ts.map +1 -1
  332. package/packages/pi-coding-agent/dist/utils/photon.js +1 -120
  333. package/packages/pi-coding-agent/dist/utils/photon.js.map +1 -1
  334. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts +0 -1
  335. package/packages/pi-coding-agent/dist/utils/tools-manager.d.ts.map +1 -1
  336. package/packages/pi-coding-agent/dist/utils/tools-manager.js +1 -1
  337. package/packages/pi-coding-agent/dist/utils/tools-manager.js.map +1 -1
  338. package/packages/pi-coding-agent/package.json +1 -1
  339. package/packages/pi-coding-agent/src/config.ts +5 -10
  340. package/packages/pi-coding-agent/src/core/agent-session.ts +117 -745
  341. package/packages/pi-coding-agent/src/core/auth-storage.ts +4 -38
  342. package/packages/pi-coding-agent/src/core/compaction/branch-summarization.ts +7 -53
  343. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +14 -74
  344. package/packages/pi-coding-agent/src/core/compaction/utils.ts +100 -0
  345. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +424 -0
  346. package/packages/pi-coding-agent/src/core/export-html/ansi-to-html.ts +1 -1
  347. package/packages/pi-coding-agent/src/core/extensions/index.ts +1 -21
  348. package/packages/pi-coding-agent/src/core/extensions/runner.ts +119 -256
  349. package/packages/pi-coding-agent/src/core/extensions/types.ts +50 -69
  350. package/packages/pi-coding-agent/src/core/keybindings.ts +2 -2
  351. package/packages/pi-coding-agent/src/core/lock-utils.ts +113 -0
  352. package/packages/pi-coding-agent/src/core/lsp/client.ts +3 -73
  353. package/packages/pi-coding-agent/src/core/lsp/config.ts +2 -10
  354. package/packages/pi-coding-agent/src/core/lsp/edits.ts +1 -1
  355. package/packages/pi-coding-agent/src/core/lsp/index.ts +83 -152
  356. package/packages/pi-coding-agent/src/core/lsp/lspmux.ts +3 -23
  357. package/packages/pi-coding-agent/src/core/lsp/types.ts +0 -29
  358. package/packages/pi-coding-agent/src/core/lsp/utils.ts +1 -33
  359. package/packages/pi-coding-agent/src/core/messages.ts +5 -5
  360. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -2
  361. package/packages/pi-coding-agent/src/core/model-resolver.ts +3 -77
  362. package/packages/pi-coding-agent/src/core/package-manager.ts +1 -4
  363. package/packages/pi-coding-agent/src/core/prompt-templates.ts +2 -2
  364. package/packages/pi-coding-agent/src/core/resource-loader.ts +56 -69
  365. package/packages/pi-coding-agent/src/core/retry-handler.ts +359 -0
  366. package/packages/pi-coding-agent/src/core/session-manager.ts +5 -34
  367. package/packages/pi-coding-agent/src/core/settings-manager.ts +87 -166
  368. package/packages/pi-coding-agent/src/core/skills.ts +1 -4
  369. package/packages/pi-coding-agent/src/index.ts +1 -7
  370. package/packages/pi-coding-agent/src/migrations.ts +2 -2
  371. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector-search.ts +2 -2
  372. package/packages/pi-coding-agent/src/modes/interactive/components/session-selector.ts +17 -29
  373. package/packages/pi-coding-agent/src/modes/interactive/components/tool-execution.ts +1 -13
  374. package/packages/pi-coding-agent/src/modes/interactive/components/tree-render-utils.ts +81 -0
  375. package/packages/pi-coding-agent/src/modes/interactive/components/tree-selector.ts +14 -19
  376. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +50 -561
  377. package/packages/pi-coding-agent/src/modes/interactive/slash-command-handlers.ts +653 -0
  378. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +7 -26
  379. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +196 -0
  380. package/packages/pi-coding-agent/src/modes/interactive/utils/shorten-path.ts +14 -0
  381. package/packages/pi-coding-agent/src/modes/print-mode.ts +2 -30
  382. package/packages/pi-coding-agent/src/modes/rpc/rpc-mode.ts +2 -28
  383. package/packages/pi-coding-agent/src/modes/shared/command-context-actions.ts +53 -0
  384. package/packages/pi-coding-agent/src/utils/changelog.ts +1 -1
  385. package/packages/pi-coding-agent/src/utils/clipboard-image.ts +1 -1
  386. package/packages/pi-coding-agent/src/utils/error.ts +6 -0
  387. package/packages/pi-coding-agent/src/utils/photon.ts +0 -137
  388. package/packages/pi-coding-agent/src/utils/tools-manager.ts +1 -1
  389. package/packages/pi-tui/dist/components/editor.d.ts +0 -10
  390. package/packages/pi-tui/dist/components/editor.d.ts.map +1 -1
  391. package/packages/pi-tui/dist/components/editor.js +1 -1
  392. package/packages/pi-tui/dist/components/editor.js.map +1 -1
  393. package/packages/pi-tui/dist/components/markdown.d.ts +5 -0
  394. package/packages/pi-tui/dist/components/markdown.d.ts.map +1 -1
  395. package/packages/pi-tui/dist/components/markdown.js +25 -31
  396. package/packages/pi-tui/dist/components/markdown.js.map +1 -1
  397. package/packages/pi-tui/dist/keys.d.ts +0 -4
  398. package/packages/pi-tui/dist/keys.d.ts.map +1 -1
  399. package/packages/pi-tui/dist/keys.js +94 -162
  400. package/packages/pi-tui/dist/keys.js.map +1 -1
  401. package/packages/pi-tui/dist/overlay-layout.d.ts +55 -0
  402. package/packages/pi-tui/dist/overlay-layout.d.ts.map +1 -0
  403. package/packages/pi-tui/dist/overlay-layout.js +288 -0
  404. package/packages/pi-tui/dist/overlay-layout.js.map +1 -0
  405. package/packages/pi-tui/dist/tui.d.ts +0 -22
  406. package/packages/pi-tui/dist/tui.d.ts.map +1 -1
  407. package/packages/pi-tui/dist/tui.js +6 -272
  408. package/packages/pi-tui/dist/tui.js.map +1 -1
  409. package/packages/pi-tui/dist/utils.d.ts +0 -7
  410. package/packages/pi-tui/dist/utils.d.ts.map +1 -1
  411. package/packages/pi-tui/dist/utils.js +0 -44
  412. package/packages/pi-tui/dist/utils.js.map +1 -1
  413. package/packages/pi-tui/src/components/editor.ts +1 -1
  414. package/packages/pi-tui/src/components/markdown.ts +25 -29
  415. package/packages/pi-tui/src/keys.ts +94 -173
  416. package/packages/pi-tui/src/overlay-layout.ts +372 -0
  417. package/packages/pi-tui/src/tui.ts +11 -312
  418. package/packages/pi-tui/src/utils.ts +0 -43
  419. package/pkg/dist/core/export-html/ansi-to-html.d.ts +0 -4
  420. package/pkg/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  421. package/pkg/dist/core/export-html/ansi-to-html.js +1 -1
  422. package/pkg/dist/core/export-html/ansi-to-html.js.map +1 -1
  423. package/pkg/dist/modes/interactive/theme/theme.d.ts +65 -4
  424. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  425. package/pkg/dist/modes/interactive/theme/theme.js +6 -23
  426. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  427. package/pkg/dist/modes/interactive/theme/themes.d.ts +12 -0
  428. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -0
  429. package/pkg/dist/modes/interactive/theme/themes.js +175 -0
  430. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -0
  431. package/pkg/package.json +1 -1
  432. package/src/resources/extensions/async-jobs/await-tool.ts +0 -2
  433. package/src/resources/extensions/async-jobs/job-manager.ts +0 -7
  434. package/src/resources/extensions/bg-shell/output-formatter.ts +0 -17
  435. package/src/resources/extensions/bg-shell/process-manager.ts +0 -4
  436. package/src/resources/extensions/bg-shell/types.ts +0 -12
  437. package/src/resources/extensions/context7/index.ts +7 -0
  438. package/src/resources/extensions/get-secrets-from-user.ts +2 -35
  439. package/src/resources/extensions/google-search/index.ts +7 -0
  440. package/src/resources/extensions/gsd/auto-dispatch.ts +49 -1
  441. package/src/resources/extensions/gsd/auto-loop.ts +11 -1
  442. package/src/resources/extensions/gsd/auto-recovery.ts +39 -0
  443. package/src/resources/extensions/gsd/auto-start.ts +42 -2
  444. package/src/resources/extensions/gsd/auto.ts +61 -3
  445. package/src/resources/extensions/gsd/changelog.ts +213 -0
  446. package/src/resources/extensions/gsd/commands-bootstrap.ts +1 -0
  447. package/src/resources/extensions/gsd/commands-handlers.ts +2 -2
  448. package/src/resources/extensions/gsd/commands-inspect.ts +10 -3
  449. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +5 -1
  450. package/src/resources/extensions/gsd/commands.ts +9 -1
  451. package/src/resources/extensions/gsd/docs/preferences-reference.md +10 -0
  452. package/src/resources/extensions/gsd/doctor-checks.ts +107 -5
  453. package/src/resources/extensions/gsd/doctor-environment.ts +26 -16
  454. package/src/resources/extensions/gsd/doctor-proactive.ts +24 -0
  455. package/src/resources/extensions/gsd/doctor-types.ts +9 -1
  456. package/src/resources/extensions/gsd/doctor.ts +35 -0
  457. package/src/resources/extensions/gsd/files.ts +12 -2
  458. package/src/resources/extensions/gsd/gitignore.ts +54 -7
  459. package/src/resources/extensions/gsd/guided-flow.ts +5 -3
  460. package/src/resources/extensions/gsd/health-widget-core.ts +129 -0
  461. package/src/resources/extensions/gsd/health-widget.ts +103 -59
  462. package/src/resources/extensions/gsd/index.ts +10 -1
  463. package/src/resources/extensions/gsd/migrate-external.ts +47 -2
  464. package/src/resources/extensions/gsd/milestone-ids.ts +3 -2
  465. package/src/resources/extensions/gsd/paths.ts +73 -7
  466. package/src/resources/extensions/gsd/post-unit-hooks.ts +5 -1
  467. package/src/resources/extensions/gsd/preferences-validation.ts +54 -1
  468. package/src/resources/extensions/gsd/preferences.ts +2 -0
  469. package/src/resources/extensions/gsd/prompts/complete-milestone.md +2 -0
  470. package/src/resources/extensions/gsd/prompts/validate-milestone.md +2 -0
  471. package/src/resources/extensions/gsd/roadmap-mutations.ts +66 -0
  472. package/src/resources/extensions/gsd/session-lock.ts +29 -2
  473. package/src/resources/extensions/gsd/state.ts +2 -1
  474. package/src/resources/extensions/gsd/templates/plan.md +8 -0
  475. package/src/resources/extensions/gsd/tests/commands-inspect-open-db.test.ts +46 -0
  476. package/src/resources/extensions/gsd/tests/doctor-git.test.ts +98 -2
  477. package/src/resources/extensions/gsd/tests/doctor-runtime.test.ts +59 -3
  478. package/src/resources/extensions/gsd/tests/files-loadfile-eisdir.test.ts +20 -0
  479. package/src/resources/extensions/gsd/tests/gitignore-tracked-gsd.test.ts +214 -0
  480. package/src/resources/extensions/gsd/tests/health-widget.test.ts +158 -0
  481. package/src/resources/extensions/gsd/tests/paths.test.ts +113 -0
  482. package/src/resources/extensions/gsd/tests/preferences.test.ts +40 -2
  483. package/src/resources/extensions/gsd/tests/queue-reorder-e2e.test.ts +26 -0
  484. package/src/resources/extensions/gsd/tests/test-utils.ts +165 -0
  485. package/src/resources/extensions/gsd/tests/validate-directory.test.ts +15 -0
  486. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +7 -0
  487. package/src/resources/extensions/gsd/tests/worktree-sync-milestones.test.ts +32 -0
  488. package/src/resources/extensions/gsd/worktree-resolver.ts +11 -0
  489. package/src/resources/extensions/mcp-client/index.ts +2 -1
  490. package/src/resources/extensions/remote-questions/remote-command.ts +2 -23
  491. package/src/resources/extensions/shared/mod.ts +1 -1
  492. package/src/resources/extensions/shared/sanitize.ts +36 -0
  493. package/src/resources/extensions/subagent/index.ts +6 -12
  494. package/src/resources/skills/create-gsd-extension/references/events-reference.md +4 -4
  495. package/dist/resources/extensions/shared/wizard-ui.js +0 -478
  496. package/packages/pi-coding-agent/dist/modes/interactive/theme/dark.json +0 -85
  497. package/packages/pi-coding-agent/dist/modes/interactive/theme/light.json +0 -84
  498. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.json +0 -335
  499. package/packages/pi-coding-agent/src/modes/interactive/theme/dark.json +0 -85
  500. package/packages/pi-coding-agent/src/modes/interactive/theme/light.json +0 -84
  501. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.json +0 -335
  502. package/pkg/dist/modes/interactive/theme/dark.json +0 -85
  503. package/pkg/dist/modes/interactive/theme/light.json +0 -84
  504. package/pkg/dist/modes/interactive/theme/theme-schema.json +0 -335
  505. package/src/resources/extensions/shared/wizard-ui.ts +0 -551
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Shared test utilities for GSD extension tests.
3
+ *
4
+ * Provides cross-platform helpers for creating temporary git repos,
5
+ * safe cleanup, file creation, and shell-free git operations.
6
+ *
7
+ * Usage:
8
+ * import { git, makeTempRepo, cleanup, createFile } from "./test-utils.ts";
9
+ */
10
+
11
+ import { execFileSync } from "node:child_process";
12
+ import {
13
+ existsSync,
14
+ mkdirSync,
15
+ mkdtempSync,
16
+ readFileSync,
17
+ rmSync,
18
+ statSync,
19
+ writeFileSync,
20
+ } from "node:fs";
21
+ import { dirname, join } from "node:path";
22
+ import { tmpdir } from "node:os";
23
+
24
+ /**
25
+ * Shell-free git helper — uses execFileSync to bypass shell entirely.
26
+ * No quoting issues, no Windows cmd.exe incompatibilities.
27
+ *
28
+ * @param cwd - Working directory for git command
29
+ * @param args - Git arguments (e.g., "add", "-A")
30
+ * @returns trimmed stdout
31
+ */
32
+ export function git(cwd: string, ...args: string[]): string {
33
+ return execFileSync("git", args, {
34
+ cwd,
35
+ encoding: "utf-8",
36
+ stdio: "pipe",
37
+ }).trim();
38
+ }
39
+
40
+ /**
41
+ * Create a temporary git repository with an initial commit.
42
+ * Configures user.email, user.name, and core.autocrlf=false for
43
+ * consistent behavior across platforms.
44
+ *
45
+ * @param prefix - Optional prefix for the temp directory name
46
+ * @returns absolute path to the temp repo
47
+ */
48
+ export function makeTempRepo(prefix: string = "gsd-test-"): string {
49
+ const dir = mkdtempSync(join(tmpdir(), prefix));
50
+ git(dir, "init");
51
+ git(dir, "config", "user.email", "test@test.com");
52
+ git(dir, "config", "user.name", "Test");
53
+ git(dir, "config", "core.autocrlf", "false");
54
+ writeFileSync(join(dir, "README.md"), "# init\n");
55
+ git(dir, "add", "-A");
56
+ git(dir, "commit", "-m", "init");
57
+ git(dir, "branch", "-M", "main");
58
+ return dir;
59
+ }
60
+
61
+ /**
62
+ * Create a temporary directory (not a git repo).
63
+ *
64
+ * @param prefix - Optional prefix for the temp directory name
65
+ * @returns absolute path to the temp directory
66
+ */
67
+ export function makeTempDir(prefix: string = "gsd-test-"): string {
68
+ return mkdtempSync(join(tmpdir(), prefix));
69
+ }
70
+
71
+ /**
72
+ * Safely clean up a temporary directory.
73
+ * Non-fatal — Windows may hold file descriptors briefly.
74
+ */
75
+ export function cleanup(dir: string): void {
76
+ try {
77
+ rmSync(dir, { recursive: true, force: true });
78
+ } catch {
79
+ // ignore — Windows may hold file descriptors briefly after test
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Create a file with intermediate directories.
85
+ *
86
+ * @param base - Base directory
87
+ * @param relativePath - Relative path within base (e.g., "src/index.ts")
88
+ * @param content - File content (defaults to empty string)
89
+ * @returns absolute path to the created file
90
+ */
91
+ export function createFile(base: string, relativePath: string, content: string = ""): string {
92
+ const fullPath = join(base, relativePath);
93
+ mkdirSync(dirname(fullPath), { recursive: true });
94
+ writeFileSync(fullPath, content, "utf-8");
95
+ return fullPath;
96
+ }
97
+
98
+ /**
99
+ * Safely read a file, returning null if it doesn't exist or is a directory.
100
+ * Prevents EISDIR errors.
101
+ */
102
+ export function safeReadFile(filePath: string): string | null {
103
+ try {
104
+ if (!existsSync(filePath)) return null;
105
+ if (!statSync(filePath).isFile()) return null;
106
+ return readFileSync(filePath, "utf-8");
107
+ } catch {
108
+ return null;
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Create a minimal GSD milestone structure in a temp directory.
114
+ *
115
+ * @param base - Base directory (should have .gsd/ or be a temp repo)
116
+ * @param mid - Milestone ID (e.g., "M001")
117
+ * @param options - What to create
118
+ */
119
+ export function writeMilestoneFixture(
120
+ base: string,
121
+ mid: string,
122
+ options: {
123
+ roadmap?: string;
124
+ context?: string;
125
+ summary?: string;
126
+ validation?: string;
127
+ slices?: Array<{
128
+ id: string;
129
+ plan?: string;
130
+ summary?: string;
131
+ uat?: string;
132
+ }>;
133
+ } = {},
134
+ ): void {
135
+ const milestoneDir = join(base, ".gsd", "milestones", mid);
136
+ mkdirSync(milestoneDir, { recursive: true });
137
+
138
+ if (options.roadmap) {
139
+ writeFileSync(join(milestoneDir, `${mid}-ROADMAP.md`), options.roadmap);
140
+ }
141
+ if (options.context) {
142
+ writeFileSync(join(milestoneDir, `${mid}-CONTEXT.md`), options.context);
143
+ }
144
+ if (options.summary) {
145
+ writeFileSync(join(milestoneDir, `${mid}-SUMMARY.md`), options.summary);
146
+ }
147
+ if (options.validation) {
148
+ writeFileSync(join(milestoneDir, `${mid}-VALIDATION.md`), options.validation);
149
+ }
150
+ if (options.slices) {
151
+ for (const slice of options.slices) {
152
+ const sliceDir = join(milestoneDir, "slices", slice.id);
153
+ mkdirSync(sliceDir, { recursive: true });
154
+ if (slice.plan) {
155
+ writeFileSync(join(sliceDir, `${slice.id}-PLAN.md`), slice.plan);
156
+ }
157
+ if (slice.summary) {
158
+ writeFileSync(join(sliceDir, `${slice.id}-SUMMARY.md`), slice.summary);
159
+ }
160
+ if (slice.uat) {
161
+ writeFileSync(join(sliceDir, `${slice.id}-UAT.md`), slice.uat);
162
+ }
163
+ }
164
+ }
165
+ }
@@ -101,6 +101,21 @@ test("validateDirectory: subdirectory of home is NOT blocked", () => {
101
101
  }
102
102
  });
103
103
 
104
+ // Regression test for #1317: GSD worktree inside $HOME must not be blocked even
105
+ // when the resolved project root equals $HOME (e.g. home dir is a git repo).
106
+ test("validateDirectory: GSD worktree path nested under home is NOT blocked (#1317)", () => {
107
+ const worktreePath = join(homedir(), ".gsd", "worktrees", "M001");
108
+ mkdirSync(worktreePath, { recursive: true });
109
+ try {
110
+ // The worktree CWD itself is a valid location — it must pass.
111
+ const result = validateDirectory(worktreePath);
112
+ assert.equal(result.safe, true, "GSD worktree path should be safe to run in");
113
+ assert.equal(result.severity, "ok");
114
+ } finally {
115
+ rmSync(join(homedir(), ".gsd", "worktrees", "M001"), { recursive: true, force: true });
116
+ }
117
+ });
118
+
104
119
  // ─── Temp directory root ─────────────────────────────────────────────────────────
105
120
 
106
121
  test("validateDirectory: temp directory root is blocked", () => {
@@ -104,6 +104,11 @@ test("isValidationTerminal returns true for verdict: needs-remediation (#832)",
104
104
  assert.equal(isValidationTerminal(content), true);
105
105
  });
106
106
 
107
+ test("isValidationTerminal returns true for verdict: passed (#1429)", () => {
108
+ const content = "---\nverdict: passed\nremediation_round: 0\n---\n\n# Validation";
109
+ assert.equal(isValidationTerminal(content), true);
110
+ });
111
+
107
112
  test("isValidationTerminal returns false for missing frontmatter", () => {
108
113
  const content = "# Validation\nNo frontmatter here.";
109
114
  assert.equal(isValidationTerminal(content), false);
@@ -196,6 +201,7 @@ test("dispatch rule matches validating-milestone phase", async () => {
196
201
  try {
197
202
  // Set up minimal milestone structure for the prompt builder
198
203
  writeRoadmap(base, "M001", ALL_DONE_ROADMAP);
204
+ writeSliceSummary(base, "M001", "S01", "# S01 Summary\nDone."); // Guard requires slice summaries (#1368)
199
205
 
200
206
  const ctx: DispatchContext = {
201
207
  basePath: base,
@@ -231,6 +237,7 @@ test("dispatch rule skips when skip_milestone_validation preference is set", asy
231
237
  const base = makeTmpBase();
232
238
  try {
233
239
  writeRoadmap(base, "M001", ALL_DONE_ROADMAP);
240
+ writeSliceSummary(base, "M001", "S01", "# S01 Summary\nDone."); // Guard requires slice summaries (#1368)
234
241
 
235
242
  const ctx: DispatchContext = {
236
243
  basePath: base,
@@ -19,6 +19,7 @@ import { join } from 'node:path';
19
19
  import { tmpdir } from 'node:os';
20
20
 
21
21
  import { syncProjectRootToWorktree } from '../auto-worktree-sync.ts';
22
+ import { syncGsdStateToWorktree } from '../auto-worktree.ts';
22
23
  import { createTestContext } from './test-helpers.ts';
23
24
 
24
25
  const { assertTrue, report } = createTestContext();
@@ -148,6 +149,37 @@ async function main(): Promise<void> {
148
149
  assertTrue(true, 'no crash on missing directories');
149
150
  }
150
151
 
152
+ // ─── 7. milestones/ directory created in worktree when missing ────────
153
+ console.log('\n=== 7. milestones/ directory created in worktree when missing ===');
154
+ {
155
+ const mainBase = createBase('main');
156
+ const wtBase = mkdtempSync(join(tmpdir(), 'gsd-wt-sync-wt-'));
157
+
158
+ try {
159
+ // Worktree has .gsd/ but NO milestones/ subdirectory
160
+ mkdirSync(join(wtBase, '.gsd'), { recursive: true });
161
+
162
+ // Main repo has M001
163
+ const m001Dir = join(mainBase, '.gsd', 'milestones', 'M001');
164
+ mkdirSync(m001Dir, { recursive: true });
165
+ writeFileSync(join(m001Dir, 'M001-CONTEXT.md'), '# M001 Context');
166
+ writeFileSync(join(m001Dir, 'M001-ROADMAP.md'), '# M001 Roadmap');
167
+
168
+ assertTrue(!existsSync(join(wtBase, '.gsd', 'milestones')), 'milestones/ missing before sync');
169
+
170
+ const result = syncGsdStateToWorktree(mainBase, wtBase);
171
+
172
+ assertTrue(existsSync(join(wtBase, '.gsd', 'milestones')), 'milestones/ created in worktree');
173
+ assertTrue(existsSync(join(wtBase, '.gsd', 'milestones', 'M001')), 'M001 synced to worktree');
174
+ assertTrue(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-CONTEXT.md')), 'M001 CONTEXT synced');
175
+ assertTrue(existsSync(join(wtBase, '.gsd', 'milestones', 'M001', 'M001-ROADMAP.md')), 'M001 ROADMAP synced');
176
+ assertTrue(result.synced.length > 0, 'sync reported files');
177
+ } finally {
178
+ cleanup(mainBase);
179
+ rmSync(wtBase, { recursive: true, force: true });
180
+ }
181
+ }
182
+
151
183
  report();
152
184
  }
153
185
 
@@ -13,6 +13,8 @@
13
13
  * `process.chdir()` internally — this class MUST NOT double-chdir.
14
14
  */
15
15
 
16
+ import { existsSync, unlinkSync } from "node:fs";
17
+ import { join } from "node:path";
16
18
  import type { AutoSession } from "./auto/session.js";
17
19
  import { debugLog } from "./debug-logger.js";
18
20
 
@@ -372,6 +374,15 @@ export class WorktreeResolver {
372
374
  });
373
375
  ctx.notify(`Milestone merge failed: ${msg}`, "warning");
374
376
 
377
+ // Clean up stale merge state left by failed squash-merge (#1389)
378
+ try {
379
+ const gitDir = join(originalBase || this.s.basePath, ".git");
380
+ for (const f of ["SQUASH_MSG", "MERGE_HEAD", "MERGE_MSG"]) {
381
+ const p = join(gitDir, f);
382
+ if (existsSync(p)) unlinkSync(p);
383
+ }
384
+ } catch { /* best-effort */ }
385
+
375
386
  // Error recovery: always restore to project root
376
387
  if (originalBase) {
377
388
  try {
@@ -354,7 +354,8 @@ export default function (pi: ExtensionAPI) {
354
354
  description: "Tool name on that server, e.g. 'railway_list_projects'",
355
355
  }),
356
356
  args: Type.Optional(
357
- Type.Record(Type.String(), Type.Unknown(), {
357
+ Type.Object({}, {
358
+ additionalProperties: true,
358
359
  description:
359
360
  "Tool arguments as key-value pairs matching the tool's input schema",
360
361
  }),
@@ -4,12 +4,12 @@
4
4
 
5
5
  import type { ExtensionAPI, ExtensionCommandContext } from "@gsd/pi-coding-agent";
6
6
  import { AuthStorage } from "@gsd/pi-coding-agent";
7
- import { CURSOR_MARKER, Editor, type EditorTheme, Key, matchesKey, truncateToWidth } from "@gsd/pi-tui";
7
+ import { Editor, type EditorTheme, Key, matchesKey, truncateToWidth } from "@gsd/pi-tui";
8
8
  import { existsSync, readFileSync, writeFileSync, mkdirSync } from "node:fs";
9
9
  import { dirname, join } from "node:path";
10
10
  import { getGlobalGSDPreferencesPath, loadEffectiveGSDPreferences } from "../gsd/preferences.js";
11
11
  import { getRemoteConfigStatus, isValidChannelId, resolveRemoteConfig } from "./config.js";
12
- import { sanitizeError } from "../shared/sanitize.js";
12
+ import { maskEditorLine, sanitizeError } from "../shared/mod.js";
13
13
  import { getLatestPromptSummary } from "./status.js";
14
14
 
15
15
  export async function handleRemote(
@@ -353,27 +353,6 @@ function removeRemoteQuestionsConfig(): void {
353
353
  writeFileSync(prefsPath, next, "utf-8");
354
354
  }
355
355
 
356
- function maskEditorLine(line: string): string {
357
- let output = "";
358
- let i = 0;
359
- while (i < line.length) {
360
- if (line.startsWith(CURSOR_MARKER, i)) {
361
- output += CURSOR_MARKER;
362
- i += CURSOR_MARKER.length;
363
- continue;
364
- }
365
- const ansiMatch = /^\x1b\[[0-9;]*m/.exec(line.slice(i));
366
- if (ansiMatch) {
367
- output += ansiMatch[0];
368
- i += ansiMatch[0].length;
369
- continue;
370
- }
371
- output += line[i] === " " ? " " : "*";
372
- i += 1;
373
- }
374
- return output;
375
- }
376
-
377
356
  async function promptMaskedInput(ctx: ExtensionCommandContext, label: string, hint: string): Promise<string | null> {
378
357
  if (!ctx.hasUI) return null;
379
358
  return ctx.ui.custom<string | null>((tui: any, theme: any, _kb: any, done: (r: string | null) => void) => {
@@ -28,6 +28,6 @@ export { showInterviewRound } from "./interview-ui.js";
28
28
  export type { Question, QuestionOption, RoundResult } from "./interview-ui.js";
29
29
  export { showNextAction } from "./next-action-ui.js";
30
30
  export { showConfirm } from "./confirm-ui.js";
31
- export { sanitizeError } from "./sanitize.js";
31
+ export { sanitizeError, maskEditorLine } from "./sanitize.js";
32
32
  export { formatDateShort, truncateWithEllipsis } from "./format-utils.js";
33
33
  export { splitFrontmatter, parseFrontmatterMap } from "./frontmatter.js";
@@ -1,7 +1,10 @@
1
1
  /**
2
2
  * Sanitize error messages by redacting token-like strings before surfacing.
3
+ * Also provides maskEditorLine for masking sensitive TUI editor input.
3
4
  */
4
5
 
6
+ import { CURSOR_MARKER } from "@gsd/pi-tui";
7
+
5
8
  const TOKEN_PATTERNS = [
6
9
  /xoxb-[A-Za-z0-9\-]+/g, // Slack bot tokens
7
10
  /xoxp-[A-Za-z0-9\-]+/g, // Slack user tokens
@@ -17,3 +20,36 @@ export function sanitizeError(msg: string): string {
17
20
  }
18
21
  return sanitized;
19
22
  }
23
+
24
+ /**
25
+ * Replace editor visible text with masked characters while preserving
26
+ * ANSI cursor/sequencer codes. Keeps border/metadata lines readable.
27
+ */
28
+ export function maskEditorLine(line: string): string {
29
+ if (line.startsWith("─")) {
30
+ return line;
31
+ }
32
+
33
+ let output = "";
34
+ let i = 0;
35
+ while (i < line.length) {
36
+ if (line.startsWith(CURSOR_MARKER, i)) {
37
+ output += CURSOR_MARKER;
38
+ i += CURSOR_MARKER.length;
39
+ continue;
40
+ }
41
+
42
+ const ansiMatch = /^\x1b\[[0-9;]*m/.exec(line.slice(i));
43
+ if (ansiMatch) {
44
+ output += ansiMatch[0];
45
+ i += ansiMatch[0].length;
46
+ continue;
47
+ }
48
+
49
+ const ch = line[i] as string;
50
+ output += ch === " " ? " " : "*";
51
+ i += 1;
52
+ }
53
+
54
+ return output;
55
+ }
@@ -23,6 +23,7 @@ import { StringEnum } from "@gsd/pi-ai";
23
23
  import { type ExtensionAPI, getMarkdownTheme } from "@gsd/pi-coding-agent";
24
24
  import { Container, Markdown, Spacer, Text } from "@gsd/pi-tui";
25
25
  import { Type } from "@sinclair/typebox";
26
+ import { formatTokenCount } from "../shared/mod.js";
26
27
  import { type AgentConfig, type AgentScope, discoverAgents } from "./agents.js";
27
28
  import {
28
29
  type IsolationEnvironment,
@@ -76,13 +77,6 @@ async function stopLiveSubagents(): Promise<void> {
76
77
  }
77
78
  }
78
79
 
79
- function formatTokens(count: number): string {
80
- if (count < 1000) return count.toString();
81
- if (count < 10000) return `${(count / 1000).toFixed(1)}k`;
82
- if (count < 1000000) return `${Math.round(count / 1000)}k`;
83
- return `${(count / 1000000).toFixed(1)}M`;
84
- }
85
-
86
80
  function formatUsageStats(
87
81
  usage: {
88
82
  input: number;
@@ -97,13 +91,13 @@ function formatUsageStats(
97
91
  ): string {
98
92
  const parts: string[] = [];
99
93
  if (usage.turns) parts.push(`${usage.turns} turn${usage.turns > 1 ? "s" : ""}`);
100
- if (usage.input) parts.push(`↑${formatTokens(usage.input)}`);
101
- if (usage.output) parts.push(`↓${formatTokens(usage.output)}`);
102
- if (usage.cacheRead) parts.push(`R${formatTokens(usage.cacheRead)}`);
103
- if (usage.cacheWrite) parts.push(`W${formatTokens(usage.cacheWrite)}`);
94
+ if (usage.input) parts.push(`↑${formatTokenCount(usage.input)}`);
95
+ if (usage.output) parts.push(`↓${formatTokenCount(usage.output)}`);
96
+ if (usage.cacheRead) parts.push(`R${formatTokenCount(usage.cacheRead)}`);
97
+ if (usage.cacheWrite) parts.push(`W${formatTokenCount(usage.cacheWrite)}`);
104
98
  if (usage.cost) parts.push(`$${(Number(usage.cost) || 0).toFixed(4)}`);
105
99
  if (usage.contextTokens && usage.contextTokens > 0) {
106
- parts.push(`ctx:${formatTokens(usage.contextTokens)}`);
100
+ parts.push(`ctx:${formatTokenCount(usage.contextTokens)}`);
107
101
  }
108
102
  if (model) parts.push(model);
109
103
  return parts.join(" ");
@@ -61,10 +61,10 @@ pi.on("tool_call", async (event, ctx) => {
61
61
 
62
62
  **tool_result** — Fired after tool executes. Can modify result. Handlers chain like middleware.
63
63
  ```typescript
64
- import { isBashToolResult } from "@mariozechner/pi-coding-agent";
64
+ import { isToolResultEventType } from "@mariozechner/pi-coding-agent";
65
65
 
66
66
  pi.on("tool_result", async (event, ctx) => {
67
- if (isBashToolResult(event)) {
67
+ if (isToolResultEventType("bash", event)) {
68
68
  // event.details is typed as BashToolDetails
69
69
  }
70
70
  // Return partial patch: { content, details, isError }
@@ -105,7 +105,7 @@ pi.on("model_select", async (event, ctx) => {
105
105
  Built-in type guards for tool events:
106
106
 
107
107
  ```typescript
108
- import { isToolCallEventType, isBashToolResult } from "@mariozechner/pi-coding-agent";
108
+ import { isToolCallEventType, isToolResultEventType } from "@mariozechner/pi-coding-agent";
109
109
 
110
110
  // Tool calls — narrows event.input type
111
111
  if (isToolCallEventType("bash", event)) { /* event.input: { command, timeout? } */ }
@@ -114,7 +114,7 @@ if (isToolCallEventType("write", event)) { /* event.input: { path, content } */
114
114
  if (isToolCallEventType("edit", event)) { /* event.input: { path, oldText, newText } */ }
115
115
 
116
116
  // Tool results — narrows event.details type
117
- if (isBashToolResult(event)) { /* event.details: BashToolDetails */ }
117
+ if (isToolResultEventType("bash", event)) { /* event.details: BashToolDetails */ }
118
118
  ```
119
119
 
120
120
  For custom tools, export your input type and use explicit type params: