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,462 @@
1
+ # Forge Swarm Learning — Inspector Verification Checklist
2
+
3
+ > **ACTIVE VERIFICATION DOCUMENT** — This checklist is currently being used for the inspector pass on the swarm learning implementation. Do not archive or remove until inspection is complete.
4
+
5
+ This checklist is for the inspector agent to systematically verify the swarm learning implementation across all 5 phases of the architecture plan.
6
+
7
+ ---
8
+
9
+ ## 1. Build Checks
10
+
11
+ - [ ] `npm run build` succeeds with zero errors and zero warnings
12
+ - [ ] No circular dependency warnings in the tsc output
13
+ - [ ] All new imports use `.js` extensions (ESM requirement — `tsconfig.json` uses `module: ESNext`, `moduleResolution: bundler`)
14
+ - [ ] `dist/` directory is rebuilt and matches source (the project commits dist/ to git for zero-build plugin install)
15
+ - [ ] No `any` type suppressions introduced (grep for `as any` or `// eslint-disable.*@typescript-eslint/no-explicit-any` in new code — existing `context-tools.ts:358` is a known exception)
16
+
17
+ ---
18
+
19
+ ## 2. Type Checks
20
+
21
+ ### 2.1 Factory Signatures vs Call Sites in `src/server.ts`
22
+
23
+ - [ ] `createPhaseTools(engine, contextInjector, vectorStore, graphStore)` — call at line 201 matches signature `(PipelineEngine, ContextInjector, VectorStore | null, GraphStore | null)` at `phase-tools.ts:209`
24
+ - [ ] `createContextTools(knowledgeSearch, codebaseCtx, engine, memoryBridge, vectorStore, graphStore)` — call at line 202-204 matches signature `(KnowledgeSearch, CodebaseContext, PipelineEngine, MemoryBridge?, VectorStore?, GraphStore?)` at `context-tools.ts:52`
25
+ - [ ] `createLearningTools(knowledgeSearch, confidenceManager, vectorStore)` — call at line 211-214 matches signature `(KnowledgeSearch, ConfidenceManager?, QdrantVectorStore?)` at `learning-tools.ts:41`
26
+ - [ ] `createMemoryTools(memoryBridge, vectorStore, graphStore)` — call at line 219 matches signature `(MemoryBridge, VectorStore | null, GraphStore | null)` at `memory-tools.ts:49`
27
+ - [ ] `createGraphTools(graphStore)` — call at line 220 matches signature `(GraphStore | null)` at `graph-tools.ts:36`
28
+ - [ ] `createCollaborationTools(vectorStore, graphStore, db)` — call at line 221 matches signature `(VectorStore | null, GraphStore | null, PipelineDB)` at `collaboration-tools.ts:35`
29
+ - [ ] `createIngestionTools(graphStore)` — call at line 216 matches signature `(GraphStore | null)` at `ingestion-tools.ts:32`
30
+ - [ ] `createPipelineTools(engine, registry)` — call at line 200 matches signature `(PipelineEngine, RepoRegistry)` at `pipeline-tools.ts:34`
31
+ - [ ] `createRegistrationTools(registry, stores)` — call at line 206-210 matches signature `(RepoRegistry, RegistrationToolStores?)` at `registration-tools.ts:61`
32
+ - [ ] `ContextInjector` constructor at line 186-193 matches `(KnowledgeSearch, CodebaseContext, MemoryBridge, PipelineDB, ConfidenceManager?, QdrantVectorStore?)` at `injector.ts:145-152`
33
+
34
+ ### 2.2 New Types in `src/util/types.ts`
35
+
36
+ - [ ] `FileChangeStats` type exists with fields: `commitCount`, `stabilityScore`, `changeVelocity`, `lastCommitHash`, `lastCommitTs`, `recentMessages[]`
37
+ - [ ] `CommitRecord` type exists with fields: `hash`, `message`, `author`, `timestamp`, `files[]`
38
+ - [ ] `GitCommitPayload` type exists for Qdrant: `repo_id`, `commit_hash`, `message`, `author`, `timestamp`, `file_paths[]`
39
+ - [ ] `ObservationPayload` type is used correctly in `collaboration-tools.ts` (imported at line 10)
40
+ - [ ] `QueryIntent` type includes all 4 values: `read`, `modify`, `debug`, `refactor`
41
+ - [ ] `IndexStatusOutput` type used in `registration-tools.ts:366` exists and is correct
42
+
43
+ ### 2.3 No `any` Types in New Code
44
+
45
+ - [ ] `src/tools/memory-tools.ts` — no untyped `any`
46
+ - [ ] `src/tools/graph-tools.ts` — no untyped `any`
47
+ - [ ] `src/tools/collaboration-tools.ts` — no untyped `any`
48
+ - [ ] `src/tools/ingestion-tools.ts` — no untyped `any`
49
+ - [ ] `src/query/ranking.ts` — no untyped `any`
50
+
51
+ ---
52
+
53
+ ## 3. New Tool Verification
54
+
55
+ ### Expected Tool Count: 34 total
56
+
57
+ Baseline 22 + 12 new tools. Verify `Object.keys(allTools).length` logged at server startup matches 34.
58
+
59
+ ### 3.1 Phase 1 Tools (6 new)
60
+
61
+ #### `save_observation`
62
+ - [ ] Registered in `allTools` via `...memoryTools` spread (server.ts:230)
63
+ - [ ] Schema: `{ content: string, symbols?: string[], repo_id?: string, importance?: number [0-1, default 0.5], tags?: string[], category?: string, type?: 'episodic'|'semantic'|'procedural'|'working' }`
64
+ - [ ] Returns: `{ id, stored, linked_symbols, unresolved_symbols }` on success
65
+ - [ ] Graceful degradation: returns `{ error: 'VECTOR_STORE_UNAVAILABLE', stored: false }` when vectorStore is null
66
+ - [ ] Uses no-op graph store when graphStore is null (does NOT throw)
67
+
68
+ #### `search_memory`
69
+ - [ ] Registered in `allTools` via `...memoryTools` spread
70
+ - [ ] Schema: `{ query: string, repo_id?: string, session_id?: string, limit?: number [1-50, default 10], score_threshold?: number [0-1, default 0.3] }`
71
+ - [ ] Returns: `{ results: [{ content, created_at, relevance_score, session_id }] }`
72
+ - [ ] Graceful degradation: catches errors and returns `{ error, results: [] }`
73
+
74
+ #### `get_session_context`
75
+ - [ ] Registered in `allTools` via `...memoryTools` spread
76
+ - [ ] Schema: `{ query?: string, session_count?: number [1-10, default 3], limit?: number [1-50, default 20] }`
77
+ - [ ] Returns: `{ current_session: { session_id, started_at, uptime_seconds, observation_count }, recent_sessions: [...] }`
78
+ - [ ] Graceful degradation: returns `{ error: 'VECTOR_STORE_UNAVAILABLE', current_session: null, recent_sessions: [] }` when vectorStore is null
79
+ - [ ] Calls `persistSessionMarker()` before querying
80
+
81
+ #### `get_impact_graph`
82
+ - [ ] Registered in `allTools` via `...graphTools` spread (server.ts:231)
83
+ - [ ] Schema: `{ symbol: string, repo_id: string, direction: 'inbound'|'outbound'|'both' [default 'both'], depth?: number [1-5, default 3] }`
84
+ - [ ] Returns: `{ symbol, direction, nodes: [...], edges: [...], total_nodes, total_edges }`
85
+ - [ ] Graceful degradation: returns `{ error: 'GRAPH_UNAVAILABLE' }` when graphStore is null OR unhealthy
86
+ - [ ] Uses both `QUERY_INBOUND_IMPACT` and `QUERY_OUTBOUND_IMPACT` from `graph-queries.ts`
87
+
88
+ #### `search_logic_flow`
89
+ - [ ] Registered in `allTools` via `...graphTools` spread
90
+ - [ ] Schema: `{ from_symbol: string, to_symbol: string, repo_id: string, max_depth?: number [1-10, default 5] }`
91
+ - [ ] Returns: `{ from_symbol, to_symbol, paths: [{ nodes, edges, length }], connected: boolean }`
92
+ - [ ] Graceful degradation: returns `{ error: 'GRAPH_UNAVAILABLE' }` when graphStore is null OR unhealthy
93
+ - [ ] Uses `QUERY_SHORTEST_PATH` from `graph-queries.ts`
94
+
95
+ #### `get_index_status`
96
+ - [ ] Registered in `allTools` via `...registrationTools` spread
97
+ - [ ] Schema: `{ repo_id?: string }`
98
+ - [ ] Returns: `{ repos, graph: { total_nodes, total_edges, node_counts }, vector: { code_chunks_count, observations_count }, cache, health: 'healthy'|'degraded'|'unavailable', embedding_model, uptime_seconds }`
99
+ - [ ] Graceful degradation: returns status for available backends only, reports health accurately
100
+
101
+ ### 3.2 Phase 2 Tools (2 new)
102
+
103
+ #### `boost_knowledge`
104
+ - [ ] Registered in `allTools` via `...learningTools` spread (server.ts:228)
105
+ - [ ] Schema: `{ knowledge_id: string, amount?: number [0-1, default 0.05], reason?: string }`
106
+ - [ ] Returns: `{ knowledge_id, boosted: true, amount, reason }` on success
107
+ - [ ] Graceful degradation: returns `{ error: 'CONFIDENCE_UNAVAILABLE' }` when confidenceManager or vectorStore is missing
108
+
109
+ #### `decay_knowledge`
110
+ - [ ] Registered in `allTools` via `...learningTools` spread
111
+ - [ ] Schema: `{ decay_rate?: number [0-1, default 0.01] }`
112
+ - [ ] Returns: `{ decayed_count, decay_rate }`
113
+ - [ ] Graceful degradation: returns `{ error: 'CONFIDENCE_UNAVAILABLE' }` when confidenceManager or vectorStore is missing
114
+
115
+ ### 3.3 Phase 3 Tools (1 new)
116
+
117
+ #### `get_git_context`
118
+ - [ ] Registered in `allTools` via `...contextTools` spread (server.ts:227)
119
+ - [ ] Schema: `{ mode: 'hotspots'|'commit_search'|'file_history', repo_id?: string, query?: string, file_path?: string, limit?: number [1-100, default 20] }`
120
+ - [ ] Mode `hotspots` returns: `{ mode: 'hotspots', results: [{ file_path, commit_count, stability_score, change_velocity }], total }`
121
+ - [ ] Mode `commit_search` returns: `{ mode: 'commit_search', results: [...], total }`
122
+ - [ ] Mode `file_history` returns: `{ mode: 'file_history', results: [{ file_path, commit_count, stability_score, change_velocity, last_commit_hash, last_commit_ts }], total }`
123
+ - [ ] Graceful degradation: `hotspots` requires graphStore, `commit_search` requires vectorStore + `searchGitCommits` method, `file_history` requires graphStore
124
+ - [ ] Returns descriptive error objects (not throws) when backends unavailable
125
+
126
+ ### 3.4 Phase 4 Tools (1 new)
127
+
128
+ #### `submit_lsp_edges`
129
+ - [ ] Registered in `allTools` via `...ingestionTools` spread (server.ts:229)
130
+ - [ ] Schema: `{ repo_id: string, edges: [{ from_file: string, from_symbol: string, to_file: string, to_symbol: string, edge_type: string }] }`
131
+ - [ ] Returns: `{ accepted: number, failed: number, errors?: string[] }`
132
+ - [ ] Graceful degradation: returns `{ error: 'GRAPH_UNAVAILABLE' }` when graphStore is null OR unhealthy
133
+ - [ ] Upserts both source and target Symbol nodes before creating the edge
134
+ - [ ] Sets `source: 'lsp'` on nodes to distinguish from AST-parsed nodes
135
+
136
+ ### 3.5 Phase 5 Tools (2 new)
137
+
138
+ #### `broadcast_finding`
139
+ - [ ] Registered in `allTools` via `...collaborationTools` spread (server.ts:232)
140
+ - [ ] Schema: `{ project_id: string, content: string, severity: 'info'|'warning'|'critical' [default 'info'], target_agents?: string[], symbols?: string[] }`
141
+ - [ ] Returns: `{ broadcast: true, observation_id, severity, project_id }`
142
+ - [ ] Saves observation to Qdrant (when available) with `category: 'agent_broadcast'`, `type: 'working'`
143
+ - [ ] Records in SQLite `pipeline_events` as `event_type: 'agent_broadcast'`
144
+ - [ ] Importance scaled by severity: critical=0.9, warning=0.7, info=0.5
145
+
146
+ #### `get_broadcasts`
147
+ - [ ] Registered in `allTools` via `...collaborationTools` spread
148
+ - [ ] Schema: `{ project_id: string, since?: number, severity?: 'info'|'warning'|'critical' }`
149
+ - [ ] Returns: `{ project_id, broadcasts: [...], count }`
150
+ - [ ] Queries SQLite `pipeline_events` table with `event_type = 'agent_broadcast'`
151
+ - [ ] Supports filtering by `since` timestamp and `severity`
152
+
153
+ ---
154
+
155
+ ## 4. Integration Points
156
+
157
+ ### 4.1 server.ts Wiring
158
+
159
+ - [ ] All 9 tool factory imports present (lines 35-43): `createPipelineTools`, `createPhaseTools`, `createContextTools`, `createRegistrationTools`, `createLearningTools`, `createIngestionTools`, `createMemoryTools`, `createGraphTools`, `createCollaborationTools`
160
+ - [ ] `ConfidenceManager` imported from `./learning/confidence.js` (line 45)
161
+ - [ ] `ConfidenceManager` instantiated at line 134
162
+ - [ ] `confidenceManager` passed to `ContextInjector` constructor (line 191)
163
+ - [ ] `confidenceManager` passed to `createLearningTools` (line 213)
164
+ - [ ] `vectorStore` passed as `QdrantVectorStore` to `ContextInjector` (line 192)
165
+ - [ ] `vectorStore` passed as `QdrantVectorStore | null` to `createLearningTools` (line 214)
166
+ - [ ] All tool objects spread into `allTools`: `pipelineTools`, `phaseTools`, `contextTools`, `registrationTools`, `learningTools`, `ingestionTools`, `memoryTools`, `graphTools`, `collaborationTools` (lines 223-233)
167
+ - [ ] Periodic confidence decay interval set at 24 hours (line 303-309)
168
+ - [ ] Decay interval calls `confidenceManager.decayAll(vectorStore)` with proper null guard (line 305)
169
+
170
+ ### 4.2 Auto-Observation in Phase Handlers (Phase 2)
171
+
172
+ - [ ] `phase-tools.ts` imports `saveObservation` from `observation-store.ts` (line 11)
173
+ - [ ] `phase-tools.ts` imports `getCurrentSessionId` from `session-tracker.ts` (line 12)
174
+ - [ ] `autoObserve` helper defined with null guards (line 170-202)
175
+ - [ ] `autoObserve` guards against `vectorStore === null` (line 181)
176
+ - [ ] `autoObserve` uses `noOpGraphStore` when graphStore is null (line 196)
177
+ - [ ] `autoObserve` wraps in `.catch()` — NEVER blocks phase transition (line 197-202)
178
+ - [ ] `submit_vision` calls `autoObserve` with `category: 'vision'`, `importance: 0.6` (line 302)
179
+ - [ ] `submit_plan` calls `autoObserve` with `category: 'architecture'`, `importance: 0.6` (line 442)
180
+ - [ ] `submit_design` calls `autoObserve` with `category: 'design'`, `importance: 0.5` (line 557)
181
+ - [ ] `submit_test_plan` calls `autoObserve` with `category: 'test_plan'`, `importance: 0.5` (line 672)
182
+ - [ ] `submit_implementation` calls `autoObserve` with `category: 'implementation'`, `importance: 0.5` (line 811)
183
+ - [ ] `submit_verdict` calls `autoObserve` with `category: 'inspection'`, `importance: 0.7` (line 947)
184
+ - [ ] All auto-observations tagged with `['auto_observation', phase_name, project_id]`
185
+
186
+ ### 4.3 Intent Detection in `get_codebase_context` (Phase 1)
187
+
188
+ - [ ] `context-tools.ts` imports `detectIntent` and `getIntentStrategy` from `intent-detector.ts` (line 11)
189
+ - [ ] `detectIntent(input.query)` called in `get_codebase_context` handler (line 115)
190
+ - [ ] `getIntentStrategy(queryIntent)` called to get weight adjustments (line 116)
191
+ - [ ] `strategy.vectorWeight` passed to `codebaseContext.getContext()` (line 125)
192
+ - [ ] `strategy.graphWeight` passed to `codebaseContext.getContext()` (line 126)
193
+ - [ ] `strategy.includeTests` used as fallback for include_tests (line 122)
194
+ - [ ] `queryIntent` returned in response (not hardcoded `'read'`) (line 175)
195
+
196
+ ### 4.4 Related Memories in `get_codebase_context`
197
+
198
+ - [ ] `memoryBridge` parameter accepted in `createContextTools` (line 56)
199
+ - [ ] `memoryBridge` passed from server.ts (line 203)
200
+ - [ ] `memoryBridge.searchMemories(input.query, ...)` called in handler (line 136)
201
+ - [ ] Results mapped to `relatedMemories` array (line 140-143)
202
+ - [ ] `related_memories` field populated in response (line 174)
203
+ - [ ] Memory search failure is non-fatal (wrapped in try/catch, logged at debug level) (line 144-148)
204
+
205
+ ### 4.5 Confidence Boost in ContextInjector
206
+
207
+ - [ ] `ContextInjector` accepts `ConfidenceManager` as optional constructor param (line 150)
208
+ - [ ] `ContextInjector` accepts `QdrantVectorStore` as optional constructor param (line 151)
209
+ - [ ] `boostConsumedKnowledge()` method defined as fire-and-forget (line 158-166)
210
+ - [ ] Boost called after knowledge search results are consumed during phase context assembly
211
+ - [ ] Boost is guarded against null `confidenceManager` or `vectorStore` (line 165)
212
+
213
+ ### 4.6 Hotspot Signal in Hybrid Search (Phase 3)
214
+
215
+ - [ ] `ranking.ts` has 5-signal scoring: vector (0.55), graph (0.20), recency (0.05), hotspot (0.10), observation (0.10) (lines 11-15)
216
+ - [ ] `ScoredResult` interface includes `hotspotScore` and `observationScore` fields (lines 26-27)
217
+ - [ ] `computeScore()` accepts `hotspotScore`, `hotspotWeight`, `observationScore`, `observationWeight` parameters with backward-compatible defaults (lines 52-55)
218
+ - [ ] `hybrid-search.ts` imports `QUERY_FILE_HOTSPOTS` from `graph-queries.ts` (line 15)
219
+ - [ ] `HybridSearchOptions` includes `intent?: QueryIntent` (line 27)
220
+
221
+ ### 4.7 Git Commits Collection in Qdrant (Phase 3)
222
+
223
+ - [ ] `qdrant-store.ts` has `ensureGitCommitsCollection()` method
224
+ - [ ] `qdrant-store.ts` has `upsertGitCommits()` method
225
+ - [ ] `qdrant-store.ts` has `searchGitCommits()` method
226
+ - [ ] `qdrant-store.ts` has `deleteGitCommitsByRepo()` method
227
+ - [ ] `context-tools.ts` checks for `'searchGitCommits' in vectorStore` before calling (line 337)
228
+
229
+ ### 4.8 Staleness Detection (Phase 2)
230
+
231
+ - [ ] `indexer.ts` calls `MARK_SYMBOL_OBSERVATIONS_STALE` when entities change on re-index
232
+ - [ ] Stale observations appear with `is_stale` flag in search results
233
+
234
+ ### 4.9 Pipeline-Tools Jira Fields (Phase 5)
235
+
236
+ - [ ] `createProjectSchema` includes `jira_ticket: z.string().optional()` (line 23)
237
+ - [ ] `createProjectSchema` includes `jira_epic: z.string().optional()` (line 24)
238
+ - [ ] Jira fields stored in project metadata JSON (line 91-93)
239
+ - [ ] Jira fields returned by `get_state` via project metadata
240
+
241
+ ---
242
+
243
+ ## 5. Agent Prompt Checks
244
+
245
+ ### 5.1 Memory & Observation Section (all 12 agents)
246
+
247
+ - [ ] `plugin/agents/architect.md` has `## Memory & Observation Tools` section (line 245)
248
+ - [ ] `plugin/agents/backend-specialist.md` has `## Memory & Observation Tools` section (line 153)
249
+ - [ ] `plugin/agents/data-specialist.md` has `## Memory & Observation Tools` section (line 156)
250
+ - [ ] `plugin/agents/designer.md` has `## Memory & Observation Tools` section (line 322)
251
+ - [ ] `plugin/agents/frontend-specialist.md` has `## Memory & Observation Tools` section (line 131)
252
+ - [ ] `plugin/agents/inspector.md` has `## Memory & Observation Tools` section (line 341)
253
+ - [ ] `plugin/agents/knowledge-keeper.md` has `## Memory & Observation Tools` section (line 313)
254
+ - [ ] `plugin/agents/platform-engineer.md` has `## Memory & Observation Tools` section (line 205)
255
+ - [ ] `plugin/agents/product-manager.md` has `## Memory & Observation Tools` section (line 240)
256
+ - [ ] `plugin/agents/qa-strategist.md` has `## Memory & Observation Tools` section (line 314)
257
+ - [ ] `plugin/agents/strategist.md` has `## Memory & Observation Tools` section (line 274)
258
+ - [ ] `plugin/agents/supervisor.md` has `## Memory & Observation Tools` section (line 212)
259
+
260
+ ### 5.2 Graph Analysis Section (7 agents)
261
+
262
+ - [ ] `plugin/agents/architect.md` has `## Graph Analysis Tools` section (line 258)
263
+ - [ ] `plugin/agents/backend-specialist.md` has `## Graph Analysis Tools` section (line 166)
264
+ - [ ] `plugin/agents/data-specialist.md` has `## Graph Analysis Tools` section (line 169)
265
+ - [ ] `plugin/agents/frontend-specialist.md` has `## Graph Analysis Tools` section (line 144)
266
+ - [ ] `plugin/agents/inspector.md` has `## Graph Analysis Tools` section (line 354)
267
+ - [ ] `plugin/agents/knowledge-keeper.md` has `## Graph Analysis Tools` section (line 326)
268
+ - [ ] `plugin/agents/platform-engineer.md` has `## Graph Analysis Tools` section (line 219)
269
+ - [ ] Agents WITHOUT Graph Analysis: `designer.md`, `product-manager.md`, `qa-strategist.md`, `strategist.md`, `supervisor.md` (5 agents -- confirm these do NOT have the section)
270
+
271
+ ### 5.3 Atlassian Section (7 agents)
272
+
273
+ - [ ] `plugin/agents/architect.md` has `## Atlassian Context (Optional)` section (line 278)
274
+ - [ ] `plugin/agents/inspector.md` has `## Atlassian Context (Optional)` section (line 374)
275
+ - [ ] `plugin/agents/knowledge-keeper.md` has `## Atlassian Context (Optional)` section (line 340)
276
+ - [ ] `plugin/agents/platform-engineer.md` has `## Atlassian Context (Optional)` section (line 239)
277
+ - [ ] `plugin/agents/product-manager.md` has `## Atlassian Context (Optional)` section (line 260)
278
+ - [ ] `plugin/agents/strategist.md` has `## Atlassian Context (Optional)` section (line 294)
279
+ - [ ] `plugin/agents/supervisor.md` has `## Atlassian Context (Optional)` section (line 238)
280
+ - [ ] All Atlassian sections include "If unavailable, skip without error" language
281
+ - [ ] Agents WITHOUT Atlassian: `backend-specialist.md`, `data-specialist.md`, `designer.md`, `frontend-specialist.md`, `qa-strategist.md` (5 agents -- confirm these do NOT have the section)
282
+
283
+ ### 5.4 Cross-Agent Collaboration Section (all 12 agents)
284
+
285
+ - [ ] `plugin/agents/architect.md` has `## Cross-Agent Collaboration` section (line 271)
286
+ - [ ] `plugin/agents/backend-specialist.md` has `## Cross-Agent Collaboration` section (line 179)
287
+ - [ ] `plugin/agents/data-specialist.md` has `## Cross-Agent Collaboration` section (line 182)
288
+ - [ ] `plugin/agents/designer.md` has `## Cross-Agent Collaboration` section (line 335)
289
+ - [ ] `plugin/agents/frontend-specialist.md` has `## Cross-Agent Collaboration` section (line 157)
290
+ - [ ] `plugin/agents/inspector.md` has `## Cross-Agent Collaboration` section (line 367)
291
+ - [ ] `plugin/agents/knowledge-keeper.md` has `## Cross-Agent Collaboration` section (line 333)
292
+ - [ ] `plugin/agents/platform-engineer.md` has `## Cross-Agent Collaboration` section (line 232)
293
+ - [ ] `plugin/agents/product-manager.md` has `## Cross-Agent Collaboration` section (line 253)
294
+ - [ ] `plugin/agents/qa-strategist.md` has `## Cross-Agent Collaboration` section (line 327)
295
+ - [ ] `plugin/agents/strategist.md` has `## Cross-Agent Collaboration` section (line 287)
296
+ - [ ] `plugin/agents/supervisor.md` has `## Cross-Agent Collaboration` section (line 231)
297
+ - [ ] All Collaboration sections reference `broadcast_finding` and `get_broadcasts`
298
+
299
+ ---
300
+
301
+ ## 6. Plugin Config
302
+
303
+ ### 6.1 `.mcp.json`
304
+
305
+ - [ ] `plugin/.mcp.json` has `dk-forge` server entry with correct args (line 2-5)
306
+ - [ ] `plugin/.mcp.json` has `atlassian` server entry (line 6-14)
307
+ - [ ] Atlassian entry uses `uvx` command with `mcp-atlassian` arg
308
+ - [ ] Atlassian entry references env vars: `JIRA_URL`, `JIRA_USERNAME`, `JIRA_API_TOKEN`
309
+ - [ ] Env var references use `${VAR}` syntax
310
+
311
+ ### 6.2 Atlassian Integration Docs
312
+
313
+ - [ ] `plugin/docs/atlassian-integration.md` exists
314
+ - [ ] Doc covers prerequisites (Python 3.10+, uvx, Jira Cloud)
315
+ - [ ] Doc covers environment variables table
316
+ - [ ] Doc covers graceful degradation behavior
317
+ - [ ] Doc lists which 7 agents use Jira and which 5 do not
318
+ - [ ] Doc covers troubleshooting (MCP start failure, auth errors, env var issues)
319
+
320
+ ---
321
+
322
+ ## 7. VS Code Extension (`vscode-extension/`)
323
+
324
+ ### 7.1 Project Structure
325
+
326
+ - [ ] `vscode-extension/package.json` exists
327
+ - [ ] `vscode-extension/tsconfig.json` exists
328
+ - [ ] `vscode-extension/src/extension.ts` exists
329
+ - [ ] `vscode-extension/src/edge-collector.ts` exists
330
+ - [ ] `vscode-extension/src/forge-client.ts` exists
331
+
332
+ ### 7.2 Extension Manifest (`package.json`)
333
+
334
+ - [ ] Name is `forge-lsp-bridge`
335
+ - [ ] Activates on `typescript`, `javascript`, `typescriptreact`, `javascriptreact` files
336
+ - [ ] `main` points to `./out/extension.js`
337
+ - [ ] Configuration contributes: `forge.lspBridge.enabled` (boolean, default true)
338
+ - [ ] Configuration contributes: `forge.lspBridge.repoId` (string, auto-detected from manifest)
339
+ - [ ] Configuration contributes: `forge.lspBridge.debounceMs` (number, default 5000, min 1000, max 30000)
340
+ - [ ] Configuration contributes: `forge.lspBridge.mcpServerPath` (string, path to dist/index.js)
341
+ - [ ] Commands: `forge.lspBridge.toggle` and `forge.lspBridge.flush`
342
+ - [ ] VS Code engine: `^1.85.0`
343
+
344
+ ### 7.3 TypeScript Config (`tsconfig.json`)
345
+
346
+ - [ ] `module: "commonjs"` (required for VS Code extensions)
347
+ - [ ] `target: "ES2022"`
348
+ - [ ] `outDir: "out"`
349
+ - [ ] `rootDir: "src"`
350
+ - [ ] `strict: true`
351
+ - [ ] Does NOT conflict with the main project tsconfig (separate tsconfig in vscode-extension/)
352
+
353
+ ### 7.4 Extension Entry Point (`extension.ts`)
354
+
355
+ - [ ] Exports `activate` and `deactivate` functions
356
+ - [ ] Creates `EdgeCollector` with debounce callback
357
+ - [ ] Creates `ForgeClient` for MCP communication
358
+ - [ ] Auto-detects `repoId` from `.forge/manifest.yaml` in workspace root
359
+ - [ ] Registers save listener on TS/JS files only (`SUPPORTED_LANGUAGES` set)
360
+ - [ ] Status bar item shows enabled/disabled state
361
+ - [ ] Toggle command registered (`forge.lspBridge.toggle`)
362
+ - [ ] Flush command registered (`forge.lspBridge.flush`)
363
+ - [ ] Configuration change watcher updates debounce, repoId, and enabled state
364
+ - [ ] Deactivation flushes pending edges and disposes client
365
+
366
+ ### 7.5 Edge Collector (`edge-collector.ts`)
367
+
368
+ - [ ] Uses `vscode.commands.executeCommand('vscode.prepareCallHierarchy')` for call hierarchy API
369
+ - [ ] Uses `vscode.commands.executeCommand('vscode.provideOutgoingCalls')` for outgoing calls
370
+ - [ ] Uses `vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider')` for symbol discovery
371
+ - [ ] Filters to callable symbols only: Function, Method, Constructor
372
+ - [ ] Builds qualified symbol names (e.g. `ClassName.methodName`)
373
+ - [ ] Collects `CALLS` edge type
374
+ - [ ] Skips self-references and `node_modules` targets
375
+ - [ ] Implements debounced flushing (configurable interval)
376
+ - [ ] `flushNow()` method for manual/deactivation flush
377
+ - [ ] Deduplicates edges within a batch before flushing
378
+ - [ ] Re-queues edges on flush failure
379
+
380
+ ### 7.6 Forge Client (`forge-client.ts`)
381
+
382
+ - [ ] Spawns dk-forge-server as child process on stdio
383
+ - [ ] Uses JSON-RPC 2.0 protocol with Content-Length framing
384
+ - [ ] Sends MCP `initialize` handshake with protocol version `2024-11-05`
385
+ - [ ] Sends `notifications/initialized` after handshake
386
+ - [ ] Calls `tools/call` with `name: 'submit_lsp_edges'` to submit edges
387
+ - [ ] Parses MCP tool response content blocks
388
+ - [ ] 30-second request timeout
389
+ - [ ] Lazy initialization (spawns server on first use)
390
+ - [ ] Proper cleanup on dispose (kills child process, clears pending requests)
391
+ - [ ] Sets `FORGE_LOG_LEVEL=warn` to prevent server log pollution on stdout
392
+ - [ ] Default server path resolves to `../../dist/index.js` relative to extension
393
+
394
+ ---
395
+
396
+ ## 8. Cross-Cutting Checks
397
+
398
+ ### 8.1 Graceful Degradation Matrix
399
+
400
+ | Tool | vectorStore=null | graphStore=null | Both null |
401
+ |------|-----------------|-----------------|-----------|
402
+ | `save_observation` | [ ] Returns error, stored: false | [ ] Uses noOpGraphStore | [ ] Returns error |
403
+ | `search_memory` | [ ] MemoryBridge handles internally | [ ] N/A | [ ] Returns empty |
404
+ | `get_session_context` | [ ] Returns error | [ ] N/A | [ ] Returns error |
405
+ | `get_impact_graph` | [ ] N/A | [ ] Returns GRAPH_UNAVAILABLE | [ ] Returns error |
406
+ | `search_logic_flow` | [ ] N/A | [ ] Returns GRAPH_UNAVAILABLE | [ ] Returns error |
407
+ | `get_index_status` | [ ] Reports degraded health | [ ] Reports degraded health | [ ] Reports unavailable |
408
+ | `boost_knowledge` | [ ] Returns CONFIDENCE_UNAVAILABLE | [ ] N/A | [ ] Returns error |
409
+ | `decay_knowledge` | [ ] Returns CONFIDENCE_UNAVAILABLE | [ ] N/A | [ ] Returns error |
410
+ | `get_git_context` (hotspots) | [ ] N/A | [ ] Returns GRAPH_UNAVAILABLE | [ ] Returns error |
411
+ | `get_git_context` (commit_search) | [ ] Returns GIT_COMMITS_UNAVAILABLE | [ ] N/A | [ ] Returns error |
412
+ | `get_git_context` (file_history) | [ ] N/A | [ ] Returns GRAPH_UNAVAILABLE | [ ] Returns error |
413
+ | `submit_lsp_edges` | [ ] N/A | [ ] Returns GRAPH_UNAVAILABLE | [ ] Returns error |
414
+ | `broadcast_finding` | [ ] Saves to SQLite only, skips observation | [ ] Uses noOpGraphStore | [ ] SQLite-only |
415
+ | `get_broadcasts` | [ ] Queries SQLite only | [ ] N/A | [ ] Queries SQLite only |
416
+ | Auto-observations (phase) | [ ] Skipped silently (debug log) | [ ] Uses noOpGraphStore | [ ] Skipped silently |
417
+
418
+ ### 8.2 No Blocking on Failure
419
+
420
+ - [ ] All `autoObserve` calls use `.catch()` (fire-and-forget pattern)
421
+ - [ ] All confidence boost calls in `ContextInjector` are fire-and-forget (line 158-160)
422
+ - [ ] Periodic decay interval uses `.catch()` (server.ts line 307)
423
+ - [ ] `broadcast_finding` observation save failure is non-fatal (collaboration-tools.ts line 75-77)
424
+ - [ ] Memory search in `get_codebase_context` is non-fatal (context-tools.ts line 144-148)
425
+
426
+ ### 8.3 Anti-Stub Checks
427
+
428
+ - [ ] No placeholder/TODO comments in new tool handlers that skip actual implementation
429
+ - [ ] All Zod schemas are complete (no `z.any()` or `z.unknown()` placeholders)
430
+ - [ ] All handler functions have real return values (not `return {}` stubs)
431
+ - [ ] `autoObserve` actually calls `saveObservation` (not stubbed)
432
+ - [ ] `ContextInjector.boostConsumedKnowledge` actually calls `confidenceManager.boost` (not stubbed)
433
+ - [ ] `ForgeClient.submitLspEdges` actually sends JSON-RPC request (not stubbed)
434
+ - [ ] `EdgeCollector.collectFromDocument` actually queries VS Code APIs (not stubbed)
435
+
436
+ ### 8.4 Security
437
+
438
+ - [ ] Cypher queries in `context-tools.ts` use `escCypher()` to prevent injection (line 488-494)
439
+ - [ ] No raw user input concatenated into SQL queries (SQLite uses parameterized queries in collaboration-tools.ts)
440
+ - [ ] No secrets/credentials hardcoded in any source file
441
+ - [ ] Atlassian credentials referenced only via `${ENV_VAR}` syntax in `.mcp.json`
442
+
443
+ ---
444
+
445
+ ## 9. Functional Verification (Manual Test Plan)
446
+
447
+ ### After Build Succeeds
448
+
449
+ 1. [ ] Start forge server: `npm start` — verify tool count in startup log matches expected (34)
450
+ 2. [ ] Call `save_observation` with `{ content: "test", symbols: ["createForgeServer"] }` — verify `stored: true`
451
+ 3. [ ] Call `search_memory` with `{ query: "test" }` — verify the saved observation appears
452
+ 4. [ ] Call `get_session_context` — verify `current_session` has valid `session_id` and `uptime_seconds`
453
+ 5. [ ] Call `get_impact_graph` with `{ symbol: "createForgeServer", repo_id: "...", direction: "inbound" }` (requires FalkorDB running)
454
+ 6. [ ] Call `search_logic_flow` with two known connected symbols (requires FalkorDB)
455
+ 7. [ ] Call `get_codebase_context` with a debug-style query (e.g. "why is the build failing") — verify `query_intent` is `'debug'`, NOT `'read'`
456
+ 8. [ ] Call `get_codebase_context` — verify `related_memories` is populated (not `[]`) if observations exist
457
+ 9. [ ] Call `get_index_status` — verify health reflects actual backend connectivity
458
+ 10. [ ] Call `get_git_context` with `mode: 'hotspots'` — verify returns files sorted by commit count (requires indexed repo + FalkorDB)
459
+ 11. [ ] Call `broadcast_finding` with `{ project_id: "test", content: "test finding", severity: "warning" }` — verify `broadcast: true`
460
+ 12. [ ] Call `get_broadcasts` with `{ project_id: "test" }` — verify the broadcast appears
461
+ 13. [ ] Run a full pipeline through `submit_verdict` — verify auto-observations created (search for `tags: ['auto_observation']`)
462
+ 14. [ ] Verify `boost_knowledge` and `decay_knowledge` work with valid knowledge IDs
@@ -0,0 +1,181 @@
1
+ # Plan: Git History Enrichment + Atlassian Integration for dk-forge-server
2
+
3
+ **Date**: 2026-02-27
4
+ **Status**: ABSORBED — This plan was incorporated into the forge-swarm-learning architecture (`docs/plans/completed/2026-02-27-forge-swarm-learning/architecture.md`). Git enrichment was implemented as Phase 3 and Atlassian integration as Phase 5 of that plan. Both are now complete.
5
+ **Author**: Architect (on behalf of Adam Reynolds)
6
+
7
+ ## Context
8
+
9
+ The dk-forge-server indexes code for semantic search but **barely uses the git history it already captures**. The `git-analyzer.ts` extracts CO_MODIFIED edges (files changed together) but misses change frequency, hotspots, commit messages, and stability metrics. Meanwhile, agents have no access to Jira tickets, PR feedback, or sprint context — despite heavy Jira usage.
10
+
11
+ **Goal**: Make agents smarter by giving them (1) enriched git history signals and (2) Atlassian project context.
12
+
13
+ ---
14
+
15
+ ## Part 1: Git History Enrichment (Server Code Changes)
16
+
17
+ ### What's new (beyond existing CO_MODIFIED edges)
18
+
19
+ | Signal | Storage | Used By |
20
+ |--------|---------|---------|
21
+ | Per-file commit count | FalkorDB File node property | Hybrid search hotspot boost |
22
+ | Stability score (0-1) | FalkorDB File node property | Architect, Inspector context |
23
+ | Change velocity (-1 to +1) | FalkorDB File node property | Supervisor routing |
24
+ | Last commit hash + timestamp | FalkorDB File node property | Recency awareness |
25
+ | Recent commit messages (per file) | New Qdrant `git_commits` collection | Semantic commit search |
26
+
27
+ ### Files to modify
28
+
29
+ **1. `src/util/types.ts`** — Add types
30
+ - `FileChangeStats` interface (commitCount, stabilityScore, changeVelocity, lastCommitHash, lastCommitTs, recentMessages)
31
+ - `CommitRecord` interface (hash, message, author, timestamp, files)
32
+ - `GitCommitPayload` interface for Qdrant (repo_id, commit_hash, message, author, timestamp, file_paths)
33
+ - Extend `GitAnalysisResult` → `EnrichedGitAnalysisResult` with `fileStats` and `commits`
34
+
35
+ **2. `src/ingestion/git-analyzer.ts`** — Enrich git log parsing
36
+ - Change `git log --format="%H"` → `git log --format="%H|%s|%an|%aI"` (add subject, author, date)
37
+ - Add `analyzeFileStats()` — compute per-file: commit count, stability score, velocity (recent half vs. older half of history), last commit info
38
+ - Add `extractCommitRecords()` — parse into `CommitRecord[]` (filter merge commits + bulk reformats >50 files)
39
+ - Update `runGitAnalysis()` to return enriched result + upsert file stats onto FalkorDB File nodes
40
+
41
+ **3. `src/storage/qdrant-store.ts`** — New `git_commits` collection
42
+ - Add `ensureGitCommitsCollection()` to `ensureCollections()`
43
+ - Payload indexes: `repo_id` (keyword), `commit_hash` (keyword), `author` (keyword), `timestamp` (integer), `file_paths` (keyword)
44
+ - Add `upsertGitCommits()`, `searchGitCommits()`, `deleteGitCommitsByRepo()`
45
+
46
+ **4. `src/ingestion/indexer.ts`** — Embed commit messages during indexing
47
+ - After `runGitAnalysis()`, batch-embed commit messages via `embedBatch()`
48
+ - Store as Qdrant points in `git_commits` collection with `GitCommitPayload`
49
+ - ~300-400 commits after filtering → ~2-3s extra indexing time
50
+
51
+ **5. `src/query/ranking.ts`** — Add hotspot signal to scoring
52
+ - Change weights: 0.6/0.3/0.1 → 0.55/0.25/0.10/0.10
53
+ - Add `hotspotScore` and `hotspotWeight` params to `computeScore()` (defaults to 0/0.10 — backward compatible)
54
+ - Add `hotspotScore` to `ScoredResult` interface
55
+ - Extend `buildMatchReason()` to include "hotspot (frequently changed)" when score > 0.5
56
+
57
+ **6. `src/query/hybrid-search.ts`** — Integrate hotspot into search pipeline
58
+ - After graph neighbor expansion, fetch file hotspot scores from FalkorDB
59
+ - Normalize: `hotspot = file.commit_count / max_commit_count_in_results`
60
+ - Pass to `computeScore()` as 4th signal
61
+ - For `modify`/`debug`/`refactor` intent: hotspot boosts volatile files. For `read` intent: no boost
62
+
63
+ **7. `src/query/graph-queries.ts`** — New graph queries
64
+ - `QUERY_FILE_HOTSPOTS(repoId)` — top 100 files by commit_count
65
+ - `QUERY_FILE_STATS(filePath, repoId)` — single file stats
66
+
67
+ **8. `src/tools/context-tools.ts`** — New `get_git_context` MCP tool
68
+ - Modes: `hotspots` | `commit_search` | `file_history`
69
+ - `hotspots`: top N files by change frequency + stability + velocity
70
+ - `commit_search`: semantic search over commit messages in Qdrant
71
+ - `file_history`: last N commits for a specific file
72
+ - Falls back to raw `git log` when FalkorDB/Qdrant unavailable
73
+
74
+ **9. `src/server.ts`** — Wire new tool
75
+ - Pass `vectorStore` to `createContextTools()`
76
+ - Register `get_git_context` tool
77
+
78
+ ### Graceful degradation
79
+ - No git → empty results (existing pattern)
80
+ - No FalkorDB → hotspot score = 0, `hotspots` mode falls back to raw git
81
+ - No Qdrant → `commit_search` returns empty, `file_history` falls back to raw git
82
+ - All three down → all git features silently degrade, existing functionality unaffected
83
+
84
+ ---
85
+
86
+ ## Part 2: Atlassian Integration (Plugin-Level, No Server Code in Phase 1)
87
+
88
+ ### Architecture
89
+
90
+ MCP is client→server only — dk-forge **cannot** call Atlassian MCP tools. But the plugin's `.mcp.json` can declare multiple servers. Claude (the client) mediates.
91
+
92
+ ### MCP server configuration
93
+
94
+ ```json
95
+ {
96
+ "dk-forge": {
97
+ "command": "node",
98
+ "args": ["${CLAUDE_PLUGIN_ROOT}/../dist/index.js"]
99
+ },
100
+ "atlassian": {
101
+ "command": "uvx",
102
+ "args": ["mcp-atlassian"],
103
+ "env": {
104
+ "JIRA_URL": "${JIRA_URL}",
105
+ "JIRA_USERNAME": "${JIRA_USERNAME}",
106
+ "JIRA_API_TOKEN": "${JIRA_API_TOKEN}"
107
+ }
108
+ }
109
+ }
110
+ ```
111
+
112
+ Using [sooperset/mcp-atlassian](https://github.com/sooperset/mcp-atlassian) (68 tools: 52 Jira + 16 Confluence). Bitbucket can be added separately if needed.
113
+
114
+ **Note**: Env vars use `${VAR}` interpolation — users set these in their environment. If vars are missing, the server fails to start but dk-forge works fine alone.
115
+
116
+ ### Agent prompt modifications (7 agents)
117
+
118
+ | Agent | What to add | Tools referenced |
119
+ |-------|------------|-----------------|
120
+ | **Strategist** | Pre-interview: pull linked Jira issue, sprint context. Post-vision: comment on ticket | `jira_get_issue`, `jira_search`, `jira_get_sprint_issues`, `jira_add_comment` |
121
+ | **Architect** | Check blocking issues, linked PRs, review feedback. Post-plan: comment on ticket | `jira_get_issue`, `jira_get_issue_development_info`, `jira_search`, `jira_add_comment` |
122
+ | **Inspector** | Check acceptance criteria from ticket. Post-verdict: comment pass/fail on ticket | `jira_get_issue`, `jira_add_comment`, `jira_transition_issue` |
123
+ | **Knowledge Keeper** | Pull ticket changelog for decision history. Post-extraction: comment summary | `jira_batch_get_changelogs`, `jira_add_comment` |
124
+ | **Product Manager** | Pull existing stories/epics to avoid duplicate requirements | `jira_search`, `jira_get_issue` |
125
+ | **Supervisor** | Check sprint capacity for routing priority | `jira_get_sprint_issues` |
126
+ | **Platform Engineer** | Check CI pipeline status via Bitbucket (if configured) | Bitbucket tools (Phase 2) |
127
+
128
+ **NOT modified**: Backend/Frontend/Data Specialists, Designer, QA Strategist — they receive context from upstream planning agents. Adding Jira calls to implementation agents = latency + token waste.
129
+
130
+ ### Graceful degradation pattern
131
+
132
+ Every Atlassian section in agent prompts uses this pattern:
133
+ ```
134
+ ## Atlassian Context (Optional)
135
+ These tools are OPTIONAL. If unavailable, skip without error and proceed normally.
136
+ ```
137
+
138
+ Strategist probes `jira_search` on pipeline start. If it fails → sets `atlassian_available: false` in session state → all downstream agents skip Atlassian calls.
139
+
140
+ ### New documentation
141
+
142
+ - `plugin/docs/atlassian-integration.md` — Setup guide, expected server names, what each agent does with Jira context
143
+
144
+ ---
145
+
146
+ ## Part 3: Phase 2 Server Changes for Atlassian (Future)
147
+
148
+ Not in this implementation, but designed for:
149
+ - Add `jira_ticket` and `jira_epic` optional fields to `create_project` schema
150
+ - Store in project metadata → returned by `get_state` → agents auto-discover ticket key
151
+ - Knowledge Keeper indexes closed ticket resolutions as knowledge items during `collect_knowledge`
152
+
153
+ ---
154
+
155
+ ## Implementation Order
156
+
157
+ | Step | What | Parallelizable? |
158
+ |------|------|----------------|
159
+ | 1 | Types (`types.ts`) + ranking weights (`ranking.ts`) | Yes — independent |
160
+ | 2 | Git analyzer enrichment + Qdrant git_commits collection | Yes — both in parallel |
161
+ | 3 | Indexer integration (embed commits, store file stats) | After step 2 |
162
+ | 4 | Hybrid search hotspot integration | After step 1 |
163
+ | 5 | `get_git_context` MCP tool + server wiring | After steps 3+4 |
164
+ | 6 | Agent prompt updates (git context references) | After step 5 |
165
+ | 7 | `.mcp.json` Atlassian server + agent Atlassian sections | **Parallel with steps 1-5** |
166
+ | 8 | `plugin/docs/atlassian-integration.md` | After step 7 |
167
+ | 9 | Rebuild dist/, test end-to-end | After all |
168
+
169
+ Steps 1-6 (git) and step 7 (Atlassian prompts) are fully independent — can be dispatched to parallel specialists.
170
+
171
+ ---
172
+
173
+ ## Verification
174
+
175
+ 1. **Build**: `npm run build` succeeds
176
+ 2. **Existing tests**: `npm test` passes (no regressions)
177
+ 3. **Git indexing**: Run `forge index --path . --force` on this repo → verify git_commits collection populated in Qdrant, File nodes have commit_count/stability_score in FalkorDB
178
+ 4. **New tool**: Call `mcp__dk-forge__get_git_context` with mode=hotspots → returns file list sorted by commit count
179
+ 5. **Commit search**: Call `mcp__dk-forge__get_git_context` with mode=commit_search, query="rebrand forge pipeline" → returns relevant commits
180
+ 6. **Hybrid search**: Call `mcp__dk-forge__get_codebase_context` → verify match_reason includes hotspot info for volatile files
181
+ 7. **Atlassian**: With `mcp-atlassian` configured, run `/forge new test-feature` and verify strategist attempts `jira_search`. Without it configured, verify no errors.