homegraph 1.1.2 → 1.2.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 (361) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +268 -243
  3. package/dist/arkts/ohos-api-index.d.ts +15 -0
  4. package/dist/arkts/ohos-api-index.d.ts.map +1 -0
  5. package/dist/arkts/ohos-api-index.js +190 -0
  6. package/dist/arkts/ohos-api-index.js.map +1 -0
  7. package/dist/arkts/ohos-sdk-input.d.ts +36 -0
  8. package/dist/arkts/ohos-sdk-input.d.ts.map +1 -0
  9. package/dist/arkts/ohos-sdk-input.js +214 -0
  10. package/dist/arkts/ohos-sdk-input.js.map +1 -0
  11. package/dist/bin/command-supervision.d.ts +12 -0
  12. package/dist/bin/command-supervision.d.ts.map +1 -0
  13. package/dist/bin/command-supervision.js +86 -0
  14. package/dist/bin/command-supervision.js.map +1 -0
  15. package/dist/bin/homegraph.d.ts +1 -1
  16. package/dist/bin/homegraph.js +971 -71
  17. package/dist/bin/homegraph.js.map +1 -1
  18. package/dist/db/index.d.ts +20 -0
  19. package/dist/db/index.d.ts.map +1 -1
  20. package/dist/db/index.js +39 -0
  21. package/dist/db/index.js.map +1 -1
  22. package/dist/db/migrations.d.ts +1 -1
  23. package/dist/db/migrations.d.ts.map +1 -1
  24. package/dist/db/migrations.js +58 -19
  25. package/dist/db/migrations.js.map +1 -1
  26. package/dist/db/queries.d.ts +14 -0
  27. package/dist/db/queries.d.ts.map +1 -1
  28. package/dist/db/queries.js +314 -143
  29. package/dist/db/queries.js.map +1 -1
  30. package/dist/db/schema.sql +172 -152
  31. package/dist/directory.d.ts +32 -0
  32. package/dist/directory.d.ts.map +1 -1
  33. package/dist/directory.js +88 -5
  34. package/dist/directory.js.map +1 -1
  35. package/dist/extraction/arkts-batch-worker.d.ts +2 -0
  36. package/dist/extraction/arkts-batch-worker.d.ts.map +1 -0
  37. package/dist/extraction/arkts-batch-worker.js +28 -0
  38. package/dist/extraction/arkts-batch-worker.js.map +1 -0
  39. package/dist/extraction/context.d.ts +11 -0
  40. package/dist/extraction/context.d.ts.map +1 -1
  41. package/dist/extraction/context.js +20 -0
  42. package/dist/extraction/context.js.map +1 -1
  43. package/dist/extraction/index.d.ts +16 -2
  44. package/dist/extraction/index.d.ts.map +1 -1
  45. package/dist/extraction/index.js +619 -380
  46. package/dist/extraction/index.js.map +1 -1
  47. package/dist/extraction/languages/arkts-state-decorators.d.ts +13 -0
  48. package/dist/extraction/languages/arkts-state-decorators.d.ts.map +1 -0
  49. package/dist/extraction/languages/arkts-state-decorators.js +26 -0
  50. package/dist/extraction/languages/arkts-state-decorators.js.map +1 -0
  51. package/dist/extraction/languages/arkts-viewtree.d.ts +4 -2
  52. package/dist/extraction/languages/arkts-viewtree.d.ts.map +1 -1
  53. package/dist/extraction/languages/arkts-viewtree.js +21 -6
  54. package/dist/extraction/languages/arkts-viewtree.js.map +1 -1
  55. package/dist/extraction/languages/arkts.d.ts +98 -2
  56. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  57. package/dist/extraction/languages/arkts.js +1290 -61
  58. package/dist/extraction/languages/arkts.js.map +1 -1
  59. package/dist/extraction/languages/c-cpp.d.ts +56 -0
  60. package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
  61. package/dist/extraction/languages/c-cpp.js +198 -1
  62. package/dist/extraction/languages/c-cpp.js.map +1 -1
  63. package/dist/extraction/languages/ohos-api-consumer.d.ts +34 -0
  64. package/dist/extraction/languages/ohos-api-consumer.d.ts.map +1 -0
  65. package/dist/extraction/languages/ohos-api-consumer.js +283 -0
  66. package/dist/extraction/languages/ohos-api-consumer.js.map +1 -0
  67. package/dist/extraction/parse-pool.d.ts +126 -0
  68. package/dist/extraction/parse-pool.d.ts.map +1 -0
  69. package/dist/extraction/parse-pool.js +319 -0
  70. package/dist/extraction/parse-pool.js.map +1 -0
  71. package/dist/extraction/tree-sitter-types.d.ts +17 -0
  72. package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
  73. package/dist/extraction/tree-sitter.d.ts +21 -0
  74. package/dist/extraction/tree-sitter.d.ts.map +1 -1
  75. package/dist/extraction/tree-sitter.js +198 -27
  76. package/dist/extraction/tree-sitter.js.map +1 -1
  77. package/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
  78. package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
  79. package/dist/graph/traversal.d.ts.map +1 -1
  80. package/dist/graph/traversal.js +76 -17
  81. package/dist/graph/traversal.js.map +1 -1
  82. package/dist/index.d.ts +25 -0
  83. package/dist/index.d.ts.map +1 -1
  84. package/dist/index.js +78 -4
  85. package/dist/index.js.map +1 -1
  86. package/dist/installer/instructions-template.js +9 -9
  87. package/dist/installer/targets/shared.d.ts +5 -6
  88. package/dist/installer/targets/shared.d.ts.map +1 -1
  89. package/dist/installer/targets/shared.js +5 -6
  90. package/dist/installer/targets/shared.js.map +1 -1
  91. package/dist/mcp/daemon-paths.d.ts +30 -3
  92. package/dist/mcp/daemon-paths.d.ts.map +1 -1
  93. package/dist/mcp/daemon-paths.js +50 -10
  94. package/dist/mcp/daemon-paths.js.map +1 -1
  95. package/dist/mcp/daemon-registry.d.ts.map +1 -1
  96. package/dist/mcp/daemon-registry.js +7 -3
  97. package/dist/mcp/daemon-registry.js.map +1 -1
  98. package/dist/mcp/daemon.d.ts +48 -0
  99. package/dist/mcp/daemon.d.ts.map +1 -1
  100. package/dist/mcp/daemon.js +196 -32
  101. package/dist/mcp/daemon.js.map +1 -1
  102. package/dist/mcp/engine.d.ts +17 -0
  103. package/dist/mcp/engine.d.ts.map +1 -1
  104. package/dist/mcp/engine.js +73 -1
  105. package/dist/mcp/engine.js.map +1 -1
  106. package/dist/mcp/index.d.ts.map +1 -1
  107. package/dist/mcp/index.js +25 -43
  108. package/dist/mcp/index.js.map +1 -1
  109. package/dist/mcp/liveness-watchdog.js +16 -16
  110. package/dist/mcp/ppid-watchdog.d.ts +18 -0
  111. package/dist/mcp/ppid-watchdog.d.ts.map +1 -1
  112. package/dist/mcp/ppid-watchdog.js +37 -0
  113. package/dist/mcp/ppid-watchdog.js.map +1 -1
  114. package/dist/mcp/query-cache.d.ts +25 -0
  115. package/dist/mcp/query-cache.d.ts.map +1 -0
  116. package/dist/mcp/query-cache.js +191 -0
  117. package/dist/mcp/query-cache.js.map +1 -0
  118. package/dist/mcp/query-pool.d.ts +94 -0
  119. package/dist/mcp/query-pool.d.ts.map +1 -0
  120. package/dist/mcp/query-pool.js +297 -0
  121. package/dist/mcp/query-pool.js.map +1 -0
  122. package/dist/mcp/query-worker.d.ts +24 -0
  123. package/dist/mcp/query-worker.d.ts.map +1 -0
  124. package/dist/mcp/query-worker.js +87 -0
  125. package/dist/mcp/query-worker.js.map +1 -0
  126. package/dist/mcp/server-instructions.d.ts +5 -7
  127. package/dist/mcp/server-instructions.d.ts.map +1 -1
  128. package/dist/mcp/server-instructions.js +72 -74
  129. package/dist/mcp/server-instructions.js.map +1 -1
  130. package/dist/mcp/tools.d.ts +94 -4
  131. package/dist/mcp/tools.d.ts.map +1 -1
  132. package/dist/mcp/tools.js +877 -71
  133. package/dist/mcp/tools.js.map +1 -1
  134. package/dist/project-config.d.ts +20 -0
  135. package/dist/project-config.d.ts.map +1 -1
  136. package/dist/project-config.js +42 -2
  137. package/dist/project-config.js.map +1 -1
  138. package/dist/reasoning/login.js +1 -1
  139. package/dist/reasoning/login.js.map +1 -1
  140. package/dist/reasoning/reasoner.js +32 -32
  141. package/dist/resolution/c-fnptr-synthesizer.d.ts +0 -28
  142. package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
  143. package/dist/resolution/c-fnptr-synthesizer.js +765 -79
  144. package/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
  145. package/dist/resolution/callback-synthesizer.d.ts +1 -1
  146. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  147. package/dist/resolution/callback-synthesizer.js +72 -11
  148. package/dist/resolution/callback-synthesizer.js.map +1 -1
  149. package/dist/resolution/cooperative-yield.d.ts +32 -0
  150. package/dist/resolution/cooperative-yield.d.ts.map +1 -0
  151. package/dist/resolution/cooperative-yield.js +42 -0
  152. package/dist/resolution/cooperative-yield.js.map +1 -0
  153. package/dist/resolution/index.d.ts +11 -2
  154. package/dist/resolution/index.d.ts.map +1 -1
  155. package/dist/resolution/index.js +72 -4
  156. package/dist/resolution/index.js.map +1 -1
  157. package/dist/resolution/name-matcher.d.ts +22 -0
  158. package/dist/resolution/name-matcher.d.ts.map +1 -1
  159. package/dist/resolution/name-matcher.js +317 -20
  160. package/dist/resolution/name-matcher.js.map +1 -1
  161. package/dist/spec/config.d.ts +39 -0
  162. package/dist/spec/config.d.ts.map +1 -0
  163. package/dist/spec/config.js +304 -0
  164. package/dist/spec/config.js.map +1 -0
  165. package/dist/spec/db/commit-node.d.ts +23 -0
  166. package/dist/spec/db/commit-node.d.ts.map +1 -0
  167. package/dist/spec/db/commit-node.js +62 -0
  168. package/dist/spec/db/commit-node.js.map +1 -0
  169. package/dist/spec/db/fragment-node.d.ts +24 -0
  170. package/dist/spec/db/fragment-node.d.ts.map +1 -0
  171. package/dist/spec/db/fragment-node.js +128 -0
  172. package/dist/spec/db/fragment-node.js.map +1 -0
  173. package/dist/spec/db/fts.d.ts +74 -0
  174. package/dist/spec/db/fts.d.ts.map +1 -0
  175. package/dist/spec/db/fts.js +324 -0
  176. package/dist/spec/db/fts.js.map +1 -0
  177. package/dist/spec/db/index.d.ts +13 -0
  178. package/dist/spec/db/index.d.ts.map +1 -0
  179. package/dist/spec/db/index.js +50 -0
  180. package/dist/spec/db/index.js.map +1 -0
  181. package/dist/spec/db/relations.d.ts +55 -0
  182. package/dist/spec/db/relations.d.ts.map +1 -0
  183. package/dist/spec/db/relations.js +158 -0
  184. package/dist/spec/db/relations.js.map +1 -0
  185. package/dist/spec/db/schema.d.ts +33 -0
  186. package/dist/spec/db/schema.d.ts.map +1 -0
  187. package/dist/spec/db/schema.js +119 -0
  188. package/dist/spec/db/schema.js.map +1 -0
  189. package/dist/spec/db/schema.sql +117 -0
  190. package/dist/spec/db/spec-node.d.ts +41 -0
  191. package/dist/spec/db/spec-node.d.ts.map +1 -0
  192. package/dist/spec/db/spec-node.js +114 -0
  193. package/dist/spec/db/spec-node.js.map +1 -0
  194. package/dist/spec/evolve/impact-locator.d.ts +13 -0
  195. package/dist/spec/evolve/impact-locator.d.ts.map +1 -0
  196. package/dist/spec/evolve/impact-locator.js +25 -0
  197. package/dist/spec/evolve/impact-locator.js.map +1 -0
  198. package/dist/spec/evolve/llm-client.d.ts +50 -0
  199. package/dist/spec/evolve/llm-client.d.ts.map +1 -0
  200. package/dist/spec/evolve/llm-client.js +176 -0
  201. package/dist/spec/evolve/llm-client.js.map +1 -0
  202. package/dist/spec/evolve/logic-checker.d.ts +12 -0
  203. package/dist/spec/evolve/logic-checker.d.ts.map +1 -0
  204. package/dist/spec/evolve/logic-checker.js +24 -0
  205. package/dist/spec/evolve/logic-checker.js.map +1 -0
  206. package/dist/spec/evolve/pipeline.d.ts +42 -0
  207. package/dist/spec/evolve/pipeline.d.ts.map +1 -0
  208. package/dist/spec/evolve/pipeline.js +567 -0
  209. package/dist/spec/evolve/pipeline.js.map +1 -0
  210. package/dist/spec/evolve/spec-rewriter.d.ts +42 -0
  211. package/dist/spec/evolve/spec-rewriter.d.ts.map +1 -0
  212. package/dist/spec/evolve/spec-rewriter.js +230 -0
  213. package/dist/spec/evolve/spec-rewriter.js.map +1 -0
  214. package/dist/spec/graph/queries.d.ts +155 -0
  215. package/dist/spec/graph/queries.d.ts.map +1 -0
  216. package/dist/spec/graph/queries.js +440 -0
  217. package/dist/spec/graph/queries.js.map +1 -0
  218. package/dist/spec/llm/client.d.ts +29 -0
  219. package/dist/spec/llm/client.d.ts.map +1 -0
  220. package/dist/spec/llm/client.js +123 -0
  221. package/dist/spec/llm/client.js.map +1 -0
  222. package/dist/spec/llm/index.d.ts +3 -0
  223. package/dist/spec/llm/index.d.ts.map +1 -0
  224. package/dist/spec/llm/index.js +11 -0
  225. package/dist/spec/llm/index.js.map +1 -0
  226. package/dist/spec/llm/prompts.d.ts +13 -0
  227. package/dist/spec/llm/prompts.d.ts.map +1 -0
  228. package/dist/spec/llm/prompts.js +75 -0
  229. package/dist/spec/llm/prompts.js.map +1 -0
  230. package/dist/spec/mining/diff-parser.d.ts +33 -0
  231. package/dist/spec/mining/diff-parser.d.ts.map +1 -0
  232. package/dist/spec/mining/diff-parser.js +166 -0
  233. package/dist/spec/mining/diff-parser.js.map +1 -0
  234. package/dist/spec/mining/git-scanner.d.ts +103 -0
  235. package/dist/spec/mining/git-scanner.d.ts.map +1 -0
  236. package/dist/spec/mining/git-scanner.js +307 -0
  237. package/dist/spec/mining/git-scanner.js.map +1 -0
  238. package/dist/spec/mining/pipeline.d.ts +53 -0
  239. package/dist/spec/mining/pipeline.d.ts.map +1 -0
  240. package/dist/spec/mining/pipeline.js +178 -0
  241. package/dist/spec/mining/pipeline.js.map +1 -0
  242. package/dist/spec/mining/scope-resolver.d.ts +45 -0
  243. package/dist/spec/mining/scope-resolver.d.ts.map +1 -0
  244. package/dist/spec/mining/scope-resolver.js +103 -0
  245. package/dist/spec/mining/scope-resolver.js.map +1 -0
  246. package/dist/spec/mining/spec-extractor.d.ts +69 -0
  247. package/dist/spec/mining/spec-extractor.d.ts.map +1 -0
  248. package/dist/spec/mining/spec-extractor.js +369 -0
  249. package/dist/spec/mining/spec-extractor.js.map +1 -0
  250. package/dist/spec/types.d.ts +149 -0
  251. package/dist/spec/types.d.ts.map +1 -0
  252. package/dist/spec/types.js +15 -0
  253. package/dist/spec/types.js.map +1 -0
  254. package/dist/spec/utils.d.ts +167 -0
  255. package/dist/spec/utils.d.ts.map +1 -0
  256. package/dist/spec/utils.js +463 -0
  257. package/dist/spec/utils.js.map +1 -0
  258. package/dist/sync/worktree.d.ts +9 -0
  259. package/dist/sync/worktree.d.ts.map +1 -1
  260. package/dist/sync/worktree.js +40 -0
  261. package/dist/sync/worktree.js.map +1 -1
  262. package/dist/types.d.ts +6 -1
  263. package/dist/types.d.ts.map +1 -1
  264. package/dist/ui/shimmer-progress.d.ts +2 -0
  265. package/dist/ui/shimmer-progress.d.ts.map +1 -1
  266. package/dist/ui/shimmer-progress.js +19 -2
  267. package/dist/ui/shimmer-progress.js.map +1 -1
  268. package/dist/upgrade/index.js +1 -1
  269. package/dist/upgrade/index.js.map +1 -1
  270. package/package.json +58 -57
  271. package/scripts/add-lang/bench.sh +60 -60
  272. package/scripts/add-lang/check-grammar.mjs +75 -75
  273. package/scripts/add-lang/dump-ast.mjs +103 -103
  274. package/scripts/add-lang/verify-extraction.mjs +70 -70
  275. package/scripts/agent-eval/ab-adoption.sh +91 -91
  276. package/scripts/agent-eval/ab-hook.sh +86 -86
  277. package/scripts/agent-eval/ab-impl.sh +78 -78
  278. package/scripts/agent-eval/ab-new-vs-baseline.sh +102 -102
  279. package/scripts/agent-eval/ab-sufficiency.sh +78 -78
  280. package/scripts/agent-eval/arms-F.sh +21 -21
  281. package/scripts/agent-eval/arms-matrix.sh +37 -37
  282. package/scripts/agent-eval/audit.sh +68 -68
  283. package/scripts/agent-eval/bench-readme.sh +28 -28
  284. package/scripts/agent-eval/bench-why-repo.sh +22 -22
  285. package/scripts/agent-eval/block-read-hook.sh +19 -19
  286. package/scripts/agent-eval/hook-settings.json +15 -15
  287. package/scripts/agent-eval/itrun.sh +120 -120
  288. package/scripts/agent-eval/offload-eval-3arm.sh +72 -72
  289. package/scripts/agent-eval/offload-eval-cost.mjs +133 -133
  290. package/scripts/agent-eval/offload-eval-effort.mjs +108 -108
  291. package/scripts/agent-eval/offload-eval-frontload-matrix.sh +25 -25
  292. package/scripts/agent-eval/offload-eval-frontload.sh +47 -47
  293. package/scripts/agent-eval/offload-eval-ground-truth.json +18 -18
  294. package/scripts/agent-eval/offload-eval-hook.mjs +84 -84
  295. package/scripts/agent-eval/offload-eval-judge.mjs +103 -103
  296. package/scripts/agent-eval/offload-eval-matrix.sh +20 -20
  297. package/scripts/agent-eval/offload-eval-metrics.mjs +94 -94
  298. package/scripts/agent-eval/offload-eval-refs1.sh +50 -50
  299. package/scripts/agent-eval/offload-eval-setup.sh +24 -24
  300. package/scripts/agent-eval/offload-eval-styles.sh +71 -71
  301. package/scripts/agent-eval/offload-eval-summarize.mjs +68 -68
  302. package/scripts/agent-eval/offload-eval.md +76 -76
  303. package/scripts/agent-eval/parse-arms.mjs +116 -116
  304. package/scripts/agent-eval/parse-bench-readme.mjs +84 -84
  305. package/scripts/agent-eval/parse-run.mjs +45 -45
  306. package/scripts/agent-eval/parse-session.mjs +93 -93
  307. package/scripts/agent-eval/probe-context.mjs +21 -21
  308. package/scripts/agent-eval/probe-explore.mjs +40 -40
  309. package/scripts/agent-eval/probe-node.mjs +20 -20
  310. package/scripts/agent-eval/probe-sweep.mjs +119 -119
  311. package/scripts/agent-eval/probe-trace.mjs +20 -20
  312. package/scripts/agent-eval/redirect-read-hook.sh +38 -38
  313. package/scripts/agent-eval/repro-concurrent-explore.mjs +119 -0
  314. package/scripts/agent-eval/repro-daemon-clients.mjs +125 -0
  315. package/scripts/agent-eval/run-agent.sh +34 -34
  316. package/scripts/agent-eval/run-all.sh +69 -69
  317. package/scripts/agent-eval/run-arms.sh +56 -56
  318. package/scripts/agent-eval/seq-matrix.mjs +137 -137
  319. package/scripts/build-bundle.sh +118 -118
  320. package/scripts/exp_boundary_eval/README.md +247 -0
  321. package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-310.pyc +0 -0
  322. package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-310.pyc +0 -0
  323. package/scripts/exp_boundary_eval/__pycache__/deveco_arm.cpython-310.pyc +0 -0
  324. package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-310.pyc +0 -0
  325. package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-310.pyc +0 -0
  326. package/scripts/exp_boundary_eval/__pycache__/setup.cpython-310.pyc +0 -0
  327. package/scripts/exp_boundary_eval/_test_mcp_chain.py +78 -0
  328. package/scripts/exp_boundary_eval/_test_stdin.py +8 -0
  329. package/scripts/exp_boundary_eval/_utils.py +1116 -0
  330. package/scripts/exp_boundary_eval/analyze.py +1313 -0
  331. package/scripts/exp_boundary_eval/data/agents.json +109 -0
  332. package/scripts/exp_boundary_eval/data/experiments.json +140 -0
  333. package/scripts/exp_boundary_eval/deveco_arm.py +519 -0
  334. package/scripts/exp_boundary_eval/run_all.py +378 -0
  335. package/scripts/exp_boundary_eval/run_one.py +165 -0
  336. package/scripts/exp_boundary_eval/run_session.py +158 -0
  337. package/scripts/exp_boundary_eval/setup.py +120 -0
  338. package/scripts/exp_boundary_eval/win_mcp_launcher.py +73 -0
  339. package/scripts/exp_boundary_eval/win_mcp_stdio_wrap.js +36 -0
  340. package/scripts/exp_boundary_eval/win_node_launcher.py +24 -0
  341. package/scripts/extract-release-notes.mjs +130 -130
  342. package/scripts/local-install.sh +41 -41
  343. package/scripts/npm-sdk.js +75 -75
  344. package/scripts/npm-shim.js +268 -246
  345. package/scripts/ohos-sdk-publish.mjs +133 -0
  346. package/scripts/pack-npm.sh +119 -119
  347. package/scripts/prepare-release.mjs +270 -270
  348. package/scripts/qa_eval/README.md +407 -404
  349. package/scripts/qa_eval/_test_deveco_probe.py +41 -41
  350. package/scripts/qa_eval/agent_runner.py +526 -526
  351. package/scripts/qa_eval/data/.gitignore +4 -4
  352. package/scripts/qa_eval/data/test-set.jsonl +2 -22
  353. package/scripts/qa_eval/eval_metrics.py +274 -233
  354. package/scripts/qa_eval/external_agent.py +976 -671
  355. package/scripts/qa_eval/llm_config.py +92 -92
  356. package/scripts/qa_eval/memory_monitor.py +132 -132
  357. package/scripts/qa_eval/my_answer_accuracy.py +187 -187
  358. package/scripts/qa_eval/requirements.txt +2 -2
  359. package/scripts/qa_eval/run_pipeline.py +804 -711
  360. package/scripts/qa_eval/stats_efficiency.py +279 -279
  361. package/scripts/qa_eval/stats_scores.py +207 -207
@@ -0,0 +1,74 @@
1
+ /**
2
+ * FTS5 Full-Text Search for Specs — with CJK tokenisation,
3
+ * weighted ranking, and multi-stage LIKE fallback.
4
+ *
5
+ * FTS5's ``unicode61`` tokeniser treats consecutive CJK characters as a
6
+ * single token. To support single-character / phrase queries we insert
7
+ * a space between each CJK codepoint before indexing *and* before
8
+ * searching.
9
+ *
10
+ * Weighting strategy:
11
+ * Title matches are boosted over subtitle matches via post-scoring.
12
+ * Both FTS5 and LIKE stages use the same score semantics:
13
+ *
14
+ * ===== ====================
15
+ * Score Meaning
16
+ * ===== ====================
17
+ * 3.0 exact title match
18
+ * 2.5 title starts with query
19
+ * 2.0 title contains query
20
+ * 1.0 keyword match in subtitles only
21
+ * ===== ====================
22
+ *
23
+ * FTS5 returns ``limit * 3`` candidates; they are re-ranked and the
24
+ * top *limit* are returned.
25
+ *
26
+ * Fallback strategy (3 stages):
27
+ * 1. FTS5 weighted search (primary)
28
+ * 2. LIKE tiered scoring (same score semantics as FTS5)
29
+ * 3. If still no results, return most-recently-added specs as a
30
+ * "discovery" fallback.
31
+ */
32
+ import { SqliteDatabase } from '../../db/sqlite-adapter';
33
+ import { SpecSearchResult } from '../types';
34
+ /**
35
+ * Insert a space between adjacent CJK characters so FTS5's unicode61
36
+ * tokeniser can index them individually.
37
+ */
38
+ export declare function segmentCjk(text: string): string;
39
+ /**
40
+ * Escape / pre-process a user query for FTS5.
41
+ *
42
+ * 1. Segment CJK runs by inserting spaces.
43
+ * 2. Quote each token so FTS5 treats it as a literal term.
44
+ */
45
+ export declare function escapeFtsQuery(query: string): string;
46
+ /**
47
+ * Combined FTS5 + LIKE fallback search for specs.
48
+ *
49
+ * Strategy:
50
+ * 1. FTS5 weighted search (title 3× boost).
51
+ * 2. If fewer than *limit* results, backfill with LIKE tiered scoring.
52
+ * 3. If still no results, return most-recently-added specs as a
53
+ * discovery fallback.
54
+ *
55
+ * Every result contains ``id, title, subtitles, _score`` and
56
+ * optionally ``_method`` (``"fts5"`` | ``"like"`` | ``"all"`` | ``"discovery"``)
57
+ * and ``_tier`` (for LIKE matches).
58
+ */
59
+ export declare function searchSpecs(db: SqliteDatabase, query: string, limit?: number): SpecSearchResult[];
60
+ /**
61
+ * Search code fragment diffs by entity name or keyword.
62
+ *
63
+ * Uses FTS5 on the ``code_fragments_fts`` virtual table to find fragments
64
+ * whose ``code_diff`` text matches the query. This is used to bridge
65
+ * code-entity names (e.g. ``validatePassword``) to Specs when the entity
66
+ * name does not appear in the Spec's title/subtitles.
67
+ *
68
+ * @param db Active SQLite database handle.
69
+ * @param query Entity name or keyword to search for in code diffs.
70
+ * @param limit Maximum number of fragment IDs to return (default 50).
71
+ * @returns Array of matching fragment IDs, ordered by FTS5 rank.
72
+ */
73
+ export declare function searchCodeFragments(db: SqliteDatabase, query: string, limit?: number): string[];
74
+ //# sourceMappingURL=fts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts.d.ts","sourceRoot":"","sources":["../../../src/spec/db/fts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAS5C;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AA8MD;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,GACjB,gBAAgB,EAAE,CA8CpB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,cAAc,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,GACjB,MAAM,EAAE,CAqBV"}
@@ -0,0 +1,324 @@
1
+ "use strict";
2
+ /**
3
+ * FTS5 Full-Text Search for Specs — with CJK tokenisation,
4
+ * weighted ranking, and multi-stage LIKE fallback.
5
+ *
6
+ * FTS5's ``unicode61`` tokeniser treats consecutive CJK characters as a
7
+ * single token. To support single-character / phrase queries we insert
8
+ * a space between each CJK codepoint before indexing *and* before
9
+ * searching.
10
+ *
11
+ * Weighting strategy:
12
+ * Title matches are boosted over subtitle matches via post-scoring.
13
+ * Both FTS5 and LIKE stages use the same score semantics:
14
+ *
15
+ * ===== ====================
16
+ * Score Meaning
17
+ * ===== ====================
18
+ * 3.0 exact title match
19
+ * 2.5 title starts with query
20
+ * 2.0 title contains query
21
+ * 1.0 keyword match in subtitles only
22
+ * ===== ====================
23
+ *
24
+ * FTS5 returns ``limit * 3`` candidates; they are re-ranked and the
25
+ * top *limit* are returned.
26
+ *
27
+ * Fallback strategy (3 stages):
28
+ * 1. FTS5 weighted search (primary)
29
+ * 2. LIKE tiered scoring (same score semantics as FTS5)
30
+ * 3. If still no results, return most-recently-added specs as a
31
+ * "discovery" fallback.
32
+ */
33
+ Object.defineProperty(exports, "__esModule", { value: true });
34
+ exports.segmentCjk = segmentCjk;
35
+ exports.escapeFtsQuery = escapeFtsQuery;
36
+ exports.searchSpecs = searchSpecs;
37
+ exports.searchCodeFragments = searchCodeFragments;
38
+ // ===========================================================================
39
+ // CJK Segmentation
40
+ // ===========================================================================
41
+ /** Regex matching a CJK Unified Ideograph (U+4E00–U+9FFF). */
42
+ const CJK_RANGE = /[\u4e00-\u9fff]+/g;
43
+ /**
44
+ * Insert a space between adjacent CJK characters so FTS5's unicode61
45
+ * tokeniser can index them individually.
46
+ */
47
+ function segmentCjk(text) {
48
+ return text.replace(CJK_RANGE, (m) => m.split('').join(' '));
49
+ }
50
+ /**
51
+ * Escape / pre-process a user query for FTS5.
52
+ *
53
+ * 1. Segment CJK runs by inserting spaces.
54
+ * 2. Quote each token so FTS5 treats it as a literal term.
55
+ */
56
+ function escapeFtsQuery(query) {
57
+ const trimmed = query.trim();
58
+ if (!trimmed)
59
+ return '""';
60
+ const segmented = segmentCjk(trimmed);
61
+ const tokens = segmented.split(/\s+/).filter(Boolean);
62
+ // Escape embedded double-quotes: inside FTS5 quoted phrases, " is escaped as ""
63
+ return tokens.map((t) => `"${t.replace(/"/g, '""')}"`).join(' ') || '""';
64
+ }
65
+ // ===========================================================================
66
+ // Weighted Scoring
67
+ // ===========================================================================
68
+ /**
69
+ * Compute a title-match boost factor.
70
+ *
71
+ * 3.0 — exact match
72
+ * 2.5 — title starts with query
73
+ * 2.0 — title contains query
74
+ * 1.0 — no title match (subtitles only)
75
+ */
76
+ function scoreTitleMatch(title, query) {
77
+ const q = query.toLowerCase().trim();
78
+ const t = title.toLowerCase();
79
+ if (q === t)
80
+ return 3.0;
81
+ if (t.startsWith(q))
82
+ return 2.5;
83
+ if (t.includes(q))
84
+ return 2.0;
85
+ return 1.0;
86
+ }
87
+ /**
88
+ * LIKE tiered scoring.
89
+ *
90
+ * Returns ``[score, tierLabel]`` where higher score = more relevant.
91
+ * Score semantics are aligned with ``scoreTitleMatch`` so cross-stage
92
+ * re-ranking works correctly.
93
+ */
94
+ function likeScore(title, query) {
95
+ const t = title.toLowerCase().trim();
96
+ const q = query.toLowerCase().trim();
97
+ if (t === q)
98
+ return [3.0, 'exact_title'];
99
+ if (t.startsWith(q))
100
+ return [2.5, 'starts_with_title'];
101
+ if (t.includes(q))
102
+ return [2.0, 'contains_title'];
103
+ return [1.0, 'contains_subtitle'];
104
+ }
105
+ // ===========================================================================
106
+ // Stage 1: FTS5 Weighted Search
107
+ // ===========================================================================
108
+ /**
109
+ * Weighted FTS5 search with title boost.
110
+ *
111
+ * Fetches ``limit * oversample`` candidates from FTS5, re-ranks by
112
+ * weighted score, and returns the top *limit*.
113
+ */
114
+ function searchSpecsFts(db, query, limit, oversample = 3) {
115
+ const escaped = escapeFtsQuery(query);
116
+ const rawLimit = limit * oversample;
117
+ let rows;
118
+ try {
119
+ rows = db
120
+ .prepare(`SELECT s.id, s.title, s.subtitles
121
+ FROM specs_fts f
122
+ JOIN spec_nodes s ON s.id = f.id
123
+ WHERE specs_fts MATCH ?
124
+ ORDER BY rank LIMIT ?`)
125
+ .all(escaped, rawLimit);
126
+ }
127
+ catch {
128
+ return [];
129
+ }
130
+ const scored = [];
131
+ for (const row of rows) {
132
+ let subtitles;
133
+ try {
134
+ subtitles = JSON.parse(row.subtitles || '[]');
135
+ }
136
+ catch {
137
+ subtitles = [];
138
+ }
139
+ const boost = scoreTitleMatch(row.title, query);
140
+ scored.push({
141
+ score: boost,
142
+ result: {
143
+ id: row.id,
144
+ title: row.title,
145
+ subtitles,
146
+ _score: boost,
147
+ _method: 'fts5',
148
+ },
149
+ });
150
+ }
151
+ scored.sort((a, b) => b.score - a.score);
152
+ return scored.slice(0, limit).map((s) => s.result);
153
+ }
154
+ // ===========================================================================
155
+ // Stage 2: LIKE Tiered Fallback
156
+ // ===========================================================================
157
+ /**
158
+ * LIKE fallback search with tiered scoring.
159
+ *
160
+ * Skips any spec whose id appears in *excludeIds* (to avoid
161
+ * duplicating FTS5 results).
162
+ */
163
+ function searchSpecsLike(db, query, limit, excludeIds) {
164
+ // Escape LIKE metacharacters so '%' and '_' are treated as literals
165
+ const escaped = query.replace(/\\/g, '\\\\').replace(/%/g, '\\%').replace(/_/g, '\\_');
166
+ const likePat = `%${escaped}%`;
167
+ const rows = db
168
+ .prepare(`SELECT id, title, subtitles FROM spec_nodes
169
+ WHERE title LIKE ? ESCAPE '\\' OR subtitles LIKE ? ESCAPE '\\'
170
+ ORDER BY id LIMIT ?`)
171
+ .all(likePat, likePat, limit * 3);
172
+ const scored = [];
173
+ for (const row of rows) {
174
+ if (excludeIds.has(row.id))
175
+ continue;
176
+ let subtitles;
177
+ try {
178
+ subtitles = JSON.parse(row.subtitles || '[]');
179
+ }
180
+ catch {
181
+ subtitles = [];
182
+ }
183
+ const [score, tier] = likeScore(row.title, query);
184
+ scored.push({
185
+ score,
186
+ tier,
187
+ result: {
188
+ id: row.id,
189
+ title: row.title,
190
+ subtitles,
191
+ _score: score,
192
+ _method: 'like',
193
+ _tier: tier,
194
+ },
195
+ });
196
+ }
197
+ scored.sort((a, b) => {
198
+ if (b.score !== a.score)
199
+ return b.score - a.score;
200
+ return a.tier.localeCompare(b.tier);
201
+ });
202
+ return scored.slice(0, limit).map((s) => s.result);
203
+ }
204
+ // ===========================================================================
205
+ // Stage 3: Discovery Fallback
206
+ // ===========================================================================
207
+ /**
208
+ * Return the most-recently-added specs when all searches produce
209
+ * no results — so the caller always gets something.
210
+ */
211
+ function discoveryFallback(db, limit) {
212
+ const rows = db
213
+ .prepare('SELECT id, title, subtitles FROM spec_nodes ORDER BY timestamp DESC LIMIT ?')
214
+ .all(limit);
215
+ return rows.map((row) => {
216
+ let subtitles;
217
+ try {
218
+ subtitles = JSON.parse(row.subtitles || '[]');
219
+ }
220
+ catch {
221
+ subtitles = [];
222
+ }
223
+ return {
224
+ id: row.id,
225
+ title: row.title,
226
+ subtitles,
227
+ _score: 0.0,
228
+ _method: 'discovery',
229
+ };
230
+ });
231
+ }
232
+ // ===========================================================================
233
+ // Combined Search (public API)
234
+ // ===========================================================================
235
+ /**
236
+ * Combined FTS5 + LIKE fallback search for specs.
237
+ *
238
+ * Strategy:
239
+ * 1. FTS5 weighted search (title 3× boost).
240
+ * 2. If fewer than *limit* results, backfill with LIKE tiered scoring.
241
+ * 3. If still no results, return most-recently-added specs as a
242
+ * discovery fallback.
243
+ *
244
+ * Every result contains ``id, title, subtitles, _score`` and
245
+ * optionally ``_method`` (``"fts5"`` | ``"like"`` | ``"all"`` | ``"discovery"``)
246
+ * and ``_tier`` (for LIKE matches).
247
+ */
248
+ function searchSpecs(db, query, limit = 10) {
249
+ // Empty query — return all specs (recent first)
250
+ if (!query.trim()) {
251
+ const rows = db
252
+ .prepare('SELECT id, title, subtitles FROM spec_nodes ORDER BY id LIMIT ?')
253
+ .all(limit);
254
+ return rows.map((row) => {
255
+ let subtitles;
256
+ try {
257
+ subtitles = JSON.parse(row.subtitles || '[]');
258
+ }
259
+ catch {
260
+ subtitles = [];
261
+ }
262
+ return {
263
+ id: row.id,
264
+ title: row.title,
265
+ subtitles,
266
+ _score: 0.0,
267
+ _method: 'all',
268
+ };
269
+ });
270
+ }
271
+ // Stage 1: FTS5 weighted search
272
+ const ftsResults = searchSpecsFts(db, query, limit);
273
+ if (ftsResults.length >= limit) {
274
+ return ftsResults;
275
+ }
276
+ // Stage 2: LIKE fallback
277
+ const seenIds = new Set(ftsResults.map((r) => r.id));
278
+ const needed = limit - ftsResults.length;
279
+ const likeResults = searchSpecsLike(db, query, needed, seenIds);
280
+ // Cross-stage re-sort: LIKE and FTS5 share the same score semantics
281
+ const combined = [...ftsResults, ...likeResults];
282
+ combined.sort((a, b) => (b._score ?? 0) - (a._score ?? 0));
283
+ // Stage 3: discovery fallback — no matches at all
284
+ if (combined.length === 0) {
285
+ return discoveryFallback(db, limit);
286
+ }
287
+ return combined.slice(0, limit);
288
+ }
289
+ // ===========================================================================
290
+ // Code Fragment FTS5 Search
291
+ // ===========================================================================
292
+ /**
293
+ * Search code fragment diffs by entity name or keyword.
294
+ *
295
+ * Uses FTS5 on the ``code_fragments_fts`` virtual table to find fragments
296
+ * whose ``code_diff`` text matches the query. This is used to bridge
297
+ * code-entity names (e.g. ``validatePassword``) to Specs when the entity
298
+ * name does not appear in the Spec's title/subtitles.
299
+ *
300
+ * @param db Active SQLite database handle.
301
+ * @param query Entity name or keyword to search for in code diffs.
302
+ * @param limit Maximum number of fragment IDs to return (default 50).
303
+ * @returns Array of matching fragment IDs, ordered by FTS5 rank.
304
+ */
305
+ function searchCodeFragments(db, query, limit = 50) {
306
+ const trimmed = query.trim();
307
+ if (!trimmed)
308
+ return [];
309
+ // Escape FTS5 special characters and quote each token for literal matching
310
+ const escaped = escapeFtsQuery(trimmed);
311
+ let rows;
312
+ try {
313
+ rows = db
314
+ .prepare(`SELECT id FROM code_fragments_fts
315
+ WHERE code_fragments_fts MATCH ?
316
+ ORDER BY rank LIMIT ?`)
317
+ .all(escaped, limit);
318
+ }
319
+ catch {
320
+ return [];
321
+ }
322
+ return rows.map((r) => r.id);
323
+ }
324
+ //# sourceMappingURL=fts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fts.js","sourceRoot":"","sources":["../../../src/spec/db/fts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Spec Database Layer — Barrel Export
3
+ *
4
+ * Re-exports all CRUD operations, schema initialisation, and FTS5
5
+ * search so consumers can `import { ... } from '../spec/db'`.
6
+ */
7
+ export { initSpecSchema, getCurrentSpecVersion, runSpecMigrations, CURRENT_SPEC_SCHEMA_VERSION } from './schema';
8
+ export { insertSpecNode, findSpecById, updateSpecStatus, updateSpecVersion, deleteSpec, listAllSpecs, countSpecsByStatus, } from './spec-node';
9
+ export { insertCommitNode, findCommitByHash, listAllCommits, countCommits, } from './commit-node';
10
+ export { insertCodeFragment, findFragmentById, findFragmentsByCommit, countFragments, } from './fragment-node';
11
+ export { insertSpecCommitRelation, findCommitsBySpec, transferSpecCommitRelations, insertCommitFragmentRelation, insertSpecSpecRelation, deleteSimilarToRelations, transferSpecSpecRelations, countAllRelations, } from './relations';
12
+ export { searchSpecs, escapeFtsQuery, segmentCjk, } from './fts';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spec/db/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAGjH,OAAO,EACL,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,kBAAkB,GACnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,YAAY,GACb,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,2BAA2B,EAC3B,4BAA4B,EAC5B,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,WAAW,EACX,cAAc,EACd,UAAU,GACX,MAAM,OAAO,CAAC"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /**
3
+ * Spec Database Layer — Barrel Export
4
+ *
5
+ * Re-exports all CRUD operations, schema initialisation, and FTS5
6
+ * search so consumers can `import { ... } from '../spec/db'`.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.segmentCjk = exports.escapeFtsQuery = exports.searchSpecs = exports.countAllRelations = exports.transferSpecSpecRelations = exports.deleteSimilarToRelations = exports.insertSpecSpecRelation = exports.insertCommitFragmentRelation = exports.transferSpecCommitRelations = exports.findCommitsBySpec = exports.insertSpecCommitRelation = exports.countFragments = exports.findFragmentsByCommit = exports.findFragmentById = exports.insertCodeFragment = exports.countCommits = exports.listAllCommits = exports.findCommitByHash = exports.insertCommitNode = exports.countSpecsByStatus = exports.listAllSpecs = exports.deleteSpec = exports.updateSpecVersion = exports.updateSpecStatus = exports.findSpecById = exports.insertSpecNode = exports.CURRENT_SPEC_SCHEMA_VERSION = exports.runSpecMigrations = exports.getCurrentSpecVersion = exports.initSpecSchema = void 0;
10
+ // Schema
11
+ var schema_1 = require("./schema");
12
+ Object.defineProperty(exports, "initSpecSchema", { enumerable: true, get: function () { return schema_1.initSpecSchema; } });
13
+ Object.defineProperty(exports, "getCurrentSpecVersion", { enumerable: true, get: function () { return schema_1.getCurrentSpecVersion; } });
14
+ Object.defineProperty(exports, "runSpecMigrations", { enumerable: true, get: function () { return schema_1.runSpecMigrations; } });
15
+ Object.defineProperty(exports, "CURRENT_SPEC_SCHEMA_VERSION", { enumerable: true, get: function () { return schema_1.CURRENT_SPEC_SCHEMA_VERSION; } });
16
+ // Entity CRUD
17
+ var spec_node_1 = require("./spec-node");
18
+ Object.defineProperty(exports, "insertSpecNode", { enumerable: true, get: function () { return spec_node_1.insertSpecNode; } });
19
+ Object.defineProperty(exports, "findSpecById", { enumerable: true, get: function () { return spec_node_1.findSpecById; } });
20
+ Object.defineProperty(exports, "updateSpecStatus", { enumerable: true, get: function () { return spec_node_1.updateSpecStatus; } });
21
+ Object.defineProperty(exports, "updateSpecVersion", { enumerable: true, get: function () { return spec_node_1.updateSpecVersion; } });
22
+ Object.defineProperty(exports, "deleteSpec", { enumerable: true, get: function () { return spec_node_1.deleteSpec; } });
23
+ Object.defineProperty(exports, "listAllSpecs", { enumerable: true, get: function () { return spec_node_1.listAllSpecs; } });
24
+ Object.defineProperty(exports, "countSpecsByStatus", { enumerable: true, get: function () { return spec_node_1.countSpecsByStatus; } });
25
+ var commit_node_1 = require("./commit-node");
26
+ Object.defineProperty(exports, "insertCommitNode", { enumerable: true, get: function () { return commit_node_1.insertCommitNode; } });
27
+ Object.defineProperty(exports, "findCommitByHash", { enumerable: true, get: function () { return commit_node_1.findCommitByHash; } });
28
+ Object.defineProperty(exports, "listAllCommits", { enumerable: true, get: function () { return commit_node_1.listAllCommits; } });
29
+ Object.defineProperty(exports, "countCommits", { enumerable: true, get: function () { return commit_node_1.countCommits; } });
30
+ var fragment_node_1 = require("./fragment-node");
31
+ Object.defineProperty(exports, "insertCodeFragment", { enumerable: true, get: function () { return fragment_node_1.insertCodeFragment; } });
32
+ Object.defineProperty(exports, "findFragmentById", { enumerable: true, get: function () { return fragment_node_1.findFragmentById; } });
33
+ Object.defineProperty(exports, "findFragmentsByCommit", { enumerable: true, get: function () { return fragment_node_1.findFragmentsByCommit; } });
34
+ Object.defineProperty(exports, "countFragments", { enumerable: true, get: function () { return fragment_node_1.countFragments; } });
35
+ // Relations
36
+ var relations_1 = require("./relations");
37
+ Object.defineProperty(exports, "insertSpecCommitRelation", { enumerable: true, get: function () { return relations_1.insertSpecCommitRelation; } });
38
+ Object.defineProperty(exports, "findCommitsBySpec", { enumerable: true, get: function () { return relations_1.findCommitsBySpec; } });
39
+ Object.defineProperty(exports, "transferSpecCommitRelations", { enumerable: true, get: function () { return relations_1.transferSpecCommitRelations; } });
40
+ Object.defineProperty(exports, "insertCommitFragmentRelation", { enumerable: true, get: function () { return relations_1.insertCommitFragmentRelation; } });
41
+ Object.defineProperty(exports, "insertSpecSpecRelation", { enumerable: true, get: function () { return relations_1.insertSpecSpecRelation; } });
42
+ Object.defineProperty(exports, "deleteSimilarToRelations", { enumerable: true, get: function () { return relations_1.deleteSimilarToRelations; } });
43
+ Object.defineProperty(exports, "transferSpecSpecRelations", { enumerable: true, get: function () { return relations_1.transferSpecSpecRelations; } });
44
+ Object.defineProperty(exports, "countAllRelations", { enumerable: true, get: function () { return relations_1.countAllRelations; } });
45
+ // FTS5 Search
46
+ var fts_1 = require("./fts");
47
+ Object.defineProperty(exports, "searchSpecs", { enumerable: true, get: function () { return fts_1.searchSpecs; } });
48
+ Object.defineProperty(exports, "escapeFtsQuery", { enumerable: true, get: function () { return fts_1.escapeFtsQuery; } });
49
+ Object.defineProperty(exports, "segmentCjk", { enumerable: true, get: function () { return fts_1.segmentCjk; } });
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/spec/db/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,SAAS;AACT,mCAAiH;AAAxG,wGAAA,cAAc,OAAA;AAAE,+GAAA,qBAAqB,OAAA;AAAE,2GAAA,iBAAiB,OAAA;AAAE,qHAAA,2BAA2B,OAAA;AAE9F,cAAc;AACd,yCAQqB;AAPnB,2GAAA,cAAc,OAAA;AACd,yGAAA,YAAY,OAAA;AACZ,6GAAA,gBAAgB,OAAA;AAChB,8GAAA,iBAAiB,OAAA;AACjB,uGAAA,UAAU,OAAA;AACV,yGAAA,YAAY,OAAA;AACZ,+GAAA,kBAAkB,OAAA;AAGpB,6CAKuB;AAJrB,+GAAA,gBAAgB,OAAA;AAChB,+GAAA,gBAAgB,OAAA;AAChB,6GAAA,cAAc,OAAA;AACd,2GAAA,YAAY,OAAA;AAGd,iDAKyB;AAJvB,mHAAA,kBAAkB,OAAA;AAClB,iHAAA,gBAAgB,OAAA;AAChB,sHAAA,qBAAqB,OAAA;AACrB,+GAAA,cAAc,OAAA;AAGhB,YAAY;AACZ,yCASqB;AARnB,qHAAA,wBAAwB,OAAA;AACxB,8GAAA,iBAAiB,OAAA;AACjB,wHAAA,2BAA2B,OAAA;AAC3B,yHAAA,4BAA4B,OAAA;AAC5B,mHAAA,sBAAsB,OAAA;AACtB,qHAAA,wBAAwB,OAAA;AACxB,sHAAA,yBAAyB,OAAA;AACzB,8GAAA,iBAAiB,OAAA;AAGnB,cAAc;AACd,6BAIe;AAHb,kGAAA,WAAW,OAAA;AACX,qGAAA,cAAc,OAAA;AACd,iGAAA,UAAU,OAAA"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Relation CRUD — persistence operations for the three relation tables:
3
+ *
4
+ * - ``spec_commit_relations`` (Spec ↔ Commit)
5
+ * - ``commit_fragment_relations`` (Commit ↔ CodeFragment)
6
+ * - ``spec_spec_relations`` (Spec ↔ Spec)
7
+ */
8
+ import { SqliteDatabase } from '../../db/sqlite-adapter';
9
+ import { RelationType, SpecCommitRelation } from '../types';
10
+ /**
11
+ * Insert a relation between a Spec and a Commit.
12
+ * `INSERT OR IGNORE` — duplicates are silently skipped.
13
+ */
14
+ export declare function insertSpecCommitRelation(db: SqliteDatabase, specId: string, commitHash: string, relationType: RelationType): void;
15
+ /**
16
+ * Find all commits linked to a spec, ordered by commit timestamp
17
+ * (oldest first — matches Commit4Spec's mining pipeline sort).
18
+ */
19
+ export declare function findCommitsBySpec(db: SqliteDatabase, specId: string): Array<SpecCommitRelation & {
20
+ message: string;
21
+ author: string;
22
+ timestamp: number;
23
+ }>;
24
+ /**
25
+ * Transfer all spec–commit relations from one spec to another.
26
+ * Used during self-evolve when a spec is versioned:
27
+ * old active spec's relations move to the deprecated record.
28
+ */
29
+ export declare function transferSpecCommitRelations(db: SqliteDatabase, fromSpecId: string, toSpecId: string): void;
30
+ /**
31
+ * Link a commit to a code fragment.
32
+ * `INSERT OR IGNORE` — duplicates are silently skipped.
33
+ */
34
+ export declare function insertCommitFragmentRelation(db: SqliteDatabase, commitHash: string, fragmentId: string): void;
35
+ /**
36
+ * Insert a relation between two specs (SIMILAR_TO or EVOLVED_FROM).
37
+ * `INSERT OR IGNORE` — duplicates are silently skipped.
38
+ */
39
+ export declare function insertSpecSpecRelation(db: SqliteDatabase, sourceId: string, targetId: string, relationType: RelationType): void;
40
+ /**
41
+ * Remove all SIMILAR_TO relations involving a spec.
42
+ * Called when a spec is deprecated (similarity links become stale).
43
+ */
44
+ export declare function deleteSimilarToRelations(db: SqliteDatabase, specId: string): void;
45
+ /**
46
+ * Transfer all spec–spec relations from one spec to another.
47
+ * Used during self-evolve versioning (old spec's relations move to
48
+ * the deprecated record).
49
+ */
50
+ export declare function transferSpecSpecRelations(db: SqliteDatabase, fromSpecId: string, toSpecId: string): void;
51
+ /**
52
+ * Count total rows across all three relation tables.
53
+ */
54
+ export declare function countAllRelations(db: SqliteDatabase): number;
55
+ //# sourceMappingURL=relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../../src/spec/db/relations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAM5D;;;GAGG;AACH,wBAAgB,wBAAwB,CACtC,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,GACzB,IAAI,CAMN;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,MAAM,GACb,KAAK,CAAC,kBAAkB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAwBpF;AAED;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,cAAc,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,IAAI,CAMN;AAMD;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,EAAE,EAAE,cAAc,EAClB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,IAAI,CAMN;AAMD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,YAAY,GACzB,IAAI,CAMN;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAMjF;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,EAAE,EAAE,cAAc,EAClB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,IAAI,CA6BN;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAa5D"}