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.
- package/LICENSE +21 -21
- package/README.md +268 -243
- package/dist/arkts/ohos-api-index.d.ts +15 -0
- package/dist/arkts/ohos-api-index.d.ts.map +1 -0
- package/dist/arkts/ohos-api-index.js +190 -0
- package/dist/arkts/ohos-api-index.js.map +1 -0
- package/dist/arkts/ohos-sdk-input.d.ts +36 -0
- package/dist/arkts/ohos-sdk-input.d.ts.map +1 -0
- package/dist/arkts/ohos-sdk-input.js +214 -0
- package/dist/arkts/ohos-sdk-input.js.map +1 -0
- package/dist/bin/command-supervision.d.ts +12 -0
- package/dist/bin/command-supervision.d.ts.map +1 -0
- package/dist/bin/command-supervision.js +86 -0
- package/dist/bin/command-supervision.js.map +1 -0
- package/dist/bin/homegraph.d.ts +1 -1
- package/dist/bin/homegraph.js +971 -71
- package/dist/bin/homegraph.js.map +1 -1
- package/dist/db/index.d.ts +20 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +39 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +58 -19
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +14 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +314 -143
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +172 -152
- package/dist/directory.d.ts +32 -0
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +88 -5
- package/dist/directory.js.map +1 -1
- package/dist/extraction/arkts-batch-worker.d.ts +2 -0
- package/dist/extraction/arkts-batch-worker.d.ts.map +1 -0
- package/dist/extraction/arkts-batch-worker.js +28 -0
- package/dist/extraction/arkts-batch-worker.js.map +1 -0
- package/dist/extraction/context.d.ts +11 -0
- package/dist/extraction/context.d.ts.map +1 -1
- package/dist/extraction/context.js +20 -0
- package/dist/extraction/context.js.map +1 -1
- package/dist/extraction/index.d.ts +16 -2
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +619 -380
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/arkts-state-decorators.d.ts +13 -0
- package/dist/extraction/languages/arkts-state-decorators.d.ts.map +1 -0
- package/dist/extraction/languages/arkts-state-decorators.js +26 -0
- package/dist/extraction/languages/arkts-state-decorators.js.map +1 -0
- package/dist/extraction/languages/arkts-viewtree.d.ts +4 -2
- package/dist/extraction/languages/arkts-viewtree.d.ts.map +1 -1
- package/dist/extraction/languages/arkts-viewtree.js +21 -6
- package/dist/extraction/languages/arkts-viewtree.js.map +1 -1
- package/dist/extraction/languages/arkts.d.ts +98 -2
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +1290 -61
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/extraction/languages/c-cpp.d.ts +56 -0
- package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
- package/dist/extraction/languages/c-cpp.js +198 -1
- package/dist/extraction/languages/c-cpp.js.map +1 -1
- package/dist/extraction/languages/ohos-api-consumer.d.ts +34 -0
- package/dist/extraction/languages/ohos-api-consumer.d.ts.map +1 -0
- package/dist/extraction/languages/ohos-api-consumer.js +283 -0
- package/dist/extraction/languages/ohos-api-consumer.js.map +1 -0
- package/dist/extraction/parse-pool.d.ts +126 -0
- package/dist/extraction/parse-pool.d.ts.map +1 -0
- package/dist/extraction/parse-pool.js +319 -0
- package/dist/extraction/parse-pool.js.map +1 -0
- package/dist/extraction/tree-sitter-types.d.ts +17 -0
- package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.d.ts +21 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.js +198 -27
- package/dist/extraction/tree-sitter.js.map +1 -1
- package/dist/extraction/wasm/tree-sitter-c_sharp.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-pascal.wasm +0 -0
- package/dist/graph/traversal.d.ts.map +1 -1
- package/dist/graph/traversal.js +76 -17
- package/dist/graph/traversal.js.map +1 -1
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -4
- package/dist/index.js.map +1 -1
- package/dist/installer/instructions-template.js +9 -9
- package/dist/installer/targets/shared.d.ts +5 -6
- package/dist/installer/targets/shared.d.ts.map +1 -1
- package/dist/installer/targets/shared.js +5 -6
- package/dist/installer/targets/shared.js.map +1 -1
- package/dist/mcp/daemon-paths.d.ts +30 -3
- package/dist/mcp/daemon-paths.d.ts.map +1 -1
- package/dist/mcp/daemon-paths.js +50 -10
- package/dist/mcp/daemon-paths.js.map +1 -1
- package/dist/mcp/daemon-registry.d.ts.map +1 -1
- package/dist/mcp/daemon-registry.js +7 -3
- package/dist/mcp/daemon-registry.js.map +1 -1
- package/dist/mcp/daemon.d.ts +48 -0
- package/dist/mcp/daemon.d.ts.map +1 -1
- package/dist/mcp/daemon.js +196 -32
- package/dist/mcp/daemon.js.map +1 -1
- package/dist/mcp/engine.d.ts +17 -0
- package/dist/mcp/engine.d.ts.map +1 -1
- package/dist/mcp/engine.js +73 -1
- package/dist/mcp/engine.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +25 -43
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/liveness-watchdog.js +16 -16
- package/dist/mcp/ppid-watchdog.d.ts +18 -0
- package/dist/mcp/ppid-watchdog.d.ts.map +1 -1
- package/dist/mcp/ppid-watchdog.js +37 -0
- package/dist/mcp/ppid-watchdog.js.map +1 -1
- package/dist/mcp/query-cache.d.ts +25 -0
- package/dist/mcp/query-cache.d.ts.map +1 -0
- package/dist/mcp/query-cache.js +191 -0
- package/dist/mcp/query-cache.js.map +1 -0
- package/dist/mcp/query-pool.d.ts +94 -0
- package/dist/mcp/query-pool.d.ts.map +1 -0
- package/dist/mcp/query-pool.js +297 -0
- package/dist/mcp/query-pool.js.map +1 -0
- package/dist/mcp/query-worker.d.ts +24 -0
- package/dist/mcp/query-worker.d.ts.map +1 -0
- package/dist/mcp/query-worker.js +87 -0
- package/dist/mcp/query-worker.js.map +1 -0
- package/dist/mcp/server-instructions.d.ts +5 -7
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +72 -74
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/tools.d.ts +94 -4
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +877 -71
- package/dist/mcp/tools.js.map +1 -1
- package/dist/project-config.d.ts +20 -0
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +42 -2
- package/dist/project-config.js.map +1 -1
- package/dist/reasoning/login.js +1 -1
- package/dist/reasoning/login.js.map +1 -1
- package/dist/reasoning/reasoner.js +32 -32
- package/dist/resolution/c-fnptr-synthesizer.d.ts +0 -28
- package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
- package/dist/resolution/c-fnptr-synthesizer.js +765 -79
- package/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts +1 -1
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +72 -11
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/cooperative-yield.d.ts +32 -0
- package/dist/resolution/cooperative-yield.d.ts.map +1 -0
- package/dist/resolution/cooperative-yield.js +42 -0
- package/dist/resolution/cooperative-yield.js.map +1 -0
- package/dist/resolution/index.d.ts +11 -2
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +72 -4
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/name-matcher.d.ts +22 -0
- package/dist/resolution/name-matcher.d.ts.map +1 -1
- package/dist/resolution/name-matcher.js +317 -20
- package/dist/resolution/name-matcher.js.map +1 -1
- package/dist/spec/config.d.ts +39 -0
- package/dist/spec/config.d.ts.map +1 -0
- package/dist/spec/config.js +304 -0
- package/dist/spec/config.js.map +1 -0
- package/dist/spec/db/commit-node.d.ts +23 -0
- package/dist/spec/db/commit-node.d.ts.map +1 -0
- package/dist/spec/db/commit-node.js +62 -0
- package/dist/spec/db/commit-node.js.map +1 -0
- package/dist/spec/db/fragment-node.d.ts +24 -0
- package/dist/spec/db/fragment-node.d.ts.map +1 -0
- package/dist/spec/db/fragment-node.js +128 -0
- package/dist/spec/db/fragment-node.js.map +1 -0
- package/dist/spec/db/fts.d.ts +74 -0
- package/dist/spec/db/fts.d.ts.map +1 -0
- package/dist/spec/db/fts.js +324 -0
- package/dist/spec/db/fts.js.map +1 -0
- package/dist/spec/db/index.d.ts +13 -0
- package/dist/spec/db/index.d.ts.map +1 -0
- package/dist/spec/db/index.js +50 -0
- package/dist/spec/db/index.js.map +1 -0
- package/dist/spec/db/relations.d.ts +55 -0
- package/dist/spec/db/relations.d.ts.map +1 -0
- package/dist/spec/db/relations.js +158 -0
- package/dist/spec/db/relations.js.map +1 -0
- package/dist/spec/db/schema.d.ts +33 -0
- package/dist/spec/db/schema.d.ts.map +1 -0
- package/dist/spec/db/schema.js +119 -0
- package/dist/spec/db/schema.js.map +1 -0
- package/dist/spec/db/schema.sql +117 -0
- package/dist/spec/db/spec-node.d.ts +41 -0
- package/dist/spec/db/spec-node.d.ts.map +1 -0
- package/dist/spec/db/spec-node.js +114 -0
- package/dist/spec/db/spec-node.js.map +1 -0
- package/dist/spec/evolve/impact-locator.d.ts +13 -0
- package/dist/spec/evolve/impact-locator.d.ts.map +1 -0
- package/dist/spec/evolve/impact-locator.js +25 -0
- package/dist/spec/evolve/impact-locator.js.map +1 -0
- package/dist/spec/evolve/llm-client.d.ts +50 -0
- package/dist/spec/evolve/llm-client.d.ts.map +1 -0
- package/dist/spec/evolve/llm-client.js +176 -0
- package/dist/spec/evolve/llm-client.js.map +1 -0
- package/dist/spec/evolve/logic-checker.d.ts +12 -0
- package/dist/spec/evolve/logic-checker.d.ts.map +1 -0
- package/dist/spec/evolve/logic-checker.js +24 -0
- package/dist/spec/evolve/logic-checker.js.map +1 -0
- package/dist/spec/evolve/pipeline.d.ts +42 -0
- package/dist/spec/evolve/pipeline.d.ts.map +1 -0
- package/dist/spec/evolve/pipeline.js +567 -0
- package/dist/spec/evolve/pipeline.js.map +1 -0
- package/dist/spec/evolve/spec-rewriter.d.ts +42 -0
- package/dist/spec/evolve/spec-rewriter.d.ts.map +1 -0
- package/dist/spec/evolve/spec-rewriter.js +230 -0
- package/dist/spec/evolve/spec-rewriter.js.map +1 -0
- package/dist/spec/graph/queries.d.ts +155 -0
- package/dist/spec/graph/queries.d.ts.map +1 -0
- package/dist/spec/graph/queries.js +440 -0
- package/dist/spec/graph/queries.js.map +1 -0
- package/dist/spec/llm/client.d.ts +29 -0
- package/dist/spec/llm/client.d.ts.map +1 -0
- package/dist/spec/llm/client.js +123 -0
- package/dist/spec/llm/client.js.map +1 -0
- package/dist/spec/llm/index.d.ts +3 -0
- package/dist/spec/llm/index.d.ts.map +1 -0
- package/dist/spec/llm/index.js +11 -0
- package/dist/spec/llm/index.js.map +1 -0
- package/dist/spec/llm/prompts.d.ts +13 -0
- package/dist/spec/llm/prompts.d.ts.map +1 -0
- package/dist/spec/llm/prompts.js +75 -0
- package/dist/spec/llm/prompts.js.map +1 -0
- package/dist/spec/mining/diff-parser.d.ts +33 -0
- package/dist/spec/mining/diff-parser.d.ts.map +1 -0
- package/dist/spec/mining/diff-parser.js +166 -0
- package/dist/spec/mining/diff-parser.js.map +1 -0
- package/dist/spec/mining/git-scanner.d.ts +103 -0
- package/dist/spec/mining/git-scanner.d.ts.map +1 -0
- package/dist/spec/mining/git-scanner.js +307 -0
- package/dist/spec/mining/git-scanner.js.map +1 -0
- package/dist/spec/mining/pipeline.d.ts +53 -0
- package/dist/spec/mining/pipeline.d.ts.map +1 -0
- package/dist/spec/mining/pipeline.js +178 -0
- package/dist/spec/mining/pipeline.js.map +1 -0
- package/dist/spec/mining/scope-resolver.d.ts +45 -0
- package/dist/spec/mining/scope-resolver.d.ts.map +1 -0
- package/dist/spec/mining/scope-resolver.js +103 -0
- package/dist/spec/mining/scope-resolver.js.map +1 -0
- package/dist/spec/mining/spec-extractor.d.ts +69 -0
- package/dist/spec/mining/spec-extractor.d.ts.map +1 -0
- package/dist/spec/mining/spec-extractor.js +369 -0
- package/dist/spec/mining/spec-extractor.js.map +1 -0
- package/dist/spec/types.d.ts +149 -0
- package/dist/spec/types.d.ts.map +1 -0
- package/dist/spec/types.js +15 -0
- package/dist/spec/types.js.map +1 -0
- package/dist/spec/utils.d.ts +167 -0
- package/dist/spec/utils.d.ts.map +1 -0
- package/dist/spec/utils.js +463 -0
- package/dist/spec/utils.js.map +1 -0
- package/dist/sync/worktree.d.ts +9 -0
- package/dist/sync/worktree.d.ts.map +1 -1
- package/dist/sync/worktree.js +40 -0
- package/dist/sync/worktree.js.map +1 -1
- package/dist/types.d.ts +6 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/ui/shimmer-progress.d.ts +2 -0
- package/dist/ui/shimmer-progress.d.ts.map +1 -1
- package/dist/ui/shimmer-progress.js +19 -2
- package/dist/ui/shimmer-progress.js.map +1 -1
- package/dist/upgrade/index.js +1 -1
- package/dist/upgrade/index.js.map +1 -1
- package/package.json +58 -57
- package/scripts/add-lang/bench.sh +60 -60
- package/scripts/add-lang/check-grammar.mjs +75 -75
- package/scripts/add-lang/dump-ast.mjs +103 -103
- package/scripts/add-lang/verify-extraction.mjs +70 -70
- package/scripts/agent-eval/ab-adoption.sh +91 -91
- package/scripts/agent-eval/ab-hook.sh +86 -86
- package/scripts/agent-eval/ab-impl.sh +78 -78
- package/scripts/agent-eval/ab-new-vs-baseline.sh +102 -102
- package/scripts/agent-eval/ab-sufficiency.sh +78 -78
- package/scripts/agent-eval/arms-F.sh +21 -21
- package/scripts/agent-eval/arms-matrix.sh +37 -37
- package/scripts/agent-eval/audit.sh +68 -68
- package/scripts/agent-eval/bench-readme.sh +28 -28
- package/scripts/agent-eval/bench-why-repo.sh +22 -22
- package/scripts/agent-eval/block-read-hook.sh +19 -19
- package/scripts/agent-eval/hook-settings.json +15 -15
- package/scripts/agent-eval/itrun.sh +120 -120
- package/scripts/agent-eval/offload-eval-3arm.sh +72 -72
- package/scripts/agent-eval/offload-eval-cost.mjs +133 -133
- package/scripts/agent-eval/offload-eval-effort.mjs +108 -108
- package/scripts/agent-eval/offload-eval-frontload-matrix.sh +25 -25
- package/scripts/agent-eval/offload-eval-frontload.sh +47 -47
- package/scripts/agent-eval/offload-eval-ground-truth.json +18 -18
- package/scripts/agent-eval/offload-eval-hook.mjs +84 -84
- package/scripts/agent-eval/offload-eval-judge.mjs +103 -103
- package/scripts/agent-eval/offload-eval-matrix.sh +20 -20
- package/scripts/agent-eval/offload-eval-metrics.mjs +94 -94
- package/scripts/agent-eval/offload-eval-refs1.sh +50 -50
- package/scripts/agent-eval/offload-eval-setup.sh +24 -24
- package/scripts/agent-eval/offload-eval-styles.sh +71 -71
- package/scripts/agent-eval/offload-eval-summarize.mjs +68 -68
- package/scripts/agent-eval/offload-eval.md +76 -76
- package/scripts/agent-eval/parse-arms.mjs +116 -116
- package/scripts/agent-eval/parse-bench-readme.mjs +84 -84
- package/scripts/agent-eval/parse-run.mjs +45 -45
- package/scripts/agent-eval/parse-session.mjs +93 -93
- package/scripts/agent-eval/probe-context.mjs +21 -21
- package/scripts/agent-eval/probe-explore.mjs +40 -40
- package/scripts/agent-eval/probe-node.mjs +20 -20
- package/scripts/agent-eval/probe-sweep.mjs +119 -119
- package/scripts/agent-eval/probe-trace.mjs +20 -20
- package/scripts/agent-eval/redirect-read-hook.sh +38 -38
- package/scripts/agent-eval/repro-concurrent-explore.mjs +119 -0
- package/scripts/agent-eval/repro-daemon-clients.mjs +125 -0
- package/scripts/agent-eval/run-agent.sh +34 -34
- package/scripts/agent-eval/run-all.sh +69 -69
- package/scripts/agent-eval/run-arms.sh +56 -56
- package/scripts/agent-eval/seq-matrix.mjs +137 -137
- package/scripts/build-bundle.sh +118 -118
- package/scripts/exp_boundary_eval/README.md +247 -0
- package/scripts/exp_boundary_eval/__pycache__/_utils.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/analyze.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/deveco_arm.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_one.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/run_session.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/__pycache__/setup.cpython-310.pyc +0 -0
- package/scripts/exp_boundary_eval/_test_mcp_chain.py +78 -0
- package/scripts/exp_boundary_eval/_test_stdin.py +8 -0
- package/scripts/exp_boundary_eval/_utils.py +1116 -0
- package/scripts/exp_boundary_eval/analyze.py +1313 -0
- package/scripts/exp_boundary_eval/data/agents.json +109 -0
- package/scripts/exp_boundary_eval/data/experiments.json +140 -0
- package/scripts/exp_boundary_eval/deveco_arm.py +519 -0
- package/scripts/exp_boundary_eval/run_all.py +378 -0
- package/scripts/exp_boundary_eval/run_one.py +165 -0
- package/scripts/exp_boundary_eval/run_session.py +158 -0
- package/scripts/exp_boundary_eval/setup.py +120 -0
- package/scripts/exp_boundary_eval/win_mcp_launcher.py +73 -0
- package/scripts/exp_boundary_eval/win_mcp_stdio_wrap.js +36 -0
- package/scripts/exp_boundary_eval/win_node_launcher.py +24 -0
- package/scripts/extract-release-notes.mjs +130 -130
- package/scripts/local-install.sh +41 -41
- package/scripts/npm-sdk.js +75 -75
- package/scripts/npm-shim.js +268 -246
- package/scripts/ohos-sdk-publish.mjs +133 -0
- package/scripts/pack-npm.sh +119 -119
- package/scripts/prepare-release.mjs +270 -270
- package/scripts/qa_eval/README.md +407 -404
- package/scripts/qa_eval/_test_deveco_probe.py +41 -41
- package/scripts/qa_eval/agent_runner.py +526 -526
- package/scripts/qa_eval/data/.gitignore +4 -4
- package/scripts/qa_eval/data/test-set.jsonl +2 -22
- package/scripts/qa_eval/eval_metrics.py +274 -233
- package/scripts/qa_eval/external_agent.py +976 -671
- package/scripts/qa_eval/llm_config.py +92 -92
- package/scripts/qa_eval/memory_monitor.py +132 -132
- package/scripts/qa_eval/my_answer_accuracy.py +187 -187
- package/scripts/qa_eval/requirements.txt +2 -2
- package/scripts/qa_eval/run_pipeline.py +804 -711
- package/scripts/qa_eval/stats_efficiency.py +279 -279
- 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":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;;AAgBH,gCAEC;AAQD,wCAQC;AA2ND,kCAkDC;AAmBD,kDAyBC;AAtVD,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,8DAA8D;AAC9D,MAAM,SAAS,GAAG,mBAAmB,CAAC;AAEtC;;;GAGG;AACH,SAAgB,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,KAAa;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtD,gFAAgF;IAChF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;AAC3E,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,SAAS,eAAe,CAAC,KAAa,EAAE,KAAa;IACnD,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACxB,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAChC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAC9B,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,SAAS,SAAS,CAAC,KAAa,EAAE,KAAa;IAC7C,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACzC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,EAAE,mBAAmB,CAAC,CAAC;AACpC,CAAC;AAYD,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAS,cAAc,CACrB,EAAkB,EAClB,KAAa,EACb,KAAa,EACb,aAAqB,CAAC;IAEtB,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,KAAK,GAAG,UAAU,CAAC;IAEpC,IAAI,IAAkB,CAAC;IACvB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE;aACN,OAAO,CACN;;;;+BAIuB,CACxB;aACA,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAiB,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAuD,EAAE,CAAC;IACtE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,SAAmB,CAAC;QACxB,IAAI,CAAC;YACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,EAAE,CAAC;QACjB,CAAC;QAED,MAAM,KAAK,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,KAAK;YACZ,MAAM,EAAE;gBACN,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,SAAS;gBACT,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,MAAM;aAChB;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,gCAAgC;AAChC,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAS,eAAe,CACtB,EAAkB,EAClB,KAAa,EACb,KAAa,EACb,UAAuB;IAEvB,oEAAoE;IACpE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,IAAI,OAAO,GAAG,CAAC;IAE/B,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN;;2BAEqB,CACtB;SACA,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,CAAiB,CAAC;IAEpD,MAAM,MAAM,GAAqE,EAAE,CAAC;IACpF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,SAAS;QAErC,IAAI,SAAmB,CAAC;QACxB,IAAI,CAAC;YACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,EAAE,CAAC;QACjB,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC;YACV,KAAK;YACL,IAAI;YACJ,MAAM,EAAE;gBACN,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,SAAS;gBACT,MAAM,EAAE,KAAK;gBACb,OAAO,EAAE,MAAM;gBACf,KAAK,EAAE,IAAiC;aACzC;SACF,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACnB,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QAClD,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,iBAAiB,CAAC,EAAkB,EAAE,KAAa;IAC1D,MAAM,IAAI,GAAG,EAAE;SACZ,OAAO,CACN,6EAA6E,CAC9E;SACA,GAAG,CAAC,KAAK,CAAiB,CAAC;IAE9B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACtB,IAAI,SAAmB,CAAC;QACxB,IAAI,CAAC;YACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,SAAS,GAAG,EAAE,CAAC;QACjB,CAAC;QACD,OAAO;YACL,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,SAAS;YACT,MAAM,EAAE,GAAG;YACX,OAAO,EAAE,WAAoB;SAC9B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,SAAgB,WAAW,CACzB,EAAkB,EAClB,KAAa,EACb,QAAgB,EAAE;IAElB,gDAAgD;IAChD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,GAAG,EAAE;aACZ,OAAO,CAAC,iEAAiE,CAAC;aAC1E,GAAG,CAAC,KAAK,CAAiB,CAAC;QAE9B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACtB,IAAI,SAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS,GAAG,EAAE,CAAC;YACjB,CAAC;YACD,OAAO;gBACL,EAAE,EAAE,GAAG,CAAC,EAAE;gBACV,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,SAAS;gBACT,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,KAAc;aACxB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gCAAgC;IAChC,MAAM,UAAU,GAAG,cAAc,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAEpD,IAAI,UAAU,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC;QAC/B,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,yBAAyB;IACzB,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;IACzC,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAEhE,oEAAoE;IACpE,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,WAAW,CAAC,CAAC;IACjD,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3D,kDAAkD;IAClD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED,8EAA8E;AAC9E,4BAA4B;AAC5B,8EAA8E;AAE9E;;;;;;;;;;;;GAYG;AACH,SAAgB,mBAAmB,CACjC,EAAkB,EAClB,KAAa,EACb,QAAgB,EAAE;IAElB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,2EAA2E;IAC3E,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,IAA2B,CAAC;IAChC,IAAI,CAAC;QACH,IAAI,GAAG,EAAE;aACN,OAAO,CACN;;+BAEuB,CACxB;aACA,GAAG,CAAC,OAAO,EAAE,KAAK,CAA0B,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/B,CAAC"}
|
|
@@ -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"}
|