gsd-pi 2.78.1-dev.84a383f51 → 2.78.1

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 (474) hide show
  1. package/README.md +7 -7
  2. package/dist/cli.js +55 -95
  3. package/dist/headless-query.d.ts +0 -22
  4. package/dist/headless-query.js +4 -24
  5. package/dist/headless.d.ts +0 -10
  6. package/dist/headless.js +1 -16
  7. package/dist/loader.js +10 -7
  8. package/dist/onboarding.d.ts +0 -10
  9. package/dist/onboarding.js +2 -2
  10. package/dist/provider-migrations.d.ts +2 -2
  11. package/dist/provider-migrations.js +2 -5
  12. package/dist/resource-loader.d.ts +2 -5
  13. package/dist/resource-loader.js +5 -28
  14. package/dist/resources/extensions/browser-tools/tests/browser-tools-integration.test.mjs +601 -0
  15. package/dist/resources/extensions/browser-tools/tests/browser-tools-unit.test.cjs +651 -0
  16. package/dist/resources/extensions/browser-tools/tests/capture-sharp-optional.test.cjs +91 -0
  17. package/dist/resources/extensions/gsd/auto/loop.js +0 -23
  18. package/dist/resources/extensions/gsd/auto/phases.js +2 -2
  19. package/dist/resources/extensions/gsd/auto/run-unit.js +1 -3
  20. package/dist/resources/extensions/gsd/auto/session.js +0 -3
  21. package/dist/resources/extensions/gsd/auto-recovery.js +4 -43
  22. package/dist/resources/extensions/gsd/auto-start.js +1 -1
  23. package/dist/resources/extensions/gsd/auto-tool-tracking.js +2 -2
  24. package/dist/resources/extensions/gsd/auto-worktree.js +0 -30
  25. package/dist/resources/extensions/gsd/auto.js +5 -14
  26. package/dist/resources/extensions/gsd/bootstrap/db-tools.js +2 -14
  27. package/dist/resources/extensions/gsd/bootstrap/exec-tools.js +5 -7
  28. package/dist/resources/extensions/gsd/bootstrap/query-tools.js +2 -2
  29. package/dist/resources/extensions/gsd/bootstrap/register-extension.js +4 -5
  30. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +31 -94
  31. package/dist/resources/extensions/gsd/bootstrap/register-shortcuts.js +6 -11
  32. package/dist/resources/extensions/gsd/bootstrap/system-context.js +8 -34
  33. package/dist/resources/extensions/gsd/bootstrap/write-gate.js +2 -38
  34. package/dist/resources/extensions/gsd/commands/catalog.js +5 -69
  35. package/dist/resources/extensions/gsd/commands/handlers/core.js +1 -22
  36. package/dist/resources/extensions/gsd/commands-mcp-status.js +1 -3
  37. package/dist/resources/extensions/gsd/commands-prefs-wizard.js +1 -10
  38. package/dist/resources/extensions/gsd/dashboard-overlay.js +1 -1
  39. package/dist/resources/extensions/gsd/docs/preferences-reference.md +0 -4
  40. package/dist/resources/extensions/gsd/doctor-runtime-checks.js +1 -39
  41. package/dist/resources/extensions/gsd/error-classifier.js +1 -1
  42. package/dist/resources/extensions/gsd/forensics.js +2 -2
  43. package/dist/resources/extensions/gsd/git-service.js +5 -12
  44. package/dist/resources/extensions/gsd/gsd-db.js +2 -11
  45. package/dist/resources/extensions/gsd/guided-flow.js +23 -23
  46. package/dist/resources/extensions/gsd/memory-store.js +31 -66
  47. package/dist/resources/extensions/gsd/model-router.js +9 -114
  48. package/dist/resources/extensions/gsd/native-git-bridge.js +1 -7
  49. package/dist/resources/extensions/gsd/preferences-models.js +15 -91
  50. package/dist/resources/extensions/gsd/preferences-types.js +0 -2
  51. package/dist/resources/extensions/gsd/preferences-validation.js +0 -32
  52. package/dist/resources/extensions/gsd/preferences.js +3 -5
  53. package/dist/resources/extensions/gsd/prompt-loader.js +12 -23
  54. package/dist/resources/extensions/gsd/slice-parallel-orchestrator.js +3 -9
  55. package/dist/resources/extensions/gsd/state.js +0 -42
  56. package/dist/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
  57. package/dist/resources/extensions/gsd/tests/auto-supervisor.test.mjs +53 -0
  58. package/dist/resources/extensions/gsd/tests/dist-redirect.mjs +112 -0
  59. package/dist/resources/extensions/gsd/tests/resolve-ts-hooks.mjs +23 -0
  60. package/dist/resources/extensions/gsd/tests/resolve-ts.mjs +5 -0
  61. package/dist/resources/extensions/gsd/tools/memory-tools.js +1 -18
  62. package/dist/resources/extensions/gsd/visualizer-overlay.js +1 -1
  63. package/dist/resources/extensions/gsd/watch/header-renderer.js +1 -3
  64. package/dist/resources/extensions/gsd/worktree-command.js +46 -26
  65. package/dist/resources/extensions/mcp-client/index.js +3 -6
  66. package/dist/resources/extensions/slash-commands/create-extension.js +22 -36
  67. package/dist/resources/skills/create-gsd-extension/SKILL.md +5 -9
  68. package/dist/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  69. package/dist/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  70. package/dist/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  71. package/dist/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  72. package/dist/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  73. package/dist/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  74. package/dist/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  75. package/dist/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
  76. package/dist/resources/skills/github-workflows/references/gh/tests/__init__.py +0 -0
  77. package/dist/resources/skills/github-workflows/references/gh/tests/test_github_project_setup.py +608 -0
  78. package/dist/rtk-shared.d.ts +0 -3
  79. package/dist/rtk-shared.js +0 -17
  80. package/dist/rtk.d.ts +5 -2
  81. package/dist/rtk.js +20 -3
  82. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  83. package/dist/web/standalone/.next/BUILD_ID +1 -1
  84. package/dist/web/standalone/.next/app-path-routes-manifest.json +13 -13
  85. package/dist/web/standalone/.next/build-manifest.json +4 -4
  86. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  87. package/dist/web/standalone/.next/react-loadable-manifest.json +4 -44
  88. package/dist/web/standalone/.next/required-server-files.json +3 -3
  89. package/dist/web/standalone/.next/server/app/_global-error/page.js +3 -3
  90. package/dist/web/standalone/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  91. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  92. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  93. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  94. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  95. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  96. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  97. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  98. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  99. package/dist/web/standalone/.next/server/app/_not-found/page.js +2 -2
  100. package/dist/web/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  101. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  102. package/dist/web/standalone/.next/server/app/_not-found.rsc +3 -3
  103. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +3 -3
  104. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  105. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +3 -3
  106. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  107. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  108. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  109. package/dist/web/standalone/.next/server/app/api/boot/route.js +1 -1
  110. package/dist/web/standalone/.next/server/app/api/boot/route_client-reference-manifest.js +1 -1
  111. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js +1 -1
  112. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route_client-reference-manifest.js +1 -1
  113. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js +1 -1
  114. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route_client-reference-manifest.js +1 -1
  115. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js +2 -2
  116. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route_client-reference-manifest.js +1 -1
  117. package/dist/web/standalone/.next/server/app/api/browse-directories/route.js +1 -1
  118. package/dist/web/standalone/.next/server/app/api/browse-directories/route_client-reference-manifest.js +1 -1
  119. package/dist/web/standalone/.next/server/app/api/captures/route.js +1 -1
  120. package/dist/web/standalone/.next/server/app/api/captures/route_client-reference-manifest.js +1 -1
  121. package/dist/web/standalone/.next/server/app/api/cleanup/route.js +1 -1
  122. package/dist/web/standalone/.next/server/app/api/cleanup/route_client-reference-manifest.js +1 -1
  123. package/dist/web/standalone/.next/server/app/api/dev-mode/route.js +1 -1
  124. package/dist/web/standalone/.next/server/app/api/dev-mode/route_client-reference-manifest.js +1 -1
  125. package/dist/web/standalone/.next/server/app/api/doctor/route.js +1 -1
  126. package/dist/web/standalone/.next/server/app/api/doctor/route_client-reference-manifest.js +1 -1
  127. package/dist/web/standalone/.next/server/app/api/experimental/route.js +2 -2
  128. package/dist/web/standalone/.next/server/app/api/experimental/route_client-reference-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/app/api/export-data/route.js +1 -1
  130. package/dist/web/standalone/.next/server/app/api/export-data/route_client-reference-manifest.js +1 -1
  131. package/dist/web/standalone/.next/server/app/api/files/route.js +1 -1
  132. package/dist/web/standalone/.next/server/app/api/files/route_client-reference-manifest.js +1 -1
  133. package/dist/web/standalone/.next/server/app/api/forensics/route.js +1 -1
  134. package/dist/web/standalone/.next/server/app/api/forensics/route_client-reference-manifest.js +1 -1
  135. package/dist/web/standalone/.next/server/app/api/git/route.js +1 -1
  136. package/dist/web/standalone/.next/server/app/api/git/route_client-reference-manifest.js +1 -1
  137. package/dist/web/standalone/.next/server/app/api/history/route.js +1 -1
  138. package/dist/web/standalone/.next/server/app/api/history/route_client-reference-manifest.js +1 -1
  139. package/dist/web/standalone/.next/server/app/api/hooks/route.js +1 -1
  140. package/dist/web/standalone/.next/server/app/api/hooks/route_client-reference-manifest.js +1 -1
  141. package/dist/web/standalone/.next/server/app/api/inspect/route.js +1 -1
  142. package/dist/web/standalone/.next/server/app/api/inspect/route_client-reference-manifest.js +1 -1
  143. package/dist/web/standalone/.next/server/app/api/knowledge/route.js +1 -1
  144. package/dist/web/standalone/.next/server/app/api/knowledge/route_client-reference-manifest.js +1 -1
  145. package/dist/web/standalone/.next/server/app/api/live-state/route.js +1 -1
  146. package/dist/web/standalone/.next/server/app/api/live-state/route_client-reference-manifest.js +1 -1
  147. package/dist/web/standalone/.next/server/app/api/notifications/route.js +2 -2
  148. package/dist/web/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  149. package/dist/web/standalone/.next/server/app/api/onboarding/route.js +1 -1
  150. package/dist/web/standalone/.next/server/app/api/onboarding/route_client-reference-manifest.js +1 -1
  151. package/dist/web/standalone/.next/server/app/api/preferences/route.js +1 -1
  152. package/dist/web/standalone/.next/server/app/api/preferences/route_client-reference-manifest.js +1 -1
  153. package/dist/web/standalone/.next/server/app/api/projects/route.js +1 -1
  154. package/dist/web/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  155. package/dist/web/standalone/.next/server/app/api/recovery/route.js +1 -1
  156. package/dist/web/standalone/.next/server/app/api/recovery/route_client-reference-manifest.js +1 -1
  157. package/dist/web/standalone/.next/server/app/api/remote-questions/route.js +2 -2
  158. package/dist/web/standalone/.next/server/app/api/remote-questions/route_client-reference-manifest.js +1 -1
  159. package/dist/web/standalone/.next/server/app/api/session/browser/route.js +1 -1
  160. package/dist/web/standalone/.next/server/app/api/session/browser/route_client-reference-manifest.js +1 -1
  161. package/dist/web/standalone/.next/server/app/api/session/command/route.js +1 -1
  162. package/dist/web/standalone/.next/server/app/api/session/command/route_client-reference-manifest.js +1 -1
  163. package/dist/web/standalone/.next/server/app/api/session/events/route.js +2 -4
  164. package/dist/web/standalone/.next/server/app/api/session/events/route_client-reference-manifest.js +1 -1
  165. package/dist/web/standalone/.next/server/app/api/session/manage/route.js +1 -1
  166. package/dist/web/standalone/.next/server/app/api/session/manage/route_client-reference-manifest.js +1 -1
  167. package/dist/web/standalone/.next/server/app/api/settings-data/route.js +1 -1
  168. package/dist/web/standalone/.next/server/app/api/settings-data/route_client-reference-manifest.js +1 -1
  169. package/dist/web/standalone/.next/server/app/api/shutdown/route.js +1 -1
  170. package/dist/web/standalone/.next/server/app/api/shutdown/route_client-reference-manifest.js +1 -1
  171. package/dist/web/standalone/.next/server/app/api/skill-health/route.js +1 -1
  172. package/dist/web/standalone/.next/server/app/api/skill-health/route_client-reference-manifest.js +1 -1
  173. package/dist/web/standalone/.next/server/app/api/steer/route.js +1 -1
  174. package/dist/web/standalone/.next/server/app/api/steer/route_client-reference-manifest.js +1 -1
  175. package/dist/web/standalone/.next/server/app/api/switch-root/route.js +1 -1
  176. package/dist/web/standalone/.next/server/app/api/switch-root/route_client-reference-manifest.js +1 -1
  177. package/dist/web/standalone/.next/server/app/api/terminal/input/route.js +2 -2
  178. package/dist/web/standalone/.next/server/app/api/terminal/input/route_client-reference-manifest.js +1 -1
  179. package/dist/web/standalone/.next/server/app/api/terminal/resize/route.js +2 -2
  180. package/dist/web/standalone/.next/server/app/api/terminal/resize/route_client-reference-manifest.js +1 -1
  181. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js +2 -2
  182. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route_client-reference-manifest.js +1 -1
  183. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js +4 -4
  184. package/dist/web/standalone/.next/server/app/api/terminal/stream/route_client-reference-manifest.js +1 -1
  185. package/dist/web/standalone/.next/server/app/api/terminal/upload/route.js +1 -1
  186. package/dist/web/standalone/.next/server/app/api/terminal/upload/route_client-reference-manifest.js +1 -1
  187. package/dist/web/standalone/.next/server/app/api/undo/route.js +1 -1
  188. package/dist/web/standalone/.next/server/app/api/undo/route_client-reference-manifest.js +1 -1
  189. package/dist/web/standalone/.next/server/app/api/update/route.js +1 -1
  190. package/dist/web/standalone/.next/server/app/api/update/route_client-reference-manifest.js +1 -1
  191. package/dist/web/standalone/.next/server/app/api/visualizer/route.js +1 -1
  192. package/dist/web/standalone/.next/server/app/api/visualizer/route_client-reference-manifest.js +1 -1
  193. package/dist/web/standalone/.next/server/app/index.html +1 -1
  194. package/dist/web/standalone/.next/server/app/index.rsc +4 -4
  195. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  196. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +4 -4
  197. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  198. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +3 -3
  199. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  200. package/dist/web/standalone/.next/server/app/page.js +2 -2
  201. package/dist/web/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  202. package/dist/web/standalone/.next/server/app-paths-manifest.json +13 -13
  203. package/dist/web/standalone/.next/server/chunks/63.js +3 -3
  204. package/dist/web/standalone/.next/server/chunks/6897.js +1 -1
  205. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  206. package/dist/web/standalone/.next/server/middleware-manifest.json +5 -5
  207. package/dist/web/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
  208. package/dist/web/standalone/.next/server/middleware.js +2 -2
  209. package/dist/web/standalone/.next/server/next-font-manifest.js +1 -1
  210. package/dist/web/standalone/.next/server/next-font-manifest.json +1 -1
  211. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  212. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  213. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  214. package/dist/web/standalone/.next/server/webpack-runtime.js +1 -1
  215. package/dist/web/standalone/.next/static/chunks/2826.e9f5195e91f9cad2.js +11 -0
  216. package/dist/web/standalone/.next/static/chunks/3621.fc7480022c972438.js +20 -0
  217. package/dist/web/standalone/.next/static/chunks/app/_not-found/{page-f2a7482d42a5614b.js → page-2f24283c162b6ab3.js} +1 -1
  218. package/dist/web/standalone/.next/static/chunks/app/{layout-a16c7a7ecdf0c2cf.js → layout-9ecfd95f343793f0.js} +1 -1
  219. package/dist/web/standalone/.next/static/chunks/app/page-151349214571e2b6.js +1 -0
  220. package/dist/web/standalone/.next/static/chunks/main-app-d3d4c336195465f9.js +1 -0
  221. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-ab5a8926e07ec673.js +1 -0
  222. package/dist/web/standalone/.next/static/chunks/webpack-2e68521d7c82f7c2.js +1 -0
  223. package/dist/web/standalone/node_modules/node-pty/build/Makefile +2 -2
  224. package/dist/web/standalone/node_modules/node-pty/build/Release/pty.node +0 -0
  225. package/dist/web/standalone/node_modules/node-pty/build/pty.target.mk +14 -14
  226. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api.target.mk +14 -14
  227. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_except.target.mk +14 -14
  228. package/dist/web/standalone/node_modules/node-pty/node-addon-api/node_addon_api_maybe.target.mk +14 -14
  229. package/dist/web/standalone/package.json +1 -2
  230. package/dist/web/standalone/server.js +1 -1
  231. package/package.json +1 -1
  232. package/packages/mcp-server/dist/workflow-tools.d.ts.map +1 -1
  233. package/packages/mcp-server/dist/workflow-tools.js +46 -74
  234. package/packages/mcp-server/dist/workflow-tools.js.map +1 -1
  235. package/packages/mcp-server/src/workflow-tools.test.ts +0 -26
  236. package/packages/mcp-server/src/workflow-tools.ts +58 -93
  237. package/packages/mcp-server/tsconfig.tsbuildinfo +1 -1
  238. package/packages/pi-agent-core/tsconfig.tsbuildinfo +1 -1
  239. package/packages/pi-ai/dist/providers/anthropic-shared.d.ts.map +1 -1
  240. package/packages/pi-ai/dist/providers/anthropic-shared.js +19 -48
  241. package/packages/pi-ai/dist/providers/anthropic-shared.js.map +1 -1
  242. package/packages/pi-ai/dist/types.d.ts +0 -13
  243. package/packages/pi-ai/dist/types.d.ts.map +1 -1
  244. package/packages/pi-ai/dist/types.js.map +1 -1
  245. package/packages/pi-ai/dist/utils/repair-tool-json.d.ts.map +1 -1
  246. package/packages/pi-ai/dist/utils/repair-tool-json.js +3 -24
  247. package/packages/pi-ai/dist/utils/repair-tool-json.js.map +1 -1
  248. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js +0 -26
  249. package/packages/pi-ai/dist/utils/tests/repair-tool-json.test.js.map +1 -1
  250. package/packages/pi-ai/src/providers/anthropic-shared.ts +20 -52
  251. package/packages/pi-ai/src/types.ts +0 -13
  252. package/packages/pi-ai/src/utils/repair-tool-json.ts +3 -24
  253. package/packages/pi-ai/src/utils/tests/repair-tool-json.test.ts +0 -32
  254. package/packages/pi-ai/tsconfig.tsbuildinfo +1 -1
  255. package/packages/pi-coding-agent/dist/core/agent-session.d.ts.map +1 -1
  256. package/packages/pi-coding-agent/dist/core/agent-session.js +0 -6
  257. package/packages/pi-coding-agent/dist/core/agent-session.js.map +1 -1
  258. package/packages/pi-coding-agent/dist/core/messages.d.ts.map +1 -1
  259. package/packages/pi-coding-agent/dist/core/messages.js +0 -4
  260. package/packages/pi-coding-agent/dist/core/messages.js.map +1 -1
  261. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js +2 -19
  262. package/packages/pi-coding-agent/dist/core/model-registry-auth-mode.test.js.map +1 -1
  263. package/packages/pi-coding-agent/dist/core/model-registry.d.ts +0 -10
  264. package/packages/pi-coding-agent/dist/core/model-registry.d.ts.map +1 -1
  265. package/packages/pi-coding-agent/dist/core/model-registry.js +0 -18
  266. package/packages/pi-coding-agent/dist/core/model-registry.js.map +1 -1
  267. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts +0 -13
  268. package/packages/pi-coding-agent/dist/core/system-prompt.d.ts.map +1 -1
  269. package/packages/pi-coding-agent/dist/core/system-prompt.js +16 -20
  270. package/packages/pi-coding-agent/dist/core/system-prompt.js.map +1 -1
  271. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js +1 -1
  272. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.js.map +1 -1
  273. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js +1 -14
  274. package/packages/pi-coding-agent/dist/modes/interactive/controllers/input-controller.test.js.map +1 -1
  275. package/packages/pi-coding-agent/src/core/agent-session.ts +0 -7
  276. package/packages/pi-coding-agent/src/core/messages.ts +0 -4
  277. package/packages/pi-coding-agent/src/core/model-registry-auth-mode.test.ts +2 -32
  278. package/packages/pi-coding-agent/src/core/model-registry.ts +0 -21
  279. package/packages/pi-coding-agent/src/core/system-prompt.ts +15 -33
  280. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.test.ts +1 -17
  281. package/packages/pi-coding-agent/src/modes/interactive/controllers/input-controller.ts +1 -1
  282. package/packages/pi-coding-agent/tsconfig.tsbuildinfo +1 -1
  283. package/packages/pi-tui/dist/__tests__/autocomplete.test.js +3 -17
  284. package/packages/pi-tui/dist/__tests__/autocomplete.test.js.map +1 -1
  285. package/packages/pi-tui/src/__tests__/autocomplete.test.ts +3 -20
  286. package/packages/pi-tui/tsconfig.tsbuildinfo +1 -1
  287. package/src/resources/extensions/gsd/auto/loop.ts +2 -24
  288. package/src/resources/extensions/gsd/auto/phases.ts +3 -3
  289. package/src/resources/extensions/gsd/auto/run-unit.ts +1 -3
  290. package/src/resources/extensions/gsd/auto/session.ts +0 -3
  291. package/src/resources/extensions/gsd/auto/types.ts +0 -1
  292. package/src/resources/extensions/gsd/auto-recovery.ts +8 -46
  293. package/src/resources/extensions/gsd/auto-start.ts +1 -1
  294. package/src/resources/extensions/gsd/auto-tool-tracking.ts +4 -2
  295. package/src/resources/extensions/gsd/auto-worktree.ts +0 -38
  296. package/src/resources/extensions/gsd/auto.ts +4 -14
  297. package/src/resources/extensions/gsd/bootstrap/db-tools.ts +13 -15
  298. package/src/resources/extensions/gsd/bootstrap/exec-tools.ts +7 -8
  299. package/src/resources/extensions/gsd/bootstrap/query-tools.ts +2 -2
  300. package/src/resources/extensions/gsd/bootstrap/register-extension.ts +9 -10
  301. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +31 -102
  302. package/src/resources/extensions/gsd/bootstrap/register-shortcuts.ts +6 -12
  303. package/src/resources/extensions/gsd/bootstrap/system-context.ts +8 -39
  304. package/src/resources/extensions/gsd/bootstrap/write-gate.ts +11 -39
  305. package/src/resources/extensions/gsd/commands/catalog.ts +5 -75
  306. package/src/resources/extensions/gsd/commands/handlers/core.ts +1 -22
  307. package/src/resources/extensions/gsd/commands-mcp-status.ts +1 -3
  308. package/src/resources/extensions/gsd/commands-prefs-wizard.ts +1 -15
  309. package/src/resources/extensions/gsd/dashboard-overlay.ts +1 -1
  310. package/src/resources/extensions/gsd/docs/preferences-reference.md +0 -4
  311. package/src/resources/extensions/gsd/doctor-runtime-checks.ts +1 -39
  312. package/src/resources/extensions/gsd/doctor-types.ts +1 -3
  313. package/src/resources/extensions/gsd/error-classifier.ts +1 -1
  314. package/src/resources/extensions/gsd/forensics.ts +2 -2
  315. package/src/resources/extensions/gsd/git-service.ts +5 -13
  316. package/src/resources/extensions/gsd/gsd-db.ts +2 -12
  317. package/src/resources/extensions/gsd/guided-flow.ts +25 -25
  318. package/src/resources/extensions/gsd/memory-store.ts +28 -81
  319. package/src/resources/extensions/gsd/model-router.ts +9 -172
  320. package/src/resources/extensions/gsd/native-git-bridge.ts +1 -7
  321. package/src/resources/extensions/gsd/preferences-models.ts +15 -101
  322. package/src/resources/extensions/gsd/preferences-types.ts +0 -6
  323. package/src/resources/extensions/gsd/preferences-validation.ts +0 -35
  324. package/src/resources/extensions/gsd/preferences.ts +2 -16
  325. package/src/resources/extensions/gsd/prompt-loader.ts +12 -26
  326. package/src/resources/extensions/gsd/slice-parallel-orchestrator.ts +3 -9
  327. package/src/resources/extensions/gsd/state.ts +0 -42
  328. package/src/resources/extensions/gsd/templates/PREFERENCES.md +0 -1
  329. package/src/resources/extensions/gsd/tests/auto-loop.test.ts +1 -178
  330. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +0 -58
  331. package/src/resources/extensions/gsd/tests/auto-session-encapsulation.test.ts +5 -9
  332. package/src/resources/extensions/gsd/tests/auto-supervisor.test.mjs +4 -21
  333. package/src/resources/extensions/gsd/tests/bootstrap-derive-state-db-open.test.ts +1 -1
  334. package/src/resources/extensions/gsd/tests/budget-prediction.test.ts +211 -138
  335. package/src/resources/extensions/gsd/tests/complete-slice-verification-gate.test.ts +59 -142
  336. package/src/resources/extensions/gsd/tests/complete-slice.test.ts +4 -7
  337. package/src/resources/extensions/gsd/tests/completed-at-reconcile.test.ts +32 -89
  338. package/src/resources/extensions/gsd/tests/copy-planning-artifacts-samepath.test.ts +22 -0
  339. package/src/resources/extensions/gsd/tests/custom-engine-loop-integration.test.ts +23 -41
  340. package/src/resources/extensions/gsd/tests/db-path-worktree-symlink.test.ts +43 -3
  341. package/src/resources/extensions/gsd/tests/debug-logger.test.ts +3 -5
  342. package/src/resources/extensions/gsd/tests/discuss-empty-db-fallback.test.ts +87 -22
  343. package/src/resources/extensions/gsd/tests/discuss-queued-milestones.test.ts +118 -7
  344. package/src/resources/extensions/gsd/tests/discuss-slice-structured-questions.test.ts +47 -0
  345. package/src/resources/extensions/gsd/tests/discuss-tool-scope-leak.test.ts +60 -18
  346. package/src/resources/extensions/gsd/tests/double-merge-guard.test.ts +76 -14
  347. package/src/resources/extensions/gsd/tests/empty-content-abort-loop.test.ts +75 -0
  348. package/src/resources/extensions/gsd/tests/false-degraded-mode-warning.test.ts +83 -22
  349. package/src/resources/extensions/gsd/tests/finalize-timeout-guard.test.ts +63 -1
  350. package/src/resources/extensions/gsd/tests/forensics-stuck-loops.test.ts +1 -26
  351. package/src/resources/extensions/gsd/tests/gsd-db.test.ts +0 -30
  352. package/src/resources/extensions/gsd/tests/headless-answers.test.ts +4 -14
  353. package/src/resources/extensions/gsd/tests/health-widget.test.ts +12 -22
  354. package/src/resources/extensions/gsd/tests/init-prefs-routing.test.ts +1 -64
  355. package/src/resources/extensions/gsd/tests/integration/auto-worktree.test.ts +0 -22
  356. package/src/resources/extensions/gsd/tests/integration/token-savings.test.ts +23 -0
  357. package/src/resources/extensions/gsd/tests/memory-store.test.ts +0 -128
  358. package/src/resources/extensions/gsd/tests/memory-tools.test.ts +1 -33
  359. package/src/resources/extensions/gsd/tests/model-router.test.ts +8 -169
  360. package/src/resources/extensions/gsd/tests/orphaned-worktree-audit.test.ts +0 -8
  361. package/src/resources/extensions/gsd/tests/parallel-crash-recovery.test.ts +43 -32
  362. package/src/resources/extensions/gsd/tests/phases-merge-error-stops-auto.test.ts +10 -4
  363. package/src/resources/extensions/gsd/tests/preferences.test.ts +0 -127
  364. package/src/resources/extensions/gsd/tests/prompt-step-ordering.test.ts +0 -16
  365. package/src/resources/extensions/gsd/tests/provider-errors.test.ts +0 -7
  366. package/src/resources/extensions/gsd/tests/quick-turn-end-cleanup.test.ts +6 -6
  367. package/src/resources/extensions/gsd/tests/session-start-footer.test.ts +19 -168
  368. package/src/resources/extensions/gsd/tests/slice-parallel-orchestrator.test.ts +1 -7
  369. package/src/resources/extensions/gsd/tests/smart-entry-complete.test.ts +1 -23
  370. package/src/resources/extensions/gsd/tests/token-profile.test.ts +4 -51
  371. package/src/resources/extensions/gsd/tests/turn-epoch.test.ts +16 -7
  372. package/src/resources/extensions/gsd/tests/unstructured-continue-context-injection.test.ts +7 -5
  373. package/src/resources/extensions/gsd/tests/uok-gitops-turn-action.test.ts +1 -15
  374. package/src/resources/extensions/gsd/tests/visualizer-overlay.test.ts +6 -6
  375. package/src/resources/extensions/gsd/tests/write-gate-planning-unit.test.ts +0 -15
  376. package/src/resources/extensions/gsd/tools/memory-tools.ts +1 -17
  377. package/src/resources/extensions/gsd/unit-context-manifest.ts +8 -8
  378. package/src/resources/extensions/gsd/visualizer-overlay.ts +1 -1
  379. package/src/resources/extensions/gsd/watch/header-renderer.ts +1 -3
  380. package/src/resources/extensions/gsd/workflow-logger.ts +0 -1
  381. package/src/resources/extensions/gsd/worktree-command.ts +44 -31
  382. package/src/resources/extensions/mcp-client/index.ts +3 -6
  383. package/src/resources/extensions/slash-commands/create-extension.ts +24 -38
  384. package/src/resources/skills/create-gsd-extension/SKILL.md +5 -9
  385. package/src/resources/skills/create-gsd-extension/references/custom-commands.md +1 -1
  386. package/src/resources/skills/create-gsd-extension/references/custom-rendering.md +5 -5
  387. package/src/resources/skills/create-gsd-extension/references/custom-tools.md +4 -4
  388. package/src/resources/skills/create-gsd-extension/references/custom-ui.md +6 -6
  389. package/src/resources/skills/create-gsd-extension/references/events-reference.md +3 -3
  390. package/src/resources/skills/create-gsd-extension/references/packaging-distribution.md +1 -1
  391. package/src/resources/skills/create-gsd-extension/references/remote-execution-overrides.md +3 -3
  392. package/src/resources/skills/create-gsd-extension/templates/extension-skeleton.ts +2 -2
  393. package/src/resources/skills/create-gsd-extension/templates/stateful-tool-skeleton.ts +3 -3
  394. package/src/resources/skills/create-gsd-extension/workflows/create-extension.md +12 -32
  395. package/dist/cli-policy.d.ts +0 -13
  396. package/dist/cli-policy.js +0 -17
  397. package/dist/resources/.managed-resources-content-hash +0 -1
  398. package/dist/resources/extensions/gsd/auto-runtime-state.js +0 -31
  399. package/dist/resources/extensions/gsd/milestone-id-reservation.js +0 -36
  400. package/dist/resources/extensions/gsd/worktree-session-state.js +0 -33
  401. package/dist/runtime-checks.d.ts +0 -27
  402. package/dist/runtime-checks.js +0 -38
  403. package/dist/web/standalone/.next/static/chunks/2556.0527fea66e123b7f.js +0 -1
  404. package/dist/web/standalone/.next/static/chunks/2824.08296bc2f9654698.js +0 -1
  405. package/dist/web/standalone/.next/static/chunks/3026.3af53b279375f082.js +0 -1
  406. package/dist/web/standalone/.next/static/chunks/315.6f68ae79b67d25cf.js +0 -1
  407. package/dist/web/standalone/.next/static/chunks/3497.4bfc60a3b3dea717.js +0 -1
  408. package/dist/web/standalone/.next/static/chunks/5516.4a07c872b5c3a663.js +0 -1
  409. package/dist/web/standalone/.next/static/chunks/8336.31b019697882acfb.js +0 -10
  410. package/dist/web/standalone/.next/static/chunks/8845.c9702695e8c5a9c5.js +0 -2
  411. package/dist/web/standalone/.next/static/chunks/9058.01ef3a463bda88f1.js +0 -20
  412. package/dist/web/standalone/.next/static/chunks/9441.1081da1125d1764f.js +0 -1
  413. package/dist/web/standalone/.next/static/chunks/app/page-9bf2e0c50fb2ca05.js +0 -1
  414. package/dist/web/standalone/.next/static/chunks/main-app-fdab67f7802d7832.js +0 -1
  415. package/dist/web/standalone/.next/static/chunks/next/dist/client/components/builtin/global-error-459824ffb8c323dd.js +0 -1
  416. package/dist/web/standalone/.next/static/chunks/webpack-f9f0dc45e4f3ac10.js +0 -1
  417. package/dist/worktree-status-banner.d.ts +0 -1
  418. package/dist/worktree-status-banner.js +0 -132
  419. package/packages/mcp-server/dist/alias-telemetry.d.ts +0 -8
  420. package/packages/mcp-server/dist/alias-telemetry.d.ts.map +0 -1
  421. package/packages/mcp-server/dist/alias-telemetry.js +0 -30
  422. package/packages/mcp-server/dist/alias-telemetry.js.map +0 -1
  423. package/packages/mcp-server/src/alias-telemetry.test.ts +0 -78
  424. package/packages/mcp-server/src/alias-telemetry.ts +0 -30
  425. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts +0 -2
  426. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.d.ts.map +0 -1
  427. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js +0 -231
  428. package/packages/pi-ai/dist/providers/anthropic-shared.cache-breakpoint.test.js.map +0 -1
  429. package/packages/pi-ai/src/providers/anthropic-shared.cache-breakpoint.test.ts +0 -289
  430. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts +0 -37
  431. package/packages/pi-coding-agent/dist/core/token-telemetry.d.ts.map +0 -1
  432. package/packages/pi-coding-agent/dist/core/token-telemetry.js +0 -49
  433. package/packages/pi-coding-agent/dist/core/token-telemetry.js.map +0 -1
  434. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts +0 -2
  435. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.d.ts.map +0 -1
  436. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js +0 -133
  437. package/packages/pi-coding-agent/dist/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.js.map +0 -1
  438. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts +0 -2
  439. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.d.ts.map +0 -1
  440. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js +0 -78
  441. package/packages/pi-coding-agent/dist/tests/system-prompt-cache-stability.test.js.map +0 -1
  442. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts +0 -2
  443. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.d.ts.map +0 -1
  444. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js +0 -181
  445. package/packages/pi-coding-agent/dist/tests/token-telemetry.test.js.map +0 -1
  446. package/packages/pi-coding-agent/src/core/token-telemetry.ts +0 -77
  447. package/packages/pi-coding-agent/src/modes/interactive/components/tool-card-cleanup-and-success-runtime.test.ts +0 -212
  448. package/packages/pi-coding-agent/src/tests/system-prompt-cache-stability.test.ts +0 -102
  449. package/packages/pi-coding-agent/src/tests/token-telemetry.test.ts +0 -200
  450. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts +0 -2
  451. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.d.ts.map +0 -1
  452. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js +0 -161
  453. package/packages/pi-tui/dist/components/__tests__/leak-fixes-runtime.test.js.map +0 -1
  454. package/packages/pi-tui/src/components/__tests__/leak-fixes-runtime.test.ts +0 -219
  455. package/src/resources/extensions/gsd/auto-runtime-state.ts +0 -51
  456. package/src/resources/extensions/gsd/milestone-id-reservation.ts +0 -47
  457. package/src/resources/extensions/gsd/tests/deferred-milestone-dir-4996.test.ts +0 -116
  458. package/src/resources/extensions/gsd/tests/doctor-orphan-milestone-4996.test.ts +0 -100
  459. package/src/resources/extensions/gsd/tests/ensure-preconditions-guard-4996.test.ts +0 -93
  460. package/src/resources/extensions/gsd/tests/find-missing-summaries-closed-runtime.test.ts +0 -47
  461. package/src/resources/extensions/gsd/tests/gitignore-bg-shell-runtime.test.ts +0 -63
  462. package/src/resources/extensions/gsd/tests/gsd-no-project-error-runtime.test.ts +0 -81
  463. package/src/resources/extensions/gsd/tests/help-menu-coverage.test.ts +0 -57
  464. package/src/resources/extensions/gsd/tests/import-done-milestones-runtime.test.ts +0 -145
  465. package/src/resources/extensions/gsd/tests/merge-self-branch-guard.test.ts +0 -124
  466. package/src/resources/extensions/gsd/tests/milestone-id-gap-reuse-4996.test.ts +0 -152
  467. package/src/resources/extensions/gsd/tests/native-git-infra-errors.test.ts +0 -50
  468. package/src/resources/extensions/gsd/tests/register-hooks-compaction-checkpoint.test.ts +0 -93
  469. package/src/resources/extensions/gsd/tests/system-context-message-routing.test.ts +0 -101
  470. package/src/resources/extensions/gsd/worktree-session-state.ts +0 -35
  471. package/src/resources/extensions/mcp-client/tests/global-config.test.ts +0 -91
  472. package/src/resources/skills/create-gsd-extension/templates/templates.test.ts +0 -58
  473. /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_buildManifest.js +0 -0
  474. /package/dist/web/standalone/.next/static/{UF5VF4F1tB0miEtJS7LyX → 7afp7gq8-DVbxum83zRQ-}/_ssgManifest.js +0 -0
@@ -0,0 +1,53 @@
1
+ import test from 'node:test';
2
+ import assert from 'node:assert/strict';
3
+ import { mkdtempSync, readFileSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { writeUnitRuntimeRecord, readUnitRuntimeRecord } from '../unit-runtime.ts';
7
+ import { resolveAutoSupervisorConfig } from '../preferences.ts';
8
+
9
+ test('resolveAutoSupervisorConfig provides safe timeout defaults', () => {
10
+ const supervisor = resolveAutoSupervisorConfig();
11
+ assert.equal(supervisor.soft_timeout_minutes, 20);
12
+ assert.equal(supervisor.idle_timeout_minutes, 10);
13
+ assert.equal(supervisor.hard_timeout_minutes, 30);
14
+ });
15
+
16
+ test('writeUnitRuntimeRecord persists progress and recovery metadata defaults', () => {
17
+ const base = mkdtempSync(join(tmpdir(), 'gsd-auto-supervisor-'));
18
+ const startedAt = 1234567890;
19
+
20
+ writeUnitRuntimeRecord(base, 'plan-milestone', 'M010', startedAt, {
21
+ phase: 'dispatched',
22
+ lastProgressAt: startedAt,
23
+ progressCount: 1,
24
+ lastProgressKind: 'dispatch',
25
+ });
26
+
27
+ const runtime = readUnitRuntimeRecord(base, 'plan-milestone', 'M010');
28
+ assert.ok(runtime);
29
+ assert.equal(runtime.phase, 'dispatched');
30
+ assert.equal(runtime.lastProgressAt, startedAt);
31
+ assert.equal(runtime.progressCount, 1);
32
+ assert.equal(runtime.lastProgressKind, 'dispatch');
33
+ assert.equal(runtime.recoveryAttempts, 0);
34
+ });
35
+
36
+ test('writeUnitRuntimeRecord keeps explicit recovery attempt fields', () => {
37
+ const base = mkdtempSync(join(tmpdir(), 'gsd-auto-supervisor-'));
38
+ const startedAt = 2234567890;
39
+
40
+ writeUnitRuntimeRecord(base, 'research-milestone', 'M011', startedAt, {
41
+ phase: 'timeout',
42
+ recoveryAttempts: 2,
43
+ lastRecoveryReason: 'idle',
44
+ lastProgressAt: startedAt + 50,
45
+ progressCount: 3,
46
+ lastProgressKind: 'recovery-retry',
47
+ });
48
+
49
+ const runtime = JSON.parse(readFileSync(join(base, '.gsd/runtime/units/research-milestone-M011.json'), 'utf8'));
50
+ assert.equal(runtime.recoveryAttempts, 2);
51
+ assert.equal(runtime.lastRecoveryReason, 'idle');
52
+ assert.equal(runtime.lastProgressKind, 'recovery-retry');
53
+ });
@@ -0,0 +1,112 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { fileURLToPath } from 'node:url';
4
+
5
+ const require = createRequire(import.meta.url);
6
+
7
+ const ROOT = new URL("../../../../../", import.meta.url);
8
+
9
+ export function resolve(specifier, context, nextResolve) {
10
+ // 1. Redirect all workspace package bare imports to source.
11
+ // CI portability runs don't build any packages/ dist artifacts, so every
12
+ // @gsd/* specifier (including transitive ones pulled in by pi-coding-agent
13
+ // source itself) must resolve to the TypeScript source entrypoint.
14
+ if (specifier === "../../packages/pi-coding-agent/src/index.js") {
15
+ specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
16
+ } else if (specifier === "@gsd/pi-coding-agent") {
17
+ specifier = new URL("packages/pi-coding-agent/src/index.ts", ROOT).href;
18
+ } else if (specifier === "@gsd/pi-ai/oauth") {
19
+ specifier = new URL("packages/pi-ai/src/utils/oauth/index.ts", ROOT).href;
20
+ } else if (specifier === "@gsd/pi-ai") {
21
+ specifier = new URL("packages/pi-ai/src/index.ts", ROOT).href;
22
+ } else if (specifier === "@gsd/pi-agent-core") {
23
+ specifier = new URL("packages/pi-agent-core/src/index.ts", ROOT).href;
24
+ } else if (specifier === "@gsd/pi-tui") {
25
+ specifier = new URL("packages/pi-tui/src/index.ts", ROOT).href;
26
+ } else if (specifier === "@gsd/native") {
27
+ specifier = new URL("packages/native/src/index.ts", ROOT).href;
28
+ } else if (specifier.startsWith("@gsd/native/")) {
29
+ // Sub-path imports like @gsd/native/fd, @gsd/native/text, etc.
30
+ const subpath = specifier.slice("@gsd/native/".length);
31
+ specifier = new URL(`packages/native/src/${subpath}/index.ts`, ROOT).href;
32
+ }
33
+ // 2. Redirect packages/*/dist/ → packages/*/src/ with .js→.ts for strip-types
34
+ // Also handles local imports — skip rewrite for dist/ paths that are real compiled artifacts.
35
+
36
+ else if (specifier.endsWith('.js') && (specifier.startsWith('./') || specifier.startsWith('../'))) {
37
+ if (context.parentURL && context.parentURL.includes('/src/')) {
38
+ if (specifier.includes('/dist/')) {
39
+ specifier = specifier.replace('/dist/', '/src/').replace(/\.js$/, '.ts');
40
+ } else {
41
+ specifier = specifier.replace(/\.js$/, '.ts');
42
+ }
43
+ }
44
+ }
45
+ // 3. Extensionless relative imports from web/ (Next.js convention).
46
+ // Transpiled .tsx files emit extensionless imports — try .ts then .tsx.
47
+ else if (
48
+ (specifier.startsWith('./') || specifier.startsWith('../')) &&
49
+ !specifier.match(/\.\w+$/) &&
50
+ context.parentURL &&
51
+ context.parentURL.includes('/web/')
52
+ ) {
53
+ const baseUrl = new URL(specifier, context.parentURL);
54
+ for (const ext of ['.ts', '.tsx']) {
55
+ const candidate = fileURLToPath(baseUrl) + ext;
56
+ if (existsSync(candidate)) {
57
+ specifier = baseUrl.href + ext;
58
+ break;
59
+ }
60
+
61
+ }
62
+ }
63
+
64
+ return nextResolve(specifier, context);
65
+ }
66
+
67
+ export function load(url, context, nextLoad) {
68
+ // Node's --experimental-strip-types handles plain .ts but not .tsx and not
69
+ // all TypeScript syntax used by workspace packages (parameter properties,
70
+ // decorators, etc.). Transpile all workspace package source files and .tsx
71
+ // files through TypeScript's transpileModule to avoid those crashes.
72
+ const shouldTranspileWithTypeScript =
73
+ url.endsWith('.tsx') ||
74
+ (url.endsWith('.ts') && url.includes('/packages/') && url.includes('/src/'));
75
+
76
+ if (shouldTranspileWithTypeScript) {
77
+ const ts = require('typescript');
78
+ const source = readFileSync(fileURLToPath(url), 'utf-8');
79
+ const { outputText } = ts.transpileModule(source, {
80
+ fileName: fileURLToPath(url),
81
+ compilerOptions: {
82
+ jsx: ts.JsxEmit.ReactJSX,
83
+ module: ts.ModuleKind.ESNext,
84
+ target: ts.ScriptTarget.ESNext,
85
+ esModuleInterop: true,
86
+ experimentalDecorators: true,
87
+ emitDecoratorMetadata: true,
88
+ },
89
+ });
90
+ // Inject CJS-compatible globals (__dirname, __filename, require) so that
91
+ // workspace packages compiled as ESM can still use them. This avoids the
92
+ // need for import.meta.url behind indirect invocation patterns that fail in
93
+ // CJS and in dynamically-created scopes.
94
+ // Only inject globals that the source file doesn't already declare itself.
95
+ const preambleLines = [
96
+ 'import { fileURLToPath as __preamble_fUTP } from "node:url";',
97
+ 'import { dirname as __preamble_dn } from "node:path";',
98
+ 'import { createRequire as __preamble_cR } from "node:module";',
99
+ ];
100
+ if (!outputText.includes('const __filename') && !outputText.includes('let __filename')) {
101
+ preambleLines.push('const __filename = __preamble_fUTP(import.meta.url);');
102
+ }
103
+ if (!outputText.includes('const __dirname') && !outputText.includes('let __dirname')) {
104
+ preambleLines.push('const __dirname = __preamble_dn(__preamble_fUTP(import.meta.url));');
105
+ }
106
+ if (!outputText.includes('const require') && !outputText.includes('let require')) {
107
+ preambleLines.push('const require = __preamble_cR(import.meta.url);');
108
+ }
109
+ return { format: 'module', source: preambleLines.join('\n') + '\n' + outputText, shortCircuit: true };
110
+ }
111
+ return nextLoad(url, context);
112
+ }
@@ -0,0 +1,23 @@
1
+ import { fileURLToPath } from 'node:url';
2
+
3
+ const ROOT = new URL("../../../../../", import.meta.url);
4
+ const PACKAGES_ROOT = fileURLToPath(new URL("packages/", ROOT));
5
+
6
+ export function resolve(specifier, context, nextResolve) {
7
+ let tsSpecifier = specifier;
8
+ if (specifier.includes('@gsd/')) {
9
+ tsSpecifier = specifier.replace('@gsd/', PACKAGES_ROOT).replace('/dist/', '/src/');
10
+ if (tsSpecifier.includes('/packages/pi-ai') && !tsSpecifier.endsWith('.ts')) {
11
+ tsSpecifier = tsSpecifier.replace(/\/packages\/pi-ai$/, '/packages/pi-ai/src/index.ts');
12
+ } else if (!tsSpecifier.includes('/src/') && !tsSpecifier.endsWith('.ts')) {
13
+ // Fallback for other gsd packages like pi-coding-agent, pi-tui, pi-agent-core
14
+ tsSpecifier = tsSpecifier.replace(/\/packages\/([^\/]+)$/, '/packages/$1/src/index.ts');
15
+ } else if (!tsSpecifier.endsWith('.ts') && !tsSpecifier.endsWith('.js') && !tsSpecifier.endsWith('.mjs')) {
16
+ tsSpecifier += '/index.ts';
17
+ }
18
+ } else if (specifier.endsWith('.js')) {
19
+ tsSpecifier = specifier.replace(/\.js$/, '.ts');
20
+ }
21
+
22
+ return nextResolve(tsSpecifier, context);
23
+ }
@@ -0,0 +1,5 @@
1
+ import { register } from 'node:module';
2
+ import { pathToFileURL } from 'node:url';
3
+
4
+ // Register hook to redirect imports to the dist directory
5
+ register(new URL('./dist-redirect.mjs', import.meta.url), pathToFileURL('./'));
@@ -59,25 +59,8 @@ export function executeMemoryCapture(params) {
59
59
  const scope = normalizeScope(params.scope);
60
60
  const tags = normalizeTags(params.tags);
61
61
  const structuredFields = normalizeStructuredFields(params.structuredFields);
62
- let id;
63
- try {
64
- id = createMemory({ category, content, confidence, scope, tags, structuredFields });
65
- }
66
- catch (err) {
67
- // Surface the underlying SQL message (e.g. "database disk image is
68
- // malformed", "no such table: memories") so the operator gets the
69
- // actionable signal instead of an opaque "create_failed". See #4967.
70
- const message = err instanceof Error ? err.message : String(err);
71
- return {
72
- content: [{ type: "text", text: `Error: failed to create memory: ${message}` }],
73
- details: { operation: "memory_capture", error: message },
74
- isError: true,
75
- };
76
- }
62
+ const id = createMemory({ category, content, confidence, scope, tags, structuredFields });
77
63
  if (!id) {
78
- // DB unavailable or adapter missing — distinct from the SQL-error path
79
- // above. Keep the legacy create_failed token here so any consumers that
80
- // explicitly key on the unavailable case continue to work.
81
64
  return {
82
65
  content: [{ type: "text", text: "Error: failed to create memory." }],
83
66
  details: { operation: "memory_capture", error: "create_failed" },
@@ -6,7 +6,7 @@ import { join } from "node:path";
6
6
  import { writeExportFile } from "./export.js";
7
7
  import { gsdRoot } from "./paths.js";
8
8
  import { stripAnsi } from "../shared/mod.js";
9
- export const TAB_COUNT = 10;
9
+ const TAB_COUNT = 10;
10
10
  const TAB_LABELS = [
11
11
  "1 Progress",
12
12
  "2 Timeline",
@@ -96,15 +96,13 @@ export function readGitBranch(projectRoot) {
96
96
  }
97
97
  }
98
98
  /**
99
- * Read MCP server names from .mcp.json, .gsd/mcp.json, and the global
100
- * ~/.gsd/mcp.json (or $GSD_HOME/mcp.json).
99
+ * Read MCP server names from .mcp.json or .gsd/mcp.json.
101
100
  * Returns array of server name strings.
102
101
  */
103
102
  export function readMcpServerNames(projectRoot) {
104
103
  const configPaths = [
105
104
  join(projectRoot, ".mcp.json"),
106
105
  join(projectRoot, ".gsd", "mcp.json"),
107
- join(process.env.GSD_HOME || join(homedir(), ".gsd"), "mcp.json"),
108
106
  ];
109
107
  const names = [];
110
108
  const seen = new Set();
@@ -18,13 +18,28 @@ import { createWorktree, listWorktrees, removeWorktree, mergeWorktreeToMain, dif
18
18
  import { inferCommitType } from "./git-service.js";
19
19
  import { existsSync, realpathSync, readdirSync, rmSync, unlinkSync } from "node:fs";
20
20
  import { nativeMergeAbort } from "./native-git-bridge.js";
21
- import { join } from "node:path";
22
- import { clearWorktreeOriginalCwd, ensureWorktreeOriginalCwdFromPath, getActiveWorktreeName, getWorktreeOriginalCwd, setWorktreeOriginalCwd, } from "./worktree-session-state.js";
23
- export { getActiveWorktreeName, getWorktreeOriginalCwd } from "./worktree-session-state.js";
21
+ import { join, sep } from "node:path";
24
22
  /**
25
23
  * Tracks the original project root so we can switch back.
26
24
  * Set when we first chdir into a worktree, cleared on return.
27
25
  */
26
+ let originalCwd = null;
27
+ /** Get the original project root if currently in a worktree, or null. */
28
+ export function getWorktreeOriginalCwd() {
29
+ return originalCwd;
30
+ }
31
+ /** Get the name of the active worktree, or null if not in one. */
32
+ export function getActiveWorktreeName() {
33
+ if (!originalCwd)
34
+ return null;
35
+ const cwd = process.cwd();
36
+ const wtDir = join(originalCwd, ".gsd", "worktrees");
37
+ if (!cwd.startsWith(wtDir))
38
+ return null;
39
+ const rel = cwd.slice(wtDir.length + 1);
40
+ const name = rel.split("/")[0] ?? rel.split("\\")[0];
41
+ return name || null;
42
+ }
28
43
  // ─── Shared completions and handler (used by both /worktree and /wt) ────────
29
44
  function worktreeCompletions(prefix) {
30
45
  const parts = prefix.trim().split(/\s+/);
@@ -96,7 +111,7 @@ async function worktreeHandler(args, ctx, pi, alias) {
96
111
  return;
97
112
  }
98
113
  // create and switch both do the same thing: switch if exists, create if not
99
- const mainBase = getWorktreeOriginalCwd() ?? basePath;
114
+ const mainBase = originalCwd ?? basePath;
100
115
  const existing = listWorktrees(mainBase);
101
116
  if (existing.some(wt => wt.name === name)) {
102
117
  await handleSwitch(basePath, name, ctx);
@@ -108,7 +123,7 @@ async function worktreeHandler(args, ctx, pi, alias) {
108
123
  }
109
124
  if (trimmed === "merge" || trimmed.startsWith("merge ")) {
110
125
  const mergeArgs = trimmed.replace(/^merge\s*/, "").trim().split(/\s+/).filter(Boolean);
111
- const mainBase = getWorktreeOriginalCwd() ?? basePath;
126
+ const mainBase = originalCwd ?? basePath;
112
127
  const activeWt = getActiveWorktreeName();
113
128
  if (mergeArgs.length === 0) {
114
129
  // Bare "/worktree merge" — only valid when inside a worktree
@@ -139,7 +154,7 @@ async function worktreeHandler(args, ctx, pi, alias) {
139
154
  }
140
155
  if (trimmed === "remove" || trimmed.startsWith("remove ")) {
141
156
  const name = trimmed.replace(/^remove\s*/, "").trim();
142
- const mainBase = getWorktreeOriginalCwd() ?? basePath;
157
+ const mainBase = originalCwd ?? basePath;
143
158
  if (name === "all") {
144
159
  await handleRemoveAll(mainBase, ctx);
145
160
  return;
@@ -156,7 +171,7 @@ async function worktreeHandler(args, ctx, pi, alias) {
156
171
  ctx.ui.notify(`Usage: /${alias} ${trimmed}${trimmed === "list" || trimmed === "return" ? "" : " <name>"}`, "warning");
157
172
  return;
158
173
  }
159
- const mainBase = getWorktreeOriginalCwd() ?? basePath;
174
+ const mainBase = originalCwd ?? basePath;
160
175
  const nameOnly = trimmed.split(/\s+/)[0];
161
176
  if (trimmed !== nameOnly) {
162
177
  ctx.ui.notify(`Unknown command. Did you mean /${alias} switch ${nameOnly}?`, "warning");
@@ -177,7 +192,14 @@ export function registerWorktreeCommand(pi) {
177
192
  // Restore worktree state after /reload.
178
193
  // The module-level originalCwd resets to null when extensions are re-loaded,
179
194
  // but process.cwd() is still inside the worktree. Detect this and recover.
180
- ensureWorktreeOriginalCwdFromPath();
195
+ if (!originalCwd) {
196
+ const cwd = process.cwd();
197
+ const marker = `${sep}.gsd${sep}worktrees${sep}`;
198
+ const markerIdx = cwd.indexOf(marker);
199
+ if (markerIdx !== -1) {
200
+ originalCwd = cwd.slice(0, markerIdx);
201
+ }
202
+ }
181
203
  pi.registerCommand("worktree", {
182
204
  description: "Git worktrees (also /wt): /worktree <name> | list | merge | remove",
183
205
  getArgumentCompletions: worktreeCompletions,
@@ -238,7 +260,7 @@ async function handleCreate(basePath, name, ctx) {
238
260
  // before createWorktree so the new worktree forks from committed HEAD)
239
261
  const commitMsg = autoCommitCurrentBranch(basePath, "worktree-switch", name);
240
262
  // Create from the main tree, not from inside another worktree
241
- const mainBase = getWorktreeOriginalCwd() ?? basePath;
263
+ const mainBase = originalCwd ?? basePath;
242
264
  const info = createWorktree(mainBase, name);
243
265
  // Run user-configured post-create hook (#597) — e.g. copy .env, symlink assets
244
266
  const hookError = runWorktreePostCreateHook(mainBase, info.path);
@@ -246,8 +268,8 @@ async function handleCreate(basePath, name, ctx) {
246
268
  ctx.ui.notify(hookError, "warning");
247
269
  }
248
270
  // Track original cwd before switching
249
- if (!getWorktreeOriginalCwd())
250
- setWorktreeOriginalCwd(basePath);
271
+ if (!originalCwd)
272
+ originalCwd = basePath;
251
273
  const prevCwd = process.cwd();
252
274
  process.chdir(info.path);
253
275
  nudgeGitBranchCache(prevCwd);
@@ -297,7 +319,7 @@ async function handleCreate(basePath, name, ctx) {
297
319
  }
298
320
  async function handleSwitch(basePath, name, ctx) {
299
321
  try {
300
- const mainBase = getWorktreeOriginalCwd() ?? basePath;
322
+ const mainBase = originalCwd ?? basePath;
301
323
  const wtPath = worktreePath(mainBase, name);
302
324
  if (!existsSync(wtPath)) {
303
325
  ctx.ui.notify(`Worktree "${name}" not found. Run /worktree list to see available worktrees.`, "warning");
@@ -306,8 +328,8 @@ async function handleSwitch(basePath, name, ctx) {
306
328
  // Auto-commit dirty files before leaving current workspace
307
329
  const commitMsg = autoCommitCurrentBranch(basePath, "worktree-switch", name);
308
330
  // Track original cwd before switching
309
- if (!getWorktreeOriginalCwd())
310
- setWorktreeOriginalCwd(basePath);
331
+ if (!originalCwd)
332
+ originalCwd = basePath;
311
333
  const prevCwd = process.cwd();
312
334
  process.chdir(wtPath);
313
335
  nudgeGitBranchCache(prevCwd);
@@ -330,7 +352,6 @@ async function handleSwitch(basePath, name, ctx) {
330
352
  }
331
353
  }
332
354
  async function handleReturn(ctx) {
333
- const originalCwd = getWorktreeOriginalCwd();
334
355
  if (!originalCwd) {
335
356
  ctx.ui.notify("Already in the main project tree.", "info");
336
357
  return;
@@ -338,7 +359,7 @@ async function handleReturn(ctx) {
338
359
  // Auto-commit dirty files before leaving worktree
339
360
  const commitMsg = autoCommitCurrentBranch(process.cwd(), "worktree-return", "worktree");
340
361
  const returnTo = originalCwd;
341
- clearWorktreeOriginalCwd();
362
+ originalCwd = null;
342
363
  const prevCwd = process.cwd();
343
364
  process.chdir(returnTo);
344
365
  nudgeGitBranchCache(prevCwd);
@@ -388,7 +409,7 @@ const CLR = {
388
409
  };
389
410
  async function handleList(basePath, ctx) {
390
411
  try {
391
- const mainBase = getWorktreeOriginalCwd() ?? basePath;
412
+ const mainBase = originalCwd ?? basePath;
392
413
  const worktrees = listWorktrees(mainBase);
393
414
  if (worktrees.length === 0) {
394
415
  ctx.ui.notify("No GSD worktrees found. Create one with /worktree <name>.", "info");
@@ -431,7 +452,6 @@ async function handleList(basePath, ctx) {
431
452
  }
432
453
  lines.push("");
433
454
  }
434
- const originalCwd = getWorktreeOriginalCwd();
435
455
  if (originalCwd) {
436
456
  lines.push(` ${CLR.label("main tree")} ${CLR.path(originalCwd)}`);
437
457
  }
@@ -519,11 +539,11 @@ async function handleMerge(basePath, name, ctx, pi, targetBranch) {
519
539
  }
520
540
  // Switch to the main tree before merging.
521
541
  // Must be on the main branch to run git merge --squash.
522
- if (getWorktreeOriginalCwd()) {
542
+ if (originalCwd) {
523
543
  const prevCwd = process.cwd();
524
544
  process.chdir(basePath);
525
545
  nudgeGitBranchCache(prevCwd);
526
- clearWorktreeOriginalCwd();
546
+ originalCwd = null;
527
547
  }
528
548
  // --- Deterministic merge path (preferred) ---
529
549
  // Try a direct squash-merge first. Only fall back to LLM on conflict.
@@ -600,7 +620,7 @@ async function handleMerge(basePath, name, ctx, pi, targetBranch) {
600
620
  }
601
621
  async function handleRemove(basePath, name, ctx) {
602
622
  try {
603
- const mainBase = getWorktreeOriginalCwd() ?? basePath;
623
+ const mainBase = originalCwd ?? basePath;
604
624
  // Validate the worktree exists before attempting removal
605
625
  const worktrees = listWorktrees(mainBase);
606
626
  const wt = worktrees.find(w => w.name === name);
@@ -621,9 +641,9 @@ async function handleRemove(basePath, name, ctx) {
621
641
  const prevCwd = process.cwd();
622
642
  removeWorktree(mainBase, name, { deleteBranch: true });
623
643
  // If we were in that worktree, removeWorktree chdir'd us out — clear tracking
624
- if (getWorktreeOriginalCwd() && process.cwd() !== prevCwd) {
644
+ if (originalCwd && process.cwd() !== prevCwd) {
625
645
  nudgeGitBranchCache(prevCwd);
626
- clearWorktreeOriginalCwd();
646
+ originalCwd = null;
627
647
  }
628
648
  ctx.ui.notify(`${CLR.ok("✓")} Worktree ${CLR.name(name)} removed ${CLR.muted("(branch deleted)")}.`, "info");
629
649
  }
@@ -634,7 +654,7 @@ async function handleRemove(basePath, name, ctx) {
634
654
  }
635
655
  async function handleRemoveAll(basePath, ctx) {
636
656
  try {
637
- const mainBase = getWorktreeOriginalCwd() ?? basePath;
657
+ const mainBase = originalCwd ?? basePath;
638
658
  const worktrees = listWorktrees(mainBase);
639
659
  if (worktrees.length === 0) {
640
660
  ctx.ui.notify("No worktrees to remove.", "info");
@@ -664,9 +684,9 @@ async function handleRemoveAll(basePath, ctx) {
664
684
  }
665
685
  }
666
686
  // If we were in a worktree that got removed, clear tracking
667
- if (getWorktreeOriginalCwd() && process.cwd() !== prevCwd) {
687
+ if (originalCwd && process.cwd() !== prevCwd) {
668
688
  nudgeGitBranchCache(prevCwd);
669
- clearWorktreeOriginalCwd();
689
+ originalCwd = null;
670
690
  }
671
691
  const lines = [];
672
692
  if (removed.length > 0)
@@ -2,8 +2,7 @@
2
2
  * MCP Client Extension — Native MCP server integration for pi
3
3
  *
4
4
  * Provides on-demand access to MCP servers configured in project files
5
- * (.mcp.json, .gsd/mcp.json) and the global ~/.gsd/mcp.json (or
6
- * $GSD_HOME/mcp.json) using the @modelcontextprotocol/sdk Client
5
+ * (.mcp.json, .gsd/mcp.json) using the @modelcontextprotocol/sdk Client
7
6
  * directly — no external CLI dependency required.
8
7
  *
9
8
  * Three tools:
@@ -18,7 +17,6 @@ import { Client } from "@modelcontextprotocol/sdk/client";
18
17
  import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
19
18
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
20
19
  import { readFileSync, existsSync } from "node:fs";
21
- import { homedir } from "node:os";
22
20
  import { join } from "node:path";
23
21
  import { buildHttpTransportOpts } from "./auth.js";
24
22
  // ─── Connection Manager ───────────────────────────────────────────────────────
@@ -63,7 +61,6 @@ function readConfigs() {
63
61
  const configPaths = [
64
62
  join(process.cwd(), ".mcp.json"),
65
63
  join(process.cwd(), ".gsd", "mcp.json"),
66
- join(process.env.GSD_HOME || join(homedir(), ".gsd"), "mcp.json"),
67
64
  ];
68
65
  for (const configPath of configPaths) {
69
66
  try {
@@ -261,7 +258,7 @@ async function closeAll() {
261
258
  // ─── Formatters ───────────────────────────────────────────────────────────────
262
259
  function formatServerList(servers) {
263
260
  if (servers.length === 0)
264
- return "No MCP servers configured. Add servers to .mcp.json, .gsd/mcp.json, or $GSD_HOME/mcp.json (default: ~/.gsd/mcp.json).";
261
+ return "No MCP servers configured. Add servers to .mcp.json or .gsd/mcp.json.";
265
262
  const lines = [`${servers.length} MCP servers configured:\n`];
266
263
  for (const s of servers) {
267
264
  const connected = connections.has(s.name) ? "✓" : "○";
@@ -309,7 +306,7 @@ export default function (pi) {
309
306
  pi.registerTool({
310
307
  name: "mcp_servers",
311
308
  label: "MCP Servers",
312
- description: "List all available MCP servers configured in project files (.mcp.json, .gsd/mcp.json) or globally ($GSD_HOME/mcp.json, default: ~/.gsd/mcp.json). " +
309
+ description: "List all available MCP servers configured in project files (.mcp.json, .gsd/mcp.json). " +
313
310
  "Shows server names, transport type, and connection status. Use mcp_discover to get full tool schemas for a server.",
314
311
  promptSnippet: "List available MCP servers from project configuration",
315
312
  promptGuidelines: [
@@ -193,35 +193,38 @@ function sendPrompt(description, result, pi) {
193
193
  ? (Array.isArray(persistenceAnswer.selected) ? persistenceAnswer.selected[0] : persistenceAnswer.selected)
194
194
  : "";
195
195
  const docHints = [
196
- "- `docs/extension-sdk/README.md` — overview, quick start, directory layout",
197
- "- `docs/extension-sdk/api-reference.md` — ExtensionAPI and ExtensionContext surfaces",
198
- "- `docs/extension-sdk/building-extensions.md` — tools, commands, events, UI, state",
199
- "- `docs/extension-sdk/rules.md` — non-negotiable rules and gotchas",
196
+ "- `~/.gsd/agent/docs/extending-pi/01-what-are-extensions.md` — capabilities overview",
197
+ "- `~/.gsd/agent/docs/extending-pi/03-getting-started.md` — minimal extension, hot reload",
198
+ "- `~/.gsd/agent/docs/extending-pi/08-extensioncontext-what-you-can-access.md` — ExtensionContext API",
199
+ "- `~/.gsd/agent/docs/extending-pi/09-extensionapi-what-you-can-do.md` — ExtensionAPI: registration, messaging",
200
+ "- `~/.gsd/agent/docs/extending-pi/22-key-rules-gotchas.md` — must-read rules before shipping",
200
201
  ];
201
202
  if (uiSelected.includes("custom component")) {
202
- docHints.push("- `docs/extension-sdk/building-extensions.md#custom-components` — ctx.ui.custom() API");
203
- docHints.push("- `docs/dev/pi-ui-tui/06-ctx-ui-custom-full-custom-components.md` — step-by-step component guide");
204
- docHints.push("- `docs/dev/pi-ui-tui/07-built-in-components-the-building-blocks.md` — Text, Box, SelectList");
205
- docHints.push("- `docs/dev/pi-ui-tui/09-keyboard-input-how-to-handle-keys.md` — Key, matchesKey");
206
- docHints.push("- `docs/dev/pi-ui-tui/10-line-width-the-cardinal-rule.md` — truncation, width rules");
203
+ docHints.push("- `~/.gsd/agent/docs/extending-pi/12-custom-ui-visual-components.md` — dialogs, widgets, overlays");
204
+ docHints.push("- `~/.gsd/agent/docs/pi-ui-tui/06-ctx-ui-custom-full-custom-components.md` — ctx.ui.custom() API");
205
+ docHints.push("- `~/.gsd/agent/docs/pi-ui-tui/07-built-in-components-the-building-blocks.md` — Text, Box, SelectList");
206
+ docHints.push("- `~/.gsd/agent/docs/pi-ui-tui/09-keyboard-input-how-to-handle-keys.md` — Key, matchesKey");
207
+ docHints.push("- `~/.gsd/agent/docs/pi-ui-tui/10-line-width-the-cardinal-rule.md` — truncation, width rules");
208
+ docHints.push("- `~/.gsd/agent/docs/pi-ui-tui/19-building-a-complete-component-step-by-step.md` — step-by-step guide");
209
+ docHints.push("- `~/.gsd/agent/docs/pi-ui-tui/21-common-mistakes-and-how-to-avoid-them.md` — pitfalls");
207
210
  }
208
211
  else if (uiSelected.includes("Dialogs")) {
209
- docHints.push("- `docs/extension-sdk/building-extensions.md#built-in-dialogs` — select, confirm, input");
212
+ docHints.push("- `~/.gsd/agent/docs/pi-ui-tui/04-built-in-dialog-methods.md` — select, confirm, input, editor");
210
213
  }
211
214
  else if (uiSelected.includes("Status")) {
212
- docHints.push("- `docs/extension-sdk/building-extensions.md#persistent-ui-elements` — status, widgets");
215
+ docHints.push("- `~/.gsd/agent/docs/pi-ui-tui/05-persistent-ui-elements.md` — status, widgets, footer, header");
213
216
  }
214
217
  if (uiSelected.includes("tool") || result.answers["purpose"]) {
215
- docHints.push("- `docs/dev/extending-pi/14-custom-rendering-controlling-what-the-user-sees.md` — renderCall / renderResult");
218
+ docHints.push("- `~/.gsd/agent/docs/extending-pi/14-custom-rendering-controlling-what-the-user-sees.md` — renderCall / renderResult");
216
219
  }
217
220
  if (eventsSelected && !eventsSelected.includes("standalone")) {
218
- docHints.push("- `docs/dev/extending-pi/07-events-the-nervous-system.md` — all events reference");
221
+ docHints.push("- `~/.gsd/agent/docs/extending-pi/07-events-the-nervous-system.md` — all events reference");
219
222
  }
220
223
  if (eventsSelected.includes("context / prompt")) {
221
- docHints.push("- `docs/dev/extending-pi/15-system-prompt-modification.md` — system prompt hooks");
224
+ docHints.push("- `~/.gsd/agent/docs/extending-pi/15-system-prompt-modification.md` — system prompt hooks");
222
225
  }
223
226
  if (persistenceSelected.includes("session")) {
224
- docHints.push("- `docs/extension-sdk/building-extensions.md#state-management` — state reconstruction, appendEntry");
227
+ docHints.push("- `~/.gsd/agent/docs/extending-pi/13-state-management-persistence.md` — pi.appendEntry, session state");
225
228
  }
226
229
  const prompt = `Create a new pi extension based on this description:
227
230
 
@@ -235,30 +238,13 @@ ${docHints.join("\n")}
235
238
 
236
239
  ## Output
237
240
 
238
- Write the complete implementation as a directory-based extension:
241
+ Write the complete implementation as a single self-contained extension file:
239
242
 
240
- \`~/.gsd/agent/extensions/<kebab-case-name>/index.ts\`
241
- \`~/.gsd/agent/extensions/<kebab-case-name>/extension-manifest.json\`
243
+ \`~/.gsd/agent/extensions/<kebab-case-name>.ts\`
242
244
 
243
- The manifest must follow this format:
244
- \`\`\`json
245
- {
246
- "id": "<kebab-case-name>",
247
- "name": "<Human Name>",
248
- "version": "1.0.0",
249
- "description": "<one-line description>",
250
- "tier": "community",
251
- "requires": { "platform": ">=2.29.0" },
252
- "provides": {
253
- "tools": ["<tool_names_registered>"],
254
- "commands": ["<command_names_registered>"],
255
- "hooks": ["<event_names_subscribed>"],
256
- "shortcuts": ["<shortcut_keys_registered>"]
257
- }
258
- }
259
- \`\`\`
245
+ Then register it in the main extensions index:
260
246
 
261
- Only include non-empty arrays in \`provides\`. See \`docs/extension-sdk/manifest-spec.md\` for the full spec.
247
+ \`~/.gsd/agent/extensions/index.ts\` import and call the new extension's default export alongside existing ones
262
248
 
263
249
  ## Rules you must follow exactly
264
250
 
@@ -19,8 +19,8 @@ Note: `~/.gsd/agent/extensions/` is reserved for bundled extensions synced from
19
19
  3. **Commands** — Give users slash commands (`pi.registerCommand()`). Users type `/mycommand`.
20
20
 
21
21
  **Non-negotiable rules:**
22
- - Use `StringEnum` from `@gsd/pi-ai` for string enum params (NOT `Type.Union`/`Type.Literal` — breaks Google's API)
23
- - Truncate tool output to 50KB / 2000 lines max (use `truncateHead`/`truncateTail` from `@gsd/pi-coding-agent`)
22
+ - Use `StringEnum` from `@mariozechner/pi-ai` for string enum params (NOT `Type.Union`/`Type.Literal` — breaks Google's API)
23
+ - Truncate tool output to 50KB / 2000 lines max (use `truncateHead`/`truncateTail` from `@mariozechner/pi-coding-agent`)
24
24
  - Store stateful tool state in `details` for branching support
25
25
  - Check `signal?.aborted` in long-running tool executions
26
26
  - Use `pi.exec()` not `child_process` for shell commands
@@ -34,10 +34,10 @@ Note: `~/.gsd/agent/extensions/` is reserved for bundled extensions synced from
34
34
 
35
35
  | Package | Purpose |
36
36
  |---------|---------|
37
- | `@gsd/pi-coding-agent` | `ExtensionAPI`, `ExtensionContext`, `Theme`, event types, tool utilities, `DynamicBorder`, `BorderedLoader`, `CustomEditor`, `highlightCode` |
37
+ | `@mariozechner/pi-coding-agent` | `ExtensionAPI`, `ExtensionContext`, `Theme`, event types, tool utilities, `DynamicBorder`, `BorderedLoader`, `CustomEditor`, `highlightCode` |
38
38
  | `@sinclair/typebox` | `Type.Object`, `Type.String`, `Type.Number`, `Type.Optional`, `Type.Boolean`, `Type.Array` |
39
- | `@gsd/pi-ai` | `StringEnum` (required for string enums), `Type` re-export |
40
- | `@gsd/pi-tui` | `Text`, `Box`, `Container`, `Spacer`, `Markdown`, `SelectList`, `Input`, `matchesKey`, `Key`, `truncateToWidth`, `visibleWidth` |
39
+ | `@mariozechner/pi-ai` | `StringEnum` (required for string enums), `Type` re-export |
40
+ | `@mariozechner/pi-tui` | `Text`, `Box`, `Container`, `Spacer`, `Markdown`, `SelectList`, `Input`, `matchesKey`, `Key`, `truncateToWidth`, `visibleWidth` |
41
41
  | Node.js built-ins | `node:fs`, `node:path`, `node:child_process`, etc. |
42
42
 
43
43
  </essential_principles>
@@ -65,9 +65,6 @@ All domain knowledge in `references/`:
65
65
  **Capabilities:** custom-tools.md, custom-commands.md, custom-ui.md, custom-rendering.md
66
66
  **Patterns:** state-management.md, system-prompt-modification.md, compaction-session-control.md
67
67
  **Infrastructure:** model-provider-management.md, remote-execution-overrides.md, packaging-distribution.md, mode-behavior.md
68
- **Spec:** `docs/extension-sdk/manifest-spec.md` — manifest format, tiers, validation
69
- **Testing:** `docs/extension-sdk/testing.md` — mock patterns, test conventions
70
- **SDK:** `docs/extension-sdk/` — the authoritative GSD-2 extension guide
71
68
  **Gotchas:** key-rules-gotchas.md
72
69
  </reference_index>
73
70
 
@@ -81,7 +78,6 @@ All domain knowledge in `references/`:
81
78
 
82
79
  <success_criteria>
83
80
  Extension is complete when:
84
- - `extension-manifest.json` exists with accurate `provides` listing all registered tools/commands/hooks/shortcuts
85
81
  - TypeScript compiles without errors (jiti handles this at runtime)
86
82
  - Extension loads on GSD startup or `/reload` without errors
87
83
  - Tools appear in the LLM's system prompt and are callable