forge-server 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/.claude/hooks/worktree-create.sh +64 -0
  2. package/.claude/hooks/worktree-remove.sh +57 -0
  3. package/.claude/settings.local.json +29 -0
  4. package/.forge/knowledge/conventions.yaml +1 -0
  5. package/.forge/knowledge/decisions.yaml +1 -0
  6. package/.forge/knowledge/gotchas.yaml +1 -0
  7. package/.forge/knowledge/patterns.yaml +1 -0
  8. package/.forge/manifest.yaml +6 -0
  9. package/CLAUDE.md +144 -0
  10. package/bin/setup-forge.sh +132 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +553 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/context/codebase.d.ts +57 -0
  16. package/dist/context/codebase.d.ts.map +1 -0
  17. package/dist/context/codebase.js +301 -0
  18. package/dist/context/codebase.js.map +1 -0
  19. package/dist/context/injector.d.ts +147 -0
  20. package/dist/context/injector.d.ts.map +1 -0
  21. package/dist/context/injector.js +533 -0
  22. package/dist/context/injector.js.map +1 -0
  23. package/dist/context/memory.d.ts +32 -0
  24. package/dist/context/memory.d.ts.map +1 -0
  25. package/dist/context/memory.js +140 -0
  26. package/dist/context/memory.js.map +1 -0
  27. package/dist/context/session-index.d.ts +54 -0
  28. package/dist/context/session-index.d.ts.map +1 -0
  29. package/dist/context/session-index.js +265 -0
  30. package/dist/context/session-index.js.map +1 -0
  31. package/dist/context/session.d.ts +42 -0
  32. package/dist/context/session.d.ts.map +1 -0
  33. package/dist/context/session.js +121 -0
  34. package/dist/context/session.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +37 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/ingestion/chunker.d.ts +19 -0
  40. package/dist/ingestion/chunker.d.ts.map +1 -0
  41. package/dist/ingestion/chunker.js +189 -0
  42. package/dist/ingestion/chunker.js.map +1 -0
  43. package/dist/ingestion/embedder.d.ts +45 -0
  44. package/dist/ingestion/embedder.d.ts.map +1 -0
  45. package/dist/ingestion/embedder.js +152 -0
  46. package/dist/ingestion/embedder.js.map +1 -0
  47. package/dist/ingestion/git-analyzer.d.ts +77 -0
  48. package/dist/ingestion/git-analyzer.d.ts.map +1 -0
  49. package/dist/ingestion/git-analyzer.js +437 -0
  50. package/dist/ingestion/git-analyzer.js.map +1 -0
  51. package/dist/ingestion/indexer.d.ts +79 -0
  52. package/dist/ingestion/indexer.d.ts.map +1 -0
  53. package/dist/ingestion/indexer.js +766 -0
  54. package/dist/ingestion/indexer.js.map +1 -0
  55. package/dist/ingestion/markdown-chunker.d.ts +19 -0
  56. package/dist/ingestion/markdown-chunker.d.ts.map +1 -0
  57. package/dist/ingestion/markdown-chunker.js +243 -0
  58. package/dist/ingestion/markdown-chunker.js.map +1 -0
  59. package/dist/ingestion/markdown-knowledge.d.ts +21 -0
  60. package/dist/ingestion/markdown-knowledge.d.ts.map +1 -0
  61. package/dist/ingestion/markdown-knowledge.js +129 -0
  62. package/dist/ingestion/markdown-knowledge.js.map +1 -0
  63. package/dist/ingestion/parser.d.ts +20 -0
  64. package/dist/ingestion/parser.d.ts.map +1 -0
  65. package/dist/ingestion/parser.js +429 -0
  66. package/dist/ingestion/parser.js.map +1 -0
  67. package/dist/ingestion/watcher.d.ts +28 -0
  68. package/dist/ingestion/watcher.d.ts.map +1 -0
  69. package/dist/ingestion/watcher.js +147 -0
  70. package/dist/ingestion/watcher.js.map +1 -0
  71. package/dist/knowledge/hydrator.d.ts +37 -0
  72. package/dist/knowledge/hydrator.d.ts.map +1 -0
  73. package/dist/knowledge/hydrator.js +220 -0
  74. package/dist/knowledge/hydrator.js.map +1 -0
  75. package/dist/knowledge/registry.d.ts +129 -0
  76. package/dist/knowledge/registry.d.ts.map +1 -0
  77. package/dist/knowledge/registry.js +361 -0
  78. package/dist/knowledge/registry.js.map +1 -0
  79. package/dist/knowledge/search.d.ts +114 -0
  80. package/dist/knowledge/search.d.ts.map +1 -0
  81. package/dist/knowledge/search.js +428 -0
  82. package/dist/knowledge/search.js.map +1 -0
  83. package/dist/knowledge/store.d.ts +76 -0
  84. package/dist/knowledge/store.d.ts.map +1 -0
  85. package/dist/knowledge/store.js +230 -0
  86. package/dist/knowledge/store.js.map +1 -0
  87. package/dist/learning/confidence.d.ts +30 -0
  88. package/dist/learning/confidence.d.ts.map +1 -0
  89. package/dist/learning/confidence.js +165 -0
  90. package/dist/learning/confidence.js.map +1 -0
  91. package/dist/learning/patterns.d.ts +52 -0
  92. package/dist/learning/patterns.d.ts.map +1 -0
  93. package/dist/learning/patterns.js +290 -0
  94. package/dist/learning/patterns.js.map +1 -0
  95. package/dist/learning/trajectory.d.ts +55 -0
  96. package/dist/learning/trajectory.d.ts.map +1 -0
  97. package/dist/learning/trajectory.js +200 -0
  98. package/dist/learning/trajectory.js.map +1 -0
  99. package/dist/memory/memory-compat.d.ts +100 -0
  100. package/dist/memory/memory-compat.d.ts.map +1 -0
  101. package/dist/memory/memory-compat.js +146 -0
  102. package/dist/memory/memory-compat.js.map +1 -0
  103. package/dist/memory/observation-store.d.ts +57 -0
  104. package/dist/memory/observation-store.d.ts.map +1 -0
  105. package/dist/memory/observation-store.js +154 -0
  106. package/dist/memory/observation-store.js.map +1 -0
  107. package/dist/memory/session-tracker.d.ts +81 -0
  108. package/dist/memory/session-tracker.d.ts.map +1 -0
  109. package/dist/memory/session-tracker.js +262 -0
  110. package/dist/memory/session-tracker.js.map +1 -0
  111. package/dist/pipeline/engine.d.ts +179 -0
  112. package/dist/pipeline/engine.d.ts.map +1 -0
  113. package/dist/pipeline/engine.js +691 -0
  114. package/dist/pipeline/engine.js.map +1 -0
  115. package/dist/pipeline/events.d.ts +54 -0
  116. package/dist/pipeline/events.d.ts.map +1 -0
  117. package/dist/pipeline/events.js +157 -0
  118. package/dist/pipeline/events.js.map +1 -0
  119. package/dist/pipeline/parallel.d.ts +83 -0
  120. package/dist/pipeline/parallel.d.ts.map +1 -0
  121. package/dist/pipeline/parallel.js +277 -0
  122. package/dist/pipeline/parallel.js.map +1 -0
  123. package/dist/pipeline/state-machine.d.ts +65 -0
  124. package/dist/pipeline/state-machine.d.ts.map +1 -0
  125. package/dist/pipeline/state-machine.js +176 -0
  126. package/dist/pipeline/state-machine.js.map +1 -0
  127. package/dist/query/graph-queries.d.ts +84 -0
  128. package/dist/query/graph-queries.d.ts.map +1 -0
  129. package/dist/query/graph-queries.js +216 -0
  130. package/dist/query/graph-queries.js.map +1 -0
  131. package/dist/query/hybrid-search.d.ts +34 -0
  132. package/dist/query/hybrid-search.d.ts.map +1 -0
  133. package/dist/query/hybrid-search.js +263 -0
  134. package/dist/query/hybrid-search.js.map +1 -0
  135. package/dist/query/intent-detector.d.ts +35 -0
  136. package/dist/query/intent-detector.d.ts.map +1 -0
  137. package/dist/query/intent-detector.js +115 -0
  138. package/dist/query/intent-detector.js.map +1 -0
  139. package/dist/query/ranking.d.ts +57 -0
  140. package/dist/query/ranking.d.ts.map +1 -0
  141. package/dist/query/ranking.js +109 -0
  142. package/dist/query/ranking.js.map +1 -0
  143. package/dist/server.d.ts +3 -0
  144. package/dist/server.d.ts.map +1 -0
  145. package/dist/server.js +291 -0
  146. package/dist/server.js.map +1 -0
  147. package/dist/storage/falkordb-store.d.ts +73 -0
  148. package/dist/storage/falkordb-store.d.ts.map +1 -0
  149. package/dist/storage/falkordb-store.js +346 -0
  150. package/dist/storage/falkordb-store.js.map +1 -0
  151. package/dist/storage/file-cache.d.ts +32 -0
  152. package/dist/storage/file-cache.d.ts.map +1 -0
  153. package/dist/storage/file-cache.js +115 -0
  154. package/dist/storage/file-cache.js.map +1 -0
  155. package/dist/storage/interfaces.d.ts +151 -0
  156. package/dist/storage/interfaces.d.ts.map +1 -0
  157. package/dist/storage/interfaces.js +7 -0
  158. package/dist/storage/interfaces.js.map +1 -0
  159. package/dist/storage/qdrant-store.d.ts +110 -0
  160. package/dist/storage/qdrant-store.d.ts.map +1 -0
  161. package/dist/storage/qdrant-store.js +467 -0
  162. package/dist/storage/qdrant-store.js.map +1 -0
  163. package/dist/storage/schema.d.ts +4 -0
  164. package/dist/storage/schema.d.ts.map +1 -0
  165. package/dist/storage/schema.js +136 -0
  166. package/dist/storage/schema.js.map +1 -0
  167. package/dist/storage/sqlite.d.ts +35 -0
  168. package/dist/storage/sqlite.d.ts.map +1 -0
  169. package/dist/storage/sqlite.js +132 -0
  170. package/dist/storage/sqlite.js.map +1 -0
  171. package/dist/tools/collaboration-tools.d.ts +111 -0
  172. package/dist/tools/collaboration-tools.d.ts.map +1 -0
  173. package/dist/tools/collaboration-tools.js +174 -0
  174. package/dist/tools/collaboration-tools.js.map +1 -0
  175. package/dist/tools/context-tools.d.ts +293 -0
  176. package/dist/tools/context-tools.d.ts.map +1 -0
  177. package/dist/tools/context-tools.js +437 -0
  178. package/dist/tools/context-tools.js.map +1 -0
  179. package/dist/tools/graph-tools.d.ts +129 -0
  180. package/dist/tools/graph-tools.d.ts.map +1 -0
  181. package/dist/tools/graph-tools.js +237 -0
  182. package/dist/tools/graph-tools.js.map +1 -0
  183. package/dist/tools/ingestion-tools.d.ts +96 -0
  184. package/dist/tools/ingestion-tools.d.ts.map +1 -0
  185. package/dist/tools/ingestion-tools.js +90 -0
  186. package/dist/tools/ingestion-tools.js.map +1 -0
  187. package/dist/tools/learning-tools.d.ts +168 -0
  188. package/dist/tools/learning-tools.d.ts.map +1 -0
  189. package/dist/tools/learning-tools.js +158 -0
  190. package/dist/tools/learning-tools.js.map +1 -0
  191. package/dist/tools/memory-tools.d.ts +183 -0
  192. package/dist/tools/memory-tools.d.ts.map +1 -0
  193. package/dist/tools/memory-tools.js +197 -0
  194. package/dist/tools/memory-tools.js.map +1 -0
  195. package/dist/tools/phase-tools.d.ts +954 -0
  196. package/dist/tools/phase-tools.d.ts.map +1 -0
  197. package/dist/tools/phase-tools.js +1215 -0
  198. package/dist/tools/phase-tools.js.map +1 -0
  199. package/dist/tools/pipeline-tools.d.ts +140 -0
  200. package/dist/tools/pipeline-tools.d.ts.map +1 -0
  201. package/dist/tools/pipeline-tools.js +162 -0
  202. package/dist/tools/pipeline-tools.js.map +1 -0
  203. package/dist/tools/registration-tools.d.ts +220 -0
  204. package/dist/tools/registration-tools.d.ts.map +1 -0
  205. package/dist/tools/registration-tools.js +391 -0
  206. package/dist/tools/registration-tools.js.map +1 -0
  207. package/dist/util/circuit-breaker.d.ts +75 -0
  208. package/dist/util/circuit-breaker.d.ts.map +1 -0
  209. package/dist/util/circuit-breaker.js +159 -0
  210. package/dist/util/circuit-breaker.js.map +1 -0
  211. package/dist/util/config.d.ts +23 -0
  212. package/dist/util/config.d.ts.map +1 -0
  213. package/dist/util/config.js +164 -0
  214. package/dist/util/config.js.map +1 -0
  215. package/dist/util/logger.d.ts +13 -0
  216. package/dist/util/logger.d.ts.map +1 -0
  217. package/dist/util/logger.js +45 -0
  218. package/dist/util/logger.js.map +1 -0
  219. package/dist/util/token-counter.d.ts +24 -0
  220. package/dist/util/token-counter.d.ts.map +1 -0
  221. package/dist/util/token-counter.js +48 -0
  222. package/dist/util/token-counter.js.map +1 -0
  223. package/dist/util/types.d.ts +525 -0
  224. package/dist/util/types.d.ts.map +1 -0
  225. package/dist/util/types.js +5 -0
  226. package/dist/util/types.js.map +1 -0
  227. package/docker-compose.yml +20 -0
  228. package/docs/plans/2026-02-27-swarm-coordination/architecture.md +203 -0
  229. package/docs/plans/2026-02-27-swarm-coordination/vision.md +57 -0
  230. package/docs/plans/completed/2026-02-26-forge-plugin-bundling/architecture.md +1 -0
  231. package/docs/plans/completed/2026-02-26-forge-plugin-bundling/vision.md +300 -0
  232. package/docs/plans/completed/2026-02-27-forge-swarm-learning/architecture.md +480 -0
  233. package/docs/plans/completed/2026-02-27-forge-swarm-learning/verification-checklist.md +462 -0
  234. package/docs/plans/completed/2026-02-27-git-history-atlassian/git-jira-plan.md +181 -0
  235. package/package.json +39 -0
  236. package/plugin/.claude-plugin/plugin.json +8 -0
  237. package/plugin/.mcp.json +15 -0
  238. package/plugin/README.md +134 -0
  239. package/plugin/agents/architect.md +367 -0
  240. package/plugin/agents/backend-specialist.md +263 -0
  241. package/plugin/agents/brainstormer.md +122 -0
  242. package/plugin/agents/data-specialist.md +266 -0
  243. package/plugin/agents/designer.md +408 -0
  244. package/plugin/agents/frontend-specialist.md +241 -0
  245. package/plugin/agents/inspector.md +406 -0
  246. package/plugin/agents/knowledge-keeper.md +443 -0
  247. package/plugin/agents/platform-engineer.md +326 -0
  248. package/plugin/agents/product-manager.md +268 -0
  249. package/plugin/agents/product-owner.md +438 -0
  250. package/plugin/agents/pulse-checker.md +73 -0
  251. package/plugin/agents/qa-strategist.md +500 -0
  252. package/plugin/agents/self-improver.md +310 -0
  253. package/plugin/agents/strategist.md +360 -0
  254. package/plugin/agents/supervisor.md +380 -0
  255. package/plugin/commands/brainstorm.md +25 -0
  256. package/plugin/commands/forge.md +88 -0
  257. package/plugin/docs/atlassian-integration.md +110 -0
  258. package/plugin/docs/workflow.md +126 -0
  259. package/plugin/skills/agent-development/.skillfish.json +10 -0
  260. package/plugin/skills/agent-development/SKILL.md +415 -0
  261. package/plugin/skills/agent-development/examples/agent-creation-prompt.md +238 -0
  262. package/plugin/skills/agent-development/examples/complete-agent-examples.md +427 -0
  263. package/plugin/skills/agent-development/references/agent-creation-system-prompt.md +207 -0
  264. package/plugin/skills/agent-development/references/system-prompt-design.md +411 -0
  265. package/plugin/skills/agent-development/references/triggering-examples.md +491 -0
  266. package/plugin/skills/agent-development/scripts/validate-agent.sh +217 -0
  267. package/plugin/skills/agent-handoff/SKILL.md +335 -0
  268. package/plugin/skills/anti-stub/SKILL.md +317 -0
  269. package/plugin/skills/brainstorm/SKILL.md +31 -0
  270. package/plugin/skills/debugging/SKILL.md +276 -0
  271. package/plugin/skills/fix/SKILL.md +62 -0
  272. package/plugin/skills/frontend-design/.skillfish.json +10 -0
  273. package/plugin/skills/frontend-design/SKILL.md +42 -0
  274. package/plugin/skills/gotchas/SKILL.md +61 -0
  275. package/plugin/skills/graph-orchestrator/SKILL.md +38 -0
  276. package/plugin/skills/history/SKILL.md +58 -0
  277. package/plugin/skills/impact/SKILL.md +59 -0
  278. package/plugin/skills/implementation-execution/SKILL.md +291 -0
  279. package/plugin/skills/index-repo/SKILL.md +55 -0
  280. package/plugin/skills/interviewing/SKILL.md +225 -0
  281. package/plugin/skills/knowledge-curation/SKILL.md +393 -0
  282. package/plugin/skills/learn/SKILL.md +69 -0
  283. package/plugin/skills/mcp-integration/.skillfish.json +10 -0
  284. package/plugin/skills/mcp-integration/SKILL.md +554 -0
  285. package/plugin/skills/mcp-integration/examples/http-server.json +20 -0
  286. package/plugin/skills/mcp-integration/examples/sse-server.json +19 -0
  287. package/plugin/skills/mcp-integration/examples/stdio-server.json +26 -0
  288. package/plugin/skills/mcp-integration/references/authentication.md +549 -0
  289. package/plugin/skills/mcp-integration/references/server-types.md +536 -0
  290. package/plugin/skills/mcp-integration/references/tool-usage.md +538 -0
  291. package/plugin/skills/nestjs/.skillfish.json +10 -0
  292. package/plugin/skills/nestjs/SKILL.md +669 -0
  293. package/plugin/skills/nestjs/drizzle-reference.md +1894 -0
  294. package/plugin/skills/nestjs/reference.md +1447 -0
  295. package/plugin/skills/nestjs/workflow-optimization.md +229 -0
  296. package/plugin/skills/parallel-dispatch/SKILL.md +308 -0
  297. package/plugin/skills/project-discovery/SKILL.md +304 -0
  298. package/plugin/skills/search/SKILL.md +56 -0
  299. package/plugin/skills/security-audit/SKILL.md +362 -0
  300. package/plugin/skills/skill-development/.skillfish.json +10 -0
  301. package/plugin/skills/skill-development/SKILL.md +637 -0
  302. package/plugin/skills/skill-development/references/skill-creator-original.md +209 -0
  303. package/plugin/skills/tdd/SKILL.md +273 -0
  304. package/plugin/skills/terminal-presentation/SKILL.md +395 -0
  305. package/plugin/skills/test-strategy/SKILL.md +365 -0
  306. package/plugin/skills/verification-protocol/SKILL.md +256 -0
  307. package/plugin/skills/visual-explainer/CHANGELOG.md +97 -0
  308. package/plugin/skills/visual-explainer/LICENSE +21 -0
  309. package/plugin/skills/visual-explainer/README.md +137 -0
  310. package/plugin/skills/visual-explainer/SKILL.md +352 -0
  311. package/plugin/skills/visual-explainer/banner.png +0 -0
  312. package/plugin/skills/visual-explainer/package.json +11 -0
  313. package/plugin/skills/visual-explainer/prompts/diff-review.md +68 -0
  314. package/plugin/skills/visual-explainer/prompts/fact-check.md +63 -0
  315. package/plugin/skills/visual-explainer/prompts/generate-slides.md +18 -0
  316. package/plugin/skills/visual-explainer/prompts/generate-web-diagram.md +10 -0
  317. package/plugin/skills/visual-explainer/prompts/plan-review.md +86 -0
  318. package/plugin/skills/visual-explainer/prompts/project-recap.md +61 -0
  319. package/plugin/skills/visual-explainer/references/css-patterns.md +1188 -0
  320. package/plugin/skills/visual-explainer/references/libraries.md +470 -0
  321. package/plugin/skills/visual-explainer/references/responsive-nav.md +212 -0
  322. package/plugin/skills/visual-explainer/references/slide-patterns.md +1403 -0
  323. package/plugin/skills/visual-explainer/templates/architecture.html +596 -0
  324. package/plugin/skills/visual-explainer/templates/data-table.html +540 -0
  325. package/plugin/skills/visual-explainer/templates/mermaid-flowchart.html +435 -0
  326. package/plugin/skills/visual-explainer/templates/slide-deck.html +913 -0
  327. package/src/cli.ts +655 -0
  328. package/src/context/.gitkeep +0 -0
  329. package/src/context/codebase.ts +393 -0
  330. package/src/context/injector.ts +797 -0
  331. package/src/context/memory.ts +187 -0
  332. package/src/context/session-index.ts +327 -0
  333. package/src/context/session.ts +152 -0
  334. package/src/index.ts +47 -0
  335. package/src/ingestion/.gitkeep +0 -0
  336. package/src/ingestion/chunker.ts +277 -0
  337. package/src/ingestion/embedder.ts +167 -0
  338. package/src/ingestion/git-analyzer.ts +545 -0
  339. package/src/ingestion/indexer.ts +984 -0
  340. package/src/ingestion/markdown-chunker.ts +337 -0
  341. package/src/ingestion/markdown-knowledge.ts +175 -0
  342. package/src/ingestion/parser.ts +475 -0
  343. package/src/ingestion/watcher.ts +182 -0
  344. package/src/knowledge/.gitkeep +0 -0
  345. package/src/knowledge/hydrator.ts +246 -0
  346. package/src/knowledge/registry.ts +463 -0
  347. package/src/knowledge/search.ts +565 -0
  348. package/src/knowledge/store.ts +262 -0
  349. package/src/learning/.gitkeep +0 -0
  350. package/src/learning/confidence.ts +193 -0
  351. package/src/learning/patterns.ts +360 -0
  352. package/src/learning/trajectory.ts +268 -0
  353. package/src/memory/.gitkeep +0 -0
  354. package/src/memory/memory-compat.ts +233 -0
  355. package/src/memory/observation-store.ts +224 -0
  356. package/src/memory/session-tracker.ts +332 -0
  357. package/src/pipeline/.gitkeep +0 -0
  358. package/src/pipeline/engine.ts +1139 -0
  359. package/src/pipeline/events.ts +253 -0
  360. package/src/pipeline/parallel.ts +394 -0
  361. package/src/pipeline/state-machine.ts +199 -0
  362. package/src/query/.gitkeep +0 -0
  363. package/src/query/graph-queries.ts +262 -0
  364. package/src/query/hybrid-search.ts +337 -0
  365. package/src/query/intent-detector.ts +131 -0
  366. package/src/query/ranking.ts +161 -0
  367. package/src/server.ts +352 -0
  368. package/src/storage/.gitkeep +0 -0
  369. package/src/storage/falkordb-store.ts +388 -0
  370. package/src/storage/file-cache.ts +141 -0
  371. package/src/storage/interfaces.ts +201 -0
  372. package/src/storage/qdrant-store.ts +557 -0
  373. package/src/storage/schema.ts +139 -0
  374. package/src/storage/sqlite.ts +168 -0
  375. package/src/tools/.gitkeep +0 -0
  376. package/src/tools/collaboration-tools.ts +208 -0
  377. package/src/tools/context-tools.ts +493 -0
  378. package/src/tools/graph-tools.ts +295 -0
  379. package/src/tools/ingestion-tools.ts +122 -0
  380. package/src/tools/learning-tools.ts +181 -0
  381. package/src/tools/memory-tools.ts +234 -0
  382. package/src/tools/phase-tools.ts +1452 -0
  383. package/src/tools/pipeline-tools.ts +188 -0
  384. package/src/tools/registration-tools.ts +450 -0
  385. package/src/util/.gitkeep +0 -0
  386. package/src/util/circuit-breaker.ts +193 -0
  387. package/src/util/config.ts +177 -0
  388. package/src/util/logger.ts +53 -0
  389. package/src/util/token-counter.ts +52 -0
  390. package/src/util/types.ts +710 -0
  391. package/tests/context/.gitkeep +0 -0
  392. package/tests/integration/.gitkeep +0 -0
  393. package/tests/knowledge/.gitkeep +0 -0
  394. package/tests/learning/.gitkeep +0 -0
  395. package/tests/pipeline/.gitkeep +0 -0
  396. package/tests/tools/.gitkeep +0 -0
  397. package/tsconfig.json +21 -0
  398. package/vitest.config.ts +10 -0
  399. package/vscode-extension/.vscodeignore +7 -0
  400. package/vscode-extension/README.md +43 -0
  401. package/vscode-extension/out/edge-collector.js +274 -0
  402. package/vscode-extension/out/edge-collector.js.map +1 -0
  403. package/vscode-extension/out/extension.js +264 -0
  404. package/vscode-extension/out/extension.js.map +1 -0
  405. package/vscode-extension/out/forge-client.js +318 -0
  406. package/vscode-extension/out/forge-client.js.map +1 -0
  407. package/vscode-extension/package-lock.json +59 -0
  408. package/vscode-extension/package.json +71 -0
  409. package/vscode-extension/src/edge-collector.ts +320 -0
  410. package/vscode-extension/src/extension.ts +269 -0
  411. package/vscode-extension/src/forge-client.ts +364 -0
  412. package/vscode-extension/tsconfig.json +19 -0
package/tsconfig.json ADDED
@@ -0,0 +1,21 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "ESNext",
5
+ "moduleResolution": "bundler",
6
+ "lib": ["ES2022"],
7
+ "outDir": "dist",
8
+ "rootDir": "src",
9
+ "strict": true,
10
+ "esModuleInterop": true,
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true,
13
+ "resolveJsonModule": true,
14
+ "declaration": true,
15
+ "declarationMap": true,
16
+ "sourceMap": true,
17
+ "noUncheckedIndexedAccess": true
18
+ },
19
+ "include": ["src"],
20
+ "exclude": ["node_modules", "dist", "tests"]
21
+ }
@@ -0,0 +1,10 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ globals: true,
6
+ environment: 'node',
7
+ include: ['tests/**/*.test.ts'],
8
+ testTimeout: 10000,
9
+ },
10
+ });
@@ -0,0 +1,7 @@
1
+ src/**
2
+ tsconfig.json
3
+ **/*.map
4
+ **/*.ts
5
+ !out/**/*.js
6
+ node_modules/**
7
+ .gitignore
@@ -0,0 +1,43 @@
1
+ # Forge LSP Bridge — VS Code Extension
2
+
3
+ Feeds TypeScript Language Server call/reference edges into the **dominKnow | Forge** code graph.
4
+
5
+ ## What it does
6
+
7
+ When you save a TypeScript or JavaScript file, this extension:
8
+
9
+ 1. Queries the TypeScript Language Server for all callable symbols (functions, methods, constructors) in the saved file.
10
+ 2. For each symbol, collects outgoing call hierarchy edges via `vscode.prepareCallHierarchy` / `vscode.provideOutgoingCalls`.
11
+ 3. Batches the edges and flushes them to the dk-forge MCP server's `submit_lsp_edges` tool after a debounce period (default: 5 seconds).
12
+
13
+ These type-resolved edges supplement the static AST parsing that forge performs during indexing. The TS Language Server resolves indirect calls, generics, overloaded methods, and other patterns that tree-sitter misses.
14
+
15
+ ## Configuration
16
+
17
+ | Setting | Default | Description |
18
+ |---------|---------|-------------|
19
+ | `forge.lspBridge.enabled` | `true` | Enable/disable edge collection on save |
20
+ | `forge.lspBridge.repoId` | `""` | Repository ID. Auto-detected from `.forge/manifest.yaml` if empty |
21
+ | `forge.lspBridge.debounceMs` | `5000` | Debounce interval before flushing edges |
22
+ | `forge.lspBridge.mcpServerPath` | `""` | Path to dk-forge-server `dist/index.js`. Auto-resolved if empty |
23
+
24
+ ## Commands
25
+
26
+ - **Forge LSP Bridge: Toggle On/Off** — Enable or disable edge collection
27
+ - **Forge LSP Bridge: Flush Edges Now** — Immediately flush all pending edges
28
+
29
+ ## Requirements
30
+
31
+ - The dk-forge-server must be built (`npm run build` in the parent directory)
32
+ - A `.forge/manifest.yaml` in the workspace root for auto repo ID detection
33
+ - TypeScript/JavaScript files must be open for the TS Language Server to be active
34
+
35
+ ## Development
36
+
37
+ ```bash
38
+ cd vscode-extension
39
+ npm install
40
+ npm run compile
41
+ ```
42
+
43
+ Press F5 in VS Code to launch the Extension Development Host for testing.
@@ -0,0 +1,274 @@
1
+ "use strict";
2
+ // edge-collector.ts — Forge LSP Bridge
3
+ // On file save, uses VS Code's built-in call hierarchy API to collect
4
+ // type-resolved CALLS edges from the TypeScript Language Server.
5
+ // Edges are batched and flushed to the forge server after a debounce period.
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.EdgeCollector = void 0;
41
+ const vscode = __importStar(require("vscode"));
42
+ // ---------------------------------------------------------------------------
43
+ // EdgeCollector
44
+ // ---------------------------------------------------------------------------
45
+ class EdgeCollector {
46
+ pendingEdges = [];
47
+ debounceTimer;
48
+ debounceMs;
49
+ flushCallback;
50
+ flushing = false;
51
+ constructor(debounceMs, flushCallback) {
52
+ this.debounceMs = debounceMs;
53
+ this.flushCallback = flushCallback;
54
+ }
55
+ /**
56
+ * Update the debounce interval (e.g. when the user changes settings).
57
+ */
58
+ setDebounceMs(ms) {
59
+ this.debounceMs = ms;
60
+ }
61
+ /**
62
+ * Collect call-hierarchy edges for all functions/methods in a saved document.
63
+ */
64
+ async collectFromDocument(document) {
65
+ const uri = document.uri;
66
+ // Get all document symbols to find functions, methods, constructors
67
+ const symbols = await this.getCallableSymbols(uri);
68
+ if (symbols.length === 0) {
69
+ return;
70
+ }
71
+ // For each callable symbol, prepare a call hierarchy and collect outgoing calls
72
+ for (const sym of symbols) {
73
+ try {
74
+ const edges = await this.collectOutgoingCalls(uri, sym);
75
+ if (edges.length > 0) {
76
+ this.pendingEdges.push(...edges);
77
+ }
78
+ }
79
+ catch {
80
+ // Individual symbol failures are non-fatal — skip and continue.
81
+ // This can happen if the TS language server hasn't finished loading
82
+ // or if the symbol is in an unsupported position.
83
+ }
84
+ }
85
+ // Reset the debounce timer
86
+ this.scheduleFlush();
87
+ }
88
+ /**
89
+ * Force an immediate flush of all pending edges, regardless of debounce.
90
+ */
91
+ async flushNow() {
92
+ this.cancelDebounce();
93
+ await this.doFlush();
94
+ }
95
+ // -------------------------------------------------------------------------
96
+ // Symbol discovery
97
+ // -------------------------------------------------------------------------
98
+ /**
99
+ * Flatten the document symbol tree and return only callable symbols
100
+ * (functions, methods, constructors).
101
+ */
102
+ async getCallableSymbols(uri) {
103
+ let rawSymbols;
104
+ try {
105
+ rawSymbols = await vscode.commands.executeCommand('vscode.executeDocumentSymbolProvider', uri);
106
+ }
107
+ catch {
108
+ return [];
109
+ }
110
+ if (!rawSymbols || rawSymbols.length === 0) {
111
+ return [];
112
+ }
113
+ const result = [];
114
+ this.flattenSymbols(rawSymbols, uri, result, undefined);
115
+ return result;
116
+ }
117
+ /**
118
+ * Recursively flatten nested DocumentSymbols into a flat list of callable
119
+ * symbols. Tracks parent name to build qualified symbol names like
120
+ * "ClassName.methodName".
121
+ */
122
+ flattenSymbols(symbols, uri, out, parentName) {
123
+ for (const sym of symbols) {
124
+ const qualifiedName = parentName
125
+ ? `${parentName}.${sym.name}`
126
+ : sym.name;
127
+ if (isCallable(sym.kind)) {
128
+ out.push({
129
+ name: qualifiedName,
130
+ kind: sym.kind,
131
+ range: sym.selectionRange,
132
+ uri,
133
+ });
134
+ }
135
+ // Recurse into children (e.g. methods inside a class)
136
+ if (sym.children && sym.children.length > 0) {
137
+ const nextParent = sym.kind === vscode.SymbolKind.Class ||
138
+ sym.kind === vscode.SymbolKind.Interface ||
139
+ sym.kind === vscode.SymbolKind.Namespace ||
140
+ sym.kind === vscode.SymbolKind.Module
141
+ ? qualifiedName
142
+ : parentName;
143
+ this.flattenSymbols(sym.children, uri, out, nextParent);
144
+ }
145
+ }
146
+ }
147
+ // -------------------------------------------------------------------------
148
+ // Call hierarchy collection
149
+ // -------------------------------------------------------------------------
150
+ /**
151
+ * For a single callable symbol, prepare a call hierarchy item and collect
152
+ * its outgoing calls. Returns LspEdge[] for "CALLS" relationships.
153
+ */
154
+ async collectOutgoingCalls(uri, sym) {
155
+ // Prepare call hierarchy at the symbol's selection position
156
+ const position = sym.range.start;
157
+ let callItems;
158
+ try {
159
+ callItems = await vscode.commands.executeCommand('vscode.prepareCallHierarchy', uri, position);
160
+ }
161
+ catch {
162
+ return [];
163
+ }
164
+ if (!callItems || callItems.length === 0) {
165
+ return [];
166
+ }
167
+ const edges = [];
168
+ for (const item of callItems) {
169
+ let outgoingCalls;
170
+ try {
171
+ outgoingCalls = await vscode.commands.executeCommand('vscode.provideOutgoingCalls', item);
172
+ }
173
+ catch {
174
+ continue;
175
+ }
176
+ if (!outgoingCalls || outgoingCalls.length === 0) {
177
+ continue;
178
+ }
179
+ const fromFile = normalizeFilePath(item.uri.fsPath);
180
+ const fromSymbol = item.name;
181
+ for (const call of outgoingCalls) {
182
+ const toFile = normalizeFilePath(call.to.uri.fsPath);
183
+ const toSymbol = call.to.name;
184
+ // Skip self-references and node_modules
185
+ if (fromSymbol === toSymbol && fromFile === toFile) {
186
+ continue;
187
+ }
188
+ if (toFile.includes('node_modules')) {
189
+ continue;
190
+ }
191
+ edges.push({
192
+ from_file: fromFile,
193
+ from_symbol: fromSymbol,
194
+ to_file: toFile,
195
+ to_symbol: toSymbol,
196
+ edge_type: 'CALLS',
197
+ });
198
+ }
199
+ }
200
+ return edges;
201
+ }
202
+ // -------------------------------------------------------------------------
203
+ // Debounced flush
204
+ // -------------------------------------------------------------------------
205
+ scheduleFlush() {
206
+ this.cancelDebounce();
207
+ this.debounceTimer = setTimeout(() => {
208
+ void this.doFlush();
209
+ }, this.debounceMs);
210
+ }
211
+ cancelDebounce() {
212
+ if (this.debounceTimer !== undefined) {
213
+ clearTimeout(this.debounceTimer);
214
+ this.debounceTimer = undefined;
215
+ }
216
+ }
217
+ async doFlush() {
218
+ if (this.flushing) {
219
+ // Re-schedule if a flush is already in progress
220
+ this.scheduleFlush();
221
+ return;
222
+ }
223
+ if (this.pendingEdges.length === 0) {
224
+ return;
225
+ }
226
+ // Take ownership of the pending edges
227
+ const batch = this.pendingEdges;
228
+ this.pendingEdges = [];
229
+ this.flushing = true;
230
+ try {
231
+ // Deduplicate edges within the batch
232
+ const deduplicated = deduplicateEdges(batch);
233
+ await this.flushCallback(deduplicated);
234
+ }
235
+ catch {
236
+ // If flush fails, re-queue the edges for the next attempt
237
+ this.pendingEdges.unshift(...batch);
238
+ }
239
+ finally {
240
+ this.flushing = false;
241
+ }
242
+ }
243
+ }
244
+ exports.EdgeCollector = EdgeCollector;
245
+ /**
246
+ * Returns true if the symbol kind represents something that can make calls.
247
+ */
248
+ function isCallable(kind) {
249
+ return (kind === vscode.SymbolKind.Function ||
250
+ kind === vscode.SymbolKind.Method ||
251
+ kind === vscode.SymbolKind.Constructor);
252
+ }
253
+ /**
254
+ * Normalize file paths to use forward slashes for consistency.
255
+ */
256
+ function normalizeFilePath(filePath) {
257
+ return filePath.replace(/\\/g, '/');
258
+ }
259
+ /**
260
+ * Remove duplicate edges within a batch (same from/to file+symbol+type).
261
+ */
262
+ function deduplicateEdges(edges) {
263
+ const seen = new Set();
264
+ const result = [];
265
+ for (const edge of edges) {
266
+ const key = `${edge.from_file}:${edge.from_symbol}->${edge.to_file}:${edge.to_symbol}:${edge.edge_type}`;
267
+ if (!seen.has(key)) {
268
+ seen.add(key);
269
+ result.push(edge);
270
+ }
271
+ }
272
+ return result;
273
+ }
274
+ //# sourceMappingURL=edge-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-collector.js","sourceRoot":"","sources":["../src/edge-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ // extension.ts — Forge LSP Bridge
3
+ // VS Code extension entry point. Hooks into file-save events for TS/JS files,
4
+ // collects LSP-resolved call edges via the edge collector, and flushes them
5
+ // to the dk-forge MCP server via the forge client.
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.activate = activate;
41
+ exports.deactivate = deactivate;
42
+ const vscode = __importStar(require("vscode"));
43
+ const path = __importStar(require("path"));
44
+ const fs = __importStar(require("fs"));
45
+ const edge_collector_1 = require("./edge-collector");
46
+ const forge_client_1 = require("./forge-client");
47
+ // ---------------------------------------------------------------------------
48
+ // State
49
+ // ---------------------------------------------------------------------------
50
+ let edgeCollector;
51
+ let forgeClient;
52
+ let statusBarItem;
53
+ let saveListener;
54
+ let enabled = true;
55
+ let repoId = '';
56
+ // ---------------------------------------------------------------------------
57
+ // Activation
58
+ // ---------------------------------------------------------------------------
59
+ async function activate(context) {
60
+ const config = vscode.workspace.getConfiguration('forge.lspBridge');
61
+ enabled = config.get('enabled', true);
62
+ // Auto-detect repo ID from .forge/manifest.yaml if not configured
63
+ repoId = config.get('repoId', '') || '';
64
+ if (!repoId) {
65
+ repoId = await detectRepoId();
66
+ }
67
+ const debounceMs = config.get('debounceMs', 5000);
68
+ const mcpServerPath = config.get('mcpServerPath', '') || '';
69
+ // Initialize forge MCP client
70
+ forgeClient = new forge_client_1.ForgeClient(mcpServerPath);
71
+ // Initialize edge collector with flush callback
72
+ edgeCollector = new edge_collector_1.EdgeCollector(debounceMs, async (edges) => {
73
+ if (!forgeClient || !repoId) {
74
+ return;
75
+ }
76
+ try {
77
+ const result = await forgeClient.submitLspEdges(repoId, edges);
78
+ if (result && typeof result.accepted === 'number') {
79
+ log(`Flushed ${result.accepted} edges (${result.failed ?? 0} failed)`);
80
+ }
81
+ }
82
+ catch (err) {
83
+ log(`Flush failed: ${String(err)}`);
84
+ }
85
+ });
86
+ // Status bar item
87
+ statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Right, 50);
88
+ statusBarItem.command = 'forge.lspBridge.toggle';
89
+ updateStatusBar();
90
+ statusBarItem.show();
91
+ context.subscriptions.push(statusBarItem);
92
+ // Register the save listener
93
+ if (enabled) {
94
+ registerSaveListener(context);
95
+ }
96
+ // Register commands
97
+ context.subscriptions.push(vscode.commands.registerCommand('forge.lspBridge.toggle', () => {
98
+ enabled = !enabled;
99
+ if (enabled) {
100
+ registerSaveListener(context);
101
+ log('Enabled');
102
+ }
103
+ else {
104
+ disposeSaveListener();
105
+ log('Disabled');
106
+ }
107
+ updateStatusBar();
108
+ }));
109
+ context.subscriptions.push(vscode.commands.registerCommand('forge.lspBridge.flush', async () => {
110
+ if (!edgeCollector) {
111
+ return;
112
+ }
113
+ await edgeCollector.flushNow();
114
+ log('Manual flush complete');
115
+ }));
116
+ // Watch for configuration changes
117
+ context.subscriptions.push(vscode.workspace.onDidChangeConfiguration((e) => {
118
+ if (e.affectsConfiguration('forge.lspBridge')) {
119
+ const newConfig = vscode.workspace.getConfiguration('forge.lspBridge');
120
+ const newEnabled = newConfig.get('enabled', true);
121
+ const newRepoId = newConfig.get('repoId', '') || '';
122
+ const newDebounce = newConfig.get('debounceMs', 5000);
123
+ if (newRepoId) {
124
+ repoId = newRepoId;
125
+ }
126
+ if (edgeCollector) {
127
+ edgeCollector.setDebounceMs(newDebounce);
128
+ }
129
+ if (newEnabled !== enabled) {
130
+ enabled = newEnabled;
131
+ if (enabled) {
132
+ registerSaveListener(context);
133
+ }
134
+ else {
135
+ disposeSaveListener();
136
+ }
137
+ updateStatusBar();
138
+ }
139
+ }
140
+ }));
141
+ log(`Activated (repoId: ${repoId || '<none>'}, debounce: ${debounceMs}ms)`);
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // Deactivation
145
+ // ---------------------------------------------------------------------------
146
+ async function deactivate() {
147
+ disposeSaveListener();
148
+ // Flush any remaining edges
149
+ if (edgeCollector) {
150
+ try {
151
+ await edgeCollector.flushNow();
152
+ }
153
+ catch {
154
+ // Ignore errors during deactivation
155
+ }
156
+ }
157
+ // Dispose the forge client (kills the child process)
158
+ if (forgeClient) {
159
+ forgeClient.dispose();
160
+ forgeClient = undefined;
161
+ }
162
+ if (statusBarItem) {
163
+ statusBarItem.dispose();
164
+ statusBarItem = undefined;
165
+ }
166
+ edgeCollector = undefined;
167
+ }
168
+ // ---------------------------------------------------------------------------
169
+ // Internal helpers
170
+ // ---------------------------------------------------------------------------
171
+ const SUPPORTED_LANGUAGES = new Set([
172
+ 'typescript',
173
+ 'javascript',
174
+ 'typescriptreact',
175
+ 'javascriptreact',
176
+ ]);
177
+ function registerSaveListener(context) {
178
+ disposeSaveListener();
179
+ saveListener = vscode.workspace.onDidSaveTextDocument(async (document) => {
180
+ if (!enabled || !edgeCollector) {
181
+ return;
182
+ }
183
+ if (!SUPPORTED_LANGUAGES.has(document.languageId)) {
184
+ return;
185
+ }
186
+ try {
187
+ await edgeCollector.collectFromDocument(document);
188
+ }
189
+ catch (err) {
190
+ // Never let a collection error propagate to the save flow
191
+ log(`Collection error for ${document.fileName}: ${String(err)}`);
192
+ }
193
+ });
194
+ context.subscriptions.push(saveListener);
195
+ }
196
+ function disposeSaveListener() {
197
+ if (saveListener) {
198
+ saveListener.dispose();
199
+ saveListener = undefined;
200
+ }
201
+ }
202
+ function updateStatusBar() {
203
+ if (!statusBarItem) {
204
+ return;
205
+ }
206
+ if (enabled) {
207
+ statusBarItem.text = '$(symbol-method) Forge LSP';
208
+ statusBarItem.tooltip = 'Forge LSP Bridge: Active — click to toggle';
209
+ statusBarItem.backgroundColor = undefined;
210
+ }
211
+ else {
212
+ statusBarItem.text = '$(circle-slash) Forge LSP';
213
+ statusBarItem.tooltip = 'Forge LSP Bridge: Disabled — click to toggle';
214
+ statusBarItem.backgroundColor = new vscode.ThemeColor('statusBarItem.warningBackground');
215
+ }
216
+ }
217
+ /**
218
+ * Detect the repo ID from .forge/manifest.yaml in the workspace root.
219
+ * Falls back to the workspace folder name, or empty string.
220
+ */
221
+ async function detectRepoId() {
222
+ const folders = vscode.workspace.workspaceFolders;
223
+ if (!folders || folders.length === 0) {
224
+ return '';
225
+ }
226
+ for (const folder of folders) {
227
+ const manifestPath = path.join(folder.uri.fsPath, '.forge', 'manifest.yaml');
228
+ try {
229
+ if (fs.existsSync(manifestPath)) {
230
+ const content = fs.readFileSync(manifestPath, 'utf8');
231
+ // Simple YAML parsing — look for "name: <value>" line
232
+ const nameMatch = content.match(/^name:\s*(.+)$/m);
233
+ if (nameMatch && nameMatch[1]) {
234
+ const name = nameMatch[1].trim();
235
+ if (name) {
236
+ return name;
237
+ }
238
+ }
239
+ // Check for repo_id_override
240
+ const overrideMatch = content.match(/^repo_id_override:\s*(.+)$/m);
241
+ if (overrideMatch && overrideMatch[1]) {
242
+ const override = overrideMatch[1].trim();
243
+ if (override && override !== 'null') {
244
+ return override;
245
+ }
246
+ }
247
+ }
248
+ }
249
+ catch {
250
+ // Silently continue if the manifest can't be read
251
+ }
252
+ }
253
+ // Fallback: use the first workspace folder name
254
+ return folders[0]?.name ?? '';
255
+ }
256
+ // ---------------------------------------------------------------------------
257
+ // Logging
258
+ // ---------------------------------------------------------------------------
259
+ const outputChannel = vscode.window.createOutputChannel('Forge LSP Bridge');
260
+ function log(message) {
261
+ const timestamp = new Date().toISOString();
262
+ outputChannel.appendLine(`[${timestamp}] ${message}`);
263
+ }
264
+ //# sourceMappingURL=extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extension.js","sourceRoot":"","sources":["../src/extension.ts"],"names":[],"mappings":";AAAA,kCAAkC;AAClC,8EAA8E;AAC9E,4EAA4E;AAC5E,mDAAmD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBnD,4BAsGC;AAMD,gCAwBC;AAzJD,+CAAiC;AACjC,2CAA6B;AAC7B,uCAAyB;AACzB,qDAAiD;AACjD,iDAA6C;AAE7C,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,IAAI,aAAwC,CAAC;AAC7C,IAAI,WAAoC,CAAC;AACzC,IAAI,aAA+C,CAAC;AACpD,IAAI,YAA2C,CAAC;AAChD,IAAI,OAAO,GAAG,IAAI,CAAC;AACnB,IAAI,MAAM,GAAG,EAAE,CAAC;AAEhB,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAEvE,KAAK,UAAU,QAAQ,CAAC,OAAgC;IAC7D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IACpE,OAAO,GAAG,MAAM,CAAC,GAAG,CAAU,SAAS,EAAE,IAAI,CAAC,CAAC;IAE/C,kEAAkE;IAClE,MAAM,GAAG,MAAM,CAAC,GAAG,CAAS,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,MAAM,YAAY,EAAE,CAAC;IAChC,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAS,YAAY,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAS,eAAe,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;IAEpE,8BAA8B;IAC9B,WAAW,GAAG,IAAI,0BAAW,CAAC,aAAa,CAAC,CAAC;IAE7C,gDAAgD;IAChD,aAAa,GAAG,IAAI,8BAAa,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QAC5D,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC/D,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAClD,GAAG,CAAC,WAAW,MAAM,CAAC,QAAQ,WAAW,MAAM,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC;YACzE,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,iBAAiB,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,kBAAkB;IAClB,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAC/C,MAAM,CAAC,kBAAkB,CAAC,KAAK,EAC/B,EAAE,CACH,CAAC;IACF,aAAa,CAAC,OAAO,GAAG,wBAAwB,CAAC;IACjD,eAAe,EAAE,CAAC;IAClB,aAAa,CAAC,IAAI,EAAE,CAAC;IACrB,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAE1C,6BAA6B;IAC7B,IAAI,OAAO,EAAE,CAAC;QACZ,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,oBAAoB;IACpB,OAAO,CAAC,aAAa,CAAC,IAAI,CACxB,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAC7D,OAAO,GAAG,CAAC,OAAO,CAAC;QACnB,IAAI,OAAO,EAAE,CAAC;YACZ,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC9B,GAAG,CAAC,SAAS,CAAC,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,mBAAmB,EAAE,CAAC;YACtB,GAAG,CAAC,UAAU,CAAC,CAAC;QAClB,CAAC;QACD,eAAe,EAAE,CAAC;IACpB,CAAC,CAAC,CACH,CAAC;IAEF,OAAO,CAAC,aAAa,CAAC,IAAI,CACxB,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QAClE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC/B,GAAG,CAAC,uBAAuB,CAAC,CAAC;IAC/B,CAAC,CAAC,CACH,CAAC;IAEF,kCAAkC;IAClC,OAAO,CAAC,aAAa,CAAC,IAAI,CACxB,MAAM,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE,EAAE;QAC9C,IAAI,CAAC,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACvE,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAU,SAAS,EAAE,IAAI,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAS,QAAQ,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;YAC5D,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAS,YAAY,EAAE,IAAI,CAAC,CAAC;YAE9D,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,GAAG,SAAS,CAAC;YACrB,CAAC;YAED,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;YAC3C,CAAC;YAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;gBAC3B,OAAO,GAAG,UAAU,CAAC;gBACrB,IAAI,OAAO,EAAE,CAAC;oBACZ,oBAAoB,CAAC,OAAO,CAAC,CAAC;gBAChC,CAAC;qBAAM,CAAC;oBACN,mBAAmB,EAAE,CAAC;gBACxB,CAAC;gBACD,eAAe,EAAE,CAAC;YACpB,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,GAAG,CAAC,sBAAsB,MAAM,IAAI,QAAQ,eAAe,UAAU,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAEvE,KAAK,UAAU,UAAU;IAC9B,mBAAmB,EAAE,CAAC;IAEtB,4BAA4B;IAC5B,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;IAED,qDAAqD;IACrD,IAAI,WAAW,EAAE,CAAC;QAChB,WAAW,CAAC,OAAO,EAAE,CAAC;QACtB,WAAW,GAAG,SAAS,CAAC;IAC1B,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,CAAC,OAAO,EAAE,CAAC;QACxB,aAAa,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,aAAa,GAAG,SAAS,CAAC;AAC5B,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,MAAM,mBAAmB,GAAG,IAAI,GAAG,CAAC;IAClC,YAAY;IACZ,YAAY;IACZ,iBAAiB;IACjB,iBAAiB;CAClB,CAAC,CAAC;AAEH,SAAS,oBAAoB,CAAC,OAAgC;IAC5D,mBAAmB,EAAE,CAAC;IAEtB,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QACvE,IAAI,CAAC,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,0DAA0D;YAC1D,GAAG,CAAC,wBAAwB,QAAQ,CAAC,QAAQ,KAAK,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,OAAO,EAAE,CAAC;QACvB,YAAY,GAAG,SAAS,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;IACT,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACZ,aAAa,CAAC,IAAI,GAAG,4BAA4B,CAAC;QAClD,aAAa,CAAC,OAAO,GAAG,4CAA4C,CAAC;QACrE,aAAa,CAAC,eAAe,GAAG,SAAS,CAAC;IAC5C,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,IAAI,GAAG,2BAA2B,CAAC;QACjD,aAAa,CAAC,OAAO,GAAG,8CAA8C,CAAC;QACvE,aAAa,CAAC,eAAe,GAAG,IAAI,MAAM,CAAC,UAAU,CACnD,iCAAiC,CAClC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,YAAY;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,gBAAgB,CAAC;IAClD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;QAC7E,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBAChC,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;gBACtD,sDAAsD;gBACtD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACnD,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9B,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACjC,IAAI,IAAI,EAAE,CAAC;wBACT,OAAO,IAAI,CAAC;oBACd,CAAC;gBACH,CAAC;gBACD,6BAA6B;gBAC7B,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;gBACnE,IAAI,aAAa,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;oBACtC,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACzC,IAAI,QAAQ,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;wBACpC,OAAO,QAAQ,CAAC;oBAClB,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;AAE5E,SAAS,GAAG,CAAC,OAAe;IAC1B,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,aAAa,CAAC,UAAU,CAAC,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC,CAAC;AACxD,CAAC"}