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
@@ -0,0 +1,462 @@
1
+ /**
2
+ * GSD Command — `/gsd memory`
3
+ *
4
+ * Subcommands:
5
+ * list — show recent active memories
6
+ * show <id> — print one memory
7
+ * ingest <uri> — persist a source row (file path, URL, or "-" for stdin-piped note)
8
+ * note "<text>" — persist an inline note as a source
9
+ * forget <id> — supersede a memory (CAP_EXCEEDED sentinel)
10
+ * stats — category / scope counts + source count
11
+ * sources — list recent memory_sources rows
12
+ * extract <src> — dispatch an agent turn that distils a source into memories
13
+ */
14
+ import { readFileSync, writeFileSync } from "node:fs";
15
+ import { resolve as resolvePath } from "node:path";
16
+ import { projectRoot } from "./commands/context.js";
17
+ import { ingestFile, ingestNote, ingestUrl, summarizeIngest } from "./memory-ingest.js";
18
+ import { getMemorySource, listMemorySources } from "./memory-source-store.js";
19
+ import { createMemory, decayStaleMemories, enforceMemoryCap, getActiveMemories, getActiveMemoriesRanked, supersedeMemory, } from "./memory-store.js";
20
+ import { _getAdapter, isDbAvailable } from "./gsd-db.js";
21
+ import { createMemoryRelation, listRelationsFor } from "./memory-relations.js";
22
+ function parseArgs(raw) {
23
+ const tokens = splitArgs(raw);
24
+ const sub = (tokens.shift() ?? "list").toLowerCase();
25
+ const positional = [];
26
+ const tags = [];
27
+ let scope;
28
+ let extract = false;
29
+ for (let i = 0; i < tokens.length; i++) {
30
+ const tok = tokens[i];
31
+ if (tok === "--tag" && i + 1 < tokens.length) {
32
+ tags.push(...tokens[++i].split(",").map((t) => t.trim()).filter(Boolean));
33
+ continue;
34
+ }
35
+ if (tok.startsWith("--tag=")) {
36
+ tags.push(...tok.slice("--tag=".length).split(",").map((t) => t.trim()).filter(Boolean));
37
+ continue;
38
+ }
39
+ if (tok === "--scope" && i + 1 < tokens.length) {
40
+ scope = tokens[++i];
41
+ continue;
42
+ }
43
+ if (tok.startsWith("--scope=")) {
44
+ scope = tok.slice("--scope=".length);
45
+ continue;
46
+ }
47
+ if (tok === "--extract") {
48
+ extract = true;
49
+ continue;
50
+ }
51
+ if (tok === "--no-extract") {
52
+ extract = false;
53
+ continue;
54
+ }
55
+ positional.push(tok);
56
+ }
57
+ return { sub, positional, tags, scope, extract };
58
+ }
59
+ function splitArgs(raw) {
60
+ const tokens = [];
61
+ const re = /"([^"]*)"|'([^']*)'|(\S+)/g;
62
+ let match;
63
+ while ((match = re.exec(raw)) !== null) {
64
+ tokens.push(match[1] ?? match[2] ?? match[3]);
65
+ }
66
+ return tokens;
67
+ }
68
+ function truncate(text, max) {
69
+ if (text.length <= max)
70
+ return text;
71
+ return `${text.slice(0, max - 1)}…`;
72
+ }
73
+ // ─── Handler ────────────────────────────────────────────────────────────────
74
+ export async function handleMemory(args, ctx, pi) {
75
+ const parsed = parseArgs(args);
76
+ // `/gsd memory` or `/gsd memory help`
77
+ if (parsed.sub === "" || parsed.sub === "help") {
78
+ ctx.ui.notify(usage(), "info");
79
+ return;
80
+ }
81
+ // Most subcommands need the DB.
82
+ await ensureDb();
83
+ switch (parsed.sub) {
84
+ case "list":
85
+ handleList(ctx);
86
+ return;
87
+ case "show":
88
+ handleShow(ctx, parsed.positional[0]);
89
+ return;
90
+ case "forget":
91
+ handleForget(ctx, parsed.positional[0]);
92
+ return;
93
+ case "stats":
94
+ handleStats(ctx);
95
+ return;
96
+ case "sources":
97
+ handleSources(ctx);
98
+ return;
99
+ case "note":
100
+ await handleNote(ctx, parsed);
101
+ return;
102
+ case "ingest":
103
+ await handleIngest(ctx, parsed);
104
+ return;
105
+ case "extract":
106
+ handleExtractSource(ctx, pi, parsed.positional[0]);
107
+ return;
108
+ case "export":
109
+ handleExport(ctx, parsed.positional[0]);
110
+ return;
111
+ case "import":
112
+ handleImport(ctx, parsed.positional[0]);
113
+ return;
114
+ case "decay":
115
+ handleDecay(ctx);
116
+ return;
117
+ case "cap":
118
+ handleCap(ctx, parsed.positional[0]);
119
+ return;
120
+ default:
121
+ ctx.ui.notify(`Unknown subcommand "${parsed.sub}". ${usage()}`, "warning");
122
+ return;
123
+ }
124
+ }
125
+ function usage() {
126
+ return [
127
+ "Usage: /gsd memory <subcommand>",
128
+ " list list recent active memories",
129
+ " show <MEM###> print one memory",
130
+ " forget <MEM###> supersede a memory",
131
+ " stats counts by category / scope / sources / edges",
132
+ " sources list recent memory_sources",
133
+ ' note "<text>" ingest an inline note as a source',
134
+ " ingest <path|url> ingest a local file path or URL",
135
+ " extract <SRC-xxx> dispatch an LLM turn to extract memories from a source",
136
+ " export <path.json> dump memories + relations + sources to JSON",
137
+ " import <path.json> load a previous export (idempotent)",
138
+ " decay run the stale-memory decay pass immediately",
139
+ " cap [N] enforce the memory cap (default 50)",
140
+ "",
141
+ "Options: --tag a,b --scope project|global|<custom> --extract",
142
+ ].join("\n");
143
+ }
144
+ async function ensureDb() {
145
+ if (isDbAvailable())
146
+ return;
147
+ const { ensureDbOpen } = await import("./bootstrap/dynamic-tools.js");
148
+ await ensureDbOpen();
149
+ }
150
+ function handleList(ctx) {
151
+ if (!isDbAvailable()) {
152
+ ctx.ui.notify("No GSD database available.", "warning");
153
+ return;
154
+ }
155
+ const memories = getActiveMemoriesRanked(50);
156
+ if (memories.length === 0) {
157
+ ctx.ui.notify("No active memories.", "info");
158
+ return;
159
+ }
160
+ const lines = memories.map((m) => `- [${m.id}] (${m.category}, conf ${m.confidence.toFixed(2)}, hits ${m.hit_count}${m.scope && m.scope !== "project" ? `, ${m.scope}` : ""}) ${truncate(m.content, 100)}`);
161
+ ctx.ui.notify(lines.join("\n"), "info");
162
+ }
163
+ function handleShow(ctx, id) {
164
+ if (!id) {
165
+ ctx.ui.notify("Usage: /gsd memory show <MEM###>", "warning");
166
+ return;
167
+ }
168
+ const adapter = _getAdapter();
169
+ if (!adapter) {
170
+ ctx.ui.notify("No GSD database available.", "warning");
171
+ return;
172
+ }
173
+ const row = adapter.prepare("SELECT * FROM memories WHERE id = :id").get({ ":id": id });
174
+ if (!row) {
175
+ ctx.ui.notify(`Memory not found: ${id}`, "warning");
176
+ return;
177
+ }
178
+ const tags = row["tags"] ? safeJsonArray(row["tags"]) : [];
179
+ const lines = [
180
+ `ID: ${row["id"]}`,
181
+ `Category: ${row["category"]}`,
182
+ `Scope: ${row["scope"] ?? "project"}`,
183
+ `Confidence: ${Number(row["confidence"]).toFixed(2)}`,
184
+ `Hits: ${row["hit_count"]}`,
185
+ `Created: ${row["created_at"]}`,
186
+ `Updated: ${row["updated_at"]}`,
187
+ tags.length > 0 ? `Tags: ${tags.join(", ")}` : null,
188
+ row["superseded_by"] ? `Superseded by: ${row["superseded_by"]}` : null,
189
+ row["source_unit_type"] ? `Source: ${row["source_unit_type"]}/${row["source_unit_id"]}` : null,
190
+ "",
191
+ String(row["content"]),
192
+ ]
193
+ .filter((line) => line !== null)
194
+ .join("\n");
195
+ ctx.ui.notify(lines, "info");
196
+ }
197
+ function handleForget(ctx, id) {
198
+ if (!id) {
199
+ ctx.ui.notify("Usage: /gsd memory forget <MEM###>", "warning");
200
+ return;
201
+ }
202
+ const ok = supersedeMemory(id, "CAP_EXCEEDED");
203
+ if (!ok) {
204
+ ctx.ui.notify(`Failed to forget ${id}.`, "warning");
205
+ return;
206
+ }
207
+ ctx.ui.notify(`Forgot ${id}.`, "info");
208
+ }
209
+ function handleStats(ctx) {
210
+ const adapter = _getAdapter();
211
+ if (!adapter) {
212
+ ctx.ui.notify("No GSD database available.", "warning");
213
+ return;
214
+ }
215
+ try {
216
+ const activeRow = adapter
217
+ .prepare("SELECT count(*) as cnt FROM memories WHERE superseded_by IS NULL")
218
+ .get();
219
+ const supersededRow = adapter
220
+ .prepare("SELECT count(*) as cnt FROM memories WHERE superseded_by IS NOT NULL")
221
+ .get();
222
+ const byCategory = adapter
223
+ .prepare("SELECT category, count(*) as cnt FROM memories WHERE superseded_by IS NULL GROUP BY category ORDER BY cnt DESC")
224
+ .all();
225
+ const byScope = adapter
226
+ .prepare("SELECT scope, count(*) as cnt FROM memories WHERE superseded_by IS NULL GROUP BY scope ORDER BY cnt DESC")
227
+ .all();
228
+ const sourcesRow = adapter.prepare("SELECT count(*) as cnt FROM memory_sources").get();
229
+ const sourcesByKind = adapter
230
+ .prepare("SELECT kind, count(*) as cnt FROM memory_sources GROUP BY kind ORDER BY cnt DESC")
231
+ .all();
232
+ const relationsRow = adapter.prepare("SELECT count(*) as cnt FROM memory_relations").get();
233
+ const relationsByRel = adapter
234
+ .prepare("SELECT rel, count(*) as cnt FROM memory_relations GROUP BY rel ORDER BY cnt DESC")
235
+ .all();
236
+ const embeddingsRow = adapter.prepare("SELECT count(*) as cnt FROM memory_embeddings").get();
237
+ const embeddedActiveRow = adapter
238
+ .prepare(`SELECT count(*) as cnt FROM memory_embeddings e
239
+ JOIN memories m ON m.id = e.memory_id
240
+ WHERE m.superseded_by IS NULL`)
241
+ .get();
242
+ const activeCount = activeRow?.["cnt"] ?? 0;
243
+ const embeddedActive = embeddedActiveRow?.["cnt"] ?? 0;
244
+ const coverage = activeCount > 0 ? `${Math.round((embeddedActive / activeCount) * 100)}%` : "n/a";
245
+ const out = [
246
+ `Active memories: ${activeCount}`,
247
+ `Superseded: ${supersededRow?.["cnt"] ?? 0}`,
248
+ "",
249
+ "By category:",
250
+ ...byCategory.map((row) => ` ${row["category"]}: ${row["cnt"]}`),
251
+ "",
252
+ "By scope:",
253
+ ...byScope.map((row) => ` ${row["scope"]}: ${row["cnt"]}`),
254
+ "",
255
+ `Memory sources: ${sourcesRow?.["cnt"] ?? 0}`,
256
+ ...sourcesByKind.map((row) => ` ${row["kind"]}: ${row["cnt"]}`),
257
+ "",
258
+ `Relations: ${relationsRow?.["cnt"] ?? 0}`,
259
+ ...relationsByRel.map((row) => ` ${row["rel"]}: ${row["cnt"]}`),
260
+ "",
261
+ `Embeddings: ${embeddingsRow?.["cnt"] ?? 0} total, ${embeddedActive} active (coverage ${coverage})`,
262
+ ].join("\n");
263
+ ctx.ui.notify(out, "info");
264
+ }
265
+ catch (err) {
266
+ ctx.ui.notify(`Stats failed: ${err.message}`, "warning");
267
+ }
268
+ }
269
+ function handleExport(ctx, target) {
270
+ if (!target) {
271
+ ctx.ui.notify("Usage: /gsd memory export <path.json>", "warning");
272
+ return;
273
+ }
274
+ try {
275
+ const active = getActiveMemories();
276
+ const relations = active.flatMap((m) => listRelationsFor(m.id).filter((r) => r.from === m.id));
277
+ const sources = listMemorySources(500);
278
+ const payload = {
279
+ version: 1,
280
+ exported_at: new Date().toISOString(),
281
+ memories: active.map((m) => ({
282
+ id: m.id,
283
+ category: m.category,
284
+ content: m.content,
285
+ confidence: m.confidence,
286
+ hit_count: m.hit_count,
287
+ scope: m.scope,
288
+ tags: m.tags,
289
+ source_unit_type: m.source_unit_type,
290
+ source_unit_id: m.source_unit_id,
291
+ created_at: m.created_at,
292
+ updated_at: m.updated_at,
293
+ })),
294
+ relations: relations.map((r) => ({
295
+ from: r.from,
296
+ to: r.to,
297
+ rel: r.rel,
298
+ confidence: r.confidence,
299
+ })),
300
+ sources,
301
+ };
302
+ const abs = resolvePath(process.cwd(), target);
303
+ writeFileSync(abs, JSON.stringify(payload, null, 2), "utf-8");
304
+ ctx.ui.notify(`Exported ${payload.memories.length} memories, ${payload.relations.length} relations, ${payload.sources.length} sources → ${abs}`, "info");
305
+ }
306
+ catch (err) {
307
+ ctx.ui.notify(`Export failed: ${err.message}`, "error");
308
+ }
309
+ }
310
+ function handleImport(ctx, target) {
311
+ if (!target) {
312
+ ctx.ui.notify("Usage: /gsd memory import <path.json>", "warning");
313
+ return;
314
+ }
315
+ try {
316
+ const abs = resolvePath(process.cwd(), target);
317
+ const raw = readFileSync(abs, "utf-8");
318
+ const parsed = JSON.parse(raw);
319
+ let memoryCount = 0;
320
+ let relationCount = 0;
321
+ for (const mem of parsed.memories ?? []) {
322
+ if (!mem.category || !mem.content)
323
+ continue;
324
+ // createMemory allocates a fresh seq → new MEM### id; imports replay
325
+ // content rather than preserving the old ID. Relations from the export
326
+ // file still reference the old IDs, so only lossless round-trips into
327
+ // an empty DB preserve the graph.
328
+ const id = createMemory({
329
+ category: mem.category,
330
+ content: mem.content,
331
+ confidence: mem.confidence,
332
+ scope: mem.scope,
333
+ tags: mem.tags,
334
+ });
335
+ if (id)
336
+ memoryCount++;
337
+ }
338
+ for (const rel of parsed.relations ?? []) {
339
+ if (!rel.from || !rel.to || !rel.rel)
340
+ continue;
341
+ if (createMemoryRelation(rel.from, rel.to, rel.rel, rel.confidence)) {
342
+ relationCount++;
343
+ }
344
+ }
345
+ ctx.ui.notify(`Imported ${memoryCount} memories and ${relationCount} relations.`, "info");
346
+ }
347
+ catch (err) {
348
+ ctx.ui.notify(`Import failed: ${err.message}`, "error");
349
+ }
350
+ }
351
+ function handleDecay(ctx) {
352
+ const decayed = decayStaleMemories(20);
353
+ if (decayed.length === 0) {
354
+ ctx.ui.notify("Decay pass: no stale memories found.", "info");
355
+ return;
356
+ }
357
+ ctx.ui.notify(`Decayed ${decayed.length} stale memor${decayed.length === 1 ? "y" : "ies"}: ${decayed.join(", ")}`, "info");
358
+ }
359
+ function handleCap(ctx, arg) {
360
+ const max = arg ? Number.parseInt(arg, 10) : 50;
361
+ if (!Number.isFinite(max) || max < 1) {
362
+ ctx.ui.notify("Usage: /gsd memory cap <max> (default 50)", "warning");
363
+ return;
364
+ }
365
+ enforceMemoryCap(max);
366
+ ctx.ui.notify(`Enforced memory cap of ${max}.`, "info");
367
+ }
368
+ function handleSources(ctx) {
369
+ const sources = listMemorySources(30);
370
+ if (sources.length === 0) {
371
+ ctx.ui.notify("No memory sources yet. Use `/gsd memory ingest <path|url>` to add one.", "info");
372
+ return;
373
+ }
374
+ const lines = sources.map((s) => `- ${s.id} [${s.kind}${s.scope !== "project" ? `/${s.scope}` : ""}] ${truncate(s.title ?? s.uri ?? s.content, 100)}`);
375
+ ctx.ui.notify(lines.join("\n"), "info");
376
+ }
377
+ async function handleNote(ctx, args) {
378
+ const text = args.positional.join(" ").trim();
379
+ if (!text) {
380
+ ctx.ui.notify('Usage: /gsd memory note "your note"', "warning");
381
+ return;
382
+ }
383
+ try {
384
+ const result = await ingestNote(text, null, {
385
+ scope: args.scope,
386
+ tags: args.tags,
387
+ extract: false,
388
+ });
389
+ ctx.ui.notify(summarizeIngest(result), "info");
390
+ }
391
+ catch (err) {
392
+ ctx.ui.notify(`Note ingest failed: ${err.message}`, "error");
393
+ }
394
+ }
395
+ async function handleIngest(ctx, args) {
396
+ const target = args.positional[0];
397
+ if (!target) {
398
+ ctx.ui.notify("Usage: /gsd memory ingest <path|url> [--tag a,b] [--scope project|global]", "warning");
399
+ return;
400
+ }
401
+ try {
402
+ const isUrl = /^https?:\/\//i.test(target);
403
+ const result = isUrl
404
+ ? await ingestUrl(target, null, { scope: args.scope, tags: args.tags, extract: false })
405
+ : await ingestFile(target, null, { scope: args.scope, tags: args.tags, extract: false });
406
+ ctx.ui.notify(summarizeIngest(result), "info");
407
+ if (args.extract && result.sourceId) {
408
+ // TODO (P3): dispatch agent turn to extract memories once source is stored.
409
+ ctx.ui.notify(`(Dispatching extraction turn — use \`/gsd memory extract ${result.sourceId}\` to trigger manually.)`, "info");
410
+ }
411
+ }
412
+ catch (err) {
413
+ ctx.ui.notify(`Ingest failed: ${err.message}`, "error");
414
+ }
415
+ }
416
+ function handleExtractSource(ctx, pi, id) {
417
+ if (!id) {
418
+ ctx.ui.notify("Usage: /gsd memory extract <SRC-xxx>", "warning");
419
+ return;
420
+ }
421
+ const source = getMemorySource(id);
422
+ if (!source) {
423
+ ctx.ui.notify(`Source not found: ${id}`, "warning");
424
+ return;
425
+ }
426
+ const prompt = buildExtractPrompt(source);
427
+ ctx.ui.notify(`Dispatching extraction turn for ${id}...`, "info");
428
+ pi.sendMessage({ customType: "gsd-memory-extract", content: prompt, display: false }, { triggerTurn: true });
429
+ }
430
+ function buildExtractPrompt(source) {
431
+ const header = [
432
+ `## Memory extraction request`,
433
+ ``,
434
+ `Source: ${source.id} (${source.kind})`,
435
+ source.title ? `Title: ${source.title}` : null,
436
+ source.uri ? `URI: ${source.uri}` : null,
437
+ ]
438
+ .filter(Boolean)
439
+ .join("\n");
440
+ return [
441
+ header,
442
+ "",
443
+ "Read the content below and call the `capture_thought` tool once per durable insight",
444
+ "(architecture, convention, gotcha, preference, environment, pattern). Skip one-off details,",
445
+ "temporary state, and anything secret. Keep each memory to 1–3 sentences.",
446
+ "",
447
+ "---",
448
+ "",
449
+ source.content,
450
+ ].join("\n");
451
+ }
452
+ function safeJsonArray(raw) {
453
+ try {
454
+ const parsed = JSON.parse(raw);
455
+ return Array.isArray(parsed) ? parsed.filter((t) => typeof t === "string") : [];
456
+ }
457
+ catch {
458
+ return [];
459
+ }
460
+ }
461
+ // projectRoot is imported so tests can mock it via the same path as other commands.
462
+ export const _internals = { projectRoot };
@@ -583,10 +583,20 @@ async function configureAdvanced(ctx, prefs) {
583
583
  }
584
584
  }
585
585
  // ─── Main wizard with category menu ─────────────────────────────────────────
586
- export async function handlePrefsWizard(ctx, scope) {
587
- const path = scope === "project" ? getProjectGSDPreferencesPath() : getGlobalGSDPreferencesPath();
586
+ export async function handlePrefsWizard(ctx, scope, prefill, opts) {
587
+ // pathOverride lets callers like /gsd init pass a basePath-derived target
588
+ // path so the wizard doesn't fall back to cwd-based getProjectGSDPreferencesPath
589
+ // when the init target diverges from the current working directory.
590
+ const path = opts?.pathOverride
591
+ ?? (scope === "project" ? getProjectGSDPreferencesPath() : getGlobalGSDPreferencesPath());
588
592
  const existing = scope === "project" ? loadProjectGSDPreferences() : loadGlobalGSDPreferences();
589
- const prefs = existing?.preferences ? { ...existing.preferences } : {};
593
+ // Order: existing-on-disk values, overlaid with prefill (caller's seeded answers).
594
+ // Callers like /gsd init pass freshly-collected init answers as prefill so the
595
+ // wizard menu shows them populated and writeable in one place.
596
+ const prefs = {
597
+ ...(existing?.preferences ?? {}),
598
+ ...(prefill ?? {}),
599
+ };
590
600
  ctx.ui.notify(`GSD preferences (${scope}) — pick a category to configure.`, "info");
591
601
  while (true) {
592
602
  const summaries = buildCategorySummaries(prefs);
@@ -622,11 +632,24 @@ export async function handlePrefsWizard(ctx, scope) {
622
632
  else if (choice.startsWith("Advanced"))
623
633
  await configureAdvanced(ctx, prefs);
624
634
  }
625
- // ─── Serialize to frontmatter ───────────────────────────────────────────
626
- prefs.version = prefs.version || 1;
627
- const frontmatter = serializePreferencesToFrontmatter(prefs);
628
- // Preserve existing body content (everything after closing ---)
629
- let body = "\n# GSD Skill Preferences\n\nSee `~/.gsd/agent/extensions/gsd/docs/preferences-reference.md` for full field documentation and examples.\n";
635
+ await writePreferencesFile(path, prefs, ctx, { scope });
636
+ }
637
+ /**
638
+ * Single source of truth for writing a PREFERENCES.md file.
639
+ *
640
+ * Both `/gsd init` and the prefs wizard route through this helper so we can't
641
+ * drift on serialization, body preservation, or post-write reload. Callers
642
+ * pass `ctx` for the reload/notify side effects; the function is safe to call
643
+ * without a full UI context for tests via `ctx: null` (skips reload/notify).
644
+ */
645
+ export async function writePreferencesFile(path, prefs, ctx, opts) {
646
+ const next = { ...prefs, version: prefs.version || 1 };
647
+ const frontmatter = serializePreferencesToFrontmatter(next);
648
+ const fallbackBody = opts?.defaultBody
649
+ ?? "\n# GSD Skill Preferences\n\nSee `~/.gsd/agent/extensions/gsd/docs/preferences-reference.md` for full field documentation and examples.\n";
650
+ // Preserve existing body content (everything after closing ---) so users
651
+ // who edited the markdown body don't lose their notes.
652
+ let body = fallbackBody;
630
653
  if (existsSync(path)) {
631
654
  const preserved = extractBodyAfterFrontmatter(readFileSync(path, "utf-8"));
632
655
  if (preserved)
@@ -634,9 +657,14 @@ export async function handlePrefsWizard(ctx, scope) {
634
657
  }
635
658
  const content = `---\n${frontmatter}---${body}`;
636
659
  await saveFile(path, content);
637
- await ctx.waitForIdle();
638
- await ctx.reload();
639
- ctx.ui.notify(`Saved ${scope} preferences to ${path}`, "info");
660
+ if (ctx) {
661
+ await ctx.waitForIdle();
662
+ await ctx.reload();
663
+ if (opts?.notifyOnSave !== false) {
664
+ const scopeLabel = opts?.scope ? `${opts.scope} ` : "";
665
+ ctx.ui.notify(`Saved ${scopeLabel}preferences to ${path}`, "info");
666
+ }
667
+ }
640
668
  }
641
669
  /** Wrap a YAML value in double quotes if it contains special characters. */
642
670
  export function yamlSafeString(val) {
@@ -13,7 +13,7 @@
13
13
  */
14
14
  import { readFileSync } from "node:fs";
15
15
  import { join } from "node:path";
16
- import { readGraph, writeGraph, getNextPendingStep, markStepComplete, expandIteration, } from "./graph.js";
16
+ import { readGraph, writeGraph, getNextPendingStep, markStepActive, markStepComplete, expandIteration, } from "./graph.js";
17
17
  import { injectContext } from "./context-injector.js";
18
18
  import { readFrozenDefinition } from "./definition-io.js";
19
19
  import { parseUnitId } from "./unit-id.js";
@@ -62,66 +62,86 @@ export class CustomWorkflowEngine {
62
62
  * - Expanded GRAPH.yaml is written to disk before dispatch — inspectable on disk.
63
63
  */
64
64
  async resolveDispatch(state, _context) {
65
- let graph = state.raw;
66
- let next = getNextPendingStep(graph);
67
- if (!next) {
68
- return {
69
- action: "stop",
70
- reason: "All steps complete",
71
- level: "info",
72
- };
73
- }
74
- // Check frozen DEFINITION.yaml for iterate config on this step
75
- const def = readFrozenDefinition(this.runDir);
76
- const stepDef = def.steps.find((s) => s.id === next.id);
77
- if (stepDef?.iterate) {
78
- const iterate = stepDef.iterate;
79
- // Read source artifact
80
- const sourcePath = join(this.runDir, iterate.source);
81
- let sourceContent;
82
- try {
83
- sourceContent = readFileSync(sourcePath, "utf-8");
84
- }
85
- catch {
86
- throw new Error(`Iterate source artifact not found: ${sourcePath} (step "${next.id}", source: "${iterate.source}")`);
87
- }
88
- // Extract items via regex with global+multiline flags.
89
- // Guard against ReDoS: if matching takes too long on large inputs, bail.
90
- const regex = new RegExp(iterate.pattern, "gm");
91
- const items = [];
92
- const matchStart = Date.now();
93
- let match;
94
- while ((match = regex.exec(sourceContent)) !== null) {
95
- if (match[1] !== undefined)
96
- items.push(match[1]);
97
- if (Date.now() - matchStart > 5_000) {
98
- throw new Error(`Iterate pattern "${iterate.pattern}" exceeded 5s timeout on step "${next.id}" — possible ReDoS`);
99
- }
65
+ const graphPath = join(this.runDir, "GRAPH.yaml");
66
+ return await withFileLock(graphPath, () => {
67
+ let graph = readGraph(this.runDir);
68
+ const active = graph.steps.find((step) => step.status === "active");
69
+ if (active) {
70
+ return {
71
+ action: "dispatch",
72
+ step: {
73
+ unitType: "custom-step",
74
+ unitId: `${graph.metadata.name}/${active.id}`,
75
+ prompt: injectContext(this.runDir, active.id, active.prompt),
76
+ },
77
+ };
100
78
  }
101
- // Expand the graph
102
- const expandedGraph = expandIteration(graph, next.id, items, next.prompt);
103
- writeGraph(this.runDir, expandedGraph);
104
- graph = expandedGraph;
105
- // Re-query for first instance step
106
- next = getNextPendingStep(expandedGraph);
79
+ let next = getNextPendingStep(graph);
107
80
  if (!next) {
108
81
  return {
109
82
  action: "stop",
110
- reason: "Iterate expansion produced no instances",
83
+ reason: "All steps complete",
111
84
  level: "info",
112
85
  };
113
86
  }
114
- }
115
- // Enrich prompt with context from prior step artifacts
116
- const enrichedPrompt = injectContext(this.runDir, next.id, next.prompt);
117
- return {
118
- action: "dispatch",
119
- step: {
120
- unitType: "custom-step",
121
- unitId: `${graph.metadata.name}/${next.id}`,
122
- prompt: enrichedPrompt,
123
- },
124
- };
87
+ // Check frozen DEFINITION.yaml for iterate config on this step
88
+ const def = readFrozenDefinition(this.runDir);
89
+ const stepDef = def.steps.find((s) => s.id === next.id);
90
+ if (stepDef?.iterate) {
91
+ const iterate = stepDef.iterate;
92
+ // Read source artifact
93
+ const sourcePath = join(this.runDir, iterate.source);
94
+ let sourceContent;
95
+ try {
96
+ sourceContent = readFileSync(sourcePath, "utf-8");
97
+ }
98
+ catch {
99
+ throw new Error(`Iterate source artifact not found: ${sourcePath} (step "${next.id}", source: "${iterate.source}")`);
100
+ }
101
+ // Extract items via regex with global+multiline flags.
102
+ // Guard against ReDoS: if matching takes too long on large inputs, bail.
103
+ const regex = new RegExp(iterate.pattern, "gm");
104
+ const items = [];
105
+ const matchStart = Date.now();
106
+ let match;
107
+ while ((match = regex.exec(sourceContent)) !== null) {
108
+ if (match[1] !== undefined)
109
+ items.push(match[1]);
110
+ if (Date.now() - matchStart > 5_000) {
111
+ throw new Error(`Iterate pattern "${iterate.pattern}" exceeded 5s timeout on step "${next.id}" — possible ReDoS`);
112
+ }
113
+ }
114
+ // Expand the graph
115
+ const expandedGraph = expandIteration(graph, next.id, items, next.prompt);
116
+ writeGraph(this.runDir, expandedGraph);
117
+ graph = expandedGraph;
118
+ // Re-query for first instance step
119
+ next = getNextPendingStep(expandedGraph);
120
+ if (!next) {
121
+ return {
122
+ action: "stop",
123
+ reason: "Iterate expansion produced no instances",
124
+ level: "info",
125
+ };
126
+ }
127
+ }
128
+ const activeGraph = markStepActive(graph, next.id);
129
+ writeGraph(this.runDir, activeGraph);
130
+ const activeStep = activeGraph.steps.find((s) => s.id === next.id);
131
+ if (!activeStep) {
132
+ throw new Error(`Active step not found after GRAPH.yaml update: ${next.id}`);
133
+ }
134
+ // Enrich prompt with context from prior step artifacts
135
+ const enrichedPrompt = injectContext(this.runDir, activeStep.id, activeStep.prompt);
136
+ return {
137
+ action: "dispatch",
138
+ step: {
139
+ unitType: "custom-step",
140
+ unitId: `${activeGraph.metadata.name}/${activeStep.id}`,
141
+ prompt: enrichedPrompt,
142
+ },
143
+ };
144
+ });
125
145
  }
126
146
  /**
127
147
  * Reconcile state after a step completes.