argustack 0.1.34 → 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 (672) hide show
  1. package/README.md +31 -98
  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.d.ts +37 -0
  67. package/dist/adapters/lmstudio/embedding-provider.d.ts.map +1 -0
  68. package/dist/adapters/lmstudio/embedding-provider.js +174 -0
  69. package/dist/adapters/lmstudio/embedding-provider.js.map +1 -0
  70. package/dist/adapters/lmstudio/index.d.ts +3 -0
  71. package/dist/adapters/lmstudio/index.d.ts.map +1 -0
  72. package/dist/adapters/lmstudio/index.js +2 -0
  73. package/dist/adapters/lmstudio/index.js.map +1 -0
  74. package/dist/adapters/lsp/index.d.ts +4 -0
  75. package/dist/adapters/lsp/index.d.ts.map +1 -0
  76. package/dist/adapters/lsp/index.js +3 -0
  77. package/dist/adapters/lsp/index.js.map +1 -0
  78. package/dist/adapters/lsp/jsonrpc.d.ts +12 -0
  79. package/dist/adapters/lsp/jsonrpc.d.ts.map +1 -0
  80. package/dist/adapters/lsp/jsonrpc.js +30 -0
  81. package/dist/adapters/lsp/jsonrpc.js.map +1 -0
  82. package/dist/adapters/lsp/typescript-lsp.d.ts +25 -0
  83. package/dist/adapters/lsp/typescript-lsp.d.ts.map +1 -0
  84. package/dist/adapters/lsp/typescript-lsp.js +131 -0
  85. package/dist/adapters/lsp/typescript-lsp.js.map +1 -0
  86. package/dist/adapters/neo4j/client.d.ts +11 -0
  87. package/dist/adapters/neo4j/client.d.ts.map +1 -0
  88. package/dist/adapters/neo4j/client.js +14 -0
  89. package/dist/adapters/neo4j/client.js.map +1 -0
  90. package/dist/adapters/neo4j/cypher.d.ts +23 -0
  91. package/dist/adapters/neo4j/cypher.d.ts.map +1 -0
  92. package/dist/adapters/neo4j/cypher.js +138 -0
  93. package/dist/adapters/neo4j/cypher.js.map +1 -0
  94. package/dist/adapters/neo4j/graph-store.d.ts +33 -0
  95. package/dist/adapters/neo4j/graph-store.d.ts.map +1 -0
  96. package/dist/adapters/neo4j/graph-store.js +282 -0
  97. package/dist/adapters/neo4j/graph-store.js.map +1 -0
  98. package/dist/adapters/neo4j/index.d.ts +4 -0
  99. package/dist/adapters/neo4j/index.d.ts.map +1 -0
  100. package/dist/adapters/neo4j/index.js +3 -0
  101. package/dist/adapters/neo4j/index.js.map +1 -0
  102. package/dist/adapters/neo4j/mapper.d.ts +5 -0
  103. package/dist/adapters/neo4j/mapper.d.ts.map +1 -0
  104. package/dist/adapters/neo4j/mapper.js +49 -0
  105. package/dist/adapters/neo4j/mapper.js.map +1 -0
  106. package/dist/adapters/ollama/chat-llm.d.ts +24 -0
  107. package/dist/adapters/ollama/chat-llm.d.ts.map +1 -0
  108. package/dist/adapters/ollama/chat-llm.js +53 -0
  109. package/dist/adapters/ollama/chat-llm.js.map +1 -0
  110. package/dist/adapters/ollama/embedding-provider.d.ts +30 -0
  111. package/dist/adapters/ollama/embedding-provider.d.ts.map +1 -0
  112. package/dist/adapters/ollama/embedding-provider.js +124 -0
  113. package/dist/adapters/ollama/embedding-provider.js.map +1 -0
  114. package/dist/adapters/ollama/http-ollama-control.d.ts +24 -0
  115. package/dist/adapters/ollama/http-ollama-control.d.ts.map +1 -0
  116. package/dist/adapters/ollama/http-ollama-control.js +224 -0
  117. package/dist/adapters/ollama/http-ollama-control.js.map +1 -0
  118. package/dist/adapters/ollama/index.d.ts +6 -0
  119. package/dist/adapters/ollama/index.d.ts.map +1 -0
  120. package/dist/adapters/ollama/index.js +4 -0
  121. package/dist/adapters/ollama/index.js.map +1 -0
  122. package/dist/adapters/platform/index.d.ts +2 -0
  123. package/dist/adapters/platform/index.d.ts.map +1 -0
  124. package/dist/adapters/platform/index.js +2 -0
  125. package/dist/adapters/platform/index.js.map +1 -0
  126. package/dist/adapters/platform/node-platform-probe.d.ts +9 -0
  127. package/dist/adapters/platform/node-platform-probe.d.ts.map +1 -0
  128. package/dist/adapters/platform/node-platform-probe.js +88 -0
  129. package/dist/adapters/platform/node-platform-probe.js.map +1 -0
  130. package/dist/adapters/postgres/code-meta.d.ts +21 -0
  131. package/dist/adapters/postgres/code-meta.d.ts.map +1 -0
  132. package/dist/adapters/postgres/code-meta.js +150 -0
  133. package/dist/adapters/postgres/code-meta.js.map +1 -0
  134. package/dist/adapters/postgres/index.d.ts +3 -0
  135. package/dist/adapters/postgres/index.d.ts.map +1 -1
  136. package/dist/adapters/postgres/index.js +3 -0
  137. package/dist/adapters/postgres/index.js.map +1 -1
  138. package/dist/adapters/postgres/migrate-helpers.d.ts +43 -0
  139. package/dist/adapters/postgres/migrate-helpers.d.ts.map +1 -0
  140. package/dist/adapters/postgres/migrate-helpers.js +136 -0
  141. package/dist/adapters/postgres/migrate-helpers.js.map +1 -0
  142. package/dist/adapters/postgres/readiness-probe.d.ts +22 -0
  143. package/dist/adapters/postgres/readiness-probe.d.ts.map +1 -0
  144. package/dist/adapters/postgres/readiness-probe.js +47 -0
  145. package/dist/adapters/postgres/readiness-probe.js.map +1 -0
  146. package/dist/adapters/postgres/schema.d.ts +11 -1
  147. package/dist/adapters/postgres/schema.d.ts.map +1 -1
  148. package/dist/adapters/postgres/schema.js +192 -108
  149. package/dist/adapters/postgres/schema.js.map +1 -1
  150. package/dist/adapters/postgres/storage-commits.d.ts +13 -0
  151. package/dist/adapters/postgres/storage-commits.d.ts.map +1 -0
  152. package/dist/adapters/postgres/storage-commits.js +63 -0
  153. package/dist/adapters/postgres/storage-commits.js.map +1 -0
  154. package/dist/adapters/postgres/storage-dbschema.d.ts +14 -0
  155. package/dist/adapters/postgres/storage-dbschema.d.ts.map +1 -0
  156. package/dist/adapters/postgres/storage-dbschema.js +63 -0
  157. package/dist/adapters/postgres/storage-dbschema.js.map +1 -0
  158. package/dist/adapters/postgres/storage-graph.d.ts +18 -0
  159. package/dist/adapters/postgres/storage-graph.d.ts.map +1 -0
  160. package/dist/adapters/postgres/storage-graph.js +127 -0
  161. package/dist/adapters/postgres/storage-graph.js.map +1 -0
  162. package/dist/adapters/postgres/storage-issues.d.ts +26 -0
  163. package/dist/adapters/postgres/storage-issues.d.ts.map +1 -0
  164. package/dist/adapters/postgres/storage-issues.js +233 -0
  165. package/dist/adapters/postgres/storage-issues.js.map +1 -0
  166. package/dist/adapters/postgres/storage-prs.d.ts +15 -0
  167. package/dist/adapters/postgres/storage-prs.d.ts.map +1 -0
  168. package/dist/adapters/postgres/storage-prs.js +142 -0
  169. package/dist/adapters/postgres/storage-prs.js.map +1 -0
  170. package/dist/adapters/postgres/storage-query.d.ts +26 -0
  171. package/dist/adapters/postgres/storage-query.d.ts.map +1 -0
  172. package/dist/adapters/postgres/storage-query.js +74 -0
  173. package/dist/adapters/postgres/storage-query.js.map +1 -0
  174. package/dist/adapters/postgres/storage-search.d.ts +18 -0
  175. package/dist/adapters/postgres/storage-search.d.ts.map +1 -0
  176. package/dist/adapters/postgres/storage-search.js +90 -0
  177. package/dist/adapters/postgres/storage-search.js.map +1 -0
  178. package/dist/adapters/postgres/storage.d.ts +49 -33
  179. package/dist/adapters/postgres/storage.d.ts.map +1 -1
  180. package/dist/adapters/postgres/storage.js +89 -605
  181. package/dist/adapters/postgres/storage.js.map +1 -1
  182. package/dist/adapters/postgres/workspace-store.d.ts +26 -0
  183. package/dist/adapters/postgres/workspace-store.d.ts.map +1 -0
  184. package/dist/adapters/postgres/workspace-store.js +94 -0
  185. package/dist/adapters/postgres/workspace-store.js.map +1 -0
  186. package/dist/adapters/qdrant/client.d.ts +8 -0
  187. package/dist/adapters/qdrant/client.d.ts.map +1 -0
  188. package/dist/adapters/qdrant/client.js +12 -0
  189. package/dist/adapters/qdrant/client.js.map +1 -0
  190. package/dist/adapters/qdrant/index.d.ts +4 -0
  191. package/dist/adapters/qdrant/index.d.ts.map +1 -0
  192. package/dist/adapters/qdrant/index.js +3 -0
  193. package/dist/adapters/qdrant/index.js.map +1 -0
  194. package/dist/adapters/qdrant/mapper.d.ts +16 -0
  195. package/dist/adapters/qdrant/mapper.d.ts.map +1 -0
  196. package/dist/adapters/qdrant/mapper.js +59 -0
  197. package/dist/adapters/qdrant/mapper.js.map +1 -0
  198. package/dist/adapters/qdrant/vector-store.d.ts +20 -0
  199. package/dist/adapters/qdrant/vector-store.d.ts.map +1 -0
  200. package/dist/adapters/qdrant/vector-store.js +144 -0
  201. package/dist/adapters/qdrant/vector-store.js.map +1 -0
  202. package/dist/adapters/tree-sitter/index.d.ts +4 -0
  203. package/dist/adapters/tree-sitter/index.d.ts.map +1 -0
  204. package/dist/adapters/tree-sitter/index.js +3 -0
  205. package/dist/adapters/tree-sitter/index.js.map +1 -0
  206. package/dist/adapters/tree-sitter/parser.d.ts +15 -0
  207. package/dist/adapters/tree-sitter/parser.d.ts.map +1 -0
  208. package/dist/adapters/tree-sitter/parser.js +186 -0
  209. package/dist/adapters/tree-sitter/parser.js.map +1 -0
  210. package/dist/adapters/tree-sitter/queries.d.ts +14 -0
  211. package/dist/adapters/tree-sitter/queries.d.ts.map +1 -0
  212. package/dist/adapters/tree-sitter/queries.js +14 -0
  213. package/dist/adapters/tree-sitter/queries.js.map +1 -0
  214. package/dist/adapters/voyage/embedding-provider.d.ts +25 -0
  215. package/dist/adapters/voyage/embedding-provider.d.ts.map +1 -0
  216. package/dist/adapters/voyage/embedding-provider.js +105 -0
  217. package/dist/adapters/voyage/embedding-provider.js.map +1 -0
  218. package/dist/adapters/voyage/index.d.ts +3 -0
  219. package/dist/adapters/voyage/index.d.ts.map +1 -0
  220. package/dist/adapters/voyage/index.js +2 -0
  221. package/dist/adapters/voyage/index.js.map +1 -0
  222. package/dist/cli/add/code.d.ts +3 -0
  223. package/dist/cli/add/code.d.ts.map +1 -0
  224. package/dist/cli/add/code.js +97 -0
  225. package/dist/cli/add/code.js.map +1 -0
  226. package/dist/cli/add/csv.d.ts +3 -0
  227. package/dist/cli/add/csv.d.ts.map +1 -0
  228. package/dist/cli/add/csv.js +26 -0
  229. package/dist/cli/add/csv.js.map +1 -0
  230. package/dist/cli/add/db.d.ts +3 -0
  231. package/dist/cli/add/db.d.ts.map +1 -0
  232. package/dist/cli/add/db.js +46 -0
  233. package/dist/cli/add/db.js.map +1 -0
  234. package/dist/cli/add/git.d.ts +3 -0
  235. package/dist/cli/add/git.d.ts.map +1 -0
  236. package/dist/cli/add/git.js +26 -0
  237. package/dist/cli/add/git.js.map +1 -0
  238. package/dist/cli/add/github.d.ts +3 -0
  239. package/dist/cli/add/github.d.ts.map +1 -0
  240. package/dist/cli/add/github.js +32 -0
  241. package/dist/cli/add/github.js.map +1 -0
  242. package/dist/cli/add/index.d.ts +3 -0
  243. package/dist/cli/add/index.d.ts.map +1 -0
  244. package/dist/cli/add/index.js +18 -0
  245. package/dist/cli/add/index.js.map +1 -0
  246. package/dist/cli/add/jira.d.ts +3 -0
  247. package/dist/cli/add/jira.d.ts.map +1 -0
  248. package/dist/cli/add/jira.js +45 -0
  249. package/dist/cli/add/jira.js.map +1 -0
  250. package/dist/cli/add/shared.d.ts +31 -0
  251. package/dist/cli/add/shared.d.ts.map +1 -0
  252. package/dist/cli/add/shared.js +102 -0
  253. package/dist/cli/add/shared.js.map +1 -0
  254. package/dist/cli/board-server.js +1 -1
  255. package/dist/cli/board-server.js.map +1 -1
  256. package/dist/cli/board.d.ts.map +1 -1
  257. package/dist/cli/board.js +11 -12
  258. package/dist/cli/board.js.map +1 -1
  259. package/dist/cli/code.d.ts +3 -0
  260. package/dist/cli/code.d.ts.map +1 -0
  261. package/dist/cli/code.js +467 -0
  262. package/dist/cli/code.js.map +1 -0
  263. package/dist/cli/embed.d.ts.map +1 -1
  264. package/dist/cli/embed.js +21 -26
  265. package/dist/cli/embed.js.map +1 -1
  266. package/dist/cli/graph.d.ts.map +1 -1
  267. package/dist/cli/graph.js +37 -55
  268. package/dist/cli/graph.js.map +1 -1
  269. package/dist/cli/index.js +30 -25
  270. package/dist/cli/index.js.map +1 -1
  271. package/dist/cli/init/cleanup.d.ts +11 -0
  272. package/dist/cli/init/cleanup.d.ts.map +1 -0
  273. package/dist/cli/init/cleanup.js +39 -0
  274. package/dist/cli/init/cleanup.js.map +1 -0
  275. package/dist/cli/init/generators.js +27 -27
  276. package/dist/cli/init/generators.js.map +1 -1
  277. package/dist/cli/init/index.d.ts +0 -10
  278. package/dist/cli/init/index.d.ts.map +1 -1
  279. package/dist/cli/init/index.js +386 -351
  280. package/dist/cli/init/index.js.map +1 -1
  281. package/dist/cli/init/presenter.d.ts +30 -0
  282. package/dist/cli/init/presenter.d.ts.map +1 -0
  283. package/dist/cli/init/presenter.js +152 -0
  284. package/dist/cli/init/presenter.js.map +1 -0
  285. package/dist/cli/init/prompts.d.ts +28 -0
  286. package/dist/cli/init/prompts.d.ts.map +1 -0
  287. package/dist/cli/init/prompts.js +110 -0
  288. package/dist/cli/init/prompts.js.map +1 -0
  289. package/dist/cli/init/setup-csv.js +2 -2
  290. package/dist/cli/init/setup-csv.js.map +1 -1
  291. package/dist/cli/init/setup-db.d.ts.map +1 -1
  292. package/dist/cli/init/setup-db.js +17 -14
  293. package/dist/cli/init/setup-db.js.map +1 -1
  294. package/dist/cli/init/setup-git.js +16 -16
  295. package/dist/cli/init/setup-git.js.map +1 -1
  296. package/dist/cli/init/setup-github.d.ts.map +1 -1
  297. package/dist/cli/init/setup-github.js +7 -5
  298. package/dist/cli/init/setup-github.js.map +1 -1
  299. package/dist/cli/init/setup-jira.d.ts.map +1 -1
  300. package/dist/cli/init/setup-jira.js +11 -9
  301. package/dist/cli/init/setup-jira.js.map +1 -1
  302. package/dist/cli/init/types.d.ts +4 -0
  303. package/dist/cli/init/types.d.ts.map +1 -1
  304. package/dist/cli/init/types.js +4 -4
  305. package/dist/cli/init/types.js.map +1 -1
  306. package/dist/cli/mcp-install.d.ts +1 -1
  307. package/dist/cli/mcp-install.d.ts.map +1 -1
  308. package/dist/cli/mcp-install.js +10 -24
  309. package/dist/cli/mcp-install.js.map +1 -1
  310. package/dist/cli/migrate-to-hub-impl.d.ts +51 -0
  311. package/dist/cli/migrate-to-hub-impl.d.ts.map +1 -0
  312. package/dist/cli/migrate-to-hub-impl.js +171 -0
  313. package/dist/cli/migrate-to-hub-impl.js.map +1 -0
  314. package/dist/cli/migrate-to-hub.d.ts +3 -0
  315. package/dist/cli/migrate-to-hub.d.ts.map +1 -0
  316. package/dist/cli/migrate-to-hub.js +90 -0
  317. package/dist/cli/migrate-to-hub.js.map +1 -0
  318. package/dist/cli/push.d.ts.map +1 -1
  319. package/dist/cli/push.js +62 -65
  320. package/dist/cli/push.js.map +1 -1
  321. package/dist/cli/sources.d.ts +0 -7
  322. package/dist/cli/sources.d.ts.map +1 -1
  323. package/dist/cli/sources.js +47 -112
  324. package/dist/cli/sources.js.map +1 -1
  325. package/dist/cli/status.d.ts +0 -3
  326. package/dist/cli/status.d.ts.map +1 -1
  327. package/dist/cli/status.js +95 -70
  328. package/dist/cli/status.js.map +1 -1
  329. package/dist/cli/sync.d.ts +0 -10
  330. package/dist/cli/sync.d.ts.map +1 -1
  331. package/dist/cli/sync.js +186 -314
  332. package/dist/cli/sync.js.map +1 -1
  333. package/dist/cli/workspace/add.d.ts +3 -0
  334. package/dist/cli/workspace/add.d.ts.map +1 -0
  335. package/dist/cli/workspace/add.js +38 -0
  336. package/dist/cli/workspace/add.js.map +1 -0
  337. package/dist/cli/workspace/index.d.ts +3 -0
  338. package/dist/cli/workspace/index.d.ts.map +1 -0
  339. package/dist/cli/workspace/index.js +16 -0
  340. package/dist/cli/workspace/index.js.map +1 -0
  341. package/dist/cli/workspace/info.d.ts +3 -0
  342. package/dist/cli/workspace/info.d.ts.map +1 -0
  343. package/dist/cli/workspace/info.js +69 -0
  344. package/dist/cli/workspace/info.js.map +1 -0
  345. package/dist/cli/workspace/list.d.ts +3 -0
  346. package/dist/cli/workspace/list.d.ts.map +1 -0
  347. package/dist/cli/workspace/list.js +36 -0
  348. package/dist/cli/workspace/list.js.map +1 -0
  349. package/dist/cli/workspace/remove.d.ts +3 -0
  350. package/dist/cli/workspace/remove.d.ts.map +1 -0
  351. package/dist/cli/workspace/remove.js +43 -0
  352. package/dist/cli/workspace/remove.js.map +1 -0
  353. package/dist/cli/workspace/shared.d.ts +7 -0
  354. package/dist/cli/workspace/shared.d.ts.map +1 -0
  355. package/dist/cli/workspace/shared.js +17 -0
  356. package/dist/cli/workspace/shared.js.map +1 -0
  357. package/dist/cli/workspace/use.d.ts +3 -0
  358. package/dist/cli/workspace/use.d.ts.map +1 -0
  359. package/dist/cli/workspace/use.js +27 -0
  360. package/dist/cli/workspace/use.js.map +1 -0
  361. package/dist/code-intel/chunker.d.ts +15 -0
  362. package/dist/code-intel/chunker.d.ts.map +1 -0
  363. package/dist/code-intel/chunker.js +39 -0
  364. package/dist/code-intel/chunker.js.map +1 -0
  365. package/dist/code-intel/file-discovery.d.ts +19 -0
  366. package/dist/code-intel/file-discovery.d.ts.map +1 -0
  367. package/dist/code-intel/file-discovery.js +80 -0
  368. package/dist/code-intel/file-discovery.js.map +1 -0
  369. package/dist/code-intel/hash.d.ts +2 -0
  370. package/dist/code-intel/hash.d.ts.map +1 -0
  371. package/dist/code-intel/hash.js +5 -0
  372. package/dist/code-intel/hash.js.map +1 -0
  373. package/dist/code-intel/index.d.ts +17 -0
  374. package/dist/code-intel/index.d.ts.map +1 -0
  375. package/dist/code-intel/index.js +11 -0
  376. package/dist/code-intel/index.js.map +1 -0
  377. package/dist/code-intel/indexer.d.ts +43 -0
  378. package/dist/code-intel/indexer.d.ts.map +1 -0
  379. package/dist/code-intel/indexer.js +234 -0
  380. package/dist/code-intel/indexer.js.map +1 -0
  381. package/dist/code-intel/job-lock.d.ts +7 -0
  382. package/dist/code-intel/job-lock.d.ts.map +1 -0
  383. package/dist/code-intel/job-lock.js +18 -0
  384. package/dist/code-intel/job-lock.js.map +1 -0
  385. package/dist/code-intel/layer-detector.d.ts +9 -0
  386. package/dist/code-intel/layer-detector.d.ts.map +1 -0
  387. package/dist/code-intel/layer-detector.js +31 -0
  388. package/dist/code-intel/layer-detector.js.map +1 -0
  389. package/dist/code-intel/lsp-resolver.d.ts +24 -0
  390. package/dist/code-intel/lsp-resolver.d.ts.map +1 -0
  391. package/dist/code-intel/lsp-resolver.js +125 -0
  392. package/dist/code-intel/lsp-resolver.js.map +1 -0
  393. package/dist/code-intel/ranker.d.ts +42 -0
  394. package/dist/code-intel/ranker.d.ts.map +1 -0
  395. package/dist/code-intel/ranker.js +123 -0
  396. package/dist/code-intel/ranker.js.map +1 -0
  397. package/dist/code-intel/resolver.d.ts +14 -0
  398. package/dist/code-intel/resolver.d.ts.map +1 -0
  399. package/dist/code-intel/resolver.js +59 -0
  400. package/dist/code-intel/resolver.js.map +1 -0
  401. package/dist/code-intel/tsconfig-paths.d.ts +11 -0
  402. package/dist/code-intel/tsconfig-paths.d.ts.map +1 -0
  403. package/dist/code-intel/tsconfig-paths.js +67 -0
  404. package/dist/code-intel/tsconfig-paths.js.map +1 -0
  405. package/dist/code-intel/watcher.d.ts +27 -0
  406. package/dist/code-intel/watcher.d.ts.map +1 -0
  407. package/dist/code-intel/watcher.js +93 -0
  408. package/dist/code-intel/watcher.js.map +1 -0
  409. package/dist/core/board/board-column.value-object.js +1 -1
  410. package/dist/core/board/board-column.value-object.js.map +1 -1
  411. package/dist/core/board/pipeline.value-object.js +1 -1
  412. package/dist/core/board/pipeline.value-object.js.map +1 -1
  413. package/dist/core/board/skill-execution.entity.js +1 -1
  414. package/dist/core/board/skill-execution.entity.js.map +1 -1
  415. package/dist/core/board/task-title.value-object.js +1 -1
  416. package/dist/core/board/task-title.value-object.js.map +1 -1
  417. package/dist/core/ports/chat-llm.d.ts +36 -0
  418. package/dist/core/ports/chat-llm.d.ts.map +1 -0
  419. package/dist/core/ports/chat-llm.js +2 -0
  420. package/dist/core/ports/chat-llm.js.map +1 -0
  421. package/dist/core/ports/code-embedding.d.ts +42 -0
  422. package/dist/core/ports/code-embedding.d.ts.map +1 -0
  423. package/dist/core/ports/code-embedding.js +2 -0
  424. package/dist/core/ports/code-embedding.js.map +1 -0
  425. package/dist/core/ports/code-graph.d.ts +56 -0
  426. package/dist/core/ports/code-graph.d.ts.map +1 -0
  427. package/dist/core/ports/code-graph.js +2 -0
  428. package/dist/core/ports/code-graph.js.map +1 -0
  429. package/dist/core/ports/code-meta.d.ts +37 -0
  430. package/dist/core/ports/code-meta.d.ts.map +1 -0
  431. package/dist/core/ports/code-meta.js +2 -0
  432. package/dist/core/ports/code-meta.js.map +1 -0
  433. package/dist/core/ports/code-parser.d.ts +13 -0
  434. package/dist/core/ports/code-parser.d.ts.map +1 -0
  435. package/dist/core/ports/code-parser.js +2 -0
  436. package/dist/core/ports/code-parser.js.map +1 -0
  437. package/dist/core/ports/code-vector-store.d.ts +42 -0
  438. package/dist/core/ports/code-vector-store.d.ts.map +1 -0
  439. package/dist/core/ports/code-vector-store.js +2 -0
  440. package/dist/core/ports/code-vector-store.js.map +1 -0
  441. package/dist/core/ports/docker-control.d.ts +44 -0
  442. package/dist/core/ports/docker-control.d.ts.map +1 -0
  443. package/dist/core/ports/docker-control.js +8 -0
  444. package/dist/core/ports/docker-control.js.map +1 -0
  445. package/dist/core/ports/hub-readiness-probe.d.ts +22 -0
  446. package/dist/core/ports/hub-readiness-probe.d.ts.map +1 -0
  447. package/dist/core/ports/hub-readiness-probe.js +2 -0
  448. package/dist/core/ports/hub-readiness-probe.js.map +1 -0
  449. package/dist/core/ports/index.d.ts +10 -0
  450. package/dist/core/ports/index.d.ts.map +1 -1
  451. package/dist/core/ports/lsp-client.d.ts +22 -0
  452. package/dist/core/ports/lsp-client.d.ts.map +1 -0
  453. package/dist/core/ports/lsp-client.js +2 -0
  454. package/dist/core/ports/lsp-client.js.map +1 -0
  455. package/dist/core/ports/ollama-control.d.ts +61 -0
  456. package/dist/core/ports/ollama-control.d.ts.map +1 -0
  457. package/dist/core/ports/ollama-control.js +7 -0
  458. package/dist/core/ports/ollama-control.js.map +1 -0
  459. package/dist/core/ports/platform-probe.d.ts +47 -0
  460. package/dist/core/ports/platform-probe.d.ts.map +1 -0
  461. package/dist/core/ports/platform-probe.js +8 -0
  462. package/dist/core/ports/platform-probe.js.map +1 -0
  463. package/dist/core/ports/storage.d.ts +62 -29
  464. package/dist/core/ports/storage.d.ts.map +1 -1
  465. package/dist/core/ports/workspace-store.d.ts +52 -0
  466. package/dist/core/ports/workspace-store.d.ts.map +1 -0
  467. package/dist/core/ports/workspace-store.js +2 -0
  468. package/dist/core/ports/workspace-store.js.map +1 -0
  469. package/dist/core/types/code.d.ts +153 -0
  470. package/dist/core/types/code.d.ts.map +1 -0
  471. package/dist/core/types/code.js +2 -0
  472. package/dist/core/types/code.js.map +1 -0
  473. package/dist/core/types/config.d.ts +1 -1
  474. package/dist/core/types/config.d.ts.map +1 -1
  475. package/dist/core/types/config.js +8 -1
  476. package/dist/core/types/config.js.map +1 -1
  477. package/dist/core/types/index.d.ts +3 -0
  478. package/dist/core/types/index.d.ts.map +1 -1
  479. package/dist/core/types/init.d.ts +29 -0
  480. package/dist/core/types/init.d.ts.map +1 -0
  481. package/dist/core/types/init.js +2 -0
  482. package/dist/core/types/init.js.map +1 -0
  483. package/dist/core/types/workspace.d.ts +78 -0
  484. package/dist/core/types/workspace.d.ts.map +1 -0
  485. package/dist/core/types/workspace.js +2 -0
  486. package/dist/core/types/workspace.js.map +1 -0
  487. package/dist/mcp/helpers.d.ts +131 -19
  488. package/dist/mcp/helpers.d.ts.map +1 -1
  489. package/dist/mcp/helpers.js +271 -141
  490. package/dist/mcp/helpers.js.map +1 -1
  491. package/dist/mcp/server.d.ts.map +1 -1
  492. package/dist/mcp/server.js +49 -5
  493. package/dist/mcp/server.js.map +1 -1
  494. package/dist/mcp/tools/code-graph.d.ts +3 -0
  495. package/dist/mcp/tools/code-graph.d.ts.map +1 -0
  496. package/dist/mcp/tools/code-graph.js +330 -0
  497. package/dist/mcp/tools/code-graph.js.map +1 -0
  498. package/dist/mcp/tools/code-hybrid.d.ts +3 -0
  499. package/dist/mcp/tools/code-hybrid.d.ts.map +1 -0
  500. package/dist/mcp/tools/code-hybrid.js +142 -0
  501. package/dist/mcp/tools/code-hybrid.js.map +1 -0
  502. package/dist/mcp/tools/code-search.d.ts +3 -0
  503. package/dist/mcp/tools/code-search.d.ts.map +1 -0
  504. package/dist/mcp/tools/code-search.js +95 -0
  505. package/dist/mcp/tools/code-search.js.map +1 -0
  506. package/dist/mcp/tools/database.d.ts.map +1 -1
  507. package/dist/mcp/tools/database.js +86 -97
  508. package/dist/mcp/tools/database.js.map +1 -1
  509. package/dist/mcp/tools/estimate.d.ts.map +1 -1
  510. package/dist/mcp/tools/estimate.js +106 -82
  511. package/dist/mcp/tools/estimate.js.map +1 -1
  512. package/dist/mcp/tools/graph.d.ts.map +1 -1
  513. package/dist/mcp/tools/graph.js +142 -157
  514. package/dist/mcp/tools/graph.js.map +1 -1
  515. package/dist/mcp/tools/issue.d.ts.map +1 -1
  516. package/dist/mcp/tools/issue.js +172 -172
  517. package/dist/mcp/tools/issue.js.map +1 -1
  518. package/dist/mcp/tools/push.d.ts.map +1 -1
  519. package/dist/mcp/tools/push.js +70 -100
  520. package/dist/mcp/tools/push.js.map +1 -1
  521. package/dist/mcp/tools/query.d.ts.map +1 -1
  522. package/dist/mcp/tools/query.js +187 -246
  523. package/dist/mcp/tools/query.js.map +1 -1
  524. package/dist/mcp/tools/search.d.ts.map +1 -1
  525. package/dist/mcp/tools/search.js +25 -22
  526. package/dist/mcp/tools/search.js.map +1 -1
  527. package/dist/mcp/tools/workspace.d.ts.map +1 -1
  528. package/dist/mcp/tools/workspace.js +120 -73
  529. package/dist/mcp/tools/workspace.js.map +1 -1
  530. package/dist/use-cases/build-graph.d.ts +1 -1
  531. package/dist/use-cases/build-graph.d.ts.map +1 -1
  532. package/dist/use-cases/build-graph.js +63 -50
  533. package/dist/use-cases/build-graph.js.map +1 -1
  534. package/dist/use-cases/code-search.d.ts +60 -0
  535. package/dist/use-cases/code-search.d.ts.map +1 -0
  536. package/dist/use-cases/code-search.js +163 -0
  537. package/dist/use-cases/code-search.js.map +1 -0
  538. package/dist/use-cases/embed.d.ts +1 -1
  539. package/dist/use-cases/embed.d.ts.map +1 -1
  540. package/dist/use-cases/embed.js +5 -5
  541. package/dist/use-cases/embed.js.map +1 -1
  542. package/dist/use-cases/index-code.d.ts +24 -0
  543. package/dist/use-cases/index-code.d.ts.map +1 -0
  544. package/dist/use-cases/index-code.js +43 -0
  545. package/dist/use-cases/index-code.js.map +1 -0
  546. package/dist/use-cases/init/bootstrap-hub.d.ts +55 -0
  547. package/dist/use-cases/init/bootstrap-hub.d.ts.map +1 -0
  548. package/dist/use-cases/init/bootstrap-hub.js +116 -0
  549. package/dist/use-cases/init/bootstrap-hub.js.map +1 -0
  550. package/dist/use-cases/init/check-dims-conflict.d.ts +33 -0
  551. package/dist/use-cases/init/check-dims-conflict.d.ts.map +1 -0
  552. package/dist/use-cases/init/check-dims-conflict.js +39 -0
  553. package/dist/use-cases/init/check-dims-conflict.js.map +1 -0
  554. package/dist/use-cases/init/check-hub-exists.d.ts +23 -0
  555. package/dist/use-cases/init/check-hub-exists.d.ts.map +1 -0
  556. package/dist/use-cases/init/check-hub-exists.js +39 -0
  557. package/dist/use-cases/init/check-hub-exists.js.map +1 -0
  558. package/dist/use-cases/init/check-ports.d.ts +18 -0
  559. package/dist/use-cases/init/check-ports.d.ts.map +1 -0
  560. package/dist/use-cases/init/check-ports.js +25 -0
  561. package/dist/use-cases/init/check-ports.js.map +1 -0
  562. package/dist/use-cases/init/check-versions.d.ts +37 -0
  563. package/dist/use-cases/init/check-versions.d.ts.map +1 -0
  564. package/dist/use-cases/init/check-versions.js +50 -0
  565. package/dist/use-cases/init/check-versions.js.map +1 -0
  566. package/dist/use-cases/init/clear-stale-active.d.ts +20 -0
  567. package/dist/use-cases/init/clear-stale-active.d.ts.map +1 -0
  568. package/dist/use-cases/init/clear-stale-active.js +26 -0
  569. package/dist/use-cases/init/clear-stale-active.js.map +1 -0
  570. package/dist/use-cases/init/ensure-embedding-model.d.ts +20 -0
  571. package/dist/use-cases/init/ensure-embedding-model.d.ts.map +1 -0
  572. package/dist/use-cases/init/ensure-embedding-model.js +24 -0
  573. package/dist/use-cases/init/ensure-embedding-model.js.map +1 -0
  574. package/dist/use-cases/init/ensure-ollama-running.d.ts +19 -0
  575. package/dist/use-cases/init/ensure-ollama-running.d.ts.map +1 -0
  576. package/dist/use-cases/init/ensure-ollama-running.js +24 -0
  577. package/dist/use-cases/init/ensure-ollama-running.js.map +1 -0
  578. package/dist/use-cases/init/health-check-existing-llm.d.ts +25 -0
  579. package/dist/use-cases/init/health-check-existing-llm.d.ts.map +1 -0
  580. package/dist/use-cases/init/health-check-existing-llm.js +42 -0
  581. package/dist/use-cases/init/health-check-existing-llm.js.map +1 -0
  582. package/dist/use-cases/init/install-ollama.d.ts +27 -0
  583. package/dist/use-cases/init/install-ollama.d.ts.map +1 -0
  584. package/dist/use-cases/init/install-ollama.js +51 -0
  585. package/dist/use-cases/init/install-ollama.js.map +1 -0
  586. package/dist/use-cases/init/probe-llm.d.ts +32 -0
  587. package/dist/use-cases/init/probe-llm.d.ts.map +1 -0
  588. package/dist/use-cases/init/probe-llm.js +42 -0
  589. package/dist/use-cases/init/probe-llm.js.map +1 -0
  590. package/dist/use-cases/init/resolve-hub-ports.d.ts +46 -0
  591. package/dist/use-cases/init/resolve-hub-ports.d.ts.map +1 -0
  592. package/dist/use-cases/init/resolve-hub-ports.js +77 -0
  593. package/dist/use-cases/init/resolve-hub-ports.js.map +1 -0
  594. package/dist/use-cases/init/validate-workspace-name.d.ts +26 -0
  595. package/dist/use-cases/init/validate-workspace-name.d.ts.map +1 -0
  596. package/dist/use-cases/init/validate-workspace-name.js +39 -0
  597. package/dist/use-cases/init/validate-workspace-name.js.map +1 -0
  598. package/dist/use-cases/init/wait-for-docker.d.ts +16 -0
  599. package/dist/use-cases/init/wait-for-docker.d.ts.map +1 -0
  600. package/dist/use-cases/init/wait-for-docker.js +16 -0
  601. package/dist/use-cases/init/wait-for-docker.js.map +1 -0
  602. package/dist/use-cases/init/write-config-env.d.ts +32 -0
  603. package/dist/use-cases/init/write-config-env.d.ts.map +1 -0
  604. package/dist/use-cases/init/write-config-env.js +118 -0
  605. package/dist/use-cases/init/write-config-env.js.map +1 -0
  606. package/dist/use-cases/move-task.js +2 -2
  607. package/dist/use-cases/move-task.js.map +1 -1
  608. package/dist/use-cases/pull-db.d.ts +1 -1
  609. package/dist/use-cases/pull-db.d.ts.map +1 -1
  610. package/dist/use-cases/pull-db.js +3 -3
  611. package/dist/use-cases/pull-db.js.map +1 -1
  612. package/dist/use-cases/pull-git.d.ts +1 -1
  613. package/dist/use-cases/pull-git.d.ts.map +1 -1
  614. package/dist/use-cases/pull-git.js +5 -5
  615. package/dist/use-cases/pull-git.js.map +1 -1
  616. package/dist/use-cases/pull-github.d.ts +1 -1
  617. package/dist/use-cases/pull-github.d.ts.map +1 -1
  618. package/dist/use-cases/pull-github.js +6 -6
  619. package/dist/use-cases/pull-github.js.map +1 -1
  620. package/dist/use-cases/pull.d.ts +1 -1
  621. package/dist/use-cases/pull.d.ts.map +1 -1
  622. package/dist/use-cases/pull.js +6 -6
  623. package/dist/use-cases/pull.js.map +1 -1
  624. package/dist/use-cases/push.d.ts +2 -2
  625. package/dist/use-cases/push.d.ts.map +1 -1
  626. package/dist/use-cases/push.js +8 -8
  627. package/dist/use-cases/push.js.map +1 -1
  628. package/dist/use-cases/register-code-project.d.ts +29 -0
  629. package/dist/use-cases/register-code-project.d.ts.map +1 -0
  630. package/dist/use-cases/register-code-project.js +27 -0
  631. package/dist/use-cases/register-code-project.js.map +1 -0
  632. package/dist/use-cases/unregister-code-project.d.ts +11 -0
  633. package/dist/use-cases/unregister-code-project.d.ts.map +1 -0
  634. package/dist/use-cases/unregister-code-project.js +19 -0
  635. package/dist/use-cases/unregister-code-project.js.map +1 -0
  636. package/dist/use-cases/watch-code.d.ts +33 -0
  637. package/dist/use-cases/watch-code.d.ts.map +1 -0
  638. package/dist/use-cases/watch-code.js +52 -0
  639. package/dist/use-cases/watch-code.js.map +1 -0
  640. package/dist/workspace/active-workspace.d.ts +26 -0
  641. package/dist/workspace/active-workspace.d.ts.map +1 -0
  642. package/dist/workspace/active-workspace.js +69 -0
  643. package/dist/workspace/active-workspace.js.map +1 -0
  644. package/dist/workspace/adf.d.ts.map +1 -1
  645. package/dist/workspace/adf.js +20 -19
  646. package/dist/workspace/adf.js.map +1 -1
  647. package/dist/workspace/config.d.ts +11 -0
  648. package/dist/workspace/config.d.ts.map +1 -1
  649. package/dist/workspace/config.js +76 -22
  650. package/dist/workspace/config.js.map +1 -1
  651. package/dist/workspace/hub-config.d.ts +74 -0
  652. package/dist/workspace/hub-config.d.ts.map +1 -0
  653. package/dist/workspace/hub-config.js +164 -0
  654. package/dist/workspace/hub-config.js.map +1 -0
  655. package/dist/workspace/registry.d.ts +23 -3
  656. package/dist/workspace/registry.d.ts.map +1 -1
  657. package/dist/workspace/registry.js +32 -14
  658. package/dist/workspace/registry.js.map +1 -1
  659. package/dist/workspace/resolver.d.ts +20 -18
  660. package/dist/workspace/resolver.d.ts.map +1 -1
  661. package/dist/workspace/resolver.js +100 -59
  662. package/dist/workspace/resolver.js.map +1 -1
  663. package/package.json +13 -4
  664. package/templates/code-docker-compose.yml +51 -0
  665. package/templates/env.example +16 -0
  666. package/templates/hub-config.env +65 -0
  667. package/templates/hub-docker-compose.yml +88 -0
  668. package/templates/migrate-to-hub.sql +90 -0
  669. package/dist/cli/workspaces.d.ts +0 -3
  670. package/dist/cli/workspaces.d.ts.map +0 -1
  671. package/dist/cli/workspaces.js +0 -34
  672. package/dist/cli/workspaces.js.map +0 -1
@@ -1,402 +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
- }
221
+ finally {
222
+ await closeHub();
204
223
  }
205
- void flags;
206
- return { jira, proxy, git, github, csv, db };
207
224
  }
208
- async function runInitNonInteractive(flags) {
209
- console.log(chalk.bold('\n Argustack — non-interactive setup\n'));
210
- if (!flags.name) {
211
- 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
+ };
212
240
  }
213
- const workspaceName = sanitizeName(flags.name);
214
- const workspaceDir = resolve(process.cwd(), workspaceName);
215
- if (isWorkspace(workspaceDir)) {
216
- throw new Error(`Workspace '${workspaceName}' already exists at ${workspaceDir}`);
241
+ catch {
242
+ return { ...HUB_PORT_DEFAULTS };
217
243
  }
218
- const selectedSources = flags.source
219
- ? flags.source.split(',').map((s) => s.trim().toLowerCase())
220
- : [];
221
- for (const s of selectedSources) {
222
- if (!ALL_SOURCES.includes(s)) {
223
- 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;
224
253
  }
225
- }
226
- let jiraResult = null;
227
- let gitResult = null;
228
- let githubResult = null;
229
- let csvResult = null;
230
- let dbResult = null;
231
- for (const source of selectedSources) {
232
- switch (source) {
233
- case 'jira':
234
- jiraResult = await setupJiraFromFlags(flags);
235
- break;
236
- case 'git':
237
- gitResult = setupGitFromFlags(flags);
238
- break;
239
- case 'github':
240
- githubResult = setupGithubFromFlags(flags);
241
- break;
242
- case 'csv':
243
- csvResult = setupCsvFromFlags(flags);
244
- break;
245
- case 'db':
246
- dbResult = setupDbFromFlags(flags);
247
- break;
248
- case 'board':
249
- 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;
250
262
  }
251
- }
252
- const dbPort = flags.dbPort
253
- ? parseInt(flags.dbPort, 10)
254
- : await findAvailablePort(DEFAULT_DB_PORT);
255
- const pgwebPort = flags.pgwebPort
256
- ? parseInt(flags.pgwebPort, 10)
257
- : await findAvailablePort(DEFAULT_PGWEB_PORT);
258
- const spinner = ora('Creating workspace...').start();
259
- try {
260
- createWorkspaceFiles(workspaceDir, jiraResult, gitResult, githubResult, csvResult, dbResult, dbPort, pgwebPort, workspaceName, null);
261
- 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;
262
273
  }
263
274
  catch (err) {
264
- spinner.fail('Failed');
265
- 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();
266
281
  }
267
- printSummary(workspaceDir, jiraResult, gitResult, githubResult, csvResult, dbResult, pgwebPort, false, null);
268
282
  }
269
- async function runInitInteractive(flags) {
270
- console.log('');
271
- console.log(chalk.bold(' Argustack workspace setup'));
272
- console.log(chalk.dim(' Cross-reference Jira + Git + DB to analyze your project.\n'));
273
- const cwd = process.cwd();
274
- const existing = scanWorkspaces(cwd);
275
- let workspaceName;
276
- let workspaceDir;
277
- if (existing.length > 0) {
278
- console.log(chalk.dim(` Found ${String(existing.length)} workspace(s) in ${basename(cwd)}:`));
279
- for (const ws of existing) {
280
- const sources = ws.config.order.length > 0
281
- ? ws.config.order.map((s) => SOURCE_META[s].label).join(', ')
282
- : 'no sources';
283
- 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;
284
291
  }
285
- console.log('');
286
- const action = await select({
287
- message: 'What would you like to do?',
288
- choices: [
289
- { value: 'new', name: 'Create new workspace' },
290
- ...existing.map((ws) => ({
291
- value: `update:${ws.name}`,
292
- name: `Update ${ws.name}`,
293
- })),
294
- ],
295
- });
296
- if (action.startsWith('update:')) {
297
- const updateName = action.slice('update:'.length);
298
- const ws = existing.find((w) => w.name === updateName);
299
- if (!ws) {
300
- throw new Error(`Workspace '${updateName}' not found`);
292
+ if (flags.interactive === false) {
293
+ if (entry.suggested === null) {
294
+ return null;
301
295
  }
302
- console.log(chalk.dim(`\n Updating workspace: ${updateName}\n`));
303
- workspaceName = updateName;
304
- workspaceDir = ws.path;
296
+ finalPorts[entry.key] = entry.suggested;
297
+ continue;
305
298
  }
306
- else {
307
- const rawName = flags.name ?? await input({
308
- message: 'Workspace name:',
309
- validate: (val) => {
310
- if (val.includes('://') || val.includes('.') || val.includes('/')) {
311
- return 'This looks like a URL. Enter a short project name (e.g. "paperlink", "my-project")';
312
- }
313
- const sanitized = sanitizeName(val);
314
- if (!sanitized) {
315
- return 'Name is required (letters, numbers, hyphens)';
316
- }
317
- if (sanitized.length > 30) {
318
- return 'Name too long — keep it under 30 characters';
319
- }
320
- if (existing.some((ws) => ws.name === sanitized)) {
321
- return `Workspace '${sanitized}' already exists`;
322
- }
323
- return true;
324
- },
325
- });
326
- workspaceName = sanitizeName(rawName);
327
- 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;
328
304
  }
329
- }
330
- else {
331
- const rawName = flags.name ?? await input({
332
- message: 'Workspace name:',
333
- validate: (val) => {
334
- if (val.includes('://') || val.includes('.') || val.includes('/')) {
335
- return 'This looks like a URL. Enter a short project name (e.g. "paperlink", "my-project")';
336
- }
337
- const sanitized = sanitizeName(val);
338
- if (!sanitized) {
339
- return 'Name is required (letters, numbers, hyphens)';
340
- }
341
- if (sanitized.length > 30) {
342
- return 'Name too long — keep it under 30 characters';
343
- }
344
- return true;
345
- },
346
- });
347
- workspaceName = sanitizeName(rawName);
348
- workspaceDir = join(cwd, workspaceName);
349
- }
350
- if (isWorkspace(workspaceDir)) {
351
- console.log(chalk.yellow(`\n Workspace '${workspaceName}' already exists.`));
352
- const proceed = await confirm({ message: 'Reinitialize this workspace?', default: false });
353
- if (!proceed) {
354
- console.log(chalk.dim(' Cancelled.'));
355
- 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;
356
311
  }
357
312
  }
358
- process.env['ARGUSTACK_INIT_WORKSPACE'] = workspaceName;
359
- const { jira, proxy, git, github, csv, db } = await setupSources(flags);
360
- delete process.env['ARGUSTACK_INIT_WORKSPACE'];
361
- console.log('');
362
- console.log(chalk.dim(' Argustack internal database (Docker):'));
363
- const defaultDbPort = await findAvailablePort(DEFAULT_DB_PORT);
364
- const defaultPgwebPort = await findAvailablePort(DEFAULT_PGWEB_PORT);
365
- const dbPortStr = await input({
366
- message: 'PostgreSQL port:', default: flags.dbPort ?? String(defaultDbPort),
367
- validate: (val) => validatePort(val, 1024),
368
- });
369
- const pgwebPortStr = await input({
370
- message: 'pgweb UI port:', default: flags.pgwebPort ?? String(defaultPgwebPort),
371
- 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,
372
342
  });
373
- const dbPort = parseInt(dbPortStr, 10);
374
- const pgwebPort = parseInt(pgwebPortStr, 10);
375
- const spinner = ora('Creating workspace...').start();
376
- try {
377
- createWorkspaceFiles(workspaceDir, jira, git, github, csv, db, dbPort, pgwebPort, workspaceName, proxy);
378
- spinner.succeed(`Workspace '${workspaceName}' created!`);
343
+ if (result.ok) {
344
+ return { ok: true };
379
345
  }
380
- catch (err) {
381
- spinner.fail('Failed to create workspace');
382
- console.log(chalk.red(`\n Error: ${getErrorMsg(err)}`));
383
- return;
384
- }
385
- const autoStart = await confirm({
386
- message: 'Start database and sync now?',
387
- default: true,
388
- });
389
- printSummary(workspaceDir, jira, git, github, csv, db, pgwebPort, autoStart, proxy);
390
- if (autoStart) {
391
- 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);
392
353
  }
354
+ resetHubConfigCache();
393
355
  }
394
- export async function runInit(flags = {}) {
356
+ async function setupLlm(flags, platform, ollama, probe) {
395
357
  if (flags.interactive === false) {
396
- 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`));
397
423
  }
398
424
  else {
399
- 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;
400
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 };
401
436
  }
402
437
  //# sourceMappingURL=index.js.map