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
@@ -0,0 +1,65 @@
1
+ import type { Phase, PipelineTier } from '../util/types.js';
2
+ /**
3
+ * Returns true when the requested phase transition is legal for the given tier.
4
+ *
5
+ * Rules:
6
+ * - A phase may always transition to itself (idempotent re-start is handled
7
+ * at the engine layer, but the state machine permits it).
8
+ * - Otherwise the transition must appear in the table for the given tier.
9
+ *
10
+ * Note: cycle limit enforcement is NOT done here — call `canCycle()` in
11
+ * addition when the engine detects a backward edge.
12
+ */
13
+ export declare function isValidTransition(from: Phase, to: Phase, tier: PipelineTier): boolean;
14
+ /**
15
+ * Returns the set of phases that are legal next steps from `phase` for the
16
+ * given tier. This is used to populate `available_transitions` in API
17
+ * responses so callers know what actions are currently available.
18
+ */
19
+ export declare function getAvailableTransitions(phase: Phase, tier: PipelineTier): Phase[];
20
+ /**
21
+ * Maximum number of times each backward edge may be traversed before the
22
+ * engine forces a forward skip.
23
+ *
24
+ * Key format: '<from>_to_<to>'.
25
+ */
26
+ export declare const MAX_CYCLES: Readonly<Record<string, number>>;
27
+ /**
28
+ * Returns true if the backward (cycle) edge from -> to may be traversed given
29
+ * the current number of times it has already been traversed for this project.
30
+ *
31
+ * When the limit is exceeded the engine should force-advance to the next
32
+ * forward phase instead of looping.
33
+ *
34
+ * For transitions that are not tracked as cycles (i.e., not in MAX_CYCLES),
35
+ * this returns true unconditionally — those are ordinary forward transitions
36
+ * and cycle tracking does not apply.
37
+ */
38
+ export declare function canCycle(from: Phase, to: Phase, currentCycleCount: number): boolean;
39
+ /**
40
+ * Derives the cycle key used in the engine's cycle-count map for a given
41
+ * backward transition pair.
42
+ *
43
+ * Returns null when the pair is not a recognised cycle edge.
44
+ */
45
+ export declare function getCycleKey(from: Phase, to: Phase): string | null;
46
+ /**
47
+ * Determines whether a transition is a backward (cycle) edge, as opposed to a
48
+ * forward progression edge. This is needed by the engine to know when to
49
+ * increment the cycle counter.
50
+ *
51
+ * A transition is considered a cycle when:
52
+ * - The `to` phase appears earlier in the canonical phase order than `from`.
53
+ * - AND the key is present in MAX_CYCLES (meaning it is a recognised loop).
54
+ */
55
+ export declare function isCycleTransition(from: Phase, to: Phase): boolean;
56
+ /**
57
+ * Returns the phase the engine should force-advance to when a cycle limit is
58
+ * exceeded.
59
+ *
60
+ * Per the architecture spec:
61
+ * - inspection -> implementation exceeded: force to knowledge_collection
62
+ * - requirements -> architecture exceeded: force to implementation
63
+ */
64
+ export declare function getForcedAdvancePhase(from: Phase, to: Phase): Phase | null;
65
+ //# sourceMappingURL=state-machine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.d.ts","sourceRoot":"","sources":["../../src/pipeline/state-machine.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA0E5D;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,KAAK,EACX,EAAE,EAAE,KAAK,EACT,IAAI,EAAE,YAAY,GACjB,OAAO,CAQT;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,GAAG,KAAK,EAAE,CAGjF;AAMD;;;;;GAKG;AACH,eAAO,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAGvD,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,KAAK,EACX,EAAE,EAAE,KAAK,EACT,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAQT;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI,CAGjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAEjE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,GAAG,KAAK,GAAG,IAAI,CAO1E"}
@@ -0,0 +1,176 @@
1
+ // Pipeline state machine: transition table, validation, and cycle tracking.
2
+ //
3
+ // Design notes:
4
+ // - The Phase type from types.ts uses the forge-graph-rag naming convention
5
+ // ('idle', 'interview', 'requirements', 'architecture', 'design', 'qa_strategy',
6
+ // 'implementation', 'inspection', 'knowledge_collection', 'completed').
7
+ // - PipelineTier determines which edges are legal.
8
+ // - Cycle edges (inspection -> implementation, requirements -> architecture) are
9
+ // separate from the forward table so callers can track iteration counts.
10
+ // ---------------------------------------------------------------------------
11
+ // Transition table: maps each (Phase, PipelineTier) pair to the set of phases
12
+ // that may legally be transitioned to.
13
+ // ---------------------------------------------------------------------------
14
+ // For 'full' and 'abbreviated' tiers we share the same edge set — abbreviated
15
+ // is full minus the interview/requirements/design/qa phases, so we model it as
16
+ // a separate entry below.
17
+ const FULL_FORWARD_TRANSITIONS = {
18
+ idle: ['interview'],
19
+ interview: ['architecture'],
20
+ requirements: ['architecture'],
21
+ architecture: ['design', 'qa_strategy', 'implementation'],
22
+ design: ['qa_strategy', 'implementation'],
23
+ qa_strategy: ['implementation'],
24
+ implementation: ['inspection'],
25
+ inspection: ['knowledge_collection', 'implementation'],
26
+ knowledge_collection: ['completed'],
27
+ completed: [],
28
+ };
29
+ // Bug-fix (abbreviated) pipeline: idle -> architecture -> implementation ->
30
+ // inspection -> (completed | implementation). No interview/requirements/design/qa.
31
+ const BUG_FIX_FORWARD_TRANSITIONS = {
32
+ idle: ['architecture'],
33
+ interview: [],
34
+ requirements: ['architecture'],
35
+ architecture: ['implementation'],
36
+ design: [],
37
+ qa_strategy: [],
38
+ implementation: ['inspection'],
39
+ inspection: ['implementation', 'completed'],
40
+ knowledge_collection: [],
41
+ completed: [],
42
+ };
43
+ // Trivial: idle -> completed directly.
44
+ const TRIVIAL_FORWARD_TRANSITIONS = {
45
+ idle: ['completed'],
46
+ interview: [],
47
+ requirements: [],
48
+ architecture: [],
49
+ design: [],
50
+ qa_strategy: [],
51
+ implementation: [],
52
+ inspection: [],
53
+ knowledge_collection: [],
54
+ completed: [],
55
+ };
56
+ // Internal lookup by tier.
57
+ function getTable(tier) {
58
+ switch (tier) {
59
+ case 'full':
60
+ return FULL_FORWARD_TRANSITIONS;
61
+ case 'abbreviated':
62
+ return BUG_FIX_FORWARD_TRANSITIONS;
63
+ case 'trivial':
64
+ return TRIVIAL_FORWARD_TRANSITIONS;
65
+ default: {
66
+ // Exhaustiveness guard — TypeScript will catch unhandled tiers at
67
+ // compile time, but the runtime guard prevents silent misbehaviour.
68
+ const _exhaustive = tier;
69
+ throw new Error(`Unknown PipelineTier: ${_exhaustive}`);
70
+ }
71
+ }
72
+ }
73
+ // ---------------------------------------------------------------------------
74
+ // Public API
75
+ // ---------------------------------------------------------------------------
76
+ /**
77
+ * Returns true when the requested phase transition is legal for the given tier.
78
+ *
79
+ * Rules:
80
+ * - A phase may always transition to itself (idempotent re-start is handled
81
+ * at the engine layer, but the state machine permits it).
82
+ * - Otherwise the transition must appear in the table for the given tier.
83
+ *
84
+ * Note: cycle limit enforcement is NOT done here — call `canCycle()` in
85
+ * addition when the engine detects a backward edge.
86
+ */
87
+ export function isValidTransition(from, to, tier) {
88
+ if (from === to) {
89
+ // Re-entering the same phase is permitted (e.g., retrying a failed start).
90
+ return true;
91
+ }
92
+ const table = getTable(tier);
93
+ const legalTargets = table[from];
94
+ return legalTargets !== undefined && legalTargets.includes(to);
95
+ }
96
+ /**
97
+ * Returns the set of phases that are legal next steps from `phase` for the
98
+ * given tier. This is used to populate `available_transitions` in API
99
+ * responses so callers know what actions are currently available.
100
+ */
101
+ export function getAvailableTransitions(phase, tier) {
102
+ const table = getTable(tier);
103
+ return [...(table[phase] ?? [])];
104
+ }
105
+ // ---------------------------------------------------------------------------
106
+ // Cycle limits
107
+ // ---------------------------------------------------------------------------
108
+ /**
109
+ * Maximum number of times each backward edge may be traversed before the
110
+ * engine forces a forward skip.
111
+ *
112
+ * Key format: '<from>_to_<to>'.
113
+ */
114
+ export const MAX_CYCLES = {
115
+ inspection_to_implementation: 3,
116
+ requirements_to_architecture: 2,
117
+ };
118
+ /**
119
+ * Returns true if the backward (cycle) edge from -> to may be traversed given
120
+ * the current number of times it has already been traversed for this project.
121
+ *
122
+ * When the limit is exceeded the engine should force-advance to the next
123
+ * forward phase instead of looping.
124
+ *
125
+ * For transitions that are not tracked as cycles (i.e., not in MAX_CYCLES),
126
+ * this returns true unconditionally — those are ordinary forward transitions
127
+ * and cycle tracking does not apply.
128
+ */
129
+ export function canCycle(from, to, currentCycleCount) {
130
+ const key = `${from}_to_${to}`;
131
+ const max = MAX_CYCLES[key];
132
+ if (max === undefined) {
133
+ // Not a tracked cycle edge — no limit applies.
134
+ return true;
135
+ }
136
+ return currentCycleCount < max;
137
+ }
138
+ /**
139
+ * Derives the cycle key used in the engine's cycle-count map for a given
140
+ * backward transition pair.
141
+ *
142
+ * Returns null when the pair is not a recognised cycle edge.
143
+ */
144
+ export function getCycleKey(from, to) {
145
+ const key = `${from}_to_${to}`;
146
+ return key in MAX_CYCLES ? key : null;
147
+ }
148
+ /**
149
+ * Determines whether a transition is a backward (cycle) edge, as opposed to a
150
+ * forward progression edge. This is needed by the engine to know when to
151
+ * increment the cycle counter.
152
+ *
153
+ * A transition is considered a cycle when:
154
+ * - The `to` phase appears earlier in the canonical phase order than `from`.
155
+ * - AND the key is present in MAX_CYCLES (meaning it is a recognised loop).
156
+ */
157
+ export function isCycleTransition(from, to) {
158
+ return getCycleKey(from, to) !== null;
159
+ }
160
+ /**
161
+ * Returns the phase the engine should force-advance to when a cycle limit is
162
+ * exceeded.
163
+ *
164
+ * Per the architecture spec:
165
+ * - inspection -> implementation exceeded: force to knowledge_collection
166
+ * - requirements -> architecture exceeded: force to implementation
167
+ */
168
+ export function getForcedAdvancePhase(from, to) {
169
+ const key = `${from}_to_${to}`;
170
+ const forced = {
171
+ inspection_to_implementation: 'knowledge_collection',
172
+ requirements_to_architecture: 'implementation',
173
+ };
174
+ return forced[key] ?? null;
175
+ }
176
+ //# sourceMappingURL=state-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-machine.js","sourceRoot":"","sources":["../../src/pipeline/state-machine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Cypher query templates for FalkorDB graph operations.
3
+ * Centralizes all graph query patterns used by tools.
4
+ */
5
+ export declare const INDEX_QUERIES: readonly ["CREATE INDEX ON :File(path, repo_id)", "CREATE INDEX ON :Function(name, repo_id)", "CREATE INDEX ON :Class(name, repo_id)", "CREATE INDEX ON :Interface(name, repo_id)", "CREATE INDEX ON :Module(name, repo_id)", "CREATE INDEX ON :Observation(id)", "CREATE INDEX ON :Observation(session_id)"];
6
+ export declare const QUERY_TOTAL_NODES = "MATCH (n) RETURN count(n) as cnt";
7
+ export declare const QUERY_TOTAL_EDGES = "MATCH ()-[r]->() RETURN count(r) as cnt";
8
+ export declare const QUERY_NODES_BY_LABEL: (label: string) => string;
9
+ /**
10
+ * Get all entities contained in a file.
11
+ */
12
+ export declare const QUERY_FILE_ENTITIES: (filePath: string, repoId: string) => string;
13
+ /**
14
+ * Get all files in a repo.
15
+ */
16
+ export declare const QUERY_REPO_FILES: (repoId: string) => string;
17
+ /**
18
+ * Get files in a directory.
19
+ */
20
+ export declare const QUERY_DIRECTORY_FILES: (dirPath: string, repoId: string) => string;
21
+ /**
22
+ * Inbound: who calls/imports/uses this symbol?
23
+ */
24
+ export declare const QUERY_INBOUND_IMPACT: (symbolName: string, repoId: string, depth: number) => string;
25
+ /**
26
+ * Outbound: what does this symbol depend on?
27
+ */
28
+ export declare const QUERY_OUTBOUND_IMPACT: (symbolName: string, repoId: string, depth: number) => string;
29
+ /**
30
+ * Shortest path between two symbols in the call graph.
31
+ */
32
+ export declare const QUERY_SHORTEST_PATH: (fromSymbol: string, toSymbol: string, repoId: string, maxDepth: number) => string;
33
+ /**
34
+ * Get graph neighbors of a file (imports, tests, co-modified).
35
+ * Used to boost vector search results with graph connectivity.
36
+ */
37
+ export declare const QUERY_FILE_NEIGHBORS: (filePath: string, repoId: string, depth: number) => string;
38
+ /**
39
+ * Get import graph for a file.
40
+ */
41
+ export declare const QUERY_FILE_IMPORTS: (filePath: string, repoId: string) => string;
42
+ /**
43
+ * Get test files for a source file.
44
+ */
45
+ export declare const QUERY_FILE_TESTS: (filePath: string, repoId: string) => string;
46
+ /**
47
+ * Create or update an Observation node.
48
+ */
49
+ export declare const UPSERT_OBSERVATION: (id: string, content: string, sessionId: string, importance: number) => string;
50
+ /**
51
+ * Link an observation to a code symbol via REFERENCES edge.
52
+ */
53
+ export declare const LINK_OBSERVATION_TO_SYMBOL: (observationId: string, symbolName: string, repoId: string) => string;
54
+ /**
55
+ * Get recent observations by session.
56
+ */
57
+ export declare const QUERY_SESSION_OBSERVATIONS: (sessionId: string, limit: number) => string;
58
+ /**
59
+ * Mark observations as stale when a symbol changes.
60
+ */
61
+ export declare const MARK_SYMBOL_OBSERVATIONS_STALE: (symbolName: string, repoId: string) => string;
62
+ /**
63
+ * Get top files by commit_count (change hotspots) for a repo.
64
+ * Requires File nodes to have commit_count property set by git enrichment.
65
+ */
66
+ export declare const QUERY_FILE_HOTSPOTS: (repoId: string, limit?: number) => string;
67
+ /**
68
+ * Get git stats for a single file.
69
+ */
70
+ export declare const QUERY_FILE_STATS: (filePath: string, repoId: string) => string;
71
+ /**
72
+ * Upsert a co-modification relationship between two files.
73
+ */
74
+ export declare const UPSERT_CO_MODIFIED: (fileA: string, fileB: string, repoId: string, count: number, lastCommit: string) => string;
75
+ /**
76
+ * Upsert a CALLS relationship between two functions.
77
+ * Uses MERGE to avoid duplicate edges.
78
+ */
79
+ export declare const UPSERT_CALLS: (callerName: string, callerFilePath: string, calleeName: string, calleeFilePath: string, repoId: string, callCount: number) => string;
80
+ /**
81
+ * Upsert a TESTS relationship from a test file to its source file.
82
+ */
83
+ export declare const UPSERT_TESTS: (testFilePath: string, sourceFilePath: string, repoId: string) => string;
84
+ //# sourceMappingURL=graph-queries.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-queries.d.ts","sourceRoot":"","sources":["../../src/query/graph-queries.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,eAAO,MAAM,aAAa,+SAQhB,CAAC;AAMX,eAAO,MAAM,iBAAiB,qCAAqC,CAAC;AACpE,eAAO,MAAM,iBAAiB,4CAA4C,CAAC;AAE3E,eAAO,MAAM,oBAAoB,GAAI,OAAO,MAAM,WACL,CAAC;AAM9C;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,WAGnE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,WAG9C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAI,SAAS,MAAM,EAAE,QAAQ,MAAM,WAIpE,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAAI,YAAY,MAAM,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,WAKrF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAI,YAAY,MAAM,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,WAKtF,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,YAAY,MAAM,EAAE,UAAU,MAAM,EAAE,QAAQ,MAAM,EAAE,UAAU,MAAM,WAMzG,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,WAKnF,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,WAGlE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,WAGhE,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAC7B,IAAI,MAAM,EACV,SAAS,MAAM,EACf,WAAW,MAAM,EACjB,YAAY,MAAM,WAQnB,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,GAAI,eAAe,MAAM,EAAE,YAAY,MAAM,EAAE,QAAQ,MAAM,WAInG,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,0BAA0B,GAAI,WAAW,MAAM,EAAE,OAAO,MAAM,WAG1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,8BAA8B,GAAI,YAAY,MAAM,EAAE,QAAQ,MAAM,WAGhF,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,QAAQ,MAAM,EAAE,QAAO,MAAY,WAMtE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,WAGhE,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,MAAM,EAAE,OAAO,MAAM,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,EAAE,YAAY,MAAM,WAKjH,CAAC;AAMF;;;GAGG;AACH,eAAO,MAAM,YAAY,GACvB,YAAY,MAAM,EAClB,gBAAgB,MAAM,EACtB,YAAY,MAAM,EAClB,gBAAgB,MAAM,EACtB,QAAQ,MAAM,EACd,WAAW,MAAM,WAMlB,CAAC;AAMF;;GAEG;AACH,eAAO,MAAM,YAAY,GAAI,cAAc,MAAM,EAAE,gBAAgB,MAAM,EAAE,QAAQ,MAAM,WAIxF,CAAC"}
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Cypher query templates for FalkorDB graph operations.
3
+ * Centralizes all graph query patterns used by tools.
4
+ */
5
+ // ============================================================
6
+ // Index Creation Queries
7
+ // ============================================================
8
+ export const INDEX_QUERIES = [
9
+ 'CREATE INDEX ON :File(path, repo_id)',
10
+ 'CREATE INDEX ON :Function(name, repo_id)',
11
+ 'CREATE INDEX ON :Class(name, repo_id)',
12
+ 'CREATE INDEX ON :Interface(name, repo_id)',
13
+ 'CREATE INDEX ON :Module(name, repo_id)',
14
+ 'CREATE INDEX ON :Observation(id)',
15
+ 'CREATE INDEX ON :Observation(session_id)',
16
+ ];
17
+ // ============================================================
18
+ // Node Count Queries
19
+ // ============================================================
20
+ export const QUERY_TOTAL_NODES = 'MATCH (n) RETURN count(n) as cnt';
21
+ export const QUERY_TOTAL_EDGES = 'MATCH ()-[r]->() RETURN count(r) as cnt';
22
+ export const QUERY_NODES_BY_LABEL = (label) => `MATCH (n:${label}) RETURN count(n) as cnt`;
23
+ // ============================================================
24
+ // File Queries
25
+ // ============================================================
26
+ /**
27
+ * Get all entities contained in a file.
28
+ */
29
+ export const QUERY_FILE_ENTITIES = (filePath, repoId) => `
30
+ MATCH (f:File {path: "${esc(filePath)}", repo_id: "${esc(repoId)}"})-[:CONTAINS]->(s)
31
+ RETURN s, labels(s) as label
32
+ `;
33
+ /**
34
+ * Get all files in a repo.
35
+ */
36
+ export const QUERY_REPO_FILES = (repoId) => `
37
+ MATCH (f:File {repo_id: "${esc(repoId)}"})
38
+ RETURN f.path as path, f.content_hash as hash, f.last_indexed as indexed_at
39
+ `;
40
+ /**
41
+ * Get files in a directory.
42
+ */
43
+ export const QUERY_DIRECTORY_FILES = (dirPath, repoId) => `
44
+ MATCH (f:File {repo_id: "${esc(repoId)}"})
45
+ WHERE f.path STARTS WITH "${esc(dirPath)}"
46
+ RETURN f.path as path, f.language as language
47
+ `;
48
+ // ============================================================
49
+ // Impact Graph Queries
50
+ // ============================================================
51
+ /**
52
+ * Inbound: who calls/imports/uses this symbol?
53
+ */
54
+ export const QUERY_INBOUND_IMPACT = (symbolName, repoId, depth) => `
55
+ MATCH (center {name: "${esc(symbolName)}", repo_id: "${esc(repoId)}"})
56
+ MATCH path = (caller)-[r*1..${depth}]->(center)
57
+ RETURN caller, r, length(path) as depth
58
+ LIMIT 50
59
+ `;
60
+ /**
61
+ * Outbound: what does this symbol depend on?
62
+ */
63
+ export const QUERY_OUTBOUND_IMPACT = (symbolName, repoId, depth) => `
64
+ MATCH (center {name: "${esc(symbolName)}", repo_id: "${esc(repoId)}"})
65
+ MATCH path = (center)-[r*1..${depth}]->(dep)
66
+ RETURN dep, r, length(path) as depth
67
+ LIMIT 50
68
+ `;
69
+ // ============================================================
70
+ // Logic Flow Queries
71
+ // ============================================================
72
+ /**
73
+ * Shortest path between two symbols in the call graph.
74
+ */
75
+ export const QUERY_SHORTEST_PATH = (fromSymbol, toSymbol, repoId, maxDepth) => `
76
+ MATCH (a {name: "${esc(fromSymbol)}", repo_id: "${esc(repoId)}"}),
77
+ (b {name: "${esc(toSymbol)}", repo_id: "${esc(repoId)}"})
78
+ MATCH path = shortestPath((a)-[*..${maxDepth}]->(b))
79
+ RETURN path
80
+ LIMIT 3
81
+ `;
82
+ // ============================================================
83
+ // Graph Neighbor Queries (for hybrid search boost)
84
+ // ============================================================
85
+ /**
86
+ * Get graph neighbors of a file (imports, tests, co-modified).
87
+ * Used to boost vector search results with graph connectivity.
88
+ */
89
+ export const QUERY_FILE_NEIGHBORS = (filePath, repoId, depth) => `
90
+ MATCH (f:File {path: "${esc(filePath)}", repo_id: "${esc(repoId)}"})
91
+ MATCH (f)-[r*1..${depth}]-(neighbor:File)
92
+ RETURN neighbor.path as path, type(r[0]) as rel_type, length(r) as depth
93
+ LIMIT 20
94
+ `;
95
+ /**
96
+ * Get import graph for a file.
97
+ */
98
+ export const QUERY_FILE_IMPORTS = (filePath, repoId) => `
99
+ MATCH (f:File {path: "${esc(filePath)}", repo_id: "${esc(repoId)}"})-[:IMPORTS]->(dep:File)
100
+ RETURN dep.path as path
101
+ `;
102
+ /**
103
+ * Get test files for a source file.
104
+ */
105
+ export const QUERY_FILE_TESTS = (filePath, repoId) => `
106
+ MATCH (test:File)-[:TESTS]->(src:File {path: "${esc(filePath)}", repo_id: "${esc(repoId)}"})
107
+ RETURN test.path as path
108
+ `;
109
+ // ============================================================
110
+ // Observation Queries
111
+ // ============================================================
112
+ /**
113
+ * Create or update an Observation node.
114
+ */
115
+ export const UPSERT_OBSERVATION = (id, content, sessionId, importance) => `
116
+ MERGE (o:Observation {id: "${esc(id)}"})
117
+ SET o.content = "${esc(content)}",
118
+ o.session_id = "${esc(sessionId)}",
119
+ o.importance = ${importance},
120
+ o.is_stale = false,
121
+ o.created_at = ${Date.now()}
122
+ `;
123
+ /**
124
+ * Link an observation to a code symbol via REFERENCES edge.
125
+ */
126
+ export const LINK_OBSERVATION_TO_SYMBOL = (observationId, symbolName, repoId) => `
127
+ MATCH (o:Observation {id: "${esc(observationId)}"})
128
+ MATCH (s {name: "${esc(symbolName)}", repo_id: "${esc(repoId)}"})
129
+ MERGE (o)-[:REFERENCES]->(s)
130
+ `;
131
+ /**
132
+ * Get recent observations by session.
133
+ */
134
+ export const QUERY_SESSION_OBSERVATIONS = (sessionId, limit) => `
135
+ MATCH (o:Observation {session_id: "${esc(sessionId)}"})
136
+ RETURN o ORDER BY o.created_at DESC LIMIT ${limit}
137
+ `;
138
+ /**
139
+ * Mark observations as stale when a symbol changes.
140
+ */
141
+ export const MARK_SYMBOL_OBSERVATIONS_STALE = (symbolName, repoId) => `
142
+ MATCH (o:Observation)-[:REFERENCES]->(s {name: "${esc(symbolName)}", repo_id: "${esc(repoId)}"})
143
+ SET o.is_stale = true
144
+ `;
145
+ // ============================================================
146
+ // File Hotspot Queries (Phase 3 - git enrichment)
147
+ // ============================================================
148
+ /**
149
+ * Get top files by commit_count (change hotspots) for a repo.
150
+ * Requires File nodes to have commit_count property set by git enrichment.
151
+ */
152
+ export const QUERY_FILE_HOTSPOTS = (repoId, limit = 100) => `
153
+ MATCH (f:File {repo_id: "${esc(repoId)}"})
154
+ WHERE f.commit_count IS NOT NULL AND f.commit_count > 0
155
+ RETURN f.path as path, f.commit_count as commit_count, f.stability_score as stability_score, f.change_velocity as change_velocity
156
+ ORDER BY f.commit_count DESC
157
+ LIMIT ${limit}
158
+ `;
159
+ /**
160
+ * Get git stats for a single file.
161
+ */
162
+ export const QUERY_FILE_STATS = (filePath, repoId) => `
163
+ MATCH (f:File {path: "${esc(filePath)}", repo_id: "${esc(repoId)}"})
164
+ RETURN f.path as path, f.commit_count as commit_count, f.stability_score as stability_score, f.change_velocity as change_velocity, f.last_commit_hash as last_commit_hash, f.last_commit_ts as last_commit_ts
165
+ `;
166
+ // ============================================================
167
+ // Co-modification Queries
168
+ // ============================================================
169
+ /**
170
+ * Upsert a co-modification relationship between two files.
171
+ */
172
+ export const UPSERT_CO_MODIFIED = (fileA, fileB, repoId, count, lastCommit) => `
173
+ MATCH (a:File {path: "${esc(fileA)}", repo_id: "${esc(repoId)}"})
174
+ MATCH (b:File {path: "${esc(fileB)}", repo_id: "${esc(repoId)}"})
175
+ MERGE (a)-[r:CO_MODIFIED]-(b)
176
+ SET r.count = ${count}, r.last_commit = "${esc(lastCommit)}"
177
+ `;
178
+ // ============================================================
179
+ // CALLS Edge Queries
180
+ // ============================================================
181
+ /**
182
+ * Upsert a CALLS relationship between two functions.
183
+ * Uses MERGE to avoid duplicate edges.
184
+ */
185
+ export const UPSERT_CALLS = (callerName, callerFilePath, calleeName, calleeFilePath, repoId, callCount) => `
186
+ MATCH (caller:Function {name: "${esc(callerName)}", file_path: "${esc(callerFilePath)}", repo_id: "${esc(repoId)}"})
187
+ MATCH (callee:Function {name: "${esc(calleeName)}", file_path: "${esc(calleeFilePath)}", repo_id: "${esc(repoId)}"})
188
+ MERGE (caller)-[r:CALLS]->(callee)
189
+ SET r.call_count = ${callCount}
190
+ `;
191
+ // ============================================================
192
+ // TESTS Edge Queries
193
+ // ============================================================
194
+ /**
195
+ * Upsert a TESTS relationship from a test file to its source file.
196
+ */
197
+ export const UPSERT_TESTS = (testFilePath, sourceFilePath, repoId) => `
198
+ MATCH (test:File {path: "${esc(testFilePath)}", repo_id: "${esc(repoId)}"})
199
+ MATCH (src:File {path: "${esc(sourceFilePath)}", repo_id: "${esc(repoId)}"})
200
+ MERGE (test)-[:TESTS]->(src)
201
+ `;
202
+ // ============================================================
203
+ // Utility
204
+ // ============================================================
205
+ /**
206
+ * Escape a string for safe embedding in Cypher queries.
207
+ * FalkorDB uses double-quoted strings.
208
+ */
209
+ function esc(s) {
210
+ return s
211
+ .replace(/\\/g, '\\\\')
212
+ .replace(/"/g, '\\"')
213
+ .replace(/\n/g, '\\n')
214
+ .replace(/\r/g, '');
215
+ }
216
+ //# sourceMappingURL=graph-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-queries.js","sourceRoot":"","sources":["../../src/query/graph-queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Hybrid search engine combining vector similarity + graph neighbor boost.
3
+ * Final scoring: 0.6 * vector_score + 0.3 * graph_centrality + 0.1 * recency_boost
4
+ *
5
+ * Phase 2: Full graph neighbor expansion.
6
+ * For each vector hit, traverse graph neighbors (IMPORTS, CALLS, TESTS, CO_MODIFIED)
7
+ * up to pivot_depth hops, collect neighbor file paths, and boost their scores.
8
+ * Graph centrality = number of times a file appears as a neighbor / max neighbor appearances.
9
+ */
10
+ import type { VectorStore, GraphStore } from '../storage/interfaces.js';
11
+ import type { QueryIntent } from '../util/types.js';
12
+ import { type ScoredResult } from './ranking.js';
13
+ export interface HybridSearchOptions {
14
+ query: string;
15
+ repoId?: string;
16
+ limit?: number;
17
+ includeTests?: boolean;
18
+ pivotDepth?: number;
19
+ vectorWeight?: number;
20
+ graphWeight?: number;
21
+ /** Query intent — affects whether hotspot scoring is applied */
22
+ intent?: QueryIntent;
23
+ }
24
+ export interface HybridSearchResult {
25
+ results: ScoredResult[];
26
+ cacheHits: number;
27
+ executionTimeMs: number;
28
+ }
29
+ /**
30
+ * Perform hybrid search over indexed code chunks.
31
+ * Returns deduplicated, ranked results by file.
32
+ */
33
+ export declare function hybridSearch(vectorStore: VectorStore, graphStore: GraphStore, options: HybridSearchOptions): Promise<HybridSearchResult>;
34
+ //# sourceMappingURL=hybrid-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hybrid-search.d.ts","sourceRoot":"","sources":["../../src/query/hybrid-search.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,KAAK,EAAoB,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEtE,OAAO,EAAqD,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAIpG,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,WAAW,EACxB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CA0O7B"}