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
package/dist/cli/sync.js CHANGED
@@ -1,144 +1,103 @@
1
1
  import chalk from 'chalk';
2
2
  import ora from 'ora';
3
- import dotenv from 'dotenv';
4
- import { requireWorkspace } from '../workspace/resolver.js';
5
- import { readConfig, writeConfig, getEnabledSources } from '../workspace/config.js';
6
3
  import { JiraProvider } from '../adapters/jira/index.js';
7
- import { ProxyJiraProvider, loadProxyConfig, proxyConfigExists } from '../adapters/jira-proxy/index.js';
4
+ import { ProxyJiraProvider, loadProxyConfigForWorkspace, proxyConfigExistsForWorkspace, } from '../adapters/jira-proxy/index.js';
8
5
  import { GitProvider } from '../adapters/git/index.js';
9
6
  import { CsvProvider } from '../adapters/csv/index.js';
7
+ import { GitHubProvider } from '../adapters/github/index.js';
8
+ import { DbProvider } from '../adapters/db/index.js';
10
9
  import { PostgresStorage } from '../adapters/postgres/index.js';
11
10
  import { PullUseCase } from '../use-cases/pull.js';
12
11
  import { PullGitUseCase } from '../use-cases/pull-git.js';
13
- import { GitHubProvider } from '../adapters/github/index.js';
14
12
  import { PullGitHubUseCase } from '../use-cases/pull-github.js';
15
- import { DbProvider } from '../adapters/db/index.js';
16
13
  import { PullDbUseCase } from '../use-cases/pull-db.js';
17
- import { registerWorkspace } from '../workspace/registry.js';
18
- import { ALL_SOURCES, SOURCE_META } from '../core/types/index.js';
19
- import { maskHost } from './init/types.js';
20
- /**
21
- * Create PostgresStorage from workspace .env.
22
- */
23
- function createStorage(workspaceRoot) {
24
- dotenv.config({ path: `${workspaceRoot}/.env`, quiet: true });
25
- return new PostgresStorage({
26
- host: process.env['DB_HOST'] ?? 'localhost',
27
- port: parseInt(process.env['DB_PORT'] ?? '5434', 10),
28
- user: process.env['DB_USER'] ?? 'argustack',
29
- password: process.env['DB_PASSWORD'] ?? 'argustack_local',
30
- database: process.env['DB_NAME'] ?? 'argustack',
31
- });
14
+ import { loadHubConfig } from '../workspace/hub-config.js';
15
+ import { openHubStore, resolveWorkspaceFlag } from './add/shared.js';
16
+ import { ALL_SOURCES } from '../core/types/index.js';
17
+ function createStorage() {
18
+ const hub = loadHubConfig();
19
+ return new PostgresStorage(hub.db);
32
20
  }
33
- /**
34
- * Sync Jira data PostgreSQL.
35
- */
36
- async function syncJira(workspaceRoot, options) {
37
- dotenv.config({ path: `${workspaceRoot}/.env`, quiet: true });
38
- const config = readConfig(workspaceRoot);
39
- let issueTypes = config?.sources.jira?.issueTypeIds;
40
- if (!issueTypes && config?.sources.jira?.issueTypes) {
41
- issueTypes = await resolveTypeNamesToIds(config.sources.jira.issueTypes, workspaceRoot);
21
+ function resolveJiraProjectKeys(workspace, options) {
22
+ if (options.project !== undefined && options.project !== '') {
23
+ return [options.project];
24
+ }
25
+ const bound = workspace.settings?.jiraProjectKeys;
26
+ if (bound !== undefined) {
27
+ return [...bound];
28
+ }
29
+ return [];
30
+ }
31
+ async function syncJira(workspace, options) {
32
+ const hub = loadHubConfig();
33
+ const projectKeys = resolveJiraProjectKeys(workspace, options);
34
+ if (projectKeys.length === 0) {
35
+ console.log(chalk.yellow(` No Jira projects bound to workspace "${workspace.id}"`));
36
+ console.log(chalk.dim(` Run: argustack add jira --workspace ${workspace.id} --projects KEY,KEY2`));
37
+ return;
42
38
  }
43
- const useProxy = proxyConfigExists(workspaceRoot);
44
39
  let source;
45
- if (useProxy) {
46
- const proxyConfig = loadProxyConfig(workspaceRoot);
47
- source = new ProxyJiraProvider(proxyConfig, issueTypes);
40
+ if (proxyConfigExistsForWorkspace(workspace.id)) {
41
+ const proxyConfig = loadProxyConfigForWorkspace(workspace.id);
42
+ source = new ProxyJiraProvider(proxyConfig);
48
43
  console.log(chalk.dim(` Using proxy: ${proxyConfig.name}`));
49
44
  }
50
- else {
51
- const jiraUrl = process.env['JIRA_URL'];
52
- const jiraEmail = process.env['JIRA_EMAIL'];
53
- const jiraToken = process.env['JIRA_API_TOKEN'];
54
- if (!jiraUrl || !jiraEmail || !jiraToken) {
55
- console.log(chalk.red(' Missing Jira credentials in .env'));
56
- console.log(chalk.dim(' Required: JIRA_URL, JIRA_EMAIL, JIRA_API_TOKEN'));
57
- process.exit(1);
58
- }
45
+ else if (hub.credentials.jiraUrl !== undefined && hub.credentials.jiraUrl !== '' &&
46
+ hub.credentials.jiraEmail !== undefined && hub.credentials.jiraEmail !== '' &&
47
+ hub.credentials.jiraApiToken !== undefined && hub.credentials.jiraApiToken !== '') {
59
48
  source = new JiraProvider({
60
- host: jiraUrl,
61
- email: jiraEmail,
62
- apiToken: jiraToken,
63
- }, issueTypes);
49
+ host: hub.credentials.jiraUrl,
50
+ email: hub.credentials.jiraEmail,
51
+ apiToken: hub.credentials.jiraApiToken,
52
+ });
53
+ }
54
+ else {
55
+ console.log(chalk.red(' Missing Jira credentials in ~/.argustack/config.env'));
56
+ console.log(chalk.dim(` Run: argustack add jira --workspace ${workspace.id} --url ... --email ... --token ...`));
57
+ return;
64
58
  }
65
- const configuredProjects = (process.env['JIRA_PROJECTS'] ?? '')
66
- .split(',')
67
- .map((p) => p.trim())
68
- .filter(Boolean);
69
- const storage = createStorage(workspaceRoot);
59
+ const storage = createStorage();
70
60
  const spinner = ora('Syncing Jira...').start();
71
61
  try {
72
- const projectKeys = options.project
73
- ? [options.project]
74
- : configuredProjects.length > 0
75
- ? configuredProjects
76
- : null;
77
- if (projectKeys) {
78
- const allResults = [];
79
- for (const projectKey of projectKeys) {
80
- const pullUseCase = new PullUseCase(source, storage);
81
- const results = await pullUseCase.execute({
82
- projectKey,
83
- ...(options.since ? { since: options.since } : {}),
84
- onProgress: (msg) => { spinner.text = msg; },
85
- });
86
- allResults.push(...results);
87
- }
88
- spinner.succeed('Jira sync complete!');
89
- console.log('');
90
- for (const r of allResults) {
91
- console.log(chalk.green(` ${r.projectKey}: ${String(r.issuesCount)} issues, ${String(r.commentsCount)} comments, ${String(r.changelogsCount)} changelogs`));
92
- }
93
- }
94
- else {
95
- const pullUseCase = new PullUseCase(source, storage);
96
- const results = await pullUseCase.execute({
97
- ...(options.since ? { since: options.since } : {}),
62
+ for (const projectKey of projectKeys) {
63
+ const pull = new PullUseCase(source, storage);
64
+ const results = await pull.execute(workspace.id, {
65
+ projectKey,
66
+ ...(options.since !== undefined && options.since !== '' ? { since: options.since } : {}),
98
67
  onProgress: (msg) => { spinner.text = msg; },
99
68
  });
100
- spinner.succeed('Jira sync complete!');
101
- console.log('');
102
69
  for (const r of results) {
103
70
  console.log(chalk.green(` ${r.projectKey}: ${String(r.issuesCount)} issues, ${String(r.commentsCount)} comments, ${String(r.changelogsCount)} changelogs`));
104
71
  }
105
72
  }
106
- console.log('');
73
+ spinner.succeed('Jira sync complete!');
74
+ }
75
+ catch (err) {
76
+ spinner.fail(`Jira sync failed: ${err instanceof Error ? err.message : String(err)}`);
107
77
  }
108
78
  finally {
109
79
  await storage.close();
110
80
  }
111
81
  }
112
- /**
113
- * Sync Git data → PostgreSQL.
114
- * Supports multiple repos via GIT_REPO_PATHS (comma-separated).
115
- * Falls back to GIT_REPO_PATH for backwards compatibility.
116
- */
117
- async function syncGit(workspaceRoot, options) {
118
- dotenv.config({ path: `${workspaceRoot}/.env`, quiet: true });
119
- const rawPaths = process.env['GIT_REPO_PATHS'] ?? process.env['GIT_REPO_PATH'];
120
- if (!rawPaths) {
121
- console.log(chalk.red(' Missing Git repo paths in .env'));
122
- console.log(chalk.dim(' Required: GIT_REPO_PATHS'));
123
- process.exit(1);
82
+ async function syncGit(workspace, options) {
83
+ const repos = workspace.settings?.gitRepoPaths ?? [];
84
+ if (repos.length === 0) {
85
+ console.log(chalk.yellow(` No git repos bound to workspace "${workspace.id}"`));
86
+ console.log(chalk.dim(` Run: argustack add git --workspace ${workspace.id} --root /path/to/repo`));
87
+ return;
124
88
  }
125
- const repoPaths = rawPaths.split(',').map((p) => p.trim()).filter(Boolean);
126
- if (repoPaths.length === 0) {
127
- console.log(chalk.red(' No Git repo paths configured in .env'));
128
- process.exit(1);
129
- }
130
- const storage = createStorage(workspaceRoot);
89
+ const storage = createStorage();
131
90
  const spinner = ora('Syncing Git...').start();
91
+ const since = options.since !== undefined && options.since !== '' ? new Date(options.since) : undefined;
132
92
  try {
133
- const since = options.since ? new Date(options.since) : undefined;
134
- for (const repoPath of repoPaths) {
93
+ for (const repoPath of repos) {
135
94
  const repoName = repoPath.split('/').pop() ?? repoPath;
136
- spinner.text = `Syncing Git: ${repoName}...`;
95
+ spinner.text = `Syncing Git: ${repoName}`;
137
96
  try {
138
97
  const git = new GitProvider(repoPath);
139
- const pullGit = new PullGitUseCase(git, storage);
140
- const result = await pullGit.execute(repoPath, {
141
- ...(since ? { since } : {}),
98
+ const pull = new PullGitUseCase(git, storage);
99
+ const result = await pull.execute(workspace.id, repoPath, {
100
+ ...(since != null ? { since } : {}),
142
101
  onProgress: (msg) => { spinner.text = msg; },
143
102
  });
144
103
  console.log(chalk.green(` ✓ ${repoName}: ${String(result.commitsCount)} commits, ${String(result.filesCount)} files, ${String(result.issueRefsCount)} issue refs`));
@@ -148,273 +107,183 @@ async function syncGit(workspaceRoot, options) {
148
107
  }
149
108
  }
150
109
  spinner.succeed('Git sync complete!');
151
- console.log('');
152
110
  }
153
111
  finally {
154
112
  await storage.close();
155
113
  }
156
114
  }
157
- /**
158
- * Sync GitHub data → PostgreSQL.
159
- */
160
- async function syncGithub(workspaceRoot, options) {
161
- dotenv.config({ path: `${workspaceRoot}/.env`, quiet: true });
162
- const githubToken = process.env['GITHUB_TOKEN'];
163
- const githubOwner = process.env['GITHUB_OWNER'];
164
- const githubRepo = process.env['GITHUB_REPO'];
165
- if (!githubToken || !githubOwner || !githubRepo) {
166
- console.log(chalk.red(' Missing GitHub credentials in .env'));
167
- console.log(chalk.dim(' Required: GITHUB_TOKEN, GITHUB_OWNER, GITHUB_REPO'));
168
- process.exit(1);
115
+ async function syncGithub(workspace, options) {
116
+ const hub = loadHubConfig();
117
+ if (hub.credentials.githubToken === undefined || hub.credentials.githubToken === '') {
118
+ console.log(chalk.red(' Missing GITHUB_TOKEN in ~/.argustack/config.env'));
119
+ return;
169
120
  }
170
- const github = new GitHubProvider({
171
- token: githubToken,
172
- owner: githubOwner,
173
- repo: githubRepo,
174
- });
175
- const storage = createStorage(workspaceRoot);
121
+ const repos = workspace.settings?.githubRepos ?? [];
122
+ if (repos.length === 0) {
123
+ console.log(chalk.yellow(` No GitHub repos bound to workspace "${workspace.id}"`));
124
+ console.log(chalk.dim(` Run: argustack add github --workspace ${workspace.id} --owner X --repo Y`));
125
+ return;
126
+ }
127
+ const storage = createStorage();
176
128
  const spinner = ora('Syncing GitHub PRs...').start();
129
+ const since = options.since !== undefined && options.since !== '' ? new Date(options.since) : undefined;
177
130
  try {
178
- const pullGithub = new PullGitHubUseCase(github, storage);
179
- const repoFullName = `${githubOwner}/${githubRepo}`;
180
- const since = options.since ? new Date(options.since) : undefined;
181
- const result = await pullGithub.execute(repoFullName, {
182
- ...(since ? { since } : {}),
183
- onProgress: (msg) => { spinner.text = msg; },
184
- });
131
+ for (const { owner, repo } of repos) {
132
+ const provider = new GitHubProvider({ token: hub.credentials.githubToken, owner, repo });
133
+ const pull = new PullGitHubUseCase(provider, storage);
134
+ const repoFullName = `${owner}/${repo}`;
135
+ spinner.text = `Syncing GitHub: ${repoFullName}`;
136
+ const result = await pull.execute(workspace.id, repoFullName, {
137
+ ...(since != null ? { since } : {}),
138
+ onProgress: (msg) => { spinner.text = msg; },
139
+ });
140
+ console.log(chalk.green(` ✓ ${repoFullName}: ${String(result.prsCount)} PRs, ${String(result.reviewsCount)} reviews, ${String(result.releasesCount)} releases`));
141
+ }
185
142
  spinner.succeed('GitHub sync complete!');
186
- console.log('');
187
- console.log(chalk.green(` ${result.prsCount} PRs, ${result.reviewsCount} reviews, ${result.releasesCount} releases`));
188
- console.log('');
189
143
  }
190
144
  finally {
191
145
  await storage.close();
192
146
  }
193
147
  }
194
- /**
195
- * Sync Jira CSV file → PostgreSQL.
196
- */
197
- async function syncCsv(workspaceRoot, options) {
198
- dotenv.config({ path: `${workspaceRoot}/.env`, quiet: true });
199
- const csvFilePath = options.file ?? process.env['CSV_FILE_PATH'];
200
- if (!csvFilePath) {
201
- console.log(chalk.red(' Missing CSV file path'));
202
- console.log(chalk.dim(' Use --file <path> or set CSV_FILE_PATH in .env'));
203
- process.exit(1);
148
+ async function syncCsv(workspace, options) {
149
+ const explicit = options.file;
150
+ const bound = workspace.settings?.csvFilePaths ?? [];
151
+ const paths = explicit !== undefined && explicit !== '' ? [explicit] : bound.map((b) => b.path);
152
+ if (paths.length === 0) {
153
+ console.log(chalk.yellow(` No CSV files bound to workspace "${workspace.id}"`));
154
+ return;
204
155
  }
205
- const source = new CsvProvider(csvFilePath);
206
- const storage = createStorage(workspaceRoot);
156
+ const storage = createStorage();
207
157
  const spinner = ora('Importing Jira CSV...').start();
208
158
  try {
209
- const projects = await source.getProjects();
210
- const projectKeys = options.project
211
- ? [options.project]
212
- : projects.map((p) => p.key);
213
- const allResults = [];
214
- for (const projectKey of projectKeys) {
215
- const pullUseCase = new PullUseCase(source, storage);
216
- const results = await pullUseCase.execute({
217
- projectKey,
218
- ...(options.since ? { since: options.since } : {}),
219
- onProgress: (msg) => { spinner.text = msg; },
220
- });
221
- allResults.push(...results);
159
+ for (const csvFilePath of paths) {
160
+ const source = new CsvProvider(csvFilePath);
161
+ const projects = await source.getProjects();
162
+ const projectKeys = options.project !== undefined && options.project !== '' ? [options.project] : projects.map((p) => p.key);
163
+ for (const projectKey of projectKeys) {
164
+ const pull = new PullUseCase(source, storage);
165
+ const results = await pull.execute(workspace.id, {
166
+ projectKey,
167
+ ...(options.since !== undefined && options.since !== '' ? { since: options.since } : {}),
168
+ onProgress: (msg) => { spinner.text = msg; },
169
+ });
170
+ for (const r of results) {
171
+ console.log(chalk.green(` ${r.projectKey}: ${String(r.issuesCount)} issues, ${String(r.commentsCount)} comments`));
172
+ }
173
+ }
222
174
  }
223
175
  spinner.succeed('CSV import complete!');
224
- console.log('');
225
- for (const r of allResults) {
226
- console.log(chalk.green(` ${r.projectKey}: ${String(r.issuesCount)} issues, ${String(r.commentsCount)} comments, ${String(r.changelogsCount)} changelogs`));
227
- }
228
- console.log('');
229
176
  }
230
177
  finally {
231
178
  await storage.close();
232
179
  }
233
180
  }
234
- /**
235
- * Called from `argustack init` to run first sync immediately after workspace creation.
236
- * Always passes epoch date to force a full pull — Docker volume may contain stale data
237
- * from a previous workspace, making incremental pull return 0 results.
238
- */
239
- export async function syncJiraFromInit(workspaceRoot) {
240
- await syncJira(workspaceRoot, { since: '1970-01-01' });
241
- }
242
- export async function syncGitFromInit(workspaceRoot) {
243
- await syncGit(workspaceRoot, { since: '1970-01-01' });
244
- }
245
- export async function syncGithubFromInit(workspaceRoot) {
246
- await syncGithub(workspaceRoot, { since: '1970-01-01' });
247
- }
248
- export async function syncCsvFromInit(workspaceRoot, filePath) {
249
- await syncCsv(workspaceRoot, { since: '1970-01-01', ...(filePath ? { file: filePath } : {}) });
250
- }
251
- /**
252
- * Sync external database schema → PostgreSQL.
253
- */
254
- async function syncDb(workspaceRoot, _options) {
255
- dotenv.config({ path: `${workspaceRoot}/.env`, quiet: true });
256
- const engine = (process.env['TARGET_DB_ENGINE'] ?? 'postgresql');
257
- const host = process.env['TARGET_DB_HOST'];
258
- const port = process.env['TARGET_DB_PORT'];
259
- const user = process.env['TARGET_DB_USER'];
260
- const password = process.env['TARGET_DB_PASSWORD'];
261
- const database = process.env['TARGET_DB_NAME'];
262
- if (!host || !user || !database) {
263
- console.log(chalk.red(' Missing target database credentials in .env'));
264
- console.log(chalk.dim(' Required: TARGET_DB_HOST, TARGET_DB_USER, TARGET_DB_NAME'));
265
- process.exit(1);
181
+ async function syncDb(workspace, _options) {
182
+ const dbs = workspace.settings?.dbConfigs ?? [];
183
+ if (dbs.length === 0) {
184
+ console.log(chalk.yellow(` No external DBs bound to workspace "${workspace.id}"`));
185
+ return;
266
186
  }
267
- const sourceName = `${engine}:${maskHost(host)}:${port ?? ''}/${database}`;
268
- const db = new DbProvider({
269
- engine,
270
- host,
271
- port: parseInt(port ?? '5432', 10),
272
- user,
273
- password: password ?? '',
274
- database,
275
- name: sourceName,
276
- });
277
- const storage = createStorage(workspaceRoot);
187
+ const storage = createStorage();
278
188
  const spinner = ora('Syncing database schema...').start();
279
189
  try {
280
- const pullDb = new PullDbUseCase(db, storage);
281
- const result = await pullDb.execute(sourceName, {
282
- onProgress: (msg) => { spinner.text = msg; },
283
- });
284
- spinner.succeed('Database sync complete!');
285
- console.log('');
286
- console.log(chalk.green(` ${String(result.tablesCount)} tables, ${String(result.columnsCount)} columns, ${String(result.foreignKeysCount)} FKs, ${String(result.indexesCount)} indexes`));
287
- console.log('');
190
+ for (const cfg of dbs) {
191
+ const provider = new DbProvider({
192
+ engine: cfg.engine,
193
+ host: cfg.host,
194
+ port: cfg.port,
195
+ user: cfg.user,
196
+ password: cfg.password,
197
+ database: cfg.database,
198
+ name: cfg.name,
199
+ });
200
+ const pull = new PullDbUseCase(provider, storage);
201
+ const result = await pull.execute(workspace.id, cfg.name, {
202
+ onProgress: (msg) => { spinner.text = msg; },
203
+ });
204
+ console.log(chalk.green(` ✓ ${cfg.name}: ${String(result.tablesCount)} tables, ${String(result.columnsCount)} columns`));
205
+ }
206
+ spinner.succeed('DB sync complete!');
288
207
  }
289
208
  finally {
290
209
  await storage.close();
291
210
  }
292
211
  }
293
- export async function syncDbFromInit(workspaceRoot) {
294
- await syncDb(workspaceRoot, {});
295
- }
296
- /**
297
- * Register `argustack sync [type]` command.
298
- *
299
- * Usage:
300
- * argustack sync — sync all enabled sources
301
- * argustack sync jira — sync Jira only
302
- * argustack sync jira -p KEY — sync specific project
303
- * argustack sync jira --since 2024-01-01
304
- */
305
- async function resolveTypeNamesToIds(names, workspaceRoot) {
306
- try {
307
- dotenv.config({ path: `${workspaceRoot}/.env`, quiet: true });
308
- const jiraUrl = process.env['JIRA_URL'];
309
- const jiraEmail = process.env['JIRA_EMAIL'];
310
- const jiraToken = process.env['JIRA_API_TOKEN'];
311
- if (!jiraUrl || !jiraEmail || !jiraToken) {
312
- return undefined;
313
- }
314
- const { Version3Client } = await import('jira.js');
315
- const client = new Version3Client({
316
- host: jiraUrl,
317
- authentication: { basic: { email: jiraEmail, apiToken: jiraToken } },
318
- });
319
- const allTypes = await client.issueTypes.getIssueAllTypes();
320
- const nameSet = new Set(names);
321
- const ids = allTypes
322
- .filter((t) => typeof t.name === 'string' && typeof t.id === 'string' && nameSet.has(t.name))
323
- .map((t) => t.id);
324
- if (ids.length > 0) {
325
- const wsConfig = readConfig(workspaceRoot);
326
- if (wsConfig?.sources.jira) {
327
- wsConfig.sources.jira.issueTypeIds = ids;
328
- writeConfig(workspaceRoot, wsConfig);
329
- }
330
- }
331
- return ids.length > 0 ? ids : undefined;
212
+ function enabledSourcesFor(workspace) {
213
+ const settings = workspace.settings ?? {};
214
+ const sources = [];
215
+ if ((settings.jiraProjectKeys?.length ?? 0) > 0) {
216
+ sources.push('jira');
332
217
  }
333
- catch {
334
- return undefined;
218
+ if ((settings.gitRepoPaths?.length ?? 0) > 0) {
219
+ sources.push('git');
335
220
  }
221
+ if ((settings.githubRepos?.length ?? 0) > 0) {
222
+ sources.push('github');
223
+ }
224
+ if ((settings.csvFilePaths?.length ?? 0) > 0) {
225
+ sources.push('csv');
226
+ }
227
+ if ((settings.dbConfigs?.length ?? 0) > 0) {
228
+ sources.push('db');
229
+ }
230
+ return sources;
336
231
  }
337
232
  export function registerSyncCommand(program) {
338
233
  program
339
234
  .command('sync [type]')
340
- .description('Sync data from sources (all enabled or specific)')
341
- .option('-p, --project <key>', 'Sync specific project only')
342
- .option('--since <date>', 'Sync issues updated since date (YYYY-MM-DD)')
235
+ .description('Sync data for the active or selected workspace')
236
+ .option('--workspace <name>', 'Target workspace (defaults to active)')
237
+ .option('-p, --project <key>', 'Sync only a specific Jira project key')
238
+ .option('--since <date>', 'Sync entries updated since YYYY-MM-DD')
343
239
  .option('-f, --file <path>', 'CSV file path (for csv source)')
344
240
  .action(async (type, options) => {
241
+ const { store, close } = await openHubStore();
345
242
  try {
346
- const workspaceRoot = requireWorkspace();
347
- const config = readConfig(workspaceRoot);
348
- if (!config) {
349
- console.log(chalk.red('\n No config found. Run: argustack init'));
350
- process.exit(1);
243
+ const workspaceId = await resolveWorkspaceFlag(store, options.workspace);
244
+ const workspace = await store.getById(workspaceId);
245
+ if (workspace == null) {
246
+ throw new Error(`Workspace "${workspaceId}" disappeared during resolution.`);
351
247
  }
352
- registerWorkspace(workspaceRoot, config.name);
353
- let sourcesToSync;
354
- if (type) {
355
- const source = type.toLowerCase();
356
- if (!ALL_SOURCES.includes(source)) {
357
- console.log(chalk.red(`\n Unknown source: ${type}`));
358
- console.log(chalk.dim(` Available: ${ALL_SOURCES.join(', ')}`));
359
- process.exit(1);
360
- }
361
- if (!config.sources[source]?.enabled) {
362
- console.log(chalk.red(`\n ${SOURCE_META[source].label} is not enabled.`));
363
- console.log(chalk.dim(` Enable it: ${chalk.cyan(`argustack source add ${source}`)}`));
364
- process.exit(1);
365
- }
366
- sourcesToSync = [source];
248
+ const sources = type !== undefined && type !== ''
249
+ ? [type.toLowerCase()]
250
+ : enabledSourcesFor(workspace);
251
+ if (sources.length === 0) {
252
+ console.log(chalk.yellow(`\n No sources configured for "${workspace.name}".`));
253
+ console.log(chalk.dim(` Add one: argustack add jira --workspace ${workspace.id} --projects KEY`));
254
+ return;
367
255
  }
368
- else {
369
- sourcesToSync = getEnabledSources(config);
370
- if (sourcesToSync.length === 0) {
371
- console.log(chalk.yellow('\n No sources enabled.'));
372
- console.log(chalk.dim(` Add one: ${chalk.cyan('argustack source add jira')}`));
373
- process.exit(1);
256
+ for (const s of sources) {
257
+ if (!ALL_SOURCES.includes(s)) {
258
+ throw new Error(`Unknown source "${s}". Available: ${ALL_SOURCES.join(', ')}.`);
374
259
  }
375
260
  }
376
261
  console.log('');
377
- dotenv.config({ path: `${workspaceRoot}/.env`, quiet: true });
378
- const githubToken = process.env['GITHUB_TOKEN'];
379
- const githubEnabled = config.sources.github?.enabled;
380
- if (githubToken && !githubEnabled && !type) {
381
- console.log(chalk.yellow(' ⚠ GitHub token found in .env but "github" source is not enabled.'));
382
- console.log(chalk.dim(` Enable: ${chalk.cyan('argustack source add github')}\n`));
383
- }
384
- for (const source of sourcesToSync) {
262
+ for (const source of sources) {
385
263
  switch (source) {
386
- case 'jira': {
387
- await syncJira(workspaceRoot, options);
388
- break;
389
- }
390
- case 'git': {
391
- await syncGit(workspaceRoot, options);
392
- break;
393
- }
394
- case 'github': {
395
- await syncGithub(workspaceRoot, options);
264
+ case 'jira':
265
+ await syncJira(workspace, options);
396
266
  break;
397
- }
398
- case 'csv': {
399
- await syncCsv(workspaceRoot, options);
267
+ case 'git':
268
+ await syncGit(workspace, options);
400
269
  break;
401
- }
402
- case 'db': {
403
- await syncDb(workspaceRoot, options);
270
+ case 'github':
271
+ await syncGithub(workspace, options);
404
272
  break;
405
- }
406
- case 'board': {
273
+ case 'csv':
274
+ await syncCsv(workspace, options);
407
275
  break;
408
- }
409
- case 'code': {
276
+ case 'db':
277
+ await syncDb(workspace, options);
410
278
  break;
411
- }
279
+ case 'board': break;
280
+ case 'code': break;
412
281
  }
413
282
  }
283
+ await store.touchActive(workspace.id);
414
284
  }
415
- catch (err) {
416
- console.error(chalk.red(`\n Error: ${err instanceof Error ? err.message : String(err)}`));
417
- process.exit(1);
285
+ finally {
286
+ await close();
418
287
  }
419
288
  });
420
289
  }