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/src/server.ts ADDED
@@ -0,0 +1,352 @@
1
+ // server.ts — B19
2
+ // MCP server setup: initialises all services and registers all tools.
3
+ //
4
+ // Startup sequence:
5
+ // 1. Initialize SQLite (PipelineDB) — always succeeds; creates file if needed
6
+ // 2. Attempt Qdrant connection with graceful degradation on failure
7
+ // 3. Attempt FalkorDB connection with graceful degradation on failure
8
+ // 4. Create ConfidenceManager for knowledge confidence tracking
9
+ // 5. Create file content cache
10
+ // 6. Create service instances (engine, registry, search, context, injector)
11
+ // 7. Collect all tool handlers (pipeline, phase, context, registration,
12
+ // learning, ingestion, memory, graph, collaboration)
13
+ // 8. Register all tools with the MCP server
14
+ // 9. Start periodic confidence decay (every 24 hours)
15
+ //
16
+ // Lazy loading: embedding model is NOT loaded here. It is lazy-loaded in
17
+ // embedder.ts on first use. This keeps server startup under 2 seconds.
18
+
19
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
20
+ import { homedir } from 'node:os';
21
+ import { join } from 'node:path';
22
+
23
+ import { PipelineDB } from './storage/sqlite.js';
24
+ import { QdrantVectorStore } from './storage/qdrant-store.js';
25
+ import { FalkorDBGraphStore } from './storage/falkordb-store.js';
26
+ import { LRUFileContentCache } from './storage/file-cache.js';
27
+
28
+ import { PipelineEngine } from './pipeline/engine.js';
29
+ import { RepoRegistry } from './knowledge/registry.js';
30
+ import { KnowledgeYamlStore } from './knowledge/store.js';
31
+ import { KnowledgeHydrator } from './knowledge/hydrator.js';
32
+ import { KnowledgeSearch } from './knowledge/search.js';
33
+
34
+ import { CodebaseContext } from './context/codebase.js';
35
+ import { MemoryBridge } from './context/memory.js';
36
+ import { ContextInjector } from './context/injector.js';
37
+
38
+ import { createPipelineTools } from './tools/pipeline-tools.js';
39
+ import { createPhaseTools } from './tools/phase-tools.js';
40
+ import { createContextTools } from './tools/context-tools.js';
41
+ import { createRegistrationTools } from './tools/registration-tools.js';
42
+ import { createLearningTools } from './tools/learning-tools.js';
43
+ import { createIngestionTools } from './tools/ingestion-tools.js';
44
+ import { createMemoryTools } from './tools/memory-tools.js';
45
+ import { createGraphTools } from './tools/graph-tools.js';
46
+ import { createCollaborationTools } from './tools/collaboration-tools.js';
47
+
48
+ import { ConfidenceManager } from './learning/confidence.js';
49
+
50
+ import { logger } from './util/logger.js';
51
+
52
+ // ---------------------------------------------------------------------------
53
+ // Default paths
54
+ // ---------------------------------------------------------------------------
55
+
56
+ const DEFAULT_DB_PATH = join(homedir(), '.forge', 'pipeline.db');
57
+ const QDRANT_URL = process.env['QDRANT_URL'] ?? 'http://localhost:6333';
58
+ const FALKORDB_HOST = process.env['FALKORDB_HOST'] ?? 'localhost';
59
+ const FALKORDB_PORT = parseInt(process.env['FALKORDB_PORT'] ?? '6380', 10);
60
+
61
+ // ---------------------------------------------------------------------------
62
+ // Server info
63
+ // ---------------------------------------------------------------------------
64
+
65
+ const SERVER_NAME = 'dk-forge';
66
+ const SERVER_VERSION = '0.1.0';
67
+
68
+ // ---------------------------------------------------------------------------
69
+ // createForgeServer
70
+ // ---------------------------------------------------------------------------
71
+
72
+ export async function createForgeServer(): Promise<McpServer> {
73
+ const startTime = Date.now();
74
+ logger.info(`${SERVER_NAME}: initializing`, { version: SERVER_VERSION });
75
+
76
+ // -------------------------------------------------------------------------
77
+ // 1. SQLite — always succeeds; creates ~/.forge/pipeline.db if needed
78
+ // -------------------------------------------------------------------------
79
+ const dbPath = process.env['FORGE_DB_PATH'] ?? DEFAULT_DB_PATH;
80
+ const db = new PipelineDB(dbPath);
81
+ db.initialize();
82
+ logger.info('server: SQLite initialized', { path: dbPath });
83
+
84
+ // -------------------------------------------------------------------------
85
+ // 2. Qdrant — graceful degradation if unavailable
86
+ // -------------------------------------------------------------------------
87
+ let vectorStore: QdrantVectorStore | null = null;
88
+ try {
89
+ const qdrant = new QdrantVectorStore(QDRANT_URL);
90
+ const qdrantHealthy = await qdrant.isHealthy();
91
+ if (qdrantHealthy) {
92
+ // Ensure collections exist (384-dim for all-MiniLM-L6-v2)
93
+ await qdrant.ensureCollections(384);
94
+ vectorStore = qdrant;
95
+ logger.info('server: Qdrant connected', { url: QDRANT_URL });
96
+ } else {
97
+ logger.warn('server: Qdrant unavailable — knowledge search and codebase context will be degraded', {
98
+ url: QDRANT_URL,
99
+ });
100
+ }
101
+ } catch (err) {
102
+ logger.warn('server: Qdrant connection failed — running without vector search', {
103
+ url: QDRANT_URL,
104
+ error: String(err),
105
+ });
106
+ }
107
+
108
+ // -------------------------------------------------------------------------
109
+ // 3. FalkorDB — graceful degradation if unavailable
110
+ // -------------------------------------------------------------------------
111
+ let graphStore: FalkorDBGraphStore | null = null;
112
+ try {
113
+ const falkor = new FalkorDBGraphStore(
114
+ `redis://${FALKORDB_HOST}:${FALKORDB_PORT}`,
115
+ );
116
+ await falkor.connect();
117
+ const falkorHealthy = await falkor.isHealthy();
118
+ if (falkorHealthy) {
119
+ graphStore = falkor;
120
+ logger.info('server: FalkorDB connected', { host: FALKORDB_HOST, port: FALKORDB_PORT });
121
+ } else {
122
+ logger.warn('server: FalkorDB unavailable — graph-boosted search disabled, using vector-only');
123
+ try { await falkor.disconnect(); } catch {}
124
+ }
125
+ } catch (err) {
126
+ logger.warn('server: FalkorDB connection failed — running without graph store', {
127
+ error: String(err),
128
+ });
129
+ }
130
+
131
+ // -------------------------------------------------------------------------
132
+ // 4. Confidence manager — tracks knowledge item usage and decay
133
+ // -------------------------------------------------------------------------
134
+ const confidenceManager = new ConfidenceManager();
135
+
136
+ // -------------------------------------------------------------------------
137
+ // 5. File content cache
138
+ // -------------------------------------------------------------------------
139
+ const fileCache = new LRUFileContentCache({
140
+ maxSizeBytes: 128 * 1024 * 1024, // 128 MB
141
+ maxEntries: 2000,
142
+ ttlMs: 30 * 60 * 1000, // 30 minutes
143
+ });
144
+
145
+ // -------------------------------------------------------------------------
146
+ // 6. Service instances
147
+ // -------------------------------------------------------------------------
148
+
149
+ // Knowledge hydrator — wires YAML store + Qdrant
150
+ // The KnowledgeHydrator's yamlStore is overridden per-registration call inside RepoRegistry,
151
+ // so we pass a placeholder that uses ~/.forge as the base directory.
152
+ const knowledgeHydrator = vectorStore
153
+ ? new KnowledgeHydrator(
154
+ new KnowledgeYamlStore(join(homedir(), '.forge')),
155
+ vectorStore,
156
+ )
157
+ : undefined;
158
+
159
+ // Repo registry — passes the hydrator for knowledge sync on registration
160
+ const registry = new RepoRegistry(db, knowledgeHydrator);
161
+
162
+ // Pipeline engine
163
+ const engine = new PipelineEngine(db);
164
+
165
+ // Knowledge search — wraps Qdrant knowledge collection
166
+ const knowledgeSearch = vectorStore
167
+ ? new KnowledgeSearch(vectorStore)
168
+ : createDegradedKnowledgeSearch();
169
+
170
+ // Codebase context — wraps hybrid search
171
+ // Sharing resolver: looks up a repo's sharing mode from the registry so that
172
+ // cross-repo search results from private repos are filtered out.
173
+ const codebaseCtx = new CodebaseContext(
174
+ graphStore,
175
+ vectorStore,
176
+ fileCache,
177
+ (repoId) => registry.getRepo(repoId)?.sharing,
178
+ );
179
+
180
+ // Memory bridge — wraps Qdrant observations collection
181
+ const memoryBridge = new MemoryBridge(vectorStore);
182
+
183
+ // Context injector — orchestrates all context assembly
184
+ // Accepts confidenceManager + vectorStore to auto-boost knowledge confidence
185
+ // on consumption (Phase 2 swarm learning).
186
+ const contextInjector = new ContextInjector(
187
+ knowledgeSearch,
188
+ codebaseCtx,
189
+ memoryBridge,
190
+ db,
191
+ confidenceManager,
192
+ vectorStore as QdrantVectorStore | undefined,
193
+ );
194
+
195
+ // -------------------------------------------------------------------------
196
+ // 7. Collect all tool handlers
197
+ // -------------------------------------------------------------------------
198
+
199
+ // Existing tool factories — updated with new params for swarm learning
200
+ const pipelineTools = createPipelineTools(engine, registry);
201
+ const phaseTools = createPhaseTools(engine, contextInjector, vectorStore, graphStore);
202
+ const contextTools = createContextTools(
203
+ knowledgeSearch, codebaseCtx, engine,
204
+ memoryBridge, vectorStore, graphStore,
205
+ );
206
+ const registrationTools = createRegistrationTools(registry, {
207
+ vectorStore,
208
+ graphStore,
209
+ fileCache,
210
+ });
211
+ const learningTools = createLearningTools(
212
+ knowledgeSearch,
213
+ confidenceManager,
214
+ vectorStore as QdrantVectorStore | null,
215
+ );
216
+ const ingestionTools = createIngestionTools(graphStore);
217
+
218
+ // New tool factories — swarm learning, graph analysis, collaboration
219
+ const memoryTools = createMemoryTools(memoryBridge, vectorStore, graphStore);
220
+ const graphTools = createGraphTools(graphStore);
221
+ const collaborationTools = createCollaborationTools(vectorStore, graphStore, db);
222
+
223
+ const allTools = {
224
+ ...pipelineTools,
225
+ ...phaseTools,
226
+ ...contextTools,
227
+ ...registrationTools,
228
+ ...learningTools,
229
+ ...ingestionTools,
230
+ ...memoryTools,
231
+ ...graphTools,
232
+ ...collaborationTools,
233
+ };
234
+
235
+ // -------------------------------------------------------------------------
236
+ // 8. Create and configure MCP server
237
+ // -------------------------------------------------------------------------
238
+ const server = new McpServer({
239
+ name: SERVER_NAME,
240
+ version: SERVER_VERSION,
241
+ });
242
+
243
+ // Register each tool with the MCP server
244
+ for (const [name, tool] of Object.entries(allTools)) {
245
+ const { schema, description, handler } = tool as {
246
+ schema: { shape: Record<string, unknown> };
247
+ description: string;
248
+ handler: (input: Record<string, unknown>) => Promise<unknown>;
249
+ };
250
+
251
+ server.tool(
252
+ name,
253
+ description,
254
+ // MCP SDK accepts raw Zod shape objects (not the full z.object wrapper)
255
+ (schema as unknown as { shape: Record<string, unknown> }).shape,
256
+ async (input: Record<string, unknown>) => {
257
+ try {
258
+ const result = await handler(input);
259
+ return {
260
+ content: [
261
+ {
262
+ type: 'text' as const,
263
+ text: JSON.stringify(result, null, 2),
264
+ },
265
+ ],
266
+ };
267
+ } catch (err) {
268
+ const errorPayload = {
269
+ error: 'TOOL_EXECUTION_ERROR',
270
+ tool: name,
271
+ message: String(err),
272
+ };
273
+ return {
274
+ content: [
275
+ {
276
+ type: 'text' as const,
277
+ text: JSON.stringify(errorPayload, null, 2),
278
+ },
279
+ ],
280
+ isError: true,
281
+ };
282
+ }
283
+ },
284
+ );
285
+
286
+ logger.debug(`server: registered tool: ${name}`);
287
+ }
288
+
289
+ const elapsed = Date.now() - startTime;
290
+ logger.info(`${SERVER_NAME}: ready`, {
291
+ toolCount: Object.keys(allTools).length,
292
+ qdrant: vectorStore !== null,
293
+ falkordb: graphStore !== null,
294
+ startupMs: elapsed,
295
+ });
296
+
297
+ // -------------------------------------------------------------------------
298
+ // 9. Periodic confidence decay — runs every 24 hours
299
+ // -------------------------------------------------------------------------
300
+ // Knowledge items that haven't been accessed recently see their confidence
301
+ // decrease over time. This prevents stale knowledge from dominating search
302
+ // results. The decay is best-effort and never blocks the server.
303
+ const DECAY_INTERVAL = 24 * 60 * 60 * 1000; // 24 hours
304
+ setInterval(() => {
305
+ if (vectorStore) {
306
+ confidenceManager.decayAll(vectorStore as QdrantVectorStore)
307
+ .catch(err => logger.warn('Periodic confidence decay failed', { error: String(err) }));
308
+ }
309
+ }, DECAY_INTERVAL);
310
+
311
+ // Expose close method for graceful shutdown
312
+ (server as McpServer & { _closeConnections?: () => Promise<void> })._closeConnections = async () => {
313
+ db.close();
314
+ if (graphStore) {
315
+ try { await graphStore.disconnect(); } catch {}
316
+ }
317
+ logger.info('server: connections closed');
318
+ };
319
+
320
+ return server;
321
+ }
322
+
323
+ // ---------------------------------------------------------------------------
324
+ // Degraded KnowledgeSearch stub — used when Qdrant is unavailable
325
+ // ---------------------------------------------------------------------------
326
+
327
+ function createDegradedKnowledgeSearch(): KnowledgeSearch {
328
+ // We need a QdrantVectorStore that always reports unhealthy.
329
+ // This causes KnowledgeSearch to return empty results gracefully.
330
+ const degradedStore = {
331
+ isHealthy: async () => false,
332
+ searchKnowledge: async () => [],
333
+ upsertKnowledge: async () => {},
334
+ deleteKnowledge: async () => {},
335
+ getKnowledgeCount: async () => 0,
336
+ searchCodeChunks: async () => [],
337
+ searchObservations: async () => [],
338
+ upsertCodeChunks: async () => {},
339
+ upsertObservation: async () => {},
340
+ deleteFileChunks: async () => {},
341
+ deleteRepoChunks: async () => {},
342
+ getCounts: async () => ({ codeChunks: 0, observations: 0 }),
343
+ getObservation: async () => null,
344
+ updateObservation: async () => {},
345
+ filterObservations: async () => [],
346
+ ensureCollections: async () => {},
347
+ connect: async () => {},
348
+ disconnect: async () => {},
349
+ } as unknown as QdrantVectorStore;
350
+
351
+ return new KnowledgeSearch(degradedStore);
352
+ }
File without changes