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,262 @@
1
+ /**
2
+ * Session lifecycle and context tracking.
3
+ * Tracks current session ID, start time, and provides session-scoped observation queries.
4
+ * Sessions are identified by a timestamp-based ID generated at server startup.
5
+ *
6
+ * Phase 3: Sessions persist as Observation nodes in Qdrant with type: 'session_marker'.
7
+ * Cross-session retrieval queries those nodes to build a session registry.
8
+ */
9
+ import { randomUUID } from 'crypto';
10
+ import { embedText } from '../ingestion/embedder.js';
11
+ import { logger } from '../util/logger.js';
12
+ // The active session for this server process (created at startup)
13
+ // Format: session-{timestamp} as specified in the architecture
14
+ const SESSION_TIMESTAMP = Date.now();
15
+ const SESSION_ID = `session-${SESSION_TIMESTAMP}`;
16
+ const SESSION_START = SESSION_TIMESTAMP;
17
+ // Track observation count for this session (in-memory)
18
+ let observationCount = 0;
19
+ // Whether we have already persisted this session's marker to Qdrant
20
+ let sessionMarkerPersisted = false;
21
+ /**
22
+ * Get the current session ID.
23
+ * Format: session-{timestamp}. Consistent for the lifetime of the MCP server process.
24
+ */
25
+ export function getCurrentSessionId() {
26
+ return SESSION_ID;
27
+ }
28
+ /**
29
+ * Get the session start timestamp (Unix ms).
30
+ */
31
+ export function getSessionStart() {
32
+ return SESSION_START;
33
+ }
34
+ /**
35
+ * Get session uptime in seconds.
36
+ */
37
+ export function getUptimeSeconds() {
38
+ return Math.round((Date.now() - SESSION_START) / 1000);
39
+ }
40
+ /**
41
+ * Increment the in-memory observation count for this session.
42
+ * Called by observation-store after a successful save.
43
+ */
44
+ export function incrementObservationCount() {
45
+ observationCount++;
46
+ }
47
+ /**
48
+ * Get the current session observation count.
49
+ */
50
+ export function getObservationCount() {
51
+ return observationCount;
52
+ }
53
+ /**
54
+ * Persist the current session as a session_marker observation in Qdrant.
55
+ * This enables cross-session discovery — other processes can find recent sessions
56
+ * by searching for type: 'session_marker' observations.
57
+ *
58
+ * Idempotent — only writes once per process lifecycle.
59
+ */
60
+ export async function persistSessionMarker(vectorStore) {
61
+ if (sessionMarkerPersisted)
62
+ return;
63
+ try {
64
+ const markerId = randomUUID();
65
+ const content = `Session ${SESSION_ID} started at ${new Date(SESSION_START).toISOString()}`;
66
+ // Embed the session marker content for potential semantic retrieval
67
+ let vector;
68
+ try {
69
+ vector = await embedText(content);
70
+ }
71
+ catch {
72
+ vector = new Array(384).fill(0);
73
+ }
74
+ const markerPayload = {
75
+ id: markerId,
76
+ repo_id: null,
77
+ session_id: SESSION_ID,
78
+ content,
79
+ type: 'working', // session markers are working memory
80
+ category: 'session_marker',
81
+ tags: ['session_marker'],
82
+ importance: 0.1,
83
+ created_at: SESSION_START,
84
+ accessed_at: SESSION_START,
85
+ access_count: 0,
86
+ is_stale: false,
87
+ linked_symbols: [],
88
+ source: 'forge',
89
+ metadata: {
90
+ session_id: SESSION_ID,
91
+ started_at: SESSION_START,
92
+ is_session_marker: true,
93
+ },
94
+ key: SESSION_ID,
95
+ namespace: 'session_registry',
96
+ };
97
+ await vectorStore.upsertObservation(markerId, vector, markerPayload);
98
+ sessionMarkerPersisted = true;
99
+ logger.debug('Session marker persisted', { sessionId: SESSION_ID });
100
+ }
101
+ catch (err) {
102
+ logger.warn('Failed to persist session marker (non-fatal)', { error: String(err) });
103
+ }
104
+ }
105
+ /**
106
+ * Retrieve recent session IDs and their start times from Qdrant.
107
+ * Queries for session_marker observations ordered by created_at descending.
108
+ */
109
+ export async function getRecentSessions(vectorStore, count = 5) {
110
+ try {
111
+ const filter = {
112
+ must: [
113
+ { key: 'namespace', match: { value: 'session_registry' } },
114
+ { key: 'tags', match: { value: 'session_marker' } },
115
+ ],
116
+ };
117
+ const results = await vectorStore.filterObservations(filter, count * 2);
118
+ const sessions = results
119
+ .map(r => {
120
+ const payload = r.payload;
121
+ return {
122
+ sessionId: payload.session_id,
123
+ startedAt: payload.created_at,
124
+ };
125
+ })
126
+ // Sort by startedAt descending (most recent first)
127
+ .sort((a, b) => b.startedAt - a.startedAt)
128
+ // Deduplicate by sessionId (keep first/most-recent occurrence)
129
+ .filter((s, idx, arr) => arr.findIndex(x => x.sessionId === s.sessionId) === idx)
130
+ .slice(0, count);
131
+ return sessions;
132
+ }
133
+ catch (err) {
134
+ logger.warn('Failed to get recent sessions', { error: String(err) });
135
+ return [];
136
+ }
137
+ }
138
+ /**
139
+ * Get observations from recent sessions.
140
+ * Phase 3: Queries the persistent session registry to find sessions,
141
+ * then retrieves observations for each one.
142
+ *
143
+ * If a query is provided, observations are ranked by semantic relevance.
144
+ * Otherwise they are returned in reverse chronological order.
145
+ */
146
+ export async function getRecentSessionObservations(vectorStore, opts) {
147
+ const { query, queryVector, sessionCount = 3, limit = 10 } = opts;
148
+ try {
149
+ // Always include the current session
150
+ const recentSessions = await getRecentSessions(vectorStore, sessionCount);
151
+ // Ensure the current session is included even if not yet persisted
152
+ const sessionIds = new Set(recentSessions.map(s => s.sessionId));
153
+ sessionIds.add(SESSION_ID);
154
+ // Build the full session list with timestamps
155
+ const sessionsWithTime = [
156
+ { sessionId: SESSION_ID, startedAt: SESSION_START },
157
+ ...recentSessions.filter(s => s.sessionId !== SESSION_ID),
158
+ ].slice(0, sessionCount);
159
+ // Determine the query vector for relevance ranking
160
+ let resolvedQueryVector = queryVector;
161
+ if (query && !resolvedQueryVector) {
162
+ try {
163
+ resolvedQueryVector = await embedText(query);
164
+ }
165
+ catch {
166
+ resolvedQueryVector = undefined;
167
+ }
168
+ }
169
+ // Retrieve observations per session
170
+ const groups = [];
171
+ let remainingLimit = limit;
172
+ for (const session of sessionsWithTime) {
173
+ if (remainingLimit <= 0)
174
+ break;
175
+ const sessionObs = await getSessionObservations(vectorStore, session.sessionId, resolvedQueryVector, remainingLimit);
176
+ if (sessionObs.length > 0) {
177
+ groups.push({
178
+ sessionId: session.sessionId,
179
+ startedAt: session.startedAt,
180
+ observations: sessionObs,
181
+ });
182
+ remainingLimit -= sessionObs.length;
183
+ }
184
+ }
185
+ return groups;
186
+ }
187
+ catch (err) {
188
+ logger.warn('Failed to get recent session observations', { error: String(err) });
189
+ return [];
190
+ }
191
+ }
192
+ /**
193
+ * Retrieve observations for a specific session from Qdrant.
194
+ * Excludes session_marker observations and stale observations.
195
+ * If a queryVector is provided, filters use it for ordering but Qdrant scroll
196
+ * doesn't support semantic ranking — we fetch extra and sort in memory.
197
+ */
198
+ async function getSessionObservations(vectorStore, sessionId, queryVector, limit = 10) {
199
+ try {
200
+ // If we have a query vector, use semantic search for this session
201
+ if (queryVector) {
202
+ const results = await vectorStore.searchObservations(queryVector, {
203
+ limit: limit * 3,
204
+ scoreThreshold: 0.0,
205
+ filter: {
206
+ must: [
207
+ { key: 'session_id', match: { value: sessionId } },
208
+ ],
209
+ must_not: [
210
+ { key: 'tags', match: { value: 'session_marker' } },
211
+ ],
212
+ },
213
+ });
214
+ return results
215
+ .map(r => {
216
+ const payload = r.payload;
217
+ return {
218
+ id: payload.id,
219
+ content: payload.content,
220
+ relevance_score: Math.round(r.score * 1000) / 1000,
221
+ is_stale: payload.is_stale,
222
+ };
223
+ })
224
+ .filter(o => !o.is_stale)
225
+ .slice(0, limit);
226
+ }
227
+ // No query vector: use scroll (filterObservations) for chronological retrieval
228
+ const filter = {
229
+ session_id: sessionId,
230
+ };
231
+ const results = await vectorStore.filterObservations(filter, limit * 2);
232
+ return results
233
+ .map(r => {
234
+ const payload = r.payload;
235
+ return {
236
+ id: payload.id,
237
+ content: payload.content,
238
+ relevance_score: r.score,
239
+ is_stale: payload.is_stale,
240
+ };
241
+ })
242
+ // Exclude session_marker observations from result listing
243
+ .filter(o => !o.is_stale)
244
+ .slice(0, limit);
245
+ }
246
+ catch (err) {
247
+ logger.warn('Failed to get session observations', { sessionId, error: String(err) });
248
+ return [];
249
+ }
250
+ }
251
+ /**
252
+ * Get the current session info summary.
253
+ */
254
+ export function getSessionInfo() {
255
+ return {
256
+ sessionId: SESSION_ID,
257
+ startedAt: SESSION_START,
258
+ uptimeSeconds: getUptimeSeconds(),
259
+ observationCount,
260
+ };
261
+ }
262
+ //# sourceMappingURL=session-tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-tracker.js","sourceRoot":"","sources":["../../src/memory/session-tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,179 @@
1
+ import type { PipelineDB } from '../storage/sqlite.js';
2
+ import type { Phase, PipelineTier, Project, ProjectMetadata, Trajectory, TrajectoryStepMetadata, PhaseOutput, Claim, ClaimStatus, PipelineEvent } from '../util/types.js';
3
+ export interface CreateProjectOptions {
4
+ name: string;
5
+ description?: string;
6
+ repoId: string;
7
+ tier?: PipelineTier;
8
+ metadata?: ProjectMetadata;
9
+ }
10
+ export interface TransitionResult {
11
+ projectId: string;
12
+ fromPhase: Phase;
13
+ toPhase: Phase;
14
+ trajectoryId: string;
15
+ cycleCounts: Record<string, number>;
16
+ availableTransitions: Phase[];
17
+ }
18
+ /** Full project state snapshot — returned by getState(). */
19
+ export interface EngineState {
20
+ project: Project;
21
+ history: PipelineEvent[];
22
+ activeClaims: Claim[];
23
+ cycleCounts: Record<string, number>;
24
+ availableTransitions: Phase[];
25
+ }
26
+ export interface ProjectState {
27
+ project: Project;
28
+ activeTrajectory: Trajectory | null;
29
+ cycleCounts: Record<string, number>;
30
+ availableTransitions: Phase[];
31
+ activeClaims: Claim[];
32
+ }
33
+ export interface PhaseHistory {
34
+ phase: Phase;
35
+ agent: string;
36
+ startedAt: string;
37
+ completedAt?: string;
38
+ success?: boolean;
39
+ }
40
+ export interface ProjectHistory {
41
+ projectId: string;
42
+ events: PipelineEvent[];
43
+ outputs: PhaseOutput[];
44
+ history: PhaseHistory[];
45
+ }
46
+ export type PipelineEngineErrorCode = 'PROJECT_NOT_FOUND' | 'PROJECT_NOT_ACTIVE' | 'INVALID_TRANSITION' | 'CYCLE_LIMIT_EXCEEDED';
47
+ export declare class PipelineEngineError extends Error {
48
+ readonly code: PipelineEngineErrorCode;
49
+ readonly details: Record<string, unknown>;
50
+ constructor(code: PipelineEngineErrorCode, message: string, details?: Record<string, unknown>);
51
+ }
52
+ export declare class PipelineEngine {
53
+ private readonly db;
54
+ constructor(db: PipelineDB);
55
+ createProject(opts: CreateProjectOptions): Project;
56
+ getProject(projectId: string): Project | null;
57
+ /**
58
+ * Lists projects with optional repo and status filters.
59
+ * Ordered by updated_at DESC (most recently modified first).
60
+ */
61
+ listProjects(repoId?: string, status?: string): Project[];
62
+ /**
63
+ * Returns the most recently updated active project for a repo, or null when
64
+ * there is no active project for that repo.
65
+ */
66
+ getActiveProject(repoId: string): Project | null;
67
+ /**
68
+ * Returns the full current state of a project: project data, full event
69
+ * history, active claims, derived cycle counts, and available transitions.
70
+ *
71
+ * Throws PipelineEngineError with code PROJECT_NOT_FOUND when the project
72
+ * does not exist.
73
+ */
74
+ getState(projectId: string): EngineState;
75
+ /**
76
+ * Atomically advances a project to `toPhase` in a single SQLite transaction:
77
+ * 1. Validates the transition (throws on illegal transitions).
78
+ * 2. Checks cycle limits (throws CYCLE_LIMIT_EXCEEDED; details include the
79
+ * forced advance phase so callers can decide how to proceed).
80
+ * 3. Inserts a phase_transition event.
81
+ * 4. Updates projects.current_phase and updated_at.
82
+ * 5. If toPhase === 'completed', marks the project status 'complete' and
83
+ * emits an additional project_completed event.
84
+ *
85
+ * Throws PipelineEngineError for invalid transitions and cycle limit exceeded.
86
+ * All writes are in a single better-sqlite3 transaction.
87
+ */
88
+ advancePhase(projectId: string, toPhase: Phase, agent?: string, payload?: Record<string, unknown>): void;
89
+ /**
90
+ * Persists a phase output to phase_outputs. Multiple outputs per phase are
91
+ * allowed (e.g., vision doc, refined vision doc, etc.).
92
+ *
93
+ * Throws PipelineEngineError with code PROJECT_NOT_FOUND when the project
94
+ * does not exist.
95
+ */
96
+ recordOutput(projectId: string, phase: Phase, outputType: string, content: string, filePath?: string): void;
97
+ /**
98
+ * Returns phase outputs for a project, optionally filtered to a specific
99
+ * phase. Ordered by created_at ASC.
100
+ */
101
+ getOutputs(projectId: string, phase?: Phase): PhaseOutput[];
102
+ /**
103
+ * Returns all events for a project ordered by created_at ASC.
104
+ * This is the raw event sourcing log used for history reconstruction.
105
+ */
106
+ getEventHistory(projectId: string): PipelineEvent[];
107
+ /**
108
+ * Marks a project as 'archived'. Emits a project_completed event with an
109
+ * 'abandoned' flag. Idempotent if already archived.
110
+ *
111
+ * Throws PipelineEngineError with code PROJECT_NOT_FOUND when the project
112
+ * does not exist.
113
+ */
114
+ abandonProject(projectId: string): void;
115
+ /**
116
+ * Transition a project to a new phase.
117
+ * Validates the transition against the state machine, emits events,
118
+ * starts a trajectory, and returns the result.
119
+ */
120
+ startPhase(projectId: string, toPhase: Phase, agent: string, extra?: Record<string, unknown>): TransitionResult | {
121
+ error: string;
122
+ current_phase: Phase;
123
+ legal_transitions: Phase[];
124
+ };
125
+ /**
126
+ * Record completion of a phase: persist output, complete the trajectory,
127
+ * and optionally advance the state machine.
128
+ */
129
+ completePhase(projectId: string, phase: Phase, outputType: string, content: string, opts: {
130
+ agent: string;
131
+ filePath?: string;
132
+ advanceTo?: Phase;
133
+ trajectoryId?: string;
134
+ qualityScore?: number;
135
+ metadata?: Record<string, unknown>;
136
+ }): {
137
+ outputId: number;
138
+ nextPhase: Phase | null;
139
+ };
140
+ startTrajectory(projectId: string, phase: Phase, agent: string): string;
141
+ recordTrajectoryStep(trajectoryId: string, action: string, result?: string, qualityScore?: number, metadata?: TrajectoryStepMetadata): void;
142
+ completeTrajectory(trajectoryId: string, success: boolean, feedback?: string): void;
143
+ createClaim(projectId: string, moduleName: string, agent: string): Claim;
144
+ completeClaim(claimId: string, result?: string): {
145
+ remainingCount: number;
146
+ allComplete: boolean;
147
+ };
148
+ failClaim(claimId: string, reason: string): void;
149
+ getActiveClaims(projectId: string): Claim[];
150
+ getClaims(projectId: string, status?: ClaimStatus): Claim[];
151
+ getClaim(claimId: string): Claim | null;
152
+ getClaimByModule(projectId: string, moduleName: string): Claim | null;
153
+ getPhaseOutput(projectId: string, phase: Phase, outputType?: string): PhaseOutput | null;
154
+ /**
155
+ * Retrieve metadata stored in the agent_completed event for a phase.
156
+ * This includes flags like requires_qa, requires_designer, modules, etc.
157
+ * that are passed via opts.metadata in completePhase().
158
+ */
159
+ getPhaseMetadata(projectId: string, phase: Phase): Record<string, unknown> | null;
160
+ /**
161
+ * Record a broadcast event in the pipeline_events table.
162
+ * Used by phase tools to auto-broadcast module completions for swarm coordination.
163
+ */
164
+ recordBroadcast(projectId: string, content: string, severity?: 'info' | 'warning' | 'critical'): void;
165
+ getAllPhaseOutputs(projectId: string): PhaseOutput[];
166
+ getHistory(projectId: string): ProjectHistory;
167
+ getCycleCounts(projectId: string): Record<string, number>;
168
+ private _getCycleCounts;
169
+ /**
170
+ * Retrieves a project by id and throws a typed PipelineEngineError when not
171
+ * found. Used by every method that requires an existing project.
172
+ */
173
+ private _requireProject;
174
+ private _rowToProject;
175
+ private _rowToClaim;
176
+ private _rowToPhaseOutput;
177
+ getActiveTrajectory(projectId: string, phase: Phase): Trajectory | null;
178
+ }
179
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/pipeline/engine.ts"],"names":[],"mappings":"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"}