@opengsd/gsd-pi 1.5.0-dev.553dc518 → 1.5.0-dev.c4c8885f

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 (302) hide show
  1. package/dist/resources/.managed-resources-content-hash +1 -1
  2. package/dist/resources/extensions/ask-user-questions.js +1 -1
  3. package/dist/resources/extensions/browser-tools/engine/managed-gsd-browser.js +114 -36
  4. package/dist/resources/extensions/gsd/activity-log.js +1 -1
  5. package/dist/resources/extensions/gsd/auto/orchestrator.js +16 -10
  6. package/dist/resources/extensions/gsd/auto-artifact-paths.js +14 -5
  7. package/dist/resources/extensions/gsd/auto-direct-dispatch.js +7 -2
  8. package/dist/resources/extensions/gsd/auto-dispatch.js +69 -17
  9. package/dist/resources/extensions/gsd/auto-model-selection.js +28 -1
  10. package/dist/resources/extensions/gsd/auto-post-unit.js +4 -3
  11. package/dist/resources/extensions/gsd/auto-prompts.js +29 -117
  12. package/dist/resources/extensions/gsd/auto-recovery.js +50 -6
  13. package/dist/resources/extensions/gsd/auto-start.js +54 -31
  14. package/dist/resources/extensions/gsd/auto-timeout-recovery.js +12 -2
  15. package/dist/resources/extensions/gsd/auto-timers.js +9 -2
  16. package/dist/resources/extensions/gsd/auto.js +97 -31
  17. package/dist/resources/extensions/gsd/bootstrap/register-hooks.js +1 -1
  18. package/dist/resources/extensions/gsd/bootstrap/tool-call-loop-guard.js +67 -6
  19. package/dist/resources/extensions/gsd/codebase-generator.js +7 -1
  20. package/dist/resources/extensions/gsd/compat/compat-marker.js +44 -0
  21. package/dist/resources/extensions/gsd/config-overlay.js +7 -2
  22. package/dist/resources/extensions/gsd/db/engine.js +33 -0
  23. package/dist/resources/extensions/gsd/db/writers/cascades.js +20 -2
  24. package/dist/resources/extensions/gsd/db-adapter.js +30 -3
  25. package/dist/resources/extensions/gsd/docs/preferences-reference.md +3 -3
  26. package/dist/resources/extensions/gsd/flat-phase-migration.js +18 -0
  27. package/dist/resources/extensions/gsd/gsd-db.js +12 -11
  28. package/dist/resources/extensions/gsd/guided-flow.js +16 -7
  29. package/dist/resources/extensions/gsd/journal.js +1 -1
  30. package/dist/resources/extensions/gsd/markdown-renderer.js +34 -91
  31. package/dist/resources/extensions/gsd/md-importer.js +89 -23
  32. package/dist/resources/extensions/gsd/metrics.js +2 -2
  33. package/dist/resources/extensions/gsd/migration-auto-check.js +30 -3
  34. package/dist/resources/extensions/gsd/paths.js +87 -52
  35. package/dist/resources/extensions/gsd/post-unit-hooks.js +27 -0
  36. package/dist/resources/extensions/gsd/preferences-models.js +66 -15
  37. package/dist/resources/extensions/gsd/preferences-skills.js +10 -16
  38. package/dist/resources/extensions/gsd/preferences-validation.js +66 -10
  39. package/dist/resources/extensions/gsd/preferences.js +20 -0
  40. package/dist/resources/extensions/gsd/rule-registry.js +106 -10
  41. package/dist/resources/extensions/gsd/skill-discovery.js +36 -23
  42. package/dist/resources/extensions/gsd/state-reconciliation/drift/artifact-db.js +1 -10
  43. package/dist/resources/extensions/gsd/state-reconciliation/drift/completion.js +3 -24
  44. package/dist/resources/extensions/gsd/state-reconciliation/index.js +10 -0
  45. package/dist/resources/extensions/gsd/tools/complete-milestone.js +3 -5
  46. package/dist/resources/extensions/gsd/tools/reassess-roadmap.js +16 -10
  47. package/dist/resources/extensions/gsd/tools/reopen-slice.js +5 -0
  48. package/dist/resources/extensions/gsd/tools/reopen-task.js +13 -5
  49. package/dist/resources/extensions/gsd/tools/validate-milestone.js +3 -8
  50. package/dist/resources/extensions/gsd/uat-dispatch.js +94 -0
  51. package/dist/resources/extensions/gsd/uok/audit-toggle.js +31 -2
  52. package/dist/resources/extensions/gsd/uok/audit.js +3 -0
  53. package/dist/resources/extensions/gsd/uok/gate-runner.js +22 -30
  54. package/dist/resources/extensions/gsd/uok/gitops.js +18 -15
  55. package/dist/resources/extensions/gsd/uok/kernel.js +120 -46
  56. package/dist/resources/extensions/gsd/uok/model-policy.js +17 -14
  57. package/dist/resources/extensions/gsd/workflow-event-ledger.js +1 -1
  58. package/dist/resources/extensions/gsd/workflow-logger.js +1 -1
  59. package/dist/resources/extensions/gsd/workflow-projections.js +9 -26
  60. package/dist/resources/extensions/gsd/workspace.js +5 -14
  61. package/dist/resources/extensions/shared/gsd-browser-cli.js +29 -0
  62. package/dist/resources/extensions/shared/interview-ui.js +62 -9
  63. package/dist/tsconfig.extensions.tsbuildinfo +1 -1
  64. package/dist/web/standalone/.next/BUILD_ID +1 -1
  65. package/dist/web/standalone/.next/app-path-routes-manifest.json +10 -10
  66. package/dist/web/standalone/.next/build-manifest.json +2 -2
  67. package/dist/web/standalone/.next/prerender-manifest.json +3 -3
  68. package/dist/web/standalone/.next/server/app/_global-error.html +1 -1
  69. package/dist/web/standalone/.next/server/app/_global-error.rsc +1 -1
  70. package/dist/web/standalone/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  71. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  72. package/dist/web/standalone/.next/server/app/_global-error.segments/_global-error.segment.rsc +1 -1
  73. package/dist/web/standalone/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  74. package/dist/web/standalone/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  75. package/dist/web/standalone/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  76. package/dist/web/standalone/.next/server/app/_not-found.html +1 -1
  77. package/dist/web/standalone/.next/server/app/_not-found.rsc +1 -1
  78. package/dist/web/standalone/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  79. package/dist/web/standalone/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  80. package/dist/web/standalone/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  81. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  82. package/dist/web/standalone/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  83. package/dist/web/standalone/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  84. package/dist/web/standalone/.next/server/app/api/boot/route.js.nft.json +1 -1
  85. package/dist/web/standalone/.next/server/app/api/bridge-terminal/input/route.js.nft.json +1 -1
  86. package/dist/web/standalone/.next/server/app/api/bridge-terminal/resize/route.js.nft.json +1 -1
  87. package/dist/web/standalone/.next/server/app/api/bridge-terminal/stream/route.js.nft.json +1 -1
  88. package/dist/web/standalone/.next/server/app/api/captures/route.js.nft.json +1 -1
  89. package/dist/web/standalone/.next/server/app/api/cleanup/route.js.nft.json +1 -1
  90. package/dist/web/standalone/.next/server/app/api/doctor/route.js.nft.json +1 -1
  91. package/dist/web/standalone/.next/server/app/api/export-data/route.js.nft.json +1 -1
  92. package/dist/web/standalone/.next/server/app/api/files/route.js.nft.json +1 -1
  93. package/dist/web/standalone/.next/server/app/api/forensics/route.js.nft.json +1 -1
  94. package/dist/web/standalone/.next/server/app/api/git/route.js.nft.json +1 -1
  95. package/dist/web/standalone/.next/server/app/api/history/route.js.nft.json +1 -1
  96. package/dist/web/standalone/.next/server/app/api/hooks/route.js.nft.json +1 -1
  97. package/dist/web/standalone/.next/server/app/api/inspect/route.js.nft.json +1 -1
  98. package/dist/web/standalone/.next/server/app/api/knowledge/route.js.nft.json +1 -1
  99. package/dist/web/standalone/.next/server/app/api/live-state/route.js.nft.json +1 -1
  100. package/dist/web/standalone/.next/server/app/api/mcp-connections/route.js.nft.json +1 -1
  101. package/dist/web/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  102. package/dist/web/standalone/.next/server/app/api/onboarding/route.js.nft.json +1 -1
  103. package/dist/web/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  104. package/dist/web/standalone/.next/server/app/api/recovery/route.js.nft.json +1 -1
  105. package/dist/web/standalone/.next/server/app/api/session/browser/route.js.nft.json +1 -1
  106. package/dist/web/standalone/.next/server/app/api/session/command/route.js.nft.json +1 -1
  107. package/dist/web/standalone/.next/server/app/api/session/events/route.js.nft.json +1 -1
  108. package/dist/web/standalone/.next/server/app/api/session/manage/route.js.nft.json +1 -1
  109. package/dist/web/standalone/.next/server/app/api/settings-data/route.js.nft.json +1 -1
  110. package/dist/web/standalone/.next/server/app/api/shutdown/route.js.nft.json +1 -1
  111. package/dist/web/standalone/.next/server/app/api/skill-health/route.js.nft.json +1 -1
  112. package/dist/web/standalone/.next/server/app/api/steer/route.js.nft.json +1 -1
  113. package/dist/web/standalone/.next/server/app/api/switch-root/route.js.nft.json +1 -1
  114. package/dist/web/standalone/.next/server/app/api/terminal/sessions/route.js.nft.json +1 -1
  115. package/dist/web/standalone/.next/server/app/api/terminal/stream/route.js.nft.json +1 -1
  116. package/dist/web/standalone/.next/server/app/api/undo/route.js.nft.json +1 -1
  117. package/dist/web/standalone/.next/server/app/api/visualizer/route.js.nft.json +1 -1
  118. package/dist/web/standalone/.next/server/app/index.html +1 -1
  119. package/dist/web/standalone/.next/server/app/index.rsc +1 -1
  120. package/dist/web/standalone/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  121. package/dist/web/standalone/.next/server/app/index.segments/_full.segment.rsc +1 -1
  122. package/dist/web/standalone/.next/server/app/index.segments/_head.segment.rsc +1 -1
  123. package/dist/web/standalone/.next/server/app/index.segments/_index.segment.rsc +1 -1
  124. package/dist/web/standalone/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  125. package/dist/web/standalone/.next/server/app-paths-manifest.json +10 -10
  126. package/dist/web/standalone/.next/server/chunks/{1128.js → 1991.js} +1 -1
  127. package/dist/web/standalone/.next/server/chunks/8357.js +1 -1
  128. package/dist/web/standalone/.next/server/middleware-build-manifest.js +1 -1
  129. package/dist/web/standalone/.next/server/pages/404.html +1 -1
  130. package/dist/web/standalone/.next/server/pages/500.html +1 -1
  131. package/dist/web/standalone/.next/server/server-reference-manifest.json +1 -1
  132. package/dist/worktree-cli-create.d.ts +10 -0
  133. package/dist/worktree-cli-create.js +11 -0
  134. package/dist/worktree-cli-format.d.ts +12 -0
  135. package/dist/worktree-cli-format.js +38 -0
  136. package/dist/worktree-cli-plan.d.ts +16 -0
  137. package/dist/worktree-cli-plan.js +19 -0
  138. package/dist/worktree-cli-session.d.ts +13 -0
  139. package/dist/worktree-cli-session.js +18 -0
  140. package/dist/worktree-cli-status.d.ts +35 -0
  141. package/dist/worktree-cli-status.js +54 -0
  142. package/dist/worktree-cli.d.ts +1 -16
  143. package/dist/worktree-cli.js +28 -122
  144. package/integrations/hermes/open_gsd_hermes/gsd_client.py +1 -1
  145. package/integrations/hermes/pyproject.toml +1 -1
  146. package/package.json +1 -1
  147. package/packages/cloud-mcp-gateway/package.json +2 -2
  148. package/packages/contracts/package.json +1 -1
  149. package/packages/daemon/dist/orchestrator-agent.d.ts +21 -0
  150. package/packages/daemon/dist/orchestrator-agent.d.ts.map +1 -0
  151. package/packages/daemon/dist/orchestrator-agent.js +113 -0
  152. package/packages/daemon/dist/orchestrator-agent.js.map +1 -0
  153. package/packages/daemon/dist/orchestrator-tools.d.ts +12 -0
  154. package/packages/daemon/dist/orchestrator-tools.d.ts.map +1 -0
  155. package/packages/daemon/dist/orchestrator-tools.js +137 -0
  156. package/packages/daemon/dist/orchestrator-tools.js.map +1 -0
  157. package/packages/daemon/dist/orchestrator.d.ts +4 -56
  158. package/packages/daemon/dist/orchestrator.d.ts.map +1 -1
  159. package/packages/daemon/dist/orchestrator.js +13 -303
  160. package/packages/daemon/dist/orchestrator.js.map +1 -1
  161. package/packages/daemon/dist/orchestrator.test.js +11 -1
  162. package/packages/daemon/dist/orchestrator.test.js.map +1 -1
  163. package/packages/daemon/package.json +4 -4
  164. package/packages/gsd-agent-core/package.json +5 -5
  165. package/packages/gsd-agent-modes/package.json +7 -7
  166. package/packages/mcp-server/package.json +4 -4
  167. package/packages/native/package.json +1 -1
  168. package/packages/pi-agent-core/package.json +1 -1
  169. package/packages/pi-ai/package.json +1 -1
  170. package/packages/pi-coding-agent/dist/core/package-manager.d.ts +9 -0
  171. package/packages/pi-coding-agent/dist/core/package-manager.d.ts.map +1 -1
  172. package/packages/pi-coding-agent/dist/core/package-manager.js +74 -53
  173. package/packages/pi-coding-agent/dist/core/package-manager.js.map +1 -1
  174. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts +6 -0
  175. package/packages/pi-coding-agent/dist/core/resource-loader.d.ts.map +1 -1
  176. package/packages/pi-coding-agent/dist/core/resource-loader.js +30 -2
  177. package/packages/pi-coding-agent/dist/core/resource-loader.js.map +1 -1
  178. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts +66 -0
  179. package/packages/pi-coding-agent/dist/core/skill-directories.d.ts.map +1 -0
  180. package/packages/pi-coding-agent/dist/core/skill-directories.js +138 -0
  181. package/packages/pi-coding-agent/dist/core/skill-directories.js.map +1 -0
  182. package/packages/pi-coding-agent/dist/core/skills.d.ts +4 -1
  183. package/packages/pi-coding-agent/dist/core/skills.d.ts.map +1 -1
  184. package/packages/pi-coding-agent/dist/core/skills.js +4 -1
  185. package/packages/pi-coding-agent/dist/core/skills.js.map +1 -1
  186. package/packages/pi-coding-agent/dist/index.d.ts +1 -0
  187. package/packages/pi-coding-agent/dist/index.d.ts.map +1 -1
  188. package/packages/pi-coding-agent/dist/index.js +1 -0
  189. package/packages/pi-coding-agent/dist/index.js.map +1 -1
  190. package/packages/pi-coding-agent/package.json +7 -7
  191. package/packages/pi-tui/package.json +2 -2
  192. package/packages/rpc-client/package.json +2 -2
  193. package/pkg/package.json +1 -1
  194. package/src/resources/extensions/ask-user-questions.ts +1 -1
  195. package/src/resources/extensions/browser-tools/engine/managed-gsd-browser.ts +146 -33
  196. package/src/resources/extensions/browser-tools/tests/gsd-browser-launch-config.test.mjs +25 -0
  197. package/src/resources/extensions/browser-tools/tests/managed-gsd-browser-tools.test.mjs +93 -0
  198. package/src/resources/extensions/gsd/activity-log.ts +1 -1
  199. package/src/resources/extensions/gsd/auto/orchestrator.ts +17 -11
  200. package/src/resources/extensions/gsd/auto-artifact-paths.ts +14 -4
  201. package/src/resources/extensions/gsd/auto-direct-dispatch.ts +9 -2
  202. package/src/resources/extensions/gsd/auto-dispatch.ts +77 -16
  203. package/src/resources/extensions/gsd/auto-model-selection.ts +33 -1
  204. package/src/resources/extensions/gsd/auto-post-unit.ts +4 -2
  205. package/src/resources/extensions/gsd/auto-prompts.ts +53 -113
  206. package/src/resources/extensions/gsd/auto-recovery.ts +50 -6
  207. package/src/resources/extensions/gsd/auto-start.ts +58 -29
  208. package/src/resources/extensions/gsd/auto-timeout-recovery.ts +12 -2
  209. package/src/resources/extensions/gsd/auto-timers.ts +9 -2
  210. package/src/resources/extensions/gsd/auto.ts +103 -30
  211. package/src/resources/extensions/gsd/bootstrap/register-hooks.ts +1 -1
  212. package/src/resources/extensions/gsd/bootstrap/tool-call-loop-guard.ts +66 -6
  213. package/src/resources/extensions/gsd/codebase-generator.ts +7 -1
  214. package/src/resources/extensions/gsd/compat/compat-marker.ts +47 -0
  215. package/src/resources/extensions/gsd/config-overlay.ts +7 -1
  216. package/src/resources/extensions/gsd/db/engine.ts +36 -0
  217. package/src/resources/extensions/gsd/db/writers/cascades.ts +23 -1
  218. package/src/resources/extensions/gsd/db-adapter.ts +29 -3
  219. package/src/resources/extensions/gsd/docs/preferences-reference.md +3 -3
  220. package/src/resources/extensions/gsd/flat-phase-migration.ts +20 -0
  221. package/src/resources/extensions/gsd/gsd-db.ts +20 -11
  222. package/src/resources/extensions/gsd/guided-flow.ts +19 -7
  223. package/src/resources/extensions/gsd/journal.ts +1 -1
  224. package/src/resources/extensions/gsd/markdown-renderer.ts +52 -103
  225. package/src/resources/extensions/gsd/md-importer.ts +93 -22
  226. package/src/resources/extensions/gsd/metrics.ts +2 -2
  227. package/src/resources/extensions/gsd/migration-auto-check.ts +32 -3
  228. package/src/resources/extensions/gsd/paths.ts +108 -51
  229. package/src/resources/extensions/gsd/post-unit-hooks.ts +32 -0
  230. package/src/resources/extensions/gsd/preferences-models.ts +74 -20
  231. package/src/resources/extensions/gsd/preferences-skills.ts +10 -16
  232. package/src/resources/extensions/gsd/preferences-types.ts +24 -1
  233. package/src/resources/extensions/gsd/preferences-validation.ts +77 -9
  234. package/src/resources/extensions/gsd/preferences.ts +20 -0
  235. package/src/resources/extensions/gsd/rule-registry.ts +111 -9
  236. package/src/resources/extensions/gsd/skill-discovery.ts +47 -23
  237. package/src/resources/extensions/gsd/state-reconciliation/drift/artifact-db.ts +1 -9
  238. package/src/resources/extensions/gsd/state-reconciliation/drift/completion.ts +2 -22
  239. package/src/resources/extensions/gsd/state-reconciliation/index.ts +14 -0
  240. package/src/resources/extensions/gsd/tests/auto-artifact-paths.test.ts +169 -1
  241. package/src/resources/extensions/gsd/tests/auto-orchestrator.test.ts +41 -2
  242. package/src/resources/extensions/gsd/tests/auto-post-unit-artifact-diagnostic.test.ts +48 -1
  243. package/src/resources/extensions/gsd/tests/auto-recovery.test.ts +57 -0
  244. package/src/resources/extensions/gsd/tests/auto-start-project-milestone-reconcile.test.ts +29 -1
  245. package/src/resources/extensions/gsd/tests/auto-timeout-recovery-supervisor-inflight-guard.test.ts +159 -0
  246. package/src/resources/extensions/gsd/tests/codebase-generator.test.ts +22 -0
  247. package/src/resources/extensions/gsd/tests/commands-verdict.test.ts +3 -1
  248. package/src/resources/extensions/gsd/tests/compat-marker.test.ts +85 -0
  249. package/src/resources/extensions/gsd/tests/complete-milestone.test.ts +45 -0
  250. package/src/resources/extensions/gsd/tests/db-adapter.test.ts +39 -0
  251. package/src/resources/extensions/gsd/tests/db-writable-probe.test.ts +66 -0
  252. package/src/resources/extensions/gsd/tests/flat-phase-migration.test.ts +27 -0
  253. package/src/resources/extensions/gsd/tests/flat-phase-renderer.test.ts +22 -1
  254. package/src/resources/extensions/gsd/tests/flat-phase-validation-path.test.ts +72 -32
  255. package/src/resources/extensions/gsd/tests/import-completion-lost-update.test.ts +196 -0
  256. package/src/resources/extensions/gsd/tests/integration/paths.test.ts +88 -1
  257. package/src/resources/extensions/gsd/tests/journal-integration.test.ts +16 -15
  258. package/src/resources/extensions/gsd/tests/migration-auto-check.test.ts +91 -0
  259. package/src/resources/extensions/gsd/tests/milestone-closeout.test.ts +2 -1
  260. package/src/resources/extensions/gsd/tests/parsers-legacy-importers.test.ts +0 -1
  261. package/src/resources/extensions/gsd/tests/post-unit-hooks.test.ts +269 -0
  262. package/src/resources/extensions/gsd/tests/post-unit-retry-on-orchestrator-bridge.test.ts +8 -1
  263. package/src/resources/extensions/gsd/tests/preferences.test.ts +19 -0
  264. package/src/resources/extensions/gsd/tests/read-uat-gate-verdict.test.ts +54 -0
  265. package/src/resources/extensions/gsd/tests/reassess-handler.test.ts +49 -1
  266. package/src/resources/extensions/gsd/tests/reopen-slice.test.ts +52 -0
  267. package/src/resources/extensions/gsd/tests/rule-registry.test.ts +95 -1
  268. package/src/resources/extensions/gsd/tests/sibling-model-fallbacks.test.ts +189 -0
  269. package/src/resources/extensions/gsd/tests/single-field-model-thinking.test.ts +156 -0
  270. package/src/resources/extensions/gsd/tests/skill-discovery.test.ts +46 -0
  271. package/src/resources/extensions/gsd/tests/skipped-validation-db-atomicity.test.ts +6 -1
  272. package/src/resources/extensions/gsd/tests/start-auto-detached.test.ts +32 -0
  273. package/src/resources/extensions/gsd/tests/supervisor-model-swap-inflight-guard.test.ts +181 -0
  274. package/src/resources/extensions/gsd/tests/supervisor-model-swap-thinking-clamp.test.ts +122 -0
  275. package/src/resources/extensions/gsd/tests/tool-call-loop-guard.test.ts +93 -0
  276. package/src/resources/extensions/gsd/tests/uat-dispatch.test.ts +211 -0
  277. package/src/resources/extensions/gsd/tests/uok-gate-runner.test.ts +39 -0
  278. package/src/resources/extensions/gsd/tests/uok-kernel-path.test.ts +226 -2
  279. package/src/resources/extensions/gsd/tests/uok-model-policy.test.ts +6 -0
  280. package/src/resources/extensions/gsd/tests/workflow-projections.test.ts +213 -2
  281. package/src/resources/extensions/gsd/tools/complete-milestone.ts +9 -5
  282. package/src/resources/extensions/gsd/tools/reassess-roadmap.ts +19 -8
  283. package/src/resources/extensions/gsd/tools/reopen-slice.ts +5 -0
  284. package/src/resources/extensions/gsd/tools/reopen-task.ts +13 -5
  285. package/src/resources/extensions/gsd/tools/validate-milestone.ts +13 -9
  286. package/src/resources/extensions/gsd/types.ts +23 -4
  287. package/src/resources/extensions/gsd/uat-dispatch.ts +176 -0
  288. package/src/resources/extensions/gsd/uok/audit-toggle.ts +32 -2
  289. package/src/resources/extensions/gsd/uok/audit.ts +2 -0
  290. package/src/resources/extensions/gsd/uok/gate-runner.ts +26 -36
  291. package/src/resources/extensions/gsd/uok/gitops.ts +21 -18
  292. package/src/resources/extensions/gsd/uok/kernel.ts +169 -48
  293. package/src/resources/extensions/gsd/uok/model-policy.ts +20 -17
  294. package/src/resources/extensions/gsd/workflow-event-ledger.ts +1 -1
  295. package/src/resources/extensions/gsd/workflow-logger.ts +1 -1
  296. package/src/resources/extensions/gsd/workflow-projections.ts +9 -24
  297. package/src/resources/extensions/gsd/workspace.ts +5 -21
  298. package/src/resources/extensions/shared/gsd-browser-cli.ts +29 -0
  299. package/src/resources/extensions/shared/interview-ui.ts +58 -11
  300. package/src/resources/extensions/shared/tests/interview-ui-border.test.ts +32 -0
  301. /package/dist/web/standalone/.next/static/{ZpFDazP-38PXBPiI_LdZf → NPMNi2HV8BuK3baQsEUhk}/_buildManifest.js +0 -0
  302. /package/dist/web/standalone/.next/static/{ZpFDazP-38PXBPiI_LdZf → NPMNi2HV8BuK3baQsEUhk}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.test.js","sourceRoot":"","sources":["../src/orchestrator.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for Orchestrator — LLM agent for #gsd-control channel.\n *\n * Uses a MockAnthropicClient that simulates messages.create() responses,\n * allowing tool execution and conversation flow testing without real API calls.\n */\n\nimport { describe, it, afterEach } from 'node:test';\nimport assert from 'node:assert/strict';\nimport { mkdtempSync, rmSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport { Orchestrator, type OrchestratorConfig, type OrchestratorDeps, type DiscordMessageLike } from './orchestrator.js';\nimport { Logger } from './logger.js';\nimport type { ManagedSession, ProjectInfo, SessionStatus, CostAccumulator } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction tmpDir(): string {\n return mkdtempSync(join(tmpdir(), `orch-test-${randomUUID().slice(0, 8)}-`));\n}\n\nconst cleanupDirs: string[] = [];\nconst activeLoggers: Logger[] = [];\n\nasync function cleanupAll(): Promise<void> {\n // Close all loggers first so write streams flush before dirs are removed\n for (const logger of activeLoggers) {\n try { await logger.close(); } catch { /* ignore */ }\n }\n activeLoggers.length = 0;\n\n while (cleanupDirs.length) {\n const d = cleanupDirs.pop()!;\n if (existsSync(d)) rmSync(d, { recursive: true, force: true });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mock Anthropic Client\n// ---------------------------------------------------------------------------\n\ninterface MockCreateParams {\n model: string;\n max_tokens: number;\n system: string;\n tools: unknown[];\n messages: unknown[];\n}\n\ntype CreateHandler = (params: MockCreateParams) => {\n stop_reason: string;\n content: Array<{ type: string; text?: string; id?: string; name?: string; input?: unknown }>;\n};\n\nclass MockAnthropicClient {\n public createCallCount = 0;\n public lastCreateParams: MockCreateParams | null = null;\n private createHandler: CreateHandler;\n\n constructor(handler?: CreateHandler) {\n this.createHandler = handler ?? MockAnthropicClient.defaultHandler;\n }\n\n /** Default handler: returns a simple text response */\n static defaultHandler(): ReturnType<CreateHandler> {\n return {\n stop_reason: 'end_turn',\n content: [{ type: 'text', text: 'Mock LLM response' }],\n };\n }\n\n /** Handler that simulates a tool call then end_turn */\n static toolThenTextHandler(toolName: string, toolInput: unknown, finalText: string): CreateHandler {\n let callCount = 0;\n return () => {\n callCount++;\n if (callCount === 1) {\n return {\n stop_reason: 'tool_use',\n content: [\n {\n type: 'tool_use',\n id: `toolu_${randomUUID().slice(0, 8)}`,\n name: toolName,\n input: toolInput,\n },\n ],\n };\n }\n return {\n stop_reason: 'end_turn',\n content: [{ type: 'text', text: finalText }],\n };\n };\n }\n\n /** Handler that throws an error */\n static errorHandler(message: string): CreateHandler {\n return () => {\n throw new Error(message);\n };\n }\n\n messages = {\n create: async (params: MockCreateParams) => {\n this.createCallCount++;\n this.lastCreateParams = params;\n return this.createHandler(params);\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Mock SessionManager\n// ---------------------------------------------------------------------------\n\nfunction makeMockSession(overrides: Partial<ManagedSession> = {}): ManagedSession {\n return {\n sessionId: overrides.sessionId ?? 'sess-123',\n projectDir: overrides.projectDir ?? '/home/user/project',\n projectName: overrides.projectName ?? 'my-project',\n status: overrides.status ?? ('running' as SessionStatus),\n client: {} as ManagedSession['client'],\n events: [],\n pendingBlocker: null,\n cost: overrides.cost ?? { totalCost: 0.1234, tokens: { input: 1000, output: 500, cacheRead: 0, cacheWrite: 0 } },\n startTime: overrides.startTime ?? Date.now() - 300_000, // 5 min ago\n ...overrides,\n };\n}\n\nclass MockSessionManager {\n public sessions: ManagedSession[] = [];\n public startSessionCalls: Array<{ projectDir: string; command?: string }> = [];\n public cancelSessionCalls: string[] = [];\n public getResultCalls: string[] = [];\n\n async startSession(opts: { projectDir: string; command?: string }): Promise<string> {\n this.startSessionCalls.push(opts);\n return 'sess-new-123';\n }\n\n getSession(sessionId: string): ManagedSession | undefined {\n return this.sessions.find((s) => s.sessionId === sessionId);\n }\n\n getAllSessions(): ManagedSession[] {\n return this.sessions;\n }\n\n async cancelSession(sessionId: string): Promise<void> {\n this.cancelSessionCalls.push(sessionId);\n }\n\n getResult(sessionId: string): Record<string, unknown> {\n const session = this.sessions.find((s) => s.sessionId === sessionId);\n if (!session) throw new Error(`Session not found: ${sessionId}`);\n return {\n sessionId: session.sessionId,\n projectDir: session.projectDir,\n projectName: session.projectName,\n status: session.status,\n durationMs: 300_000,\n cost: session.cost,\n recentEvents: [],\n pendingBlocker: null,\n error: null,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mock ChannelManager (unused by orchestrator directly, but required by deps)\n// ---------------------------------------------------------------------------\n\nclass MockChannelManager {}\n\n// ---------------------------------------------------------------------------\n// Mock Discord Message\n// ---------------------------------------------------------------------------\n\nfunction makeMessage(overrides: Partial<{\n authorId: string;\n bot: boolean;\n channelId: string;\n content: string;\n}>): DiscordMessageLike & { sentMessages: string[] } {\n const sentMessages: string[] = [];\n return {\n author: {\n id: overrides.authorId ?? 'owner-123',\n bot: overrides.bot ?? false,\n },\n channelId: overrides.channelId ?? 'control-channel-1',\n content: overrides.content ?? 'hello',\n channel: {\n send: async (content: string) => {\n sentMessages.push(content);\n },\n sendTyping: async () => {},\n },\n sentMessages,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Test Setup Factory\n// ---------------------------------------------------------------------------\n\nfunction makeOrchestrator(opts?: {\n client?: MockAnthropicClient;\n sessions?: ManagedSession[];\n projects?: ProjectInfo[];\n}) {\n const dir = tmpDir();\n cleanupDirs.push(dir);\n const logPath = join(dir, 'test.log');\n const logger = new Logger({ filePath: logPath, level: 'debug' });\n activeLoggers.push(logger);\n\n const sessionManager = new MockSessionManager();\n if (opts?.sessions) sessionManager.sessions = opts.sessions;\n\n const projects: ProjectInfo[] = opts?.projects ?? [\n { name: 'alpha', path: '/home/user/alpha', markers: ['git', 'node', 'gsd'], lastModified: Date.now() },\n { name: 'bravo', path: '/home/user/bravo', markers: ['git', 'rust'], lastModified: Date.now() },\n ];\n\n const config: OrchestratorConfig = {\n model: 'claude-sonnet-4-20250514',\n max_tokens: 4096,\n control_channel_id: 'control-channel-1',\n };\n\n const deps: OrchestratorDeps = {\n sessionManager: sessionManager as unknown as OrchestratorDeps['sessionManager'],\n channelManager: new MockChannelManager() as unknown as OrchestratorDeps['channelManager'],\n scanProjects: async () => projects,\n config,\n logger,\n ownerId: 'owner-123',\n };\n\n const mockClient = opts?.client ?? new MockAnthropicClient();\n const orchestrator = new Orchestrator(deps, mockClient as unknown as import('@anthropic-ai/sdk').default);\n\n return { orchestrator, mockClient, sessionManager, logger, logPath };\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ndescribe('Orchestrator', () => {\n // Clean up after each test so logger streams are flushed before dirs removed\n afterEach(async () => {\n await cleanupAll();\n });\n\n // ---- Tool definitions ----\n\n describe('tool definitions', () => {\n it('passes 5 tools to the Anthropic API', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ content: 'what can you do?' });\n await orchestrator.handleMessage(msg);\n\n assert.ok(mockClient.lastCreateParams);\n const tools = mockClient.lastCreateParams.tools as Array<{ name: string }>;\n assert.equal(tools.length, 5);\n\n const names = tools.map((t) => t.name).sort();\n assert.deepEqual(names, [\n 'get_session_detail',\n 'get_status',\n 'list_projects',\n 'start_session',\n 'stop_session',\n ]);\n });\n });\n\n // ---- list_projects tool ----\n\n describe('list_projects tool', () => {\n it('returns project list from scanProjects', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler('list_projects', {}, 'Here are your projects'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient });\n const msg = makeMessage({ content: 'list my projects' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(msg.sentMessages.length, 1);\n assert.equal(msg.sentMessages[0], 'Here are your projects');\n // The tool was called (2 create calls: tool_use + end_turn)\n assert.equal(mockClient.createCallCount, 2);\n });\n });\n\n // ---- start_session tool ----\n\n describe('start_session tool', () => {\n it('calls sessionManager.startSession and returns confirmation', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'start_session',\n { projectPath: '/home/user/alpha' },\n 'Started session for alpha',\n ),\n );\n const { orchestrator, sessionManager } = makeOrchestrator({ client: mockClient });\n const msg = makeMessage({ content: 'start alpha' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(sessionManager.startSessionCalls.length, 1);\n assert.equal(sessionManager.startSessionCalls[0]!.projectDir, '/home/user/alpha');\n assert.equal(msg.sentMessages[0], 'Started session for alpha');\n });\n });\n\n // ---- get_status tool ----\n\n describe('get_status tool', () => {\n it('returns formatted session status', async () => {\n const session = makeMockSession({ projectName: 'alpha', status: 'running' as SessionStatus });\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler('get_status', {}, 'Status: alpha is running'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient, sessions: [session] });\n const msg = makeMessage({ content: 'status' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(msg.sentMessages[0], 'Status: alpha is running');\n });\n\n it('handles empty session list', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler('get_status', {}, 'No sessions running'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient, sessions: [] });\n const msg = makeMessage({ content: 'status' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(msg.sentMessages[0], 'No sessions running');\n });\n });\n\n // ---- stop_session tool ----\n\n describe('stop_session tool', () => {\n it('stops session matched by sessionId', async () => {\n const session = makeMockSession({ sessionId: 'sess-abc', projectName: 'alpha' });\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'stop_session',\n { identifier: 'sess-abc' },\n 'Stopped alpha',\n ),\n );\n const { orchestrator, sessionManager } = makeOrchestrator({ client: mockClient, sessions: [session] });\n const msg = makeMessage({ content: 'stop sess-abc' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(sessionManager.cancelSessionCalls.length, 1);\n assert.equal(sessionManager.cancelSessionCalls[0], 'sess-abc');\n });\n\n it('fuzzy matches by project name', async () => {\n const session = makeMockSession({ sessionId: 'sess-xyz', projectName: 'my-big-project' });\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'stop_session',\n { identifier: 'big-project' },\n 'Stopped my-big-project',\n ),\n );\n const { orchestrator, sessionManager } = makeOrchestrator({ client: mockClient, sessions: [session] });\n const msg = makeMessage({ content: 'stop big project' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(sessionManager.cancelSessionCalls.length, 1);\n assert.equal(sessionManager.cancelSessionCalls[0], 'sess-xyz');\n });\n\n it('returns not-found for unmatched identifier', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'stop_session',\n { identifier: 'nonexistent' },\n 'No session found',\n ),\n );\n const { orchestrator, sessionManager } = makeOrchestrator({ client: mockClient, sessions: [] });\n const msg = makeMessage({ content: 'stop nonexistent' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(sessionManager.cancelSessionCalls.length, 0);\n });\n });\n\n // ---- get_session_detail tool ----\n\n describe('get_session_detail tool', () => {\n it('returns formatted session detail', async () => {\n const session = makeMockSession({ sessionId: 'sess-detail' });\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'get_session_detail',\n { sessionId: 'sess-detail' },\n 'Session details for my-project',\n ),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient, sessions: [session] });\n const msg = makeMessage({ content: 'detail sess-detail' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(msg.sentMessages[0], 'Session details for my-project');\n });\n });\n\n // ---- Message routing / auth guards ----\n\n describe('handleMessage routing', () => {\n it('ignores bot messages', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ bot: true, content: 'hello from bot' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(mockClient.createCallCount, 0);\n assert.equal(msg.sentMessages.length, 0);\n });\n\n it('ignores non-owner messages', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ authorId: 'stranger-456', content: 'hack the planet' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(mockClient.createCallCount, 0);\n assert.equal(msg.sentMessages.length, 0);\n });\n\n it('ignores messages from non-control channels', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ channelId: 'random-channel', content: 'hello' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(mockClient.createCallCount, 0);\n assert.equal(msg.sentMessages.length, 0);\n });\n\n it('ignores empty message content', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ content: ' ' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(mockClient.createCallCount, 0);\n });\n\n it('routes valid message through LLM and sends response', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ content: 'hello orchestrator' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(mockClient.createCallCount, 1);\n assert.equal(msg.sentMessages.length, 1);\n assert.equal(msg.sentMessages[0], 'Mock LLM response');\n });\n });\n\n // ---- Conversation history ----\n\n describe('conversation history', () => {\n it('accumulates user and assistant entries', async () => {\n const { orchestrator } = makeOrchestrator();\n\n await orchestrator.handleMessage(makeMessage({ content: 'first' }));\n await orchestrator.handleMessage(makeMessage({ content: 'second' }));\n\n const history = orchestrator.getHistory();\n assert.equal(history.length, 4); // 2 user + 2 assistant\n assert.equal(history[0]!.role, 'user');\n assert.equal(history[1]!.role, 'assistant');\n assert.equal(history[2]!.role, 'user');\n assert.equal(history[3]!.role, 'assistant');\n });\n\n it('trims to MAX_HISTORY (30) by removing oldest pairs', async () => {\n const { orchestrator } = makeOrchestrator();\n\n // Send 17 messages → 34 history entries (17 user + 17 assistant)\n // After trimming: should be ≤30\n for (let i = 0; i < 17; i++) {\n await orchestrator.handleMessage(makeMessage({ content: `msg-${i}` }));\n }\n\n const history = orchestrator.getHistory();\n assert.ok(history.length <= 30, `History length ${history.length} exceeds 30`);\n // Should have trimmed from the front — oldest entries gone\n // 34 entries → trim 2 at a time until ≤30 → 30 entries (trimmed 4)\n assert.equal(history.length, 30);\n });\n });\n\n // ---- Error handling ----\n\n describe('error handling', () => {\n it('sends error message to Discord when LLM API throws', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.errorHandler('API rate limit exceeded'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient });\n const msg = makeMessage({ content: 'hello' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(msg.sentMessages.length, 1);\n assert.ok(msg.sentMessages[0]!.includes('Something went wrong'));\n });\n\n it('appends error placeholder to history on LLM failure', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.errorHandler('Network error'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient });\n await orchestrator.handleMessage(makeMessage({ content: 'fail' }));\n\n const history = orchestrator.getHistory();\n assert.equal(history.length, 2); // user + error assistant\n assert.equal(history[1]!.role, 'assistant');\n assert.equal(history[1]!.content, '[error — see logs]');\n });\n });\n\n // ---- stop() ----\n\n describe('stop()', () => {\n it('clears conversation history and nulls client', async () => {\n const { orchestrator } = makeOrchestrator();\n\n await orchestrator.handleMessage(makeMessage({ content: 'hello' }));\n assert.ok(orchestrator.getHistory().length > 0);\n\n orchestrator.stop();\n assert.equal(orchestrator.getHistory().length, 0);\n });\n });\n\n // ---- Tool execution direct tests ----\n\n describe('tool execution (via agent loop)', () => {\n it('list_projects returns empty message when no projects', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler('list_projects', {}, 'No projects'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient, projects: [] });\n const msg = makeMessage({ content: 'list' });\n await orchestrator.handleMessage(msg);\n\n // The second create call receives the tool result\n assert.equal(mockClient.createCallCount, 2);\n });\n\n it('start_session with optional command passes through', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'start_session',\n { projectPath: '/p', command: '/gsd quick fix tests' },\n 'Started',\n ),\n );\n const { orchestrator, sessionManager } = makeOrchestrator({ client: mockClient });\n const msg = makeMessage({ content: 'start with custom command' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(sessionManager.startSessionCalls.length, 1);\n assert.equal(sessionManager.startSessionCalls[0]!.command, '/gsd quick fix tests');\n });\n });\n\n});\n"]}
1
+ {"version":3,"file":"orchestrator.test.js","sourceRoot":"","sources":["../src/orchestrator.test.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Tests for Orchestrator — LLM agent for #gsd-control channel.\n *\n * Uses a MockAnthropicClient that simulates messages.create() responses,\n * allowing tool execution and conversation flow testing without real API calls.\n */\n\nimport { describe, it, afterEach } from 'node:test';\nimport assert from 'node:assert/strict';\nimport { mkdtempSync, rmSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { randomUUID } from 'node:crypto';\nimport { Orchestrator, type OrchestratorConfig, type OrchestratorDeps, type DiscordMessageLike } from './orchestrator.js';\nimport { Logger } from './logger.js';\nimport type { ManagedSession, ProjectInfo, SessionStatus, CostAccumulator } from './types.js';\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction tmpDir(): string {\n return mkdtempSync(join(tmpdir(), `orch-test-${randomUUID().slice(0, 8)}-`));\n}\n\nconst cleanupDirs: string[] = [];\nconst activeLoggers: Logger[] = [];\n\nasync function cleanupAll(): Promise<void> {\n // Close all loggers first so write streams flush before dirs are removed\n for (const logger of activeLoggers) {\n try { await logger.close(); } catch { /* ignore */ }\n }\n activeLoggers.length = 0;\n\n while (cleanupDirs.length) {\n const d = cleanupDirs.pop()!;\n if (existsSync(d)) rmSync(d, { recursive: true, force: true });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mock Anthropic Client\n// ---------------------------------------------------------------------------\n\ninterface MockCreateParams {\n model: string;\n max_tokens: number;\n system: string;\n tools: unknown[];\n messages: unknown[];\n}\n\ntype CreateHandler = (params: MockCreateParams) => {\n stop_reason: string;\n content: Array<{ type: string; text?: string; id?: string; name?: string; input?: unknown }>;\n};\n\nclass MockAnthropicClient {\n public createCallCount = 0;\n public lastCreateParams: MockCreateParams | null = null;\n private createHandler: CreateHandler;\n\n constructor(handler?: CreateHandler) {\n this.createHandler = handler ?? MockAnthropicClient.defaultHandler;\n }\n\n /** Default handler: returns a simple text response */\n static defaultHandler(): ReturnType<CreateHandler> {\n return {\n stop_reason: 'end_turn',\n content: [{ type: 'text', text: 'Mock LLM response' }],\n };\n }\n\n /** Handler that simulates a tool call then end_turn */\n static toolThenTextHandler(toolName: string, toolInput: unknown, finalText: string): CreateHandler {\n let callCount = 0;\n return () => {\n callCount++;\n if (callCount === 1) {\n return {\n stop_reason: 'tool_use',\n content: [\n {\n type: 'tool_use',\n id: `toolu_${randomUUID().slice(0, 8)}`,\n name: toolName,\n input: toolInput,\n },\n ],\n };\n }\n return {\n stop_reason: 'end_turn',\n content: [{ type: 'text', text: finalText }],\n };\n };\n }\n\n /** Handler that throws an error */\n static errorHandler(message: string): CreateHandler {\n return () => {\n throw new Error(message);\n };\n }\n\n messages = {\n create: async (params: MockCreateParams) => {\n this.createCallCount++;\n this.lastCreateParams = params;\n return this.createHandler(params);\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// Mock SessionManager\n// ---------------------------------------------------------------------------\n\nfunction makeMockSession(overrides: Partial<ManagedSession> = {}): ManagedSession {\n return {\n sessionId: overrides.sessionId ?? 'sess-123',\n projectDir: overrides.projectDir ?? '/home/user/project',\n projectName: overrides.projectName ?? 'my-project',\n status: overrides.status ?? ('running' as SessionStatus),\n client: {} as ManagedSession['client'],\n events: [],\n pendingBlocker: null,\n cost: overrides.cost ?? { totalCost: 0.1234, tokens: { input: 1000, output: 500, cacheRead: 0, cacheWrite: 0 } },\n startTime: overrides.startTime ?? Date.now() - 300_000, // 5 min ago\n ...overrides,\n };\n}\n\nclass MockSessionManager {\n public sessions: ManagedSession[] = [];\n public startSessionCalls: Array<{ projectDir: string; command?: string }> = [];\n public cancelSessionCalls: string[] = [];\n public getResultCalls: string[] = [];\n\n async startSession(opts: { projectDir: string; command?: string }): Promise<string> {\n this.startSessionCalls.push(opts);\n return 'sess-new-123';\n }\n\n getSession(sessionId: string): ManagedSession | undefined {\n return this.sessions.find((s) => s.sessionId === sessionId);\n }\n\n getAllSessions(): ManagedSession[] {\n return this.sessions;\n }\n\n async cancelSession(sessionId: string): Promise<void> {\n this.cancelSessionCalls.push(sessionId);\n }\n\n getResult(sessionId: string): Record<string, unknown> {\n const session = this.sessions.find((s) => s.sessionId === sessionId);\n if (!session) throw new Error(`Session not found: ${sessionId}`);\n return {\n sessionId: session.sessionId,\n projectDir: session.projectDir,\n projectName: session.projectName,\n status: session.status,\n durationMs: 300_000,\n cost: session.cost,\n recentEvents: [],\n pendingBlocker: null,\n error: null,\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Mock ChannelManager (unused by orchestrator directly, but required by deps)\n// ---------------------------------------------------------------------------\n\nclass MockChannelManager {}\n\n// ---------------------------------------------------------------------------\n// Mock Discord Message\n// ---------------------------------------------------------------------------\n\nfunction makeMessage(overrides: Partial<{\n authorId: string;\n bot: boolean;\n channelId: string;\n content: string;\n}>): DiscordMessageLike & { sentMessages: string[] } {\n const sentMessages: string[] = [];\n return {\n author: {\n id: overrides.authorId ?? 'owner-123',\n bot: overrides.bot ?? false,\n },\n channelId: overrides.channelId ?? 'control-channel-1',\n content: overrides.content ?? 'hello',\n channel: {\n send: async (content: string) => {\n sentMessages.push(content);\n },\n sendTyping: async () => {},\n },\n sentMessages,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Test Setup Factory\n// ---------------------------------------------------------------------------\n\nfunction makeOrchestrator(opts?: {\n client?: MockAnthropicClient;\n sessions?: ManagedSession[];\n projects?: ProjectInfo[];\n}) {\n const dir = tmpDir();\n cleanupDirs.push(dir);\n const logPath = join(dir, 'test.log');\n const logger = new Logger({ filePath: logPath, level: 'debug' });\n activeLoggers.push(logger);\n\n const sessionManager = new MockSessionManager();\n if (opts?.sessions) sessionManager.sessions = opts.sessions;\n\n const projects: ProjectInfo[] = opts?.projects ?? [\n { name: 'alpha', path: '/home/user/alpha', markers: ['git', 'node', 'gsd'], lastModified: Date.now() },\n { name: 'bravo', path: '/home/user/bravo', markers: ['git', 'rust'], lastModified: Date.now() },\n ];\n\n const config: OrchestratorConfig = {\n model: 'claude-sonnet-4-20250514',\n max_tokens: 4096,\n control_channel_id: 'control-channel-1',\n };\n\n const deps: OrchestratorDeps = {\n sessionManager: sessionManager as unknown as OrchestratorDeps['sessionManager'],\n channelManager: new MockChannelManager() as unknown as OrchestratorDeps['channelManager'],\n scanProjects: async () => projects,\n config,\n logger,\n ownerId: 'owner-123',\n };\n\n const mockClient = opts?.client ?? new MockAnthropicClient();\n const orchestrator = new Orchestrator(deps, mockClient as unknown as import('@anthropic-ai/sdk').default);\n\n return { orchestrator, mockClient, sessionManager, logger, logPath };\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ndescribe('Orchestrator', () => {\n // Clean up after each test so logger streams are flushed before dirs removed\n afterEach(async () => {\n await cleanupAll();\n });\n\n // ---- Tool definitions ----\n\n describe('tool definitions', () => {\n it('passes 5 tools to the Anthropic API', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ content: 'what can you do?' });\n await orchestrator.handleMessage(msg);\n\n assert.ok(mockClient.lastCreateParams);\n const tools = mockClient.lastCreateParams.tools as Array<{ name: string }>;\n assert.equal(tools.length, 5);\n\n const names = tools.map((t) => t.name).sort();\n assert.deepEqual(names, [\n 'get_session_detail',\n 'get_status',\n 'list_projects',\n 'start_session',\n 'stop_session',\n ]);\n });\n });\n\n // ---- list_projects tool ----\n\n describe('list_projects tool', () => {\n it('returns project list from scanProjects', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler('list_projects', {}, 'Here are your projects'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient });\n const msg = makeMessage({ content: 'list my projects' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(msg.sentMessages.length, 1);\n assert.equal(msg.sentMessages[0], 'Here are your projects');\n assert.equal(mockClient.createCallCount, 2);\n\n const finalMessages = mockClient.lastCreateParams?.messages as Array<{ role: string; content: unknown }>;\n const toolResultMessage = finalMessages.at(-1);\n assert.equal(toolResultMessage?.role, 'user');\n\n const toolResults = toolResultMessage?.content as Array<{\n type: string;\n tool_use_id: string;\n content: string;\n }>;\n assert.equal(toolResults.length, 1);\n assert.match(toolResults[0]!.tool_use_id, /^toolu_/);\n assert.equal(toolResults[0]!.type, 'tool_result');\n assert.equal(\n toolResults[0]!.content,\n JSON.stringify(\n [\n { name: 'alpha', path: '/home/user/alpha', markers: ['git', 'node', 'gsd'] },\n { name: 'bravo', path: '/home/user/bravo', markers: ['git', 'rust'] },\n ],\n null,\n 2,\n ),\n );\n });\n });\n\n // ---- start_session tool ----\n\n describe('start_session tool', () => {\n it('calls sessionManager.startSession and returns confirmation', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'start_session',\n { projectPath: '/home/user/alpha' },\n 'Started session for alpha',\n ),\n );\n const { orchestrator, sessionManager } = makeOrchestrator({ client: mockClient });\n const msg = makeMessage({ content: 'start alpha' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(sessionManager.startSessionCalls.length, 1);\n assert.equal(sessionManager.startSessionCalls[0]!.projectDir, '/home/user/alpha');\n assert.equal(msg.sentMessages[0], 'Started session for alpha');\n });\n });\n\n // ---- get_status tool ----\n\n describe('get_status tool', () => {\n it('returns formatted session status', async () => {\n const session = makeMockSession({ projectName: 'alpha', status: 'running' as SessionStatus });\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler('get_status', {}, 'Status: alpha is running'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient, sessions: [session] });\n const msg = makeMessage({ content: 'status' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(msg.sentMessages[0], 'Status: alpha is running');\n });\n\n it('handles empty session list', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler('get_status', {}, 'No sessions running'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient, sessions: [] });\n const msg = makeMessage({ content: 'status' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(msg.sentMessages[0], 'No sessions running');\n });\n });\n\n // ---- stop_session tool ----\n\n describe('stop_session tool', () => {\n it('stops session matched by sessionId', async () => {\n const session = makeMockSession({ sessionId: 'sess-abc', projectName: 'alpha' });\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'stop_session',\n { identifier: 'sess-abc' },\n 'Stopped alpha',\n ),\n );\n const { orchestrator, sessionManager } = makeOrchestrator({ client: mockClient, sessions: [session] });\n const msg = makeMessage({ content: 'stop sess-abc' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(sessionManager.cancelSessionCalls.length, 1);\n assert.equal(sessionManager.cancelSessionCalls[0], 'sess-abc');\n });\n\n it('fuzzy matches by project name', async () => {\n const session = makeMockSession({ sessionId: 'sess-xyz', projectName: 'my-big-project' });\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'stop_session',\n { identifier: 'big-project' },\n 'Stopped my-big-project',\n ),\n );\n const { orchestrator, sessionManager } = makeOrchestrator({ client: mockClient, sessions: [session] });\n const msg = makeMessage({ content: 'stop big project' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(sessionManager.cancelSessionCalls.length, 1);\n assert.equal(sessionManager.cancelSessionCalls[0], 'sess-xyz');\n });\n\n it('returns not-found for unmatched identifier', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'stop_session',\n { identifier: 'nonexistent' },\n 'No session found',\n ),\n );\n const { orchestrator, sessionManager } = makeOrchestrator({ client: mockClient, sessions: [] });\n const msg = makeMessage({ content: 'stop nonexistent' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(sessionManager.cancelSessionCalls.length, 0);\n });\n });\n\n // ---- get_session_detail tool ----\n\n describe('get_session_detail tool', () => {\n it('returns formatted session detail', async () => {\n const session = makeMockSession({ sessionId: 'sess-detail' });\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'get_session_detail',\n { sessionId: 'sess-detail' },\n 'Session details for my-project',\n ),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient, sessions: [session] });\n const msg = makeMessage({ content: 'detail sess-detail' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(msg.sentMessages[0], 'Session details for my-project');\n });\n });\n\n // ---- Message routing / auth guards ----\n\n describe('handleMessage routing', () => {\n it('ignores bot messages', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ bot: true, content: 'hello from bot' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(mockClient.createCallCount, 0);\n assert.equal(msg.sentMessages.length, 0);\n });\n\n it('ignores non-owner messages', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ authorId: 'stranger-456', content: 'hack the planet' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(mockClient.createCallCount, 0);\n assert.equal(msg.sentMessages.length, 0);\n });\n\n it('ignores messages from non-control channels', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ channelId: 'random-channel', content: 'hello' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(mockClient.createCallCount, 0);\n assert.equal(msg.sentMessages.length, 0);\n });\n\n it('ignores empty message content', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ content: ' ' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(mockClient.createCallCount, 0);\n });\n\n it('routes valid message through LLM and sends response', async () => {\n const { orchestrator, mockClient } = makeOrchestrator();\n const msg = makeMessage({ content: 'hello orchestrator' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(mockClient.createCallCount, 1);\n assert.equal(msg.sentMessages.length, 1);\n assert.equal(msg.sentMessages[0], 'Mock LLM response');\n });\n });\n\n // ---- Conversation history ----\n\n describe('conversation history', () => {\n it('accumulates user and assistant entries', async () => {\n const { orchestrator } = makeOrchestrator();\n\n await orchestrator.handleMessage(makeMessage({ content: 'first' }));\n await orchestrator.handleMessage(makeMessage({ content: 'second' }));\n\n const history = orchestrator.getHistory();\n assert.equal(history.length, 4); // 2 user + 2 assistant\n assert.equal(history[0]!.role, 'user');\n assert.equal(history[1]!.role, 'assistant');\n assert.equal(history[2]!.role, 'user');\n assert.equal(history[3]!.role, 'assistant');\n });\n\n it('trims to MAX_HISTORY (30) by removing oldest pairs', async () => {\n const { orchestrator } = makeOrchestrator();\n\n // Send 17 messages → 34 history entries (17 user + 17 assistant)\n // After trimming: should be ≤30\n for (let i = 0; i < 17; i++) {\n await orchestrator.handleMessage(makeMessage({ content: `msg-${i}` }));\n }\n\n const history = orchestrator.getHistory();\n assert.ok(history.length <= 30, `History length ${history.length} exceeds 30`);\n // Should have trimmed from the front — oldest entries gone\n // 34 entries → trim 2 at a time until ≤30 → 30 entries (trimmed 4)\n assert.equal(history.length, 30);\n });\n });\n\n // ---- Error handling ----\n\n describe('error handling', () => {\n it('sends error message to Discord when LLM API throws', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.errorHandler('API rate limit exceeded'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient });\n const msg = makeMessage({ content: 'hello' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(msg.sentMessages.length, 1);\n assert.ok(msg.sentMessages[0]!.includes('Something went wrong'));\n });\n\n it('appends error placeholder to history on LLM failure', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.errorHandler('Network error'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient });\n await orchestrator.handleMessage(makeMessage({ content: 'fail' }));\n\n const history = orchestrator.getHistory();\n assert.equal(history.length, 2); // user + error assistant\n assert.equal(history[1]!.role, 'assistant');\n assert.equal(history[1]!.content, '[error — see logs]');\n });\n });\n\n // ---- stop() ----\n\n describe('stop()', () => {\n it('clears conversation history and nulls client', async () => {\n const { orchestrator } = makeOrchestrator();\n\n await orchestrator.handleMessage(makeMessage({ content: 'hello' }));\n assert.ok(orchestrator.getHistory().length > 0);\n\n orchestrator.stop();\n assert.equal(orchestrator.getHistory().length, 0);\n });\n });\n\n // ---- Tool execution direct tests ----\n\n describe('tool execution (via agent loop)', () => {\n it('list_projects returns empty message when no projects', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler('list_projects', {}, 'No projects'),\n );\n const { orchestrator } = makeOrchestrator({ client: mockClient, projects: [] });\n const msg = makeMessage({ content: 'list' });\n await orchestrator.handleMessage(msg);\n\n // The second create call receives the tool result\n assert.equal(mockClient.createCallCount, 2);\n });\n\n it('start_session with optional command passes through', async () => {\n const mockClient = new MockAnthropicClient(\n MockAnthropicClient.toolThenTextHandler(\n 'start_session',\n { projectPath: '/p', command: '/gsd quick fix tests' },\n 'Started',\n ),\n );\n const { orchestrator, sessionManager } = makeOrchestrator({ client: mockClient });\n const msg = makeMessage({ content: 'start with custom command' });\n await orchestrator.handleMessage(msg);\n\n assert.equal(sessionManager.startSessionCalls.length, 1);\n assert.equal(sessionManager.startSessionCalls[0]!.command, '/gsd quick fix tests');\n });\n });\n\n});\n"]}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengsd/daemon",
3
- "version": "1.5.0-dev.553dc518",
3
+ "version": "1.5.0-dev.c4c8885f",
4
4
  "description": "GSD daemon — background process for project monitoring and Discord integration",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -31,9 +31,9 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@anthropic-ai/sdk": "^0.52.0",
34
- "@opengsd/contracts": "^1.5.0-dev.553dc518",
35
- "@opengsd/mcp-server": "^1.5.0-dev.553dc518",
36
- "@opengsd/rpc-client": "^1.5.0-dev.553dc518",
34
+ "@opengsd/contracts": "^1.5.0-dev.c4c8885f",
35
+ "@opengsd/mcp-server": "^1.5.0-dev.c4c8885f",
36
+ "@opengsd/rpc-client": "^1.5.0-dev.c4c8885f",
37
37
  "discord.js": "^14.25.1",
38
38
  "ws": "^8.20.0",
39
39
  "yaml": "^2.8.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gsd/agent-core",
3
- "version": "1.5.0-dev.553dc518",
3
+ "version": "1.5.0-dev.c4c8885f",
4
4
  "description": "GSD session orchestration layer on top of @gsd/pi-coding-agent",
5
5
  "type": "module",
6
6
  "gsd": {
@@ -25,9 +25,9 @@
25
25
  "test": "node --import ../../src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/*.test.ts src/**/*.test.ts"
26
26
  },
27
27
  "dependencies": {
28
- "@gsd/native": "^1.5.0-dev.553dc518",
29
- "@gsd/pi-agent-core": "^1.5.0-dev.553dc518",
30
- "@gsd/pi-ai": "^1.5.0-dev.553dc518",
31
- "@gsd/pi-coding-agent": "^1.5.0-dev.553dc518"
28
+ "@gsd/native": "^1.5.0-dev.c4c8885f",
29
+ "@gsd/pi-agent-core": "^1.5.0-dev.c4c8885f",
30
+ "@gsd/pi-ai": "^1.5.0-dev.c4c8885f",
31
+ "@gsd/pi-coding-agent": "^1.5.0-dev.c4c8885f"
32
32
  }
33
33
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gsd/agent-modes",
3
- "version": "1.5.0-dev.553dc518",
3
+ "version": "1.5.0-dev.c4c8885f",
4
4
  "description": "GSD run modes and CLI layer",
5
5
  "type": "module",
6
6
  "gsd": {
@@ -25,12 +25,12 @@
25
25
  "test": "node --import ../../src/resources/extensions/gsd/tests/resolve-ts.mjs --experimental-strip-types --test src/**/*.test.ts"
26
26
  },
27
27
  "dependencies": {
28
- "@gsd/agent-core": "^1.5.0-dev.553dc518",
29
- "@gsd/pi-agent-core": "^1.5.0-dev.553dc518",
30
- "@gsd/pi-ai": "^1.5.0-dev.553dc518",
31
- "@gsd/pi-coding-agent": "^1.5.0-dev.553dc518",
32
- "@gsd/pi-tui": "^1.5.0-dev.553dc518",
33
- "@opengsd/contracts": "^1.5.0-dev.553dc518",
28
+ "@gsd/agent-core": "^1.5.0-dev.c4c8885f",
29
+ "@gsd/pi-agent-core": "^1.5.0-dev.c4c8885f",
30
+ "@gsd/pi-ai": "^1.5.0-dev.c4c8885f",
31
+ "@gsd/pi-coding-agent": "^1.5.0-dev.c4c8885f",
32
+ "@gsd/pi-tui": "^1.5.0-dev.c4c8885f",
33
+ "@opengsd/contracts": "^1.5.0-dev.c4c8885f",
34
34
  "chalk": "^5.5.0"
35
35
  }
36
36
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengsd/mcp-server",
3
- "version": "1.5.0-dev.553dc518",
3
+ "version": "1.5.0-dev.c4c8885f",
4
4
  "description": "MCP server exposing GSD orchestration tools for compatible clients",
5
5
  "license": "MIT",
6
6
  "gsd": {
@@ -50,9 +50,9 @@
50
50
  "test": "pnpm run build:test && node --test dist/mcp-server.test.js dist/remote-questions.test.js dist/moonshot-tool-schema.test.js dist/pid-registry.test.js dist/probe-mode.test.js dist/stdio-watchdog.test.js dist/cli-runner.test.js dist/readers/graph.test.js dist/readers/paths.test.js dist/readers/readers.test.js"
51
51
  },
52
52
  "dependencies": {
53
- "@gsd/pi-ai": "^1.5.0-dev.553dc518",
54
- "@opengsd/contracts": "^1.5.0-dev.553dc518",
55
- "@opengsd/rpc-client": "^1.5.0-dev.553dc518",
53
+ "@gsd/pi-ai": "^1.5.0-dev.c4c8885f",
54
+ "@opengsd/contracts": "^1.5.0-dev.c4c8885f",
55
+ "@opengsd/rpc-client": "^1.5.0-dev.c4c8885f",
56
56
  "@modelcontextprotocol/sdk": "^1.27.1",
57
57
  "zod": "^4.0.0"
58
58
  },
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gsd/native",
3
- "version": "1.5.0-dev.553dc518",
3
+ "version": "1.5.0-dev.c4c8885f",
4
4
  "description": "Native Rust bindings for GSD — high-performance native modules via N-API",
5
5
  "type": "commonjs",
6
6
  "gsd": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gsd/pi-agent-core",
3
- "version": "1.5.0-dev.553dc518",
3
+ "version": "1.5.0-dev.c4c8885f",
4
4
  "description": "General-purpose agent with transport abstraction, state management, and attachment support",
5
5
  "type": "module",
6
6
  "gsd": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gsd/pi-ai",
3
- "version": "1.5.0-dev.553dc518",
3
+ "version": "1.5.0-dev.c4c8885f",
4
4
  "description": "Unified LLM API with automatic model discovery and provider configuration",
5
5
  "type": "module",
6
6
  "gsd": {
@@ -4,6 +4,15 @@ export interface PathMetadata {
4
4
  scope: SourceScope;
5
5
  origin: "package" | "top-level";
6
6
  baseDir?: string;
7
+ /**
8
+ * Marks a skill sourced from a foreign (non-GSD) ecosystem — the Claude
9
+ * kinds (`~/.claude/skills`, `<cwd>/.claude/skills`) and user-global
10
+ * `~/.agents/skills`. Foreign skills rank below bundled GSD user skills in
11
+ * `resourcePrecedenceRank` so bundled auto-mode skills win same-name
12
+ * collisions regardless of the foreign source's scope. Unset (falsy) for
13
+ * every non-skill resource and for native GSD/project skills.
14
+ */
15
+ foreign?: boolean;
7
16
  }
8
17
  export interface ResolvedResource {
9
18
  path: string;
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/core/package-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/core/package-manager.ts"],"names":[],"mappings":"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"}
@@ -28,6 +28,7 @@ import { CONFIG_DIR_NAME } from "../config.js";
28
28
  import { spawnProcess, spawnProcessSync } from "../utils/child-process.js";
29
29
  import { parseGitUrl } from "../utils/git.js";
30
30
  import { canonicalizePath, isLocalPath, markPathIgnoredByCloudSync, resolvePath } from "../utils/paths.js";
31
+ import { getSkillDirectories } from "./skill-directories.js";
31
32
  import { isStdoutTakenOver } from "./output-guard.js";
32
33
  const NETWORK_TIMEOUT_MS = 10000;
33
34
  const UPDATE_CHECK_CONCURRENCY = 4;
@@ -48,10 +49,20 @@ function isOfflineModeEnabled() {
48
49
  * 1 project + auto-discovered (source: "auto", scope: "project")
49
50
  * 2 user + settings entry (source: "local", scope: "user")
50
51
  * 3 user + auto-discovered (source: "auto", scope: "user")
51
- * 4 package resource (origin: "package")
52
+ * 4 foreign skill source (metadata.foreign — Claude / ~/.agents)
53
+ * 5 package resource (origin: "package")
54
+ *
55
+ * Foreign skills are ranked below bundled GSD user skills (rank 3) so that
56
+ * bundled auto-mode dependencies (handoff, decompose-into-slices, ...) win
57
+ * same-name collisions against `<cwd>/.claude/skills`, `~/.claude/skills`, and
58
+ * `~/.agents/skills`. This is deliberately independent of the foreign source's
59
+ * project/user scope: a project-scope `<cwd>/.claude/skills` must NOT shadow a
60
+ * bundled user-scope skill, so `foreign` short-circuits the scope-based rank.
52
61
  */
53
62
  function resourcePrecedenceRank(m) {
54
63
  if (m.origin === "package")
64
+ return 5;
65
+ if (m.foreign)
55
66
  return 4;
56
67
  const scopeBase = m.scope === "project" ? 0 : 2;
57
68
  return scopeBase + (m.source === "local" ? 0 : 1);
@@ -270,37 +281,6 @@ function collectSkillEntries(dir, mode, ignoreMatcher, rootDir) {
270
281
  function collectAutoSkillEntries(dir, mode) {
271
282
  return collectSkillEntries(dir, mode);
272
283
  }
273
- function findGitRepoRoot(startDir) {
274
- let dir = resolve(startDir);
275
- while (true) {
276
- if (existsSync(join(dir, ".git"))) {
277
- return dir;
278
- }
279
- const parent = dirname(dir);
280
- if (parent === dir) {
281
- return null;
282
- }
283
- dir = parent;
284
- }
285
- }
286
- function collectAncestorAgentsSkillDirs(startDir) {
287
- const skillDirs = [];
288
- const resolvedStartDir = resolve(startDir);
289
- const gitRepoRoot = findGitRepoRoot(resolvedStartDir);
290
- let dir = resolvedStartDir;
291
- while (true) {
292
- skillDirs.push(join(dir, ".agents", "skills"));
293
- if (gitRepoRoot && dir === gitRepoRoot) {
294
- break;
295
- }
296
- const parent = dirname(dir);
297
- if (parent === dir) {
298
- break;
299
- }
300
- dir = parent;
301
- }
302
- return skillDirs;
303
- }
304
284
  function collectAutoPromptEntries(dir) {
305
285
  const entries = [];
306
286
  if (!existsSync(dir))
@@ -1870,7 +1850,6 @@ export class DefaultPackageManager {
1870
1850
  themes: join(projectBaseDir, "themes"),
1871
1851
  };
1872
1852
  const userAgentsSkillsDir = join(getHomeDir(), ".agents", "skills");
1873
- const projectAgentsSkillDirs = collectAncestorAgentsSkillDirs(this.cwd).filter((dir) => resolve(dir) !== resolve(userAgentsSkillsDir));
1874
1853
  const addResources = (resourceType, paths, metadata, overrides, baseDir) => {
1875
1854
  const target = this.getTargetMap(accumulator, resourceType);
1876
1855
  for (const path of paths) {
@@ -1880,30 +1859,72 @@ export class DefaultPackageManager {
1880
1859
  };
1881
1860
  // Project extensions from .pi/
1882
1861
  addResources("extensions", collectAutoExtensionEntries(projectDirs.extensions), projectMetadata, projectOverrides.extensions, projectBaseDir);
1883
- // Project skills from .pi/
1884
- addResources("skills", collectAutoSkillEntries(projectDirs.skills, "pi"), projectMetadata, projectOverrides.skills, projectBaseDir);
1885
- // Project skills from .agents/ (each with its own baseDir)
1886
- for (const agentsSkillsDir of projectAgentsSkillDirs) {
1887
- const agentsBaseDir = dirname(agentsSkillsDir); // the .agents directory
1888
- const agentsMetadata = {
1889
- ...projectMetadata,
1890
- baseDir: agentsBaseDir,
1891
- };
1892
- addResources("skills", collectAutoSkillEntries(agentsSkillsDir, "agents"), agentsMetadata, projectOverrides.skills, agentsBaseDir);
1893
- }
1862
+ // Skills — sourced from the shared directory taxonomy (`./skill-directories.js`).
1863
+ // All six kinds are eligible for the catalog. `agents` vs `pi` mode is
1864
+ // derived from the kind (Claude skills parse identically to `.agents/skills`,
1865
+ // so they reuse the `agents` mode).
1866
+ //
1867
+ // Collision precedence is decided by `resourcePrecedenceRank` when
1868
+ // `toResolvedPaths` sorts the accumulated skills — NOT by taxonomy
1869
+ // enumeration order or this insertion order. That sort re-groups purely by
1870
+ // scope, so on its own it would float project-scope `<cwd>/.claude/skills`
1871
+ // (rank 1) above bundled user-scope `~/.gsd/agent/skills` (rank 3) and let a
1872
+ // stray project Claude skill shadow a bundled auto-mode skill. To prevent
1873
+ // that, foreign kinds (the Claude dirs + user-global `~/.agents/skills`) are
1874
+ // tagged `metadata.foreign`, which ranks them below bundled GSD so bundled
1875
+ // skills win same-name collisions. The two batches below only preserve
1876
+ // resource-add ordering relative to prompts/themes.
1877
+ const userAgentsSkillsResolved = resolve(userAgentsSkillsDir);
1878
+ const allSkillEntries = getSkillDirectories({
1879
+ cwd: this.cwd,
1880
+ gsdHome: dirname(globalBaseDir),
1881
+ }).filter((entry) => entry.kind === "gsd-project" ||
1882
+ entry.kind === "agents-project" ||
1883
+ entry.kind === "gsd-user" ||
1884
+ entry.kind === "agents-user" ||
1885
+ entry.kind === "claude-project" ||
1886
+ entry.kind === "claude-user");
1887
+ const addSkillEntries = (include) => {
1888
+ for (const entry of allSkillEntries) {
1889
+ if (!include(entry))
1890
+ continue;
1891
+ const baseMetadata = entry.scope === "project" ? projectMetadata : userMetadata;
1892
+ const overrides = entry.scope === "project" ? projectOverrides.skills : userOverrides.skills;
1893
+ // `~/.agents/skills` is excluded from the project (ancestor) walk
1894
+ // so it only loads once, as a user-scope skill.
1895
+ if (entry.scope === "project" && resolve(entry.path) === userAgentsSkillsResolved)
1896
+ continue;
1897
+ // `pi` mode is only for `.gsd/skills` (root-level .md files);
1898
+ // `.agents/skills` and `.claude/skills` use the `agents` mode.
1899
+ const mode = entry.kind === "gsd-project" || entry.kind === "gsd-user" ? "pi" : "agents";
1900
+ // Foreign (non-GSD) skill sources rank below bundled GSD so bundled
1901
+ // auto-mode skills win same-name collisions. The Claude kinds and
1902
+ // user-global `~/.agents/skills` are foreign; native GSD and
1903
+ // ancestor-walked project `.agents/skills` are not.
1904
+ const foreign = entry.kind === "claude-project" || entry.kind === "claude-user" || entry.kind === "agents-user";
1905
+ // Never mutate the shared base metadata object (reused by
1906
+ // prompts/themes); allocate a fresh object when we must diverge.
1907
+ let metadata;
1908
+ if (foreign) {
1909
+ metadata = { ...baseMetadata, baseDir: entry.baseDir, foreign: true };
1910
+ }
1911
+ else if (entry.baseDir === baseMetadata.baseDir) {
1912
+ metadata = baseMetadata;
1913
+ }
1914
+ else {
1915
+ metadata = { ...baseMetadata, baseDir: entry.baseDir };
1916
+ }
1917
+ addResources("skills", collectAutoSkillEntries(entry.path, mode), metadata, overrides, entry.baseDir);
1918
+ }
1919
+ };
1920
+ // Project + bundled + claude-project skills in taxonomy order.
1921
+ addSkillEntries((entry) => entry.kind !== "agents-user" && entry.kind !== "claude-user");
1894
1922
  addResources("prompts", collectAutoPromptEntries(projectDirs.prompts), projectMetadata, projectOverrides.prompts, projectBaseDir);
1895
1923
  addResources("themes", collectAutoThemeEntries(projectDirs.themes), projectMetadata, projectOverrides.themes, projectBaseDir);
1896
1924
  // User extensions from ~/.pi/agent/
1897
1925
  addResources("extensions", collectAutoExtensionEntries(userDirs.extensions), userMetadata, userOverrides.extensions, globalBaseDir);
1898
- // User skills from ~/.pi/agent/
1899
- addResources("skills", collectAutoSkillEntries(userDirs.skills, "pi"), userMetadata, userOverrides.skills, globalBaseDir);
1900
- // User skills from ~/.agents/ (with its own baseDir)
1901
- const userAgentsBaseDir = dirname(userAgentsSkillsDir);
1902
- const userAgentsMetadata = {
1903
- ...userMetadata,
1904
- baseDir: userAgentsBaseDir,
1905
- };
1906
- addResources("skills", collectAutoSkillEntries(userAgentsSkillsDir, "agents"), userAgentsMetadata, userOverrides.skills, userAgentsBaseDir);
1926
+ // Remaining user skills (~/.agents/skills, ~/.claude/skills).
1927
+ addSkillEntries((entry) => entry.kind === "agents-user" || entry.kind === "claude-user");
1907
1928
  addResources("prompts", collectAutoPromptEntries(userDirs.prompts), userMetadata, userOverrides.prompts, globalBaseDir);
1908
1929
  addResources("themes", collectAutoThemeEntries(userDirs.themes), userMetadata, userOverrides.themes, globalBaseDir);
1909
1930
  }