homegraph 1.2.0 → 1.5.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 (560) hide show
  1. package/README.md +48 -11
  2. package/dist/bin/homegraph.js +298 -72
  3. package/dist/bin/homegraph.js.map +1 -1
  4. package/dist/context/index.d.ts.map +1 -1
  5. package/dist/context/index.js +117 -11
  6. package/dist/context/index.js.map +1 -1
  7. package/dist/db/index.d.ts +207 -6
  8. package/dist/db/index.d.ts.map +1 -1
  9. package/dist/db/index.js +461 -20
  10. package/dist/db/index.js.map +1 -1
  11. package/dist/db/migrations.d.ts +1 -1
  12. package/dist/db/migrations.d.ts.map +1 -1
  13. package/dist/db/migrations.js +19 -1
  14. package/dist/db/migrations.js.map +1 -1
  15. package/dist/db/queries.d.ts +157 -3
  16. package/dist/db/queries.d.ts.map +1 -1
  17. package/dist/db/queries.js +426 -9
  18. package/dist/db/queries.js.map +1 -1
  19. package/dist/db/schema.sql +32 -1
  20. package/dist/db/sqlite-adapter.d.ts +24 -17
  21. package/dist/db/sqlite-adapter.d.ts.map +1 -1
  22. package/dist/db/sqlite-adapter.js +292 -36
  23. package/dist/db/sqlite-adapter.js.map +1 -1
  24. package/dist/db/wal-valve.d.ts +119 -0
  25. package/dist/db/wal-valve.d.ts.map +1 -0
  26. package/dist/db/wal-valve.js +290 -0
  27. package/dist/db/wal-valve.js.map +1 -0
  28. package/dist/directory.d.ts +9 -5
  29. package/dist/directory.d.ts.map +1 -1
  30. package/dist/directory.js +210 -19
  31. package/dist/directory.js.map +1 -1
  32. package/dist/extraction/arkts-batch-worker.js +3 -2
  33. package/dist/extraction/arkts-batch-worker.js.map +1 -1
  34. package/dist/extraction/cfml-extractor.d.ts +107 -0
  35. package/dist/extraction/cfml-extractor.d.ts.map +1 -0
  36. package/dist/extraction/cfml-extractor.js +494 -0
  37. package/dist/extraction/cfml-extractor.js.map +1 -0
  38. package/dist/extraction/default-ignore.d.ts +39 -0
  39. package/dist/extraction/default-ignore.d.ts.map +1 -0
  40. package/dist/extraction/default-ignore.js +221 -0
  41. package/dist/extraction/default-ignore.js.map +1 -0
  42. package/dist/extraction/grammars.d.ts +25 -1
  43. package/dist/extraction/grammars.d.ts.map +1 -1
  44. package/dist/extraction/grammars.js +177 -24
  45. package/dist/extraction/grammars.js.map +1 -1
  46. package/dist/extraction/index.d.ts +52 -14
  47. package/dist/extraction/index.d.ts.map +1 -1
  48. package/dist/extraction/index.js +521 -314
  49. package/dist/extraction/index.js.map +1 -1
  50. package/dist/extraction/languages/arkts.d.ts +90 -6
  51. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  52. package/dist/extraction/languages/arkts.js +1579 -128
  53. package/dist/extraction/languages/arkts.js.map +1 -1
  54. package/dist/extraction/languages/c-cpp.d.ts +42 -0
  55. package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
  56. package/dist/extraction/languages/c-cpp.js +369 -4
  57. package/dist/extraction/languages/c-cpp.js.map +1 -1
  58. package/dist/extraction/languages/cfquery.d.ts +12 -0
  59. package/dist/extraction/languages/cfquery.d.ts.map +1 -0
  60. package/dist/extraction/languages/cfquery.js +28 -0
  61. package/dist/extraction/languages/cfquery.js.map +1 -0
  62. package/dist/extraction/languages/cfscript.d.ts +3 -0
  63. package/dist/extraction/languages/cfscript.d.ts.map +1 -0
  64. package/dist/extraction/languages/cfscript.js +73 -0
  65. package/dist/extraction/languages/cfscript.js.map +1 -0
  66. package/dist/extraction/languages/cobol.d.ts +33 -0
  67. package/dist/extraction/languages/cobol.d.ts.map +1 -0
  68. package/dist/extraction/languages/cobol.js +499 -0
  69. package/dist/extraction/languages/cobol.js.map +1 -0
  70. package/dist/extraction/languages/erlang.d.ts +3 -0
  71. package/dist/extraction/languages/erlang.d.ts.map +1 -0
  72. package/dist/extraction/languages/erlang.js +350 -0
  73. package/dist/extraction/languages/erlang.js.map +1 -0
  74. package/dist/extraction/languages/index.d.ts.map +1 -1
  75. package/dist/extraction/languages/index.js +16 -0
  76. package/dist/extraction/languages/index.js.map +1 -1
  77. package/dist/extraction/languages/nix.d.ts +3 -0
  78. package/dist/extraction/languages/nix.d.ts.map +1 -0
  79. package/dist/extraction/languages/nix.js +294 -0
  80. package/dist/extraction/languages/nix.js.map +1 -0
  81. package/dist/extraction/languages/solidity.d.ts +3 -0
  82. package/dist/extraction/languages/solidity.d.ts.map +1 -0
  83. package/dist/extraction/languages/solidity.js +293 -0
  84. package/dist/extraction/languages/solidity.js.map +1 -0
  85. package/dist/extraction/languages/terraform.d.ts +3 -0
  86. package/dist/extraction/languages/terraform.d.ts.map +1 -0
  87. package/dist/extraction/languages/terraform.js +641 -0
  88. package/dist/extraction/languages/terraform.js.map +1 -0
  89. package/dist/extraction/languages/vbnet.d.ts +11 -0
  90. package/dist/extraction/languages/vbnet.d.ts.map +1 -0
  91. package/dist/extraction/languages/vbnet.js +141 -0
  92. package/dist/extraction/languages/vbnet.js.map +1 -0
  93. package/dist/extraction/mybatis-extractor.d.ts +30 -10
  94. package/dist/extraction/mybatis-extractor.d.ts.map +1 -1
  95. package/dist/extraction/mybatis-extractor.js +140 -38
  96. package/dist/extraction/mybatis-extractor.js.map +1 -1
  97. package/dist/extraction/parse-pool.d.ts +27 -1
  98. package/dist/extraction/parse-pool.d.ts.map +1 -1
  99. package/dist/extraction/parse-pool.js +75 -7
  100. package/dist/extraction/parse-pool.js.map +1 -1
  101. package/dist/extraction/parse-worker.js +9 -2
  102. package/dist/extraction/parse-worker.js.map +1 -1
  103. package/dist/extraction/store-worker.d.ts +20 -0
  104. package/dist/extraction/store-worker.d.ts.map +1 -0
  105. package/dist/extraction/store-worker.js +102 -0
  106. package/dist/extraction/store-worker.js.map +1 -0
  107. package/dist/extraction/store-writer.d.ts +48 -0
  108. package/dist/extraction/store-writer.d.ts.map +1 -0
  109. package/dist/extraction/store-writer.js +167 -0
  110. package/dist/extraction/store-writer.js.map +1 -0
  111. package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -1
  112. package/dist/extraction/tree-sitter-helpers.js +1 -0
  113. package/dist/extraction/tree-sitter-helpers.js.map +1 -1
  114. package/dist/extraction/tree-sitter-types.d.ts +3 -1
  115. package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
  116. package/dist/extraction/tree-sitter.d.ts +38 -0
  117. package/dist/extraction/tree-sitter.d.ts.map +1 -1
  118. package/dist/extraction/tree-sitter.js +801 -10
  119. package/dist/extraction/tree-sitter.js.map +1 -1
  120. package/dist/extraction/wasm/tree-sitter-arkts.wasm +0 -0
  121. package/dist/extraction/wasm/tree-sitter-cfml.wasm +0 -0
  122. package/dist/extraction/wasm/tree-sitter-cfquery.wasm +0 -0
  123. package/dist/extraction/wasm/tree-sitter-cfscript.wasm +0 -0
  124. package/dist/extraction/wasm/tree-sitter-cobol.wasm +0 -0
  125. package/dist/extraction/wasm/tree-sitter-erlang.wasm +0 -0
  126. package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
  127. package/dist/extraction/wasm/tree-sitter-terraform.wasm +0 -0
  128. package/dist/extraction/wasm/tree-sitter-vbnet.wasm +0 -0
  129. package/dist/extraction/wasm-runtime-flags.d.ts +14 -4
  130. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
  131. package/dist/extraction/wasm-runtime-flags.js +55 -7
  132. package/dist/extraction/wasm-runtime-flags.js.map +1 -1
  133. package/dist/graph/traversal.d.ts.map +1 -1
  134. package/dist/graph/traversal.js +1 -1
  135. package/dist/graph/traversal.js.map +1 -1
  136. package/dist/index.d.ts +74 -5
  137. package/dist/index.d.ts.map +1 -1
  138. package/dist/index.js +436 -55
  139. package/dist/index.js.map +1 -1
  140. package/dist/installer/index.d.ts +42 -0
  141. package/dist/installer/index.d.ts.map +1 -1
  142. package/dist/installer/index.js +97 -2
  143. package/dist/installer/index.js.map +1 -1
  144. package/dist/mcp/daemon.d.ts +25 -3
  145. package/dist/mcp/daemon.d.ts.map +1 -1
  146. package/dist/mcp/daemon.js +62 -8
  147. package/dist/mcp/daemon.js.map +1 -1
  148. package/dist/mcp/dynamic-boundaries.d.ts.map +1 -1
  149. package/dist/mcp/dynamic-boundaries.js +2 -1
  150. package/dist/mcp/dynamic-boundaries.js.map +1 -1
  151. package/dist/mcp/early-ppid.d.ts +26 -0
  152. package/dist/mcp/early-ppid.d.ts.map +1 -0
  153. package/dist/mcp/early-ppid.js +29 -0
  154. package/dist/mcp/early-ppid.js.map +1 -0
  155. package/dist/mcp/engine.d.ts +4 -5
  156. package/dist/mcp/engine.d.ts.map +1 -1
  157. package/dist/mcp/engine.js +27 -1
  158. package/dist/mcp/engine.js.map +1 -1
  159. package/dist/mcp/index.d.ts.map +1 -1
  160. package/dist/mcp/index.js +41 -6
  161. package/dist/mcp/index.js.map +1 -1
  162. package/dist/mcp/liveness-watchdog.d.ts +18 -1
  163. package/dist/mcp/liveness-watchdog.d.ts.map +1 -1
  164. package/dist/mcp/liveness-watchdog.js +73 -13
  165. package/dist/mcp/liveness-watchdog.js.map +1 -1
  166. package/dist/mcp/memory-budget.d.ts +30 -0
  167. package/dist/mcp/memory-budget.d.ts.map +1 -0
  168. package/dist/mcp/memory-budget.js +123 -0
  169. package/dist/mcp/memory-budget.js.map +1 -0
  170. package/dist/mcp/proxy.d.ts.map +1 -1
  171. package/dist/mcp/proxy.js +88 -4
  172. package/dist/mcp/proxy.js.map +1 -1
  173. package/dist/mcp/query-cache.d.ts +35 -4
  174. package/dist/mcp/query-cache.d.ts.map +1 -1
  175. package/dist/mcp/query-cache.js +89 -19
  176. package/dist/mcp/query-cache.js.map +1 -1
  177. package/dist/mcp/query-pool.d.ts +46 -12
  178. package/dist/mcp/query-pool.d.ts.map +1 -1
  179. package/dist/mcp/query-pool.js +100 -23
  180. package/dist/mcp/query-pool.js.map +1 -1
  181. package/dist/mcp/query-worker.d.ts +2 -2
  182. package/dist/mcp/query-worker.js +2 -2
  183. package/dist/mcp/server-instructions.d.ts +4 -27
  184. package/dist/mcp/server-instructions.d.ts.map +1 -1
  185. package/dist/mcp/server-instructions.js +39 -84
  186. package/dist/mcp/server-instructions.js.map +1 -1
  187. package/dist/mcp/session.d.ts +14 -0
  188. package/dist/mcp/session.d.ts.map +1 -1
  189. package/dist/mcp/session.js +28 -1
  190. package/dist/mcp/session.js.map +1 -1
  191. package/dist/mcp/startup-handshake.d.ts +44 -0
  192. package/dist/mcp/startup-handshake.d.ts.map +1 -0
  193. package/dist/mcp/startup-handshake.js +73 -0
  194. package/dist/mcp/startup-handshake.js.map +1 -0
  195. package/dist/mcp/tools.d.ts +104 -4
  196. package/dist/mcp/tools.d.ts.map +1 -1
  197. package/dist/mcp/tools.js +2432 -217
  198. package/dist/mcp/tools.js.map +1 -1
  199. package/dist/mcp/transport.d.ts.map +1 -1
  200. package/dist/mcp/transport.js +18 -0
  201. package/dist/mcp/transport.js.map +1 -1
  202. package/dist/project-config.d.ts +38 -0
  203. package/dist/project-config.d.ts.map +1 -1
  204. package/dist/project-config.js +101 -2
  205. package/dist/project-config.js.map +1 -1
  206. package/dist/resolution/c-fnptr-synthesizer.d.ts +2 -1
  207. package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
  208. package/dist/resolution/c-fnptr-synthesizer.js +178 -146
  209. package/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
  210. package/dist/resolution/callback-synthesizer.d.ts +54 -10
  211. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  212. package/dist/resolution/callback-synthesizer.js +1299 -257
  213. package/dist/resolution/callback-synthesizer.js.map +1 -1
  214. package/dist/resolution/cooperative-yield.d.ts +10 -2
  215. package/dist/resolution/cooperative-yield.d.ts.map +1 -1
  216. package/dist/resolution/cooperative-yield.js +6 -4
  217. package/dist/resolution/cooperative-yield.js.map +1 -1
  218. package/dist/resolution/frameworks/cics.d.ts +20 -0
  219. package/dist/resolution/frameworks/cics.d.ts.map +1 -0
  220. package/dist/resolution/frameworks/cics.js +90 -0
  221. package/dist/resolution/frameworks/cics.js.map +1 -0
  222. package/dist/resolution/frameworks/go.d.ts.map +1 -1
  223. package/dist/resolution/frameworks/go.js +29 -6
  224. package/dist/resolution/frameworks/go.js.map +1 -1
  225. package/dist/resolution/frameworks/index.d.ts.map +1 -1
  226. package/dist/resolution/frameworks/index.js +3 -0
  227. package/dist/resolution/frameworks/index.js.map +1 -1
  228. package/dist/resolution/frameworks/java.d.ts.map +1 -1
  229. package/dist/resolution/frameworks/java.js +14 -6
  230. package/dist/resolution/frameworks/java.js.map +1 -1
  231. package/dist/resolution/frameworks/terraform.d.ts +38 -0
  232. package/dist/resolution/frameworks/terraform.d.ts.map +1 -0
  233. package/dist/resolution/frameworks/terraform.js +277 -0
  234. package/dist/resolution/frameworks/terraform.js.map +1 -0
  235. package/dist/resolution/goframe-synthesizer.d.ts +2 -1
  236. package/dist/resolution/goframe-synthesizer.d.ts.map +1 -1
  237. package/dist/resolution/goframe-synthesizer.js +8 -3
  238. package/dist/resolution/goframe-synthesizer.js.map +1 -1
  239. package/dist/resolution/import-resolver.d.ts +9 -3
  240. package/dist/resolution/import-resolver.d.ts.map +1 -1
  241. package/dist/resolution/import-resolver.js +295 -11
  242. package/dist/resolution/import-resolver.js.map +1 -1
  243. package/dist/resolution/index.d.ts +146 -8
  244. package/dist/resolution/index.d.ts.map +1 -1
  245. package/dist/resolution/index.js +1089 -131
  246. package/dist/resolution/index.js.map +1 -1
  247. package/dist/resolution/memory-budget.d.ts +48 -0
  248. package/dist/resolution/memory-budget.d.ts.map +1 -0
  249. package/dist/resolution/memory-budget.js +162 -0
  250. package/dist/resolution/memory-budget.js.map +1 -0
  251. package/dist/resolution/name-matcher.d.ts +12 -4
  252. package/dist/resolution/name-matcher.d.ts.map +1 -1
  253. package/dist/resolution/name-matcher.js +793 -130
  254. package/dist/resolution/name-matcher.js.map +1 -1
  255. package/dist/resolution/resolver-pool.d.ts +106 -0
  256. package/dist/resolution/resolver-pool.d.ts.map +1 -0
  257. package/dist/resolution/resolver-pool.js +344 -0
  258. package/dist/resolution/resolver-pool.js.map +1 -0
  259. package/dist/resolution/resolver-worker.d.ts +17 -0
  260. package/dist/resolution/resolver-worker.d.ts.map +1 -0
  261. package/dist/resolution/resolver-worker.js +141 -0
  262. package/dist/resolution/resolver-worker.js.map +1 -0
  263. package/dist/resolution/strip-comments.d.ts +1 -1
  264. package/dist/resolution/strip-comments.d.ts.map +1 -1
  265. package/dist/resolution/strip-comments.js +49 -0
  266. package/dist/resolution/strip-comments.js.map +1 -1
  267. package/dist/resolution/types.d.ts +32 -0
  268. package/dist/resolution/types.d.ts.map +1 -1
  269. package/dist/resolution/workspace-packages.d.ts +10 -0
  270. package/dist/resolution/workspace-packages.d.ts.map +1 -1
  271. package/dist/resolution/workspace-packages.js +142 -4
  272. package/dist/resolution/workspace-packages.js.map +1 -1
  273. package/dist/search/identifier-segments.d.ts +60 -0
  274. package/dist/search/identifier-segments.d.ts.map +1 -0
  275. package/dist/search/identifier-segments.js +176 -0
  276. package/dist/search/identifier-segments.js.map +1 -0
  277. package/dist/search/query-utils.d.ts +201 -0
  278. package/dist/search/query-utils.d.ts.map +1 -1
  279. package/dist/search/query-utils.js +919 -2
  280. package/dist/search/query-utils.js.map +1 -1
  281. package/dist/spec/build/diff-parser.d.ts +55 -0
  282. package/dist/spec/build/diff-parser.d.ts.map +1 -0
  283. package/dist/spec/build/diff-parser.js +205 -0
  284. package/dist/spec/build/diff-parser.js.map +1 -0
  285. package/dist/spec/build/git-scanner.d.ts +93 -0
  286. package/dist/spec/build/git-scanner.d.ts.map +1 -0
  287. package/dist/spec/build/git-scanner.js +254 -0
  288. package/dist/spec/build/git-scanner.js.map +1 -0
  289. package/dist/spec/build/pipeline.d.ts +54 -0
  290. package/dist/spec/build/pipeline.d.ts.map +1 -0
  291. package/dist/spec/build/pipeline.js +170 -0
  292. package/dist/spec/build/pipeline.js.map +1 -0
  293. package/dist/spec/build/scan.d.ts +48 -0
  294. package/dist/spec/build/scan.d.ts.map +1 -0
  295. package/dist/spec/build/scan.js +89 -0
  296. package/dist/spec/build/scan.js.map +1 -0
  297. package/dist/spec/build/scope-resolver.d.ts +50 -0
  298. package/dist/spec/build/scope-resolver.d.ts.map +1 -0
  299. package/dist/spec/build/scope-resolver.js +105 -0
  300. package/dist/spec/build/scope-resolver.js.map +1 -0
  301. package/dist/spec/build/spec-extractor.d.ts +74 -0
  302. package/dist/spec/build/spec-extractor.d.ts.map +1 -0
  303. package/dist/spec/build/spec-extractor.js +344 -0
  304. package/dist/spec/build/spec-extractor.js.map +1 -0
  305. package/dist/spec/config.d.ts +35 -1
  306. package/dist/spec/config.d.ts.map +1 -1
  307. package/dist/spec/config.js +30 -5
  308. package/dist/spec/config.js.map +1 -1
  309. package/dist/spec/db/fts.d.ts.map +1 -1
  310. package/dist/spec/db/fts.js +19 -50
  311. package/dist/spec/db/fts.js.map +1 -1
  312. package/dist/spec/db/index.d.ts +5 -3
  313. package/dist/spec/db/index.d.ts.map +1 -1
  314. package/dist/spec/db/index.js +16 -1
  315. package/dist/spec/db/index.js.map +1 -1
  316. package/dist/spec/db/persist.d.ts +45 -0
  317. package/dist/spec/db/persist.d.ts.map +1 -0
  318. package/dist/spec/db/persist.js +66 -0
  319. package/dist/spec/db/persist.js.map +1 -0
  320. package/dist/spec/db/relations.d.ts +80 -1
  321. package/dist/spec/db/relations.d.ts.map +1 -1
  322. package/dist/spec/db/relations.js +175 -4
  323. package/dist/spec/db/relations.js.map +1 -1
  324. package/dist/spec/db/schema.d.ts +4 -0
  325. package/dist/spec/db/schema.d.ts.map +1 -1
  326. package/dist/spec/db/schema.js +4 -0
  327. package/dist/spec/db/schema.js.map +1 -1
  328. package/dist/spec/db/schema.sql +5 -1
  329. package/dist/spec/db/spec-node.d.ts +5 -0
  330. package/dist/spec/db/spec-node.d.ts.map +1 -1
  331. package/dist/spec/db/spec-node.js +11 -5
  332. package/dist/spec/db/spec-node.js.map +1 -1
  333. package/dist/spec/db/sql-utils.d.ts +11 -0
  334. package/dist/spec/db/sql-utils.d.ts.map +1 -0
  335. package/dist/spec/db/sql-utils.js +19 -0
  336. package/dist/spec/db/sql-utils.js.map +1 -0
  337. package/dist/spec/evolve/cluster-context.d.ts +30 -0
  338. package/dist/spec/evolve/cluster-context.d.ts.map +1 -0
  339. package/dist/spec/evolve/cluster-context.js +78 -0
  340. package/dist/spec/evolve/cluster-context.js.map +1 -0
  341. package/dist/spec/evolve/commit-spec-analyzer.d.ts +51 -0
  342. package/dist/spec/evolve/commit-spec-analyzer.d.ts.map +1 -0
  343. package/dist/spec/evolve/commit-spec-analyzer.js +88 -0
  344. package/dist/spec/evolve/commit-spec-analyzer.js.map +1 -0
  345. package/dist/spec/evolve/commit-spec-persister.d.ts +53 -0
  346. package/dist/spec/evolve/commit-spec-persister.d.ts.map +1 -0
  347. package/dist/spec/evolve/commit-spec-persister.js +93 -0
  348. package/dist/spec/evolve/commit-spec-persister.js.map +1 -0
  349. package/dist/spec/evolve/impact-locator.d.ts +23 -7
  350. package/dist/spec/evolve/impact-locator.d.ts.map +1 -1
  351. package/dist/spec/evolve/impact-locator.js +58 -14
  352. package/dist/spec/evolve/impact-locator.js.map +1 -1
  353. package/dist/spec/evolve/pipeline.d.ts +62 -25
  354. package/dist/spec/evolve/pipeline.d.ts.map +1 -1
  355. package/dist/spec/evolve/pipeline.js +436 -457
  356. package/dist/spec/evolve/pipeline.js.map +1 -1
  357. package/dist/spec/evolve/spec-rewriter.d.ts +13 -13
  358. package/dist/spec/evolve/spec-rewriter.d.ts.map +1 -1
  359. package/dist/spec/evolve/spec-rewriter.js +45 -45
  360. package/dist/spec/evolve/spec-rewriter.js.map +1 -1
  361. package/dist/spec/git/commits.d.ts +85 -0
  362. package/dist/spec/git/commits.d.ts.map +1 -0
  363. package/dist/spec/git/commits.js +218 -0
  364. package/dist/spec/git/commits.js.map +1 -0
  365. package/dist/spec/git/exec.d.ts +13 -0
  366. package/dist/spec/git/exec.d.ts.map +1 -0
  367. package/dist/spec/git/exec.js +19 -0
  368. package/dist/spec/git/exec.js.map +1 -0
  369. package/dist/spec/git/index.d.ts +9 -0
  370. package/dist/spec/git/index.d.ts.map +1 -0
  371. package/dist/spec/git/index.js +22 -0
  372. package/dist/spec/git/index.js.map +1 -0
  373. package/dist/spec/git-utils.d.ts +8 -0
  374. package/dist/spec/git-utils.d.ts.map +1 -0
  375. package/dist/spec/git-utils.js +14 -0
  376. package/dist/spec/git-utils.js.map +1 -0
  377. package/dist/spec/graph/index.d.ts +8 -0
  378. package/dist/spec/graph/index.d.ts.map +1 -0
  379. package/dist/spec/graph/index.js +17 -0
  380. package/dist/spec/graph/index.js.map +1 -0
  381. package/dist/spec/graph/queries.d.ts +6 -35
  382. package/dist/spec/graph/queries.d.ts.map +1 -1
  383. package/dist/spec/graph/queries.js +71 -248
  384. package/dist/spec/graph/queries.js.map +1 -1
  385. package/dist/spec/llm/agent-client.d.ts +59 -0
  386. package/dist/spec/llm/agent-client.d.ts.map +1 -0
  387. package/dist/spec/llm/agent-client.js +213 -0
  388. package/dist/spec/llm/agent-client.js.map +1 -0
  389. package/dist/spec/llm/agents/claude-code.d.ts +32 -0
  390. package/dist/spec/llm/agents/claude-code.d.ts.map +1 -0
  391. package/dist/spec/llm/agents/claude-code.js +125 -0
  392. package/dist/spec/llm/agents/claude-code.js.map +1 -0
  393. package/dist/spec/llm/agents/codex.d.ts +32 -0
  394. package/dist/spec/llm/agents/codex.d.ts.map +1 -0
  395. package/dist/spec/llm/agents/codex.js +145 -0
  396. package/dist/spec/llm/agents/codex.js.map +1 -0
  397. package/dist/spec/llm/agents/detect-utils.d.ts +28 -0
  398. package/dist/spec/llm/agents/detect-utils.d.ts.map +1 -0
  399. package/dist/spec/llm/agents/detect-utils.js +91 -0
  400. package/dist/spec/llm/agents/detect-utils.js.map +1 -0
  401. package/dist/spec/llm/agents/deveco-code.d.ts +33 -0
  402. package/dist/spec/llm/agents/deveco-code.d.ts.map +1 -0
  403. package/dist/spec/llm/agents/deveco-code.js +165 -0
  404. package/dist/spec/llm/agents/deveco-code.js.map +1 -0
  405. package/dist/spec/llm/agents/index.d.ts +31 -0
  406. package/dist/spec/llm/agents/index.d.ts.map +1 -0
  407. package/dist/spec/llm/agents/index.js +65 -0
  408. package/dist/spec/llm/agents/index.js.map +1 -0
  409. package/dist/spec/llm/agents/types.d.ts +76 -0
  410. package/dist/spec/llm/agents/types.d.ts.map +1 -0
  411. package/dist/spec/llm/agents/types.js +15 -0
  412. package/dist/spec/llm/agents/types.js.map +1 -0
  413. package/dist/spec/llm/client.d.ts +31 -11
  414. package/dist/spec/llm/client.d.ts.map +1 -1
  415. package/dist/spec/llm/client.js +143 -81
  416. package/dist/spec/llm/client.js.map +1 -1
  417. package/dist/spec/llm/factory.d.ts +41 -0
  418. package/dist/spec/llm/factory.d.ts.map +1 -0
  419. package/dist/spec/llm/factory.js +80 -0
  420. package/dist/spec/llm/factory.js.map +1 -0
  421. package/dist/spec/llm/prompts.d.ts +24 -8
  422. package/dist/spec/llm/prompts.d.ts.map +1 -1
  423. package/dist/spec/llm/prompts.js +100 -50
  424. package/dist/spec/llm/prompts.js.map +1 -1
  425. package/dist/spec/llm/retry.d.ts +53 -0
  426. package/dist/spec/llm/retry.d.ts.map +1 -0
  427. package/dist/spec/llm/retry.js +153 -0
  428. package/dist/spec/llm/retry.js.map +1 -0
  429. package/dist/spec/mine/clusterer.d.ts +63 -0
  430. package/dist/spec/mine/clusterer.d.ts.map +1 -0
  431. package/dist/spec/mine/clusterer.js +904 -0
  432. package/dist/spec/mine/clusterer.js.map +1 -0
  433. package/dist/spec/mine/clustering/features.d.ts +38 -0
  434. package/dist/spec/mine/clustering/features.d.ts.map +1 -0
  435. package/dist/spec/mine/clustering/features.js +108 -0
  436. package/dist/spec/mine/clustering/features.js.map +1 -0
  437. package/dist/spec/mine/clustering/index.d.ts +62 -0
  438. package/dist/spec/mine/clustering/index.d.ts.map +1 -0
  439. package/dist/spec/mine/clustering/index.js +259 -0
  440. package/dist/spec/mine/clustering/index.js.map +1 -0
  441. package/dist/spec/mine/clustering/leiden.d.ts +61 -0
  442. package/dist/spec/mine/clustering/leiden.d.ts.map +1 -0
  443. package/dist/spec/mine/clustering/leiden.js +489 -0
  444. package/dist/spec/mine/clustering/leiden.js.map +1 -0
  445. package/dist/spec/mine/clustering/text-similarity.d.ts +22 -0
  446. package/dist/spec/mine/clustering/text-similarity.d.ts.map +1 -0
  447. package/dist/spec/mine/clustering/text-similarity.js +98 -0
  448. package/dist/spec/mine/clustering/text-similarity.js.map +1 -0
  449. package/dist/spec/mine/generator.d.ts +54 -0
  450. package/dist/spec/mine/generator.d.ts.map +1 -0
  451. package/dist/spec/mine/generator.js +267 -0
  452. package/dist/spec/mine/generator.js.map +1 -0
  453. package/dist/spec/mine/persist.d.ts +37 -0
  454. package/dist/spec/mine/persist.d.ts.map +1 -0
  455. package/dist/spec/mine/persist.js +170 -0
  456. package/dist/spec/mine/persist.js.map +1 -0
  457. package/dist/spec/mine/pipeline.d.ts +41 -0
  458. package/dist/spec/mine/pipeline.d.ts.map +1 -0
  459. package/dist/spec/mine/pipeline.js +236 -0
  460. package/dist/spec/mine/pipeline.js.map +1 -0
  461. package/dist/spec/mine/progress-handler.d.ts +22 -0
  462. package/dist/spec/mine/progress-handler.d.ts.map +1 -0
  463. package/dist/spec/mine/progress-handler.js +108 -0
  464. package/dist/spec/mine/progress-handler.js.map +1 -0
  465. package/dist/spec/mine/progress.d.ts +23 -0
  466. package/dist/spec/mine/progress.d.ts.map +1 -0
  467. package/dist/spec/mine/progress.js +12 -0
  468. package/dist/spec/mine/progress.js.map +1 -0
  469. package/dist/spec/mine/scanner.d.ts +59 -0
  470. package/dist/spec/mine/scanner.d.ts.map +1 -0
  471. package/dist/spec/mine/scanner.js +383 -0
  472. package/dist/spec/mine/scanner.js.map +1 -0
  473. package/dist/spec/types.d.ts +32 -0
  474. package/dist/spec/types.d.ts.map +1 -1
  475. package/dist/spec/ui/index.d.ts +9 -0
  476. package/dist/spec/ui/index.d.ts.map +1 -0
  477. package/dist/spec/ui/index.js +16 -0
  478. package/dist/spec/ui/index.js.map +1 -0
  479. package/dist/spec/ui/progress-handler.d.ts +33 -0
  480. package/dist/spec/ui/progress-handler.d.ts.map +1 -0
  481. package/dist/spec/ui/progress-handler.js +132 -0
  482. package/dist/spec/ui/progress-handler.js.map +1 -0
  483. package/dist/spec/ui/progress.d.ts +24 -0
  484. package/dist/spec/ui/progress.d.ts.map +1 -0
  485. package/dist/spec/ui/progress.js +13 -0
  486. package/dist/spec/ui/progress.js.map +1 -0
  487. package/dist/spec/utils/fs.d.ts +45 -0
  488. package/dist/spec/utils/fs.d.ts.map +1 -0
  489. package/dist/spec/utils/fs.js +163 -0
  490. package/dist/spec/utils/fs.js.map +1 -0
  491. package/dist/spec/utils/index.d.ts +12 -0
  492. package/dist/spec/utils/index.d.ts.map +1 -0
  493. package/dist/spec/utils/index.js +26 -0
  494. package/dist/spec/utils/index.js.map +1 -0
  495. package/dist/spec/utils/meta.d.ts +32 -0
  496. package/dist/spec/utils/meta.d.ts.map +1 -0
  497. package/dist/spec/utils/meta.js +122 -0
  498. package/dist/spec/utils/meta.js.map +1 -0
  499. package/dist/spec/utils/truncate.d.ts +86 -0
  500. package/dist/spec/utils/truncate.d.ts.map +1 -0
  501. package/dist/spec/utils/truncate.js +172 -0
  502. package/dist/spec/utils/truncate.js.map +1 -0
  503. package/dist/spec/utils.d.ts +4 -16
  504. package/dist/spec/utils.d.ts.map +1 -1
  505. package/dist/spec/utils.js +6 -58
  506. package/dist/spec/utils.js.map +1 -1
  507. package/dist/sync/git-hooks.d.ts.map +1 -1
  508. package/dist/sync/git-hooks.js +2 -0
  509. package/dist/sync/git-hooks.js.map +1 -1
  510. package/dist/sync/watcher.d.ts +35 -6
  511. package/dist/sync/watcher.d.ts.map +1 -1
  512. package/dist/sync/watcher.js +127 -17
  513. package/dist/sync/watcher.js.map +1 -1
  514. package/dist/sync/worktree.d.ts.map +1 -1
  515. package/dist/sync/worktree.js +5 -0
  516. package/dist/sync/worktree.js.map +1 -1
  517. package/dist/telemetry/index.js +3 -3
  518. package/dist/telemetry/index.js.map +1 -1
  519. package/dist/types.d.ts +22 -1
  520. package/dist/types.d.ts.map +1 -1
  521. package/dist/types.js +10 -0
  522. package/dist/types.js.map +1 -1
  523. package/dist/upgrade/index.d.ts +32 -0
  524. package/dist/upgrade/index.d.ts.map +1 -1
  525. package/dist/upgrade/index.js +162 -14
  526. package/dist/upgrade/index.js.map +1 -1
  527. package/dist/upgrade/remove-binary.d.ts +87 -0
  528. package/dist/upgrade/remove-binary.d.ts.map +1 -0
  529. package/dist/upgrade/remove-binary.js +289 -0
  530. package/dist/upgrade/remove-binary.js.map +1 -0
  531. package/dist/upgrade/update-check.d.ts +92 -0
  532. package/dist/upgrade/update-check.d.ts.map +1 -0
  533. package/dist/upgrade/update-check.js +258 -0
  534. package/dist/upgrade/update-check.js.map +1 -0
  535. package/package.json +6 -2
  536. package/scripts/agent-eval/run-all.sh +6 -0
  537. package/scripts/build-bundle.sh +5 -0
  538. package/scripts/npm-shim.js +8 -1
  539. package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-310.pyc +0 -0
  540. package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-310.pyc +0 -0
  541. package/scripts/exp_boundary_eval/__pycache__/deveco_arm.cpython-310.pyc +0 -0
  542. package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-310.pyc +0 -0
  543. package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-310.pyc +0 -0
  544. package/scripts/exp_boundary_eval/__pycache__/setup.cpython-310.pyc +0 -0
  545. package/scripts/exp_boundary_eval/data/agents.json +0 -109
  546. package/scripts/exp_boundary_eval/data/experiments.json +0 -140
  547. package/scripts/qa_eval/README.md +0 -407
  548. package/scripts/qa_eval/_test_deveco_probe.py +0 -41
  549. package/scripts/qa_eval/agent_runner.py +0 -526
  550. package/scripts/qa_eval/data/.gitignore +0 -4
  551. package/scripts/qa_eval/data/test-set.jsonl +0 -2
  552. package/scripts/qa_eval/eval_metrics.py +0 -274
  553. package/scripts/qa_eval/external_agent.py +0 -976
  554. package/scripts/qa_eval/llm_config.py +0 -92
  555. package/scripts/qa_eval/memory_monitor.py +0 -132
  556. package/scripts/qa_eval/my_answer_accuracy.py +0 -187
  557. package/scripts/qa_eval/requirements.txt +0 -2
  558. package/scripts/qa_eval/run_pipeline.py +0 -804
  559. package/scripts/qa_eval/stats_efficiency.py +0 -279
  560. package/scripts/qa_eval/stats_scores.py +0 -207
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Reverse Spec Generator — LLM-driven spec document generation from clusters.
3
+ *
4
+ * For each commit cluster, builds a prompt with AST-level change data and
5
+ * calls the LLM (via the existing `OpenAiLlmClient`) to produce a structured
6
+ * markdown specification. Supports custom templates via `{{placeholder}}`
7
+ * syntax.
8
+ *
9
+ * @module spec/mine/generator
10
+ */
11
+ import { CommitCluster } from './clustering';
12
+ import { LlmClient } from '../llm/client';
13
+ import type { ProgressCallback } from '../ui';
14
+ /** A single generated spec document. */
15
+ export interface GeneratedSpec {
16
+ specId: string;
17
+ title: string;
18
+ content: string;
19
+ clusterId: number;
20
+ commitHashes: string[];
21
+ }
22
+ /** Result of the LLM generation phase. */
23
+ export interface GenerationResult {
24
+ specs: GeneratedSpec[];
25
+ skipped: number;
26
+ errors: number;
27
+ }
28
+ /**
29
+ * Extract the markdown spec document from a chat() response.
30
+ *
31
+ * Headless coding agents (and occasionally chat models) wrap the document
32
+ * in prose ("Here is the spec:") or a ```markdown fence — writing that
33
+ * verbatim would pollute the spec file. Since the spec template always
34
+ * starts with a heading, the extraction is:
35
+ * 1. If a fenced block contains a markdown heading, use its content.
36
+ * 2. Else strip any prose before the first heading line.
37
+ * 3. Otherwise return the response trimmed.
38
+ *
39
+ * Provider-agnostic: applies identically to coding-agent and OpenAI paths.
40
+ */
41
+ export declare function extractMarkdown(raw: string): string;
42
+ /**
43
+ * Generate spec documents for a list of commit clusters.
44
+ *
45
+ * @param clusters - Clusters to generate specs for.
46
+ * @param client - Resolved LLM client (coding agent, configured LLM, or
47
+ * a fallback composite — resolution happens in `llm/factory`).
48
+ * @param outputDir - Directory to write generated spec files.
49
+ * @param templateContent - Optional custom template string.
50
+ * @param onProgress - Optional progress callback (called per cluster).
51
+ * @returns Generation result with generated specs and stats.
52
+ */
53
+ export declare function generateSpecs(clusters: CommitCluster[], client: LlmClient, outputDir: string, templateContent?: string, onProgress?: ProgressCallback): Promise<GenerationResult>;
54
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../../src/spec/mine/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAK1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAM9C,wCAAwC;AACxC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,0CAA0C;AAC1C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AA6GD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsBnD;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,aAAa,EAAE,EACzB,MAAM,EAAE,SAAS,EACjB,SAAS,EAAE,MAAM,EACjB,eAAe,CAAC,EAAE,MAAM,EACxB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAiF3B"}
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ /**
3
+ * Reverse Spec Generator — LLM-driven spec document generation from clusters.
4
+ *
5
+ * For each commit cluster, builds a prompt with AST-level change data and
6
+ * calls the LLM (via the existing `OpenAiLlmClient`) to produce a structured
7
+ * markdown specification. Supports custom templates via `{{placeholder}}`
8
+ * syntax.
9
+ *
10
+ * @module spec/mine/generator
11
+ */
12
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ var desc = Object.getOwnPropertyDescriptor(m, k);
15
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
16
+ desc = { enumerable: true, get: function() { return m[k]; } };
17
+ }
18
+ Object.defineProperty(o, k2, desc);
19
+ }) : (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ o[k2] = m[k];
22
+ }));
23
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
24
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
25
+ }) : function(o, v) {
26
+ o["default"] = v;
27
+ });
28
+ var __importStar = (this && this.__importStar) || (function () {
29
+ var ownKeys = function(o) {
30
+ ownKeys = Object.getOwnPropertyNames || function (o) {
31
+ var ar = [];
32
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
33
+ return ar;
34
+ };
35
+ return ownKeys(o);
36
+ };
37
+ return function (mod) {
38
+ if (mod && mod.__esModule) return mod;
39
+ var result = {};
40
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
41
+ __setModuleDefault(result, mod);
42
+ return result;
43
+ };
44
+ })();
45
+ Object.defineProperty(exports, "__esModule", { value: true });
46
+ exports.extractMarkdown = extractMarkdown;
47
+ exports.generateSpecs = generateSpecs;
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const prompts_1 = require("../llm/prompts");
51
+ const spec_extractor_1 = require("../build/spec-extractor");
52
+ const utils_1 = require("../utils");
53
+ const errors_1 = require("../../errors");
54
+ // ---------------------------------------------------------------------------
55
+ // Prompt Building
56
+ // ---------------------------------------------------------------------------
57
+ /** Maximum characters for the cluster context summary (~12K tokens @ ~0.25 token/char). */
58
+ const MAX_CONTEXT_CHARS = 48000;
59
+ /** Maximum characters per commit symbol list (~1.5K tokens @ ~0.25 token/char). */
60
+ const MAX_SYMBOL_CHARS = 6000;
61
+ /**
62
+ * Build the user prompt with commit-level context from a cluster.
63
+ */
64
+ function buildClusterPrompt(cluster, template) {
65
+ const parts = [];
66
+ parts.push('## Cluster Context');
67
+ parts.push('');
68
+ parts.push(`- ${cluster.commits.length} commits`);
69
+ parts.push(`- Primary files: ${cluster.primaryFiles.join(', ') || '(none)'}`);
70
+ parts.push(`- Primary symbols: ${cluster.primarySymbols.join(', ') || '(none)'}`);
71
+ parts.push('');
72
+ let totalChars = parts.join('\n').length;
73
+ for (const change of cluster.commits) {
74
+ const header = `### ${change.commitHash.slice(0, 7)} — ${change.commitMessage}`;
75
+ if (totalChars + header.length > MAX_CONTEXT_CHARS)
76
+ break;
77
+ const lines = [header, ''];
78
+ for (const fc of change.fileChanges) {
79
+ const fileHeader = `**${fc.filePath}** (${fc.language})${fc.isNewFile ? ' [new file]' : ''}`;
80
+ const symbolLines = [];
81
+ // Format one symbol with kind tag, signature, and visibility.
82
+ // `extra` is an optional suffix appended after the visibility.
83
+ const fmtSym = (marker, sym, extra) => {
84
+ const tag = `[${sym.kind}]`;
85
+ const sig = sym.signature ? ` ${sym.signature}` : '';
86
+ const vis = sym.visibility && sym.visibility !== 'public'
87
+ ? ` (${sym.visibility})` : '';
88
+ const ext = extra ? ` ${extra}` : '';
89
+ return `${marker} ${tag} ${sym.name}${sig}${vis}${ext}`;
90
+ };
91
+ for (const s of fc.addedSymbols) {
92
+ symbolLines.push(fmtSym('+', s));
93
+ }
94
+ for (const s of fc.removedSymbols) {
95
+ symbolLines.push(fmtSym('-', s));
96
+ }
97
+ for (const m of fc.modifiedSymbols) {
98
+ const changes = [];
99
+ if (m.old.signature !== m.new.signature)
100
+ changes.push('sig');
101
+ if (m.old.name !== m.new.name)
102
+ changes.push('name');
103
+ if (m.old.visibility !== m.new.visibility)
104
+ changes.push('vis');
105
+ const extra = changes.length > 0
106
+ ? `(changed: ${changes.join(', ')})`
107
+ : '(changed)';
108
+ symbolLines.push(fmtSym('~', m.new, extra));
109
+ }
110
+ if (symbolLines.length === 0)
111
+ continue;
112
+ const symbolStr = symbolLines.join('\n');
113
+ const truncated = symbolStr.length > MAX_SYMBOL_CHARS
114
+ ? symbolStr.slice(0, MAX_SYMBOL_CHARS) + '\n…'
115
+ : symbolStr;
116
+ const block = `${fileHeader}\n${truncated}`;
117
+ if (totalChars + block.length > MAX_CONTEXT_CHARS)
118
+ break;
119
+ lines.push(block);
120
+ }
121
+ const commitBlock = lines.join('\n');
122
+ if (totalChars + commitBlock.length > MAX_CONTEXT_CHARS)
123
+ break;
124
+ parts.push(commitBlock);
125
+ parts.push('');
126
+ totalChars += commitBlock.length + 1;
127
+ }
128
+ const context = parts.join('\n');
129
+ // Build the full prompt: cluster context + template
130
+ const prompt = [
131
+ 'Use the following commit cluster context to fill in the template below.',
132
+ '',
133
+ context,
134
+ '',
135
+ '---',
136
+ '',
137
+ 'Fill in this template:',
138
+ '',
139
+ template,
140
+ ].join('\n');
141
+ return prompt;
142
+ }
143
+ // ---------------------------------------------------------------------------
144
+ // Markdown Extraction
145
+ // ---------------------------------------------------------------------------
146
+ /**
147
+ * Extract the markdown spec document from a chat() response.
148
+ *
149
+ * Headless coding agents (and occasionally chat models) wrap the document
150
+ * in prose ("Here is the spec:") or a ```markdown fence — writing that
151
+ * verbatim would pollute the spec file. Since the spec template always
152
+ * starts with a heading, the extraction is:
153
+ * 1. If a fenced block contains a markdown heading, use its content.
154
+ * 2. Else strip any prose before the first heading line.
155
+ * 3. Otherwise return the response trimmed.
156
+ *
157
+ * Provider-agnostic: applies identically to coding-agent and OpenAI paths.
158
+ */
159
+ function extractMarkdown(raw) {
160
+ const text = raw.trim();
161
+ if (!text)
162
+ return '';
163
+ // Fast path: already a clean markdown document. Also guards against
164
+ // misfiring on code fences INSIDE a document (e.g. a bash comment like
165
+ // "# do something" would otherwise look like a wrapped document).
166
+ if (/^#\s/.test(text))
167
+ return text;
168
+ // 1. Whole-document fence wrapper containing a heading
169
+ const fenceMatch = /```(?:markdown|md)?\s*\n([\s\S]*?)```/.exec(text);
170
+ if (fenceMatch && /^#\s/m.test(fenceMatch[1])) {
171
+ return fenceMatch[1].trim();
172
+ }
173
+ // 2. Prose preamble before the first heading
174
+ const headingMatch = /^#\s.*$/m.exec(text);
175
+ if (headingMatch) {
176
+ return text.slice(headingMatch.index).trim();
177
+ }
178
+ return text;
179
+ }
180
+ // ---------------------------------------------------------------------------
181
+ // Spec Generation
182
+ // ---------------------------------------------------------------------------
183
+ /**
184
+ * Generate spec documents for a list of commit clusters.
185
+ *
186
+ * @param clusters - Clusters to generate specs for.
187
+ * @param client - Resolved LLM client (coding agent, configured LLM, or
188
+ * a fallback composite — resolution happens in `llm/factory`).
189
+ * @param outputDir - Directory to write generated spec files.
190
+ * @param templateContent - Optional custom template string.
191
+ * @param onProgress - Optional progress callback (called per cluster).
192
+ * @returns Generation result with generated specs and stats.
193
+ */
194
+ async function generateSpecs(clusters, client, outputDir, templateContent, onProgress) {
195
+ // Use custom template if provided, otherwise use default
196
+ const effectiveTemplate = templateContent || prompts_1.DEFAULT_SPEC_TEMPLATE;
197
+ // Ensure output directory exists
198
+ fs.mkdirSync(outputDir, { recursive: true });
199
+ const specs = [];
200
+ let skipped = 0;
201
+ let errors = 0;
202
+ const total = clusters.length;
203
+ for (let ci = 0; ci < clusters.length; ci++) {
204
+ const cluster = clusters[ci];
205
+ const specId = `spec_${cluster.timeRange.end}`;
206
+ const msg = `${specId} (${cluster.commits.length} commits)`;
207
+ onProgress?.({
208
+ phase: 'generating',
209
+ current: ci + 1,
210
+ total,
211
+ message: msg,
212
+ });
213
+ (0, errors_1.logDebug)('Generating spec for cluster', {
214
+ specId,
215
+ commitCount: cluster.commits.length,
216
+ });
217
+ const userPrompt = buildClusterPrompt(cluster, effectiveTemplate);
218
+ let raw;
219
+ try {
220
+ raw = await client.chat(prompts_1.SPEC_GENERATION_SYSTEM_PROMPT, userPrompt);
221
+ }
222
+ catch (err) {
223
+ (0, errors_1.logWarn)(`LLM call failed for ${specId}`, {
224
+ error: err instanceof Error ? err.message : String(err),
225
+ });
226
+ errors++;
227
+ continue;
228
+ }
229
+ if (!raw || raw.trim().length === 0) {
230
+ (0, errors_1.logWarn)(`LLM returned empty response for ${specId}`);
231
+ skipped++;
232
+ continue;
233
+ }
234
+ // Unwrap fences / strip prose preamble before persisting
235
+ const content = extractMarkdown(raw);
236
+ if (!content) {
237
+ (0, errors_1.logWarn)(`LLM response had no extractable markdown for ${specId}`);
238
+ skipped++;
239
+ continue;
240
+ }
241
+ const title = (0, spec_extractor_1.extractTitleFromMarkdown)(content, 'Untitled Spec');
242
+ const commitHashes = cluster.commits.map((c) => c.commitHash);
243
+ const spec = {
244
+ specId,
245
+ title,
246
+ content,
247
+ clusterId: cluster.id,
248
+ commitHashes,
249
+ };
250
+ // Write to output directory
251
+ const fileName = `${specId}.md`;
252
+ const outputPath = path.join(outputDir, fileName);
253
+ try {
254
+ (0, utils_1.writeFileContent)(outputPath, content);
255
+ (0, errors_1.logDebug)('Wrote spec file', { path: outputPath });
256
+ specs.push(spec);
257
+ }
258
+ catch (err) {
259
+ (0, errors_1.logWarn)(`Failed to write spec file ${outputPath}`, {
260
+ error: err instanceof Error ? err.message : String(err),
261
+ });
262
+ errors++;
263
+ }
264
+ }
265
+ return { specs, skipped, errors };
266
+ }
267
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/spec/mine/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Mine Persist — writes `spec mine` results into commit4spec.db.
3
+ *
4
+ * For each generated spec, persists a SpecNode, all linked CommitNodes,
5
+ * per-file DiffFragments as CodeFragmentNodes, and the corresponding
6
+ * spec_commit / commit_fragment relations.
7
+ *
8
+ * Reuses the existing DB persistence infrastructure from `src/spec/db/`.
9
+ *
10
+ * @module spec/mine/persist
11
+ */
12
+ import { SqliteDatabase } from '../../db/sqlite-adapter';
13
+ import { GeneratedSpec } from './generator';
14
+ import { CommitCluster } from './clustering';
15
+ import type { ProgressCallback } from '../ui';
16
+ export interface PersistResult {
17
+ specsWritten: number;
18
+ commitsWritten: number;
19
+ fragmentsWritten: number;
20
+ relationsWritten: number;
21
+ }
22
+ /**
23
+ * Persist `spec mine` results to the commit4spec.db knowledge graph.
24
+ *
25
+ * Idempotent — INSERT OR REPLACE / INSERT OR IGNORE semantics ensure
26
+ * re-running the pipeline against the same commits is safe.
27
+ *
28
+ * @param db - Open SQLite database handle.
29
+ * @param repoPath - Path to the git repository.
30
+ * @param specs - Generated specs from the LLM phase.
31
+ * @param clusters - Commit clusters (must align with specs by clusterId).
32
+ * @param outputDir - Directory where generated spec markdown files were written.
33
+ * @param onProgress - Optional progress callback (called per spec).
34
+ * @returns Counts of written nodes and relations.
35
+ */
36
+ export declare function persistToGraph(db: SqliteDatabase, repoPath: string, specs: GeneratedSpec[], clusters: CommitCluster[], outputDir: string, onProgress?: ProgressCallback): PersistResult;
37
+ //# sourceMappingURL=persist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../../src/spec/mine/persist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAYzD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAM9C,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,aAAa,EAAE,EACtB,QAAQ,EAAE,aAAa,EAAE,EACzB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,aAAa,CAuGf"}
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ /**
3
+ * Mine Persist — writes `spec mine` results into commit4spec.db.
4
+ *
5
+ * For each generated spec, persists a SpecNode, all linked CommitNodes,
6
+ * per-file DiffFragments as CodeFragmentNodes, and the corresponding
7
+ * spec_commit / commit_fragment relations.
8
+ *
9
+ * Reuses the existing DB persistence infrastructure from `src/spec/db/`.
10
+ *
11
+ * @module spec/mine/persist
12
+ */
13
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ var desc = Object.getOwnPropertyDescriptor(m, k);
16
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
17
+ desc = { enumerable: true, get: function() { return m[k]; } };
18
+ }
19
+ Object.defineProperty(o, k2, desc);
20
+ }) : (function(o, m, k, k2) {
21
+ if (k2 === undefined) k2 = k;
22
+ o[k2] = m[k];
23
+ }));
24
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
25
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
26
+ }) : function(o, v) {
27
+ o["default"] = v;
28
+ });
29
+ var __importStar = (this && this.__importStar) || (function () {
30
+ var ownKeys = function(o) {
31
+ ownKeys = Object.getOwnPropertyNames || function (o) {
32
+ var ar = [];
33
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
34
+ return ar;
35
+ };
36
+ return ownKeys(o);
37
+ };
38
+ return function (mod) {
39
+ if (mod && mod.__esModule) return mod;
40
+ var result = {};
41
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
42
+ __setModuleDefault(result, mod);
43
+ return result;
44
+ };
45
+ })();
46
+ Object.defineProperty(exports, "__esModule", { value: true });
47
+ exports.persistToGraph = persistToGraph;
48
+ const path = __importStar(require("path"));
49
+ const commit_node_1 = require("../db/commit-node");
50
+ const fragment_node_1 = require("../db/fragment-node");
51
+ const relations_1 = require("../db/relations");
52
+ const persist_1 = require("../db/persist");
53
+ const schema_1 = require("../db/schema");
54
+ const diff_parser_1 = require("../build/diff-parser");
55
+ const spec_extractor_1 = require("../build/spec-extractor");
56
+ const errors_1 = require("../../errors");
57
+ // ---------------------------------------------------------------------------
58
+ // persistToGraph
59
+ // ---------------------------------------------------------------------------
60
+ /**
61
+ * Persist `spec mine` results to the commit4spec.db knowledge graph.
62
+ *
63
+ * Idempotent — INSERT OR REPLACE / INSERT OR IGNORE semantics ensure
64
+ * re-running the pipeline against the same commits is safe.
65
+ *
66
+ * @param db - Open SQLite database handle.
67
+ * @param repoPath - Path to the git repository.
68
+ * @param specs - Generated specs from the LLM phase.
69
+ * @param clusters - Commit clusters (must align with specs by clusterId).
70
+ * @param outputDir - Directory where generated spec markdown files were written.
71
+ * @param onProgress - Optional progress callback (called per spec).
72
+ * @returns Counts of written nodes and relations.
73
+ */
74
+ function persistToGraph(db, repoPath, specs, clusters, outputDir, onProgress) {
75
+ // Ensure schema exists (idempotent)
76
+ (0, schema_1.initSpecSchema)(db);
77
+ // Build a lookup map: clusterId → CommitCluster
78
+ const clusterMap = new Map();
79
+ for (const c of clusters) {
80
+ clusterMap.set(c.id, c);
81
+ }
82
+ // Deduplication — commits can appear in multiple clusters (low threshold)
83
+ const seenCommitHashes = new Set();
84
+ let specsWritten = 0;
85
+ let commitsWritten = 0;
86
+ let fragmentsWritten = 0;
87
+ let relationsWritten = 0;
88
+ const totalSpecs = specs.length;
89
+ for (let si = 0; si < specs.length; si++) {
90
+ const spec = specs[si];
91
+ onProgress?.({
92
+ phase: 'persisting',
93
+ current: si + 1,
94
+ total: totalSpecs,
95
+ message: spec.specId,
96
+ });
97
+ const cluster = clusterMap.get(spec.clusterId);
98
+ if (!cluster) {
99
+ (0, errors_1.logDebug)('persistToGraph: spec has no matching cluster', {
100
+ specId: spec.specId,
101
+ clusterId: spec.clusterId,
102
+ });
103
+ continue;
104
+ }
105
+ // ---- SpecNode ----
106
+ (0, persist_1.upsertSpecFromMetadata)(db, {
107
+ specId: spec.specId,
108
+ title: (0, spec_extractor_1.extractTitleFromMarkdown)(spec.content, spec.specId),
109
+ subtitles: (0, spec_extractor_1.extractMarkdownHeadings)(spec.content),
110
+ filePath: path.join(outputDir, `${spec.specId}.md`),
111
+ }, cluster.timeRange.end);
112
+ specsWritten++;
113
+ // ---- Commits & Fragments ----
114
+ // Collect all file paths referenced in this commit's FileChanges for filtering
115
+ // fragments to only relevant files (avoids inserting irrelevant diff hunks).
116
+ const relevantFiles = new Set();
117
+ for (const cc of cluster.commits) {
118
+ for (const fc of cc.fileChanges) {
119
+ relevantFiles.add(fc.filePath);
120
+ }
121
+ }
122
+ for (const cc of cluster.commits) {
123
+ // CommitNode — must be inserted before the relation because
124
+ // SQLite enforces FOREIGN KEY constraints eagerly and
125
+ // INSERT OR IGNORE throws on FK violations in Node's SQLite.
126
+ if (!seenCommitHashes.has(cc.commitHash)) {
127
+ seenCommitHashes.add(cc.commitHash);
128
+ const commitNode = {
129
+ hash: cc.commitHash,
130
+ message: cc.commitMessage,
131
+ author: cc.author,
132
+ timestamp: cc.timestamp,
133
+ };
134
+ (0, commit_node_1.insertCommitNode)(db, commitNode);
135
+ commitsWritten++;
136
+ }
137
+ // Spec → Commit relation
138
+ (0, relations_1.insertSpecCommitRelation)(db, spec.specId, cc.commitHash, 'SUMMARIZED_FROM');
139
+ relationsWritten++;
140
+ // Diff fragments — only files that appear in this commit's AST changes.
141
+ // Skip git diff if fragments were already persisted in a previous run.
142
+ const existingFragments = (0, fragment_node_1.findFragmentsByCommit)(db, cc.commitHash);
143
+ if (existingFragments.length > 0) {
144
+ for (const frag of existingFragments) {
145
+ if (!relevantFiles.has(frag.filePath))
146
+ continue;
147
+ (0, relations_1.insertCommitFragmentRelation)(db, cc.commitHash, frag.id, 'CONTAINS');
148
+ relationsWritten++;
149
+ }
150
+ }
151
+ else {
152
+ let fragments;
153
+ try {
154
+ fragments = (0, diff_parser_1.analyzeCommitDiff)(repoPath, cc.commitHash);
155
+ }
156
+ catch (err) {
157
+ (0, errors_1.logWarn)(`persistToGraph: analyzeCommitDiff failed for ${cc.commitHash.slice(0, 7)}`, {
158
+ error: err instanceof Error ? err.message : String(err),
159
+ });
160
+ continue;
161
+ }
162
+ const persisted = (0, persist_1.persistCommitFragments)(db, cc.commitHash, fragments, relevantFiles);
163
+ fragmentsWritten += persisted.fragmentsInserted;
164
+ relationsWritten += persisted.relationsCreated;
165
+ }
166
+ }
167
+ }
168
+ return { specsWritten, commitsWritten, fragmentsWritten, relationsWritten };
169
+ }
170
+ //# sourceMappingURL=persist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist.js","sourceRoot":"","sources":["../../../src/spec/mine/persist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Mine Pipeline — orchestrates the `spec mine` flow.
3
+ *
4
+ * Three-stage pipeline:
5
+ * 1. Scan commits (AST-level diff extraction)
6
+ * 2. Cluster commits (multi-signal graph clustering)
7
+ * 3. Generate specs (LLM-driven spec documents)
8
+ *
9
+ * Integrates with the existing meta.json anchor for incremental runs.
10
+ *
11
+ * @module spec/mine/pipeline
12
+ */
13
+ import { LLMConfig, MineConfig } from '../config';
14
+ import { SqliteDatabase } from '../../db/sqlite-adapter';
15
+ import type { ProgressCallback } from '../ui';
16
+ /** Result returned by the mine pipeline. */
17
+ export interface MinePipelineResult {
18
+ commitsScanned: number;
19
+ changesFound: number;
20
+ clusters: number;
21
+ specsGenerated: number;
22
+ skippedClusters: number;
23
+ specsWritten: number;
24
+ commitsWritten: number;
25
+ fragmentsWritten: number;
26
+ relationsWritten: number;
27
+ errors: string[];
28
+ }
29
+ /**
30
+ * Run the full reverse-spec pipeline.
31
+ *
32
+ * @param repoPath - Path to the git repository.
33
+ * @param config - Reverse pipeline configuration.
34
+ * @param llmConfig - LLM configuration (may be null when a coding agent
35
+ * — Claude Code / Codex — is available, or when skipLlm is true).
36
+ * @param db - Optional SQLite database handle for persistence.
37
+ * @param onProgress - Optional progress callback for real-time feedback.
38
+ * @returns Pipeline result with stats.
39
+ */
40
+ export declare function runMinePipeline(repoPath: string, config: MineConfig, llmConfig: LLMConfig | null, db?: SqliteDatabase | null, onProgress?: ProgressCallback): Promise<MinePipelineResult>;
41
+ //# sourceMappingURL=pipeline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/spec/mine/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAQlD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAM9C,4CAA4C;AAC5C,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,SAAS,GAAG,IAAI,EAC3B,EAAE,GAAE,cAAc,GAAG,IAAW,EAChC,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CA+M7B"}