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,405 +1,437 @@
1
- import { readdirSync } from 'node:fs';
2
- import { join, resolve, basename } from 'node:path';
3
- import { input, confirm, checkbox, select } from '@inquirer/prompts';
4
- import { execSync } from 'node:child_process';
1
+ import { dirname, join, resolve } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
5
3
  import chalk from 'chalk';
6
4
  import ora from 'ora';
7
- import { isWorkspace } from '../../workspace/resolver.js';
8
- import { readConfig } from '../../workspace/config.js';
9
- import { ALL_SOURCES, SOURCE_META } from '../../core/types/index.js';
10
- import { DEFAULT_DB_PORT, DEFAULT_PGWEB_PORT, validatePort, getErrorMsg, findAvailablePort } from './types.js';
11
- import { setupJiraInteractive, setupJiraFromFlags } from './setup-jira.js';
12
- import { setupGitInteractive, setupGitFromFlags } from './setup-git.js';
13
- import { setupGithubInteractive, setupGithubFromFlags } from './setup-github.js';
14
- import { setupCsvInteractive, setupCsvFromFlags } from './setup-csv.js';
15
- import { setupDbInteractive, setupDbFromFlags } from './setup-db.js';
16
- import { createWorkspaceFiles, printSummary } from './generators.js';
17
- /**
18
- * Scan directory for existing workspace subdirectories.
19
- */
20
- export function scanWorkspaces(dir) {
21
- const resolved = resolve(dir);
22
- const workspaces = [];
23
- let entries;
24
- try {
25
- entries = readdirSync(resolved);
26
- }
27
- catch {
28
- return [];
5
+ import { setActiveWorkspace } from '../../workspace/active-workspace.js';
6
+ import { hubDir, hubConfigPath, loadHubConfig, resetHubConfigCache } from '../../workspace/hub-config.js';
7
+ import { NodePlatformProbe } from '../../adapters/platform/index.js';
8
+ import { CliDockerControl } from '../../adapters/docker/index.js';
9
+ import { HttpOllamaControl } from '../../adapters/ollama/index.js';
10
+ import { CheckVersionsUseCase } from '../../use-cases/init/check-versions.js';
11
+ import { CheckHubExistsUseCase } from '../../use-cases/init/check-hub-exists.js';
12
+ import { WaitForDockerUseCase } from '../../use-cases/init/wait-for-docker.js';
13
+ import { ResolveHubPortsUseCase, labelForPortKey } from '../../use-cases/init/resolve-hub-ports.js';
14
+ import { BootstrapHubUseCase } from '../../use-cases/init/bootstrap-hub.js';
15
+ import { ClearStaleActiveUseCase } from '../../use-cases/init/clear-stale-active.js';
16
+ import { ValidateWorkspaceNameUseCase } from '../../use-cases/init/validate-workspace-name.js';
17
+ import { InstallOllamaUseCase } from '../../use-cases/init/install-ollama.js';
18
+ import { EnsureOllamaRunningUseCase } from '../../use-cases/init/ensure-ollama-running.js';
19
+ import { EnsureEmbeddingModelUseCase } from '../../use-cases/init/ensure-embedding-model.js';
20
+ import { ProbeLlmUseCase } from '../../use-cases/init/probe-llm.js';
21
+ import { HealthCheckExistingLlmUseCase } from '../../use-cases/init/health-check-existing-llm.js';
22
+ import { WriteConfigEnvUseCase } from '../../use-cases/init/write-config-env.js';
23
+ import { CheckDimsConflictUseCase } from '../../use-cases/init/check-dims-conflict.js';
24
+ import { promptConfigureCode, promptDimsRecreate, promptOwnLlm, promptOwnLlmUrlAndModel, promptPortChoice, promptProbeRetry, promptWaitForDocker, promptWorkspaceName, promptReconfigureBrokenLlm, } from './prompts.js';
25
+ import { printDockerNotRunning, printDockerTimeout, printDone, printHeader, printLlmHealthyAtReinit, printNoInteractiveMissingName, printOllamaInstallFailed, printOllamaTimeout, printOllamaWindowsLink, printPortPlan, printPortsAborted, printProbeError, printPullFailed, printSwitchedTo, printVersionFailure, printWorkspaceList, printWriteConfigFailed, printBootstrapFailure, printStaleActiveCleared, } from './presenter.js';
26
+ const HUB_PORT_DEFAULTS = {
27
+ pg: 15432,
28
+ pgweb: 15433,
29
+ neo4jHttp: 15434,
30
+ neo4jBolt: 15435,
31
+ qdrantRest: 15436,
32
+ qdrantGrpc: 15437,
33
+ };
34
+ const DEFAULT_OLLAMA_URL = 'http://localhost:11434';
35
+ const DEFAULT_OLLAMA_MODEL = 'nomic-embed-text';
36
+ const MAX_PROBE_ATTEMPTS = 3;
37
+ function getTemplatesDir() {
38
+ const here = dirname(fileURLToPath(import.meta.url));
39
+ return resolve(here, '..', '..', '..', 'templates');
40
+ }
41
+ function makeHubStoreFactory() {
42
+ return {
43
+ async open() {
44
+ const { loadHubConfig: load } = await import('../../workspace/hub-config.js');
45
+ const { PostgresWorkspaceStore, createPool } = await import('../../adapters/postgres/index.js');
46
+ const hub = load();
47
+ const pool = createPool(hub.db);
48
+ const store = new PostgresWorkspaceStore(pool);
49
+ return { store, close: async () => { await pool.end(); } };
50
+ },
51
+ };
52
+ }
53
+ export async function runInit(flags = {}) {
54
+ printHeader();
55
+ const platform = new NodePlatformProbe();
56
+ const docker = new CliDockerControl(platform);
57
+ const ollama = new HttpOllamaControl(platform);
58
+ const versions = new CheckVersionsUseCase(platform, docker);
59
+ const v = await versions.execute();
60
+ if (!v.ok) {
61
+ printVersionFailure(v.failure);
62
+ process.exit(1);
29
63
  }
30
- for (const name of entries) {
31
- if (name.startsWith('.')) {
32
- continue;
64
+ if (!await docker.isRunning()) {
65
+ if (flags.interactive === false) {
66
+ printDockerNotRunning();
67
+ process.exit(1);
33
68
  }
34
- const subdir = join(resolved, name);
35
- if (isWorkspace(subdir)) {
36
- const config = readConfig(subdir);
37
- if (config) {
38
- workspaces.push({
39
- name: config.name ?? name,
40
- path: subdir,
41
- config,
42
- });
43
- }
69
+ printDockerNotRunning();
70
+ const wait = await promptWaitForDocker();
71
+ if (!wait) {
72
+ process.exit(0);
73
+ }
74
+ const spinner = ora('Waiting for Docker').start();
75
+ const came = await new WaitForDockerUseCase(docker).execute({
76
+ onTick: (sec) => { spinner.text = `Waiting for Docker (${String(sec)}s)`; },
77
+ });
78
+ spinner.stop();
79
+ if (!came) {
80
+ printDockerTimeout();
81
+ process.exit(1);
44
82
  }
45
83
  }
46
- return workspaces;
47
- }
48
- /**
49
- * Sanitize workspace name to kebab-case directory name.
50
- */
51
- function sanitizeName(raw) {
52
- return raw
53
- .toLowerCase()
54
- .trim()
55
- .replace(/[^a-z0-9-]/g, '-')
56
- .replace(/-+/g, '-')
57
- .replace(/^-|-$/g, '');
58
- }
59
- /**
60
- * Find next available port by checking existing docker-compose files.
61
- */
62
- async function startAndSync(workspaceDir, hasJira, hasGit, hasGithub, csv, db, pgwebPort) {
63
- const spinnerDb = ora('Starting Docker containers...').start();
84
+ const hubStoreFactory = makeHubStoreFactory();
85
+ let hubExists;
64
86
  try {
65
- execSync('docker compose up -d', { cwd: workspaceDir, stdio: 'pipe' });
66
- spinnerDb.succeed('Database running!');
67
- }
68
- catch (err) {
69
- spinnerDb.fail('Failed to start Docker');
70
- console.log(chalk.red(` Error: ${getErrorMsg(err)}`));
71
- console.log(chalk.dim(' Make sure Docker Desktop is running, then:'));
72
- console.log(chalk.cyan(` cd ${workspaceDir} && docker compose up -d`));
73
- return;
74
- }
75
- const spinnerWait = ora('Waiting for PostgreSQL...').start();
76
- const MAX_WAIT_SECONDS = 30;
77
- for (let i = 0; i < MAX_WAIT_SECONDS; i++) {
87
+ const tmp = await hubStoreFactory.open();
78
88
  try {
79
- execSync('docker compose exec -T db pg_isready -U argustack', { cwd: workspaceDir, stdio: 'pipe' });
80
- spinnerWait.succeed('PostgreSQL ready!');
81
- break;
89
+ const c = await new CheckHubExistsUseCase(hubDir(), tmp.store).execute();
90
+ hubExists = c.exists;
82
91
  }
83
- catch {
84
- if (i === MAX_WAIT_SECONDS - 1) {
85
- spinnerWait.fail('PostgreSQL not ready after 30s');
86
- console.log(chalk.dim(' Try manually: docker compose logs db'));
87
- return;
88
- }
89
- await new Promise((r) => setTimeout(r, 1000));
92
+ finally {
93
+ await tmp.close();
90
94
  }
91
95
  }
92
- if (hasJira) {
93
- console.log('');
94
- try {
95
- const { syncJiraFromInit } = await import('../sync.js');
96
- await syncJiraFromInit(workspaceDir);
96
+ catch {
97
+ hubExists = false;
98
+ }
99
+ let activePorts;
100
+ if (!hubExists) {
101
+ const portsResult = await resolvePorts(platform, flags);
102
+ if (portsResult == null) {
103
+ printPortsAborted();
104
+ process.exit(1);
97
105
  }
98
- catch (err) {
99
- console.log(chalk.red(` Jira sync failed: ${getErrorMsg(err)}`));
100
- console.log(chalk.dim(` Try manually: cd ${workspaceDir} && argustack sync jira`));
106
+ activePorts = portsResult;
107
+ const bootstrapSpinner = ora('Bootstrap hub').start();
108
+ const bootstrapResult = await bootstrap(hubStoreFactory, flags, activePorts, (msg) => { bootstrapSpinner.text = msg; });
109
+ bootstrapSpinner.stop();
110
+ if (!bootstrapResult.ok) {
111
+ printBootstrapFailure(bootstrapResult.stage, bootstrapResult.details);
112
+ process.exit(1);
101
113
  }
114
+ console.log(chalk.green(' ✓ hub bootstrapped'));
102
115
  }
103
- if (hasGit) {
104
- console.log('');
105
- try {
106
- const { syncGitFromInit } = await import('../sync.js');
107
- await syncGitFromInit(workspaceDir);
116
+ else {
117
+ console.log(chalk.dim(' Hub already exists, skipping bootstrap.'));
118
+ activePorts = readPortsFromConfig();
119
+ }
120
+ resetHubConfigCache();
121
+ const { store: hubStore, close: closeHub } = await hubStoreFactory.open();
122
+ try {
123
+ if (hubExists) {
124
+ const stale = await new ClearStaleActiveUseCase(hubStore).execute();
125
+ if (stale.cleared) {
126
+ printStaleActiveCleared(stale.staleId);
127
+ }
108
128
  }
109
- catch (err) {
110
- console.log(chalk.red(` Git sync failed: ${getErrorMsg(err)}`));
111
- console.log(chalk.dim(` Try manually: cd ${workspaceDir} && argustack sync git`));
129
+ const existingList = (await hubStore.list()).map((w) => w.name);
130
+ printWorkspaceList(existingList);
131
+ if (flags.interactive === false && (flags.name === undefined || flags.name === '')) {
132
+ printNoInteractiveMissingName();
133
+ process.exit(1);
112
134
  }
113
- }
114
- if (hasGithub) {
115
- console.log('');
116
- try {
117
- const { syncGithubFromInit } = await import('../sync.js');
118
- await syncGithubFromInit(workspaceDir);
135
+ const validator = new ValidateWorkspaceNameUseCase(hubStore);
136
+ let workspaceId = '';
137
+ let workspaceName = '';
138
+ let nameHint = flags.name;
139
+ while (workspaceId.length === 0) {
140
+ const raw = nameHint ?? await promptWorkspaceName(existingList);
141
+ const v2 = await validator.execute(raw);
142
+ if (!v2.ok) {
143
+ if (flags.interactive === false) {
144
+ printNoInteractiveMissingName();
145
+ process.exit(1);
146
+ }
147
+ nameHint = undefined;
148
+ continue;
149
+ }
150
+ if (v2.action === 'create') {
151
+ await hubStore.create({ id: v2.id, name: v2.name });
152
+ console.log(chalk.green(` ✓ workspace "${v2.name}" created`));
153
+ }
154
+ else {
155
+ printSwitchedTo(v2.name);
156
+ }
157
+ setActiveWorkspace(v2.id, v2.name);
158
+ await hubStore.touchActive(v2.id);
159
+ workspaceId = v2.id;
160
+ workspaceName = v2.name;
119
161
  }
120
- catch (err) {
121
- console.log(chalk.red(` GitHub sync failed: ${getErrorMsg(err)}`));
122
- console.log(chalk.dim(` Try manually: cd ${workspaceDir} && argustack sync github`));
162
+ if (flags.skipLlm === true) {
163
+ writeNoLlm(activePorts);
164
+ printDone(workspaceName, false);
165
+ return;
123
166
  }
124
- }
125
- if (csv) {
126
- console.log('');
127
- try {
128
- const { syncCsvFromInit } = await import('../sync.js');
129
- await syncCsvFromInit(workspaceDir, csv.csvFilePath);
167
+ const probe = new ProbeLlmUseCase(ollama);
168
+ if (hubExists) {
169
+ try {
170
+ const hub = loadHubConfig();
171
+ const health = await new HealthCheckExistingLlmUseCase(probe).execute(hub);
172
+ if (health.configured) {
173
+ if (health.healthy) {
174
+ printLlmHealthyAtReinit(hub.embedding.model);
175
+ printDone(workspaceName, true);
176
+ return;
177
+ }
178
+ const reconf = flags.interactive === false ? false : await promptReconfigureBrokenLlm();
179
+ if (!reconf) {
180
+ printDone(workspaceName, true);
181
+ return;
182
+ }
183
+ }
184
+ }
185
+ catch {
186
+ /* config missing — fall through to setup */
187
+ }
130
188
  }
131
- catch (err) {
132
- console.log(chalk.red(` CSV import failed: ${getErrorMsg(err)}`));
133
- console.log(chalk.dim(` Try manually: cd ${workspaceDir} && argustack sync csv`));
189
+ if (flags.interactive !== false) {
190
+ const wantsCode = await promptConfigureCode();
191
+ if (!wantsCode) {
192
+ writeNoLlm(activePorts);
193
+ printDone(workspaceName, false);
194
+ return;
195
+ }
134
196
  }
135
- }
136
- if (db) {
137
- console.log('');
138
- try {
139
- const { syncDbFromInit } = await import('../sync.js');
140
- await syncDbFromInit(workspaceDir);
197
+ const plan = await setupLlm(flags, platform, ollama, probe);
198
+ if (plan == null) {
199
+ writeNoLlm(activePorts);
200
+ printDone(workspaceName, false);
201
+ return;
141
202
  }
142
- catch (err) {
143
- console.log(chalk.red(` Database sync failed: ${getErrorMsg(err)}`));
144
- console.log(chalk.dim(` Try manually: cd ${workspaceDir} && argustack sync db`));
203
+ const dimsOk = await handleDimsConflict(workspaceId, plan.dimensions, flags);
204
+ if (!dimsOk) {
205
+ writeNoLlm(activePorts);
206
+ printDone(workspaceName, false);
207
+ return;
145
208
  }
146
- }
147
- console.log(chalk.dim(' What\'s next:'));
148
- console.log(` ${chalk.cyan(`http://localhost:${pgwebPort}`)} # browse data in pgweb`);
149
- console.log('');
150
- console.log(chalk.dim(' Claude integration:'));
151
- console.log(` Claude Code: ${chalk.green('Open this folder — MCP tools ready!')}`);
152
- console.log(` Claude Desktop: ${chalk.cyan('argustack mcp install')}`);
153
- console.log('');
154
- }
155
- async function setupSources(flags) {
156
- console.log('');
157
- const selectedSources = await checkbox({
158
- message: 'Which sources do you have access to?',
159
- choices: ALL_SOURCES.map((s) => ({
160
- value: s,
161
- name: SOURCE_META[s].label,
162
- description: SOURCE_META[s].description,
163
- })),
164
- });
165
- if (selectedSources.length === 0) {
166
- console.log(chalk.yellow('\n No sources selected. You can add them later with:'));
167
- console.log(chalk.cyan(' argustack source add jira'));
168
- const continueAnyway = await confirm({
169
- message: 'Create workspace without sources?',
170
- default: true,
209
+ const writeRes = new WriteConfigEnvUseCase().execute({
210
+ llm: plan,
211
+ ports: activePorts,
212
+ targetPath: hubConfigPath(),
171
213
  });
172
- if (!continueAnyway) {
173
- throw new Error('Cancelled');
214
+ if (!writeRes.ok) {
215
+ printWriteConfigFailed(writeRes.details);
216
+ process.exit(1);
174
217
  }
218
+ resetHubConfigCache();
219
+ printDone(workspaceName, true);
175
220
  }
176
- let jira = null;
177
- let proxy = null;
178
- let git = null;
179
- let github = null;
180
- let csv = null;
181
- let db = null;
182
- for (const source of selectedSources) {
183
- switch (source) {
184
- case 'jira': {
185
- const result = await setupJiraInteractive();
186
- jira = result.jira;
187
- proxy = result.proxy;
188
- break;
189
- }
190
- case 'git':
191
- git = await setupGitInteractive();
192
- break;
193
- case 'github':
194
- github = await setupGithubInteractive(git?.githubToken, git?.githubRepos);
195
- break;
196
- case 'csv':
197
- csv = await setupCsvInteractive();
198
- break;
199
- case 'db':
200
- db = await setupDbInteractive();
201
- break;
202
- case 'board': break;
203
- case 'code': break;
204
- }
221
+ finally {
222
+ await closeHub();
205
223
  }
206
- void flags;
207
- return { jira, proxy, git, github, csv, db };
208
224
  }
209
- async function runInitNonInteractive(flags) {
210
- console.log(chalk.bold('\n Argustack — non-interactive setup\n'));
211
- if (!flags.name) {
212
- throw new Error('Workspace name is required. Usage: argustack init <name>');
225
+ function readPortsFromConfig() {
226
+ try {
227
+ const hub = loadHubConfig();
228
+ const qdrantPortStr = new URL(hub.qdrant.url).port;
229
+ const qdrantPort = Number(qdrantPortStr !== '' ? qdrantPortStr : '15436');
230
+ const neo4jPortStr = new URL(hub.neo4j.uri.replace('bolt://', 'http://')).port;
231
+ const neo4jBoltPort = Number(neo4jPortStr !== '' ? neo4jPortStr : '15435');
232
+ return {
233
+ pg: hub.db.port,
234
+ pgweb: HUB_PORT_DEFAULTS.pgweb,
235
+ neo4jBolt: neo4jBoltPort,
236
+ neo4jHttp: HUB_PORT_DEFAULTS.neo4jHttp,
237
+ qdrantRest: qdrantPort,
238
+ qdrantGrpc: HUB_PORT_DEFAULTS.qdrantGrpc,
239
+ };
213
240
  }
214
- const workspaceName = sanitizeName(flags.name);
215
- const workspaceDir = resolve(process.cwd(), workspaceName);
216
- if (isWorkspace(workspaceDir)) {
217
- throw new Error(`Workspace '${workspaceName}' already exists at ${workspaceDir}`);
241
+ catch {
242
+ return { ...HUB_PORT_DEFAULTS };
218
243
  }
219
- const selectedSources = flags.source
220
- ? flags.source.split(',').map((s) => s.trim().toLowerCase())
221
- : [];
222
- for (const s of selectedSources) {
223
- if (!ALL_SOURCES.includes(s)) {
224
- throw new Error(`Unknown source: ${s}. Available: ${ALL_SOURCES.join(', ')}`);
244
+ }
245
+ async function handleDimsConflict(workspaceId, newDims, flags) {
246
+ const { QdrantCodeVectorStore } = await import('../../adapters/qdrant/index.js');
247
+ const hub = loadHubConfig();
248
+ const vec = new QdrantCodeVectorStore({ url: hub.qdrant.url });
249
+ try {
250
+ const conflict = await new CheckDimsConflictUseCase(vec).execute(workspaceId, newDims);
251
+ if (!conflict.conflict) {
252
+ return true;
225
253
  }
226
- }
227
- let jiraResult = null;
228
- let gitResult = null;
229
- let githubResult = null;
230
- let csvResult = null;
231
- let dbResult = null;
232
- for (const source of selectedSources) {
233
- switch (source) {
234
- case 'jira':
235
- jiraResult = await setupJiraFromFlags(flags);
236
- break;
237
- case 'git':
238
- gitResult = setupGitFromFlags(flags);
239
- break;
240
- case 'github':
241
- githubResult = setupGithubFromFlags(flags);
242
- break;
243
- case 'csv':
244
- csvResult = setupCsvFromFlags(flags);
245
- break;
246
- case 'db':
247
- dbResult = setupDbFromFlags(flags);
248
- break;
249
- case 'board':
250
- break;
251
- case 'code':
252
- break;
254
+ console.log(chalk.yellow(` ⚠ Embedding dimensions changed: ${String(conflict.existingDims)} → ${String(conflict.newDims)}. ` +
255
+ `Qdrant collection "${conflict.vectorCollection}" must be deleted.`));
256
+ const recreate = flags.interactive === false
257
+ ? false
258
+ : await promptDimsRecreate(conflict.existingDims, conflict.newDims);
259
+ if (!recreate) {
260
+ console.log(chalk.dim(' Skipped keeping existing collection. LLM provider NOT saved.'));
261
+ return false;
253
262
  }
254
- }
255
- const dbPort = flags.dbPort
256
- ? parseInt(flags.dbPort, 10)
257
- : await findAvailablePort(DEFAULT_DB_PORT);
258
- const pgwebPort = flags.pgwebPort
259
- ? parseInt(flags.pgwebPort, 10)
260
- : await findAvailablePort(DEFAULT_PGWEB_PORT);
261
- const spinner = ora('Creating workspace...').start();
262
- try {
263
- createWorkspaceFiles(workspaceDir, jiraResult, gitResult, githubResult, csvResult, dbResult, dbPort, pgwebPort, workspaceName, null);
264
- spinner.succeed(`Workspace '${workspaceName}' created!`);
263
+ const spinner = ora(`Deleting Qdrant collection ${conflict.vectorCollection}`).start();
264
+ try {
265
+ await vec.deleteCollection(workspaceId);
266
+ spinner.succeed(`Deleted ${conflict.vectorCollection}`);
267
+ }
268
+ catch (err) {
269
+ spinner.fail(`Failed to delete: ${err instanceof Error ? err.message : String(err)}`);
270
+ return false;
271
+ }
272
+ return true;
265
273
  }
266
274
  catch (err) {
267
- spinner.fail('Failed');
268
- throw err;
275
+ console.log(chalk.yellow(` ⚠ Could not check Qdrant collection dims: ${err instanceof Error ? err.message : String(err)}`));
276
+ console.log(chalk.dim(' Continuing — first `argustack code index` will create the collection fresh.'));
277
+ return true;
278
+ }
279
+ finally {
280
+ await vec.close();
269
281
  }
270
- printSummary(workspaceDir, jiraResult, gitResult, githubResult, csvResult, dbResult, pgwebPort, false, null);
271
282
  }
272
- async function runInitInteractive(flags) {
273
- console.log('');
274
- console.log(chalk.bold(' Argustack workspace setup'));
275
- console.log(chalk.dim(' Cross-reference Jira + Git + DB to analyze your project.\n'));
276
- const cwd = process.cwd();
277
- const existing = scanWorkspaces(cwd);
278
- let workspaceName;
279
- let workspaceDir;
280
- if (existing.length > 0) {
281
- console.log(chalk.dim(` Found ${String(existing.length)} workspace(s) in ${basename(cwd)}:`));
282
- for (const ws of existing) {
283
- const sources = ws.config.order.length > 0
284
- ? ws.config.order.map((s) => SOURCE_META[s].label).join(', ')
285
- : 'no sources';
286
- console.log(` ${chalk.green('●')} ${chalk.bold(ws.name)} — ${chalk.dim(sources)}`);
283
+ async function resolvePorts(platform, flags) {
284
+ const resolver = new ResolveHubPortsUseCase(platform);
285
+ const { plan } = await resolver.execute({ ...HUB_PORT_DEFAULTS });
286
+ const finalPorts = { ...HUB_PORT_DEFAULTS };
287
+ for (const entry of plan) {
288
+ if (entry.conflict == null) {
289
+ finalPorts[entry.key] = entry.current;
290
+ continue;
287
291
  }
288
- console.log('');
289
- const action = await select({
290
- message: 'What would you like to do?',
291
- choices: [
292
- { value: 'new', name: 'Create new workspace' },
293
- ...existing.map((ws) => ({
294
- value: `update:${ws.name}`,
295
- name: `Update ${ws.name}`,
296
- })),
297
- ],
298
- });
299
- if (action.startsWith('update:')) {
300
- const updateName = action.slice('update:'.length);
301
- const ws = existing.find((w) => w.name === updateName);
302
- if (!ws) {
303
- throw new Error(`Workspace '${updateName}' not found`);
292
+ if (flags.interactive === false) {
293
+ if (entry.suggested === null) {
294
+ return null;
304
295
  }
305
- console.log(chalk.dim(`\n Updating workspace: ${updateName}\n`));
306
- workspaceName = updateName;
307
- workspaceDir = ws.path;
296
+ finalPorts[entry.key] = entry.suggested;
297
+ continue;
308
298
  }
309
- else {
310
- const rawName = flags.name ?? await input({
311
- message: 'Workspace name:',
312
- validate: (val) => {
313
- if (val.includes('://') || val.includes('.') || val.includes('/')) {
314
- return 'This looks like a URL. Enter a short project name (e.g. "myapp", "my-project")';
315
- }
316
- const sanitized = sanitizeName(val);
317
- if (!sanitized) {
318
- return 'Name is required (letters, numbers, hyphens)';
319
- }
320
- if (sanitized.length > 30) {
321
- return 'Name too long — keep it under 30 characters';
322
- }
323
- if (existing.some((ws) => ws.name === sanitized)) {
324
- return `Workspace '${sanitized}' already exists`;
325
- }
326
- return true;
327
- },
328
- });
329
- workspaceName = sanitizeName(rawName);
330
- workspaceDir = join(cwd, workspaceName);
299
+ const label = labelForPortKey(entry.key);
300
+ const conflictDetails = `${entry.conflict.processName} pid ${String(entry.conflict.pid)}`;
301
+ const decision = await promptPortChoice(label, entry.default, conflictDetails, entry.suggested);
302
+ if (decision.choice === 'abort') {
303
+ return null;
331
304
  }
332
- }
333
- else {
334
- const rawName = flags.name ?? await input({
335
- message: 'Workspace name:',
336
- validate: (val) => {
337
- if (val.includes('://') || val.includes('.') || val.includes('/')) {
338
- return 'This looks like a URL. Enter a short project name (e.g. "myapp", "my-project")';
339
- }
340
- const sanitized = sanitizeName(val);
341
- if (!sanitized) {
342
- return 'Name is required (letters, numbers, hyphens)';
343
- }
344
- if (sanitized.length > 30) {
345
- return 'Name too long — keep it under 30 characters';
346
- }
347
- return true;
348
- },
349
- });
350
- workspaceName = sanitizeName(rawName);
351
- workspaceDir = join(cwd, workspaceName);
352
- }
353
- if (isWorkspace(workspaceDir)) {
354
- console.log(chalk.yellow(`\n Workspace '${workspaceName}' already exists.`));
355
- const proceed = await confirm({ message: 'Reinitialize this workspace?', default: false });
356
- if (!proceed) {
357
- console.log(chalk.dim(' Cancelled.'));
358
- return;
305
+ if (decision.choice === 'accept-suggested' && entry.suggested !== null) {
306
+ finalPorts[entry.key] = entry.suggested;
307
+ continue;
308
+ }
309
+ if (decision.choice === 'custom') {
310
+ finalPorts[entry.key] = decision.port;
359
311
  }
360
312
  }
361
- process.env['ARGUSTACK_INIT_WORKSPACE'] = workspaceName;
362
- const { jira, proxy, git, github, csv, db } = await setupSources(flags);
363
- delete process.env['ARGUSTACK_INIT_WORKSPACE'];
364
- console.log('');
365
- console.log(chalk.dim(' Argustack internal database (Docker):'));
366
- const defaultDbPort = await findAvailablePort(DEFAULT_DB_PORT);
367
- const defaultPgwebPort = await findAvailablePort(DEFAULT_PGWEB_PORT);
368
- const dbPortStr = await input({
369
- message: 'PostgreSQL port:', default: flags.dbPort ?? String(defaultDbPort),
370
- validate: (val) => validatePort(val, 1024),
371
- });
372
- const pgwebPortStr = await input({
373
- message: 'pgweb UI port:', default: flags.pgwebPort ?? String(defaultPgwebPort),
374
- validate: (val) => validatePort(val, 1024),
313
+ printPortPlan(plan.map((p) => ({
314
+ label: labelForPortKey(p.key),
315
+ port: finalPorts[p.key],
316
+ fromDefault: finalPorts[p.key] === p.default,
317
+ })));
318
+ return finalPorts;
319
+ }
320
+ async function bootstrap(_hubStoreFactory, flags, ports, onStep) {
321
+ const platform = new NodePlatformProbe();
322
+ const docker = new CliDockerControl(platform);
323
+ const { PgReadinessProbe, PostgresWorkspaceStore, createPool } = await import('../../adapters/postgres/index.js');
324
+ const hubCredentials = { user: 'argustack', password: 'argustack_hub', database: 'argustack_hub' };
325
+ const readinessProbe = new PgReadinessProbe(hubCredentials);
326
+ const workspaceStoreFactory = (port) => {
327
+ const pool = createPool({ host: 'localhost', port, ...hubCredentials });
328
+ return {
329
+ store: new PostgresWorkspaceStore(pool),
330
+ close: async () => { await pool.end(); },
331
+ };
332
+ };
333
+ const useCase = new BootstrapHubUseCase(docker, readinessProbe, workspaceStoreFactory);
334
+ const templates = getTemplatesDir();
335
+ const result = await useCase.execute({
336
+ hubDir: hubDir(),
337
+ templateComposePath: join(templates, 'hub-docker-compose.yml'),
338
+ templateConfigEnvPath: join(templates, 'hub-config.env'),
339
+ ports,
340
+ ...(flags.skipDocker === true ? { skipDocker: true } : {}),
341
+ onStep,
375
342
  });
376
- const dbPort = parseInt(dbPortStr, 10);
377
- const pgwebPort = parseInt(pgwebPortStr, 10);
378
- const spinner = ora('Creating workspace...').start();
379
- try {
380
- createWorkspaceFiles(workspaceDir, jira, git, github, csv, db, dbPort, pgwebPort, workspaceName, proxy);
381
- spinner.succeed(`Workspace '${workspaceName}' created!`);
343
+ if (result.ok) {
344
+ return { ok: true };
382
345
  }
383
- catch (err) {
384
- spinner.fail('Failed to create workspace');
385
- console.log(chalk.red(`\n Error: ${getErrorMsg(err)}`));
386
- return;
387
- }
388
- const autoStart = await confirm({
389
- message: 'Start database and sync now?',
390
- default: true,
391
- });
392
- printSummary(workspaceDir, jira, git, github, csv, db, pgwebPort, autoStart, proxy);
393
- if (autoStart) {
394
- await startAndSync(workspaceDir, jira !== null || proxy !== null, git !== null, github !== null, csv, db, pgwebPort);
346
+ return { ok: false, stage: result.stage, details: result.details };
347
+ }
348
+ function writeNoLlm(ports) {
349
+ const writeRes = new WriteConfigEnvUseCase().execute({ ports, targetPath: hubConfigPath() });
350
+ if (!writeRes.ok) {
351
+ printWriteConfigFailed(writeRes.details);
352
+ process.exit(1);
395
353
  }
354
+ resetHubConfigCache();
396
355
  }
397
- export async function runInit(flags = {}) {
356
+ async function setupLlm(flags, platform, ollama, probe) {
398
357
  if (flags.interactive === false) {
399
- await runInitNonInteractive(flags);
358
+ return setupOllama(platform, ollama, probe);
359
+ }
360
+ const hasOwn = await promptOwnLlm();
361
+ if (hasOwn) {
362
+ return setupOwnLlm(platform, ollama, probe);
363
+ }
364
+ return setupOllama(platform, ollama, probe);
365
+ }
366
+ async function setupOwnLlm(platform, ollama, probe) {
367
+ let attempts = 0;
368
+ while (attempts < MAX_PROBE_ATTEMPTS) {
369
+ const { url, model } = await promptOwnLlmUrlAndModel();
370
+ const spinner = ora('Probing LLM').start();
371
+ const result = await probe.execute({ url, model });
372
+ spinner.stop();
373
+ attempts += 1;
374
+ if (result.ok) {
375
+ return { provider: 'custom', url, model, dimensions: result.dims };
376
+ }
377
+ printProbeError(result.kind, result.details);
378
+ const choice = await promptProbeRetry();
379
+ if (choice === 'use-ollama') {
380
+ return setupOllama(platform, ollama, probe);
381
+ }
382
+ if (choice === 'skip') {
383
+ return null;
384
+ }
385
+ }
386
+ console.log(chalk.yellow(' Probe retry limit reached. Continuing without LLM.'));
387
+ return null;
388
+ }
389
+ async function setupOllama(platform, ollama, probe) {
390
+ const installed = await ollama.isInstalled();
391
+ if (!installed) {
392
+ const os = platform.detectOS();
393
+ if (os === 'windows') {
394
+ printOllamaWindowsLink();
395
+ return null;
396
+ }
397
+ const installer = new InstallOllamaUseCase(ollama, platform);
398
+ const spinner = ora('Installing Ollama').start();
399
+ const result = await installer.execute();
400
+ spinner.stop();
401
+ if (!result.ok) {
402
+ printOllamaInstallFailed(result.details);
403
+ return null;
404
+ }
405
+ console.log(chalk.green(` ✓ Ollama installed via ${result.via}`));
406
+ }
407
+ const runSpinner = ora('Starting Ollama').start();
408
+ const run = await new EnsureOllamaRunningUseCase(ollama).execute();
409
+ runSpinner.stop();
410
+ if (!run.ok) {
411
+ printOllamaTimeout();
412
+ return null;
413
+ }
414
+ const modelSpinner = ora('Pulling embedding model').start();
415
+ const ensured = await new EnsureEmbeddingModelUseCase(ollama).execute(DEFAULT_OLLAMA_MODEL, (pct) => { modelSpinner.text = `Pulling ${DEFAULT_OLLAMA_MODEL} (${String(pct)}%)`; });
416
+ modelSpinner.stop();
417
+ if (!ensured.ok) {
418
+ printPullFailed(ensured.kind, ensured.details);
419
+ return null;
420
+ }
421
+ if (ensured.alreadyPresent) {
422
+ console.log(chalk.dim(` ${DEFAULT_OLLAMA_MODEL} already present`));
400
423
  }
401
424
  else {
402
- await runInitInteractive(flags);
425
+ console.log(chalk.green(` ✓ ${DEFAULT_OLLAMA_MODEL} pulled`));
426
+ }
427
+ const probeSpinner = ora('Probing embedding').start();
428
+ const probed = await probe.execute({ url: DEFAULT_OLLAMA_URL, model: DEFAULT_OLLAMA_MODEL });
429
+ probeSpinner.stop();
430
+ if (!probed.ok) {
431
+ printProbeError(probed.kind, probed.details);
432
+ return null;
403
433
  }
434
+ console.log(chalk.green(` ✓ embedding works (${String(probed.dims)} dims)`));
435
+ return { provider: 'ollama', url: DEFAULT_OLLAMA_URL, model: DEFAULT_OLLAMA_MODEL, dimensions: probed.dims };
404
436
  }
405
437
  //# sourceMappingURL=index.js.map