gsd-pi 2.76.0 → 2.77.0-dev.1d17f366c

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 (932) hide show
  1. package/README.md +32 -30
  2. package/dist/claude-cli-check.js +32 -3
  3. package/dist/cli-web-branch.d.ts +1 -0
  4. package/dist/cli-web-branch.js +3 -0
  5. package/dist/cli.js +38 -2
  6. package/dist/extension-discovery.d.ts +6 -0
  7. package/dist/extension-discovery.js +37 -0
  8. package/dist/extension-registry.d.ts +3 -0
  9. package/dist/extension-sort.d.ts +18 -0
  10. package/dist/extension-sort.js +114 -0
  11. package/dist/extension-validator.d.ts +47 -0
  12. package/dist/extension-validator.js +127 -0
  13. package/dist/loader.js +35 -7
  14. package/dist/mcp-server.d.ts +7 -0
  15. package/dist/mcp-server.js +35 -1
  16. package/dist/onboarding.js +45 -0
  17. package/dist/provider-migrations.d.ts +18 -0
  18. package/dist/provider-migrations.js +14 -0
  19. package/dist/resource-loader.d.ts +1 -1
  20. package/dist/resource-loader.js +2 -8
  21. package/dist/resources/agents/researcher.md +1 -1
  22. package/dist/resources/extensions/claude-code-cli/readiness.js +31 -8
  23. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +144 -63
  24. package/dist/resources/extensions/cmux/index.js +20 -0
  25. package/dist/resources/extensions/github-sync/templates.js +103 -0
  26. package/dist/resources/extensions/google-search/extension-manifest.json +5 -4
  27. package/dist/resources/extensions/google-search/index.js +3 -375
  28. package/dist/resources/extensions/gsd/abandon-detect.js +44 -0
  29. package/dist/resources/extensions/gsd/auto/loop.js +90 -2
  30. package/dist/resources/extensions/gsd/auto/phases.js +145 -28
  31. package/dist/resources/extensions/gsd/auto/resolve.js +24 -0
  32. package/dist/resources/extensions/gsd/auto/run-unit.js +48 -4
  33. package/dist/resources/extensions/gsd/auto/session.js +22 -1
  34. package/dist/resources/extensions/gsd/auto/turn-epoch.js +95 -0
  35. package/dist/resources/extensions/gsd/auto-dispatch.js +115 -17
  36. package/dist/resources/extensions/gsd/auto-loop.js +1 -1
  37. package/dist/resources/extensions/gsd/auto-model-selection.js +53 -16
  38. package/dist/resources/extensions/gsd/auto-post-unit.js +90 -2
  39. package/dist/resources/extensions/gsd/auto-prompts.js +14 -0
  40. package/dist/resources/extensions/gsd/auto-recovery.js +46 -1
  41. package/dist/resources/extensions/gsd/auto-start.js +84 -60
  42. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +11 -5
  43. package/dist/resources/extensions/gsd/auto-unit-closeout.js +11 -2
  44. package/dist/resources/extensions/gsd/auto-verification.js +33 -0
  45. package/dist/resources/extensions/gsd/auto-worktree.js +109 -61
  46. package/dist/resources/extensions/gsd/auto.js +107 -38
  47. package/dist/resources/extensions/gsd/blocked-models.js +68 -0
  48. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +103 -1
  49. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +39 -9
  50. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +93 -0
  51. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +3 -0
  52. package/dist/resources/extensions/gsd/bootstrap/provider-error-resume.js +4 -2
  53. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +23 -0
  54. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +52 -6
  55. package/dist/resources/extensions/gsd/bootstrap/system-context.js +95 -29
  56. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +34 -2
  57. package/dist/resources/extensions/gsd/clean-root-preflight.js +93 -0
  58. package/dist/resources/extensions/gsd/commands/handlers/workflow.js +31 -4
  59. package/dist/resources/extensions/gsd/commands-cmux.js +9 -6
  60. package/dist/resources/extensions/gsd/commands-extensions.js +634 -43
  61. package/dist/resources/extensions/gsd/commands-extract-learnings.js +54 -89
  62. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +968 -23
  63. package/dist/resources/extensions/gsd/compaction-snapshot.js +121 -0
  64. package/dist/resources/extensions/gsd/complexity-classifier.js +5 -3
  65. package/dist/resources/extensions/gsd/db-writer.js +88 -16
  66. package/dist/resources/extensions/gsd/dispatch-guard.js +29 -3
  67. package/dist/resources/extensions/gsd/doctor-git-checks.js +23 -29
  68. package/dist/resources/extensions/gsd/doctor-providers.js +51 -5
  69. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -0
  70. package/dist/resources/extensions/gsd/error-classifier.js +31 -3
  71. package/dist/resources/extensions/gsd/exec-history.js +120 -0
  72. package/dist/resources/extensions/gsd/exec-sandbox.js +258 -0
  73. package/dist/resources/extensions/gsd/file-lock.js +49 -9
  74. package/dist/resources/extensions/gsd/git-service.js +1 -0
  75. package/dist/resources/extensions/gsd/gitignore.js +2 -0
  76. package/dist/resources/extensions/gsd/gsd-db.js +168 -23
  77. package/dist/resources/extensions/gsd/guided-flow-queue.js +4 -1
  78. package/dist/resources/extensions/gsd/guided-flow.js +212 -9
  79. package/dist/resources/extensions/gsd/health-widget.js +4 -1
  80. package/dist/resources/extensions/gsd/hook-emitter.js +108 -0
  81. package/dist/resources/extensions/gsd/init-wizard.js +15 -1
  82. package/dist/resources/extensions/gsd/journal.js +17 -2
  83. package/dist/resources/extensions/gsd/key-manager.js +28 -0
  84. package/dist/resources/extensions/gsd/memory-backfill.js +126 -0
  85. package/dist/resources/extensions/gsd/memory-store.js +19 -0
  86. package/dist/resources/extensions/gsd/milestone-actions.js +15 -0
  87. package/dist/resources/extensions/gsd/milestone-summary-classifier.js +37 -0
  88. package/dist/resources/extensions/gsd/model-router.js +36 -3
  89. package/dist/resources/extensions/gsd/notifications.js +30 -16
  90. package/dist/resources/extensions/gsd/pre-execution-checks.js +44 -9
  91. package/dist/resources/extensions/gsd/preferences-types.js +9 -0
  92. package/dist/resources/extensions/gsd/preferences-validation.js +83 -0
  93. package/dist/resources/extensions/gsd/preferences.js +17 -17
  94. package/dist/resources/extensions/gsd/prompt-loader.js +22 -7
  95. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  96. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  97. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  98. package/dist/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
  99. package/dist/resources/extensions/gsd/prompts/discuss.md +29 -2
  100. package/dist/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  101. package/dist/resources/extensions/gsd/prompts/execute-task.md +3 -2
  102. package/dist/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  103. package/dist/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  104. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -0
  105. package/dist/resources/extensions/gsd/prompts/system.md +1 -0
  106. package/dist/resources/extensions/gsd/reports.js +5 -4
  107. package/dist/resources/extensions/gsd/safety/evidence-collector.js +96 -0
  108. package/dist/resources/extensions/gsd/safety/file-change-validator.js +13 -5
  109. package/dist/resources/extensions/gsd/safety/safety-harness.js +5 -1
  110. package/dist/resources/extensions/gsd/state-transition-matrix.js +118 -0
  111. package/dist/resources/extensions/gsd/state.js +68 -29
  112. package/dist/resources/extensions/gsd/token-counter.js +22 -5
  113. package/dist/resources/extensions/gsd/tools/complete-milestone.js +16 -10
  114. package/dist/resources/extensions/gsd/tools/complete-slice.js +21 -0
  115. package/dist/resources/extensions/gsd/tools/complete-task.js +31 -0
  116. package/dist/resources/extensions/gsd/tools/exec-search-tool.js +59 -0
  117. package/dist/resources/extensions/gsd/tools/exec-tool.js +126 -0
  118. package/dist/resources/extensions/gsd/tools/memory-tools.js +26 -1
  119. package/dist/resources/extensions/gsd/tools/resume-tool.js +23 -0
  120. package/dist/resources/extensions/gsd/uok/audit.js +18 -2
  121. package/dist/resources/extensions/gsd/uok/dispatch-envelope.js +33 -0
  122. package/dist/resources/extensions/gsd/uok/execution-graph.js +10 -0
  123. package/dist/resources/extensions/gsd/uok/gitops.js +2 -1
  124. package/dist/resources/extensions/gsd/uok/loop-adapter.js +37 -10
  125. package/dist/resources/extensions/gsd/uok/parity-report.js +58 -0
  126. package/dist/resources/extensions/gsd/uok/plan-v2.js +30 -7
  127. package/dist/resources/extensions/gsd/uok/writer.js +82 -0
  128. package/dist/resources/extensions/gsd/workflow-logger.js +10 -2
  129. package/dist/resources/extensions/gsd/workflow-mcp.js +3 -0
  130. package/dist/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  131. package/dist/resources/extensions/gsd/worktree-manager.js +1 -0
  132. package/dist/resources/extensions/gsd/worktree-resolver.js +50 -10
  133. package/dist/resources/extensions/mcp-client/auth.js +10 -1
  134. package/dist/resources/extensions/mcp-client/index.js +118 -9
  135. package/dist/resources/extensions/search-the-web/command-search-provider.js +5 -4
  136. package/dist/resources/extensions/search-the-web/native-search.js +45 -13
  137. package/dist/resources/extensions/shared/cmux-events.js +12 -0
  138. package/dist/resources/extensions/shared/rtk-session-stats.js +1 -2
  139. package/dist/resources/skills/api-design/SKILL.md +190 -0
  140. package/dist/resources/skills/create-mcp-server/SKILL.md +121 -0
  141. package/dist/resources/skills/create-skill/SKILL.md +2 -2
  142. package/dist/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  143. package/dist/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  144. package/dist/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  145. package/dist/resources/skills/decompose-into-slices/SKILL.md +139 -0
  146. package/dist/resources/skills/dependency-upgrade/SKILL.md +158 -0
  147. package/dist/resources/skills/design-an-interface/SKILL.md +102 -0
  148. package/dist/resources/skills/forensics/SKILL.md +153 -0
  149. package/dist/resources/skills/grill-me/SKILL.md +93 -0
  150. package/dist/resources/skills/handoff/SKILL.md +121 -0
  151. package/dist/resources/skills/observability/SKILL.md +174 -0
  152. package/dist/resources/skills/security-review/SKILL.md +181 -0
  153. package/dist/resources/skills/spike-wrap-up/SKILL.md +138 -0
  154. package/dist/resources/skills/tdd/SKILL.md +112 -0
  155. package/dist/resources/skills/verify-before-complete/SKILL.md +98 -0
  156. package/dist/resources/skills/write-docs/SKILL.md +82 -0
  157. package/dist/resources/skills/write-milestone-brief/SKILL.md +135 -0
  158. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  159. package/dist/web/standalone/.next/BUILD_ID +1 -1
  160. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  161. package/dist/web/standalone/.next/build-manifest.json +4 -4
  162. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  163. package/dist/web/standalone/.next/react-loadable-manifest.json +1 -1
  164. package/dist/web/standalone/.next/required-server-files.json +4 -4
  165. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  166. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  168. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  169. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  170. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  171. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  172. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  173. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  174. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  175. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  176. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  178. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  179. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  180. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  181. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  182. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  183. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  184. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  185. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  187. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  193. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  194. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  195. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  198. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  200. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  201. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  203. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  205. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  206. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  208. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  209. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  211. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  212. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  213. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  214. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  215. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  216. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  217. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  219. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  220. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  221. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  222. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  223. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  225. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  226. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  227. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  228. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  229. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  230. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  231. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  232. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  233. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  234. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  235. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  236. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  237. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  238. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  239. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  240. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  241. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  242. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  243. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  244. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  245. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  246. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  247. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  248. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  249. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  250. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  251. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  252. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  253. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  254. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  255. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  256. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  257. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  258. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  259. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  260. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  261. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  262. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  263. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  264. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  265. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  266. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  267. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  268. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  269. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  270. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  271. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  272. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  273. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  274. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  275. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  276. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  277. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  278. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  279. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  280. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  281. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  282. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  283. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  284. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  285. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  286. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  287. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  288. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  289. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  290. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  291. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  292. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  293. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  294. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  295. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  296. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  297. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  298. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  299. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  300. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  301. package/dist/web/standalone/.next/server/app/index.html +1 -1
  302. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  303. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  304. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  305. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  306. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  307. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  308. package/dist/web/standalone/.next/server/app/page.js +2 -2
  309. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  310. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  311. package/dist/web/standalone/.next/server/chunks/1926.js +1 -0
  312. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  313. package/dist/web/standalone/.next/server/chunks/6897.js +3 -3
  314. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  315. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  316. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  317. package/dist/web/standalone/.next/server/middleware.js +2 -2
  318. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  319. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  320. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  321. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  322. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  323. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  324. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-2f24283c162b6ab3.js → page-f2a7482d42a5614b.js} +1 -1
  325. package/dist/web/standalone/.next/static/chunks/app/{layout-9ecfd95f343793f0.js → layout-a16c7a7ecdf0c2cf.js} +1 -1
  326. package/dist/web/standalone/.next/static/chunks/app/page-5b113fd32bc2a1c3.js +1 -0
  327. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +1 -0
  328. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +1 -0
  329. package/dist/web/standalone/.next/static/chunks/{webpack-5fc74f13a25fa1bb.js → webpack-2e68521d7c82f7c2.js} +1 -1
  330. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  331. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  332. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  333. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  334. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  335. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  336. package/dist/web/standalone/server.js +1 -1
  337. package/dist/welcome-screen.js +6 -1
  338. package/dist/wizard.js +2 -0
  339. package/package.json +16 -14
  340. package/packages/daemon/package.json +2 -2
  341. package/packages/mcp-server/README.md +3 -3
  342. package/packages/mcp-server/dist/env-writer.d.ts +1 -0
  343. package/packages/mcp-server/dist/env-writer.d.ts.map +1 -1
  344. package/packages/mcp-server/dist/env-writer.js +74 -6
  345. package/packages/mcp-server/dist/env-writer.js.map +1 -1
  346. package/packages/mcp-server/dist/remote-questions.d.ts +45 -0
  347. package/packages/mcp-server/dist/remote-questions.d.ts.map +1 -0
  348. package/packages/mcp-server/dist/remote-questions.js +732 -0
  349. package/packages/mcp-server/dist/remote-questions.js.map +1 -0
  350. package/packages/mcp-server/dist/server.d.ts +7 -0
  351. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  352. package/packages/mcp-server/dist/server.js +95 -10
  353. package/packages/mcp-server/dist/server.js.map +1 -1
  354. package/packages/mcp-server/dist/session-manager.d.ts +14 -0
  355. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  356. package/packages/mcp-server/dist/session-manager.js +49 -1
  357. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  358. package/packages/mcp-server/dist/workflow-tools.d.ts +1 -1
  359. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  360. package/packages/mcp-server/dist/workflow-tools.js +178 -31
  361. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  362. package/packages/mcp-server/package.json +9 -3
  363. package/packages/mcp-server/src/env-writer.test.ts +79 -1
  364. package/packages/mcp-server/src/env-writer.ts +76 -6
  365. package/packages/mcp-server/src/mcp-server.test.ts +67 -0
  366. package/packages/mcp-server/src/readers/readers.test.ts +5 -1
  367. package/packages/mcp-server/src/remote-questions.test.ts +294 -0
  368. package/packages/mcp-server/src/remote-questions.ts +916 -0
  369. package/packages/mcp-server/src/server.ts +118 -16
  370. package/packages/mcp-server/src/session-manager.ts +43 -1
  371. package/packages/mcp-server/src/workflow-tools.test.ts +190 -1
  372. package/packages/mcp-server/src/workflow-tools.ts +234 -49
  373. package/packages/mcp-server/tsconfig.test.json +19 -0
  374. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  375. package/packages/native/package.json +6 -1
  376. package/packages/native/src/__tests__/clipboard.test.mjs +69 -23
  377. package/packages/native/tsconfig.tsbuildinfo +1 -1
  378. package/packages/pi-agent-core/dist/agent-loop.js +12 -0
  379. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  380. package/packages/pi-agent-core/dist/types.d.ts +30 -0
  381. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  382. package/packages/pi-agent-core/dist/types.js.map +1 -1
  383. package/packages/pi-agent-core/package.json +6 -1
  384. package/packages/pi-agent-core/src/agent-loop.test.ts +220 -15
  385. package/packages/pi-agent-core/src/agent-loop.ts +14 -0
  386. package/packages/pi-agent-core/src/types.ts +34 -0
  387. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  388. package/packages/pi-ai/dist/models/custom.d.ts +38 -0
  389. package/packages/pi-ai/dist/models/custom.d.ts.map +1 -1
  390. package/packages/pi-ai/dist/models/custom.js +41 -0
  391. package/packages/pi-ai/dist/models/custom.js.map +1 -1
  392. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +1 -1
  393. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  394. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts +2 -0
  395. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts.map +1 -0
  396. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +13 -0
  397. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -0
  398. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  399. package/packages/pi-ai/dist/providers/anthropic-shared.js +27 -4
  400. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  401. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  402. package/packages/pi-ai/dist/providers/anthropic.js +13 -4
  403. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  404. package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts +2 -0
  405. package/packages/pi-ai/dist/providers/minimax-tool-name.test.d.ts.map +1 -0
  406. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js +80 -0
  407. package/packages/pi-ai/dist/providers/minimax-tool-name.test.js.map +1 -0
  408. package/packages/pi-ai/dist/providers/openai-completions.d.ts.map +1 -1
  409. package/packages/pi-ai/dist/providers/openai-completions.js +60 -15
  410. package/packages/pi-ai/dist/providers/openai-completions.js.map +1 -1
  411. package/packages/pi-ai/dist/providers/simple-options.d.ts +10 -0
  412. package/packages/pi-ai/dist/providers/simple-options.d.ts.map +1 -1
  413. package/packages/pi-ai/dist/providers/simple-options.js +16 -1
  414. package/packages/pi-ai/dist/providers/simple-options.js.map +1 -1
  415. package/packages/pi-ai/dist/providers/think-tag-parser.d.ts +17 -0
  416. package/packages/pi-ai/dist/providers/think-tag-parser.d.ts.map +1 -0
  417. package/packages/pi-ai/dist/providers/think-tag-parser.js +75 -0
  418. package/packages/pi-ai/dist/providers/think-tag-parser.js.map +1 -0
  419. package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts +2 -0
  420. package/packages/pi-ai/dist/providers/think-tag-parser.test.d.ts.map +1 -0
  421. package/packages/pi-ai/dist/providers/think-tag-parser.test.js +41 -0
  422. package/packages/pi-ai/dist/providers/think-tag-parser.test.js.map +1 -0
  423. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  424. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +12 -2
  425. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  426. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +164 -14
  427. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  428. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  429. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +15 -3
  430. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  431. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts +2 -0
  432. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts.map +1 -0
  433. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +67 -0
  434. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -0
  435. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  436. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +16 -3
  437. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  438. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts +2 -0
  439. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts.map +1 -0
  440. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +67 -0
  441. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -0
  442. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +2 -0
  443. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +1 -0
  444. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +289 -0
  445. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +1 -0
  446. package/packages/pi-ai/package.json +6 -1
  447. package/packages/pi-ai/src/models/custom.ts +42 -0
  448. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +1 -1
  449. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -0
  450. package/packages/pi-ai/src/providers/anthropic-shared.ts +26 -5
  451. package/packages/pi-ai/src/providers/anthropic.ts +15 -4
  452. package/packages/pi-ai/src/providers/minimax-tool-name.test.ts +98 -0
  453. package/packages/pi-ai/src/providers/openai-completions.ts +57 -16
  454. package/packages/pi-ai/src/providers/simple-options.ts +17 -1
  455. package/packages/pi-ai/src/providers/think-tag-parser.test.ts +44 -0
  456. package/packages/pi-ai/src/providers/think-tag-parser.ts +94 -0
  457. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +200 -23
  458. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +12 -2
  459. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +84 -0
  460. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +15 -5
  461. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +84 -0
  462. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +16 -5
  463. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +363 -0
  464. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  465. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js +3 -2
  466. package/packages/pi-coding-agent/dist/core/agent-session-abort-order.test.js.map +1 -1
  467. package/packages/pi-coding-agent/dist/core/agent-session.d.ts +2 -0
  468. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  469. package/packages/pi-coding-agent/dist/core/agent-session.js +32 -2
  470. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  471. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts +25 -0
  472. package/packages/pi-coding-agent/dist/core/compaction/compaction.d.ts.map +1 -1
  473. package/packages/pi-coding-agent/dist/core/compaction/compaction.js +105 -6
  474. package/packages/pi-coding-agent/dist/core/compaction/compaction.js.map +1 -1
  475. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js +230 -28
  476. package/packages/pi-coding-agent/dist/core/compaction/compaction.test.js.map +1 -1
  477. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts +30 -2
  478. package/packages/pi-coding-agent/dist/core/compaction/utils.d.ts.map +1 -1
  479. package/packages/pi-coding-agent/dist/core/compaction/utils.js +113 -12
  480. package/packages/pi-coding-agent/dist/core/compaction/utils.js.map +1 -1
  481. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts +1 -0
  482. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.d.ts.map +1 -1
  483. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js +29 -18
  484. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.js.map +1 -1
  485. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts +2 -0
  486. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.d.ts.map +1 -0
  487. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js +130 -0
  488. package/packages/pi-coding-agent/dist/core/compaction-orchestrator.test.js.map +1 -0
  489. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js +56 -1
  490. package/packages/pi-coding-agent/dist/core/compaction-utils.test.js.map +1 -1
  491. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js +8 -15
  492. package/packages/pi-coding-agent/dist/core/discovery-cache.test.js.map +1 -1
  493. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts +25 -0
  494. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.d.ts.map +1 -0
  495. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js +109 -0
  496. package/packages/pi-coding-agent/dist/core/extensions/extension-discovery.js.map +1 -0
  497. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts +67 -0
  498. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.d.ts.map +1 -0
  499. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js +167 -0
  500. package/packages/pi-coding-agent/dist/core/extensions/extension-registry.js.map +1 -0
  501. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  502. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  503. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  504. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts +3 -2
  505. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  506. package/packages/pi-coding-agent/dist/core/extensions/loader.js +28 -8
  507. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  508. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +35 -2
  509. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  510. package/packages/pi-coding-agent/dist/core/extensions/runner.js +233 -0
  511. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  512. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +212 -2
  513. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  514. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  515. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts +53 -0
  516. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts.map +1 -0
  517. package/packages/pi-coding-agent/dist/core/hooks-runner.js +337 -0
  518. package/packages/pi-coding-agent/dist/core/hooks-runner.js.map +1 -0
  519. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts +2 -0
  520. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts.map +1 -0
  521. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +234 -0
  522. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -0
  523. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  524. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  525. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  526. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  527. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js +11 -0
  528. package/packages/pi-coding-agent/dist/core/lsp/lsp-integration.test.js.map +1 -1
  529. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts +3 -1
  530. package/packages/pi-coding-agent/dist/core/model-discovery.d.ts.map +1 -1
  531. package/packages/pi-coding-agent/dist/core/model-discovery.js +92 -12
  532. package/packages/pi-coding-agent/dist/core/model-discovery.js.map +1 -1
  533. package/packages/pi-coding-agent/dist/core/model-discovery.test.js +16 -1
  534. package/packages/pi-coding-agent/dist/core/model-discovery.test.js.map +1 -1
  535. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts +2 -0
  536. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts.map +1 -0
  537. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js +40 -0
  538. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js.map +1 -0
  539. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -2
  540. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  541. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts +2 -0
  542. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.d.ts.map +1 -0
  543. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js +203 -0
  544. package/packages/pi-coding-agent/dist/core/model-registry-custom-caps.test.js.map +1 -0
  545. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js +61 -1
  546. package/packages/pi-coding-agent/dist/core/model-registry-discovery.test.js.map +1 -1
  547. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +5 -0
  548. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  549. package/packages/pi-coding-agent/dist/core/model-registry.js +90 -10
  550. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  551. package/packages/pi-coding-agent/dist/core/redact-secrets.d.ts +2 -0
  552. package/packages/pi-coding-agent/dist/core/redact-secrets.d.ts.map +1 -0
  553. package/packages/pi-coding-agent/dist/core/redact-secrets.js +49 -0
  554. package/packages/pi-coding-agent/dist/core/redact-secrets.js.map +1 -0
  555. package/packages/pi-coding-agent/dist/core/redact-secrets.test.d.ts +2 -0
  556. package/packages/pi-coding-agent/dist/core/redact-secrets.test.d.ts.map +1 -0
  557. package/packages/pi-coding-agent/dist/core/redact-secrets.test.js +67 -0
  558. package/packages/pi-coding-agent/dist/core/redact-secrets.test.js.map +1 -0
  559. package/packages/pi-coding-agent/dist/core/resource-loader.js +1 -1
  560. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  561. package/packages/pi-coding-agent/dist/core/sdk.d.ts +1 -0
  562. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  563. package/packages/pi-coding-agent/dist/core/sdk.js +4 -1
  564. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  565. package/packages/pi-coding-agent/dist/core/sdk.test.js +19 -1
  566. package/packages/pi-coding-agent/dist/core/sdk.test.js.map +1 -1
  567. package/packages/pi-coding-agent/dist/core/session-manager.d.ts.map +1 -1
  568. package/packages/pi-coding-agent/dist/core/session-manager.js +10 -6
  569. package/packages/pi-coding-agent/dist/core/session-manager.js.map +1 -1
  570. package/packages/pi-coding-agent/dist/core/session-manager.test.js +45 -1
  571. package/packages/pi-coding-agent/dist/core/session-manager.test.js.map +1 -1
  572. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +55 -0
  573. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  574. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  575. package/packages/pi-coding-agent/dist/core/system-prompt.js +3 -3
  576. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  577. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js +2 -1
  578. package/packages/pi-coding-agent/dist/core/tools/path-utils.test.js.map +1 -1
  579. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  580. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  581. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  582. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js +15 -6
  583. package/packages/pi-coding-agent/dist/modes/interactive/components/__tests__/provider-display-name.test.js.map +1 -1
  584. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts +1 -1
  585. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  586. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +5 -4
  587. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  588. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  589. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +14 -5
  590. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  591. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts +7 -1
  592. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  593. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js +31 -9
  594. package/packages/pi-coding-agent/dist/modes/interactive/components/model-selector.js.map +1 -1
  595. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.d.ts.map +1 -1
  596. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js +13 -7
  597. package/packages/pi-coding-agent/dist/modes/interactive/components/provider-manager.js.map +1 -1
  598. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts +7 -6
  599. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  600. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js +29 -21
  601. package/packages/pi-coding-agent/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  602. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +14 -0
  603. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  604. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  605. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js +13 -1
  606. package/packages/pi-coding-agent/dist/modes/interactive/interactive-mode.js.map +1 -1
  607. package/packages/pi-coding-agent/package.json +6 -1
  608. package/packages/pi-coding-agent/src/core/agent-session-abort-order.test.ts +3 -2
  609. package/packages/pi-coding-agent/src/core/agent-session.ts +38 -2
  610. package/packages/pi-coding-agent/src/core/compaction/compaction.test.ts +368 -28
  611. package/packages/pi-coding-agent/src/core/compaction/compaction.ts +122 -6
  612. package/packages/pi-coding-agent/src/core/compaction/utils.ts +111 -13
  613. package/packages/pi-coding-agent/src/core/compaction-orchestrator.test.ts +154 -0
  614. package/packages/pi-coding-agent/src/core/compaction-orchestrator.ts +32 -18
  615. package/packages/pi-coding-agent/src/core/compaction-utils.test.ts +68 -1
  616. package/packages/pi-coding-agent/src/core/discovery-cache.test.ts +9 -18
  617. package/packages/pi-coding-agent/src/core/extensions/extension-discovery.ts +119 -0
  618. package/packages/pi-coding-agent/src/core/extensions/extension-registry.ts +222 -0
  619. package/packages/pi-coding-agent/src/core/extensions/index.ts +16 -0
  620. package/packages/pi-coding-agent/src/core/extensions/loader.ts +29 -11
  621. package/packages/pi-coding-agent/src/core/extensions/runner.ts +351 -0
  622. package/packages/pi-coding-agent/src/core/extensions/types.ts +266 -0
  623. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +269 -0
  624. package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
  625. package/packages/pi-coding-agent/src/core/index.ts +10 -0
  626. package/packages/pi-coding-agent/src/core/lsp/lsp-integration.test.ts +13 -0
  627. package/packages/pi-coding-agent/src/core/model-discovery.test.ts +19 -0
  628. package/packages/pi-coding-agent/src/core/model-discovery.ts +99 -12
  629. package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
  630. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -2
  631. package/packages/pi-coding-agent/src/core/model-registry-custom-caps.test.ts +245 -0
  632. package/packages/pi-coding-agent/src/core/model-registry-discovery.test.ts +75 -0
  633. package/packages/pi-coding-agent/src/core/model-registry.ts +102 -10
  634. package/packages/pi-coding-agent/src/core/redact-secrets.test.ts +86 -0
  635. package/packages/pi-coding-agent/src/core/redact-secrets.ts +58 -0
  636. package/packages/pi-coding-agent/src/core/resource-loader.ts +1 -1
  637. package/packages/pi-coding-agent/src/core/sdk.test.ts +25 -1
  638. package/packages/pi-coding-agent/src/core/sdk.ts +10 -3
  639. package/packages/pi-coding-agent/src/core/session-manager.test.ts +65 -1
  640. package/packages/pi-coding-agent/src/core/session-manager.ts +10 -6
  641. package/packages/pi-coding-agent/src/core/settings-manager.ts +57 -0
  642. package/packages/pi-coding-agent/src/core/system-prompt.ts +3 -3
  643. package/packages/pi-coding-agent/src/core/tools/path-utils.test.ts +2 -1
  644. package/packages/pi-coding-agent/src/index.ts +16 -0
  645. package/packages/pi-coding-agent/src/modes/interactive/components/__tests__/provider-display-name.test.ts +17 -7
  646. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +6 -6
  647. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +14 -5
  648. package/packages/pi-coding-agent/src/modes/interactive/components/model-selector.ts +45 -11
  649. package/packages/pi-coding-agent/src/modes/interactive/components/provider-manager.ts +16 -7
  650. package/packages/pi-coding-agent/src/modes/interactive/components/skill-invocation-message.ts +36 -22
  651. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +14 -0
  652. package/packages/pi-coding-agent/src/modes/interactive/interactive-mode.ts +13 -1
  653. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  654. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +12 -5
  655. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  656. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js +21 -0
  657. package/packages/pi-tui/dist/__tests__/stdin-buffer.test.js.map +1 -1
  658. package/packages/pi-tui/dist/stdin-buffer.d.ts +7 -0
  659. package/packages/pi-tui/dist/stdin-buffer.d.ts.map +1 -1
  660. package/packages/pi-tui/dist/stdin-buffer.js +20 -0
  661. package/packages/pi-tui/dist/stdin-buffer.js.map +1 -1
  662. package/packages/pi-tui/package.json +6 -1
  663. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +20 -5
  664. package/packages/pi-tui/src/__tests__/stdin-buffer.test.ts +27 -0
  665. package/packages/pi-tui/src/stdin-buffer.ts +26 -0
  666. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  667. package/packages/rpc-client/package.json +6 -1
  668. package/pkg/package.json +1 -1
  669. package/scripts/install.js +512 -0
  670. package/scripts/lib/workspace-manifest.cjs +86 -0
  671. package/scripts/link-workspace-packages.cjs +5 -16
  672. package/scripts/postinstall.js +9 -178
  673. package/src/resources/agents/researcher.md +1 -1
  674. package/src/resources/extensions/claude-code-cli/readiness.ts +32 -8
  675. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +158 -67
  676. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +251 -14
  677. package/src/resources/extensions/cmux/index.ts +35 -10
  678. package/src/resources/extensions/github-sync/templates.ts +151 -0
  679. package/src/resources/extensions/github-sync/tests/templates.test.ts +59 -0
  680. package/src/resources/extensions/google-search/extension-manifest.json +5 -4
  681. package/src/resources/extensions/google-search/index.ts +9 -470
  682. package/src/resources/extensions/gsd/abandon-detect.ts +62 -0
  683. package/src/resources/extensions/gsd/auto/loop-deps.ts +15 -1
  684. package/src/resources/extensions/gsd/auto/loop.ts +104 -2
  685. package/src/resources/extensions/gsd/auto/phases.ts +176 -27
  686. package/src/resources/extensions/gsd/auto/resolve.ts +29 -0
  687. package/src/resources/extensions/gsd/auto/run-unit.ts +56 -4
  688. package/src/resources/extensions/gsd/auto/session.ts +35 -2
  689. package/src/resources/extensions/gsd/auto/turn-epoch.ts +108 -0
  690. package/src/resources/extensions/gsd/auto/types.ts +1 -1
  691. package/src/resources/extensions/gsd/auto-dispatch.ts +117 -16
  692. package/src/resources/extensions/gsd/auto-loop.ts +1 -1
  693. package/src/resources/extensions/gsd/auto-model-selection.ts +71 -15
  694. package/src/resources/extensions/gsd/auto-post-unit.ts +92 -3
  695. package/src/resources/extensions/gsd/auto-prompts.ts +28 -1
  696. package/src/resources/extensions/gsd/auto-recovery.ts +40 -1
  697. package/src/resources/extensions/gsd/auto-start.ts +88 -74
  698. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -5
  699. package/src/resources/extensions/gsd/auto-unit-closeout.ts +14 -3
  700. package/src/resources/extensions/gsd/auto-verification.ts +33 -0
  701. package/src/resources/extensions/gsd/auto-worktree.ts +122 -68
  702. package/src/resources/extensions/gsd/auto.ts +115 -42
  703. package/src/resources/extensions/gsd/blocked-models.ts +98 -0
  704. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +131 -1
  705. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +40 -9
  706. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +109 -0
  707. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +5 -0
  708. package/src/resources/extensions/gsd/bootstrap/provider-error-resume.ts +6 -2
  709. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +26 -0
  710. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +54 -6
  711. package/src/resources/extensions/gsd/bootstrap/system-context.ts +102 -35
  712. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +35 -2
  713. package/src/resources/extensions/gsd/clean-root-preflight.ts +111 -0
  714. package/src/resources/extensions/gsd/commands/handlers/workflow.ts +27 -8
  715. package/src/resources/extensions/gsd/commands-cmux.ts +10 -6
  716. package/src/resources/extensions/gsd/commands-extensions.ts +747 -41
  717. package/src/resources/extensions/gsd/commands-extract-learnings.ts +55 -90
  718. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +898 -32
  719. package/src/resources/extensions/gsd/compaction-snapshot.ts +165 -0
  720. package/src/resources/extensions/gsd/complexity-classifier.ts +5 -3
  721. package/src/resources/extensions/gsd/db-writer.ts +88 -17
  722. package/src/resources/extensions/gsd/dispatch-guard.ts +26 -2
  723. package/src/resources/extensions/gsd/doctor-git-checks.ts +23 -27
  724. package/src/resources/extensions/gsd/doctor-providers.ts +59 -6
  725. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +2 -0
  726. package/src/resources/extensions/gsd/error-classifier.ts +36 -3
  727. package/src/resources/extensions/gsd/exec-history.ts +153 -0
  728. package/src/resources/extensions/gsd/exec-sandbox.ts +326 -0
  729. package/src/resources/extensions/gsd/file-lock.ts +84 -11
  730. package/src/resources/extensions/gsd/git-service.ts +1 -0
  731. package/src/resources/extensions/gsd/gitignore.ts +2 -1
  732. package/src/resources/extensions/gsd/gsd-db.ts +186 -23
  733. package/src/resources/extensions/gsd/guided-flow-queue.ts +4 -1
  734. package/src/resources/extensions/gsd/guided-flow.ts +259 -10
  735. package/src/resources/extensions/gsd/health-widget.ts +3 -1
  736. package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
  737. package/src/resources/extensions/gsd/init-wizard.ts +15 -1
  738. package/src/resources/extensions/gsd/journal.ts +29 -3
  739. package/src/resources/extensions/gsd/key-manager.ts +28 -0
  740. package/src/resources/extensions/gsd/memory-backfill.ts +140 -0
  741. package/src/resources/extensions/gsd/memory-store.ts +26 -0
  742. package/src/resources/extensions/gsd/milestone-actions.ts +18 -0
  743. package/src/resources/extensions/gsd/milestone-summary-classifier.ts +42 -0
  744. package/src/resources/extensions/gsd/model-router.ts +42 -1
  745. package/src/resources/extensions/gsd/notifications.ts +27 -15
  746. package/src/resources/extensions/gsd/pre-execution-checks.ts +46 -10
  747. package/src/resources/extensions/gsd/preferences-types.ts +46 -0
  748. package/src/resources/extensions/gsd/preferences-validation.ts +79 -0
  749. package/src/resources/extensions/gsd/preferences.ts +17 -17
  750. package/src/resources/extensions/gsd/prompt-loader.ts +30 -7
  751. package/src/resources/extensions/gsd/prompts/complete-milestone.md +1 -1
  752. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  753. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  754. package/src/resources/extensions/gsd/prompts/discuss-headless.md +29 -2
  755. package/src/resources/extensions/gsd/prompts/discuss.md +29 -2
  756. package/src/resources/extensions/gsd/prompts/doctor-heal.md +5 -4
  757. package/src/resources/extensions/gsd/prompts/execute-task.md +3 -2
  758. package/src/resources/extensions/gsd/prompts/parallel-research-slices.md +5 -2
  759. package/src/resources/extensions/gsd/prompts/plan-slice.md +1 -0
  760. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -0
  761. package/src/resources/extensions/gsd/prompts/system.md +1 -0
  762. package/src/resources/extensions/gsd/reports.ts +5 -4
  763. package/src/resources/extensions/gsd/safety/evidence-collector.ts +119 -0
  764. package/src/resources/extensions/gsd/safety/file-change-validator.ts +17 -4
  765. package/src/resources/extensions/gsd/safety/safety-harness.ts +9 -0
  766. package/src/resources/extensions/gsd/state-transition-matrix.ts +152 -0
  767. package/src/resources/extensions/gsd/state.ts +80 -34
  768. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +238 -4
  769. package/src/resources/extensions/gsd/tests/auto-mode-guards.test.ts +79 -0
  770. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +95 -1
  771. package/src/resources/extensions/gsd/tests/auto-paused-session-validation.test.ts +12 -0
  772. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +122 -0
  773. package/src/resources/extensions/gsd/tests/auto-start-bootstrap-await-3420.test.ts +141 -0
  774. package/src/resources/extensions/gsd/tests/auto-start-clean-runtime-db-gated.test.ts +63 -0
  775. package/src/resources/extensions/gsd/tests/auto-start-model-capture.test.ts +33 -3
  776. package/src/resources/extensions/gsd/tests/auto-thinking-restore.test.ts +38 -0
  777. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +23 -0
  778. package/src/resources/extensions/gsd/tests/blocked-models.test.ts +98 -0
  779. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +54 -0
  780. package/src/resources/extensions/gsd/tests/clean-root-preflight.test.ts +186 -0
  781. package/src/resources/extensions/gsd/tests/cmux.test.ts +5 -9
  782. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +68 -66
  783. package/src/resources/extensions/gsd/tests/compaction-snapshot.test.ts +123 -0
  784. package/src/resources/extensions/gsd/tests/complete-milestone-false-merge.test.ts +15 -0
  785. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +61 -1
  786. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +2 -2
  787. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  788. package/src/resources/extensions/gsd/tests/complexity-classifier.test.ts +3 -3
  789. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +161 -0
  790. package/src/resources/extensions/gsd/tests/db-access-guardrails.test.ts +1 -0
  791. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +42 -0
  792. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -4
  793. package/src/resources/extensions/gsd/tests/derive-state.test.ts +1 -2
  794. package/src/resources/extensions/gsd/tests/dispatch-complete-milestone-guard.test.ts +14 -9
  795. package/src/resources/extensions/gsd/tests/dispatch-guard-summary-db-mismatch.test.ts +77 -0
  796. package/src/resources/extensions/gsd/tests/dispatch-guard.test.ts +25 -0
  797. package/src/resources/extensions/gsd/tests/dispatch-missing-task-plans.test.ts +14 -0
  798. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +148 -3
  799. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +1 -1
  800. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +306 -1
  801. package/src/resources/extensions/gsd/tests/escalation.test.ts +1 -1
  802. package/src/resources/extensions/gsd/tests/exec-history.test.ts +237 -0
  803. package/src/resources/extensions/gsd/tests/exec-sandbox.test.ts +210 -0
  804. package/src/resources/extensions/gsd/tests/execution-entry-missing-context-4671.test.ts +173 -0
  805. package/src/resources/extensions/gsd/tests/file-change-validator.test.ts +58 -0
  806. package/src/resources/extensions/gsd/tests/file-lock.test.ts +86 -12
  807. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +40 -9
  808. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +62 -0
  809. package/src/resources/extensions/gsd/tests/google-search-stub.test.ts +131 -0
  810. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +447 -1
  811. package/src/resources/extensions/gsd/tests/headless-milestone-parity.test.ts +117 -0
  812. package/src/resources/extensions/gsd/tests/init-wizard.test.ts +27 -0
  813. package/src/resources/extensions/gsd/tests/integration/auto-worktree-milestone-merge.test.ts +30 -0
  814. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +11 -0
  815. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +78 -0
  816. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +4 -2
  817. package/src/resources/extensions/gsd/tests/integration/gitignore-tracked-gsd.test.ts +1 -0
  818. package/src/resources/extensions/gsd/tests/integration/idle-recovery.test.ts +30 -0
  819. package/src/resources/extensions/gsd/tests/integration/worktree-e2e.test.ts +11 -0
  820. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -1
  821. package/src/resources/extensions/gsd/tests/isolation-none-branch-guard.test.ts +1 -1
  822. package/src/resources/extensions/gsd/tests/issue-4540-regressions.test.ts +288 -0
  823. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +101 -0
  824. package/src/resources/extensions/gsd/tests/key-manager.test.ts +9 -0
  825. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
  826. package/src/resources/extensions/gsd/tests/mcp-client-security.test.ts +76 -0
  827. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  828. package/src/resources/extensions/gsd/tests/memory-pressure-stuck-state.test.ts +12 -0
  829. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  830. package/src/resources/extensions/gsd/tests/milestone-status-authoritative.test.ts +3 -3
  831. package/src/resources/extensions/gsd/tests/milestone-summary-classifier.test.ts +30 -0
  832. package/src/resources/extensions/gsd/tests/milestone-transition-state-rebuild.test.ts +4 -2
  833. package/src/resources/extensions/gsd/tests/parallel-commit-scope.test.ts +5 -0
  834. package/src/resources/extensions/gsd/tests/parallel-research-dispatch.test.ts +19 -0
  835. package/src/resources/extensions/gsd/tests/parallel-skill-prompt-integration.test.ts +150 -0
  836. package/src/resources/extensions/gsd/tests/plan-gate-failed-doctor-heal-hint.test.ts +37 -0
  837. package/src/resources/extensions/gsd/tests/pre-exec-backtick-strip.test.ts +14 -0
  838. package/src/resources/extensions/gsd/tests/pre-exec-gate-loop.test.ts +272 -0
  839. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +356 -0
  840. package/src/resources/extensions/gsd/tests/preferences.test.ts +110 -0
  841. package/src/resources/extensions/gsd/tests/prefs-wizard-coverage.test.ts +44 -0
  842. package/src/resources/extensions/gsd/tests/prompt-loader-extension-dir.test.ts +49 -0
  843. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +142 -29
  844. package/src/resources/extensions/gsd/tests/queue-auto-guard.test.ts +181 -0
  845. package/src/resources/extensions/gsd/tests/quick-auto-guard.test.ts +13 -7
  846. package/src/resources/extensions/gsd/tests/ready-phrase-no-files-4573.test.ts +388 -0
  847. package/src/resources/extensions/gsd/tests/require-slice-discussion-dispatch.test.ts +170 -0
  848. package/src/resources/extensions/gsd/tests/restore-tools-after-discuss.test.ts +9 -3
  849. package/src/resources/extensions/gsd/tests/resume-dispatch-worktree.test.ts +230 -0
  850. package/src/resources/extensions/gsd/tests/rewrite-docs-abandon-detect.test.ts +195 -0
  851. package/src/resources/extensions/gsd/tests/safety-harness-false-positives.test.ts +205 -0
  852. package/src/resources/extensions/gsd/tests/save-gate-result-render.test.ts +95 -0
  853. package/src/resources/extensions/gsd/tests/schema-v21-sequence.test.ts +413 -0
  854. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +32 -40
  855. package/src/resources/extensions/gsd/tests/stale-dirlistcache-4648.test.ts +112 -0
  856. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +56 -0
  857. package/src/resources/extensions/gsd/tests/state-machine-full-walkthrough.test.ts +24 -0
  858. package/src/resources/extensions/gsd/tests/state-transition-matrix.test.ts +44 -0
  859. package/src/resources/extensions/gsd/tests/stuck-detection-coverage.test.ts +2 -2
  860. package/src/resources/extensions/gsd/tests/token-counter.test.ts +105 -1
  861. package/src/resources/extensions/gsd/tests/tool-compatibility.test.ts +107 -0
  862. package/src/resources/extensions/gsd/tests/triage-resolution.test.ts +50 -2
  863. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +162 -0
  864. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +51 -0
  865. package/src/resources/extensions/gsd/tests/uok-execution-graph.test.ts +16 -0
  866. package/src/resources/extensions/gsd/tests/uok-loop-adapter-writer.test.ts +65 -0
  867. package/src/resources/extensions/gsd/tests/uok-parity-report.test.ts +42 -0
  868. package/src/resources/extensions/gsd/tests/uok-plan-v2-wiring.test.ts +42 -2
  869. package/src/resources/extensions/gsd/tests/uok-writer.test.ts +75 -0
  870. package/src/resources/extensions/gsd/tests/validate-extension-package.test.ts +168 -0
  871. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +147 -8
  872. package/src/resources/extensions/gsd/tests/workflow-mcp.test.ts +25 -2
  873. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +65 -2
  874. package/src/resources/extensions/gsd/tests/worktree-db.test.ts +35 -0
  875. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +6 -1
  876. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +78 -5
  877. package/src/resources/extensions/gsd/tests/write-gate.test.ts +64 -0
  878. package/src/resources/extensions/gsd/tests/zombie-gsd-state.test.ts +3 -1
  879. package/src/resources/extensions/gsd/token-counter.ts +22 -5
  880. package/src/resources/extensions/gsd/tools/complete-milestone.ts +15 -9
  881. package/src/resources/extensions/gsd/tools/complete-slice.ts +38 -0
  882. package/src/resources/extensions/gsd/tools/complete-task.ts +49 -0
  883. package/src/resources/extensions/gsd/tools/exec-search-tool.ts +81 -0
  884. package/src/resources/extensions/gsd/tools/exec-tool.ts +183 -0
  885. package/src/resources/extensions/gsd/tools/memory-tools.ts +31 -1
  886. package/src/resources/extensions/gsd/tools/resume-tool.ts +40 -0
  887. package/src/resources/extensions/gsd/uok/audit.ts +20 -2
  888. package/src/resources/extensions/gsd/uok/contracts.ts +65 -0
  889. package/src/resources/extensions/gsd/uok/dispatch-envelope.ts +56 -0
  890. package/src/resources/extensions/gsd/uok/execution-graph.ts +22 -0
  891. package/src/resources/extensions/gsd/uok/gitops.ts +6 -1
  892. package/src/resources/extensions/gsd/uok/loop-adapter.ts +45 -10
  893. package/src/resources/extensions/gsd/uok/parity-report.ts +84 -0
  894. package/src/resources/extensions/gsd/uok/plan-v2.ts +39 -8
  895. package/src/resources/extensions/gsd/uok/writer.ts +113 -0
  896. package/src/resources/extensions/gsd/workflow-logger.ts +25 -3
  897. package/src/resources/extensions/gsd/workflow-mcp.ts +3 -0
  898. package/src/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  899. package/src/resources/extensions/gsd/worktree-manager.ts +1 -0
  900. package/src/resources/extensions/gsd/worktree-resolver.ts +54 -9
  901. package/src/resources/extensions/mcp-client/auth.ts +12 -1
  902. package/src/resources/extensions/mcp-client/index.ts +129 -10
  903. package/src/resources/extensions/search-the-web/command-search-provider.ts +5 -4
  904. package/src/resources/extensions/search-the-web/native-search.ts +48 -12
  905. package/src/resources/extensions/shared/cmux-events.ts +59 -0
  906. package/src/resources/extensions/shared/rtk-session-stats.ts +1 -2
  907. package/src/resources/skills/api-design/SKILL.md +190 -0
  908. package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
  909. package/src/resources/skills/create-skill/SKILL.md +2 -2
  910. package/src/resources/skills/create-skill/references/gsd-skill-ecosystem.md +4 -4
  911. package/src/resources/skills/create-skill/workflows/audit-skill.md +4 -4
  912. package/src/resources/skills/create-skill/workflows/create-new-skill.md +5 -5
  913. package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
  914. package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
  915. package/src/resources/skills/design-an-interface/SKILL.md +102 -0
  916. package/src/resources/skills/forensics/SKILL.md +153 -0
  917. package/src/resources/skills/grill-me/SKILL.md +93 -0
  918. package/src/resources/skills/handoff/SKILL.md +121 -0
  919. package/src/resources/skills/observability/SKILL.md +174 -0
  920. package/src/resources/skills/security-review/SKILL.md +181 -0
  921. package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
  922. package/src/resources/skills/tdd/SKILL.md +112 -0
  923. package/src/resources/skills/verify-before-complete/SKILL.md +98 -0
  924. package/src/resources/skills/write-docs/SKILL.md +82 -0
  925. package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
  926. package/dist/web/standalone/.next/server/chunks/7461.js +0 -1
  927. package/dist/web/standalone/.next/static/chunks/2826.e59e8578e2e28639.js +0 -9
  928. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +0 -1
  929. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +0 -1
  930. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +0 -1
  931. /package/dist/web/standalone/.next/static/{ssX7BLv3Dw9Fb4CtrCGeR → vidAVJkURvTJ0_V2-64ro}/_buildManifest.js +0 -0
  932. /package/dist/web/standalone/.next/static/{ssX7BLv3Dw9Fb4CtrCGeR → vidAVJkURvTJ0_V2-64ro}/_ssgManifest.js +0 -0
@@ -19,7 +19,6 @@ import { getActiveWorktreeName, getWorktreeOriginalCwd } from "../worktree-comma
19
19
  import { deriveState } from "../state.js";
20
20
  import { formatOverridesSection, formatShortcut, loadActiveOverrides, loadFile, parseContinue, parseSummary } from "../files.js";
21
21
  import { toPosixPath } from "../../shared/mod.js";
22
- import { markCmuxPromptShown, shouldPromptToEnableCmux } from "../../cmux/index.js";
23
22
  import { autoEnableCmuxPreferences } from "../commands-cmux.js";
24
23
 
25
24
  const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
@@ -29,10 +28,30 @@ const gsdHome = process.env.GSD_HOME || join(homedir(), ".gsd");
29
28
  * hardcoding absolute paths in the system prompt template. Only skills
30
29
  * that actually exist on disk are included in the table. (#3575)
31
30
  */
32
- const BUNDLED_SKILL_TRIGGERS: Array<{ trigger: string; skill: string }> = [
31
+ export const BUNDLED_SKILL_TRIGGERS: Array<{ trigger: string; skill: string }> = [
33
32
  { trigger: "Frontend UI - web components, pages, landing pages, dashboards, React/HTML/CSS, styling", skill: "frontend-design" },
34
33
  { trigger: "macOS or iOS apps - SwiftUI, Xcode, App Store", skill: "swiftui" },
35
34
  { trigger: "Debugging - complex bugs, failing tests, root-cause investigation after standard approaches fail", skill: "debug-like-expert" },
35
+ { trigger: "Code review - security, performance, bugs, quality review of staged/unstaged diffs or PRs", skill: "review" },
36
+ { trigger: "Test generation or execution - auto-detect framework, generate tests, run suite, analyze failures", skill: "test" },
37
+ { trigger: "Linting/formatting - run the detected linter/formatter with auto-fix, report remaining issues", skill: "lint" },
38
+ { trigger: "Polishing UI details - animations, hover states, typography, borders, micro-interactions, optical alignment", skill: "make-interfaces-feel-better" },
39
+ { trigger: "Accessibility audit - WCAG, screen reader, keyboard navigation, a11y review", skill: "accessibility" },
40
+ { trigger: "Planning interviews - stress-test a plan, grill the user, resolve decision trees one branch at a time", skill: "grill-me" },
41
+ { trigger: "Interface design - produce 3+ radically different designs for a module/API, compare in prose, synthesize", skill: "design-an-interface" },
42
+ { trigger: "TDD - red-green-refactor vertical slices, never refactor while red, tests survive refactors", skill: "tdd" },
43
+ { trigger: "Draft a milestone brief (M###-CONTEXT.md) or PRD from current conversation context", skill: "write-milestone-brief" },
44
+ { trigger: "Break a plan into vertical-slice roadmap slices (M###-ROADMAP.md) or GitHub issues with dependency ordering", skill: "decompose-into-slices" },
45
+ { trigger: "Package spike findings into a reusable project-local skill at .claude/skills/", skill: "spike-wrap-up" },
46
+ { trigger: "Block completion claims until verification evidence has been produced in this message", skill: "verify-before-complete" },
47
+ { trigger: "Create a Model Context Protocol (MCP) server — tool design, error handling, Inspector testing, evals", skill: "create-mcp-server" },
48
+ { trigger: "Write documentation, proposals, specs, RFCs, or READMEs for a fresh reader", skill: "write-docs" },
49
+ { trigger: "Post-mortem a failed GSD auto-mode run using .gsd/activity, .gsd/journal, and .gsd/metrics.json", skill: "forensics" },
50
+ { trigger: "Prepare a clean cross-session handoff — continue.md + summary updates (pause/resume work)", skill: "handoff" },
51
+ { trigger: "Security review with STRIDE threat modeling and exploit-scenario reporting", skill: "security-review" },
52
+ { trigger: "HTTP/REST/GraphQL API design — verbs, status codes, pagination, errors, idempotency, versioning", skill: "api-design" },
53
+ { trigger: "Dependency upgrades — risk-batched, verified between batches, one major per commit", skill: "dependency-upgrade" },
54
+ { trigger: "Agent-first observability — structured logs, persisted failure state, health surfaces, explicit failure modes", skill: "observability" },
36
55
  ];
37
56
 
38
57
  function buildBundledSkillsTable(): string {
@@ -79,15 +98,20 @@ export async function buildBeforeAgentStartResult(
79
98
  shortcutShell: formatShortcut("Ctrl+Alt+B"),
80
99
  });
81
100
  let loadedPreferences = loadEffectiveGSDPreferences();
82
- if (shouldPromptToEnableCmux(loadedPreferences?.preferences)) {
83
- markCmuxPromptShown();
84
- if (autoEnableCmuxPreferences()) {
85
- loadedPreferences = loadEffectiveGSDPreferences();
86
- ctx.ui.notify(
87
- "cmux detected — auto-enabled. Run /gsd cmux off to disable.",
88
- "info",
89
- );
101
+ try {
102
+ const { markCmuxPromptShown, shouldPromptToEnableCmux } = await import("../../cmux/index.js");
103
+ if (shouldPromptToEnableCmux(loadedPreferences?.preferences)) {
104
+ markCmuxPromptShown();
105
+ if (autoEnableCmuxPreferences()) {
106
+ loadedPreferences = loadEffectiveGSDPreferences();
107
+ ctx.ui.notify(
108
+ "cmux detected — auto-enabled. Run /gsd cmux off to disable.",
109
+ "info",
110
+ );
111
+ }
90
112
  }
113
+ } catch (e) {
114
+ logWarning("bootstrap", `cmux prompt setup skipped: ${(e as Error).message}`);
91
115
  }
92
116
 
93
117
  let preferenceBlock = "";
@@ -111,36 +135,21 @@ export async function buildBeforeAgentStartResult(
111
135
  );
112
136
  }
113
137
 
114
- let memoryBlock = "";
138
+ // ADR-013 step 5: opportunistic decisions->memories backfill. Idempotent
139
+ // and best-effort — first run absorbs the existing decisions table into
140
+ // the memory store; subsequent runs are a single sentinel SELECT.
115
141
  try {
116
- const { formatMemoriesForPrompt, getActiveMemoriesRanked, queryMemoriesRanked } = await import("../memory-store.js");
117
-
118
- // Always-on "critical" set — small, stable memories that belong in every
119
- // turn (gotchas, environment, conventions). Ranked by the existing score.
120
- const CRITICAL_CATEGORIES = new Set(["gotcha", "environment", "convention"]);
121
- const allRanked = getActiveMemoriesRanked(60);
122
- const critical = allRanked.filter((m) => CRITICAL_CATEGORIES.has(m.category)).slice(0, 5);
123
- const criticalIds = new Set(critical.map((m) => m.id));
124
-
125
- // Prompt-relevance set — hybrid FTS5 + (future) semantic retrieval.
126
- let relevant: typeof allRanked = [];
127
- const userPrompt = (event.prompt ?? "").trim();
128
- if (userPrompt) {
129
- const hits = queryMemoriesRanked({ query: userPrompt, k: 10 });
130
- relevant = hits.map((h) => h.memory).filter((m) => !criticalIds.has(m.id));
131
- }
132
-
133
- const merged = [...critical, ...relevant];
134
- if (merged.length > 0) {
135
- const formatted = formatMemoriesForPrompt(merged, 2000);
136
- if (formatted) {
137
- memoryBlock = `\n\n${formatted}`;
138
- }
142
+ const { backfillDecisionsToMemories } = await import("../memory-backfill.js");
143
+ const written = backfillDecisionsToMemories();
144
+ if (written > 0) {
145
+ ctx.ui.notify(`GSD: backfilled ${written} decision${written === 1 ? "" : "s"} into the memory store (ADR-013).`, "info");
139
146
  }
140
147
  } catch (e) {
141
- logWarning("bootstrap", `memory block fetch failed: ${(e as Error).message}`);
148
+ logWarning("bootstrap", `decisions backfill failed: ${(e as Error).message}`);
142
149
  }
143
150
 
151
+ const memoryBlock = await loadMemoryBlock(event.prompt ?? "");
152
+
144
153
  let newSkillsBlock = "";
145
154
  if (hasSkillSnapshot()) {
146
155
  const newSkills = detectNewSkills();
@@ -220,6 +229,64 @@ export async function buildBeforeAgentStartResult(
220
229
  };
221
230
  }
222
231
 
232
+ /**
233
+ * ADR-013 step 4 — auto-injection parity for the memories table.
234
+ *
235
+ * Mirrors loadKnowledgeBlock by producing a labeled, deterministic block
236
+ * combining two memory sets:
237
+ *
238
+ * 1. Always-on "critical" set — top-ranked active memories in categories
239
+ * that future GSD turns generally want without asking. After ADR-013
240
+ * expands this to include "architecture", these memories serve as the
241
+ * auto-injected replacement for inlineDecisionsFromDb when the cutover
242
+ * in step 6 lands.
243
+ * 2. Prompt-relevance set — FTS5/semantic hits against the current user
244
+ * prompt, deduplicated against the critical set.
245
+ *
246
+ * Both sets are ranked, merged, and rendered via formatMemoriesForPrompt
247
+ * with a token-budget cap. Failures degrade gracefully — the function never
248
+ * throws and returns "" so the system prompt construction continues.
249
+ */
250
+ export async function loadMemoryBlock(userPrompt: string): Promise<string> {
251
+ try {
252
+ const { formatMemoriesForPrompt, getActiveMemoriesRanked, queryMemoriesRanked } = await import("../memory-store.js");
253
+
254
+ // Categories that belong in every turn. Pre-ADR-013 this was just
255
+ // {gotcha, environment, convention}. ADR-013 adds "architecture" so
256
+ // decision-equivalent memories survive the inlineDecisionsFromDb cutover
257
+ // in step 6.
258
+ const CRITICAL_CATEGORIES = new Set(["gotcha", "environment", "convention", "architecture"]);
259
+ const CRITICAL_CAP = 8;
260
+ const QUERY_K = 10;
261
+ // ~1 token ≈ 4 chars. 4000 chars ≈ 1000 tokens — comfortably under the
262
+ // KNOWLEDGE.md 4KB warning threshold and roughly twice the pre-ADR-013
263
+ // budget so the absorbed DECISIONS surface fits.
264
+ const CHAR_BUDGET = 4000;
265
+
266
+ const allRanked = getActiveMemoriesRanked(80);
267
+ const critical = allRanked.filter((m) => CRITICAL_CATEGORIES.has(m.category)).slice(0, CRITICAL_CAP);
268
+ const criticalIds = new Set(critical.map((m) => m.id));
269
+
270
+ let relevant: typeof allRanked = [];
271
+ const trimmed = userPrompt.trim();
272
+ if (trimmed) {
273
+ const hits = queryMemoriesRanked({ query: trimmed, k: QUERY_K });
274
+ relevant = hits.map((h) => h.memory).filter((m) => !criticalIds.has(m.id));
275
+ }
276
+
277
+ const merged = [...critical, ...relevant];
278
+ if (merged.length === 0) return "";
279
+
280
+ const formatted = formatMemoriesForPrompt(merged, CHAR_BUDGET);
281
+ if (!formatted) return "";
282
+
283
+ return `\n\n[MEMORY — Critical and prompt-relevant memories from the GSD memory store]\n\n${formatted}`;
284
+ } catch (e) {
285
+ logWarning("bootstrap", `memory block fetch failed: ${(e as Error).message}`);
286
+ return "";
287
+ }
288
+ }
289
+
223
290
  export function loadKnowledgeBlock(gsdHomeDir: string, cwd: string): { block: string; globalSizeKb: number } {
224
291
  // 1. Global knowledge (~/.gsd/agent/KNOWLEDGE.md) — cross-project, user-maintained
225
292
  let globalKnowledge = "";
@@ -28,8 +28,29 @@ const QUEUE_SAFE_TOOLS = new Set([
28
28
  /**
29
29
  * Bash commands that are read-only / investigative — safe during queue mode.
30
30
  * Matches the leading command in a bash invocation.
31
+ *
32
+ * Extension policy: add commands here when they are read-only / diagnostic.
33
+ * Never add commands that mutate project state (write files, run builds that
34
+ * emit artifacts, install packages, etc.).
35
+ *
36
+ * Current read-only additions (Bug #4385):
37
+ * npm run <diagnostic> — read-only diagnostic scripts: test, lint, typecheck, etc.
38
+ * NOT: build, install, compile, generate, deploy (artifact-producing)
39
+ * npm ls/list/info — inspect installed packages (read-only)
40
+ * npm outdated/audit — security/update checks (read-only)
41
+ * npx <pkg> — run a package binary without installing globally
42
+ * tsx — TypeScript runner used for dry-run / inspection scripts
43
+ * node --print — evaluate and print an expression, no side effects
44
+ * python / python3 — script inspection, version checks
45
+ * pip / pip3 show — show installed package info (read-only)
46
+ * jq — read-only JSON query
47
+ * yq — read-only YAML query
48
+ * curl -s / curl --silent — fetch for inspection (no -o / no output redirect)
49
+ * openssl version — version / certificate inspection
50
+ * env / printenv — print environment variables
51
+ * true / false — shell no-ops / test exit codes
31
52
  */
32
- const BASH_READ_ONLY_RE = /^\s*(cat|head|tail|less|more|wc|file|stat|du|df|which|type|echo|printf|ls|find|grep|rg|awk|sed\b(?!.*-i)|sort|uniq|diff|comm|tr|cut|tee\s+-a\s+\/dev\/null|git\s+(log|show|diff|status|branch|tag|remote|rev-parse|ls-files|blame|shortlog|describe|stash\s+list|config\s+--get|cat-file)|gh\s+(issue|pr|api|repo|release)\s+(view|list|diff|status|checks)|mkdir\s+-p\s+\.gsd|rtk\s)/;
53
+ const BASH_READ_ONLY_RE = /^\s*(cat|head|tail|less|more|wc|file|stat|du|df|which|type|echo|printf|ls|find|grep|rg|awk|sed\b(?!.*-i)|sort|uniq|diff|comm|tr|cut|tee\s+-a\s+\/dev\/null|git\s+(log|show|diff|status|branch|tag|remote|rev-parse|ls-files|blame|shortlog|describe|stash\s+list|config\s+--get|cat-file)|gh\s+(issue|pr|api|repo|release)\s+(view|list|diff|status|checks)|mkdir\s+-p\s+\.gsd|rtk\s|npm\s+run\s+(test|test:\w+|lint|lint:\w+|typecheck|type-check|type-check:\w+|check|verify|audit|outdated|format:check|ci|validate)\b|npm\s+(ls|list|info|view|show|outdated|audit|explain|doctor|ping|--version|-v)\b|npx\s|tsx\s|node\s+(--print|--version|-v\b)|python[23]?\s+(-c\s+'[^']*'|--version|-V\b|-m\s+(pip\s+show|pip\s+list|site))|pip[23]?\s+(show|list|freeze|check|index\s+versions)\b|jq\s|yq\s|curl\s+(-s\b|--silent\b)(?!\s+[^|>]*\s-[oO]\b)(?!\s+[^|>]*\s--output\b)[^|>]*$|openssl\s+(version|x509|s_client)|env\b|printenv\b|true\b|false\b)/;
33
54
 
34
55
  const verifiedDepthMilestones = new Set<string>();
35
56
  let activeQueuePhase = false;
@@ -117,9 +138,21 @@ function normalizeWriteGateSnapshot(value: unknown): WriteGateSnapshot {
117
138
  };
118
139
  }
119
140
 
141
+ const EMPTY_SNAPSHOT: WriteGateSnapshot = {
142
+ verifiedDepthMilestones: [],
143
+ activeQueuePhase: false,
144
+ pendingGateId: null,
145
+ };
146
+
120
147
  export function loadWriteGateSnapshot(basePath: string = process.cwd()): WriteGateSnapshot {
121
148
  const path = writeGateSnapshotPath(basePath);
122
- if (!existsSync(path)) return currentWriteGateSnapshot();
149
+ if (!existsSync(path)) {
150
+ // When persist mode is active and the file has been deleted, treat it as a
151
+ // full state reset so deleting the file clears the HARD BLOCK gate.
152
+ // In non-persist mode the file is never written, so fall back to in-memory.
153
+ if (shouldPersistWriteGateSnapshot()) return EMPTY_SNAPSHOT;
154
+ return currentWriteGateSnapshot();
155
+ }
123
156
  try {
124
157
  return normalizeWriteGateSnapshot(JSON.parse(readFileSync(path, "utf-8")));
125
158
  } catch {
@@ -0,0 +1,111 @@
1
+ /**
2
+ * clean-root-preflight.ts — Preflight gate for dirty working trees before milestone merges.
3
+ *
4
+ * #2909: Adds a fast-path git status check before milestone completion merges.
5
+ * When the working tree is dirty the user is warned and changes are auto-stashed
6
+ * so the merge can proceed cleanly. After the merge completes, postflightPopStash
7
+ * restores the stashed changes.
8
+ *
9
+ * Design constraints (from Trek-e approval):
10
+ * - Warn the user before stashing (no silent surprises)
11
+ * - git stash push / git stash pop only — no custom stash management layer
12
+ * - Stash/pop errors are logged but MUST NOT block the merge
13
+ * - Fast-path status check — clean trees pay no extra cost
14
+ */
15
+
16
+ import { execFileSync } from "node:child_process";
17
+ import { GIT_NO_PROMPT_ENV } from "./git-constants.js";
18
+ import { logWarning } from "./workflow-logger.js";
19
+ import { nativeHasChanges } from "./native-git-bridge.js";
20
+
21
+ export interface PreflightResult {
22
+ /** true when a stash was pushed and postflightPopStash should be called */
23
+ stashPushed: boolean;
24
+ /** human-readable summary of what happened (empty string for clean trees) */
25
+ summary: string;
26
+ }
27
+
28
+ /**
29
+ * Check the working tree for dirty files before a milestone merge.
30
+ *
31
+ * Clean tree path: O(1) — returns immediately with stashPushed=false.
32
+ *
33
+ * Dirty tree path:
34
+ * 1. Emits a warning notification via the provided `notify` callback.
35
+ * 2. Runs `git stash push --include-untracked -m "gsd-preflight-stash"`.
36
+ * 3. Returns stashPushed=true so the caller knows to call postflightPopStash.
37
+ *
38
+ * Any stash error is logged but does NOT throw — the merge proceeds regardless.
39
+ */
40
+ export function preflightCleanRoot(
41
+ basePath: string,
42
+ milestoneId: string,
43
+ notify: (message: string, level: "info" | "warning" | "error") => void,
44
+ ): PreflightResult {
45
+ // Fast-path: clean tree — nothing to do
46
+ let isDirty = false;
47
+ try {
48
+ isDirty = nativeHasChanges(basePath);
49
+ } catch (err) {
50
+ // If the status check itself fails, treat as clean and let the merge decide
51
+ logWarning("preflight", `clean-root status check failed: ${err instanceof Error ? err.message : String(err)}`);
52
+ return { stashPushed: false, summary: "" };
53
+ }
54
+
55
+ if (!isDirty) {
56
+ return { stashPushed: false, summary: "" };
57
+ }
58
+
59
+ // Warn the user before stashing
60
+ const warnMsg = `Working tree has uncommitted changes before milestone ${milestoneId} merge. Auto-stashing to allow clean merge (stash will be restored after merge).`;
61
+ notify(warnMsg, "warning");
62
+
63
+ // Push the stash
64
+ try {
65
+ execFileSync("git", ["stash", "push", "--include-untracked", "-m", "gsd-preflight-stash"], {
66
+ cwd: basePath,
67
+ stdio: ["ignore", "pipe", "pipe"],
68
+ encoding: "utf-8",
69
+ env: GIT_NO_PROMPT_ENV,
70
+ });
71
+ return {
72
+ stashPushed: true,
73
+ summary: `Stashed uncommitted changes before merge (milestone ${milestoneId}).`,
74
+ };
75
+ } catch (err) {
76
+ // Stash failure is non-fatal — log and let the merge attempt proceed
77
+ const msg = `git stash push failed before merge of milestone ${milestoneId}: ${err instanceof Error ? err.message : String(err)}`;
78
+ logWarning("preflight", msg);
79
+ notify(`Auto-stash failed before milestone ${milestoneId} merge — proceeding anyway. ${msg}`, "warning");
80
+ return { stashPushed: false, summary: `stash-push-failed: ${msg}` };
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Restore stashed changes after a milestone merge completes.
86
+ *
87
+ * Only called when preflightCleanRoot returned stashPushed=true.
88
+ * Any pop error (e.g. conflict) is logged and notified but does NOT throw —
89
+ * the merge already completed successfully.
90
+ */
91
+ export function postflightPopStash(
92
+ basePath: string,
93
+ milestoneId: string,
94
+ notify: (message: string, level: "info" | "warning" | "error") => void,
95
+ ): void {
96
+ try {
97
+ execFileSync("git", ["stash", "pop"], {
98
+ cwd: basePath,
99
+ stdio: ["ignore", "pipe", "pipe"],
100
+ encoding: "utf-8",
101
+ env: GIT_NO_PROMPT_ENV,
102
+ });
103
+ notify(`Restored stashed changes after milestone ${milestoneId} merge.`, "info");
104
+ } catch (err) {
105
+ // Pop conflicts mean the merged code collides with the stashed changes.
106
+ // Log a warning — the user needs to resolve manually, but the merge succeeded.
107
+ const msg = `git stash pop failed after merge of milestone ${milestoneId}: ${err instanceof Error ? err.message : String(err)}. Run "git stash pop" manually to restore your changes.`;
108
+ logWarning("preflight", msg);
109
+ notify(msg, "warning");
110
+ }
111
+ }
@@ -43,6 +43,25 @@ import {
43
43
  validateFetchedContent,
44
44
  } from "../../workflow-install.js";
45
45
 
46
+ /**
47
+ * Refuses interactive commands that mutate durable .gsd/ planning state while
48
+ * auto-mode holds the worktree. Returns true if the command was blocked and
49
+ * the caller should return immediately; false if it is safe to proceed.
50
+ *
51
+ * Auto-mode's squash merge performs a pre-merge dirty-tree check; concurrent
52
+ * writes by interactive commands between that check and the merge itself
53
+ * cause __dirty_working_tree__ failures (#4704).
54
+ */
55
+ function requireNotAutoActive(commandName: string, ctx: ExtensionCommandContext): boolean {
56
+ if (!isAutoActive()) return false;
57
+ ctx.ui.notify(
58
+ `${commandName} cannot run while auto-mode is active.\n` +
59
+ `Stop auto-mode first with /gsd stop, then run ${commandName}.`,
60
+ "error",
61
+ );
62
+ return true;
63
+ }
64
+
46
65
  // ─── Custom Workflow Subcommands ─────────────────────────────────────────
47
66
 
48
67
  const RESERVED_SUBCOMMANDS = new Set([
@@ -473,12 +492,14 @@ async function handleCustomWorkflow(
473
492
  export async function handleWorkflowCommand(trimmed: string, ctx: ExtensionCommandContext, pi: ExtensionAPI): Promise<boolean> {
474
493
  // ── /gsd do — natural language routing (must be early to route to other commands) ──
475
494
  if (trimmed === "do" || trimmed.startsWith("do ")) {
495
+ if (requireNotAutoActive("/gsd do", ctx)) return true;
476
496
  const { handleDo } = await import("../../commands-do.js");
477
497
  await handleDo(trimmed.replace(/^do\s*/, "").trim(), ctx, pi);
478
498
  return true;
479
499
  }
480
500
  // ── Backlog management ──
481
501
  if (trimmed === "backlog" || trimmed.startsWith("backlog ")) {
502
+ if (requireNotAutoActive("/gsd backlog", ctx)) return true;
482
503
  const { handleBacklog } = await import("../../commands-backlog.js");
483
504
  await handleBacklog(trimmed.replace(/^backlog\s*/, "").trim(), ctx, pi);
484
505
  return true;
@@ -490,26 +511,22 @@ export async function handleWorkflowCommand(trimmed: string, ctx: ExtensionComma
490
511
  }
491
512
 
492
513
  if (trimmed === "queue") {
514
+ if (requireNotAutoActive("/gsd queue", ctx)) return true;
493
515
  await showQueue(ctx, pi, projectRoot());
494
516
  return true;
495
517
  }
496
518
  if (trimmed === "discuss") {
519
+ if (requireNotAutoActive("/gsd discuss", ctx)) return true;
497
520
  await showDiscuss(ctx, pi, projectRoot());
498
521
  return true;
499
522
  }
500
523
  if (trimmed === "quick" || trimmed.startsWith("quick ")) {
501
- if (isAutoActive()) {
502
- ctx.ui.notify(
503
- "/gsd quick cannot run while auto-mode is active.\n" +
504
- "Stop auto-mode first with /gsd stop, then run /gsd quick.",
505
- "error",
506
- );
507
- return true;
508
- }
524
+ if (requireNotAutoActive("/gsd quick", ctx)) return true;
509
525
  await handleQuick(trimmed.replace(/^quick\s*/, "").trim(), ctx, pi);
510
526
  return true;
511
527
  }
512
528
  if (trimmed === "new-milestone") {
529
+ if (requireNotAutoActive("/gsd new-milestone", ctx)) return true;
513
530
  const basePath = projectRoot();
514
531
  const headlessContextPath = join(gsdRoot(basePath), "runtime", "headless-context.md");
515
532
  if (existsSync(headlessContextPath)) {
@@ -531,6 +548,7 @@ export async function handleWorkflowCommand(trimmed: string, ctx: ExtensionComma
531
548
  return true;
532
549
  }
533
550
  if (trimmed === "park" || trimmed.startsWith("park ")) {
551
+ if (requireNotAutoActive("/gsd park", ctx)) return true;
534
552
  const basePath = projectRoot();
535
553
  const arg = trimmed.replace(/^park\s*/, "").trim();
536
554
  let targetId = arg;
@@ -556,6 +574,7 @@ export async function handleWorkflowCommand(trimmed: string, ctx: ExtensionComma
556
574
  return true;
557
575
  }
558
576
  if (trimmed === "unpark" || trimmed.startsWith("unpark ")) {
577
+ if (requireNotAutoActive("/gsd unpark", ctx)) return true;
559
578
  const basePath = projectRoot();
560
579
  const arg = trimmed.replace(/^unpark\s*/, "").trim();
561
580
  let targetId = arg;
@@ -1,6 +1,5 @@
1
1
  import type { ExtensionCommandContext } from "@gsd/pi-coding-agent";
2
2
  import { existsSync, readFileSync, writeFileSync } from "node:fs";
3
- import { clearCmuxSidebar, CmuxClient, detectCmuxEnvironment, resolveCmuxConfig } from "../cmux/index.js";
4
3
  import { saveFile } from "./files.js";
5
4
  import {
6
5
  getProjectGSDPreferencesPath,
@@ -77,7 +76,9 @@ function resolveProjectPreferencesWritePath(): string {
77
76
  return loadProjectGSDPreferences()?.path ?? getProjectGSDPreferencesPath();
78
77
  }
79
78
 
80
- function formatCmuxStatus(): string {
79
+ async function formatCmuxStatus(): Promise<string> {
80
+ const { CmuxClient, detectCmuxEnvironment, resolveCmuxConfig } =
81
+ await import("../cmux/index.js");
81
82
  const loaded = loadEffectiveGSDPreferences();
82
83
  const detected = detectCmuxEnvironment();
83
84
  const resolved = resolveCmuxConfig(loaded?.preferences);
@@ -103,7 +104,8 @@ function formatCmuxStatus(): string {
103
104
  ].join("\n");
104
105
  }
105
106
 
106
- function ensureCmuxAvailableForEnable(ctx: ExtensionCommandContext): boolean {
107
+ async function ensureCmuxAvailableForEnable(ctx: ExtensionCommandContext): Promise<boolean> {
108
+ const { detectCmuxEnvironment } = await import("../cmux/index.js");
107
109
  const detected = detectCmuxEnvironment();
108
110
  if (detected.available) return true;
109
111
  ctx.ui.notify(
@@ -116,12 +118,12 @@ function ensureCmuxAvailableForEnable(ctx: ExtensionCommandContext): boolean {
116
118
  export async function handleCmux(args: string, ctx: ExtensionCommandContext): Promise<void> {
117
119
  const trimmed = args.trim();
118
120
  if (!trimmed || trimmed === "status") {
119
- ctx.ui.notify(formatCmuxStatus(), "info");
121
+ ctx.ui.notify(await formatCmuxStatus(), "info");
120
122
  return;
121
123
  }
122
124
 
123
125
  if (trimmed === "on") {
124
- if (!ensureCmuxAvailableForEnable(ctx)) return;
126
+ if (!await ensureCmuxAvailableForEnable(ctx)) return;
125
127
  await writeProjectCmuxPreferences(ctx, (prefs) => {
126
128
  prefs.cmux = {
127
129
  enabled: true,
@@ -142,6 +144,7 @@ export async function handleCmux(args: string, ctx: ExtensionCommandContext): Pr
142
144
  await writeProjectCmuxPreferences(ctx, (prefs) => {
143
145
  prefs.cmux = { ...((prefs.cmux as Record<string, unknown> | undefined) ?? {}), enabled: false };
144
146
  });
147
+ const { clearCmuxSidebar } = await import("../cmux/index.js");
145
148
  clearCmuxSidebar(effective);
146
149
  ctx.ui.notify("cmux integration disabled in project preferences.", "info");
147
150
  return;
@@ -151,7 +154,7 @@ export async function handleCmux(args: string, ctx: ExtensionCommandContext): Pr
151
154
  if (parts.length === 2 && ["notifications", "sidebar", "splits", "browser"].includes(parts[0]) && ["on", "off"].includes(parts[1])) {
152
155
  const feature = parts[0] as "notifications" | "sidebar" | "splits" | "browser";
153
156
  const enabled = parts[1] === "on";
154
- if (enabled && !ensureCmuxAvailableForEnable(ctx)) return;
157
+ if (enabled && !await ensureCmuxAvailableForEnable(ctx)) return;
155
158
 
156
159
  await writeProjectCmuxPreferences(ctx, (prefs) => {
157
160
  const next = { ...((prefs.cmux as Record<string, unknown> | undefined) ?? {}) };
@@ -161,6 +164,7 @@ export async function handleCmux(args: string, ctx: ExtensionCommandContext): Pr
161
164
  });
162
165
 
163
166
  if (!enabled && feature === "sidebar") {
167
+ const { clearCmuxSidebar } = await import("../cmux/index.js");
164
168
  clearCmuxSidebar(loadEffectiveGSDPreferences()?.preferences);
165
169
  }
166
170