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,168 @@
1
+ // PipelineDB — thin wrapper around better-sqlite3 for the dk-forge-server.
2
+ //
3
+ // Responsibilities:
4
+ // - Opens (or creates) the SQLite file at a configurable path.
5
+ // - Enables WAL journal mode and foreign key enforcement on every connection.
6
+ // - Runs the schema DDL via initialize() — idempotent; safe to call on startup.
7
+ // - Provides run / get / all helpers so callers do not hold raw Statement refs.
8
+ // - Performs an integrity check on open; if the database is corrupt, renames
9
+ // the file to <name>.corrupt.<timestamp>.db and opens a fresh database.
10
+ //
11
+ // Threading: better-sqlite3 is synchronous. All operations are blocking.
12
+ // This is intentional — the MCP server is single-threaded Node.js; async
13
+ // SQLite wrappers add complexity without benefit for our access patterns.
14
+
15
+ import Database from 'better-sqlite3';
16
+ import {
17
+ existsSync,
18
+ mkdirSync,
19
+ renameSync,
20
+ } from 'node:fs';
21
+ import { dirname, join } from 'node:path';
22
+ import { homedir } from 'node:os';
23
+ import { SCHEMA_SQL } from './schema.js';
24
+
25
+ // Default location: ~/.forge/pipeline.db
26
+ const DEFAULT_DB_PATH = join(homedir(), '.forge', 'pipeline.db');
27
+
28
+ export class PipelineDB {
29
+ private _db: Database.Database | null = null;
30
+ private readonly filePath: string;
31
+
32
+ constructor(filePath: string = DEFAULT_DB_PATH) {
33
+ this.filePath = filePath;
34
+ this._db = this._open();
35
+ }
36
+
37
+ // ---------------------------------------------------------------------------
38
+ // Lifecycle
39
+ // ---------------------------------------------------------------------------
40
+
41
+ /** Run schema DDL. Idempotent — uses CREATE TABLE IF NOT EXISTS throughout. */
42
+ initialize(): void {
43
+ const db = this.db;
44
+ // Execute all statements in the schema in a single transaction.
45
+ // We split on ';' and filter empty strings so we can handle multi-statement
46
+ // schema strings cleanly.
47
+ db.transaction(() => {
48
+ const statements = SCHEMA_SQL
49
+ .split(';')
50
+ .map((s) => s.trim())
51
+ .filter((s) => s.length > 0);
52
+
53
+ for (const sql of statements) {
54
+ db.prepare(sql).run();
55
+ }
56
+ })();
57
+ }
58
+
59
+ /** Close the database connection. Safe to call multiple times. */
60
+ close(): void {
61
+ if (this._db && this._db.open) {
62
+ this._db.close();
63
+ this._db = null;
64
+ }
65
+ }
66
+
67
+ /** Raw better-sqlite3 Database instance. Throws if the connection is closed. */
68
+ get db(): Database.Database {
69
+ if (!this._db || !this._db.open) {
70
+ throw new Error('PipelineDB: database connection is closed');
71
+ }
72
+ return this._db;
73
+ }
74
+
75
+ // ---------------------------------------------------------------------------
76
+ // Query helpers
77
+ // ---------------------------------------------------------------------------
78
+
79
+ /**
80
+ * Execute a statement that does not return rows (INSERT, UPDATE, DELETE).
81
+ * Returns the RunResult with lastInsertRowid and changes.
82
+ */
83
+ run(
84
+ sql: string,
85
+ params: readonly unknown[] | Record<string, unknown> = [],
86
+ ): Database.RunResult {
87
+ return this.db.prepare(sql).run(params as never);
88
+ }
89
+
90
+ /**
91
+ * Return a single row or undefined if no row matches.
92
+ * The caller supplies the expected row shape via the generic parameter T.
93
+ */
94
+ get<T = Record<string, unknown>>(
95
+ sql: string,
96
+ params: readonly unknown[] | Record<string, unknown> = [],
97
+ ): T | undefined {
98
+ return this.db.prepare(sql).get(params as never) as T | undefined;
99
+ }
100
+
101
+ /**
102
+ * Return all matching rows as an array.
103
+ * Returns an empty array when no rows match.
104
+ */
105
+ all<T = Record<string, unknown>>(
106
+ sql: string,
107
+ params: readonly unknown[] | Record<string, unknown> = [],
108
+ ): T[] {
109
+ return this.db.prepare(sql).all(params as never) as T[];
110
+ }
111
+
112
+ // ---------------------------------------------------------------------------
113
+ // Private helpers
114
+ // ---------------------------------------------------------------------------
115
+
116
+ private _open(): Database.Database {
117
+ // Ensure the directory exists before attempting to open the file.
118
+ const dir = dirname(this.filePath);
119
+ if (!existsSync(dir)) {
120
+ mkdirSync(dir, { recursive: true });
121
+ }
122
+
123
+ const db = new Database(this.filePath);
124
+
125
+ // Enable WAL mode for better concurrent read performance.
126
+ db.pragma('journal_mode = WAL');
127
+
128
+ // Enforce foreign key constraints — SQLite disables them by default.
129
+ db.pragma('foreign_keys = ON');
130
+
131
+ // Integrity check. If the database is corrupt we rename it and open fresh
132
+ // so the server can still start rather than crashing on every boot.
133
+ if (!this._integrityCheck(db)) {
134
+ db.close();
135
+
136
+ const timestamp = Date.now();
137
+ const corruptPath = this.filePath.replace(/\.db$/, '') + `.corrupt.${timestamp}.db`;
138
+ renameSync(this.filePath, corruptPath);
139
+ console.error(
140
+ `PipelineDB: integrity check failed. Corrupt database renamed to:\n ${corruptPath}\n` +
141
+ ` A fresh database will be created at:\n ${this.filePath}`,
142
+ );
143
+
144
+ // Open a fresh database at the original path.
145
+ const fresh = new Database(this.filePath);
146
+ fresh.pragma('journal_mode = WAL');
147
+ fresh.pragma('foreign_keys = ON');
148
+ return fresh;
149
+ }
150
+
151
+ return db;
152
+ }
153
+
154
+ /**
155
+ * Runs SQLite's built-in integrity_check pragma.
156
+ * Returns true if the database passes, false if it is corrupt or the check
157
+ * itself throws (which happens when the file header is completely invalid).
158
+ */
159
+ private _integrityCheck(db: Database.Database): boolean {
160
+ try {
161
+ const result = db.pragma('integrity_check') as Array<{ integrity_check: string }>;
162
+ // integrity_check returns one row with value "ok" when healthy.
163
+ return result.length === 1 && result[0]?.integrity_check === 'ok';
164
+ } catch {
165
+ return false;
166
+ }
167
+ }
168
+ }
File without changes
@@ -0,0 +1,208 @@
1
+ // collaboration-tools.ts — Swarm Learning Phase 5
2
+ // MCP tool handlers for cross-agent collaboration.
3
+ // Tools: broadcast_finding, get_broadcasts
4
+
5
+ import { z } from 'zod';
6
+ import type { VectorStore, GraphStore } from '../storage/interfaces.js';
7
+ import type { PipelineDB } from '../storage/sqlite.js';
8
+ import { saveObservation } from '../memory/observation-store.js';
9
+ import { getCurrentSessionId } from '../memory/session-tracker.js';
10
+ import { logger } from '../util/logger.js';
11
+
12
+ // ---------------------------------------------------------------------------
13
+ // Input schemas
14
+ // ---------------------------------------------------------------------------
15
+
16
+ export const broadcastFindingSchema = z.object({
17
+ project_id: z.string().min(1, 'project_id is required'),
18
+ content: z.string().min(1, 'content is required'),
19
+ severity: z.enum(['info', 'warning', 'critical']).default('info'),
20
+ target_agents: z.array(z.string()).optional(),
21
+ symbols: z.array(z.string()).optional(),
22
+ });
23
+
24
+ export const getBroadcastsSchema = z.object({
25
+ project_id: z.string().min(1, 'project_id is required'),
26
+ since: z.number().optional(),
27
+ severity: z.enum(['info', 'warning', 'critical']).optional(),
28
+ });
29
+
30
+ // ---------------------------------------------------------------------------
31
+ // Tool factory
32
+ // ---------------------------------------------------------------------------
33
+
34
+ export function createCollaborationTools(
35
+ vectorStore: VectorStore | null,
36
+ graphStore: GraphStore | null,
37
+ db: PipelineDB,
38
+ ) {
39
+ return {
40
+ 'broadcast_finding': {
41
+ schema: broadcastFindingSchema,
42
+ description: 'Broadcast a finding to other agents working on the same project. MANDATORY during implementation — broadcast all interface changes, API contracts, schema changes, and blockers so sibling agents can react. Creates an observation and records in pipeline events.',
43
+ handler: async (input: z.infer<typeof broadcastFindingSchema>) => {
44
+ try {
45
+ let observationId: string | null = null;
46
+
47
+ // Save as observation if vector store is available
48
+ if (vectorStore) {
49
+ try {
50
+ const effectiveGraphStore = graphStore ?? createNoOpGraphStore();
51
+ const result = await saveObservation(
52
+ {
53
+ content: input.content,
54
+ symbols: input.symbols,
55
+ importance: input.severity === 'critical' ? 0.9 : input.severity === 'warning' ? 0.7 : 0.5,
56
+ tags: ['broadcast', 'agent_broadcast', input.project_id, input.severity],
57
+ category: 'agent_broadcast',
58
+ sessionId: getCurrentSessionId(),
59
+ type: 'working',
60
+ source: 'forge',
61
+ metadata: {
62
+ project_id: input.project_id,
63
+ severity: input.severity,
64
+ target_agents: input.target_agents,
65
+ },
66
+ },
67
+ vectorStore,
68
+ effectiveGraphStore,
69
+ graphStore
70
+ ? { writeVector: true, writeGraphNode: true, defaultNamespace: 'default' }
71
+ : { writeVector: true, writeGraphNode: false, defaultNamespace: 'default' },
72
+ );
73
+ observationId = result.id;
74
+ } catch (err) {
75
+ logger.warn('broadcast_finding: observation save failed (non-fatal)', { error: String(err) });
76
+ }
77
+ }
78
+
79
+ // Record in SQLite pipeline_events
80
+ try {
81
+ db.run(
82
+ `INSERT INTO pipeline_events (project_id, event_type, from_phase, to_phase, agent, payload, created_at)
83
+ VALUES (?, ?, NULL, NULL, NULL, ?, ?)`,
84
+ [
85
+ input.project_id,
86
+ 'agent_broadcast',
87
+ JSON.stringify({
88
+ content: input.content,
89
+ severity: input.severity,
90
+ target_agents: input.target_agents,
91
+ observation_id: observationId,
92
+ }),
93
+ Date.now(),
94
+ ],
95
+ );
96
+ } catch (err) {
97
+ logger.warn('broadcast_finding: event recording failed', { error: String(err) });
98
+ }
99
+
100
+ logger.debug('collaboration-tools.broadcast_finding: completed', {
101
+ projectId: input.project_id,
102
+ severity: input.severity,
103
+ observationId,
104
+ });
105
+
106
+ return {
107
+ broadcast: true,
108
+ observation_id: observationId,
109
+ severity: input.severity,
110
+ project_id: input.project_id,
111
+ };
112
+ } catch (err) {
113
+ logger.error('collaboration-tools.broadcast_finding: error', { error: String(err) });
114
+ return {
115
+ error: 'BROADCAST_FINDING_FAILED',
116
+ message: String(err),
117
+ broadcast: false,
118
+ };
119
+ }
120
+ },
121
+ },
122
+
123
+ 'get_broadcasts': {
124
+ schema: getBroadcastsSchema,
125
+ description: 'Get recent broadcasts for a project. ALWAYS CALL THIS at the start of implementation to see what sibling agents have discovered. Filter by severity or time range.',
126
+ handler: async (input: z.infer<typeof getBroadcastsSchema>) => {
127
+ try {
128
+ // Query from SQLite pipeline_events
129
+ let query = `SELECT * FROM pipeline_events WHERE project_id = ? AND event_type = 'agent_broadcast'`;
130
+ const params: unknown[] = [input.project_id];
131
+
132
+ if (input.since) {
133
+ query += ` AND created_at >= ?`;
134
+ params.push(input.since);
135
+ }
136
+
137
+ query += ` ORDER BY created_at DESC LIMIT 50`;
138
+
139
+ const rows = db.all<{
140
+ id: number;
141
+ project_id: string;
142
+ payload: string;
143
+ created_at: number;
144
+ }>(query, params);
145
+
146
+ let broadcasts = rows.map(row => {
147
+ let payload: Record<string, unknown> = {};
148
+ try {
149
+ payload = JSON.parse(row.payload) as Record<string, unknown>;
150
+ } catch {}
151
+
152
+ return {
153
+ id: row.id,
154
+ content: String(payload.content ?? ''),
155
+ severity: String(payload.severity ?? 'info'),
156
+ target_agents: (payload.target_agents as string[] | undefined) ?? [],
157
+ observation_id: payload.observation_id as string | undefined,
158
+ created_at: row.created_at,
159
+ };
160
+ });
161
+
162
+ // Filter by severity if specified
163
+ if (input.severity) {
164
+ broadcasts = broadcasts.filter(b => b.severity === input.severity);
165
+ }
166
+
167
+ logger.debug('collaboration-tools.get_broadcasts: completed', {
168
+ projectId: input.project_id,
169
+ count: broadcasts.length,
170
+ });
171
+
172
+ return {
173
+ project_id: input.project_id,
174
+ broadcasts,
175
+ count: broadcasts.length,
176
+ };
177
+ } catch (err) {
178
+ logger.error('collaboration-tools.get_broadcasts: error', { error: String(err) });
179
+ return {
180
+ error: 'GET_BROADCASTS_FAILED',
181
+ message: String(err),
182
+ broadcasts: [],
183
+ count: 0,
184
+ };
185
+ }
186
+ },
187
+ },
188
+ };
189
+ }
190
+
191
+ // ---------------------------------------------------------------------------
192
+ // No-op graph store
193
+ // ---------------------------------------------------------------------------
194
+
195
+ function createNoOpGraphStore(): GraphStore {
196
+ return {
197
+ connect: async () => {},
198
+ disconnect: async () => {},
199
+ isHealthy: async () => false,
200
+ query: async () => ({ nodes: [], edges: [], raw: [] }),
201
+ upsertNode: async () => {},
202
+ upsertEdge: async () => {},
203
+ deleteFile: async () => {},
204
+ deleteRepo: async () => {},
205
+ getCounts: async () => ({ totalNodes: 0, totalEdges: 0, byLabel: {} }),
206
+ ensureIndexes: async () => {},
207
+ };
208
+ }