argustack 0.2.0 → 0.3.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 (546) hide show
  1. package/README.md +31 -115
  2. package/dist/adapters/board/board-sync.js +2 -2
  3. package/dist/adapters/board/board-sync.js.map +1 -1
  4. package/dist/adapters/board/md-parser.js +3 -3
  5. package/dist/adapters/board/md-parser.js.map +1 -1
  6. package/dist/adapters/board/skill-discovery.js +2 -2
  7. package/dist/adapters/board/skill-discovery.js.map +1 -1
  8. package/dist/adapters/board/skill-runner.js +2 -2
  9. package/dist/adapters/board/skill-runner.js.map +1 -1
  10. package/dist/adapters/board/store.d.ts.map +1 -1
  11. package/dist/adapters/board/store.js +11 -11
  12. package/dist/adapters/board/store.js.map +1 -1
  13. package/dist/adapters/csv/mapper.js +11 -11
  14. package/dist/adapters/csv/mapper.js.map +1 -1
  15. package/dist/adapters/csv/parser.d.ts.map +1 -1
  16. package/dist/adapters/csv/parser.js +8 -7
  17. package/dist/adapters/csv/parser.js.map +1 -1
  18. package/dist/adapters/csv/provider.js +4 -4
  19. package/dist/adapters/csv/provider.js.map +1 -1
  20. package/dist/adapters/db/client.js +2 -2
  21. package/dist/adapters/db/client.js.map +1 -1
  22. package/dist/adapters/db/index.js +1 -0
  23. package/dist/adapters/db/index.js.map +1 -1
  24. package/dist/adapters/db/mapper.js +1 -1
  25. package/dist/adapters/db/mapper.js.map +1 -1
  26. package/dist/adapters/db/provider.js +4 -4
  27. package/dist/adapters/db/provider.js.map +1 -1
  28. package/dist/adapters/db/sql-validator.js +2 -2
  29. package/dist/adapters/db/sql-validator.js.map +1 -1
  30. package/dist/adapters/docker/cli-docker-control.d.ts +13 -0
  31. package/dist/adapters/docker/cli-docker-control.d.ts.map +1 -0
  32. package/dist/adapters/docker/cli-docker-control.js +70 -0
  33. package/dist/adapters/docker/cli-docker-control.js.map +1 -0
  34. package/dist/adapters/docker/index.d.ts +2 -0
  35. package/dist/adapters/docker/index.d.ts.map +1 -0
  36. package/dist/adapters/docker/index.js +2 -0
  37. package/dist/adapters/docker/index.js.map +1 -0
  38. package/dist/adapters/git/mapper.js +1 -1
  39. package/dist/adapters/git/mapper.js.map +1 -1
  40. package/dist/adapters/git/provider.js +4 -4
  41. package/dist/adapters/git/provider.js.map +1 -1
  42. package/dist/adapters/github/mapper.js +3 -3
  43. package/dist/adapters/github/mapper.js.map +1 -1
  44. package/dist/adapters/github/provider.d.ts.map +1 -1
  45. package/dist/adapters/github/provider.js +2 -2
  46. package/dist/adapters/github/provider.js.map +1 -1
  47. package/dist/adapters/jira/mapper.js +4 -4
  48. package/dist/adapters/jira/mapper.js.map +1 -1
  49. package/dist/adapters/jira/provider.js +8 -8
  50. package/dist/adapters/jira/provider.js.map +1 -1
  51. package/dist/adapters/jira-proxy/client.js +4 -4
  52. package/dist/adapters/jira-proxy/client.js.map +1 -1
  53. package/dist/adapters/jira-proxy/config-loader.d.ts +9 -0
  54. package/dist/adapters/jira-proxy/config-loader.d.ts.map +1 -1
  55. package/dist/adapters/jira-proxy/config-loader.js +26 -3
  56. package/dist/adapters/jira-proxy/config-loader.js.map +1 -1
  57. package/dist/adapters/jira-proxy/index.d.ts +1 -1
  58. package/dist/adapters/jira-proxy/index.d.ts.map +1 -1
  59. package/dist/adapters/jira-proxy/index.js +1 -1
  60. package/dist/adapters/jira-proxy/index.js.map +1 -1
  61. package/dist/adapters/jira-proxy/mapper.js +2 -2
  62. package/dist/adapters/jira-proxy/mapper.js.map +1 -1
  63. package/dist/adapters/jira-proxy/provider.d.ts.map +1 -1
  64. package/dist/adapters/jira-proxy/provider.js +19 -8
  65. package/dist/adapters/jira-proxy/provider.js.map +1 -1
  66. package/dist/adapters/lmstudio/embedding-provider.js +4 -4
  67. package/dist/adapters/lmstudio/embedding-provider.js.map +1 -1
  68. package/dist/adapters/lsp/jsonrpc.js +1 -1
  69. package/dist/adapters/lsp/jsonrpc.js.map +1 -1
  70. package/dist/adapters/lsp/typescript-lsp.js +7 -7
  71. package/dist/adapters/lsp/typescript-lsp.js.map +1 -1
  72. package/dist/adapters/neo4j/client.js +2 -2
  73. package/dist/adapters/neo4j/client.js.map +1 -1
  74. package/dist/adapters/neo4j/graph-store.js +3 -3
  75. package/dist/adapters/neo4j/graph-store.js.map +1 -1
  76. package/dist/adapters/neo4j/mapper.js +4 -4
  77. package/dist/adapters/neo4j/mapper.js.map +1 -1
  78. package/dist/adapters/ollama/chat-llm.d.ts +24 -0
  79. package/dist/adapters/ollama/chat-llm.d.ts.map +1 -0
  80. package/dist/adapters/ollama/chat-llm.js +53 -0
  81. package/dist/adapters/ollama/chat-llm.js.map +1 -0
  82. package/dist/adapters/ollama/embedding-provider.d.ts +30 -0
  83. package/dist/adapters/ollama/embedding-provider.d.ts.map +1 -0
  84. package/dist/adapters/ollama/embedding-provider.js +124 -0
  85. package/dist/adapters/ollama/embedding-provider.js.map +1 -0
  86. package/dist/adapters/ollama/http-ollama-control.d.ts +24 -0
  87. package/dist/adapters/ollama/http-ollama-control.d.ts.map +1 -0
  88. package/dist/adapters/ollama/http-ollama-control.js +224 -0
  89. package/dist/adapters/ollama/http-ollama-control.js.map +1 -0
  90. package/dist/adapters/ollama/index.d.ts +6 -0
  91. package/dist/adapters/ollama/index.d.ts.map +1 -0
  92. package/dist/adapters/ollama/index.js +4 -0
  93. package/dist/adapters/ollama/index.js.map +1 -0
  94. package/dist/adapters/platform/index.d.ts +2 -0
  95. package/dist/adapters/platform/index.d.ts.map +1 -0
  96. package/dist/adapters/platform/index.js +2 -0
  97. package/dist/adapters/platform/index.js.map +1 -0
  98. package/dist/adapters/platform/node-platform-probe.d.ts +9 -0
  99. package/dist/adapters/platform/node-platform-probe.d.ts.map +1 -0
  100. package/dist/adapters/platform/node-platform-probe.js +88 -0
  101. package/dist/adapters/platform/node-platform-probe.js.map +1 -0
  102. package/dist/adapters/postgres/code-meta.js +13 -13
  103. package/dist/adapters/postgres/code-meta.js.map +1 -1
  104. package/dist/adapters/postgres/index.d.ts +2 -0
  105. package/dist/adapters/postgres/index.d.ts.map +1 -1
  106. package/dist/adapters/postgres/index.js +2 -0
  107. package/dist/adapters/postgres/index.js.map +1 -1
  108. package/dist/adapters/postgres/migrate-helpers.d.ts +43 -0
  109. package/dist/adapters/postgres/migrate-helpers.d.ts.map +1 -0
  110. package/dist/adapters/postgres/migrate-helpers.js +136 -0
  111. package/dist/adapters/postgres/migrate-helpers.js.map +1 -0
  112. package/dist/adapters/postgres/readiness-probe.d.ts +22 -0
  113. package/dist/adapters/postgres/readiness-probe.d.ts.map +1 -0
  114. package/dist/adapters/postgres/readiness-probe.js +47 -0
  115. package/dist/adapters/postgres/readiness-probe.js.map +1 -0
  116. package/dist/adapters/postgres/schema.d.ts +11 -1
  117. package/dist/adapters/postgres/schema.d.ts.map +1 -1
  118. package/dist/adapters/postgres/schema.js +159 -113
  119. package/dist/adapters/postgres/schema.js.map +1 -1
  120. package/dist/adapters/postgres/storage-commits.d.ts +13 -0
  121. package/dist/adapters/postgres/storage-commits.d.ts.map +1 -0
  122. package/dist/adapters/postgres/storage-commits.js +63 -0
  123. package/dist/adapters/postgres/storage-commits.js.map +1 -0
  124. package/dist/adapters/postgres/storage-dbschema.d.ts +14 -0
  125. package/dist/adapters/postgres/storage-dbschema.d.ts.map +1 -0
  126. package/dist/adapters/postgres/storage-dbschema.js +63 -0
  127. package/dist/adapters/postgres/storage-dbschema.js.map +1 -0
  128. package/dist/adapters/postgres/storage-graph.d.ts +18 -0
  129. package/dist/adapters/postgres/storage-graph.d.ts.map +1 -0
  130. package/dist/adapters/postgres/storage-graph.js +127 -0
  131. package/dist/adapters/postgres/storage-graph.js.map +1 -0
  132. package/dist/adapters/postgres/storage-issues.d.ts +26 -0
  133. package/dist/adapters/postgres/storage-issues.d.ts.map +1 -0
  134. package/dist/adapters/postgres/storage-issues.js +233 -0
  135. package/dist/adapters/postgres/storage-issues.js.map +1 -0
  136. package/dist/adapters/postgres/storage-prs.d.ts +15 -0
  137. package/dist/adapters/postgres/storage-prs.d.ts.map +1 -0
  138. package/dist/adapters/postgres/storage-prs.js +142 -0
  139. package/dist/adapters/postgres/storage-prs.js.map +1 -0
  140. package/dist/adapters/postgres/storage-query.d.ts +26 -0
  141. package/dist/adapters/postgres/storage-query.d.ts.map +1 -0
  142. package/dist/adapters/postgres/storage-query.js +74 -0
  143. package/dist/adapters/postgres/storage-query.js.map +1 -0
  144. package/dist/adapters/postgres/storage-search.d.ts +18 -0
  145. package/dist/adapters/postgres/storage-search.d.ts.map +1 -0
  146. package/dist/adapters/postgres/storage-search.js +90 -0
  147. package/dist/adapters/postgres/storage-search.js.map +1 -0
  148. package/dist/adapters/postgres/storage.d.ts +47 -31
  149. package/dist/adapters/postgres/storage.d.ts.map +1 -1
  150. package/dist/adapters/postgres/storage.js +86 -602
  151. package/dist/adapters/postgres/storage.js.map +1 -1
  152. package/dist/adapters/postgres/workspace-store.d.ts +26 -0
  153. package/dist/adapters/postgres/workspace-store.d.ts.map +1 -0
  154. package/dist/adapters/postgres/workspace-store.js +94 -0
  155. package/dist/adapters/postgres/workspace-store.js.map +1 -0
  156. package/dist/adapters/qdrant/client.js +1 -1
  157. package/dist/adapters/qdrant/client.js.map +1 -1
  158. package/dist/adapters/qdrant/mapper.d.ts.map +1 -1
  159. package/dist/adapters/qdrant/mapper.js +11 -4
  160. package/dist/adapters/qdrant/mapper.js.map +1 -1
  161. package/dist/adapters/qdrant/vector-store.d.ts +1 -0
  162. package/dist/adapters/qdrant/vector-store.d.ts.map +1 -1
  163. package/dist/adapters/qdrant/vector-store.js +40 -10
  164. package/dist/adapters/qdrant/vector-store.js.map +1 -1
  165. package/dist/adapters/tree-sitter/parser.d.ts.map +1 -1
  166. package/dist/adapters/tree-sitter/parser.js +12 -12
  167. package/dist/adapters/tree-sitter/parser.js.map +1 -1
  168. package/dist/adapters/voyage/embedding-provider.js +2 -2
  169. package/dist/adapters/voyage/embedding-provider.js.map +1 -1
  170. package/dist/cli/add/code.d.ts +3 -0
  171. package/dist/cli/add/code.d.ts.map +1 -0
  172. package/dist/cli/add/code.js +97 -0
  173. package/dist/cli/add/code.js.map +1 -0
  174. package/dist/cli/add/csv.d.ts +3 -0
  175. package/dist/cli/add/csv.d.ts.map +1 -0
  176. package/dist/cli/add/csv.js +26 -0
  177. package/dist/cli/add/csv.js.map +1 -0
  178. package/dist/cli/add/db.d.ts +3 -0
  179. package/dist/cli/add/db.d.ts.map +1 -0
  180. package/dist/cli/add/db.js +46 -0
  181. package/dist/cli/add/db.js.map +1 -0
  182. package/dist/cli/add/git.d.ts +3 -0
  183. package/dist/cli/add/git.d.ts.map +1 -0
  184. package/dist/cli/add/git.js +26 -0
  185. package/dist/cli/add/git.js.map +1 -0
  186. package/dist/cli/add/github.d.ts +3 -0
  187. package/dist/cli/add/github.d.ts.map +1 -0
  188. package/dist/cli/add/github.js +32 -0
  189. package/dist/cli/add/github.js.map +1 -0
  190. package/dist/cli/add/index.d.ts +3 -0
  191. package/dist/cli/add/index.d.ts.map +1 -0
  192. package/dist/cli/add/index.js +18 -0
  193. package/dist/cli/add/index.js.map +1 -0
  194. package/dist/cli/add/jira.d.ts +3 -0
  195. package/dist/cli/add/jira.d.ts.map +1 -0
  196. package/dist/cli/add/jira.js +45 -0
  197. package/dist/cli/add/jira.js.map +1 -0
  198. package/dist/cli/add/shared.d.ts +31 -0
  199. package/dist/cli/add/shared.d.ts.map +1 -0
  200. package/dist/cli/add/shared.js +102 -0
  201. package/dist/cli/add/shared.js.map +1 -0
  202. package/dist/cli/board-server.js +1 -1
  203. package/dist/cli/board-server.js.map +1 -1
  204. package/dist/cli/board.d.ts.map +1 -1
  205. package/dist/cli/board.js +11 -12
  206. package/dist/cli/board.js.map +1 -1
  207. package/dist/cli/code.d.ts.map +1 -1
  208. package/dist/cli/code.js +95 -193
  209. package/dist/cli/code.js.map +1 -1
  210. package/dist/cli/embed.d.ts.map +1 -1
  211. package/dist/cli/embed.js +21 -26
  212. package/dist/cli/embed.js.map +1 -1
  213. package/dist/cli/graph.d.ts.map +1 -1
  214. package/dist/cli/graph.js +37 -55
  215. package/dist/cli/graph.js.map +1 -1
  216. package/dist/cli/index.js +28 -25
  217. package/dist/cli/index.js.map +1 -1
  218. package/dist/cli/init/cleanup.d.ts +11 -0
  219. package/dist/cli/init/cleanup.d.ts.map +1 -0
  220. package/dist/cli/init/cleanup.js +39 -0
  221. package/dist/cli/init/cleanup.js.map +1 -0
  222. package/dist/cli/init/generators.js +27 -27
  223. package/dist/cli/init/generators.js.map +1 -1
  224. package/dist/cli/init/index.d.ts +0 -10
  225. package/dist/cli/init/index.d.ts.map +1 -1
  226. package/dist/cli/init/index.js +386 -354
  227. package/dist/cli/init/index.js.map +1 -1
  228. package/dist/cli/init/presenter.d.ts +30 -0
  229. package/dist/cli/init/presenter.d.ts.map +1 -0
  230. package/dist/cli/init/presenter.js +152 -0
  231. package/dist/cli/init/presenter.js.map +1 -0
  232. package/dist/cli/init/prompts.d.ts +28 -0
  233. package/dist/cli/init/prompts.d.ts.map +1 -0
  234. package/dist/cli/init/prompts.js +110 -0
  235. package/dist/cli/init/prompts.js.map +1 -0
  236. package/dist/cli/init/setup-csv.js +2 -2
  237. package/dist/cli/init/setup-csv.js.map +1 -1
  238. package/dist/cli/init/setup-db.d.ts.map +1 -1
  239. package/dist/cli/init/setup-db.js +17 -14
  240. package/dist/cli/init/setup-db.js.map +1 -1
  241. package/dist/cli/init/setup-git.js +16 -16
  242. package/dist/cli/init/setup-git.js.map +1 -1
  243. package/dist/cli/init/setup-github.d.ts.map +1 -1
  244. package/dist/cli/init/setup-github.js +7 -5
  245. package/dist/cli/init/setup-github.js.map +1 -1
  246. package/dist/cli/init/setup-jira.d.ts.map +1 -1
  247. package/dist/cli/init/setup-jira.js +11 -9
  248. package/dist/cli/init/setup-jira.js.map +1 -1
  249. package/dist/cli/init/types.d.ts +4 -0
  250. package/dist/cli/init/types.d.ts.map +1 -1
  251. package/dist/cli/init/types.js +4 -4
  252. package/dist/cli/init/types.js.map +1 -1
  253. package/dist/cli/mcp-install.d.ts +1 -1
  254. package/dist/cli/mcp-install.d.ts.map +1 -1
  255. package/dist/cli/mcp-install.js +10 -24
  256. package/dist/cli/mcp-install.js.map +1 -1
  257. package/dist/cli/migrate-to-hub-impl.d.ts +51 -0
  258. package/dist/cli/migrate-to-hub-impl.d.ts.map +1 -0
  259. package/dist/cli/migrate-to-hub-impl.js +171 -0
  260. package/dist/cli/migrate-to-hub-impl.js.map +1 -0
  261. package/dist/cli/migrate-to-hub.d.ts +3 -0
  262. package/dist/cli/migrate-to-hub.d.ts.map +1 -0
  263. package/dist/cli/migrate-to-hub.js +90 -0
  264. package/dist/cli/migrate-to-hub.js.map +1 -0
  265. package/dist/cli/push.d.ts.map +1 -1
  266. package/dist/cli/push.js +62 -65
  267. package/dist/cli/push.js.map +1 -1
  268. package/dist/cli/sources.d.ts +0 -7
  269. package/dist/cli/sources.d.ts.map +1 -1
  270. package/dist/cli/sources.js +47 -112
  271. package/dist/cli/sources.js.map +1 -1
  272. package/dist/cli/status.d.ts +0 -3
  273. package/dist/cli/status.d.ts.map +1 -1
  274. package/dist/cli/status.js +95 -70
  275. package/dist/cli/status.js.map +1 -1
  276. package/dist/cli/sync.d.ts +0 -10
  277. package/dist/cli/sync.d.ts.map +1 -1
  278. package/dist/cli/sync.js +186 -317
  279. package/dist/cli/sync.js.map +1 -1
  280. package/dist/cli/workspace/add.d.ts +3 -0
  281. package/dist/cli/workspace/add.d.ts.map +1 -0
  282. package/dist/cli/workspace/add.js +38 -0
  283. package/dist/cli/workspace/add.js.map +1 -0
  284. package/dist/cli/workspace/index.d.ts +3 -0
  285. package/dist/cli/workspace/index.d.ts.map +1 -0
  286. package/dist/cli/workspace/index.js +16 -0
  287. package/dist/cli/workspace/index.js.map +1 -0
  288. package/dist/cli/workspace/info.d.ts +3 -0
  289. package/dist/cli/workspace/info.d.ts.map +1 -0
  290. package/dist/cli/workspace/info.js +69 -0
  291. package/dist/cli/workspace/info.js.map +1 -0
  292. package/dist/cli/workspace/list.d.ts +3 -0
  293. package/dist/cli/workspace/list.d.ts.map +1 -0
  294. package/dist/cli/workspace/list.js +36 -0
  295. package/dist/cli/workspace/list.js.map +1 -0
  296. package/dist/cli/workspace/remove.d.ts +3 -0
  297. package/dist/cli/workspace/remove.d.ts.map +1 -0
  298. package/dist/cli/workspace/remove.js +43 -0
  299. package/dist/cli/workspace/remove.js.map +1 -0
  300. package/dist/cli/workspace/shared.d.ts +7 -0
  301. package/dist/cli/workspace/shared.d.ts.map +1 -0
  302. package/dist/cli/workspace/shared.js +17 -0
  303. package/dist/cli/workspace/shared.js.map +1 -0
  304. package/dist/cli/workspace/use.d.ts +3 -0
  305. package/dist/cli/workspace/use.d.ts.map +1 -0
  306. package/dist/cli/workspace/use.js +27 -0
  307. package/dist/cli/workspace/use.js.map +1 -0
  308. package/dist/code-intel/file-discovery.js +3 -3
  309. package/dist/code-intel/file-discovery.js.map +1 -1
  310. package/dist/code-intel/indexer.js +8 -8
  311. package/dist/code-intel/indexer.js.map +1 -1
  312. package/dist/code-intel/lsp-resolver.js +5 -5
  313. package/dist/code-intel/lsp-resolver.js.map +1 -1
  314. package/dist/code-intel/ranker.d.ts +14 -0
  315. package/dist/code-intel/ranker.d.ts.map +1 -1
  316. package/dist/code-intel/ranker.js +54 -0
  317. package/dist/code-intel/ranker.js.map +1 -1
  318. package/dist/code-intel/resolver.js +4 -4
  319. package/dist/code-intel/resolver.js.map +1 -1
  320. package/dist/code-intel/tsconfig-paths.js +2 -2
  321. package/dist/code-intel/tsconfig-paths.js.map +1 -1
  322. package/dist/code-intel/watcher.js +4 -4
  323. package/dist/code-intel/watcher.js.map +1 -1
  324. package/dist/core/board/board-column.value-object.js +1 -1
  325. package/dist/core/board/board-column.value-object.js.map +1 -1
  326. package/dist/core/board/pipeline.value-object.js +1 -1
  327. package/dist/core/board/pipeline.value-object.js.map +1 -1
  328. package/dist/core/board/skill-execution.entity.js +1 -1
  329. package/dist/core/board/skill-execution.entity.js.map +1 -1
  330. package/dist/core/board/task-title.value-object.js +1 -1
  331. package/dist/core/board/task-title.value-object.js.map +1 -1
  332. package/dist/core/ports/chat-llm.d.ts +36 -0
  333. package/dist/core/ports/chat-llm.d.ts.map +1 -0
  334. package/dist/core/ports/chat-llm.js +2 -0
  335. package/dist/core/ports/chat-llm.js.map +1 -0
  336. package/dist/core/ports/code-meta.d.ts +4 -0
  337. package/dist/core/ports/code-meta.d.ts.map +1 -1
  338. package/dist/core/ports/code-vector-store.d.ts +5 -0
  339. package/dist/core/ports/code-vector-store.d.ts.map +1 -1
  340. package/dist/core/ports/docker-control.d.ts +44 -0
  341. package/dist/core/ports/docker-control.d.ts.map +1 -0
  342. package/dist/core/ports/docker-control.js +8 -0
  343. package/dist/core/ports/docker-control.js.map +1 -0
  344. package/dist/core/ports/hub-readiness-probe.d.ts +22 -0
  345. package/dist/core/ports/hub-readiness-probe.d.ts.map +1 -0
  346. package/dist/core/ports/hub-readiness-probe.js +2 -0
  347. package/dist/core/ports/hub-readiness-probe.js.map +1 -0
  348. package/dist/core/ports/index.d.ts +4 -0
  349. package/dist/core/ports/index.d.ts.map +1 -1
  350. package/dist/core/ports/ollama-control.d.ts +61 -0
  351. package/dist/core/ports/ollama-control.d.ts.map +1 -0
  352. package/dist/core/ports/ollama-control.js +7 -0
  353. package/dist/core/ports/ollama-control.js.map +1 -0
  354. package/dist/core/ports/platform-probe.d.ts +47 -0
  355. package/dist/core/ports/platform-probe.d.ts.map +1 -0
  356. package/dist/core/ports/platform-probe.js +8 -0
  357. package/dist/core/ports/platform-probe.js.map +1 -0
  358. package/dist/core/ports/storage.d.ts +62 -29
  359. package/dist/core/ports/storage.d.ts.map +1 -1
  360. package/dist/core/ports/workspace-store.d.ts +52 -0
  361. package/dist/core/ports/workspace-store.d.ts.map +1 -0
  362. package/dist/core/ports/workspace-store.js +2 -0
  363. package/dist/core/ports/workspace-store.js.map +1 -0
  364. package/dist/core/types/index.d.ts +2 -0
  365. package/dist/core/types/index.d.ts.map +1 -1
  366. package/dist/core/types/init.d.ts +29 -0
  367. package/dist/core/types/init.d.ts.map +1 -0
  368. package/dist/core/types/init.js +2 -0
  369. package/dist/core/types/init.js.map +1 -0
  370. package/dist/core/types/workspace.d.ts +78 -0
  371. package/dist/core/types/workspace.d.ts.map +1 -0
  372. package/dist/core/types/workspace.js +2 -0
  373. package/dist/core/types/workspace.js.map +1 -0
  374. package/dist/mcp/helpers.d.ts +121 -30
  375. package/dist/mcp/helpers.d.ts.map +1 -1
  376. package/dist/mcp/helpers.js +240 -264
  377. package/dist/mcp/helpers.js.map +1 -1
  378. package/dist/mcp/server.d.ts.map +1 -1
  379. package/dist/mcp/server.js +43 -5
  380. package/dist/mcp/server.js.map +1 -1
  381. package/dist/mcp/tools/code-graph.d.ts.map +1 -1
  382. package/dist/mcp/tools/code-graph.js +109 -74
  383. package/dist/mcp/tools/code-graph.js.map +1 -1
  384. package/dist/mcp/tools/code-hybrid.d.ts.map +1 -1
  385. package/dist/mcp/tools/code-hybrid.js +75 -51
  386. package/dist/mcp/tools/code-hybrid.js.map +1 -1
  387. package/dist/mcp/tools/code-search.d.ts.map +1 -1
  388. package/dist/mcp/tools/code-search.js +32 -32
  389. package/dist/mcp/tools/code-search.js.map +1 -1
  390. package/dist/mcp/tools/database.d.ts.map +1 -1
  391. package/dist/mcp/tools/database.js +86 -97
  392. package/dist/mcp/tools/database.js.map +1 -1
  393. package/dist/mcp/tools/estimate.d.ts.map +1 -1
  394. package/dist/mcp/tools/estimate.js +106 -82
  395. package/dist/mcp/tools/estimate.js.map +1 -1
  396. package/dist/mcp/tools/graph.d.ts.map +1 -1
  397. package/dist/mcp/tools/graph.js +142 -157
  398. package/dist/mcp/tools/graph.js.map +1 -1
  399. package/dist/mcp/tools/issue.d.ts.map +1 -1
  400. package/dist/mcp/tools/issue.js +172 -172
  401. package/dist/mcp/tools/issue.js.map +1 -1
  402. package/dist/mcp/tools/push.d.ts.map +1 -1
  403. package/dist/mcp/tools/push.js +70 -100
  404. package/dist/mcp/tools/push.js.map +1 -1
  405. package/dist/mcp/tools/query.d.ts.map +1 -1
  406. package/dist/mcp/tools/query.js +187 -246
  407. package/dist/mcp/tools/query.js.map +1 -1
  408. package/dist/mcp/tools/search.d.ts.map +1 -1
  409. package/dist/mcp/tools/search.js +25 -22
  410. package/dist/mcp/tools/search.js.map +1 -1
  411. package/dist/mcp/tools/workspace.d.ts.map +1 -1
  412. package/dist/mcp/tools/workspace.js +120 -73
  413. package/dist/mcp/tools/workspace.js.map +1 -1
  414. package/dist/use-cases/build-graph.d.ts +1 -1
  415. package/dist/use-cases/build-graph.d.ts.map +1 -1
  416. package/dist/use-cases/build-graph.js +63 -50
  417. package/dist/use-cases/build-graph.js.map +1 -1
  418. package/dist/use-cases/code-search.d.ts +29 -5
  419. package/dist/use-cases/code-search.d.ts.map +1 -1
  420. package/dist/use-cases/code-search.js +98 -9
  421. package/dist/use-cases/code-search.js.map +1 -1
  422. package/dist/use-cases/embed.d.ts +1 -1
  423. package/dist/use-cases/embed.d.ts.map +1 -1
  424. package/dist/use-cases/embed.js +5 -5
  425. package/dist/use-cases/embed.js.map +1 -1
  426. package/dist/use-cases/index-code.js +2 -2
  427. package/dist/use-cases/index-code.js.map +1 -1
  428. package/dist/use-cases/init/bootstrap-hub.d.ts +55 -0
  429. package/dist/use-cases/init/bootstrap-hub.d.ts.map +1 -0
  430. package/dist/use-cases/init/bootstrap-hub.js +116 -0
  431. package/dist/use-cases/init/bootstrap-hub.js.map +1 -0
  432. package/dist/use-cases/init/check-dims-conflict.d.ts +33 -0
  433. package/dist/use-cases/init/check-dims-conflict.d.ts.map +1 -0
  434. package/dist/use-cases/init/check-dims-conflict.js +39 -0
  435. package/dist/use-cases/init/check-dims-conflict.js.map +1 -0
  436. package/dist/use-cases/init/check-hub-exists.d.ts +23 -0
  437. package/dist/use-cases/init/check-hub-exists.d.ts.map +1 -0
  438. package/dist/use-cases/init/check-hub-exists.js +39 -0
  439. package/dist/use-cases/init/check-hub-exists.js.map +1 -0
  440. package/dist/use-cases/init/check-ports.d.ts +18 -0
  441. package/dist/use-cases/init/check-ports.d.ts.map +1 -0
  442. package/dist/use-cases/init/check-ports.js +25 -0
  443. package/dist/use-cases/init/check-ports.js.map +1 -0
  444. package/dist/use-cases/init/check-versions.d.ts +37 -0
  445. package/dist/use-cases/init/check-versions.d.ts.map +1 -0
  446. package/dist/use-cases/init/check-versions.js +50 -0
  447. package/dist/use-cases/init/check-versions.js.map +1 -0
  448. package/dist/use-cases/init/clear-stale-active.d.ts +20 -0
  449. package/dist/use-cases/init/clear-stale-active.d.ts.map +1 -0
  450. package/dist/use-cases/init/clear-stale-active.js +26 -0
  451. package/dist/use-cases/init/clear-stale-active.js.map +1 -0
  452. package/dist/use-cases/init/ensure-embedding-model.d.ts +20 -0
  453. package/dist/use-cases/init/ensure-embedding-model.d.ts.map +1 -0
  454. package/dist/use-cases/init/ensure-embedding-model.js +24 -0
  455. package/dist/use-cases/init/ensure-embedding-model.js.map +1 -0
  456. package/dist/use-cases/init/ensure-ollama-running.d.ts +19 -0
  457. package/dist/use-cases/init/ensure-ollama-running.d.ts.map +1 -0
  458. package/dist/use-cases/init/ensure-ollama-running.js +24 -0
  459. package/dist/use-cases/init/ensure-ollama-running.js.map +1 -0
  460. package/dist/use-cases/init/health-check-existing-llm.d.ts +25 -0
  461. package/dist/use-cases/init/health-check-existing-llm.d.ts.map +1 -0
  462. package/dist/use-cases/init/health-check-existing-llm.js +42 -0
  463. package/dist/use-cases/init/health-check-existing-llm.js.map +1 -0
  464. package/dist/use-cases/init/install-ollama.d.ts +27 -0
  465. package/dist/use-cases/init/install-ollama.d.ts.map +1 -0
  466. package/dist/use-cases/init/install-ollama.js +51 -0
  467. package/dist/use-cases/init/install-ollama.js.map +1 -0
  468. package/dist/use-cases/init/probe-llm.d.ts +32 -0
  469. package/dist/use-cases/init/probe-llm.d.ts.map +1 -0
  470. package/dist/use-cases/init/probe-llm.js +42 -0
  471. package/dist/use-cases/init/probe-llm.js.map +1 -0
  472. package/dist/use-cases/init/resolve-hub-ports.d.ts +46 -0
  473. package/dist/use-cases/init/resolve-hub-ports.d.ts.map +1 -0
  474. package/dist/use-cases/init/resolve-hub-ports.js +77 -0
  475. package/dist/use-cases/init/resolve-hub-ports.js.map +1 -0
  476. package/dist/use-cases/init/validate-workspace-name.d.ts +26 -0
  477. package/dist/use-cases/init/validate-workspace-name.d.ts.map +1 -0
  478. package/dist/use-cases/init/validate-workspace-name.js +39 -0
  479. package/dist/use-cases/init/validate-workspace-name.js.map +1 -0
  480. package/dist/use-cases/init/wait-for-docker.d.ts +16 -0
  481. package/dist/use-cases/init/wait-for-docker.d.ts.map +1 -0
  482. package/dist/use-cases/init/wait-for-docker.js +16 -0
  483. package/dist/use-cases/init/wait-for-docker.js.map +1 -0
  484. package/dist/use-cases/init/write-config-env.d.ts +32 -0
  485. package/dist/use-cases/init/write-config-env.d.ts.map +1 -0
  486. package/dist/use-cases/init/write-config-env.js +118 -0
  487. package/dist/use-cases/init/write-config-env.js.map +1 -0
  488. package/dist/use-cases/move-task.js +2 -2
  489. package/dist/use-cases/move-task.js.map +1 -1
  490. package/dist/use-cases/pull-db.d.ts +1 -1
  491. package/dist/use-cases/pull-db.d.ts.map +1 -1
  492. package/dist/use-cases/pull-db.js +3 -3
  493. package/dist/use-cases/pull-db.js.map +1 -1
  494. package/dist/use-cases/pull-git.d.ts +1 -1
  495. package/dist/use-cases/pull-git.d.ts.map +1 -1
  496. package/dist/use-cases/pull-git.js +5 -5
  497. package/dist/use-cases/pull-git.js.map +1 -1
  498. package/dist/use-cases/pull-github.d.ts +1 -1
  499. package/dist/use-cases/pull-github.d.ts.map +1 -1
  500. package/dist/use-cases/pull-github.js +6 -6
  501. package/dist/use-cases/pull-github.js.map +1 -1
  502. package/dist/use-cases/pull.d.ts +1 -1
  503. package/dist/use-cases/pull.d.ts.map +1 -1
  504. package/dist/use-cases/pull.js +6 -6
  505. package/dist/use-cases/pull.js.map +1 -1
  506. package/dist/use-cases/push.d.ts +2 -2
  507. package/dist/use-cases/push.d.ts.map +1 -1
  508. package/dist/use-cases/push.js +8 -8
  509. package/dist/use-cases/push.js.map +1 -1
  510. package/dist/use-cases/register-code-project.d.ts +8 -0
  511. package/dist/use-cases/register-code-project.d.ts.map +1 -1
  512. package/dist/use-cases/register-code-project.js +8 -0
  513. package/dist/use-cases/register-code-project.js.map +1 -1
  514. package/dist/use-cases/watch-code.js +1 -1
  515. package/dist/use-cases/watch-code.js.map +1 -1
  516. package/dist/workspace/active-workspace.d.ts +26 -0
  517. package/dist/workspace/active-workspace.d.ts.map +1 -0
  518. package/dist/workspace/active-workspace.js +69 -0
  519. package/dist/workspace/active-workspace.js.map +1 -0
  520. package/dist/workspace/adf.d.ts.map +1 -1
  521. package/dist/workspace/adf.js +20 -19
  522. package/dist/workspace/adf.js.map +1 -1
  523. package/dist/workspace/config.d.ts +11 -0
  524. package/dist/workspace/config.d.ts.map +1 -1
  525. package/dist/workspace/config.js +76 -22
  526. package/dist/workspace/config.js.map +1 -1
  527. package/dist/workspace/hub-config.d.ts +74 -0
  528. package/dist/workspace/hub-config.d.ts.map +1 -0
  529. package/dist/workspace/hub-config.js +164 -0
  530. package/dist/workspace/hub-config.js.map +1 -0
  531. package/dist/workspace/registry.d.ts +23 -3
  532. package/dist/workspace/registry.d.ts.map +1 -1
  533. package/dist/workspace/registry.js +32 -14
  534. package/dist/workspace/registry.js.map +1 -1
  535. package/dist/workspace/resolver.d.ts +20 -18
  536. package/dist/workspace/resolver.d.ts.map +1 -1
  537. package/dist/workspace/resolver.js +100 -59
  538. package/dist/workspace/resolver.js.map +1 -1
  539. package/package.json +4 -2
  540. package/templates/hub-config.env +65 -0
  541. package/templates/hub-docker-compose.yml +88 -0
  542. package/templates/migrate-to-hub.sql +90 -0
  543. package/dist/cli/workspaces.d.ts +0 -3
  544. package/dist/cli/workspaces.d.ts.map +0 -1
  545. package/dist/cli/workspaces.js +0 -34
  546. package/dist/cli/workspaces.js.map +0 -1
@@ -1,23 +1,27 @@
1
1
  import { z } from 'zod/v4';
2
- import { loadWorkspace, createAdapters, textResponse, errorResponse, getErrorMessage, } from '../helpers.js';
2
+ import { loadWorkspace, createAdapters, textResponse, errorResponse, workspaceNotFoundResponse, getErrorMessage, hasText, ANNOTATIONS, } from '../helpers.js';
3
+ const workspaceIdParam = z.string().optional().describe('Workspace id or name (defaults to active workspace)');
3
4
  export function registerGraphTools(server) {
4
5
  server.registerTool('impact_analysis', {
5
- description: 'Analyze impact of changing a file or module. Returns connected issues, developers, PRs via knowledge graph. Requires graph data — run `argustack graph build` if results are empty. Use before refactoring to assess risk and identify who to consult.',
6
+ title: 'Knowledge-graph impact analysis',
7
+ description: 'Impact analysis for a file/module via knowledge graph (entities, developers, PRs).',
6
8
  inputSchema: {
7
- file_or_module: z.string().describe('File path or module name (e.g. "src/adapters/payment", "payment")'),
8
- depth: z.number().optional().describe('Graph traversal depth (default: 2)'),
9
+ workspace_id: workspaceIdParam,
10
+ file_or_module: z.string().describe('File path or module name'),
11
+ depth: z.number().optional().describe('Traversal depth (default 2)'),
9
12
  },
10
- }, async ({ file_or_module: target, depth }) => {
11
- const ws = loadWorkspace();
13
+ annotations: ANNOTATIONS.READ_ONLY,
14
+ }, async ({ workspace_id: workspaceIdInput, file_or_module: target, depth }) => {
15
+ const ws = await loadWorkspace(workspaceIdInput);
12
16
  if (!ws.ok) {
13
- return errorResponse(`Workspace not found: ${ws.reason}`);
17
+ return workspaceNotFoundResponse(ws.reason);
14
18
  }
15
- const { storage } = await createAdapters(ws.root);
19
+ const { storage, workspaceId } = await createAdapters(ws.workspaceId);
16
20
  try {
17
21
  await storage.initialize();
18
- const result = await storage.queryGraph(target, depth ?? 2);
22
+ const result = await storage.queryGraph(workspaceId, target, depth ?? 2);
19
23
  if (result.entities.length === 0) {
20
- return textResponse(`No graph data for "${target}". Run "argustack graph build" first.`);
24
+ return textResponse(`No graph data for "${target}". Run "argustack graph build --workspace ${workspaceId}".`);
21
25
  }
22
26
  const issues = result.entities.filter((e) => e.type === 'issue');
23
27
  const developers = result.entities.filter((e) => e.type === 'developer');
@@ -56,31 +60,32 @@ export function registerGraphTools(server) {
56
60
  }
57
61
  lines.push('');
58
62
  }
59
- await storage.close();
60
63
  return textResponse(lines.join('\n'));
61
64
  }
62
65
  catch (err) {
63
- await storage.close();
64
66
  return errorResponse(`Impact analysis failed: ${getErrorMessage(err)}`);
65
67
  }
66
68
  });
67
69
  server.registerTool('developer_expertise', {
68
- description: 'Find developers who know a specific area. Ranks by commits, reviews, issue assignments via knowledge graph. If no Git data synced, falls back to Jira assignee-based ranking. Run `argustack graph build` if results are empty.',
70
+ title: 'Developer expertise ranking',
71
+ description: 'Rank developers for a topic via knowledge graph.',
69
72
  inputSchema: {
70
- area: z.string().describe('Topic, module, or component name (e.g. "payment", "authentication")'),
71
- limit: z.number().optional().describe('Max developers to return (default: 10)'),
73
+ workspace_id: workspaceIdParam,
74
+ area: z.string(),
75
+ limit: z.number().optional(),
72
76
  },
73
- }, async ({ area, limit }) => {
74
- const ws = loadWorkspace();
77
+ annotations: ANNOTATIONS.READ_ONLY,
78
+ }, async ({ workspace_id: workspaceIdInput, area, limit }) => {
79
+ const ws = await loadWorkspace(workspaceIdInput);
75
80
  if (!ws.ok) {
76
- return errorResponse(`Workspace not found: ${ws.reason}`);
81
+ return workspaceNotFoundResponse(ws.reason);
77
82
  }
78
- const { storage } = await createAdapters(ws.root);
83
+ const { storage, workspaceId } = await createAdapters(ws.workspaceId);
79
84
  try {
80
85
  await storage.initialize();
81
- const result = await storage.queryGraph(area, 2);
86
+ const result = await storage.queryGraph(workspaceId, area, 2);
82
87
  if (result.entities.length === 0) {
83
- return textResponse(`No graph data for "${area}". Run "argustack graph build" first.`);
88
+ return textResponse(`No graph data for "${area}".`);
84
89
  }
85
90
  const developers = result.entities.filter((e) => e.type === 'developer');
86
91
  const ranked = developers.map((dev) => {
@@ -90,80 +95,73 @@ export function registerGraphTools(server) {
90
95
  const assigned = rels.filter((r) => r.type === 'assigned_to').length;
91
96
  return { name: dev.name, total: rels.length, commits, reviews, assigned };
92
97
  }).sort((a, b) => b.total - a.total).slice(0, limit ?? 10);
93
- const lines = [
94
- `# Developer Expertise: ${area}`,
95
- '',
96
- ];
98
+ const lines = [`# Developer Expertise: ${area}`, ''];
97
99
  for (let i = 0; i < ranked.length; i++) {
98
100
  const dev = ranked[i];
99
- if (!dev) {
101
+ if (dev === undefined) {
100
102
  continue;
101
103
  }
102
104
  lines.push(`${String(i + 1)}. **${dev.name}** — ${String(dev.commits)} commits, ${String(dev.reviews)} reviews, ${String(dev.assigned)} assignments`);
103
105
  }
104
- await storage.close();
105
106
  return textResponse(lines.join('\n'));
106
107
  }
107
108
  catch (err) {
108
- await storage.close();
109
109
  return errorResponse(`Developer expertise failed: ${getErrorMessage(err)}`);
110
110
  }
111
111
  });
112
112
  server.registerTool('related_issues', {
113
- description: 'Find issues related to a given issue via knowledge graph traversal — through commits, files, PRs, developers. Discovers connections beyond explicit Jira links.',
113
+ title: 'Related issues (graph)',
114
+ description: 'Issues related to a given issue via knowledge graph traversal.',
114
115
  inputSchema: {
115
- issue_key: z.string().describe('Issue key (e.g. "ORG-16999")'),
116
- depth: z.number().optional().describe('Traversal depth (default: 3)'),
116
+ workspace_id: workspaceIdParam,
117
+ issue_key: z.string(),
118
+ depth: z.number().optional(),
117
119
  },
118
- }, async ({ issue_key: issueKey, depth }) => {
119
- const ws = loadWorkspace();
120
+ annotations: ANNOTATIONS.READ_ONLY,
121
+ }, async ({ workspace_id: workspaceIdInput, issue_key: issueKey, depth }) => {
122
+ const ws = await loadWorkspace(workspaceIdInput);
120
123
  if (!ws.ok) {
121
- return errorResponse(`Workspace not found: ${ws.reason}`);
124
+ return workspaceNotFoundResponse(ws.reason);
122
125
  }
123
- const { storage } = await createAdapters(ws.root);
126
+ const { storage, workspaceId } = await createAdapters(ws.workspaceId);
124
127
  try {
125
128
  await storage.initialize();
126
- const result = await storage.queryGraph(issueKey, depth ?? 3);
129
+ const result = await storage.queryGraph(workspaceId, issueKey, depth ?? 3);
127
130
  const related = result.entities.filter((e) => e.type === 'issue' && e.name !== issueKey);
128
131
  if (related.length === 0) {
129
- return textResponse(`No related issues found for ${issueKey}. Run "argustack graph build" first.`);
132
+ return textResponse(`No related issues for ${issueKey}.`);
130
133
  }
131
- const lines = [
132
- `# Related Issues: ${issueKey}`,
133
- `Found ${String(related.length)} related issue(s)`,
134
- '',
135
- ];
134
+ const lines = [`# Related Issues: ${issueKey}`, `Found ${String(related.length)} related issue(s)`, ''];
136
135
  for (const issue of related.slice(0, 30)) {
137
136
  const props = issue.properties;
138
137
  const source = result.relationships.some((r) => (r.sourceId === issue.id || r.targetId === issue.id) && r.source === 'claude') ? ' (semantic)' : '';
139
138
  lines.push(`- **${issue.name}**${source} — ${typeof props['status'] === 'string' ? props['status'] : '?'} | ${typeof props['summary'] === 'string' ? props['summary'] : ''}`);
140
139
  }
141
- await storage.close();
142
140
  return textResponse(lines.join('\n'));
143
141
  }
144
142
  catch (err) {
145
- await storage.close();
146
143
  return errorResponse(`Related issues failed: ${getErrorMessage(err)}`);
147
144
  }
148
145
  });
149
146
  server.registerTool('code_dependencies', {
150
- description: 'Show code dependencies for a file or module — co-changed files (coupling), imports, package dependencies. Based on knowledge graph data.',
147
+ title: 'Code dependencies (graph)',
148
+ description: 'Code dependencies for a file/module.',
151
149
  inputSchema: {
152
- file_or_module: z.string().describe('File path or module name'),
153
- depth: z.number().optional().describe('Traversal depth (default: 2)'),
150
+ workspace_id: workspaceIdParam,
151
+ file_or_module: z.string(),
152
+ depth: z.number().optional(),
154
153
  },
155
- }, async ({ file_or_module: target, depth }) => {
156
- const ws = loadWorkspace();
154
+ annotations: ANNOTATIONS.READ_ONLY,
155
+ }, async ({ workspace_id: workspaceIdInput, file_or_module: target, depth }) => {
156
+ const ws = await loadWorkspace(workspaceIdInput);
157
157
  if (!ws.ok) {
158
- return errorResponse(`Workspace not found: ${ws.reason}`);
158
+ return workspaceNotFoundResponse(ws.reason);
159
159
  }
160
- const { storage } = await createAdapters(ws.root);
160
+ const { storage, workspaceId } = await createAdapters(ws.workspaceId);
161
161
  try {
162
162
  await storage.initialize();
163
- const result = await storage.queryGraph(target, depth ?? 2);
164
- const coChanges = result.relationships
165
- .filter((r) => r.type === 'co_changes')
166
- .sort((a, b) => b.weight - a.weight);
163
+ const result = await storage.queryGraph(workspaceId, target, depth ?? 2);
164
+ const coChanges = result.relationships.filter((r) => r.type === 'co_changes').sort((a, b) => b.weight - a.weight);
167
165
  const imports = result.relationships.filter((r) => r.type === 'imports');
168
166
  const pkgDeps = result.relationships.filter((r) => r.type === 'depends_on_pkg');
169
167
  const lines = [`# Code Dependencies: ${target}`, ''];
@@ -171,7 +169,7 @@ export function registerGraphTools(server) {
171
169
  lines.push('## Co-changed Modules (coupling)');
172
170
  for (const rel of coChanges.slice(0, 15)) {
173
171
  const other = result.entities.find((e) => e.id === rel.sourceId || e.id === rel.targetId);
174
- if (other) {
172
+ if (other !== undefined) {
175
173
  lines.push(`- ${other.name} (${String(rel.weight)}x together)`);
176
174
  }
177
175
  }
@@ -181,7 +179,7 @@ export function registerGraphTools(server) {
181
179
  lines.push('## Imports');
182
180
  for (const rel of imports.slice(0, 20)) {
183
181
  const importedModule = result.entities.find((e) => e.id === rel.targetId);
184
- if (importedModule) {
182
+ if (importedModule !== undefined) {
185
183
  lines.push(`- ${importedModule.name}`);
186
184
  }
187
185
  }
@@ -191,39 +189,39 @@ export function registerGraphTools(server) {
191
189
  lines.push('## Package Dependencies');
192
190
  for (const rel of pkgDeps.slice(0, 20)) {
193
191
  const pkg = result.entities.find((e) => e.id === rel.targetId);
194
- if (pkg) {
192
+ if (pkg !== undefined) {
195
193
  lines.push(`- ${pkg.name}`);
196
194
  }
197
195
  }
198
196
  lines.push('');
199
197
  }
200
198
  if (coChanges.length === 0 && imports.length === 0 && pkgDeps.length === 0) {
201
- await storage.close();
202
- return textResponse(`No code dependency data for "${target}". Run "argustack graph build" first.`);
199
+ return textResponse(`No code dependency data for "${target}".`);
203
200
  }
204
- await storage.close();
205
201
  return textResponse(lines.join('\n'));
206
202
  }
207
203
  catch (err) {
208
- await storage.close();
209
204
  return errorResponse(`Code dependencies failed: ${getErrorMessage(err)}`);
210
205
  }
211
206
  });
212
207
  server.registerTool('business_context', {
213
- description: 'Show business context for a topic — business processes, features, related issues. Based on semantic graph built by Claude. If graph is empty, falls back to keyword search across issues. Run `build_business_graph` first for richer results.',
208
+ title: 'Business context (graph)',
209
+ description: 'Business context for a topic from the workspace knowledge graph.',
214
210
  inputSchema: {
215
- topic: z.string().describe('Business topic (e.g. "refund", "payment", "onboarding")'),
216
- depth: z.number().optional().describe('Traversal depth (default: 2)'),
211
+ workspace_id: workspaceIdParam,
212
+ topic: z.string(),
213
+ depth: z.number().optional(),
217
214
  },
218
- }, async ({ topic, depth }) => {
219
- const ws = loadWorkspace();
215
+ annotations: ANNOTATIONS.READ_ONLY,
216
+ }, async ({ workspace_id: workspaceIdInput, topic, depth }) => {
217
+ const ws = await loadWorkspace(workspaceIdInput);
220
218
  if (!ws.ok) {
221
- return errorResponse(`Workspace not found: ${ws.reason}`);
219
+ return workspaceNotFoundResponse(ws.reason);
222
220
  }
223
- const { storage } = await createAdapters(ws.root);
221
+ const { storage, workspaceId } = await createAdapters(ws.workspaceId);
224
222
  try {
225
223
  await storage.initialize();
226
- const result = await storage.queryGraph(topic, depth ?? 2);
224
+ const result = await storage.queryGraph(workspaceId, topic, depth ?? 2);
227
225
  const processes = result.entities.filter((e) => e.type === 'business_process');
228
226
  const features = result.entities.filter((e) => e.type === 'feature');
229
227
  const issues = result.entities.filter((e) => e.type === 'issue');
@@ -257,148 +255,137 @@ export function registerGraphTools(server) {
257
255
  lines.push('');
258
256
  }
259
257
  if (processes.length === 0 && features.length === 0 && issues.length === 0) {
260
- await storage.close();
261
- return textResponse('No business context for "' + topic + '". Run `build_business_graph` to have Claude analyze issue descriptions.');
258
+ return textResponse(`No business context for "${topic}". Run \`build_business_graph\`.`);
262
259
  }
263
- await storage.close();
264
260
  return textResponse(lines.join('\n'));
265
261
  }
266
262
  catch (err) {
267
- await storage.close();
268
263
  return errorResponse(`Business context failed: ${getErrorMessage(err)}`);
269
264
  }
270
265
  });
271
266
  server.registerTool('build_business_graph', {
272
- description: 'Analyze synced issues to discover business processes and features. Returns entities and suggested relationships. NEXT STEP: review the results, then call add_relationship for each connection you confirm. Call add_observation to annotate entities with business context. No external API cost.',
267
+ title: 'Build business graph',
268
+ description: 'Analyse issues to discover business processes/features for further enrichment.',
273
269
  inputSchema: {
274
- project: z.string().optional().describe('Project key to analyze (default: all)'),
275
- batch_size: z.number().optional().describe('Issues per batch (default: 50)'),
270
+ workspace_id: workspaceIdParam,
271
+ project: z.string().optional(),
272
+ batch_size: z.number().optional(),
276
273
  },
277
- }, async ({ project, batch_size: batchSize }) => {
278
- const ws = loadWorkspace();
274
+ annotations: ANNOTATIONS.LOCAL_WRITE,
275
+ }, async ({ workspace_id: workspaceIdInput, project, batch_size: batchSize }) => {
276
+ const ws = await loadWorkspace(workspaceIdInput);
279
277
  if (!ws.ok) {
280
- return errorResponse(`Workspace not found: ${ws.reason}`);
278
+ return workspaceNotFoundResponse(ws.reason);
281
279
  }
282
- const { storage } = await createAdapters(ws.root);
280
+ const { storage, workspaceId } = await createAdapters(ws.workspaceId);
283
281
  try {
284
282
  await storage.initialize();
285
- const projectFilter = project ? `WHERE project_key = $1` : '';
286
- const params = project ? [project] : [];
287
- const result = await storage.query(`SELECT issue_key, summary, description, issue_type, status FROM issues ${projectFilter} ORDER BY issue_key LIMIT ${String(batchSize ?? 50)}`, params);
283
+ const projectFilter = hasText(project) ? `AND project_key = $2` : '';
284
+ const params = hasText(project) ? [project] : [];
285
+ const result = await storage.queryForWorkspace(workspaceId, `SELECT issue_key, summary, description, issue_type, status FROM issues
286
+ WHERE workspace_id = $1 ${projectFilter}
287
+ ORDER BY issue_key LIMIT ${String(batchSize ?? 50)}`, params);
288
288
  if (result.rows.length === 0) {
289
- await storage.close();
290
- return textResponse('No issues found. Run `argustack sync jira` first.');
289
+ return textResponse('No issues found. Run `argustack sync` first.');
291
290
  }
292
291
  const issueList = result.rows.map((r) => {
293
292
  const desc = r['description'] ?? '';
294
- const preview = desc.length > 200 ? desc.slice(0, 200) + '...' : desc;
293
+ const preview = desc.length > 200 ? `${desc.slice(0, 200)}...` : desc;
295
294
  return `**${r['issue_key']}** [${r['issue_type']}] ${r['summary']}\n${preview}`;
296
295
  }).join('\n\n');
297
- await storage.close();
298
296
  return textResponse([
299
- `# Business Graph Analysis`,
300
- `Analyzed ${String(result.rows.length)} issues. Review and use add_relationship to save connections.`,
301
- '',
302
- '## Instructions',
303
- 'Read the issues below. Identify:',
304
- '1. **Business Processes** (e.g. "Refund Flow", "ACH Processing", "User Onboarding")',
305
- '2. **Features** (e.g. "Payment Redistribution", "LOC Account Management")',
306
- '3. Which issues belong to which process/feature',
307
- '4. Which processes affect each other',
308
- '',
309
- 'Then call `add_relationship` for each connection found.',
310
- 'Call `add_observation` to record important business knowledge.',
311
- '',
312
- '---',
297
+ `# Business Graph Analysis — workspace ${workspaceId}`,
298
+ `Analysed ${String(result.rows.length)} issues. Use add_relationship to save connections.`,
313
299
  '',
300
+ '---', '',
314
301
  issueList,
315
302
  ].join('\n'));
316
303
  }
317
304
  catch (err) {
318
- await storage.close();
319
305
  return errorResponse(`Build business graph failed: ${getErrorMessage(err)}`);
320
306
  }
321
307
  });
322
308
  server.registerTool('add_relationship', {
323
- description: 'Add a relationship between two entities in the knowledge graph. Use after build_business_graph to save confirmed connections. Types: implements, depends_on, related_to, caused_by, co_changes, root_causes. Marked source=claude — survives graph rebuild.',
309
+ title: 'Add graph relationship',
310
+ description: 'Add a relationship between two graph entities (marked source=claude).',
324
311
  inputSchema: {
325
- source_name: z.string().describe('Source entity name (e.g. "Refund Flow")'),
326
- source_type: z.string().describe('Source entity type (e.g. "business_process", "feature", "issue", "developer", "module")'),
327
- target_name: z.string().describe('Target entity name'),
328
- target_type: z.string().describe('Target entity type'),
329
- relationship_type: z.string().describe('Relationship type (e.g. "affects", "part_of_process", "implements_feature", "depends_on", "related_to")'),
330
- description: z.string().optional().describe('Description of the relationship'),
312
+ workspace_id: workspaceIdParam,
313
+ source_name: z.string(),
314
+ source_type: z.string(),
315
+ target_name: z.string(),
316
+ target_type: z.string(),
317
+ relationship_type: z.string(),
318
+ description: z.string().optional(),
331
319
  },
332
- }, async ({ source_name: srcName, source_type: srcType, target_name: tgtName, target_type: tgtType, relationship_type: relType, description: desc }) => {
333
- const ws = loadWorkspace();
320
+ annotations: ANNOTATIONS.LOCAL_WRITE,
321
+ }, async ({ workspace_id: workspaceIdInput, source_name: srcName, source_type: srcType, target_name: tgtName, target_type: tgtType, relationship_type: relType, description: desc }) => {
322
+ const ws = await loadWorkspace(workspaceIdInput);
334
323
  if (!ws.ok) {
335
- return errorResponse(`Workspace not found: ${ws.reason}`);
324
+ return workspaceNotFoundResponse(ws.reason);
336
325
  }
337
- const { storage } = await createAdapters(ws.root);
326
+ const { storage, workspaceId } = await createAdapters(ws.workspaceId);
338
327
  try {
339
328
  await storage.initialize();
340
- await storage.saveGraphEntities([
329
+ await storage.saveGraphEntities(workspaceId, [
341
330
  { name: srcName, type: srcType, properties: {} },
342
331
  { name: tgtName, type: tgtType, properties: {} },
343
332
  ]);
344
- const entityResult = await storage.query('SELECT id, name, type FROM graph_entities WHERE (name = $1 AND type = $2) OR (name = $3 AND type = $4)', [srcName, srcType, tgtName, tgtType]);
333
+ const entityResult = await storage.queryForWorkspace(workspaceId, `SELECT id, name, type FROM graph_entities WHERE workspace_id = $1 AND ((name = $2 AND type = $3) OR (name = $4 AND type = $5))`, [srcName, srcType, tgtName, tgtType]);
345
334
  const srcEntity = entityResult.rows.find((r) => r['name'] === srcName && r['type'] === srcType);
346
335
  const tgtEntity = entityResult.rows.find((r) => r['name'] === tgtName && r['type'] === tgtType);
347
- if (!srcEntity || !tgtEntity) {
348
- await storage.close();
336
+ if (srcEntity === undefined || tgtEntity === undefined) {
349
337
  return errorResponse('Failed to create entities');
350
338
  }
351
- await storage.saveGraphRelationships([{
339
+ await storage.saveGraphRelationships(workspaceId, [{
352
340
  sourceId: srcEntity['id'],
353
341
  targetId: tgtEntity['id'],
354
342
  type: relType,
355
343
  weight: 1,
356
344
  source: 'claude',
357
- properties: desc ? { description: desc } : {},
345
+ properties: hasText(desc) ? { description: desc } : {},
358
346
  }]);
359
- await storage.close();
360
- return textResponse(`Added: ${srcName} —[${relType}]→ ${tgtName}${desc ? ` (${desc})` : ''}`);
347
+ return textResponse(`Added: ${srcName} —[${relType}]→ ${tgtName}${hasText(desc) ? ` (${desc})` : ''}`);
361
348
  }
362
349
  catch (err) {
363
- await storage.close();
364
350
  return errorResponse(`Add relationship failed: ${getErrorMessage(err)}`);
365
351
  }
366
352
  });
367
353
  server.registerTool('root_cause_analysis', {
368
- description: 'Trace root cause chain for a bug. Returns confirmed causes (from Jira issue links), probable causes (from git timeline — PRs merged before bug creation that touched same modules), and Claude-identified causes. Requires graph data — run `argustack graph build` first.',
354
+ title: 'Root cause analysis',
355
+ description: 'Trace root cause chain for a bug — confirmed, probable, claude-identified causes.',
369
356
  inputSchema: {
370
- issue_key: z.string().describe('Bug issue key (e.g. "PROJ-500")'),
357
+ workspace_id: workspaceIdParam,
358
+ issue_key: z.string(),
371
359
  },
372
- }, async ({ issue_key: issueKey }) => {
373
- const ws = loadWorkspace();
360
+ annotations: ANNOTATIONS.READ_ONLY,
361
+ }, async ({ workspace_id: workspaceIdInput, issue_key: issueKey }) => {
362
+ const ws = await loadWorkspace(workspaceIdInput);
374
363
  if (!ws.ok) {
375
- return errorResponse(`Workspace not found: ${ws.reason}`);
364
+ return workspaceNotFoundResponse(ws.reason);
376
365
  }
377
- const { storage } = await createAdapters(ws.root);
366
+ const { storage, workspaceId } = await createAdapters(ws.workspaceId);
378
367
  try {
379
368
  await storage.initialize();
380
- const entityResult = await storage.query('SELECT id FROM graph_entities WHERE name = $1 LIMIT 1', [issueKey]);
369
+ const entityResult = await storage.queryForWorkspace(workspaceId, `SELECT id FROM graph_entities WHERE workspace_id = $1 AND name = $2 LIMIT 1`, [issueKey]);
381
370
  if (entityResult.rows.length === 0) {
382
- await storage.close();
383
- return textResponse(`No graph data for "${issueKey}". Run "argustack graph build" first.`);
371
+ return textResponse(`No graph data for "${issueKey}".`);
384
372
  }
385
373
  const entityId = entityResult.rows[0]?.['id'];
386
- const relsResult = await storage.query(`SELECT r.type, r.source, r.properties, r.weight,
374
+ const relsResult = await storage.queryForWorkspace(workspaceId, `SELECT r.type, r.source, r.properties, r.weight,
387
375
  se.name AS source_name, se.type AS source_type, se.properties AS source_props
388
376
  FROM graph_relationships r
389
- JOIN graph_entities se ON se.id = r.source_id
390
- WHERE r.target_id = $1
377
+ JOIN graph_entities se ON se.workspace_id = r.workspace_id AND se.id = r.source_id
378
+ WHERE r.workspace_id = $1
379
+ AND r.target_id = $2
391
380
  AND r.type IN ('root_causes', 'probably_caused_by', 'blocked_by', 'caused_by')
392
381
  ORDER BY r.type, r.weight DESC`, [entityId]);
393
382
  const rows = relsResult.rows;
383
+ if (rows.length === 0) {
384
+ return textResponse(`No root cause data for "${issueKey}".`);
385
+ }
394
386
  const confirmed = rows.filter((r) => r.source === 'auto' && (r.type === 'root_causes' || r.type === 'blocked_by'));
395
387
  const probable = rows.filter((r) => r.source === 'auto' && r.type === 'probably_caused_by');
396
388
  const claudeIdentified = rows.filter((r) => r.source === 'claude');
397
- if (rows.length === 0) {
398
- await storage.close();
399
- return textResponse(`No root cause data for "${issueKey}". ` +
400
- 'Try: check issue links in Jira, or investigate with issue_timeline.');
401
- }
402
389
  const lines = [`# Root Cause Analysis: ${issueKey}`, ''];
403
390
  const formatRow = (r) => {
404
391
  const props = r.properties;
@@ -416,7 +403,7 @@ export function registerGraphTools(server) {
416
403
  }
417
404
  if (probable.length > 0) {
418
405
  lines.push(`## Probable Causes (${String(probable.length)})`);
419
- lines.push('*From git timeline — PRs merged shortly before bug creation*');
406
+ lines.push('*From git timeline*');
420
407
  for (const r of probable) {
421
408
  lines.push(formatRow(r));
422
409
  }
@@ -430,41 +417,39 @@ export function registerGraphTools(server) {
430
417
  }
431
418
  lines.push('');
432
419
  }
433
- await storage.close();
434
420
  return textResponse(lines.join('\n'));
435
421
  }
436
422
  catch (err) {
437
- await storage.close();
438
423
  return errorResponse(`Root cause analysis failed: ${getErrorMessage(err)}`);
439
424
  }
440
425
  });
441
426
  server.registerTool('add_observation', {
442
- description: 'Add a text note/observation to any entity in the knowledge graph. Append only — never overwrites existing observations. Use to record: key decisions with WHY, root cause analysis, business process descriptions, out-of-scope decisions. Survives graph rebuild.',
427
+ title: 'Add graph observation',
428
+ description: 'Append a note to a graph entity.',
443
429
  inputSchema: {
444
- entity_name: z.string().describe('Entity name (e.g. "ORG-16999", "Refund Flow", "Dmitry Kislitsyn")'),
445
- content: z.string().describe('Observation text (e.g. "After refund, must sync to OrgMeter within same business day")'),
430
+ workspace_id: workspaceIdParam,
431
+ entity_name: z.string(),
432
+ content: z.string(),
446
433
  },
447
- }, async ({ entity_name: entityName, content }) => {
448
- const ws = loadWorkspace();
434
+ annotations: ANNOTATIONS.LOCAL_WRITE,
435
+ }, async ({ workspace_id: workspaceIdInput, entity_name: entityName, content }) => {
436
+ const ws = await loadWorkspace(workspaceIdInput);
449
437
  if (!ws.ok) {
450
- return errorResponse('Workspace not found: ' + ws.reason);
438
+ return workspaceNotFoundResponse(ws.reason);
451
439
  }
452
- const { storage } = await createAdapters(ws.root);
440
+ const { storage, workspaceId } = await createAdapters(ws.workspaceId);
453
441
  try {
454
442
  await storage.initialize();
455
- const entityResult = await storage.query('SELECT id FROM graph_entities WHERE name = $1 LIMIT 1', [entityName]);
443
+ const entityResult = await storage.queryForWorkspace(workspaceId, `SELECT id FROM graph_entities WHERE workspace_id = $1 AND name = $2 LIMIT 1`, [entityName]);
456
444
  if (entityResult.rows.length === 0) {
457
- await storage.close();
458
- return errorResponse('Entity "' + entityName + '" not found. Run "argustack graph build" first, or create it via add_relationship.');
445
+ return errorResponse(`Entity "${entityName}" not found in workspace ${workspaceId}.`);
459
446
  }
460
447
  const entityId = entityResult.rows[0]?.['id'];
461
- await storage.saveGraphObservation(entityId, content, 'claude');
462
- const allObs = await storage.getObservations(entityId);
463
- await storage.close();
448
+ await storage.saveGraphObservation(workspaceId, entityId, content, 'claude');
449
+ const allObs = await storage.getObservations(workspaceId, entityId);
464
450
  return textResponse(`Added observation to "${entityName}". Total observations: ${String(allObs.length)}`);
465
451
  }
466
452
  catch (err) {
467
- await storage.close();
468
453
  return errorResponse(`Add observation failed: ${getErrorMessage(err)}`);
469
454
  }
470
455
  });