forge-server 0.1.0

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 (412) hide show
  1. package/.claude/hooks/worktree-create.sh +64 -0
  2. package/.claude/hooks/worktree-remove.sh +57 -0
  3. package/.claude/settings.local.json +29 -0
  4. package/.forge/knowledge/conventions.yaml +1 -0
  5. package/.forge/knowledge/decisions.yaml +1 -0
  6. package/.forge/knowledge/gotchas.yaml +1 -0
  7. package/.forge/knowledge/patterns.yaml +1 -0
  8. package/.forge/manifest.yaml +6 -0
  9. package/CLAUDE.md +144 -0
  10. package/bin/setup-forge.sh +132 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +553 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/context/codebase.d.ts +57 -0
  16. package/dist/context/codebase.d.ts.map +1 -0
  17. package/dist/context/codebase.js +301 -0
  18. package/dist/context/codebase.js.map +1 -0
  19. package/dist/context/injector.d.ts +147 -0
  20. package/dist/context/injector.d.ts.map +1 -0
  21. package/dist/context/injector.js +533 -0
  22. package/dist/context/injector.js.map +1 -0
  23. package/dist/context/memory.d.ts +32 -0
  24. package/dist/context/memory.d.ts.map +1 -0
  25. package/dist/context/memory.js +140 -0
  26. package/dist/context/memory.js.map +1 -0
  27. package/dist/context/session-index.d.ts +54 -0
  28. package/dist/context/session-index.d.ts.map +1 -0
  29. package/dist/context/session-index.js +265 -0
  30. package/dist/context/session-index.js.map +1 -0
  31. package/dist/context/session.d.ts +42 -0
  32. package/dist/context/session.d.ts.map +1 -0
  33. package/dist/context/session.js +121 -0
  34. package/dist/context/session.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +37 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/ingestion/chunker.d.ts +19 -0
  40. package/dist/ingestion/chunker.d.ts.map +1 -0
  41. package/dist/ingestion/chunker.js +189 -0
  42. package/dist/ingestion/chunker.js.map +1 -0
  43. package/dist/ingestion/embedder.d.ts +45 -0
  44. package/dist/ingestion/embedder.d.ts.map +1 -0
  45. package/dist/ingestion/embedder.js +152 -0
  46. package/dist/ingestion/embedder.js.map +1 -0
  47. package/dist/ingestion/git-analyzer.d.ts +77 -0
  48. package/dist/ingestion/git-analyzer.d.ts.map +1 -0
  49. package/dist/ingestion/git-analyzer.js +437 -0
  50. package/dist/ingestion/git-analyzer.js.map +1 -0
  51. package/dist/ingestion/indexer.d.ts +79 -0
  52. package/dist/ingestion/indexer.d.ts.map +1 -0
  53. package/dist/ingestion/indexer.js +766 -0
  54. package/dist/ingestion/indexer.js.map +1 -0
  55. package/dist/ingestion/markdown-chunker.d.ts +19 -0
  56. package/dist/ingestion/markdown-chunker.d.ts.map +1 -0
  57. package/dist/ingestion/markdown-chunker.js +243 -0
  58. package/dist/ingestion/markdown-chunker.js.map +1 -0
  59. package/dist/ingestion/markdown-knowledge.d.ts +21 -0
  60. package/dist/ingestion/markdown-knowledge.d.ts.map +1 -0
  61. package/dist/ingestion/markdown-knowledge.js +129 -0
  62. package/dist/ingestion/markdown-knowledge.js.map +1 -0
  63. package/dist/ingestion/parser.d.ts +20 -0
  64. package/dist/ingestion/parser.d.ts.map +1 -0
  65. package/dist/ingestion/parser.js +429 -0
  66. package/dist/ingestion/parser.js.map +1 -0
  67. package/dist/ingestion/watcher.d.ts +28 -0
  68. package/dist/ingestion/watcher.d.ts.map +1 -0
  69. package/dist/ingestion/watcher.js +147 -0
  70. package/dist/ingestion/watcher.js.map +1 -0
  71. package/dist/knowledge/hydrator.d.ts +37 -0
  72. package/dist/knowledge/hydrator.d.ts.map +1 -0
  73. package/dist/knowledge/hydrator.js +220 -0
  74. package/dist/knowledge/hydrator.js.map +1 -0
  75. package/dist/knowledge/registry.d.ts +129 -0
  76. package/dist/knowledge/registry.d.ts.map +1 -0
  77. package/dist/knowledge/registry.js +361 -0
  78. package/dist/knowledge/registry.js.map +1 -0
  79. package/dist/knowledge/search.d.ts +114 -0
  80. package/dist/knowledge/search.d.ts.map +1 -0
  81. package/dist/knowledge/search.js +428 -0
  82. package/dist/knowledge/search.js.map +1 -0
  83. package/dist/knowledge/store.d.ts +76 -0
  84. package/dist/knowledge/store.d.ts.map +1 -0
  85. package/dist/knowledge/store.js +230 -0
  86. package/dist/knowledge/store.js.map +1 -0
  87. package/dist/learning/confidence.d.ts +30 -0
  88. package/dist/learning/confidence.d.ts.map +1 -0
  89. package/dist/learning/confidence.js +165 -0
  90. package/dist/learning/confidence.js.map +1 -0
  91. package/dist/learning/patterns.d.ts +52 -0
  92. package/dist/learning/patterns.d.ts.map +1 -0
  93. package/dist/learning/patterns.js +290 -0
  94. package/dist/learning/patterns.js.map +1 -0
  95. package/dist/learning/trajectory.d.ts +55 -0
  96. package/dist/learning/trajectory.d.ts.map +1 -0
  97. package/dist/learning/trajectory.js +200 -0
  98. package/dist/learning/trajectory.js.map +1 -0
  99. package/dist/memory/memory-compat.d.ts +100 -0
  100. package/dist/memory/memory-compat.d.ts.map +1 -0
  101. package/dist/memory/memory-compat.js +146 -0
  102. package/dist/memory/memory-compat.js.map +1 -0
  103. package/dist/memory/observation-store.d.ts +57 -0
  104. package/dist/memory/observation-store.d.ts.map +1 -0
  105. package/dist/memory/observation-store.js +154 -0
  106. package/dist/memory/observation-store.js.map +1 -0
  107. package/dist/memory/session-tracker.d.ts +81 -0
  108. package/dist/memory/session-tracker.d.ts.map +1 -0
  109. package/dist/memory/session-tracker.js +262 -0
  110. package/dist/memory/session-tracker.js.map +1 -0
  111. package/dist/pipeline/engine.d.ts +179 -0
  112. package/dist/pipeline/engine.d.ts.map +1 -0
  113. package/dist/pipeline/engine.js +691 -0
  114. package/dist/pipeline/engine.js.map +1 -0
  115. package/dist/pipeline/events.d.ts +54 -0
  116. package/dist/pipeline/events.d.ts.map +1 -0
  117. package/dist/pipeline/events.js +157 -0
  118. package/dist/pipeline/events.js.map +1 -0
  119. package/dist/pipeline/parallel.d.ts +83 -0
  120. package/dist/pipeline/parallel.d.ts.map +1 -0
  121. package/dist/pipeline/parallel.js +277 -0
  122. package/dist/pipeline/parallel.js.map +1 -0
  123. package/dist/pipeline/state-machine.d.ts +65 -0
  124. package/dist/pipeline/state-machine.d.ts.map +1 -0
  125. package/dist/pipeline/state-machine.js +176 -0
  126. package/dist/pipeline/state-machine.js.map +1 -0
  127. package/dist/query/graph-queries.d.ts +84 -0
  128. package/dist/query/graph-queries.d.ts.map +1 -0
  129. package/dist/query/graph-queries.js +216 -0
  130. package/dist/query/graph-queries.js.map +1 -0
  131. package/dist/query/hybrid-search.d.ts +34 -0
  132. package/dist/query/hybrid-search.d.ts.map +1 -0
  133. package/dist/query/hybrid-search.js +263 -0
  134. package/dist/query/hybrid-search.js.map +1 -0
  135. package/dist/query/intent-detector.d.ts +35 -0
  136. package/dist/query/intent-detector.d.ts.map +1 -0
  137. package/dist/query/intent-detector.js +115 -0
  138. package/dist/query/intent-detector.js.map +1 -0
  139. package/dist/query/ranking.d.ts +57 -0
  140. package/dist/query/ranking.d.ts.map +1 -0
  141. package/dist/query/ranking.js +109 -0
  142. package/dist/query/ranking.js.map +1 -0
  143. package/dist/server.d.ts +3 -0
  144. package/dist/server.d.ts.map +1 -0
  145. package/dist/server.js +291 -0
  146. package/dist/server.js.map +1 -0
  147. package/dist/storage/falkordb-store.d.ts +73 -0
  148. package/dist/storage/falkordb-store.d.ts.map +1 -0
  149. package/dist/storage/falkordb-store.js +346 -0
  150. package/dist/storage/falkordb-store.js.map +1 -0
  151. package/dist/storage/file-cache.d.ts +32 -0
  152. package/dist/storage/file-cache.d.ts.map +1 -0
  153. package/dist/storage/file-cache.js +115 -0
  154. package/dist/storage/file-cache.js.map +1 -0
  155. package/dist/storage/interfaces.d.ts +151 -0
  156. package/dist/storage/interfaces.d.ts.map +1 -0
  157. package/dist/storage/interfaces.js +7 -0
  158. package/dist/storage/interfaces.js.map +1 -0
  159. package/dist/storage/qdrant-store.d.ts +110 -0
  160. package/dist/storage/qdrant-store.d.ts.map +1 -0
  161. package/dist/storage/qdrant-store.js +467 -0
  162. package/dist/storage/qdrant-store.js.map +1 -0
  163. package/dist/storage/schema.d.ts +4 -0
  164. package/dist/storage/schema.d.ts.map +1 -0
  165. package/dist/storage/schema.js +136 -0
  166. package/dist/storage/schema.js.map +1 -0
  167. package/dist/storage/sqlite.d.ts +35 -0
  168. package/dist/storage/sqlite.d.ts.map +1 -0
  169. package/dist/storage/sqlite.js +132 -0
  170. package/dist/storage/sqlite.js.map +1 -0
  171. package/dist/tools/collaboration-tools.d.ts +111 -0
  172. package/dist/tools/collaboration-tools.d.ts.map +1 -0
  173. package/dist/tools/collaboration-tools.js +174 -0
  174. package/dist/tools/collaboration-tools.js.map +1 -0
  175. package/dist/tools/context-tools.d.ts +293 -0
  176. package/dist/tools/context-tools.d.ts.map +1 -0
  177. package/dist/tools/context-tools.js +437 -0
  178. package/dist/tools/context-tools.js.map +1 -0
  179. package/dist/tools/graph-tools.d.ts +129 -0
  180. package/dist/tools/graph-tools.d.ts.map +1 -0
  181. package/dist/tools/graph-tools.js +237 -0
  182. package/dist/tools/graph-tools.js.map +1 -0
  183. package/dist/tools/ingestion-tools.d.ts +96 -0
  184. package/dist/tools/ingestion-tools.d.ts.map +1 -0
  185. package/dist/tools/ingestion-tools.js +90 -0
  186. package/dist/tools/ingestion-tools.js.map +1 -0
  187. package/dist/tools/learning-tools.d.ts +168 -0
  188. package/dist/tools/learning-tools.d.ts.map +1 -0
  189. package/dist/tools/learning-tools.js +158 -0
  190. package/dist/tools/learning-tools.js.map +1 -0
  191. package/dist/tools/memory-tools.d.ts +183 -0
  192. package/dist/tools/memory-tools.d.ts.map +1 -0
  193. package/dist/tools/memory-tools.js +197 -0
  194. package/dist/tools/memory-tools.js.map +1 -0
  195. package/dist/tools/phase-tools.d.ts +954 -0
  196. package/dist/tools/phase-tools.d.ts.map +1 -0
  197. package/dist/tools/phase-tools.js +1215 -0
  198. package/dist/tools/phase-tools.js.map +1 -0
  199. package/dist/tools/pipeline-tools.d.ts +140 -0
  200. package/dist/tools/pipeline-tools.d.ts.map +1 -0
  201. package/dist/tools/pipeline-tools.js +162 -0
  202. package/dist/tools/pipeline-tools.js.map +1 -0
  203. package/dist/tools/registration-tools.d.ts +220 -0
  204. package/dist/tools/registration-tools.d.ts.map +1 -0
  205. package/dist/tools/registration-tools.js +391 -0
  206. package/dist/tools/registration-tools.js.map +1 -0
  207. package/dist/util/circuit-breaker.d.ts +75 -0
  208. package/dist/util/circuit-breaker.d.ts.map +1 -0
  209. package/dist/util/circuit-breaker.js +159 -0
  210. package/dist/util/circuit-breaker.js.map +1 -0
  211. package/dist/util/config.d.ts +23 -0
  212. package/dist/util/config.d.ts.map +1 -0
  213. package/dist/util/config.js +164 -0
  214. package/dist/util/config.js.map +1 -0
  215. package/dist/util/logger.d.ts +13 -0
  216. package/dist/util/logger.d.ts.map +1 -0
  217. package/dist/util/logger.js +45 -0
  218. package/dist/util/logger.js.map +1 -0
  219. package/dist/util/token-counter.d.ts +24 -0
  220. package/dist/util/token-counter.d.ts.map +1 -0
  221. package/dist/util/token-counter.js +48 -0
  222. package/dist/util/token-counter.js.map +1 -0
  223. package/dist/util/types.d.ts +525 -0
  224. package/dist/util/types.d.ts.map +1 -0
  225. package/dist/util/types.js +5 -0
  226. package/dist/util/types.js.map +1 -0
  227. package/docker-compose.yml +20 -0
  228. package/docs/plans/2026-02-27-swarm-coordination/architecture.md +203 -0
  229. package/docs/plans/2026-02-27-swarm-coordination/vision.md +57 -0
  230. package/docs/plans/completed/2026-02-26-forge-plugin-bundling/architecture.md +1 -0
  231. package/docs/plans/completed/2026-02-26-forge-plugin-bundling/vision.md +300 -0
  232. package/docs/plans/completed/2026-02-27-forge-swarm-learning/architecture.md +480 -0
  233. package/docs/plans/completed/2026-02-27-forge-swarm-learning/verification-checklist.md +462 -0
  234. package/docs/plans/completed/2026-02-27-git-history-atlassian/git-jira-plan.md +181 -0
  235. package/package.json +39 -0
  236. package/plugin/.claude-plugin/plugin.json +8 -0
  237. package/plugin/.mcp.json +15 -0
  238. package/plugin/README.md +134 -0
  239. package/plugin/agents/architect.md +367 -0
  240. package/plugin/agents/backend-specialist.md +263 -0
  241. package/plugin/agents/brainstormer.md +122 -0
  242. package/plugin/agents/data-specialist.md +266 -0
  243. package/plugin/agents/designer.md +408 -0
  244. package/plugin/agents/frontend-specialist.md +241 -0
  245. package/plugin/agents/inspector.md +406 -0
  246. package/plugin/agents/knowledge-keeper.md +443 -0
  247. package/plugin/agents/platform-engineer.md +326 -0
  248. package/plugin/agents/product-manager.md +268 -0
  249. package/plugin/agents/product-owner.md +438 -0
  250. package/plugin/agents/pulse-checker.md +73 -0
  251. package/plugin/agents/qa-strategist.md +500 -0
  252. package/plugin/agents/self-improver.md +310 -0
  253. package/plugin/agents/strategist.md +360 -0
  254. package/plugin/agents/supervisor.md +380 -0
  255. package/plugin/commands/brainstorm.md +25 -0
  256. package/plugin/commands/forge.md +88 -0
  257. package/plugin/docs/atlassian-integration.md +110 -0
  258. package/plugin/docs/workflow.md +126 -0
  259. package/plugin/skills/agent-development/.skillfish.json +10 -0
  260. package/plugin/skills/agent-development/SKILL.md +415 -0
  261. package/plugin/skills/agent-development/examples/agent-creation-prompt.md +238 -0
  262. package/plugin/skills/agent-development/examples/complete-agent-examples.md +427 -0
  263. package/plugin/skills/agent-development/references/agent-creation-system-prompt.md +207 -0
  264. package/plugin/skills/agent-development/references/system-prompt-design.md +411 -0
  265. package/plugin/skills/agent-development/references/triggering-examples.md +491 -0
  266. package/plugin/skills/agent-development/scripts/validate-agent.sh +217 -0
  267. package/plugin/skills/agent-handoff/SKILL.md +335 -0
  268. package/plugin/skills/anti-stub/SKILL.md +317 -0
  269. package/plugin/skills/brainstorm/SKILL.md +31 -0
  270. package/plugin/skills/debugging/SKILL.md +276 -0
  271. package/plugin/skills/fix/SKILL.md +62 -0
  272. package/plugin/skills/frontend-design/.skillfish.json +10 -0
  273. package/plugin/skills/frontend-design/SKILL.md +42 -0
  274. package/plugin/skills/gotchas/SKILL.md +61 -0
  275. package/plugin/skills/graph-orchestrator/SKILL.md +38 -0
  276. package/plugin/skills/history/SKILL.md +58 -0
  277. package/plugin/skills/impact/SKILL.md +59 -0
  278. package/plugin/skills/implementation-execution/SKILL.md +291 -0
  279. package/plugin/skills/index-repo/SKILL.md +55 -0
  280. package/plugin/skills/interviewing/SKILL.md +225 -0
  281. package/plugin/skills/knowledge-curation/SKILL.md +393 -0
  282. package/plugin/skills/learn/SKILL.md +69 -0
  283. package/plugin/skills/mcp-integration/.skillfish.json +10 -0
  284. package/plugin/skills/mcp-integration/SKILL.md +554 -0
  285. package/plugin/skills/mcp-integration/examples/http-server.json +20 -0
  286. package/plugin/skills/mcp-integration/examples/sse-server.json +19 -0
  287. package/plugin/skills/mcp-integration/examples/stdio-server.json +26 -0
  288. package/plugin/skills/mcp-integration/references/authentication.md +549 -0
  289. package/plugin/skills/mcp-integration/references/server-types.md +536 -0
  290. package/plugin/skills/mcp-integration/references/tool-usage.md +538 -0
  291. package/plugin/skills/nestjs/.skillfish.json +10 -0
  292. package/plugin/skills/nestjs/SKILL.md +669 -0
  293. package/plugin/skills/nestjs/drizzle-reference.md +1894 -0
  294. package/plugin/skills/nestjs/reference.md +1447 -0
  295. package/plugin/skills/nestjs/workflow-optimization.md +229 -0
  296. package/plugin/skills/parallel-dispatch/SKILL.md +308 -0
  297. package/plugin/skills/project-discovery/SKILL.md +304 -0
  298. package/plugin/skills/search/SKILL.md +56 -0
  299. package/plugin/skills/security-audit/SKILL.md +362 -0
  300. package/plugin/skills/skill-development/.skillfish.json +10 -0
  301. package/plugin/skills/skill-development/SKILL.md +637 -0
  302. package/plugin/skills/skill-development/references/skill-creator-original.md +209 -0
  303. package/plugin/skills/tdd/SKILL.md +273 -0
  304. package/plugin/skills/terminal-presentation/SKILL.md +395 -0
  305. package/plugin/skills/test-strategy/SKILL.md +365 -0
  306. package/plugin/skills/verification-protocol/SKILL.md +256 -0
  307. package/plugin/skills/visual-explainer/CHANGELOG.md +97 -0
  308. package/plugin/skills/visual-explainer/LICENSE +21 -0
  309. package/plugin/skills/visual-explainer/README.md +137 -0
  310. package/plugin/skills/visual-explainer/SKILL.md +352 -0
  311. package/plugin/skills/visual-explainer/banner.png +0 -0
  312. package/plugin/skills/visual-explainer/package.json +11 -0
  313. package/plugin/skills/visual-explainer/prompts/diff-review.md +68 -0
  314. package/plugin/skills/visual-explainer/prompts/fact-check.md +63 -0
  315. package/plugin/skills/visual-explainer/prompts/generate-slides.md +18 -0
  316. package/plugin/skills/visual-explainer/prompts/generate-web-diagram.md +10 -0
  317. package/plugin/skills/visual-explainer/prompts/plan-review.md +86 -0
  318. package/plugin/skills/visual-explainer/prompts/project-recap.md +61 -0
  319. package/plugin/skills/visual-explainer/references/css-patterns.md +1188 -0
  320. package/plugin/skills/visual-explainer/references/libraries.md +470 -0
  321. package/plugin/skills/visual-explainer/references/responsive-nav.md +212 -0
  322. package/plugin/skills/visual-explainer/references/slide-patterns.md +1403 -0
  323. package/plugin/skills/visual-explainer/templates/architecture.html +596 -0
  324. package/plugin/skills/visual-explainer/templates/data-table.html +540 -0
  325. package/plugin/skills/visual-explainer/templates/mermaid-flowchart.html +435 -0
  326. package/plugin/skills/visual-explainer/templates/slide-deck.html +913 -0
  327. package/src/cli.ts +655 -0
  328. package/src/context/.gitkeep +0 -0
  329. package/src/context/codebase.ts +393 -0
  330. package/src/context/injector.ts +797 -0
  331. package/src/context/memory.ts +187 -0
  332. package/src/context/session-index.ts +327 -0
  333. package/src/context/session.ts +152 -0
  334. package/src/index.ts +47 -0
  335. package/src/ingestion/.gitkeep +0 -0
  336. package/src/ingestion/chunker.ts +277 -0
  337. package/src/ingestion/embedder.ts +167 -0
  338. package/src/ingestion/git-analyzer.ts +545 -0
  339. package/src/ingestion/indexer.ts +984 -0
  340. package/src/ingestion/markdown-chunker.ts +337 -0
  341. package/src/ingestion/markdown-knowledge.ts +175 -0
  342. package/src/ingestion/parser.ts +475 -0
  343. package/src/ingestion/watcher.ts +182 -0
  344. package/src/knowledge/.gitkeep +0 -0
  345. package/src/knowledge/hydrator.ts +246 -0
  346. package/src/knowledge/registry.ts +463 -0
  347. package/src/knowledge/search.ts +565 -0
  348. package/src/knowledge/store.ts +262 -0
  349. package/src/learning/.gitkeep +0 -0
  350. package/src/learning/confidence.ts +193 -0
  351. package/src/learning/patterns.ts +360 -0
  352. package/src/learning/trajectory.ts +268 -0
  353. package/src/memory/.gitkeep +0 -0
  354. package/src/memory/memory-compat.ts +233 -0
  355. package/src/memory/observation-store.ts +224 -0
  356. package/src/memory/session-tracker.ts +332 -0
  357. package/src/pipeline/.gitkeep +0 -0
  358. package/src/pipeline/engine.ts +1139 -0
  359. package/src/pipeline/events.ts +253 -0
  360. package/src/pipeline/parallel.ts +394 -0
  361. package/src/pipeline/state-machine.ts +199 -0
  362. package/src/query/.gitkeep +0 -0
  363. package/src/query/graph-queries.ts +262 -0
  364. package/src/query/hybrid-search.ts +337 -0
  365. package/src/query/intent-detector.ts +131 -0
  366. package/src/query/ranking.ts +161 -0
  367. package/src/server.ts +352 -0
  368. package/src/storage/.gitkeep +0 -0
  369. package/src/storage/falkordb-store.ts +388 -0
  370. package/src/storage/file-cache.ts +141 -0
  371. package/src/storage/interfaces.ts +201 -0
  372. package/src/storage/qdrant-store.ts +557 -0
  373. package/src/storage/schema.ts +139 -0
  374. package/src/storage/sqlite.ts +168 -0
  375. package/src/tools/.gitkeep +0 -0
  376. package/src/tools/collaboration-tools.ts +208 -0
  377. package/src/tools/context-tools.ts +493 -0
  378. package/src/tools/graph-tools.ts +295 -0
  379. package/src/tools/ingestion-tools.ts +122 -0
  380. package/src/tools/learning-tools.ts +181 -0
  381. package/src/tools/memory-tools.ts +234 -0
  382. package/src/tools/phase-tools.ts +1452 -0
  383. package/src/tools/pipeline-tools.ts +188 -0
  384. package/src/tools/registration-tools.ts +450 -0
  385. package/src/util/.gitkeep +0 -0
  386. package/src/util/circuit-breaker.ts +193 -0
  387. package/src/util/config.ts +177 -0
  388. package/src/util/logger.ts +53 -0
  389. package/src/util/token-counter.ts +52 -0
  390. package/src/util/types.ts +710 -0
  391. package/tests/context/.gitkeep +0 -0
  392. package/tests/integration/.gitkeep +0 -0
  393. package/tests/knowledge/.gitkeep +0 -0
  394. package/tests/learning/.gitkeep +0 -0
  395. package/tests/pipeline/.gitkeep +0 -0
  396. package/tests/tools/.gitkeep +0 -0
  397. package/tsconfig.json +21 -0
  398. package/vitest.config.ts +10 -0
  399. package/vscode-extension/.vscodeignore +7 -0
  400. package/vscode-extension/README.md +43 -0
  401. package/vscode-extension/out/edge-collector.js +274 -0
  402. package/vscode-extension/out/edge-collector.js.map +1 -0
  403. package/vscode-extension/out/extension.js +264 -0
  404. package/vscode-extension/out/extension.js.map +1 -0
  405. package/vscode-extension/out/forge-client.js +318 -0
  406. package/vscode-extension/out/forge-client.js.map +1 -0
  407. package/vscode-extension/package-lock.json +59 -0
  408. package/vscode-extension/package.json +71 -0
  409. package/vscode-extension/src/edge-collector.ts +320 -0
  410. package/vscode-extension/src/extension.ts +269 -0
  411. package/vscode-extension/src/forge-client.ts +364 -0
  412. package/vscode-extension/tsconfig.json +19 -0
package/dist/cli.js ADDED
@@ -0,0 +1,553 @@
1
+ #!/usr/bin/env node
2
+ // cli.ts — B20
3
+ // Thin CLI for dk-forge-server operations.
4
+ //
5
+ // Commands:
6
+ // forge init --name <name> --stack <tags...> [--sharing team|private|public] [--org <org>] [--path <path>]
7
+ // forge register [--path <path>]
8
+ // forge status [--project <id>] [--all]
9
+ // forge knowledge list|search|migrate|sync [--query <text>] [--category gotcha|pattern|decision|convention]
10
+ // forge repos list|info|remove [--id <repo_id>]
11
+ //
12
+ // For init/register: operates directly on filesystem + SQLite, no server needed.
13
+ // For status/knowledge/repos: reads SQLite directly (no server connection required).
14
+ import { resolve, join } from 'node:path';
15
+ import { existsSync } from 'node:fs';
16
+ import { homedir } from 'node:os';
17
+ import { PipelineDB } from './storage/sqlite.js';
18
+ import { RepoRegistry } from './knowledge/registry.js';
19
+ import { KnowledgeYamlStore } from './knowledge/store.js';
20
+ import { QdrantVectorStore } from './storage/qdrant-store.js';
21
+ import { FalkorDBGraphStore } from './storage/falkordb-store.js';
22
+ import { LRUFileContentCache } from './storage/file-cache.js';
23
+ import { fullIndex } from './ingestion/indexer.js';
24
+ function parseArgs(argv) {
25
+ // argv[0] = 'node', argv[1] = 'cli.js', argv[2] = command...
26
+ const args = argv.slice(2);
27
+ const command = args[0] ?? '';
28
+ const subcommand = args[1]?.startsWith('--') ? '' : (args[1] ?? '');
29
+ const startIdx = subcommand ? 2 : 1;
30
+ const flags = {};
31
+ const positional = [];
32
+ let i = startIdx;
33
+ while (i < args.length) {
34
+ const arg = args[i];
35
+ if (arg.startsWith('--')) {
36
+ const key = arg.slice(2);
37
+ const next = args[i + 1];
38
+ if (!next || next.startsWith('--')) {
39
+ flags[key] = true;
40
+ i += 1;
41
+ }
42
+ else if (key === 'stack') {
43
+ // --stack can have multiple values before the next flag
44
+ const values = [];
45
+ let j = i + 1;
46
+ while (j < args.length && !args[j].startsWith('--')) {
47
+ values.push(args[j]);
48
+ j++;
49
+ }
50
+ flags[key] = values;
51
+ i = j;
52
+ }
53
+ else {
54
+ flags[key] = next;
55
+ i += 2;
56
+ }
57
+ }
58
+ else {
59
+ positional.push(arg);
60
+ i += 1;
61
+ }
62
+ }
63
+ return { command, subcommand, flags, positional };
64
+ }
65
+ function getFlag(flags, key) {
66
+ const val = flags[key];
67
+ return typeof val === 'string' ? val : undefined;
68
+ }
69
+ function getFlagArray(flags, key) {
70
+ const val = flags[key];
71
+ if (Array.isArray(val))
72
+ return val;
73
+ if (typeof val === 'string')
74
+ return [val];
75
+ return [];
76
+ }
77
+ function getFlagBool(flags, key) {
78
+ return flags[key] === true;
79
+ }
80
+ // ---------------------------------------------------------------------------
81
+ // Database helper — opens the shared pipeline.db
82
+ // ---------------------------------------------------------------------------
83
+ function openDB() {
84
+ const dbPath = process.env['FORGE_DB_PATH'] ?? join(homedir(), '.forge', 'pipeline.db');
85
+ const db = new PipelineDB(dbPath);
86
+ db.initialize();
87
+ return db;
88
+ }
89
+ // ---------------------------------------------------------------------------
90
+ // Output helpers
91
+ // ---------------------------------------------------------------------------
92
+ function print(obj) {
93
+ console.log(JSON.stringify(obj, null, 2));
94
+ }
95
+ function printError(message, exitCode = 1) {
96
+ console.error(`Error: ${message}`);
97
+ process.exit(exitCode);
98
+ }
99
+ function printHelp() {
100
+ console.log(`
101
+ dk-forge-server CLI
102
+
103
+ Usage:
104
+ forge init --name <name> --stack <tag...> [--sharing team|private|public] [--org <org>] [--path <dir>]
105
+ forge register [--path <dir>]
106
+ forge index [--path <dir>] [--repo-id <id>] [--force]
107
+ forge status [--project <id>] [--all]
108
+ forge knowledge list [--category gotcha|pattern|decision|convention] [--path <dir>]
109
+ forge knowledge search --query <text> [--category gotcha|pattern|decision|convention] [--path <dir>]
110
+ forge repos list
111
+ forge repos info --id <repo_id>
112
+ forge repos remove --id <repo_id>
113
+
114
+ Options:
115
+ --name Project name for forge init
116
+ --stack Space-separated stack tags (nestjs drizzle react postgresql)
117
+ --sharing Sharing mode: team | private | public (default: private)
118
+ --org Organization identifier
119
+ --path Target directory (default: current directory)
120
+ --repo-id Repo ID (for index command)
121
+ --force Force re-index even if files haven't changed
122
+ --project Project ID for status command
123
+ --all Show all projects (for status command)
124
+ --query Search query (for knowledge search)
125
+ --category Knowledge category filter
126
+ --id Repo ID (for repos info/remove)
127
+
128
+ Examples:
129
+ forge init --name my-app --stack nestjs drizzle --sharing team --org acme
130
+ forge register
131
+ forge index --path /path/to/repo
132
+ forge status --all
133
+ forge knowledge list --category gotcha
134
+ forge knowledge search --query "NestJS circular dependency"
135
+ forge repos list
136
+ `.trim());
137
+ }
138
+ // ---------------------------------------------------------------------------
139
+ // Commands
140
+ // ---------------------------------------------------------------------------
141
+ async function cmdInit(flags) {
142
+ const name = getFlag(flags, 'name');
143
+ if (!name)
144
+ printError('--name is required for init');
145
+ const stack = getFlagArray(flags, 'stack');
146
+ if (stack.length === 0)
147
+ printError('--stack requires at least one tag (e.g., --stack nestjs drizzle)');
148
+ const sharing = (getFlag(flags, 'sharing') ?? 'private');
149
+ const org = getFlag(flags, 'org');
150
+ const targetPath = resolve(getFlag(flags, 'path') ?? process.cwd());
151
+ const db = openDB();
152
+ const registry = new RepoRegistry(db);
153
+ try {
154
+ const manifest = { name, stack, sharing, org, repo_id_override: null };
155
+ const { forgePath, filesCreated } = registry.initForge(targetPath, manifest);
156
+ print({
157
+ success: true,
158
+ forge_dir: forgePath,
159
+ manifest_path: join(forgePath, 'manifest.yaml'),
160
+ knowledge_dir: join(forgePath, 'knowledge'),
161
+ files_created: filesCreated,
162
+ message: `Initialized forge in ${forgePath}. Run 'forge register' to register this repo.`,
163
+ });
164
+ }
165
+ catch (err) {
166
+ printError(String(err));
167
+ }
168
+ finally {
169
+ db.close();
170
+ }
171
+ }
172
+ async function cmdRegister(flags) {
173
+ const targetPath = resolve(getFlag(flags, 'path') ?? process.cwd());
174
+ const forgePath = join(targetPath, '.forge');
175
+ if (!existsSync(join(forgePath, 'manifest.yaml'))) {
176
+ printError(`No .forge/manifest.yaml found at ${forgePath}.\n` +
177
+ `Run 'forge init --name <name> --stack <tags...>' first.`);
178
+ }
179
+ const db = openDB();
180
+ const registry = new RepoRegistry(db);
181
+ try {
182
+ const result = await registry.register(targetPath);
183
+ print({
184
+ success: true,
185
+ ...result,
186
+ message: result.newly_registered
187
+ ? `Registered repo '${result.name}' (id: ${result.repo_id})`
188
+ : `Updated repo '${result.name}' (id: ${result.repo_id}) — last_seen_at refreshed`,
189
+ });
190
+ }
191
+ catch (err) {
192
+ printError(String(err));
193
+ }
194
+ finally {
195
+ db.close();
196
+ }
197
+ }
198
+ function cmdStatus(flags) {
199
+ const db = openDB();
200
+ try {
201
+ const projectId = getFlag(flags, 'project');
202
+ const showAll = getFlagBool(flags, 'all');
203
+ if (projectId) {
204
+ // Show single project
205
+ const row = db.get(`SELECT * FROM projects WHERE id = ?`, [projectId]);
206
+ if (!row) {
207
+ printError(`Project not found: ${projectId}`);
208
+ }
209
+ print({
210
+ project_id: row.id,
211
+ name: row.name,
212
+ current_phase: row.current_phase,
213
+ status: row.status,
214
+ tier: row.tier,
215
+ created_at: new Date(row.created_at).toISOString(),
216
+ updated_at: new Date(row.updated_at).toISOString(),
217
+ });
218
+ }
219
+ else {
220
+ // Show all active projects (or all if --all)
221
+ const whereClause = showAll ? '' : `WHERE status = 'active'`;
222
+ const rows = db.all(`SELECT id, name, current_phase, status, tier, created_at, updated_at FROM projects ${whereClause} ORDER BY updated_at DESC`);
223
+ if (rows.length === 0) {
224
+ print({ projects: [], message: showAll ? 'No projects found.' : 'No active projects. Use --all to see all projects.' });
225
+ return;
226
+ }
227
+ print({
228
+ projects: rows.map(r => ({
229
+ project_id: r.id,
230
+ name: r.name,
231
+ current_phase: r.current_phase,
232
+ status: r.status,
233
+ tier: r.tier,
234
+ updated_at: new Date(r.updated_at).toISOString(),
235
+ })),
236
+ count: rows.length,
237
+ });
238
+ }
239
+ }
240
+ finally {
241
+ db.close();
242
+ }
243
+ }
244
+ function cmdKnowledge(subcommand, flags) {
245
+ const targetPath = resolve(getFlag(flags, 'path') ?? process.cwd());
246
+ const forgePath = join(targetPath, '.forge');
247
+ if (!existsSync(forgePath)) {
248
+ printError(`No .forge/ directory found at ${targetPath}. Run 'forge init' first.`);
249
+ }
250
+ const yamlStore = new KnowledgeYamlStore(forgePath);
251
+ const category = getFlag(flags, 'category');
252
+ switch (subcommand) {
253
+ case 'list': {
254
+ const items = category ? yamlStore.readCategory(category) : yamlStore.readAll();
255
+ print({
256
+ category: category ?? 'all',
257
+ count: items.length,
258
+ items: items.map(i => ({
259
+ id: i.id,
260
+ title: i.title,
261
+ confidence: i.confidence,
262
+ stack_tags: i.stack_tags,
263
+ source: i.source,
264
+ })),
265
+ });
266
+ break;
267
+ }
268
+ case 'search': {
269
+ const query = getFlag(flags, 'query');
270
+ if (!query)
271
+ printError('--query is required for knowledge search');
272
+ const queryLower = query.toLowerCase();
273
+ const items = category ? yamlStore.readCategory(category) : yamlStore.readAll();
274
+ // Simple text search over title + content
275
+ const matches = items.filter(i => i.title.toLowerCase().includes(queryLower) ||
276
+ i.content.toLowerCase().includes(queryLower));
277
+ print({
278
+ query,
279
+ category: category ?? 'all',
280
+ count: matches.length,
281
+ items: matches.map(i => ({
282
+ id: i.id,
283
+ title: i.title,
284
+ content: i.content.slice(0, 300),
285
+ confidence: i.confidence,
286
+ stack_tags: i.stack_tags,
287
+ })),
288
+ note: 'This is local YAML text search. For semantic search, use forge.search_knowledge via MCP.',
289
+ });
290
+ break;
291
+ }
292
+ case 'sync': {
293
+ // Re-sync all knowledge items by re-initializing missing files
294
+ yamlStore.initialize();
295
+ const all = yamlStore.readAll();
296
+ print({
297
+ success: true,
298
+ message: `Knowledge files verified/created in ${forgePath}/knowledge/`,
299
+ total_items: all.length,
300
+ });
301
+ break;
302
+ }
303
+ case 'migrate': {
304
+ // Placeholder: migration from CLAUDE.md is handled by a migration module
305
+ print({
306
+ success: false,
307
+ message: 'Knowledge migration from CLAUDE.md is not yet implemented in the CLI. Use forge.register to sync YAML to Qdrant.',
308
+ });
309
+ break;
310
+ }
311
+ default:
312
+ printError(`Unknown knowledge subcommand: '${subcommand}'. Available: list, search, sync, migrate`);
313
+ }
314
+ }
315
+ function cmdRepos(subcommand, flags) {
316
+ const db = openDB();
317
+ try {
318
+ switch (subcommand) {
319
+ case 'list': {
320
+ const rows = db.all(`SELECT id, name, path, remote, stack, sharing, last_seen_at FROM repos ORDER BY last_seen_at DESC`);
321
+ print({
322
+ count: rows.length,
323
+ repos: rows.map(r => {
324
+ let stack = [];
325
+ try {
326
+ stack = JSON.parse(r.stack);
327
+ }
328
+ catch { }
329
+ return {
330
+ id: r.id,
331
+ name: r.name,
332
+ path: r.path,
333
+ remote: r.remote,
334
+ stack,
335
+ sharing: r.sharing,
336
+ last_seen: new Date(r.last_seen_at).toISOString(),
337
+ };
338
+ }),
339
+ });
340
+ break;
341
+ }
342
+ case 'info': {
343
+ const id = getFlag(flags, 'id');
344
+ if (!id)
345
+ printError('--id is required for repos info');
346
+ const row = db.get(`SELECT * FROM repos WHERE id = ?`, [id]);
347
+ if (!row)
348
+ printError(`Repo not found: ${id}`);
349
+ let stack = [];
350
+ try {
351
+ stack = JSON.parse(row.stack);
352
+ }
353
+ catch { }
354
+ // Count projects for this repo
355
+ const projectCount = db.get(`SELECT COUNT(*) as cnt FROM projects WHERE repo_id = ?`, [id]);
356
+ print({
357
+ id: row.id,
358
+ name: row.name,
359
+ path: row.path,
360
+ remote: row.remote,
361
+ stack,
362
+ sharing: row.sharing,
363
+ org: row.org,
364
+ registered_at: new Date(row.registered_at).toISOString(),
365
+ last_seen_at: new Date(row.last_seen_at).toISOString(),
366
+ manifest_hash: row.manifest_hash,
367
+ project_count: projectCount?.cnt ?? 0,
368
+ });
369
+ break;
370
+ }
371
+ case 'remove': {
372
+ const id = getFlag(flags, 'id');
373
+ if (!id)
374
+ printError('--id is required for repos remove');
375
+ const existing = db.get(`SELECT id FROM repos WHERE id = ?`, [id]);
376
+ if (!existing)
377
+ printError(`Repo not found: ${id}`);
378
+ db.run(`DELETE FROM repos WHERE id = ?`, [id]);
379
+ print({
380
+ success: true,
381
+ message: `Repo ${id} removed from registry. Note: Qdrant knowledge items are NOT removed. Restart the server to clear them.`,
382
+ });
383
+ break;
384
+ }
385
+ default:
386
+ printError(`Unknown repos subcommand: '${subcommand}'. Available: list, info, remove`);
387
+ }
388
+ }
389
+ finally {
390
+ db.close();
391
+ }
392
+ }
393
+ // ---------------------------------------------------------------------------
394
+ // Index command
395
+ // ---------------------------------------------------------------------------
396
+ async function cmdIndex(flags) {
397
+ const db = openDB();
398
+ const registry = new RepoRegistry(db);
399
+ try {
400
+ // Resolve repo: by --repo-id or by --path
401
+ const repoId = getFlag(flags, 'repo-id');
402
+ const targetPath = resolve(getFlag(flags, 'path') ?? process.cwd());
403
+ const force = getFlagBool(flags, 'force');
404
+ let repo;
405
+ if (repoId) {
406
+ repo = registry.getRepo(repoId);
407
+ if (!repo)
408
+ printError(`Repo not found: ${repoId}. Run 'forge register' first.`);
409
+ }
410
+ else {
411
+ repo = registry.findRepoByPath(targetPath);
412
+ if (!repo) {
413
+ printError(`No registered repo found at ${targetPath}. Run 'forge register' first.`);
414
+ }
415
+ }
416
+ console.log(`Indexing repo '${repo.name}' (id: ${repo.id}) at ${repo.path}...`);
417
+ // Connect to Qdrant
418
+ const qdrantUrl = process.env['QDRANT_URL'] ?? 'http://localhost:6333';
419
+ const vectorStore = new QdrantVectorStore(qdrantUrl);
420
+ const qdrantHealthy = await vectorStore.isHealthy();
421
+ if (!qdrantHealthy) {
422
+ printError(`Qdrant not reachable at ${qdrantUrl}. Start Qdrant first.`);
423
+ }
424
+ await vectorStore.ensureCollections(384);
425
+ // Connect to FalkorDB (graceful degradation)
426
+ const falkorHost = process.env['FALKORDB_HOST'] ?? 'localhost';
427
+ const falkorPort = parseInt(process.env['FALKORDB_PORT'] ?? '6380', 10);
428
+ let graphStore = null;
429
+ try {
430
+ const falkor = new FalkorDBGraphStore(`redis://${falkorHost}:${falkorPort}`);
431
+ await falkor.connect();
432
+ const falkorHealthy = await falkor.isHealthy();
433
+ if (falkorHealthy) {
434
+ graphStore = falkor;
435
+ console.log('FalkorDB connected');
436
+ }
437
+ else {
438
+ console.log('FalkorDB unavailable — indexing without graph store');
439
+ try {
440
+ await falkor.disconnect();
441
+ }
442
+ catch { }
443
+ }
444
+ }
445
+ catch {
446
+ console.log('FalkorDB unavailable — indexing without graph store');
447
+ }
448
+ // Create a no-op graph store if FalkorDB is unavailable
449
+ const effectiveGraphStore = graphStore ?? createNoOpGraphStore();
450
+ // File cache
451
+ const fileCache = new LRUFileContentCache();
452
+ // Build RepoConfig
453
+ const repoConfig = {
454
+ id: repo.id,
455
+ path: repo.path,
456
+ ownership: 'owned',
457
+ watch: false,
458
+ languages: repo.stack,
459
+ };
460
+ // Run full index
461
+ const result = await fullIndex({
462
+ repoConfig,
463
+ graphStore: effectiveGraphStore,
464
+ vectorStore,
465
+ fileCache,
466
+ allRepos: [repoConfig],
467
+ });
468
+ print({
469
+ success: true,
470
+ repo_id: result.repoId,
471
+ files_processed: result.filesProcessed,
472
+ files_skipped: result.filesSkipped,
473
+ files_errored: result.filesErrored,
474
+ chunks_created: result.chunksCreated,
475
+ knowledge_items_extracted: result.knowledgeItemsExtracted,
476
+ duration_ms: result.durationMs,
477
+ errors: result.errors.length > 0 ? result.errors.slice(0, 10) : undefined,
478
+ });
479
+ // Cleanup
480
+ if (graphStore) {
481
+ try {
482
+ await graphStore.disconnect();
483
+ }
484
+ catch { }
485
+ }
486
+ }
487
+ finally {
488
+ db.close();
489
+ }
490
+ }
491
+ /**
492
+ * Minimal no-op graph store for when FalkorDB is unavailable.
493
+ * Allows indexing to proceed with vector-only storage.
494
+ */
495
+ function createNoOpGraphStore() {
496
+ return {
497
+ connect: async () => { },
498
+ disconnect: async () => { },
499
+ isHealthy: async () => false,
500
+ query: async () => ({ nodes: [], edges: [], raw: [] }),
501
+ upsertNode: async () => { },
502
+ upsertEdge: async () => { },
503
+ deleteFile: async () => { },
504
+ deleteRepo: async () => { },
505
+ getCounts: async () => ({ totalNodes: 0, totalEdges: 0, byLabel: {} }),
506
+ ensureIndexes: async () => { },
507
+ };
508
+ }
509
+ // ---------------------------------------------------------------------------
510
+ // Main entry point
511
+ // ---------------------------------------------------------------------------
512
+ async function main() {
513
+ const { command, subcommand, flags } = parseArgs(process.argv);
514
+ if (!command || command === '--help' || command === 'help' || command === '-h') {
515
+ printHelp();
516
+ process.exit(0);
517
+ }
518
+ switch (command) {
519
+ case 'init':
520
+ await cmdInit(flags);
521
+ break;
522
+ case 'register':
523
+ await cmdRegister(flags);
524
+ break;
525
+ case 'index':
526
+ await cmdIndex(flags);
527
+ break;
528
+ case 'status':
529
+ cmdStatus(flags);
530
+ break;
531
+ case 'knowledge':
532
+ if (!subcommand) {
533
+ printError("knowledge requires a subcommand: list, search, sync, or migrate");
534
+ }
535
+ cmdKnowledge(subcommand, flags);
536
+ break;
537
+ case 'repos':
538
+ if (!subcommand) {
539
+ printError("repos requires a subcommand: list, info, or remove");
540
+ }
541
+ cmdRepos(subcommand, flags);
542
+ break;
543
+ default:
544
+ console.error(`Unknown command: '${command}'`);
545
+ printHelp();
546
+ process.exit(1);
547
+ }
548
+ }
549
+ main().catch((err) => {
550
+ console.error(`forge CLI error: ${String(err)}`);
551
+ process.exit(1);
552
+ });
553
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ import type { VectorStore, GraphStore, FileContentCache } from '../storage/interfaces.js';
2
+ import type { RepoSharing } from '../util/types.js';
3
+ /**
4
+ * Resolves the sharing mode for a given repo ID.
5
+ * Returns undefined if the repo is not found.
6
+ */
7
+ export type SharingResolver = (repoId: string) => RepoSharing | undefined;
8
+ export interface CodebaseContextOptions {
9
+ repoId?: string;
10
+ detail?: 'full' | 'skeleton' | 'paths';
11
+ maxResults?: number;
12
+ includeTests?: boolean;
13
+ includeCrossRepo?: boolean;
14
+ maxTokens?: number;
15
+ vectorWeight?: number;
16
+ graphWeight?: number;
17
+ }
18
+ export interface PivotFile {
19
+ filePath: string;
20
+ content: string;
21
+ relevanceScore: number;
22
+ matchReason: string;
23
+ }
24
+ export interface SupportingSkeleton {
25
+ filePath: string;
26
+ skeleton: string;
27
+ relevanceScore: number;
28
+ }
29
+ export interface CodebaseContextResult {
30
+ pivotFiles: PivotFile[];
31
+ supportingSkeletons: SupportingSkeleton[];
32
+ warnings: string[];
33
+ tokenCount: number;
34
+ executionTimeMs: number;
35
+ }
36
+ export declare class CodebaseContext {
37
+ private readonly graphStore;
38
+ private readonly vectorStore;
39
+ private readonly fileCache;
40
+ private readonly sharingResolver?;
41
+ constructor(graphStore: GraphStore | null, vectorStore: VectorStore | null, fileCache: FileContentCache | null, sharingResolver?: SharingResolver | undefined);
42
+ /**
43
+ * Retrieve codebase context for a natural-language query.
44
+ * Uses hybrid search (vector + graph) when both stores are available.
45
+ * Falls back to vector-only when graph is down.
46
+ * Returns empty results with warnings when vector store is unavailable.
47
+ */
48
+ getContext(query: string, options?: CodebaseContextOptions): Promise<CodebaseContextResult>;
49
+ /** True when at least the vector store is configured and reachable. */
50
+ isAvailable(): boolean;
51
+ /**
52
+ * Read file content. Checks cache first; falls back to disk read.
53
+ * Returns null if the file cannot be read.
54
+ */
55
+ private readFile;
56
+ }
57
+ //# sourceMappingURL=codebase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codebase.d.ts","sourceRoot":"","sources":["../../src/context/codebase.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAMpD;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,WAAW,GAAG,SAAS,CAAC;AAM1E,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,mBAAmB,EAAE,kBAAkB,EAAE,CAAC;IAC1C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAMD,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;gBAHhB,UAAU,EAAE,UAAU,GAAG,IAAI,EAC7B,WAAW,EAAE,WAAW,GAAG,IAAI,EAC/B,SAAS,EAAE,gBAAgB,GAAG,IAAI,EAClC,eAAe,CAAC,EAAE,eAAe,YAAA;IAGpD;;;;;OAKG;IACG,UAAU,CACd,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC;IA0LjC,uEAAuE;IACvE,WAAW,IAAI,OAAO;IAStB;;;OAGG;IACH,OAAO,CAAC,QAAQ;CAsBjB"}