homegraph 1.1.3 → 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/README.md +43 -18
- 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 +706 -168
- 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 +40 -1
- 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 +174 -3
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +20 -0
- package/dist/directory.d.ts +32 -0
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +83 -0
- 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/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/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/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 +12 -14
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/tools.d.ts +77 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +696 -60
- 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/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 +7 -11
- package/dist/spec/config.d.ts.map +1 -1
- package/dist/spec/config.js +77 -48
- package/dist/spec/config.js.map +1 -1
- package/dist/spec/db/fragment-node.d.ts +1 -0
- package/dist/spec/db/fragment-node.d.ts.map +1 -1
- package/dist/spec/db/fragment-node.js +8 -0
- package/dist/spec/db/fragment-node.js.map +1 -1
- package/dist/spec/db/fts.d.ts +14 -0
- package/dist/spec/db/fts.d.ts.map +1 -1
- package/dist/spec/db/fts.js +43 -4
- package/dist/spec/db/fts.js.map +1 -1
- package/dist/spec/db/schema.d.ts +6 -3
- package/dist/spec/db/schema.d.ts.map +1 -1
- package/dist/spec/db/schema.js +36 -4
- package/dist/spec/db/schema.js.map +1 -1
- package/dist/spec/db/schema.sql +11 -1
- package/dist/spec/evolve/logic-checker.d.ts +2 -2
- package/dist/spec/evolve/logic-checker.d.ts.map +1 -1
- package/dist/spec/evolve/logic-checker.js +3 -27
- package/dist/spec/evolve/logic-checker.js.map +1 -1
- package/dist/spec/evolve/pipeline.d.ts +21 -19
- package/dist/spec/evolve/pipeline.d.ts.map +1 -1
- package/dist/spec/evolve/pipeline.js +284 -31
- package/dist/spec/evolve/pipeline.js.map +1 -1
- package/dist/spec/evolve/spec-rewriter.d.ts +2 -2
- package/dist/spec/evolve/spec-rewriter.d.ts.map +1 -1
- package/dist/spec/evolve/spec-rewriter.js +7 -31
- package/dist/spec/evolve/spec-rewriter.js.map +1 -1
- package/dist/spec/graph/queries.d.ts +97 -0
- package/dist/spec/graph/queries.d.ts.map +1 -1
- package/dist/spec/graph/queries.js +225 -0
- package/dist/spec/graph/queries.js.map +1 -1
- 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/git-scanner.d.ts +12 -0
- package/dist/spec/mining/git-scanner.d.ts.map +1 -1
- package/dist/spec/mining/git-scanner.js +41 -0
- package/dist/spec/mining/git-scanner.js.map +1 -1
- package/dist/spec/mining/pipeline.d.ts.map +1 -1
- package/dist/spec/mining/pipeline.js +14 -1
- package/dist/spec/mining/pipeline.js.map +1 -1
- package/dist/spec/utils.d.ts +2 -1
- package/dist/spec/utils.d.ts.map +1 -1
- package/dist/spec/utils.js +3 -1
- package/dist/spec/utils.js.map +1 -1
- 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 +3 -3
- package/scripts/agent-eval/repro-concurrent-explore.mjs +119 -0
- package/scripts/agent-eval/repro-daemon-clients.mjs +125 -0
- 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/npm-shim.js +25 -3
- package/scripts/ohos-sdk-publish.mjs +133 -0
- package/scripts/qa_eval/README.md +1 -1
- package/scripts/qa_eval/agent_runner.py +1 -1
package/dist/spec/config.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface CommitScopeConfig {
|
|
|
12
12
|
};
|
|
13
13
|
}
|
|
14
14
|
export interface LLMConfig {
|
|
15
|
-
provider: 'openai' | 'anthropic'
|
|
15
|
+
provider: 'openai' | 'anthropic';
|
|
16
16
|
apiKey: string;
|
|
17
17
|
apiKeyEnv?: string;
|
|
18
18
|
model: string;
|
|
@@ -23,21 +23,17 @@ export interface LLMConfig {
|
|
|
23
23
|
export interface SpecConfig {
|
|
24
24
|
discovery: SpecDiscoveryConfig;
|
|
25
25
|
commitScope: CommitScopeConfig;
|
|
26
|
-
llm: LLMConfig;
|
|
26
|
+
llm: LLMConfig | null;
|
|
27
27
|
}
|
|
28
28
|
export declare const DEFAULT_CONFIG: SpecConfig;
|
|
29
29
|
/**
|
|
30
|
-
* Load spec config from `${SPEC_DATA_DIR}/
|
|
30
|
+
* Load spec config from `${SPEC_DATA_DIR}/configs.json` in the given repo path.
|
|
31
31
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
* - Individual sub-objects that are not plain objects → warn-and-skip that
|
|
36
|
-
* section (the rest of the config still merges).
|
|
32
|
+
* Discovery and commitScope sections fall back to code defaults when the config
|
|
33
|
+
* file is missing or invalid. The `llm` section has NO defaults — it is `null`
|
|
34
|
+
* unless the user explicitly provides a valid `llm` block in the config file.
|
|
37
35
|
*
|
|
38
|
-
*
|
|
39
|
-
* function resolves `llm.apiKey` from `process.env[apiKeyEnv]`. An unset env
|
|
40
|
-
* var leaves `apiKey` as whatever the file provided (or the default `""`).
|
|
36
|
+
* When `llm.apiKeyEnv` is set, `llm.apiKey` is resolved from `process.env`.
|
|
41
37
|
*/
|
|
42
38
|
export declare function loadSpecConfig(repoPath: string): SpecConfig;
|
|
43
39
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/spec/config.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE;QACT,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/spec/config.ts"],"names":[],"mappings":"AAoCA,MAAM,WAAW,mBAAmB;IAClC,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAC/B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE;QACT,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,SAAS,EAAE,OAAO,CAAC;QACnB,aAAa,EAAE,OAAO,CAAC;KACxB,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,GAAG,WAAW,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,mBAAmB,CAAC;IAC/B,WAAW,EAAE,iBAAiB,CAAC;IAC/B,GAAG,EAAE,SAAS,GAAG,IAAI,CAAC;CACvB;AAMD,eAAO,MAAM,cAAc,EAAE,UAuBb,CAAC;AAmCjB;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAkD3D"}
|
package/dist/spec/config.js
CHANGED
|
@@ -38,10 +38,10 @@ exports.loadSpecConfig = loadSpecConfig;
|
|
|
38
38
|
/**
|
|
39
39
|
* Spec configuration module — replaces `commit4spec/utils/config.py`.
|
|
40
40
|
*
|
|
41
|
-
* Loads spec mining/evolve configuration from `${SPEC_DATA_DIR}/
|
|
42
|
-
* within a repository
|
|
43
|
-
*
|
|
44
|
-
*
|
|
41
|
+
* Loads spec mining/evolve configuration from `${SPEC_DATA_DIR}/configs.json`
|
|
42
|
+
* within a repository. Discovery and commitScope sections fall back to code
|
|
43
|
+
* defaults; the `llm` section must be explicitly configured by the user —
|
|
44
|
+
* there are no hard-coded LLM defaults.
|
|
45
45
|
*
|
|
46
46
|
* The config file is JSON, e.g.:
|
|
47
47
|
*
|
|
@@ -90,17 +90,10 @@ exports.DEFAULT_CONFIG = Object.freeze({
|
|
|
90
90
|
padSpecNumber: true,
|
|
91
91
|
}),
|
|
92
92
|
}),
|
|
93
|
-
llm:
|
|
94
|
-
provider: 'mock',
|
|
95
|
-
apiKey: '',
|
|
96
|
-
model: 'gpt-4o',
|
|
97
|
-
temperature: 0.2,
|
|
98
|
-
maxTokens: 4096,
|
|
99
|
-
}),
|
|
93
|
+
llm: null,
|
|
100
94
|
});
|
|
101
|
-
/** Config
|
|
102
|
-
const
|
|
103
|
-
const CONFIG_FILENAME = 'spec.json';
|
|
95
|
+
/** Config file path relative to the repo root. */
|
|
96
|
+
const CONFIG_FILE = `${utils_1.SPEC_DATA_DIR}/configs.json`;
|
|
104
97
|
// ---------------------------------------------------------------------------
|
|
105
98
|
// Deep merge
|
|
106
99
|
// ---------------------------------------------------------------------------
|
|
@@ -128,26 +121,22 @@ function deepMerge(target, source) {
|
|
|
128
121
|
// Load
|
|
129
122
|
// ---------------------------------------------------------------------------
|
|
130
123
|
/**
|
|
131
|
-
* Load spec config from `${SPEC_DATA_DIR}/
|
|
124
|
+
* Load spec config from `${SPEC_DATA_DIR}/configs.json` in the given repo path.
|
|
132
125
|
*
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
* - Individual sub-objects that are not plain objects → warn-and-skip that
|
|
137
|
-
* section (the rest of the config still merges).
|
|
126
|
+
* Discovery and commitScope sections fall back to code defaults when the config
|
|
127
|
+
* file is missing or invalid. The `llm` section has NO defaults — it is `null`
|
|
128
|
+
* unless the user explicitly provides a valid `llm` block in the config file.
|
|
138
129
|
*
|
|
139
|
-
*
|
|
140
|
-
* function resolves `llm.apiKey` from `process.env[apiKeyEnv]`. An unset env
|
|
141
|
-
* var leaves `apiKey` as whatever the file provided (or the default `""`).
|
|
130
|
+
* When `llm.apiKeyEnv` is set, `llm.apiKey` is resolved from `process.env`.
|
|
142
131
|
*/
|
|
143
132
|
function loadSpecConfig(repoPath) {
|
|
144
|
-
const file = path.join(repoPath,
|
|
133
|
+
const file = path.join(repoPath, CONFIG_FILE);
|
|
145
134
|
let raw;
|
|
146
135
|
try {
|
|
147
136
|
raw = fs.readFileSync(file, 'utf-8');
|
|
148
137
|
}
|
|
149
138
|
catch {
|
|
150
|
-
// No config file —
|
|
139
|
+
// No config file — return defaults for discovery/commitScope, null for llm.
|
|
151
140
|
return cloneDefaults();
|
|
152
141
|
}
|
|
153
142
|
let parsed;
|
|
@@ -155,24 +144,26 @@ function loadSpecConfig(repoPath) {
|
|
|
155
144
|
parsed = JSON.parse(raw);
|
|
156
145
|
}
|
|
157
146
|
catch (err) {
|
|
158
|
-
(0, errors_1.logWarn)(`Ignoring ${
|
|
147
|
+
(0, errors_1.logWarn)(`Ignoring ${CONFIG_FILE}: not valid JSON`, {
|
|
159
148
|
file,
|
|
160
149
|
error: err instanceof Error ? err.message : String(err),
|
|
161
150
|
});
|
|
162
151
|
return cloneDefaults();
|
|
163
152
|
}
|
|
164
153
|
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
165
|
-
(0, errors_1.logWarn)(`Ignoring ${
|
|
154
|
+
(0, errors_1.logWarn)(`Ignoring ${CONFIG_FILE}: top-level value must be a JSON object`, { file });
|
|
166
155
|
return cloneDefaults();
|
|
167
156
|
}
|
|
168
|
-
// Deep merge user config over defaults
|
|
157
|
+
// Deep merge user config over defaults (discovery and commitScope have defaults;
|
|
158
|
+
// llm is null in the default — it must come from the user file.)
|
|
169
159
|
const merged = deepMerge(exports.DEFAULT_CONFIG, parsed);
|
|
170
|
-
// Normalize sub-objects that fail the type guard
|
|
160
|
+
// Normalize sub-objects that fail the type guard
|
|
171
161
|
merged.discovery = normalizeDiscovery(merged.discovery, file);
|
|
172
162
|
merged.commitScope = normalizeCommitScope(merged.commitScope, file);
|
|
173
|
-
|
|
163
|
+
// Validate LLM section. No defaults — user must provide provider, model, apiKey.
|
|
164
|
+
merged.llm = validateLLM(parsed.llm, file);
|
|
174
165
|
// Resolve apiKey from env if apiKeyEnv is set
|
|
175
|
-
if (merged.llm
|
|
166
|
+
if (merged.llm?.apiKeyEnv) {
|
|
176
167
|
const envKey = process.env[merged.llm.apiKeyEnv];
|
|
177
168
|
if (envKey !== undefined) {
|
|
178
169
|
merged.llm.apiKey = envKey;
|
|
@@ -181,11 +172,11 @@ function loadSpecConfig(repoPath) {
|
|
|
181
172
|
return merged;
|
|
182
173
|
}
|
|
183
174
|
// ---------------------------------------------------------------------------
|
|
184
|
-
// Normalizers — ensure sub-configs are well-formed after merge
|
|
175
|
+
// Normalizers / Validators — ensure sub-configs are well-formed after merge
|
|
185
176
|
// ---------------------------------------------------------------------------
|
|
186
177
|
function normalizeDiscovery(val, file) {
|
|
187
178
|
if (!val || typeof val !== 'object' || Array.isArray(val)) {
|
|
188
|
-
(0, errors_1.logWarn)(`Ignoring "discovery" in ${
|
|
179
|
+
(0, errors_1.logWarn)(`Ignoring "discovery" in ${CONFIG_FILE}: must be an object`, { file });
|
|
189
180
|
return { ...exports.DEFAULT_CONFIG.discovery };
|
|
190
181
|
}
|
|
191
182
|
const def = exports.DEFAULT_CONFIG.discovery;
|
|
@@ -197,7 +188,7 @@ function normalizeDiscovery(val, file) {
|
|
|
197
188
|
}
|
|
198
189
|
function normalizeCommitScope(val, file) {
|
|
199
190
|
if (!val || typeof val !== 'object' || Array.isArray(val)) {
|
|
200
|
-
(0, errors_1.logWarn)(`Ignoring "commitScope" in ${
|
|
191
|
+
(0, errors_1.logWarn)(`Ignoring "commitScope" in ${CONFIG_FILE}: must be an object`, { file });
|
|
201
192
|
return { ...exports.DEFAULT_CONFIG.commitScope, normalize: { ...exports.DEFAULT_CONFIG.commitScope.normalize } };
|
|
202
193
|
}
|
|
203
194
|
const def = exports.DEFAULT_CONFIG.commitScope;
|
|
@@ -219,28 +210,66 @@ function normalizeCommitScope(val, file) {
|
|
|
219
210
|
},
|
|
220
211
|
};
|
|
221
212
|
}
|
|
222
|
-
|
|
213
|
+
const LLM_CONFIG_EXAMPLE = [
|
|
214
|
+
'',
|
|
215
|
+
'Example minimal llm config:',
|
|
216
|
+
'{',
|
|
217
|
+
' "llm": {',
|
|
218
|
+
' "provider": "openai",',
|
|
219
|
+
' "apiKeyEnv": "OPENAI_API_KEY",',
|
|
220
|
+
' "model": "gpt-4o"',
|
|
221
|
+
' }',
|
|
222
|
+
'}',
|
|
223
|
+
].join('\n');
|
|
224
|
+
/**
|
|
225
|
+
* Validate an `llm` section from the user config file.
|
|
226
|
+
*
|
|
227
|
+
* Required fields (no defaults — user must provide them):
|
|
228
|
+
* - `provider`: must be `"openai"` or `"anthropic"`
|
|
229
|
+
* - `model`: non-empty string
|
|
230
|
+
* - `apiKey` or `apiKeyEnv`: at least one must be set (env var is resolved later)
|
|
231
|
+
*
|
|
232
|
+
* Optional fields with defaults:
|
|
233
|
+
* - `temperature`: defaults to 0.2
|
|
234
|
+
* - `maxTokens`: defaults to 4096
|
|
235
|
+
*
|
|
236
|
+
* Returns a valid LLMConfig, or `null` if the user did not provide an `llm`
|
|
237
|
+
* section at all (no error in that case — callers decide how to handle it).
|
|
238
|
+
*/
|
|
239
|
+
function validateLLM(val, file) {
|
|
223
240
|
if (!val || typeof val !== 'object' || Array.isArray(val)) {
|
|
224
|
-
|
|
225
|
-
return
|
|
241
|
+
// No llm section provided — null, not an error.
|
|
242
|
+
return null;
|
|
226
243
|
}
|
|
227
|
-
|
|
244
|
+
// --- provider ---
|
|
228
245
|
const provider = val.provider;
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
246
|
+
if (provider !== 'openai' && provider !== 'anthropic') {
|
|
247
|
+
throw new Error(`Invalid llm.provider in ${file}: must be "openai" or "anthropic", ` +
|
|
248
|
+
`got ${JSON.stringify(provider)}.${LLM_CONFIG_EXAMPLE}`);
|
|
249
|
+
}
|
|
250
|
+
// --- model ---
|
|
251
|
+
if (typeof val.model !== 'string' || val.model.length === 0) {
|
|
252
|
+
throw new Error(`Missing llm.model in ${file}. Specify a model name, e.g. "gpt-4o".${LLM_CONFIG_EXAMPLE}`);
|
|
253
|
+
}
|
|
254
|
+
// --- apiKey / apiKeyEnv ---
|
|
255
|
+
const directKey = typeof val.apiKey === 'string' ? val.apiKey : '';
|
|
256
|
+
const apiKeyEnv = typeof val.apiKeyEnv === 'string' ? val.apiKeyEnv : undefined;
|
|
257
|
+
if (!directKey && !apiKeyEnv) {
|
|
258
|
+
throw new Error(`Missing llm.apiKey or llm.apiKeyEnv in ${file}. ` +
|
|
259
|
+
`Set "apiKey" directly or use "apiKeyEnv" to reference an environment variable.${LLM_CONFIG_EXAMPLE}`);
|
|
260
|
+
}
|
|
232
261
|
return {
|
|
233
|
-
provider:
|
|
234
|
-
apiKey:
|
|
235
|
-
apiKeyEnv
|
|
236
|
-
model:
|
|
262
|
+
provider: provider,
|
|
263
|
+
apiKey: directKey,
|
|
264
|
+
apiKeyEnv,
|
|
265
|
+
model: val.model,
|
|
237
266
|
baseUrl: typeof val.baseUrl === 'string' ? val.baseUrl : undefined,
|
|
238
267
|
temperature: typeof val.temperature === 'number' && !isNaN(val.temperature)
|
|
239
268
|
? val.temperature
|
|
240
|
-
:
|
|
269
|
+
: 0.2,
|
|
241
270
|
maxTokens: typeof val.maxTokens === 'number' && Number.isInteger(val.maxTokens) && val.maxTokens > 0
|
|
242
271
|
? val.maxTokens
|
|
243
|
-
:
|
|
272
|
+
: 4096,
|
|
244
273
|
};
|
|
245
274
|
}
|
|
246
275
|
// ---------------------------------------------------------------------------
|
|
@@ -260,7 +289,7 @@ function normalizeStringArray(raw, defaultVal, label, file) {
|
|
|
260
289
|
out.push(entry);
|
|
261
290
|
}
|
|
262
291
|
else {
|
|
263
|
-
(0, errors_1.logWarn)(`Ignoring "${label}" entry in ${
|
|
292
|
+
(0, errors_1.logWarn)(`Ignoring "${label}" entry in ${CONFIG_FILE}: each value must be a non-empty string`, { file, entry: String(entry) });
|
|
264
293
|
}
|
|
265
294
|
}
|
|
266
295
|
return out.length > 0 ? out : [...defaultVal];
|
package/dist/spec/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/spec/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/spec/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { SqliteDatabase } from '../../db/sqlite-adapter';
|
|
|
5
5
|
import { CodeFragmentNode } from '../types';
|
|
6
6
|
/**
|
|
7
7
|
* Insert a CodeFragmentNode, auto-generating an ID if the `id` field is empty.
|
|
8
|
+
* Also writes to the code_fragments_fts index for content-based search.
|
|
8
9
|
*/
|
|
9
10
|
export declare function insertCodeFragment(db: SqliteDatabase, node: CodeFragmentNode): CodeFragmentNode;
|
|
10
11
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fragment-node.d.ts","sourceRoot":"","sources":["../../../src/spec/db/fragment-node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA8C5C
|
|
1
|
+
{"version":3,"file":"fragment-node.d.ts","sourceRoot":"","sources":["../../../src/spec/db/fragment-node.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AA8C5C;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,cAAc,EAClB,IAAI,EAAE,gBAAgB,GACrB,gBAAgB,CA4BlB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,cAAc,EAClB,UAAU,EAAE,MAAM,GACjB,gBAAgB,GAAG,IAAI,CAMzB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,cAAc,EAClB,UAAU,EAAE,MAAM,GACjB,gBAAgB,EAAE,CAUpB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAKzD"}
|
|
@@ -69,6 +69,7 @@ function rowToFragment(row) {
|
|
|
69
69
|
// ---------------------------------------------------------------------------
|
|
70
70
|
/**
|
|
71
71
|
* Insert a CodeFragmentNode, auto-generating an ID if the `id` field is empty.
|
|
72
|
+
* Also writes to the code_fragments_fts index for content-based search.
|
|
72
73
|
*/
|
|
73
74
|
function insertCodeFragment(db, node) {
|
|
74
75
|
const fragment = { ...node };
|
|
@@ -87,6 +88,13 @@ function insertCodeFragment(db, node) {
|
|
|
87
88
|
endLine: fragment.endLine,
|
|
88
89
|
codeDiff: fragment.codeDiff,
|
|
89
90
|
});
|
|
91
|
+
// Sync to FTS5 index for content-based search.
|
|
92
|
+
// DELETE + INSERT (not INSERT OR REPLACE) because code_fragments_fts is a
|
|
93
|
+
// standalone FTS5 table without UNIQUE constraints — INSERT OR REPLACE has
|
|
94
|
+
// no conflict to trigger on and would accumulate stale index entries.
|
|
95
|
+
db.prepare('DELETE FROM code_fragments_fts WHERE id = ?').run(fragment.id);
|
|
96
|
+
db.prepare('INSERT INTO code_fragments_fts (id, file_path, code_diff) VALUES (?, ?, ?)')
|
|
97
|
+
.run(fragment.id, fragment.filePath, fragment.codeDiff);
|
|
90
98
|
return fragment;
|
|
91
99
|
}
|
|
92
100
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fragment-node.js","sourceRoot":"","sources":["../../../src/spec/db/fragment-node.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"fragment-node.js","sourceRoot":"","sources":["../../../src/spec/db/fragment-node.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDH,gDA+BC;AAMD,4CASC;AAKD,sDAaC;AAKD,wCAKC;AA9HD,+CAAiC;AAiBjC,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;GAGG;AACH,SAAS,MAAM;IACb,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,aAAa,CAAC,GAAoB;IACzC,OAAO;QACL,EAAE,EAAE,GAAG,CAAC,EAAE;QACV,UAAU,EAAE,GAAG,CAAC,WAA6C;QAC7D,QAAQ,EAAE,GAAG,CAAC,SAAS;QACvB,SAAS,EAAE,GAAG,CAAC,UAAU;QACzB,OAAO,EAAE,GAAG,CAAC,QAAQ;QACrB,QAAQ,EAAE,GAAG,CAAC,SAAS;KACxB,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;GAGG;AACH,SAAgB,kBAAkB,CAChC,EAAkB,EAClB,IAAsB;IAEtB,MAAM,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC;IACzB,CAAC;IAED,EAAE,CAAC,OAAO,CAAC;;;;GAIV,CAAC,CAAC,GAAG,CAAC;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,QAAQ,EAAE,QAAQ,CAAC,QAAQ;KAC5B,CAAC,CAAC;IAEH,+CAA+C;IAC/C,0EAA0E;IAC1E,2EAA2E;IAC3E,sEAAsE;IACtE,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3E,EAAE,CAAC,OAAO,CAAC,4EAA4E,CAAC;SACrF,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAE1D,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,EAAkB,EAClB,UAAkB;IAElB,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CACpB,0GAA0G,CAC3G,CAAC,GAAG,CAAC,UAAU,CAAgC,CAAC;IAEjD,OAAO,GAAG,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,SAAgB,qBAAqB,CACnC,EAAkB,EAClB,UAAkB;IAElB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;;GAMvB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAsB,CAAC;IAExC,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,EAAkB;IAC/C,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,iDAAiD,CAAC,CAAC,GAAG,EAEhE,CAAC;IACd,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;AACvB,CAAC"}
|
package/dist/spec/db/fts.d.ts
CHANGED
|
@@ -57,4 +57,18 @@ export declare function escapeFtsQuery(query: string): string;
|
|
|
57
57
|
* and ``_tier`` (for LIKE matches).
|
|
58
58
|
*/
|
|
59
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[];
|
|
60
74
|
//# sourceMappingURL=fts.d.ts.map
|
|
@@ -1 +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,
|
|
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"}
|
package/dist/spec/db/fts.js
CHANGED
|
@@ -34,6 +34,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
34
34
|
exports.segmentCjk = segmentCjk;
|
|
35
35
|
exports.escapeFtsQuery = escapeFtsQuery;
|
|
36
36
|
exports.searchSpecs = searchSpecs;
|
|
37
|
+
exports.searchCodeFragments = searchCodeFragments;
|
|
37
38
|
// ===========================================================================
|
|
38
39
|
// CJK Segmentation
|
|
39
40
|
// ===========================================================================
|
|
@@ -58,7 +59,8 @@ function escapeFtsQuery(query) {
|
|
|
58
59
|
return '""';
|
|
59
60
|
const segmented = segmentCjk(trimmed);
|
|
60
61
|
const tokens = segmented.split(/\s+/).filter(Boolean);
|
|
61
|
-
|
|
62
|
+
// Escape embedded double-quotes: inside FTS5 quoted phrases, " is escaped as ""
|
|
63
|
+
return tokens.map((t) => `"${t.replace(/"/g, '""')}"`).join(' ') || '""';
|
|
62
64
|
}
|
|
63
65
|
// ===========================================================================
|
|
64
66
|
// Weighted Scoring
|
|
@@ -159,10 +161,12 @@ function searchSpecsFts(db, query, limit, oversample = 3) {
|
|
|
159
161
|
* duplicating FTS5 results).
|
|
160
162
|
*/
|
|
161
163
|
function searchSpecsLike(db, query, limit, excludeIds) {
|
|
162
|
-
|
|
164
|
+
// Escape LIKE metacharacters so '%' and '_' are treated as literals
|
|
165
|
+
const escaped = query.replace(/\\/g, '\\\\').replace(/%/g, '\\%').replace(/_/g, '\\_');
|
|
166
|
+
const likePat = `%${escaped}%`;
|
|
163
167
|
const rows = db
|
|
164
168
|
.prepare(`SELECT id, title, subtitles FROM spec_nodes
|
|
165
|
-
WHERE title LIKE ? OR subtitles LIKE ?
|
|
169
|
+
WHERE title LIKE ? ESCAPE '\\' OR subtitles LIKE ? ESCAPE '\\'
|
|
166
170
|
ORDER BY id LIMIT ?`)
|
|
167
171
|
.all(likePat, likePat, limit * 3);
|
|
168
172
|
const scored = [];
|
|
@@ -206,7 +210,7 @@ function searchSpecsLike(db, query, limit, excludeIds) {
|
|
|
206
210
|
*/
|
|
207
211
|
function discoveryFallback(db, limit) {
|
|
208
212
|
const rows = db
|
|
209
|
-
.prepare('SELECT id, title, subtitles FROM spec_nodes ORDER BY
|
|
213
|
+
.prepare('SELECT id, title, subtitles FROM spec_nodes ORDER BY timestamp DESC LIMIT ?')
|
|
210
214
|
.all(limit);
|
|
211
215
|
return rows.map((row) => {
|
|
212
216
|
let subtitles;
|
|
@@ -282,4 +286,39 @@ function searchSpecs(db, query, limit = 10) {
|
|
|
282
286
|
}
|
|
283
287
|
return combined.slice(0, limit);
|
|
284
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
|
+
}
|
|
285
324
|
//# sourceMappingURL=fts.js.map
|
package/dist/spec/db/fts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fts.js","sourceRoot":"","sources":["../../../src/spec/db/fts.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;;AAgBH,gCAEC;AAQD,
|
|
1
|
+
{"version":3,"file":"fts.js","sourceRoot":"","sources":["../../../src/spec/db/fts.ts"],"names":[],"mappings":"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"}
|
package/dist/spec/db/schema.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { SqliteDatabase } from '../../db/sqlite-adapter';
|
|
|
10
10
|
* The latest schema version this module knows about.
|
|
11
11
|
* Bump this when adding migrations.
|
|
12
12
|
*/
|
|
13
|
-
export declare const CURRENT_SPEC_SCHEMA_VERSION =
|
|
13
|
+
export declare const CURRENT_SPEC_SCHEMA_VERSION = 2;
|
|
14
14
|
/**
|
|
15
15
|
* Execute all DDL statements from `schema.sql`.
|
|
16
16
|
*
|
|
@@ -24,7 +24,10 @@ export declare function initSpecSchema(db: SqliteDatabase): void;
|
|
|
24
24
|
*/
|
|
25
25
|
export declare function getCurrentSpecVersion(db: SqliteDatabase): number;
|
|
26
26
|
/**
|
|
27
|
-
* Run pending migrations
|
|
27
|
+
* Run pending migrations.
|
|
28
|
+
*
|
|
29
|
+
* v1 → v2: Create code_fragments_fts virtual table and populate it
|
|
30
|
+
* from existing code_fragment_nodes data.
|
|
28
31
|
*/
|
|
29
|
-
export declare function runSpecMigrations(
|
|
32
|
+
export declare function runSpecMigrations(db: SqliteDatabase, fromVersion: number): void;
|
|
30
33
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/spec/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAIzD;;;GAGG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAMvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAShE;AAED
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/spec/db/schema.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAIzD;;;GAGG;AACH,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,GAAG,IAAI,CAMvD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,cAAc,GAAG,MAAM,CAShE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAwC/E"}
|
package/dist/spec/db/schema.js
CHANGED
|
@@ -50,7 +50,7 @@ const path = __importStar(require("path"));
|
|
|
50
50
|
* The latest schema version this module knows about.
|
|
51
51
|
* Bump this when adding migrations.
|
|
52
52
|
*/
|
|
53
|
-
exports.CURRENT_SPEC_SCHEMA_VERSION =
|
|
53
|
+
exports.CURRENT_SPEC_SCHEMA_VERSION = 2;
|
|
54
54
|
/**
|
|
55
55
|
* Execute all DDL statements from `schema.sql`.
|
|
56
56
|
*
|
|
@@ -79,9 +79,41 @@ function getCurrentSpecVersion(db) {
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
/**
|
|
82
|
-
* Run pending migrations
|
|
82
|
+
* Run pending migrations.
|
|
83
|
+
*
|
|
84
|
+
* v1 → v2: Create code_fragments_fts virtual table and populate it
|
|
85
|
+
* from existing code_fragment_nodes data.
|
|
83
86
|
*/
|
|
84
|
-
function runSpecMigrations(
|
|
85
|
-
|
|
87
|
+
function runSpecMigrations(db, fromVersion) {
|
|
88
|
+
if (fromVersion < 2) {
|
|
89
|
+
// Create the FTS5 virtual table — the IF NOT EXISTS in schema.sql
|
|
90
|
+
// handles the case where DDL already ran, but we explicitly run it
|
|
91
|
+
// here for databases that existed before this migration was added.
|
|
92
|
+
db.exec(`
|
|
93
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS code_fragments_fts USING fts5(
|
|
94
|
+
id,
|
|
95
|
+
file_path,
|
|
96
|
+
code_diff
|
|
97
|
+
);
|
|
98
|
+
`);
|
|
99
|
+
// Populate FTS from existing code_fragment_nodes data
|
|
100
|
+
const count = db.prepare('SELECT COUNT(*) as cnt FROM code_fragments_fts').get().cnt;
|
|
101
|
+
if (count === 0) {
|
|
102
|
+
const rows = db
|
|
103
|
+
.prepare('SELECT id, file_path, code_diff FROM code_fragment_nodes')
|
|
104
|
+
.all();
|
|
105
|
+
if (rows.length > 0) {
|
|
106
|
+
const insert = db.prepare('INSERT INTO code_fragments_fts (id, file_path, code_diff) VALUES (?, ?, ?)');
|
|
107
|
+
const insertMany = db.transaction((fragments) => {
|
|
108
|
+
for (const f of fragments) {
|
|
109
|
+
insert.run(f.id, f.file_path, f.code_diff);
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
insertMany(rows);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Record migration
|
|
116
|
+
db.prepare("INSERT OR IGNORE INTO spec_schema_versions (version, applied_at, description) VALUES (2, strftime('%s', 'now') * 1000, 'Add code_fragments_fts for content-based fragment search')").run();
|
|
117
|
+
}
|
|
86
118
|
}
|
|
87
119
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/spec/db/schema.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBH,wCAMC;AAMD,sDASC;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/spec/db/schema.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBH,wCAMC;AAMD,sDASC;AAQD,8CAwCC;AApFD,uCAAyB;AACzB,2CAA6B;AAE7B;;;GAGG;AACU,QAAA,2BAA2B,GAAG,CAAC,CAAC;AAE7C;;;;;GAKG;AACH,SAAgB,cAAc,CAAC,EAAkB;IAC/C,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAE/B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACpD,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB,CAAC,EAAkB;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,0DAA0D,CAAC;aACnE,GAAG,EAA4C,CAAC;QACnD,OAAO,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAAC,EAAkB,EAAE,WAAmB;IACvE,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;QACpB,kEAAkE;QAClE,mEAAmE;QACnE,mEAAmE;QACnE,EAAE,CAAC,IAAI,CAAC;;;;;;KAMP,CAAC,CAAC;QAEH,sDAAsD;QACtD,MAAM,KAAK,GACT,EAAE,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC,GAAG,EACjE,CAAC,GAAG,CAAC;QACN,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,GAAG,EAAE;iBACZ,OAAO,CAAC,0DAA0D,CAAC;iBACnE,GAAG,EAAiE,CAAC;YAExE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CACvB,4EAA4E,CAC7E,CAAC;gBACF,MAAM,UAAU,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,SAAsE,EAAE,EAAE;oBAC3G,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;wBAC1B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;oBAC7C,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,UAAU,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,EAAE,CAAC,OAAO,CACR,oLAAoL,CACrL,CAAC,GAAG,EAAE,CAAC;IACV,CAAC;AACH,CAAC"}
|
package/dist/spec/db/schema.sql
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
-- Commit4Spec Schema for HomeGraph
|
|
2
|
-
-- Version
|
|
2
|
+
-- Version 2
|
|
3
3
|
--
|
|
4
4
|
-- Independent tables that coexist alongside HomeGraph's `nodes`/`edges`
|
|
5
5
|
-- core graph. These tables form a three-layer Spec→Commit→CodeFragment
|
|
@@ -78,6 +78,12 @@ CREATE VIRTUAL TABLE IF NOT EXISTS specs_fts USING fts5(
|
|
|
78
78
|
subtitles
|
|
79
79
|
);
|
|
80
80
|
|
|
81
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS code_fragments_fts USING fts5(
|
|
82
|
+
id,
|
|
83
|
+
file_path,
|
|
84
|
+
code_diff
|
|
85
|
+
);
|
|
86
|
+
|
|
81
87
|
-- =============================================================================
|
|
82
88
|
-- Indexes
|
|
83
89
|
-- =============================================================================
|
|
@@ -86,6 +92,7 @@ CREATE INDEX IF NOT EXISTS idx_spec_nodes_status ON spec_nodes(status);
|
|
|
86
92
|
CREATE INDEX IF NOT EXISTS idx_spec_nodes_file_path ON spec_nodes(file_path);
|
|
87
93
|
CREATE INDEX IF NOT EXISTS idx_commit_nodes_timestamp ON commit_nodes(timestamp);
|
|
88
94
|
CREATE INDEX IF NOT EXISTS idx_code_fragment_file_path ON code_fragment_nodes(file_path);
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_code_fragment_path_lines ON code_fragment_nodes(file_path, start_line, end_line);
|
|
89
96
|
CREATE INDEX IF NOT EXISTS idx_scr_spec_id ON spec_commit_relations(spec_id);
|
|
90
97
|
CREATE INDEX IF NOT EXISTS idx_scr_commit_hash ON spec_commit_relations(commit_hash);
|
|
91
98
|
CREATE INDEX IF NOT EXISTS idx_cfr_commit_hash ON commit_fragment_relations(commit_hash);
|
|
@@ -105,3 +112,6 @@ CREATE TABLE IF NOT EXISTS spec_schema_versions (
|
|
|
105
112
|
|
|
106
113
|
INSERT OR IGNORE INTO spec_schema_versions (version, applied_at, description)
|
|
107
114
|
VALUES (1, strftime('%s', 'now') * 1000, 'Initial Commit4Spec schema');
|
|
115
|
+
|
|
116
|
+
INSERT OR IGNORE INTO spec_schema_versions (version, applied_at, description)
|
|
117
|
+
VALUES (2, strftime('%s', 'now') * 1000, 'Add code_fragments_fts for content-based fragment search');
|