@booklib/core 2.0.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 (374) hide show
  1. package/.cursor/rules/booklib-standards.mdc +40 -0
  2. package/.gemini/context.md +372 -0
  3. package/AGENTS.md +166 -0
  4. package/CHANGELOG.md +226 -0
  5. package/CLAUDE.md +81 -0
  6. package/CODE_OF_CONDUCT.md +31 -0
  7. package/CONTRIBUTING.md +304 -0
  8. package/LICENSE +21 -0
  9. package/PLAN.md +28 -0
  10. package/README.ja.md +198 -0
  11. package/README.ko.md +198 -0
  12. package/README.md +503 -0
  13. package/README.pt-BR.md +198 -0
  14. package/README.uk.md +241 -0
  15. package/README.zh-CN.md +198 -0
  16. package/SECURITY.md +9 -0
  17. package/agents/architecture-reviewer.md +136 -0
  18. package/agents/booklib-reviewer.md +90 -0
  19. package/agents/data-reviewer.md +107 -0
  20. package/agents/jvm-reviewer.md +146 -0
  21. package/agents/python-reviewer.md +128 -0
  22. package/agents/rust-reviewer.md +115 -0
  23. package/agents/ts-reviewer.md +110 -0
  24. package/agents/ui-reviewer.md +117 -0
  25. package/assets/logo.svg +36 -0
  26. package/bin/booklib-mcp.js +304 -0
  27. package/bin/booklib.js +1705 -0
  28. package/bin/skills.cjs +1292 -0
  29. package/booklib-router.mdc +36 -0
  30. package/booklib.config.json +19 -0
  31. package/commands/animation-at-work.md +10 -0
  32. package/commands/clean-code-reviewer.md +10 -0
  33. package/commands/data-intensive-patterns.md +10 -0
  34. package/commands/data-pipelines.md +10 -0
  35. package/commands/design-patterns.md +10 -0
  36. package/commands/domain-driven-design.md +10 -0
  37. package/commands/effective-java.md +10 -0
  38. package/commands/effective-kotlin.md +10 -0
  39. package/commands/effective-python.md +10 -0
  40. package/commands/effective-typescript.md +10 -0
  41. package/commands/kotlin-in-action.md +10 -0
  42. package/commands/lean-startup.md +10 -0
  43. package/commands/microservices-patterns.md +10 -0
  44. package/commands/programming-with-rust.md +10 -0
  45. package/commands/refactoring-ui.md +10 -0
  46. package/commands/rust-in-action.md +10 -0
  47. package/commands/skill-router.md +10 -0
  48. package/commands/spring-boot-in-action.md +10 -0
  49. package/commands/storytelling-with-data.md +10 -0
  50. package/commands/system-design-interview.md +10 -0
  51. package/commands/using-asyncio-python.md +10 -0
  52. package/commands/web-scraping-python.md +10 -0
  53. package/community/registry.json +1616 -0
  54. package/hooks/hooks.json +23 -0
  55. package/hooks/posttooluse-capture.mjs +67 -0
  56. package/hooks/suggest.js +153 -0
  57. package/lib/agent-behaviors.js +40 -0
  58. package/lib/agent-detector.js +96 -0
  59. package/lib/config-loader.js +39 -0
  60. package/lib/conflict-resolver.js +148 -0
  61. package/lib/context-builder.js +574 -0
  62. package/lib/discovery-engine.js +298 -0
  63. package/lib/doctor/hook-installer.js +83 -0
  64. package/lib/doctor/usage-tracker.js +87 -0
  65. package/lib/engine/ai-features.js +253 -0
  66. package/lib/engine/auditor.js +103 -0
  67. package/lib/engine/bm25-index.js +178 -0
  68. package/lib/engine/capture.js +120 -0
  69. package/lib/engine/corrections.js +198 -0
  70. package/lib/engine/doctor.js +195 -0
  71. package/lib/engine/graph-injector.js +137 -0
  72. package/lib/engine/graph.js +161 -0
  73. package/lib/engine/handoff.js +405 -0
  74. package/lib/engine/indexer.js +242 -0
  75. package/lib/engine/parser.js +53 -0
  76. package/lib/engine/query-expander.js +42 -0
  77. package/lib/engine/reranker.js +40 -0
  78. package/lib/engine/rrf.js +59 -0
  79. package/lib/engine/scanner.js +151 -0
  80. package/lib/engine/searcher.js +139 -0
  81. package/lib/engine/session-coordinator.js +306 -0
  82. package/lib/engine/session-manager.js +429 -0
  83. package/lib/engine/synthesizer.js +70 -0
  84. package/lib/installer.js +70 -0
  85. package/lib/instinct-block.js +33 -0
  86. package/lib/mcp-config-writer.js +88 -0
  87. package/lib/paths.js +57 -0
  88. package/lib/profiles/design.md +19 -0
  89. package/lib/profiles/general.md +16 -0
  90. package/lib/profiles/research-analysis.md +22 -0
  91. package/lib/profiles/software-development.md +23 -0
  92. package/lib/profiles/writing-content.md +19 -0
  93. package/lib/project-initializer.js +916 -0
  94. package/lib/registry/skills.js +102 -0
  95. package/lib/registry-searcher.js +99 -0
  96. package/lib/rules/rules-manager.js +169 -0
  97. package/lib/skill-fetcher.js +333 -0
  98. package/lib/well-known-builder.js +70 -0
  99. package/lib/wizard/index.js +404 -0
  100. package/lib/wizard/integration-detector.js +41 -0
  101. package/lib/wizard/project-detector.js +100 -0
  102. package/lib/wizard/prompt.js +156 -0
  103. package/lib/wizard/registry-embeddings.js +107 -0
  104. package/lib/wizard/skill-recommender.js +69 -0
  105. package/llms-full.txt +254 -0
  106. package/llms.txt +70 -0
  107. package/package.json +45 -0
  108. package/research-reports/2026-04-01-current-architecture.md +160 -0
  109. package/research-reports/IDEAS.md +93 -0
  110. package/rules/common/clean-code.md +42 -0
  111. package/rules/java/effective-java.md +42 -0
  112. package/rules/kotlin/effective-kotlin.md +37 -0
  113. package/rules/python/effective-python.md +38 -0
  114. package/rules/rust/rust.md +37 -0
  115. package/rules/typescript/effective-typescript.md +42 -0
  116. package/scripts/gen-llms-full.mjs +36 -0
  117. package/scripts/gen-og.mjs +142 -0
  118. package/scripts/validate-frontmatter.js +25 -0
  119. package/skills/animation-at-work/SKILL.md +270 -0
  120. package/skills/animation-at-work/assets/example_asset.txt +1 -0
  121. package/skills/animation-at-work/evals/evals.json +44 -0
  122. package/skills/animation-at-work/evals/results.json +13 -0
  123. package/skills/animation-at-work/examples/after.md +64 -0
  124. package/skills/animation-at-work/examples/before.md +35 -0
  125. package/skills/animation-at-work/references/api_reference.md +369 -0
  126. package/skills/animation-at-work/references/review-checklist.md +79 -0
  127. package/skills/animation-at-work/scripts/audit_animations.py +295 -0
  128. package/skills/animation-at-work/scripts/example.py +1 -0
  129. package/skills/clean-code-reviewer/SKILL.md +444 -0
  130. package/skills/clean-code-reviewer/audit.json +35 -0
  131. package/skills/clean-code-reviewer/evals/evals.json +185 -0
  132. package/skills/clean-code-reviewer/evals/results.json +13 -0
  133. package/skills/clean-code-reviewer/examples/after.md +48 -0
  134. package/skills/clean-code-reviewer/examples/before.md +33 -0
  135. package/skills/clean-code-reviewer/references/api_reference.md +158 -0
  136. package/skills/clean-code-reviewer/references/practices-catalog.md +282 -0
  137. package/skills/clean-code-reviewer/references/review-checklist.md +254 -0
  138. package/skills/clean-code-reviewer/scripts/pre-review.py +206 -0
  139. package/skills/data-intensive-patterns/SKILL.md +267 -0
  140. package/skills/data-intensive-patterns/assets/example_asset.txt +1 -0
  141. package/skills/data-intensive-patterns/evals/evals.json +54 -0
  142. package/skills/data-intensive-patterns/evals/results.json +13 -0
  143. package/skills/data-intensive-patterns/examples/after.md +61 -0
  144. package/skills/data-intensive-patterns/examples/before.md +38 -0
  145. package/skills/data-intensive-patterns/references/api_reference.md +34 -0
  146. package/skills/data-intensive-patterns/references/patterns-catalog.md +551 -0
  147. package/skills/data-intensive-patterns/references/review-checklist.md +193 -0
  148. package/skills/data-intensive-patterns/scripts/adr.py +213 -0
  149. package/skills/data-intensive-patterns/scripts/example.py +1 -0
  150. package/skills/data-pipelines/SKILL.md +259 -0
  151. package/skills/data-pipelines/assets/example_asset.txt +1 -0
  152. package/skills/data-pipelines/evals/evals.json +45 -0
  153. package/skills/data-pipelines/evals/results.json +13 -0
  154. package/skills/data-pipelines/examples/after.md +97 -0
  155. package/skills/data-pipelines/examples/before.md +37 -0
  156. package/skills/data-pipelines/references/api_reference.md +301 -0
  157. package/skills/data-pipelines/references/review-checklist.md +181 -0
  158. package/skills/data-pipelines/scripts/example.py +1 -0
  159. package/skills/data-pipelines/scripts/new_pipeline.py +444 -0
  160. package/skills/design-patterns/SKILL.md +271 -0
  161. package/skills/design-patterns/assets/example_asset.txt +1 -0
  162. package/skills/design-patterns/evals/evals.json +46 -0
  163. package/skills/design-patterns/evals/results.json +13 -0
  164. package/skills/design-patterns/examples/after.md +52 -0
  165. package/skills/design-patterns/examples/before.md +29 -0
  166. package/skills/design-patterns/references/api_reference.md +1 -0
  167. package/skills/design-patterns/references/patterns-catalog.md +726 -0
  168. package/skills/design-patterns/references/review-checklist.md +173 -0
  169. package/skills/design-patterns/scripts/example.py +1 -0
  170. package/skills/design-patterns/scripts/scaffold.py +807 -0
  171. package/skills/domain-driven-design/SKILL.md +142 -0
  172. package/skills/domain-driven-design/assets/example_asset.txt +1 -0
  173. package/skills/domain-driven-design/evals/evals.json +48 -0
  174. package/skills/domain-driven-design/evals/results.json +13 -0
  175. package/skills/domain-driven-design/examples/after.md +80 -0
  176. package/skills/domain-driven-design/examples/before.md +43 -0
  177. package/skills/domain-driven-design/references/api_reference.md +1 -0
  178. package/skills/domain-driven-design/references/patterns-catalog.md +545 -0
  179. package/skills/domain-driven-design/references/review-checklist.md +158 -0
  180. package/skills/domain-driven-design/scripts/example.py +1 -0
  181. package/skills/domain-driven-design/scripts/scaffold.py +421 -0
  182. package/skills/effective-java/SKILL.md +227 -0
  183. package/skills/effective-java/assets/example_asset.txt +1 -0
  184. package/skills/effective-java/evals/evals.json +46 -0
  185. package/skills/effective-java/evals/results.json +13 -0
  186. package/skills/effective-java/examples/after.md +83 -0
  187. package/skills/effective-java/examples/before.md +37 -0
  188. package/skills/effective-java/references/api_reference.md +1 -0
  189. package/skills/effective-java/references/items-catalog.md +955 -0
  190. package/skills/effective-java/references/review-checklist.md +216 -0
  191. package/skills/effective-java/scripts/checkstyle_setup.py +211 -0
  192. package/skills/effective-java/scripts/example.py +1 -0
  193. package/skills/effective-kotlin/SKILL.md +271 -0
  194. package/skills/effective-kotlin/assets/example_asset.txt +1 -0
  195. package/skills/effective-kotlin/audit.json +29 -0
  196. package/skills/effective-kotlin/evals/evals.json +45 -0
  197. package/skills/effective-kotlin/evals/results.json +13 -0
  198. package/skills/effective-kotlin/examples/after.md +36 -0
  199. package/skills/effective-kotlin/examples/before.md +38 -0
  200. package/skills/effective-kotlin/references/api_reference.md +1 -0
  201. package/skills/effective-kotlin/references/practices-catalog.md +1228 -0
  202. package/skills/effective-kotlin/references/review-checklist.md +126 -0
  203. package/skills/effective-kotlin/scripts/example.py +1 -0
  204. package/skills/effective-python/SKILL.md +441 -0
  205. package/skills/effective-python/evals/evals.json +44 -0
  206. package/skills/effective-python/evals/results.json +13 -0
  207. package/skills/effective-python/examples/after.md +56 -0
  208. package/skills/effective-python/examples/before.md +40 -0
  209. package/skills/effective-python/ref-01-pythonic-thinking.md +202 -0
  210. package/skills/effective-python/ref-02-lists-and-dicts.md +146 -0
  211. package/skills/effective-python/ref-03-functions.md +186 -0
  212. package/skills/effective-python/ref-04-comprehensions-generators.md +211 -0
  213. package/skills/effective-python/ref-05-classes-interfaces.md +188 -0
  214. package/skills/effective-python/ref-06-metaclasses-attributes.md +209 -0
  215. package/skills/effective-python/ref-07-concurrency.md +213 -0
  216. package/skills/effective-python/ref-08-robustness-performance.md +248 -0
  217. package/skills/effective-python/ref-09-testing-debugging.md +253 -0
  218. package/skills/effective-python/ref-10-collaboration.md +175 -0
  219. package/skills/effective-python/references/api_reference.md +218 -0
  220. package/skills/effective-python/references/practices-catalog.md +483 -0
  221. package/skills/effective-python/references/review-checklist.md +190 -0
  222. package/skills/effective-python/scripts/lint.py +173 -0
  223. package/skills/effective-typescript/SKILL.md +262 -0
  224. package/skills/effective-typescript/audit.json +29 -0
  225. package/skills/effective-typescript/evals/evals.json +37 -0
  226. package/skills/effective-typescript/evals/results.json +13 -0
  227. package/skills/effective-typescript/examples/after.md +70 -0
  228. package/skills/effective-typescript/examples/before.md +47 -0
  229. package/skills/effective-typescript/references/api_reference.md +118 -0
  230. package/skills/effective-typescript/references/practices-catalog.md +371 -0
  231. package/skills/effective-typescript/scripts/review.py +169 -0
  232. package/skills/kotlin-in-action/SKILL.md +261 -0
  233. package/skills/kotlin-in-action/assets/example_asset.txt +1 -0
  234. package/skills/kotlin-in-action/evals/evals.json +43 -0
  235. package/skills/kotlin-in-action/evals/results.json +13 -0
  236. package/skills/kotlin-in-action/examples/after.md +53 -0
  237. package/skills/kotlin-in-action/examples/before.md +39 -0
  238. package/skills/kotlin-in-action/references/api_reference.md +1 -0
  239. package/skills/kotlin-in-action/references/practices-catalog.md +436 -0
  240. package/skills/kotlin-in-action/references/review-checklist.md +204 -0
  241. package/skills/kotlin-in-action/scripts/example.py +1 -0
  242. package/skills/kotlin-in-action/scripts/setup_detekt.py +224 -0
  243. package/skills/lean-startup/SKILL.md +160 -0
  244. package/skills/lean-startup/assets/example_asset.txt +1 -0
  245. package/skills/lean-startup/evals/evals.json +43 -0
  246. package/skills/lean-startup/evals/results.json +13 -0
  247. package/skills/lean-startup/examples/after.md +80 -0
  248. package/skills/lean-startup/examples/before.md +34 -0
  249. package/skills/lean-startup/references/api_reference.md +319 -0
  250. package/skills/lean-startup/references/review-checklist.md +137 -0
  251. package/skills/lean-startup/scripts/example.py +1 -0
  252. package/skills/lean-startup/scripts/new_experiment.py +286 -0
  253. package/skills/microservices-patterns/SKILL.md +384 -0
  254. package/skills/microservices-patterns/evals/evals.json +45 -0
  255. package/skills/microservices-patterns/evals/results.json +13 -0
  256. package/skills/microservices-patterns/examples/after.md +69 -0
  257. package/skills/microservices-patterns/examples/before.md +40 -0
  258. package/skills/microservices-patterns/references/patterns-catalog.md +391 -0
  259. package/skills/microservices-patterns/references/review-checklist.md +169 -0
  260. package/skills/microservices-patterns/scripts/new_service.py +583 -0
  261. package/skills/programming-with-rust/SKILL.md +209 -0
  262. package/skills/programming-with-rust/evals/evals.json +37 -0
  263. package/skills/programming-with-rust/evals/results.json +13 -0
  264. package/skills/programming-with-rust/examples/after.md +107 -0
  265. package/skills/programming-with-rust/examples/before.md +59 -0
  266. package/skills/programming-with-rust/references/api_reference.md +152 -0
  267. package/skills/programming-with-rust/references/practices-catalog.md +335 -0
  268. package/skills/programming-with-rust/scripts/review.py +142 -0
  269. package/skills/refactoring-ui/SKILL.md +362 -0
  270. package/skills/refactoring-ui/assets/example_asset.txt +1 -0
  271. package/skills/refactoring-ui/evals/evals.json +45 -0
  272. package/skills/refactoring-ui/evals/results.json +13 -0
  273. package/skills/refactoring-ui/examples/after.md +85 -0
  274. package/skills/refactoring-ui/examples/before.md +58 -0
  275. package/skills/refactoring-ui/references/api_reference.md +355 -0
  276. package/skills/refactoring-ui/references/review-checklist.md +114 -0
  277. package/skills/refactoring-ui/scripts/audit_css.py +250 -0
  278. package/skills/refactoring-ui/scripts/example.py +1 -0
  279. package/skills/rust-in-action/SKILL.md +350 -0
  280. package/skills/rust-in-action/evals/evals.json +38 -0
  281. package/skills/rust-in-action/evals/results.json +13 -0
  282. package/skills/rust-in-action/examples/after.md +156 -0
  283. package/skills/rust-in-action/examples/before.md +56 -0
  284. package/skills/rust-in-action/references/practices-catalog.md +346 -0
  285. package/skills/rust-in-action/scripts/review.py +147 -0
  286. package/skills/skill-router/SKILL.md +186 -0
  287. package/skills/skill-router/evals/evals.json +38 -0
  288. package/skills/skill-router/evals/results.json +13 -0
  289. package/skills/skill-router/examples/after.md +63 -0
  290. package/skills/skill-router/examples/before.md +39 -0
  291. package/skills/skill-router/references/api_reference.md +24 -0
  292. package/skills/skill-router/references/routing-heuristics.md +89 -0
  293. package/skills/skill-router/references/skill-catalog.md +174 -0
  294. package/skills/skill-router/scripts/route.py +266 -0
  295. package/skills/spring-boot-in-action/SKILL.md +340 -0
  296. package/skills/spring-boot-in-action/evals/evals.json +39 -0
  297. package/skills/spring-boot-in-action/evals/results.json +13 -0
  298. package/skills/spring-boot-in-action/examples/after.md +185 -0
  299. package/skills/spring-boot-in-action/examples/before.md +84 -0
  300. package/skills/spring-boot-in-action/references/practices-catalog.md +403 -0
  301. package/skills/spring-boot-in-action/scripts/review.py +184 -0
  302. package/skills/storytelling-with-data/SKILL.md +241 -0
  303. package/skills/storytelling-with-data/assets/example_asset.txt +1 -0
  304. package/skills/storytelling-with-data/evals/evals.json +47 -0
  305. package/skills/storytelling-with-data/evals/results.json +13 -0
  306. package/skills/storytelling-with-data/examples/after.md +50 -0
  307. package/skills/storytelling-with-data/examples/before.md +33 -0
  308. package/skills/storytelling-with-data/references/api_reference.md +379 -0
  309. package/skills/storytelling-with-data/references/review-checklist.md +111 -0
  310. package/skills/storytelling-with-data/scripts/chart_review.py +301 -0
  311. package/skills/storytelling-with-data/scripts/example.py +1 -0
  312. package/skills/system-design-interview/SKILL.md +233 -0
  313. package/skills/system-design-interview/assets/example_asset.txt +1 -0
  314. package/skills/system-design-interview/evals/evals.json +46 -0
  315. package/skills/system-design-interview/evals/results.json +13 -0
  316. package/skills/system-design-interview/examples/after.md +94 -0
  317. package/skills/system-design-interview/examples/before.md +27 -0
  318. package/skills/system-design-interview/references/api_reference.md +582 -0
  319. package/skills/system-design-interview/references/review-checklist.md +201 -0
  320. package/skills/system-design-interview/scripts/example.py +1 -0
  321. package/skills/system-design-interview/scripts/new_design.py +421 -0
  322. package/skills/using-asyncio-python/SKILL.md +290 -0
  323. package/skills/using-asyncio-python/assets/example_asset.txt +1 -0
  324. package/skills/using-asyncio-python/evals/evals.json +43 -0
  325. package/skills/using-asyncio-python/evals/results.json +13 -0
  326. package/skills/using-asyncio-python/examples/after.md +68 -0
  327. package/skills/using-asyncio-python/examples/before.md +39 -0
  328. package/skills/using-asyncio-python/references/api_reference.md +267 -0
  329. package/skills/using-asyncio-python/references/review-checklist.md +149 -0
  330. package/skills/using-asyncio-python/scripts/check_blocking.py +270 -0
  331. package/skills/using-asyncio-python/scripts/example.py +1 -0
  332. package/skills/web-scraping-python/SKILL.md +280 -0
  333. package/skills/web-scraping-python/assets/example_asset.txt +1 -0
  334. package/skills/web-scraping-python/evals/evals.json +46 -0
  335. package/skills/web-scraping-python/evals/results.json +13 -0
  336. package/skills/web-scraping-python/examples/after.md +109 -0
  337. package/skills/web-scraping-python/examples/before.md +40 -0
  338. package/skills/web-scraping-python/references/api_reference.md +393 -0
  339. package/skills/web-scraping-python/references/review-checklist.md +163 -0
  340. package/skills/web-scraping-python/scripts/example.py +1 -0
  341. package/skills/web-scraping-python/scripts/new_scraper.py +231 -0
  342. package/skills/writing-plans/audit.json +34 -0
  343. package/tests/agent-detector.test.js +83 -0
  344. package/tests/corrections.test.js +245 -0
  345. package/tests/doctor/hook-installer.test.js +72 -0
  346. package/tests/doctor/usage-tracker.test.js +140 -0
  347. package/tests/engine/benchmark-eval.test.js +31 -0
  348. package/tests/engine/bm25-index.test.js +85 -0
  349. package/tests/engine/capture-command.test.js +35 -0
  350. package/tests/engine/capture.test.js +17 -0
  351. package/tests/engine/graph-augmented-search.test.js +107 -0
  352. package/tests/engine/graph-injector.test.js +44 -0
  353. package/tests/engine/graph.test.js +216 -0
  354. package/tests/engine/hybrid-searcher.test.js +74 -0
  355. package/tests/engine/indexer-bm25.test.js +37 -0
  356. package/tests/engine/mcp-tools.test.js +73 -0
  357. package/tests/engine/project-initializer-mcp.test.js +99 -0
  358. package/tests/engine/query-expander.test.js +36 -0
  359. package/tests/engine/reranker.test.js +51 -0
  360. package/tests/engine/rrf.test.js +49 -0
  361. package/tests/engine/srag-prefix.test.js +47 -0
  362. package/tests/instinct-block.test.js +23 -0
  363. package/tests/mcp-config-writer.test.js +60 -0
  364. package/tests/project-initializer-new-agents.test.js +48 -0
  365. package/tests/rules/rules-manager.test.js +230 -0
  366. package/tests/well-known-builder.test.js +40 -0
  367. package/tests/wizard/integration-detector.test.js +31 -0
  368. package/tests/wizard/project-detector.test.js +51 -0
  369. package/tests/wizard/prompt-session.test.js +61 -0
  370. package/tests/wizard/prompt.test.js +16 -0
  371. package/tests/wizard/registry-embeddings.test.js +35 -0
  372. package/tests/wizard/skill-recommender.test.js +34 -0
  373. package/tests/wizard/slot-count.test.js +25 -0
  374. package/vercel.json +21 -0
@@ -0,0 +1,306 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { execSync } from 'child_process';
4
+
5
+ /**
6
+ * Coordinates handoff sessions across multiple agents.
7
+ * Enables session merging, lineage tracking, and cross-agent insights.
8
+ */
9
+ export class BookLibSessionCoordinator {
10
+ constructor(handoffDir = path.join(process.cwd(), '.booklib', 'sessions')) {
11
+ this.handoffDir = handoffDir;
12
+ }
13
+
14
+ /**
15
+ * Lists all available sessions with metadata.
16
+ */
17
+ listAllSessions() {
18
+ if (!fs.existsSync(this.handoffDir)) return [];
19
+
20
+ const sessions = fs.readdirSync(this.handoffDir)
21
+ .filter(f => f.endsWith('.md'))
22
+ .map(f => {
23
+ const sessionName = f.replace('.md', '');
24
+ const filePath = path.join(this.handoffDir, f);
25
+ const stats = fs.statSync(filePath);
26
+ const content = fs.readFileSync(filePath, 'utf8');
27
+
28
+ // Extract key info without full XML parsing (faster)
29
+ const goalMatch = content.match(/<goal>(.*?)<\/goal>/);
30
+ const progressMatch = content.match(/<progress>(.*?)<\/progress>/);
31
+ const branchMatch = content.match(/<branch>(.*?)<\/branch>/);
32
+
33
+ return {
34
+ id: sessionName,
35
+ goal: goalMatch ? goalMatch[1] : 'Unknown',
36
+ progress: progressMatch ? progressMatch[1] : 'Unknown',
37
+ branch: branchMatch ? branchMatch[1] : 'Unknown',
38
+ timestamp: stats.mtime,
39
+ size: stats.size
40
+ };
41
+ });
42
+
43
+ return sessions.sort((a, b) => b.timestamp - a.timestamp);
44
+ }
45
+
46
+ /**
47
+ * Merges multiple sessions into a combined session.
48
+ * Useful for: combining work from parallel agents, multi-agent reviews, etc.
49
+ *
50
+ * Usage:
51
+ * coordinator.mergeSessions(['agent-python', 'agent-kotlin'], 'combined-review')
52
+ * → Creates combined-review.md with insights from both
53
+ */
54
+ mergeSessions(sessionIds, outputSessionId) {
55
+ const sessions = sessionIds.map(id => {
56
+ const filePath = path.join(this.handoffDir, `${id}.md`);
57
+ if (!fs.existsSync(filePath)) {
58
+ throw new Error(`Session not found: ${id}`);
59
+ }
60
+ return {
61
+ id,
62
+ content: fs.readFileSync(filePath, 'utf8')
63
+ };
64
+ });
65
+
66
+ // Extract metadata from all sessions
67
+ const merged = {
68
+ metadata: {
69
+ timestamp: new Date().toISOString(),
70
+ session_id: outputSessionId,
71
+ parent_sessions: sessionIds.join(', '),
72
+ merge_type: 'multi-agent-combined'
73
+ }
74
+ };
75
+
76
+ const outputPath = path.join(this.handoffDir, `${outputSessionId}.md`);
77
+ const content = `
78
+ <session_handoff>
79
+ <metadata>
80
+ <timestamp>${merged.metadata.timestamp}</timestamp>
81
+ <session_id>${merged.metadata.session_id}</session_id>
82
+ <parent_sessions>${merged.metadata.parent_sessions}</parent_sessions>
83
+ <merge_type>${merged.metadata.merge_type}</merge_type>
84
+ </metadata>
85
+
86
+ <context>
87
+ <goal>Combined context from multiple agents</goal>
88
+ <progress>Merged from: ${sessionIds.join(', ')}</progress>
89
+ <pending_tasks>Review merged insights below</pending_tasks>
90
+ <note>This session combines work from multiple agents. See merged_agent_contexts below.</note>
91
+ </context>
92
+
93
+ <merged_agent_contexts>
94
+ ${sessions.map(s => {
95
+ const goal = s.content.match(/<goal>(.*?)<\/goal>/)?.[1] || 'Unknown';
96
+ const progress = s.content.match(/<progress>(.*?)<\/progress>/)?.[1] || 'Unknown';
97
+ const branch = s.content.match(/<branch>(.*?)<\/branch>/)?.[1] || 'Unknown';
98
+ return ` <agent id="${s.id}">
99
+ <goal>${goal}</goal>
100
+ <progress>${progress}</progress>
101
+ <branch>${branch}</branch>
102
+ </agent>`;
103
+ }).join('\n')}
104
+ </merged_agent_contexts>
105
+
106
+ <cross_agent_insights>
107
+ <note>Each agent contributed unique insights. Review their branches below:</note>
108
+ ${sessions.map(s => {
109
+ const commits = s.content.match(/<recent_commit_history>([\s\S]*?)<\/recent_commit_history>/)?.[1] || '';
110
+ return ` <agent_work id="${s.id}">
111
+ ${commits.trim()}
112
+ </agent_work>`;
113
+ }).join('\n')}
114
+ </cross_agent_insights>
115
+
116
+ <recovery_instructions>
117
+ <step1>This is a merged session combining: ${sessionIds.join(', ')}</step1>
118
+ <step2>Review merged_agent_contexts above to see what each agent accomplished</step2>
119
+ <step3>Review cross_agent_insights for commits from each agent</step3>
120
+ <step4>Decide: continue on one branch or synthesize both?</step4>
121
+ <step5>If synthesizing: git merge the branches with appropriate strategy</step5>
122
+ </recovery_instructions>
123
+ </session_handoff>
124
+ `;
125
+
126
+ fs.writeFileSync(outputPath, content.trim());
127
+ return outputPath;
128
+ }
129
+
130
+ /**
131
+ * Tracks session lineage (parent-child relationships).
132
+ * For example: agent-1 creates "main" session, agent-2 branches to "feature-x"
133
+ *
134
+ * Usage:
135
+ * coordinator.trackLineage('main', 'feature-x', 'Agent 2 branched from main')
136
+ * → Records parent-child relationship
137
+ */
138
+ trackLineage(parentSessionId, childSessionId, reason = '') {
139
+ const lineageFile = path.join(this.handoffDir, '_lineage.json');
140
+
141
+ let lineage = {};
142
+ if (fs.existsSync(lineageFile)) {
143
+ lineage = JSON.parse(fs.readFileSync(lineageFile, 'utf8'));
144
+ }
145
+
146
+ if (!lineage[childSessionId]) {
147
+ lineage[childSessionId] = {
148
+ parent: parentSessionId,
149
+ reason,
150
+ createdAt: new Date().toISOString(),
151
+ children: []
152
+ };
153
+ }
154
+
155
+ if (!lineage[parentSessionId]) {
156
+ lineage[parentSessionId] = { children: [] };
157
+ }
158
+
159
+ if (!lineage[parentSessionId].children) {
160
+ lineage[parentSessionId].children = [];
161
+ }
162
+ lineage[parentSessionId].children.push(childSessionId);
163
+
164
+ fs.writeFileSync(lineageFile, JSON.stringify(lineage, null, 2));
165
+ return lineage;
166
+ }
167
+
168
+ /**
169
+ * Displays session lineage as a tree.
170
+ * Shows parent-child relationships visually.
171
+ */
172
+ displayLineageTree() {
173
+ const lineageFile = path.join(this.handoffDir, '_lineage.json');
174
+ if (!fs.existsSync(lineageFile)) {
175
+ return 'No session lineage tracked yet. Start with trackLineage().';
176
+ }
177
+
178
+ const lineage = JSON.parse(fs.readFileSync(lineageFile, 'utf8'));
179
+ const roots = Object.entries(lineage)
180
+ .filter(([_, info]) => !info.parent)
181
+ .map(([id]) => id);
182
+
183
+ let output = 'SESSION LINEAGE TREE\n═══════════════════\n\n';
184
+
185
+ const drawTree = (sessionId, depth = 0) => {
186
+ const info = lineage[sessionId];
187
+ const indent = ' '.repeat(depth);
188
+ const prefix = depth === 0 ? '📍' : '└─';
189
+
190
+ output += `${indent}${prefix} ${sessionId}\n`;
191
+ if (info.reason) output += `${indent} (${info.reason})\n`;
192
+
193
+ if (info.children && info.children.length > 0) {
194
+ info.children.forEach(child => {
195
+ drawTree(child, depth + 1);
196
+ });
197
+ }
198
+ };
199
+
200
+ roots.forEach(root => drawTree(root));
201
+ return output;
202
+ }
203
+
204
+ /**
205
+ * Gets the full lineage path of a session (all ancestors).
206
+ *
207
+ * Usage:
208
+ * coordinator.getLineagePath('feature-x')
209
+ * → Returns: ['main', 'feature-base', 'feature-x']
210
+ */
211
+ getLineagePath(sessionId) {
212
+ const lineageFile = path.join(this.handoffDir, '_lineage.json');
213
+ if (!fs.existsSync(lineageFile)) return [sessionId];
214
+
215
+ const lineage = JSON.parse(fs.readFileSync(lineageFile, 'utf8'));
216
+ const path = [sessionId];
217
+
218
+ let current = sessionId;
219
+ while (lineage[current] && lineage[current].parent) {
220
+ path.unshift(lineage[current].parent);
221
+ current = lineage[current].parent;
222
+ }
223
+
224
+ return path;
225
+ }
226
+
227
+ /**
228
+ * Creates a session comparing multiple agents' audits.
229
+ * Useful for: "Compare Python audit vs Kotlin audit of same file"
230
+ */
231
+ compareAudits(auditSessionIds, targetFile, outputSessionId) {
232
+ const audits = auditSessionIds.map(id => {
233
+ const filePath = path.join(this.handoffDir, `${id}.md`);
234
+ if (!fs.existsSync(filePath)) {
235
+ throw new Error(`Audit session not found: ${id}`);
236
+ }
237
+ return {
238
+ id,
239
+ content: fs.readFileSync(filePath, 'utf8')
240
+ };
241
+ });
242
+
243
+ const content = `
244
+ <session_handoff>
245
+ <metadata>
246
+ <timestamp>${new Date().toISOString()}</timestamp>
247
+ <session_id>${outputSessionId}</session_id>
248
+ <type>audit-comparison</type>
249
+ <target_file>${targetFile}</target_file>
250
+ </metadata>
251
+
252
+ <context>
253
+ <goal>Compare audit findings from multiple agents for ${targetFile}</goal>
254
+ <progress>Aggregated ${auditSessionIds.length} audits</progress>
255
+ <pending_tasks>Review and prioritize findings, decide which issues to fix first</pending_tasks>
256
+ </context>
257
+
258
+ <audit_comparison>
259
+ <note>Each agent audited ${targetFile} against their own skill framework</note>
260
+ ${audits.map(a => ` <agent_audit id="${a.id}">
261
+ ${this._extractContext(a.content)}
262
+ </agent_audit>`).join('\n')}
263
+ </audit_comparison>
264
+
265
+ <recovery_instructions>
266
+ <step1>This session compares audits from: ${auditSessionIds.join(', ')}</step1>
267
+ <step2>Review each agent's findings in audit_comparison above</step2>
268
+ <step3>Note overlapping issues (high priority)</step3>
269
+ <step4>Note unique issues per agent (domain-specific)</step4>
270
+ <step5>Prioritize fixes: overlapping first, then unique critical ones</step5>
271
+ </recovery_instructions>
272
+ </session_handoff>
273
+ `;
274
+
275
+ const outputPath = path.join(this.handoffDir, `${outputSessionId}.md`);
276
+ fs.writeFileSync(outputPath, content.trim());
277
+ return outputPath;
278
+ }
279
+
280
+ // ─── HELPER METHODS ───
281
+
282
+ /**
283
+ * Extracts skills from session content.
284
+ */
285
+ _extractSkills(sessions) {
286
+ const skills = new Set();
287
+ sessions.forEach(s => {
288
+ const skillMatches = s.content.match(/<skill id="(.*?)"/g) || [];
289
+ skillMatches.forEach(match => {
290
+ const skill = match.match(/id="(.*?)"/)[1];
291
+ skills.add(skill);
292
+ });
293
+ });
294
+ return Array.from(skills);
295
+ }
296
+
297
+ /**
298
+ * Extracts context snippet from session.
299
+ */
300
+ _extractContext(content) {
301
+ const goal = content.match(/<goal>(.*?)<\/goal>/)?.[1] || 'Unknown';
302
+ const progress = content.match(/<progress>(.*?)<\/progress>/)?.[1] || 'Unknown';
303
+ const tasks = content.match(/<pending_tasks>(.*?)<\/pending_tasks>/)?.[1] || 'None specified';
304
+ return `Goal: ${goal}\nProgress: ${progress}\nNext: ${tasks}`;
305
+ }
306
+ }