gsd-pi 2.75.0-next.9c0ec0ba1 → 2.76.0-dev.b072ebb73

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 (680) hide show
  1. package/README.md +145 -125
  2. package/dist/claude-cli-check.d.ts +10 -0
  3. package/dist/claude-cli-check.js +13 -3
  4. package/dist/onboarding.d.ts +20 -1
  5. package/dist/onboarding.js +60 -25
  6. package/dist/resources/agents/researcher.md +1 -1
  7. package/dist/resources/extensions/ask-user-questions.js +6 -3
  8. package/dist/resources/extensions/claude-code-cli/readiness.js +34 -2
  9. package/dist/resources/extensions/claude-code-cli/stream-adapter.js +44 -2
  10. package/dist/resources/extensions/gsd/auto/phases.js +48 -6
  11. package/dist/resources/extensions/gsd/auto-artifact-paths.js +20 -0
  12. package/dist/resources/extensions/gsd/auto-dashboard.js +37 -8
  13. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +8 -2
  14. package/dist/resources/extensions/gsd/auto-dispatch.js +87 -9
  15. package/dist/resources/extensions/gsd/auto-model-selection.js +27 -6
  16. package/dist/resources/extensions/gsd/auto-post-unit.js +7 -5
  17. package/dist/resources/extensions/gsd/auto-prompts.js +188 -44
  18. package/dist/resources/extensions/gsd/auto-recovery.js +48 -0
  19. package/dist/resources/extensions/gsd/auto-start.js +5 -3
  20. package/dist/resources/extensions/gsd/auto-verification.js +33 -0
  21. package/dist/resources/extensions/gsd/auto-worktree.js +71 -2
  22. package/dist/resources/extensions/gsd/auto.js +25 -3
  23. package/dist/resources/extensions/gsd/bootstrap/agent-end-recovery.js +8 -21
  24. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +45 -23
  25. package/dist/resources/extensions/gsd/bootstrap/memory-tools.js +131 -0
  26. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +29 -0
  27. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +12 -0
  28. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +22 -0
  29. package/dist/resources/extensions/gsd/bootstrap/system-context.js +84 -10
  30. package/dist/resources/extensions/gsd/commands/catalog.js +15 -7
  31. package/dist/resources/extensions/gsd/commands/handlers/core.js +58 -24
  32. package/dist/resources/extensions/gsd/commands/handlers/escalate.js +171 -0
  33. package/dist/resources/extensions/gsd/commands/handlers/onboarding.js +159 -0
  34. package/dist/resources/extensions/gsd/commands/handlers/ops.js +10 -0
  35. package/dist/resources/extensions/gsd/commands-config.js +5 -0
  36. package/dist/resources/extensions/gsd/commands-extract-learnings.js +200 -77
  37. package/dist/resources/extensions/gsd/commands-memory.js +462 -0
  38. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +39 -11
  39. package/dist/resources/extensions/gsd/custom-workflow-engine.js +74 -54
  40. package/dist/resources/extensions/gsd/db-writer.js +89 -16
  41. package/dist/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  42. package/dist/resources/extensions/gsd/doctor-environment.js +2 -1
  43. package/dist/resources/extensions/gsd/doctor-git-checks.js +50 -32
  44. package/dist/resources/extensions/gsd/doctor-proactive.js +4 -1
  45. package/dist/resources/extensions/gsd/doctor-providers.js +51 -5
  46. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +21 -1
  47. package/dist/resources/extensions/gsd/doctor.js +7 -1
  48. package/dist/resources/extensions/gsd/ecosystem/gsd-extension-api.js +1 -0
  49. package/dist/resources/extensions/gsd/error-classifier.js +5 -2
  50. package/dist/resources/extensions/gsd/escalation.js +321 -0
  51. package/dist/resources/extensions/gsd/graph.js +26 -0
  52. package/dist/resources/extensions/gsd/gsd-db.js +517 -32
  53. package/dist/resources/extensions/gsd/health-widget-core.js +42 -14
  54. package/dist/resources/extensions/gsd/health-widget.js +7 -4
  55. package/dist/resources/extensions/gsd/hook-emitter.js +108 -0
  56. package/dist/resources/extensions/gsd/init-wizard.js +86 -45
  57. package/dist/resources/extensions/gsd/markdown-renderer.js +5 -5
  58. package/dist/resources/extensions/gsd/memory-backfill.js +126 -0
  59. package/dist/resources/extensions/gsd/memory-embeddings.js +219 -0
  60. package/dist/resources/extensions/gsd/memory-extractor.js +78 -27
  61. package/dist/resources/extensions/gsd/memory-ingest.js +218 -0
  62. package/dist/resources/extensions/gsd/memory-relations.js +189 -0
  63. package/dist/resources/extensions/gsd/memory-source-store.js +113 -0
  64. package/dist/resources/extensions/gsd/memory-store.js +318 -6
  65. package/dist/resources/extensions/gsd/metrics.js +1 -0
  66. package/dist/resources/extensions/gsd/model-cost-table.js +1 -0
  67. package/dist/resources/extensions/gsd/model-router.js +12 -5
  68. package/dist/resources/extensions/gsd/native-git-bridge.js +121 -5
  69. package/dist/resources/extensions/gsd/notification-overlay.js +7 -22
  70. package/dist/resources/extensions/gsd/notification-widget.js +24 -39
  71. package/dist/resources/extensions/gsd/onboarding-state.js +133 -0
  72. package/dist/resources/extensions/gsd/post-execution-checks.js +27 -11
  73. package/dist/resources/extensions/gsd/pre-execution-checks.js +98 -8
  74. package/dist/resources/extensions/gsd/preferences-models.js +1 -0
  75. package/dist/resources/extensions/gsd/preferences-types.js +2 -1
  76. package/dist/resources/extensions/gsd/preferences-validation.js +42 -8
  77. package/dist/resources/extensions/gsd/prompts/add-tests.md +1 -0
  78. package/dist/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  79. package/dist/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  80. package/dist/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  81. package/dist/resources/extensions/gsd/prompts/execute-task.md +16 -3
  82. package/dist/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  83. package/dist/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  84. package/dist/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  85. package/dist/resources/extensions/gsd/prompts/research-slice.md +1 -0
  86. package/dist/resources/extensions/gsd/python-resolver.js +70 -0
  87. package/dist/resources/extensions/gsd/setup-catalog.js +75 -0
  88. package/dist/resources/extensions/gsd/state.js +90 -7
  89. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +1 -1
  90. package/dist/resources/extensions/gsd/tools/complete-task.js +80 -0
  91. package/dist/resources/extensions/gsd/tools/memory-tools.js +331 -0
  92. package/dist/resources/extensions/gsd/tools/plan-milestone.js +37 -12
  93. package/dist/resources/extensions/gsd/tools/plan-slice.js +5 -2
  94. package/dist/resources/extensions/gsd/tools/skip-slice.js +78 -0
  95. package/dist/resources/extensions/gsd/tools/workflow-tool-executors.js +14 -0
  96. package/dist/resources/extensions/gsd/uok/flags.js +1 -1
  97. package/dist/resources/extensions/gsd/verification-gate.js +2 -1
  98. package/dist/resources/extensions/gsd/workflow-manifest.js +8 -0
  99. package/dist/resources/extensions/gsd/workflow-mcp.js +1 -0
  100. package/dist/resources/extensions/gsd/workflow-projections.js +17 -15
  101. package/dist/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  102. package/dist/resources/extensions/gsd/worktree-resolver.js +42 -1
  103. package/dist/resources/extensions/remote-questions/manager.js +11 -1
  104. package/dist/resources/extensions/search-the-web/command-search-provider.js +4 -1
  105. package/dist/resources/extensions/search-the-web/native-search.js +13 -2
  106. package/dist/resources/skills/api-design/SKILL.md +190 -0
  107. package/dist/resources/skills/create-mcp-server/SKILL.md +121 -0
  108. package/dist/resources/skills/decompose-into-slices/SKILL.md +139 -0
  109. package/dist/resources/skills/dependency-upgrade/SKILL.md +158 -0
  110. package/dist/resources/skills/design-an-interface/SKILL.md +102 -0
  111. package/dist/resources/skills/forensics/SKILL.md +153 -0
  112. package/dist/resources/skills/grill-me/SKILL.md +93 -0
  113. package/dist/resources/skills/handoff/SKILL.md +121 -0
  114. package/dist/resources/skills/observability/SKILL.md +174 -0
  115. package/dist/resources/skills/security-review/SKILL.md +181 -0
  116. package/dist/resources/skills/spike-wrap-up/SKILL.md +138 -0
  117. package/dist/resources/skills/tdd/SKILL.md +112 -0
  118. package/dist/resources/skills/verify-before-complete/SKILL.md +97 -0
  119. package/dist/resources/skills/write-docs/SKILL.md +81 -0
  120. package/dist/resources/skills/write-milestone-brief/SKILL.md +135 -0
  121. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  122. package/dist/web/standalone/.next/BUILD_ID +1 -1
  123. package/dist/web/standalone/.next/app-path-routes-manifest.json +11 -11
  124. package/dist/web/standalone/.next/build-manifest.json +3 -3
  125. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  126. package/dist/web/standalone/.next/react-loadable-manifest.json +2 -2
  127. package/dist/web/standalone/.next/required-server-files.json +1 -1
  128. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  130. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  131. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  132. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  133. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  134. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  135. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  136. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  137. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  138. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  139. package/dist/web/standalone/.next/server/app/_not-found.rsc +2 -2
  140. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  141. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  142. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  143. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  144. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  145. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  146. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  148. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  150. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  152. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  153. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  154. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  156. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  158. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  160. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  162. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  164. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  166. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  168. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  170. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  172. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  174. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  176. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  178. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  179. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  180. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  182. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  184. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  186. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  188. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  190. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -2
  191. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  192. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  193. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  194. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  195. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  196. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  197. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  198. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  199. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  200. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  201. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  202. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  203. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  204. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +2 -2
  205. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  206. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  207. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  208. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  209. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  210. package/dist/web/standalone/.next/server/app/index.html +1 -1
  211. package/dist/web/standalone/.next/server/app/index.rsc +3 -3
  212. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  213. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +3 -3
  214. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  215. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +2 -2
  216. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  217. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  218. package/dist/web/standalone/.next/server/app-paths-manifest.json +11 -11
  219. package/dist/web/standalone/.next/server/chunks/6897.js +2 -2
  220. package/dist/web/standalone/.next/server/chunks/7461.js +1 -0
  221. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  222. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  223. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  224. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  225. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  226. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  227. package/dist/web/standalone/.next/static/chunks/{2826.02df9631042cc18e.js → 2826.e59e8578e2e28639.js} +2 -2
  228. package/dist/web/standalone/.next/static/chunks/{2008.71ee9230ad78df21.js → 3621.fc7480022c972438.js} +2 -2
  229. package/dist/web/standalone/.next/static/chunks/app/{page-f1e30ab6bb269149.js → page-5b113fd32bc2a1c3.js} +1 -1
  230. package/dist/web/standalone/.next/static/chunks/{webpack-6c7cda3e318eedb6.js → webpack-5fc74f13a25fa1bb.js} +1 -1
  231. package/dist/web/standalone/.next/static/css/632cd626b1731d88.css +1 -0
  232. package/dist/web/standalone/server.js +1 -1
  233. package/dist/welcome-screen.js +48 -24
  234. package/package.json +1 -1
  235. package/packages/daemon/package.json +2 -2
  236. package/packages/mcp-server/dist/server.d.ts.map +1 -1
  237. package/packages/mcp-server/dist/server.js +12 -10
  238. package/packages/mcp-server/dist/server.js.map +1 -1
  239. package/packages/mcp-server/dist/session-manager.d.ts.map +1 -1
  240. package/packages/mcp-server/dist/session-manager.js +8 -1
  241. package/packages/mcp-server/dist/session-manager.js.map +1 -1
  242. package/packages/mcp-server/dist/workflow-tools.d.ts +2 -1
  243. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  244. package/packages/mcp-server/dist/workflow-tools.js +306 -71
  245. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  246. package/packages/mcp-server/package.json +2 -2
  247. package/packages/mcp-server/src/mcp-server.test.ts +40 -4
  248. package/packages/mcp-server/src/server.ts +12 -10
  249. package/packages/mcp-server/src/session-manager.ts +10 -3
  250. package/packages/mcp-server/src/workflow-tools.test.ts +346 -1
  251. package/packages/mcp-server/src/workflow-tools.ts +359 -75
  252. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  253. package/packages/native/package.json +1 -1
  254. package/packages/pi-agent-core/dist/agent-loop.js +12 -0
  255. package/packages/pi-agent-core/dist/agent-loop.js.map +1 -1
  256. package/packages/pi-agent-core/dist/types.d.ts +30 -0
  257. package/packages/pi-agent-core/dist/types.d.ts.map +1 -1
  258. package/packages/pi-agent-core/dist/types.js.map +1 -1
  259. package/packages/pi-agent-core/package.json +1 -1
  260. package/packages/pi-agent-core/src/agent-loop.ts +14 -0
  261. package/packages/pi-agent-core/src/types.ts +34 -0
  262. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  263. package/packages/pi-ai/dist/index.d.ts +1 -0
  264. package/packages/pi-ai/dist/index.d.ts.map +1 -1
  265. package/packages/pi-ai/dist/index.js +1 -0
  266. package/packages/pi-ai/dist/index.js.map +1 -1
  267. package/packages/pi-ai/dist/models/generated/index.d.ts +17 -0
  268. package/packages/pi-ai/dist/models/generated/index.d.ts.map +1 -1
  269. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts +17 -0
  270. package/packages/pi-ai/dist/models/generated/openai-codex.d.ts.map +1 -1
  271. package/packages/pi-ai/dist/models/generated/openai-codex.js +17 -0
  272. package/packages/pi-ai/dist/models/generated/openai-codex.js.map +1 -1
  273. package/packages/pi-ai/dist/models.generated.test.js +1 -0
  274. package/packages/pi-ai/dist/models.generated.test.js.map +1 -1
  275. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts +22 -1
  276. package/packages/pi-ai/dist/providers/amazon-bedrock.d.ts.map +1 -1
  277. package/packages/pi-ai/dist/providers/amazon-bedrock.js +40 -7
  278. package/packages/pi-ai/dist/providers/amazon-bedrock.js.map +1 -1
  279. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts +2 -0
  280. package/packages/pi-ai/dist/providers/amazon-bedrock.test.d.ts.map +1 -0
  281. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js +106 -0
  282. package/packages/pi-ai/dist/providers/amazon-bedrock.test.js.map +1 -0
  283. package/packages/pi-ai/dist/providers/anthropic-auth.test.js +42 -1
  284. package/packages/pi-ai/dist/providers/anthropic-auth.test.js.map +1 -1
  285. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts +2 -0
  286. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.d.ts.map +1 -0
  287. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js +13 -0
  288. package/packages/pi-ai/dist/providers/anthropic-bearer-auth.test.js.map +1 -0
  289. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts +19 -0
  290. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  291. package/packages/pi-ai/dist/providers/anthropic-shared.js +25 -1
  292. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  293. package/packages/pi-ai/dist/providers/anthropic.d.ts +11 -0
  294. package/packages/pi-ai/dist/providers/anthropic.d.ts.map +1 -1
  295. package/packages/pi-ai/dist/providers/anthropic.js +23 -2
  296. package/packages/pi-ai/dist/providers/anthropic.js.map +1 -1
  297. package/packages/pi-ai/dist/providers/api-family.d.ts +27 -0
  298. package/packages/pi-ai/dist/providers/api-family.d.ts.map +1 -0
  299. package/packages/pi-ai/dist/providers/api-family.js +47 -0
  300. package/packages/pi-ai/dist/providers/api-family.js.map +1 -0
  301. package/packages/pi-ai/dist/providers/api-family.test.d.ts +2 -0
  302. package/packages/pi-ai/dist/providers/api-family.test.d.ts.map +1 -0
  303. package/packages/pi-ai/dist/providers/api-family.test.js +101 -0
  304. package/packages/pi-ai/dist/providers/api-family.test.js.map +1 -0
  305. package/packages/pi-ai/dist/utils/oauth/github-copilot.d.ts.map +1 -1
  306. package/packages/pi-ai/dist/utils/oauth/github-copilot.js +12 -2
  307. package/packages/pi-ai/dist/utils/oauth/github-copilot.js.map +1 -1
  308. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js +164 -14
  309. package/packages/pi-ai/dist/utils/oauth/github-copilot.test.js.map +1 -1
  310. package/packages/pi-ai/dist/utils/oauth/google-antigravity.d.ts.map +1 -1
  311. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js +15 -3
  312. package/packages/pi-ai/dist/utils/oauth/google-antigravity.js.map +1 -1
  313. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts +2 -0
  314. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.d.ts.map +1 -0
  315. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js +67 -0
  316. package/packages/pi-ai/dist/utils/oauth/google-antigravity.test.js.map +1 -0
  317. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.d.ts.map +1 -1
  318. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js +16 -3
  319. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.js.map +1 -1
  320. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts +2 -0
  321. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.d.ts.map +1 -0
  322. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js +67 -0
  323. package/packages/pi-ai/dist/utils/oauth/google-gemini-cli.test.js.map +1 -0
  324. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts +2 -0
  325. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.d.ts.map +1 -0
  326. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js +289 -0
  327. package/packages/pi-ai/dist/utils/oauth/oauth-providers.test.js.map +1 -0
  328. package/packages/pi-ai/dist/utils/oauth/openai-codex.d.ts.map +1 -1
  329. package/packages/pi-ai/dist/utils/oauth/openai-codex.js +12 -0
  330. package/packages/pi-ai/dist/utils/oauth/openai-codex.js.map +1 -1
  331. package/packages/pi-ai/package.json +1 -1
  332. package/packages/pi-ai/scripts/generate-models.ts +12 -0
  333. package/packages/pi-ai/src/index.ts +1 -0
  334. package/packages/pi-ai/src/models/generated/openai-codex.ts +17 -0
  335. package/packages/pi-ai/src/models.generated.test.ts +1 -0
  336. package/packages/pi-ai/src/providers/amazon-bedrock.test.ts +164 -0
  337. package/packages/pi-ai/src/providers/amazon-bedrock.ts +41 -8
  338. package/packages/pi-ai/src/providers/anthropic-auth.test.ts +47 -1
  339. package/packages/pi-ai/src/providers/anthropic-bearer-auth.test.ts +26 -0
  340. package/packages/pi-ai/src/providers/anthropic-shared.ts +30 -1
  341. package/packages/pi-ai/src/providers/anthropic.ts +25 -2
  342. package/packages/pi-ai/src/providers/api-family.test.ts +129 -0
  343. package/packages/pi-ai/src/providers/api-family.ts +57 -0
  344. package/packages/pi-ai/src/utils/oauth/github-copilot.test.ts +200 -23
  345. package/packages/pi-ai/src/utils/oauth/github-copilot.ts +12 -2
  346. package/packages/pi-ai/src/utils/oauth/google-antigravity.test.ts +84 -0
  347. package/packages/pi-ai/src/utils/oauth/google-antigravity.ts +15 -5
  348. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.test.ts +84 -0
  349. package/packages/pi-ai/src/utils/oauth/google-gemini-cli.ts +16 -5
  350. package/packages/pi-ai/src/utils/oauth/oauth-providers.test.ts +363 -0
  351. package/packages/pi-ai/src/utils/oauth/openai-codex.ts +15 -0
  352. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  353. package/packages/pi-coding-agent/dist/cli/args.d.ts +6 -0
  354. package/packages/pi-coding-agent/dist/cli/args.d.ts.map +1 -1
  355. package/packages/pi-coding-agent/dist/cli/args.js +14 -4
  356. package/packages/pi-coding-agent/dist/cli/args.js.map +1 -1
  357. package/packages/pi-coding-agent/dist/cli/args.test.d.ts +2 -0
  358. package/packages/pi-coding-agent/dist/cli/args.test.d.ts.map +1 -0
  359. package/packages/pi-coding-agent/dist/cli/args.test.js +38 -0
  360. package/packages/pi-coding-agent/dist/cli/args.test.js.map +1 -0
  361. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  362. package/packages/pi-coding-agent/dist/core/agent-session.js +25 -2
  363. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  364. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts +7 -0
  365. package/packages/pi-coding-agent/dist/core/auth-storage.d.ts.map +1 -1
  366. package/packages/pi-coding-agent/dist/core/auth-storage.js +25 -0
  367. package/packages/pi-coding-agent/dist/core/auth-storage.js.map +1 -1
  368. package/packages/pi-coding-agent/dist/core/auth-storage.test.js +38 -0
  369. package/packages/pi-coding-agent/dist/core/auth-storage.test.js.map +1 -1
  370. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js +4 -1
  371. package/packages/pi-coding-agent/dist/core/chat-controller-ordering.test.js.map +1 -1
  372. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts +1 -1
  373. package/packages/pi-coding-agent/dist/core/extensions/index.d.ts.map +1 -1
  374. package/packages/pi-coding-agent/dist/core/extensions/index.js.map +1 -1
  375. package/packages/pi-coding-agent/dist/core/extensions/loader.d.ts.map +1 -1
  376. package/packages/pi-coding-agent/dist/core/extensions/loader.js +4 -0
  377. package/packages/pi-coding-agent/dist/core/extensions/loader.js.map +1 -1
  378. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts +34 -2
  379. package/packages/pi-coding-agent/dist/core/extensions/runner.d.ts.map +1 -1
  380. package/packages/pi-coding-agent/dist/core/extensions/runner.js +233 -0
  381. package/packages/pi-coding-agent/dist/core/extensions/runner.js.map +1 -1
  382. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts +200 -3
  383. package/packages/pi-coding-agent/dist/core/extensions/types.d.ts.map +1 -1
  384. package/packages/pi-coding-agent/dist/core/extensions/types.js.map +1 -1
  385. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts +53 -0
  386. package/packages/pi-coding-agent/dist/core/hooks-runner.d.ts.map +1 -0
  387. package/packages/pi-coding-agent/dist/core/hooks-runner.js +337 -0
  388. package/packages/pi-coding-agent/dist/core/hooks-runner.js.map +1 -0
  389. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts +2 -0
  390. package/packages/pi-coding-agent/dist/core/hooks-runner.test.d.ts.map +1 -0
  391. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js +234 -0
  392. package/packages/pi-coding-agent/dist/core/hooks-runner.test.js.map +1 -0
  393. package/packages/pi-coding-agent/dist/core/index.d.ts +1 -0
  394. package/packages/pi-coding-agent/dist/core/index.d.ts.map +1 -1
  395. package/packages/pi-coding-agent/dist/core/index.js +1 -0
  396. package/packages/pi-coding-agent/dist/core/index.js.map +1 -1
  397. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts +2 -0
  398. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.d.ts.map +1 -0
  399. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js +40 -0
  400. package/packages/pi-coding-agent/dist/core/model-registry-auth-header.test.js.map +1 -0
  401. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +32 -0
  402. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  403. package/packages/pi-coding-agent/dist/core/retry-handler.d.ts.map +1 -1
  404. package/packages/pi-coding-agent/dist/core/retry-handler.js +4 -1
  405. package/packages/pi-coding-agent/dist/core/retry-handler.js.map +1 -1
  406. package/packages/pi-coding-agent/dist/core/sdk.d.ts +10 -0
  407. package/packages/pi-coding-agent/dist/core/sdk.d.ts.map +1 -1
  408. package/packages/pi-coding-agent/dist/core/sdk.js +33 -5
  409. package/packages/pi-coding-agent/dist/core/sdk.js.map +1 -1
  410. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts +55 -0
  411. package/packages/pi-coding-agent/dist/core/settings-manager.d.ts.map +1 -1
  412. package/packages/pi-coding-agent/dist/core/settings-manager.js.map +1 -1
  413. package/packages/pi-coding-agent/dist/index.d.ts +1 -1
  414. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  415. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  416. package/packages/pi-coding-agent/dist/main.d.ts.map +1 -1
  417. package/packages/pi-coding-agent/dist/main.js +3 -0
  418. package/packages/pi-coding-agent/dist/main.js.map +1 -1
  419. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.d.ts.map +1 -1
  420. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js +17 -7
  421. package/packages/pi-coding-agent/dist/modes/interactive/components/chat-frame.js.map +1 -1
  422. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.d.ts.map +1 -1
  423. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js +48 -34
  424. package/packages/pi-coding-agent/dist/modes/interactive/components/footer.js.map +1 -1
  425. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts +4 -0
  426. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.d.ts.map +1 -1
  427. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js +83 -33
  428. package/packages/pi-coding-agent/dist/modes/interactive/controllers/chat-controller.js.map +1 -1
  429. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts +1 -0
  430. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  431. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js +1 -0
  432. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  433. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts +1 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  435. package/packages/pi-coding-agent/dist/modes/interactive/theme/theme.js.map +1 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  437. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js +13 -9
  438. package/packages/pi-coding-agent/dist/modes/interactive/theme/themes.js.map +1 -1
  439. package/packages/pi-coding-agent/package.json +1 -1
  440. package/packages/pi-coding-agent/src/cli/args.test.ts +44 -0
  441. package/packages/pi-coding-agent/src/cli/args.ts +21 -6
  442. package/packages/pi-coding-agent/src/core/agent-session.ts +27 -2
  443. package/packages/pi-coding-agent/src/core/auth-storage.test.ts +42 -0
  444. package/packages/pi-coding-agent/src/core/auth-storage.ts +25 -0
  445. package/packages/pi-coding-agent/src/core/chat-controller-ordering.test.ts +4 -1
  446. package/packages/pi-coding-agent/src/core/extensions/index.ts +16 -0
  447. package/packages/pi-coding-agent/src/core/extensions/loader.ts +5 -0
  448. package/packages/pi-coding-agent/src/core/extensions/runner.ts +353 -1
  449. package/packages/pi-coding-agent/src/core/extensions/types.ts +253 -2
  450. package/packages/pi-coding-agent/src/core/hooks-runner.test.ts +269 -0
  451. package/packages/pi-coding-agent/src/core/hooks-runner.ts +460 -0
  452. package/packages/pi-coding-agent/src/core/index.ts +10 -0
  453. package/packages/pi-coding-agent/src/core/model-registry-auth-header.test.ts +44 -0
  454. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +37 -1
  455. package/packages/pi-coding-agent/src/core/retry-handler.ts +4 -1
  456. package/packages/pi-coding-agent/src/core/sdk.ts +48 -5
  457. package/packages/pi-coding-agent/src/core/settings-manager.ts +57 -0
  458. package/packages/pi-coding-agent/src/index.ts +16 -0
  459. package/packages/pi-coding-agent/src/main.ts +4 -0
  460. package/packages/pi-coding-agent/src/modes/interactive/components/chat-frame.ts +19 -7
  461. package/packages/pi-coding-agent/src/modes/interactive/components/footer.ts +53 -31
  462. package/packages/pi-coding-agent/src/modes/interactive/controllers/chat-controller.ts +88 -36
  463. package/packages/pi-coding-agent/src/modes/interactive/theme/theme-schema.ts +1 -0
  464. package/packages/pi-coding-agent/src/modes/interactive/theme/theme.ts +1 -0
  465. package/packages/pi-coding-agent/src/modes/interactive/theme/themes.ts +13 -9
  466. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  467. package/packages/pi-tui/package.json +1 -1
  468. package/packages/rpc-client/package.json +1 -1
  469. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts +1 -0
  470. package/pkg/dist/modes/interactive/theme/theme-schema.d.ts.map +1 -1
  471. package/pkg/dist/modes/interactive/theme/theme-schema.js +1 -0
  472. package/pkg/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  473. package/pkg/dist/modes/interactive/theme/theme.d.ts +1 -1
  474. package/pkg/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  475. package/pkg/dist/modes/interactive/theme/theme.js.map +1 -1
  476. package/pkg/dist/modes/interactive/theme/themes.d.ts.map +1 -1
  477. package/pkg/dist/modes/interactive/theme/themes.js +13 -9
  478. package/pkg/dist/modes/interactive/theme/themes.js.map +1 -1
  479. package/pkg/package.json +1 -1
  480. package/src/resources/agents/researcher.md +1 -1
  481. package/src/resources/extensions/ask-user-questions.ts +7 -4
  482. package/src/resources/extensions/claude-code-cli/readiness.ts +36 -2
  483. package/src/resources/extensions/claude-code-cli/stream-adapter.ts +59 -1
  484. package/src/resources/extensions/claude-code-cli/tests/stream-adapter.test.ts +66 -0
  485. package/src/resources/extensions/gsd/auto/loop-deps.ts +2 -10
  486. package/src/resources/extensions/gsd/auto/phases.ts +52 -6
  487. package/src/resources/extensions/gsd/auto-artifact-paths.ts +20 -0
  488. package/src/resources/extensions/gsd/auto-dashboard.ts +46 -5
  489. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +15 -2
  490. package/src/resources/extensions/gsd/auto-dispatch.ts +96 -4
  491. package/src/resources/extensions/gsd/auto-model-selection.ts +37 -6
  492. package/src/resources/extensions/gsd/auto-post-unit.ts +7 -5
  493. package/src/resources/extensions/gsd/auto-prompts.ts +225 -45
  494. package/src/resources/extensions/gsd/auto-recovery.ts +47 -0
  495. package/src/resources/extensions/gsd/auto-start.ts +8 -6
  496. package/src/resources/extensions/gsd/auto-verification.ts +33 -0
  497. package/src/resources/extensions/gsd/auto-worktree.ts +81 -1
  498. package/src/resources/extensions/gsd/auto.ts +27 -2
  499. package/src/resources/extensions/gsd/bootstrap/agent-end-recovery.ts +8 -21
  500. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +46 -24
  501. package/src/resources/extensions/gsd/bootstrap/memory-tools.ts +163 -0
  502. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +31 -0
  503. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +15 -0
  504. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +22 -0
  505. package/src/resources/extensions/gsd/bootstrap/system-context.ts +89 -10
  506. package/src/resources/extensions/gsd/commands/catalog.ts +15 -7
  507. package/src/resources/extensions/gsd/commands/handlers/core.ts +63 -27
  508. package/src/resources/extensions/gsd/commands/handlers/escalate.ts +216 -0
  509. package/src/resources/extensions/gsd/commands/handlers/onboarding.ts +196 -0
  510. package/src/resources/extensions/gsd/commands/handlers/ops.ts +10 -0
  511. package/src/resources/extensions/gsd/commands-config.ts +10 -0
  512. package/src/resources/extensions/gsd/commands-extract-learnings.ts +262 -78
  513. package/src/resources/extensions/gsd/commands-memory.ts +551 -0
  514. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +48 -11
  515. package/src/resources/extensions/gsd/custom-workflow-engine.ts +85 -60
  516. package/src/resources/extensions/gsd/db-writer.ts +91 -17
  517. package/src/resources/extensions/gsd/docs/preferences-reference.md +2 -2
  518. package/src/resources/extensions/gsd/doctor-environment.ts +2 -1
  519. package/src/resources/extensions/gsd/doctor-git-checks.ts +51 -30
  520. package/src/resources/extensions/gsd/doctor-proactive.ts +4 -1
  521. package/src/resources/extensions/gsd/doctor-providers.ts +59 -6
  522. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +22 -1
  523. package/src/resources/extensions/gsd/doctor-types.ts +1 -0
  524. package/src/resources/extensions/gsd/doctor.ts +7 -1
  525. package/src/resources/extensions/gsd/ecosystem/gsd-extension-api.ts +2 -0
  526. package/src/resources/extensions/gsd/error-classifier.ts +5 -2
  527. package/src/resources/extensions/gsd/escalation.ts +367 -0
  528. package/src/resources/extensions/gsd/graph.ts +33 -0
  529. package/src/resources/extensions/gsd/gsd-db.ts +617 -32
  530. package/src/resources/extensions/gsd/health-widget-core.ts +43 -14
  531. package/src/resources/extensions/gsd/health-widget.ts +7 -3
  532. package/src/resources/extensions/gsd/hook-emitter.ts +188 -0
  533. package/src/resources/extensions/gsd/init-wizard.ts +87 -54
  534. package/src/resources/extensions/gsd/markdown-renderer.ts +5 -5
  535. package/src/resources/extensions/gsd/memory-backfill.ts +140 -0
  536. package/src/resources/extensions/gsd/memory-embeddings.ts +235 -0
  537. package/src/resources/extensions/gsd/memory-extractor.ts +100 -34
  538. package/src/resources/extensions/gsd/memory-ingest.ts +286 -0
  539. package/src/resources/extensions/gsd/memory-relations.ts +240 -0
  540. package/src/resources/extensions/gsd/memory-source-store.ts +138 -0
  541. package/src/resources/extensions/gsd/memory-store.ts +377 -7
  542. package/src/resources/extensions/gsd/metrics.ts +1 -0
  543. package/src/resources/extensions/gsd/model-cost-table.ts +1 -0
  544. package/src/resources/extensions/gsd/model-router.ts +21 -5
  545. package/src/resources/extensions/gsd/native-git-bridge.ts +118 -6
  546. package/src/resources/extensions/gsd/notification-overlay.ts +9 -19
  547. package/src/resources/extensions/gsd/notification-widget.ts +25 -43
  548. package/src/resources/extensions/gsd/onboarding-state.ts +146 -0
  549. package/src/resources/extensions/gsd/post-execution-checks.ts +37 -14
  550. package/src/resources/extensions/gsd/pre-execution-checks.ts +100 -12
  551. package/src/resources/extensions/gsd/preferences-models.ts +1 -0
  552. package/src/resources/extensions/gsd/preferences-types.ts +9 -1
  553. package/src/resources/extensions/gsd/preferences-validation.ts +33 -7
  554. package/src/resources/extensions/gsd/prompts/add-tests.md +1 -0
  555. package/src/resources/extensions/gsd/prompts/complete-milestone.md +4 -1
  556. package/src/resources/extensions/gsd/prompts/complete-slice.md +2 -2
  557. package/src/resources/extensions/gsd/prompts/debug-diagnose.md +2 -0
  558. package/src/resources/extensions/gsd/prompts/execute-task.md +16 -3
  559. package/src/resources/extensions/gsd/prompts/plan-milestone.md +12 -0
  560. package/src/resources/extensions/gsd/prompts/plan-slice.md +2 -0
  561. package/src/resources/extensions/gsd/prompts/refine-slice.md +69 -0
  562. package/src/resources/extensions/gsd/prompts/research-slice.md +1 -0
  563. package/src/resources/extensions/gsd/python-resolver.ts +76 -0
  564. package/src/resources/extensions/gsd/setup-catalog.ts +105 -0
  565. package/src/resources/extensions/gsd/state.ts +95 -6
  566. package/src/resources/extensions/gsd/templates/PREFERENCES.md +1 -1
  567. package/src/resources/extensions/gsd/tests/artifact-corruption-2630.test.ts +7 -0
  568. package/src/resources/extensions/gsd/tests/auto-dashboard.test.ts +49 -0
  569. package/src/resources/extensions/gsd/tests/auto-migrating-recovery.test.ts +63 -0
  570. package/src/resources/extensions/gsd/tests/auto-model-selection.test.ts +95 -1
  571. package/src/resources/extensions/gsd/tests/auto-prompts-fallback.test.ts +35 -0
  572. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +123 -1
  573. package/src/resources/extensions/gsd/tests/auto-wrapup-inflight-guard.test.ts +39 -0
  574. package/src/resources/extensions/gsd/tests/bundled-skill-triggers.test.ts +54 -0
  575. package/src/resources/extensions/gsd/tests/commands-extract-learnings.test.ts +335 -21
  576. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +6 -8
  577. package/src/resources/extensions/gsd/tests/complete-task.test.ts +2 -2
  578. package/src/resources/extensions/gsd/tests/custom-workflow-engine.test.ts +63 -0
  579. package/src/resources/extensions/gsd/tests/derive-state-db.test.ts +42 -0
  580. package/src/resources/extensions/gsd/tests/derive-state-helpers.test.ts +8 -4
  581. package/src/resources/extensions/gsd/tests/doctor-providers.test.ts +117 -3
  582. package/src/resources/extensions/gsd/tests/enhanced-verification-integration.test.ts +5 -0
  583. package/src/resources/extensions/gsd/tests/ensure-db-open.test.ts +306 -1
  584. package/src/resources/extensions/gsd/tests/escalation.test.ts +818 -0
  585. package/src/resources/extensions/gsd/tests/flat-rate-routing-guard.test.ts +145 -8
  586. package/src/resources/extensions/gsd/tests/freeform-decisions.test.ts +62 -0
  587. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +44 -1
  588. package/src/resources/extensions/gsd/tests/health-widget.test.ts +8 -2
  589. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +190 -0
  590. package/src/resources/extensions/gsd/tests/integration/doctor-git-symlink-cwd.test.ts +90 -0
  591. package/src/resources/extensions/gsd/tests/integration/doctor-git.test.ts +117 -0
  592. package/src/resources/extensions/gsd/tests/integration/doctor-proactive.test.ts +44 -0
  593. package/src/resources/extensions/gsd/tests/integration/doctor-runtime.test.ts +32 -1
  594. package/src/resources/extensions/gsd/tests/integration/git-service.test.ts +72 -5
  595. package/src/resources/extensions/gsd/tests/integration/integration-proof.test.ts +2 -2
  596. package/src/resources/extensions/gsd/tests/integration/test-isolation.ts +53 -0
  597. package/src/resources/extensions/gsd/tests/interactive-routing-bypass.test.ts +1 -1
  598. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +35 -0
  599. package/src/resources/extensions/gsd/tests/load-memory-block.test.ts +36 -0
  600. package/src/resources/extensions/gsd/tests/md-importer.test.ts +1 -1
  601. package/src/resources/extensions/gsd/tests/memory-embeddings.test.ts +213 -0
  602. package/src/resources/extensions/gsd/tests/memory-ingest.test.ts +153 -0
  603. package/src/resources/extensions/gsd/tests/memory-maintenance.test.ts +107 -0
  604. package/src/resources/extensions/gsd/tests/memory-relations.test.ts +175 -0
  605. package/src/resources/extensions/gsd/tests/memory-store.test.ts +2 -2
  606. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +295 -0
  607. package/src/resources/extensions/gsd/tests/milestone-status-tool.test.ts +3 -2
  608. package/src/resources/extensions/gsd/tests/model-cost-table.test.ts +2 -2
  609. package/src/resources/extensions/gsd/tests/model-router.test.ts +51 -1
  610. package/src/resources/extensions/gsd/tests/model-unittype-mapping.test.ts +59 -0
  611. package/src/resources/extensions/gsd/tests/notification-overlay.test.ts +56 -37
  612. package/src/resources/extensions/gsd/tests/notification-widget.test.ts +1 -1
  613. package/src/resources/extensions/gsd/tests/onboarding-state.test.ts +105 -0
  614. package/src/resources/extensions/gsd/tests/plan-milestone-boundary-map-preservation.test.ts +114 -0
  615. package/src/resources/extensions/gsd/tests/plan-milestone.test.ts +4 -5
  616. package/src/resources/extensions/gsd/tests/plan-slice.test.ts +17 -0
  617. package/src/resources/extensions/gsd/tests/post-execution-checks.test.ts +105 -1
  618. package/src/resources/extensions/gsd/tests/pre-execution-checks.test.ts +317 -1
  619. package/src/resources/extensions/gsd/tests/progressive-planning.test.ts +539 -0
  620. package/src/resources/extensions/gsd/tests/projection-no-plan-overwrite.test.ts +11 -2
  621. package/src/resources/extensions/gsd/tests/projection-regression.test.ts +7 -0
  622. package/src/resources/extensions/gsd/tests/prompt-budget-enforcement.test.ts +159 -8
  623. package/src/resources/extensions/gsd/tests/prompt-contracts.test.ts +24 -0
  624. package/src/resources/extensions/gsd/tests/prompts-no-gitignored-test-refs.test.ts +56 -0
  625. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +41 -4
  626. package/src/resources/extensions/gsd/tests/python-resolver.test.ts +131 -0
  627. package/src/resources/extensions/gsd/tests/register-hooks-depth-verification.test.ts +67 -0
  628. package/src/resources/extensions/gsd/tests/requirements.test.ts +9 -0
  629. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +153 -0
  630. package/src/resources/extensions/gsd/tests/skip-slice-cascades-tasks.test.ts +125 -0
  631. package/src/resources/extensions/gsd/tests/slice-context-injection.test.ts +16 -4
  632. package/src/resources/extensions/gsd/tests/stash-queued-context-files.test.ts +54 -0
  633. package/src/resources/extensions/gsd/tests/state-corruption-2945.test.ts +3 -0
  634. package/src/resources/extensions/gsd/tests/summary-render-parity.test.ts +5 -0
  635. package/src/resources/extensions/gsd/tests/uok-contracts.test.ts +2 -1
  636. package/src/resources/extensions/gsd/tests/uok-flags.test.ts +1 -1
  637. package/src/resources/extensions/gsd/tests/validate-milestone.test.ts +9 -3
  638. package/src/resources/extensions/gsd/tests/verification-gate.test.ts +35 -0
  639. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +7 -0
  640. package/src/resources/extensions/gsd/tests/workflow-tool-executors.test.ts +97 -0
  641. package/src/resources/extensions/gsd/tests/worktree-journal-events.test.ts +2 -1
  642. package/src/resources/extensions/gsd/tests/worktree-resolver.test.ts +77 -2
  643. package/src/resources/extensions/gsd/tools/complete-task.ts +87 -0
  644. package/src/resources/extensions/gsd/tools/memory-tools.ts +410 -0
  645. package/src/resources/extensions/gsd/tools/plan-milestone.ts +42 -8
  646. package/src/resources/extensions/gsd/tools/plan-slice.ts +6 -1
  647. package/src/resources/extensions/gsd/tools/skip-slice.ts +133 -0
  648. package/src/resources/extensions/gsd/tools/workflow-tool-executors.ts +14 -0
  649. package/src/resources/extensions/gsd/types.ts +62 -0
  650. package/src/resources/extensions/gsd/uok/contracts.ts +2 -1
  651. package/src/resources/extensions/gsd/uok/flags.ts +1 -1
  652. package/src/resources/extensions/gsd/verification-gate.ts +2 -1
  653. package/src/resources/extensions/gsd/workflow-logger.ts +4 -1
  654. package/src/resources/extensions/gsd/workflow-manifest.ts +8 -0
  655. package/src/resources/extensions/gsd/workflow-mcp.ts +1 -0
  656. package/src/resources/extensions/gsd/workflow-projections.ts +18 -16
  657. package/src/resources/extensions/gsd/workflow-templates/spike.md +6 -0
  658. package/src/resources/extensions/gsd/worktree-resolver.ts +47 -1
  659. package/src/resources/extensions/remote-questions/manager.ts +13 -1
  660. package/src/resources/extensions/remote-questions/tests/remote-answer-normalization.test.ts +92 -0
  661. package/src/resources/extensions/search-the-web/command-search-provider.ts +4 -1
  662. package/src/resources/extensions/search-the-web/native-search.ts +13 -3
  663. package/src/resources/skills/api-design/SKILL.md +190 -0
  664. package/src/resources/skills/create-mcp-server/SKILL.md +121 -0
  665. package/src/resources/skills/decompose-into-slices/SKILL.md +139 -0
  666. package/src/resources/skills/dependency-upgrade/SKILL.md +158 -0
  667. package/src/resources/skills/design-an-interface/SKILL.md +102 -0
  668. package/src/resources/skills/forensics/SKILL.md +153 -0
  669. package/src/resources/skills/grill-me/SKILL.md +93 -0
  670. package/src/resources/skills/handoff/SKILL.md +121 -0
  671. package/src/resources/skills/observability/SKILL.md +174 -0
  672. package/src/resources/skills/security-review/SKILL.md +181 -0
  673. package/src/resources/skills/spike-wrap-up/SKILL.md +138 -0
  674. package/src/resources/skills/tdd/SKILL.md +112 -0
  675. package/src/resources/skills/verify-before-complete/SKILL.md +97 -0
  676. package/src/resources/skills/write-docs/SKILL.md +81 -0
  677. package/src/resources/skills/write-milestone-brief/SKILL.md +135 -0
  678. package/dist/web/standalone/.next/static/css/3e9cdadb4d23b8a4.css +0 -1
  679. /package/dist/web/standalone/.next/static/{JncJywFxCugMuXGs56m-b → pBwmOoye64ZrRp-_rf0v1}/_buildManifest.js +0 -0
  680. /package/dist/web/standalone/.next/static/{JncJywFxCugMuXGs56m-b → pBwmOoye64ZrRp-_rf0v1}/_ssgManifest.js +0 -0
@@ -61,9 +61,10 @@ function truncateMessage(msg: string, maxLen: number): string {
61
61
 
62
62
  /**
63
63
  * Build compact health lines for the widget.
64
- * Returns a string array suitable for setWidget().
64
+ * When `width` is provided, system + budget render left and last-commit
65
+ * right-aligned. Without width, all parts are joined inline (RPC fallback).
65
66
  */
66
- export function buildHealthLines(data: HealthWidgetData): string[] {
67
+ export function buildHealthLines(data: HealthWidgetData, width?: number): string[] {
67
68
  if (data.projectState === "none") {
68
69
  return [" GSD No project loaded — run /gsd to start"];
69
70
  }
@@ -72,40 +73,68 @@ export function buildHealthLines(data: HealthWidgetData): string[] {
72
73
  return [" GSD Project initialized — run /gsd to continue setup"];
73
74
  }
74
75
 
75
- const parts: string[] = [];
76
+ const leftParts: string[] = [];
76
77
 
77
78
  const totalIssues = data.environmentErrorCount + data.environmentWarningCount + (data.providerIssue ? 1 : 0);
78
79
  if (totalIssues === 0) {
79
- parts.push("● System OK");
80
+ leftParts.push("● System OK");
80
81
  } else if (data.environmentErrorCount > 0 || data.providerIssue?.includes("✗")) {
81
- parts.push(`✗ ${totalIssues} issue${totalIssues > 1 ? "s" : ""}`);
82
+ leftParts.push(`✗ ${totalIssues} issue${totalIssues > 1 ? "s" : ""}`);
82
83
  } else {
83
- parts.push(`⚠ ${totalIssues} warning${totalIssues > 1 ? "s" : ""}`);
84
+ leftParts.push(`⚠ ${totalIssues} warning${totalIssues > 1 ? "s" : ""}`);
84
85
  }
85
86
 
86
87
  if (data.budgetCeiling !== undefined && data.budgetCeiling > 0) {
87
88
  const pct = Math.min(100, (data.budgetSpent / data.budgetCeiling) * 100);
88
- parts.push(`Budget: ${formatCost(data.budgetSpent)}/${formatCost(data.budgetCeiling)} (${pct.toFixed(0)}%)`);
89
+ leftParts.push(`Budget: ${formatCost(data.budgetSpent)}/${formatCost(data.budgetCeiling)} (${pct.toFixed(0)}%)`);
89
90
  } else if (data.budgetSpent > 0) {
90
- parts.push(`Spent: ${formatCost(data.budgetSpent)}`);
91
+ leftParts.push(`Spent: ${formatCost(data.budgetSpent)}`);
91
92
  }
92
93
 
93
94
  if (data.providerIssue) {
94
- parts.push(data.providerIssue);
95
+ leftParts.push(data.providerIssue);
95
96
  }
96
97
 
97
98
  if (data.environmentErrorCount > 0) {
98
- parts.push(`Env: ${data.environmentErrorCount} error${data.environmentErrorCount > 1 ? "s" : ""}`);
99
+ leftParts.push(`Env: ${data.environmentErrorCount} error${data.environmentErrorCount > 1 ? "s" : ""}`);
99
100
  } else if (data.environmentWarningCount > 0) {
100
- parts.push(`Env: ${data.environmentWarningCount} warning${data.environmentWarningCount > 1 ? "s" : ""}`);
101
+ leftParts.push(`Env: ${data.environmentWarningCount} warning${data.environmentWarningCount > 1 ? "s" : ""}`);
101
102
  }
102
103
 
103
- // Always-on last commit display — shows relative time + truncated message
104
+ // Last commit goes on the right-hand side when width is known.
105
+ let rightText = "";
104
106
  if (data.lastCommitEpoch !== null && data.lastCommitEpoch > 0) {
105
107
  const relTime = formatRelativeTime(data.lastCommitEpoch);
106
108
  const msg = data.lastCommitMessage ? ` — ${truncateMessage(data.lastCommitMessage, 50)}` : "";
107
- parts.push(`Last commit: ${relTime}${msg}`);
109
+ rightText = `Last commit: ${relTime}${msg}`;
108
110
  }
109
111
 
110
- return [` ${parts.join(" │ ")}`];
112
+ const leftText = leftParts.join(" │ ");
113
+
114
+ if (width === undefined) {
115
+ const inline = rightText ? `${leftText} │ ${rightText}` : leftText;
116
+ return [` ${inline}`];
117
+ }
118
+
119
+ const prefix = " ";
120
+ const innerWidth = Math.max(0, width - prefix.length);
121
+ const leftVis = leftText.length;
122
+ const rightVis = rightText.length;
123
+
124
+ if (!rightText) return [`${prefix}${truncateMessage(leftText, innerWidth)}`];
125
+ const MIN_GAP = 2;
126
+ if (leftVis + MIN_GAP + rightVis > innerWidth) {
127
+ // Preserve the left (status + budget) and truncate the right side
128
+ // (last commit) with an ellipsis so the combined line never exceeds
129
+ // innerWidth. If even the left alone overflows, clamp it too.
130
+ const leftRoom = Math.max(1, Math.min(leftVis, innerWidth - MIN_GAP - 1));
131
+ const clampedLeft = truncateMessage(leftText, leftRoom);
132
+ const rightRoom = Math.max(0, innerWidth - clampedLeft.length - MIN_GAP);
133
+ const clampedRight = rightRoom > 0 ? truncateMessage(rightText, rightRoom) : "";
134
+ if (!clampedRight) return [`${prefix}${clampedLeft}`];
135
+ const pad = " ".repeat(Math.max(MIN_GAP, innerWidth - clampedLeft.length - clampedRight.length));
136
+ return [`${prefix}${clampedLeft}${pad}${clampedRight}`];
137
+ }
138
+ const padding = " ".repeat(innerWidth - leftVis - rightVis);
139
+ return [`${prefix}${leftText}${padding}${rightText}`];
111
140
  }
@@ -129,12 +129,16 @@ export function initHealthWidget(ctx: ExtensionContext): void {
129
129
  void refresh();
130
130
  }, REFRESH_INTERVAL_MS);
131
131
 
132
+ let cachedWidth: number | undefined;
132
133
  return {
133
- render(_width: number): string[] {
134
- if (!cachedLines) cachedLines = buildHealthLines(data);
134
+ render(width: number): string[] {
135
+ if (!cachedLines || cachedWidth !== width) {
136
+ cachedLines = buildHealthLines(data, width);
137
+ cachedWidth = width;
138
+ }
135
139
  return cachedLines;
136
140
  },
137
- invalidate(): void { cachedLines = undefined; },
141
+ invalidate(): void { cachedLines = undefined; cachedWidth = undefined; },
138
142
  dispose(): void {
139
143
  clearInterval(refreshTimer);
140
144
  },
@@ -0,0 +1,188 @@
1
+ // GSD Extension — Layer 2 Event Emitter Bridge
2
+ //
3
+ // Holds a module-scoped reference to the ExtensionAPI so deeply-nested code
4
+ // (auto-loop, git-service callers, verification, budget) can emit Layer 2
5
+ // events without having to thread `pi` through every function signature.
6
+ //
7
+ // Set once from `registerGsdExtension`. All emitters are best-effort — a
8
+ // missing `pi` (e.g. in standalone unit tests) silently becomes a no-op.
9
+
10
+ import type { ExtensionAPI } from "@gsd/pi-coding-agent";
11
+ import type {
12
+ BeforeCommitEventResult,
13
+ BeforePrEventResult,
14
+ BeforePushEventResult,
15
+ BeforeVerifyEventResult,
16
+ BudgetThresholdEventResult,
17
+ VerifyFailure,
18
+ } from "@gsd/pi-coding-agent";
19
+
20
+ let _pi: ExtensionAPI | undefined;
21
+
22
+ export function setHookEmitter(pi: ExtensionAPI): void {
23
+ _pi = pi;
24
+ }
25
+
26
+ export function clearHookEmitter(): void {
27
+ _pi = undefined;
28
+ }
29
+
30
+ // ─── Notification ──────────────────────────────────────────────────────────
31
+
32
+ export async function emitNotification(
33
+ kind: "blocked" | "input_needed" | "milestone_ready" | "idle" | "error",
34
+ message: string,
35
+ details?: Record<string, unknown>,
36
+ ): Promise<void> {
37
+ if (!_pi) return;
38
+ await _pi.emitExtensionEvent({ type: "notification", kind, message, details });
39
+ }
40
+
41
+ // ─── Git Lifecycle ─────────────────────────────────────────────────────────
42
+
43
+ export async function emitBeforeCommit(args: {
44
+ message: string;
45
+ files: string[];
46
+ cwd: string;
47
+ author?: string;
48
+ }): Promise<BeforeCommitEventResult | undefined> {
49
+ if (!_pi) return undefined;
50
+ return (await _pi.emitExtensionEvent({
51
+ type: "before_commit",
52
+ ...args,
53
+ })) as BeforeCommitEventResult | undefined;
54
+ }
55
+
56
+ export async function emitCommit(args: {
57
+ sha: string;
58
+ message: string;
59
+ files: string[];
60
+ cwd: string;
61
+ }): Promise<void> {
62
+ if (!_pi) return;
63
+ await _pi.emitExtensionEvent({ type: "commit", ...args });
64
+ }
65
+
66
+ export async function emitBeforePush(args: {
67
+ remote: string;
68
+ branch: string;
69
+ cwd: string;
70
+ }): Promise<BeforePushEventResult | undefined> {
71
+ if (!_pi) return undefined;
72
+ return (await _pi.emitExtensionEvent({
73
+ type: "before_push",
74
+ ...args,
75
+ })) as BeforePushEventResult | undefined;
76
+ }
77
+
78
+ export async function emitPush(args: { remote: string; branch: string; cwd: string }): Promise<void> {
79
+ if (!_pi) return;
80
+ await _pi.emitExtensionEvent({ type: "push", ...args });
81
+ }
82
+
83
+ export async function emitBeforePr(args: {
84
+ branch: string;
85
+ targetBranch: string;
86
+ title: string;
87
+ body: string;
88
+ cwd: string;
89
+ }): Promise<BeforePrEventResult | undefined> {
90
+ if (!_pi) return undefined;
91
+ return (await _pi.emitExtensionEvent({
92
+ type: "before_pr",
93
+ ...args,
94
+ })) as BeforePrEventResult | undefined;
95
+ }
96
+
97
+ export async function emitPrOpened(args: {
98
+ url: string;
99
+ branch: string;
100
+ targetBranch: string;
101
+ cwd: string;
102
+ }): Promise<void> {
103
+ if (!_pi) return;
104
+ await _pi.emitExtensionEvent({ type: "pr_opened", ...args });
105
+ }
106
+
107
+ // ─── Verification ──────────────────────────────────────────────────────────
108
+
109
+ export async function emitBeforeVerify(args: {
110
+ unitType?: string;
111
+ unitId?: string;
112
+ cwd: string;
113
+ }): Promise<BeforeVerifyEventResult | undefined> {
114
+ if (!_pi) return undefined;
115
+ return (await _pi.emitExtensionEvent({
116
+ type: "before_verify",
117
+ ...args,
118
+ })) as BeforeVerifyEventResult | undefined;
119
+ }
120
+
121
+ export async function emitVerifyResult(args: {
122
+ passed: boolean;
123
+ failures: VerifyFailure[];
124
+ unitType?: string;
125
+ unitId?: string;
126
+ cwd: string;
127
+ }): Promise<void> {
128
+ if (!_pi) return;
129
+ await _pi.emitExtensionEvent({ type: "verify_result", ...args });
130
+ }
131
+
132
+ // ─── Budget ────────────────────────────────────────────────────────────────
133
+
134
+ export async function emitBudgetThreshold(args: {
135
+ fraction: number;
136
+ spent: number;
137
+ limit: number;
138
+ }): Promise<BudgetThresholdEventResult | undefined> {
139
+ if (!_pi) return undefined;
140
+ return (await _pi.emitExtensionEvent({
141
+ type: "budget_threshold",
142
+ fraction: args.fraction,
143
+ spent: args.spent,
144
+ limit: args.limit,
145
+ currency: "USD",
146
+ })) as BudgetThresholdEventResult | undefined;
147
+ }
148
+
149
+ // ─── Orchestrator Boundaries ───────────────────────────────────────────────
150
+
151
+ export async function emitMilestoneStart(args: {
152
+ milestoneId: string;
153
+ title?: string;
154
+ cwd: string;
155
+ }): Promise<void> {
156
+ if (!_pi) return;
157
+ await _pi.emitExtensionEvent({ type: "milestone_start", ...args });
158
+ }
159
+
160
+ export async function emitMilestoneEnd(args: {
161
+ milestoneId: string;
162
+ status: "completed" | "failed" | "cancelled";
163
+ cwd: string;
164
+ }): Promise<void> {
165
+ if (!_pi) return;
166
+ await _pi.emitExtensionEvent({ type: "milestone_end", ...args });
167
+ }
168
+
169
+ export async function emitUnitStart(args: {
170
+ unitType: string;
171
+ unitId: string;
172
+ milestoneId?: string;
173
+ cwd: string;
174
+ }): Promise<void> {
175
+ if (!_pi) return;
176
+ await _pi.emitExtensionEvent({ type: "unit_start", ...args });
177
+ }
178
+
179
+ export async function emitUnitEnd(args: {
180
+ unitType: string;
181
+ unitId: string;
182
+ milestoneId?: string;
183
+ status: "completed" | "failed" | "cancelled" | "blocked";
184
+ cwd: string;
185
+ }): Promise<void> {
186
+ if (!_pi) return;
187
+ await _pi.emitExtensionEvent({ type: "unit_end", ...args });
188
+ }
@@ -17,6 +17,7 @@ import { assertSafeDirectory } from "./validate-directory.js";
17
17
  import type { ProjectDetection, ProjectSignals } from "./detection.js";
18
18
  import { runSkillInstallStep } from "./skill-catalog.js";
19
19
  import { generateCodebaseMap, writeCodebaseMap } from "./codebase-generator.js";
20
+ import { handlePrefsWizard, writePreferencesFile } from "./commands-prefs-wizard.js";
20
21
 
21
22
  // ─── Types ──────────────────────────────────────────────────────────────────────
22
23
 
@@ -232,8 +233,53 @@ export async function showProjectInit(
232
233
  // Non-fatal — skill installation failure should never block project init
233
234
  }
234
235
 
235
- // ── Step 9: Bootstrap .gsd/ ────────────────────────────────────────────────
236
- bootstrapGsdDirectory(basePath, prefs, signals);
236
+ // ── Step 9: Optional full-prefs review ─────────────────────────────────────
237
+ // Ask BEFORE bootstrapping so a defer (`not_yet`) leaves the project untouched.
238
+ // Once the user commits, we bootstrap and route preferences through the unified
239
+ // writer (commands-prefs-wizard.writePreferencesFile) so init and the prefs
240
+ // wizard share one serializer. The "Open full wizard" branch surfaces every
241
+ // configurable preference, prefilled with the init answers.
242
+ const reviewChoice = await showNextAction(ctx, {
243
+ title: "GSD — Review All Preferences (Optional)",
244
+ summary: [
245
+ "Open the full preferences wizard now? It includes models, timeouts,",
246
+ "budget, notifications, and skills — all pre-filled with your answers.",
247
+ "",
248
+ "Skip if you just want sensible defaults; you can always run /gsd prefs project later.",
249
+ ],
250
+ actions: [
251
+ { id: "skip", label: "Skip — use defaults", description: "Save preferences and continue", recommended: true },
252
+ { id: "review", label: "Open full wizard", description: "Tweak any category before saving" },
253
+ ],
254
+ notYetMessage: "Run /gsd init when ready.",
255
+ });
256
+
257
+ if (reviewChoice === "not_yet") {
258
+ // User deferred — don't create .gsd/ or persist preferences. Pre-step state
259
+ // (e.g. git init from Step 2) remains as-is, matching prior step semantics.
260
+ return { completed: false, bootstrapped: false };
261
+ }
262
+
263
+ // ── Step 10: Bootstrap .gsd/ + write preferences ───────────────────────────
264
+ bootstrapGsdDirectoryStructure(basePath, signals);
265
+ const prefillPrefs = mapInitPrefsToWizardShape(prefs);
266
+ // Always derive the preferences path from basePath so init writing the
267
+ // structure to one location and preferences to another (cwd-derived) is
268
+ // impossible — see #4457 codex review.
269
+ const projectPrefsPath = join(gsdRoot(basePath), "PREFERENCES.md");
270
+
271
+ if (reviewChoice === "review") {
272
+ // Wizard writes via writePreferencesFile internally; pass pathOverride so it
273
+ // targets basePath rather than cwd.
274
+ await handlePrefsWizard(ctx, "project", prefillPrefs, { pathOverride: projectPrefsPath });
275
+ } else {
276
+ // Direct path: write the init-collected prefs through the unified writer.
277
+ await writePreferencesFile(projectPrefsPath, prefillPrefs, ctx, {
278
+ scope: "project",
279
+ defaultBody: buildInitPreferencesBody(),
280
+ notifyOnSave: false,
281
+ });
282
+ }
237
283
 
238
284
  // Initialize SQLite database so GSD starts in full-capability mode (#3880).
239
285
  // Without this, isDbAvailable() returns false and GSD enters degraded
@@ -453,11 +499,13 @@ async function customizeAdvancedPrefs(
453
499
 
454
500
  // ─── Bootstrap ──────────────────────────────────────────────────────────────────
455
501
 
456
- function bootstrapGsdDirectory(
457
- basePath: string,
458
- prefs: ProjectPreferences,
459
- signals: ProjectSignals,
460
- ): void {
502
+ /**
503
+ * Create .gsd/ directory structure and seed CONTEXT.md.
504
+ *
505
+ * Preferences are written separately by the caller via the unified
506
+ * writePreferencesFile helper so init and the prefs wizard share one path.
507
+ */
508
+ function bootstrapGsdDirectoryStructure(basePath: string, signals: ProjectSignals): void {
461
509
  // Final safety check before writing any files
462
510
  assertSafeDirectory(basePath);
463
511
 
@@ -465,10 +513,6 @@ function bootstrapGsdDirectory(
465
513
  mkdirSync(join(gsd, "milestones"), { recursive: true });
466
514
  mkdirSync(join(gsd, "runtime"), { recursive: true });
467
515
 
468
- // Write PREFERENCES.md from wizard answers
469
- const preferencesContent = buildPreferencesFile(prefs);
470
- writeFileSync(join(gsd, "PREFERENCES.md"), preferencesContent, "utf-8");
471
-
472
516
  // Seed CONTEXT.md with detected project signals
473
517
  const contextContent = buildContextSeed(signals);
474
518
  if (contextContent) {
@@ -476,60 +520,49 @@ function bootstrapGsdDirectory(
476
520
  }
477
521
  }
478
522
 
479
- function buildPreferencesFile(prefs: ProjectPreferences): string {
480
- const lines: string[] = ["---"];
481
- lines.push("version: 1");
482
- lines.push(`mode: ${prefs.mode}`);
483
-
484
- // Git preferences
485
- lines.push("git:");
486
- lines.push(` isolation: ${prefs.gitIsolation}`);
487
- lines.push(` main_branch: ${prefs.mainBranch}`);
488
- lines.push(` auto_push: ${prefs.autoPush}`);
523
+ /**
524
+ * Map init wizard's typed ProjectPreferences to the prefs-wizard's
525
+ * Record<string, unknown> shape, matching the keys serializePreferencesToFrontmatter
526
+ * expects (mode, git.{isolation,main_branch,auto_push}, verification_commands, etc.).
527
+ *
528
+ * Exported for testing; init-wizard uses it inline.
529
+ */
530
+ export function mapInitPrefsToWizardShape(prefs: ProjectPreferences): Record<string, unknown> {
531
+ const out: Record<string, unknown> = {
532
+ mode: prefs.mode,
533
+ git: {
534
+ isolation: prefs.gitIsolation,
535
+ main_branch: prefs.mainBranch,
536
+ auto_push: prefs.autoPush,
537
+ },
538
+ };
489
539
 
490
- // Verification commands
491
540
  if (prefs.verificationCommands.length > 0) {
492
- lines.push("verification_commands:");
493
- for (const cmd of prefs.verificationCommands) {
494
- lines.push(` - "${cmd}"`);
495
- }
541
+ out.verification_commands = prefs.verificationCommands;
496
542
  }
497
-
498
- // Custom instructions
499
543
  if (prefs.customInstructions.length > 0) {
500
- lines.push("custom_instructions:");
501
- for (const inst of prefs.customInstructions) {
502
- lines.push(` - "${inst.replace(/"/g, '\\"')}"`);
503
- }
544
+ out.custom_instructions = prefs.customInstructions;
504
545
  }
505
-
506
- // Token profile (only if non-default)
507
546
  if (prefs.tokenProfile !== "balanced") {
508
- lines.push(`token_profile: ${prefs.tokenProfile}`);
547
+ out.token_profile = prefs.tokenProfile;
509
548
  }
510
-
511
- // Phase skips
512
549
  if (prefs.skipResearch) {
513
- lines.push("phases:");
514
- lines.push(" skip_research: true");
550
+ out.phases = { skip_research: true };
515
551
  }
516
552
 
517
- // Defaults for wizard-generated files
518
- lines.push("always_use_skills: []");
519
- lines.push("prefer_skills: []");
520
- lines.push("avoid_skills: []");
521
- lines.push("skill_rules: []");
522
-
523
- lines.push("---");
524
- lines.push("");
525
- lines.push("# GSD Project Preferences");
526
- lines.push("");
527
- lines.push("Generated by `/gsd init`. Edit directly or use `/gsd prefs project` to modify.");
528
- lines.push("");
529
- lines.push("See `~/.gsd/agent/extensions/gsd/docs/preferences-reference.md` for full field documentation.");
530
- lines.push("");
553
+ return out;
554
+ }
531
555
 
532
- return lines.join("\n");
556
+ function buildInitPreferencesBody(): string {
557
+ return [
558
+ "",
559
+ "# GSD Project Preferences",
560
+ "",
561
+ "Generated by `/gsd init`. Edit directly or use `/gsd prefs project` to modify.",
562
+ "",
563
+ "See `~/.gsd/agent/extensions/gsd/docs/preferences-reference.md` for full field documentation.",
564
+ "",
565
+ ].join("\n");
533
566
  }
534
567
 
535
568
  function buildContextSeed(signals: ProjectSignals): string | null {
@@ -169,7 +169,7 @@ function renderRoadmapMarkdown(milestone: MilestoneRow, slices: SliceRow[]): str
169
169
  lines.push("## Slices");
170
170
  lines.push("");
171
171
  for (const slice of slices) {
172
- const done = slice.status === "complete" ? "x" : " ";
172
+ const done = isClosedStatus(slice.status) ? "x" : " ";
173
173
  const depends = `[${(slice.depends ?? []).join(",")}]`;
174
174
  lines.push(`- [${done}] **${slice.id}: ${slice.title}** \`risk:${slice.risk}\` \`depends:${depends}\``);
175
175
  lines.push(` > After this: ${slice.demo}`);
@@ -496,7 +496,7 @@ export async function renderRoadmapCheckboxes(
496
496
  // Apply checkbox patches for each slice
497
497
  let updated = content;
498
498
  for (const slice of slices) {
499
- const isDone = slice.status === "complete";
499
+ const isDone = isClosedStatus(slice.status);
500
500
  const sid = slice.id;
501
501
 
502
502
  if (isDone) {
@@ -821,19 +821,19 @@ export function detectStaleRenders(basePath: string): StaleEntry[] {
821
821
  const parsed = parseRoadmap(content);
822
822
 
823
823
  for (const slice of slices) {
824
- const isCompleteInDb = slice.status === "complete";
824
+ const isCompleteInDb = isClosedStatus(slice.status);
825
825
  const roadmapSlice = parsed.slices.find((s: { id: string }) => s.id === slice.id);
826
826
  if (!roadmapSlice) continue;
827
827
 
828
828
  if (isCompleteInDb && !roadmapSlice.done) {
829
829
  stale.push({
830
830
  path: roadmapPath,
831
- reason: `${slice.id} is complete in DB but unchecked in roadmap`,
831
+ reason: `${slice.id} is closed in DB but unchecked in roadmap`,
832
832
  });
833
833
  } else if (!isCompleteInDb && roadmapSlice.done) {
834
834
  stale.push({
835
835
  path: roadmapPath,
836
- reason: `${slice.id} is not complete in DB but checked in roadmap`,
836
+ reason: `${slice.id} is not closed in DB but checked in roadmap`,
837
837
  });
838
838
  }
839
839
  }
@@ -0,0 +1,140 @@
1
+ // GSD2 — Decisions -> memories backfill (ADR-013 step 5)
2
+ //
3
+ // Idempotent one-shot migration that copies every active decisions row into
4
+ // the memories table with category="architecture" and a structured_fields
5
+ // payload preserving the original gsd_save_decision schema (when_context,
6
+ // scope, decision, choice, rationale, made_by, revisable, sourceDecisionId).
7
+ //
8
+ // The backfill exists so the cutover in ADR-013 step 6 can drop the
9
+ // decisions table without losing schema fidelity. Idempotency is enforced
10
+ // by tagging each backfilled memory with structured_fields.sourceDecisionId
11
+ // and skipping any decision whose ID already appears in the memories table.
12
+ //
13
+ // Triggered opportunistically by buildBeforeAgentStartResult so the cost
14
+ // only ever fires once per project. Costs O(N) inserts on first run where
15
+ // N is the active-decisions count; subsequent runs are an O(N) lookup that
16
+ // finds existing markers and exits.
17
+
18
+ import { isDbAvailable, _getAdapter } from "./gsd-db.js";
19
+ import { createMemory } from "./memory-store.js";
20
+ import { logWarning } from "./workflow-logger.js";
21
+
22
+ interface DecisionRow {
23
+ id: string;
24
+ when_context: string;
25
+ scope: string;
26
+ decision: string;
27
+ choice: string;
28
+ rationale: string;
29
+ made_by: string;
30
+ revisable: string;
31
+ superseded_by: string | null;
32
+ }
33
+
34
+ /**
35
+ * Backfill active decisions rows into the memories table.
36
+ *
37
+ * - Idempotent (per-row): every row written carries
38
+ * `structured_fields.sourceDecisionId = "<decisionId>"`. Each candidate
39
+ * decision is checked individually; only decisions whose id is already
40
+ * present in the memory store are skipped. A user-authored memory with
41
+ * their own `sourceDecisionId` does NOT abort the backfill.
42
+ * - Best-effort: never throws. Logs and returns 0 on failure so a broken
43
+ * backfill cannot block agent startup.
44
+ * - Active-only: skips rows where `superseded_by IS NOT NULL`. Superseded
45
+ * decisions are historical record; the memory store is for active
46
+ * knowledge.
47
+ *
48
+ * Returns the number of memories written (0 when already backfilled or
49
+ * when the DB has no decisions). Callers can log the result or surface it
50
+ * to the user.
51
+ */
52
+ export function backfillDecisionsToMemories(): number {
53
+ if (!isDbAvailable()) return 0;
54
+ const adapter = _getAdapter();
55
+ if (!adapter) return 0;
56
+
57
+ try {
58
+ const decisions = adapter
59
+ .prepare("SELECT id, when_context, scope, decision, choice, rationale, made_by, revisable, superseded_by FROM decisions WHERE superseded_by IS NULL")
60
+ .all() as Array<Record<string, unknown>>;
61
+
62
+ if (decisions.length === 0) return 0;
63
+
64
+ // Per-row idempotency: each memory backfilled from a decision carries
65
+ // structured_fields.sourceDecisionId="<decisionId>". Skipping is decided
66
+ // per row by matching that exact id, NOT by a global sentinel — a global
67
+ // sentinel would silently abort the backfill if a user manually called
68
+ // capture_thought with their own structuredFields.sourceDecisionId.
69
+ const checkExisting = adapter.prepare(
70
+ "SELECT 1 FROM memories WHERE structured_fields LIKE :pattern LIMIT 1",
71
+ );
72
+
73
+ let written = 0;
74
+ for (const raw of decisions) {
75
+ const row: DecisionRow = {
76
+ id: String(raw["id"] ?? ""),
77
+ when_context: String(raw["when_context"] ?? ""),
78
+ scope: String(raw["scope"] ?? ""),
79
+ decision: String(raw["decision"] ?? ""),
80
+ choice: String(raw["choice"] ?? ""),
81
+ rationale: String(raw["rationale"] ?? ""),
82
+ made_by: String(raw["made_by"] ?? "agent"),
83
+ revisable: String(raw["revisable"] ?? ""),
84
+ superseded_by: raw["superseded_by"] == null ? null : String(raw["superseded_by"]),
85
+ };
86
+ if (!row.id) continue;
87
+
88
+ // Pattern is anchored to the JSON-stringified shape and the exact
89
+ // decision id to avoid prefix collisions (e.g. "D1" vs "D10").
90
+ if (checkExisting.get({ ":pattern": `%"sourceDecisionId":"${row.id}"%` })) continue;
91
+
92
+ const content = synthesizeContent(row);
93
+ const id = createMemory({
94
+ category: "architecture",
95
+ content,
96
+ scope: row.scope || "project",
97
+ confidence: 0.85,
98
+ structuredFields: {
99
+ sourceDecisionId: row.id,
100
+ when_context: row.when_context,
101
+ scope: row.scope,
102
+ decision: row.decision,
103
+ choice: row.choice,
104
+ rationale: row.rationale,
105
+ made_by: row.made_by,
106
+ revisable: row.revisable,
107
+ },
108
+ });
109
+ if (id) written += 1;
110
+ }
111
+
112
+ return written;
113
+ } catch (e) {
114
+ logWarning("memory-backfill", `decisions->memories backfill failed: ${(e as Error).message}`);
115
+ return 0;
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Combine the decision's structured fields into a 1-3 sentence content
121
+ * string suitable for keyword retrieval and human review.
122
+ *
123
+ * Format: "<decision> Chose: <choice>. Rationale: <rationale>."
124
+ * Truncates each field to keep the synthesized line under ~600 chars so
125
+ * memory_query rendering stays readable.
126
+ */
127
+ function synthesizeContent(row: DecisionRow): string {
128
+ const trim = (value: string, max: number): string => {
129
+ const cleaned = value.replace(/\s+/g, " ").trim();
130
+ return cleaned.length > max ? cleaned.slice(0, max - 1) + "\u2026" : cleaned;
131
+ };
132
+ const parts: string[] = [];
133
+ const decision = trim(row.decision, 240);
134
+ const choice = trim(row.choice, 200);
135
+ const rationale = trim(row.rationale, 200);
136
+ if (decision) parts.push(decision);
137
+ if (choice) parts.push(`Chose: ${choice}.`);
138
+ if (rationale) parts.push(`Rationale: ${rationale}.`);
139
+ return parts.join(" ");
140
+ }