homegraph 1.4.1 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -11
- package/dist/bin/homegraph.js +295 -72
- package/dist/bin/homegraph.js.map +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +32 -11
- package/dist/context/index.js.map +1 -1
- package/dist/db/index.d.ts +143 -1
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +293 -16
- package/dist/db/index.js.map +1 -1
- package/dist/db/queries.d.ts +43 -4
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +138 -14
- package/dist/db/queries.js.map +1 -1
- package/dist/db/sqlite-adapter.d.ts +24 -17
- package/dist/db/sqlite-adapter.d.ts.map +1 -1
- package/dist/db/sqlite-adapter.js +292 -36
- package/dist/db/sqlite-adapter.js.map +1 -1
- package/dist/db/wal-valve.d.ts +15 -2
- package/dist/db/wal-valve.d.ts.map +1 -1
- package/dist/db/wal-valve.js +88 -6
- package/dist/db/wal-valve.js.map +1 -1
- package/dist/extraction/arkts-batch-worker.js +3 -2
- package/dist/extraction/arkts-batch-worker.js.map +1 -1
- package/dist/extraction/default-ignore.d.ts +39 -0
- package/dist/extraction/default-ignore.d.ts.map +1 -0
- package/dist/extraction/default-ignore.js +221 -0
- package/dist/extraction/default-ignore.js.map +1 -0
- package/dist/extraction/index.d.ts +9 -10
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +227 -323
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/arkts.d.ts +90 -6
- package/dist/extraction/languages/arkts.d.ts.map +1 -1
- package/dist/extraction/languages/arkts.js +1579 -128
- package/dist/extraction/languages/arkts.js.map +1 -1
- package/dist/extraction/store-worker.d.ts +20 -0
- package/dist/extraction/store-worker.d.ts.map +1 -0
- package/dist/extraction/store-worker.js +102 -0
- package/dist/extraction/store-worker.js.map +1 -0
- package/dist/extraction/store-writer.d.ts +48 -0
- package/dist/extraction/store-writer.d.ts.map +1 -0
- package/dist/extraction/store-writer.js +167 -0
- package/dist/extraction/store-writer.js.map +1 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.js +47 -0
- package/dist/extraction/tree-sitter.js.map +1 -1
- package/dist/extraction/wasm-runtime-flags.d.ts +14 -4
- package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
- package/dist/extraction/wasm-runtime-flags.js +55 -7
- package/dist/extraction/wasm-runtime-flags.js.map +1 -1
- package/dist/index.d.ts +16 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +135 -97
- package/dist/index.js.map +1 -1
- package/dist/mcp/query-worker.d.ts +2 -2
- package/dist/mcp/query-worker.js +2 -2
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +42 -26
- package/dist/mcp/tools.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts +52 -16
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +234 -180
- package/dist/resolution/callback-synthesizer.js.map +1 -1
- package/dist/resolution/cooperative-yield.d.ts +10 -2
- package/dist/resolution/cooperative-yield.d.ts.map +1 -1
- package/dist/resolution/cooperative-yield.js +6 -4
- package/dist/resolution/cooperative-yield.js.map +1 -1
- package/dist/resolution/frameworks/go.d.ts.map +1 -1
- package/dist/resolution/frameworks/go.js +29 -6
- package/dist/resolution/frameworks/go.js.map +1 -1
- package/dist/resolution/import-resolver.d.ts +2 -3
- package/dist/resolution/import-resolver.d.ts.map +1 -1
- package/dist/resolution/import-resolver.js +166 -7
- package/dist/resolution/import-resolver.js.map +1 -1
- package/dist/resolution/index.d.ts +87 -2
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +739 -131
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/memory-budget.d.ts +48 -0
- package/dist/resolution/memory-budget.d.ts.map +1 -0
- package/dist/resolution/memory-budget.js +162 -0
- package/dist/resolution/memory-budget.js.map +1 -0
- package/dist/resolution/name-matcher.d.ts +12 -1
- package/dist/resolution/name-matcher.d.ts.map +1 -1
- package/dist/resolution/name-matcher.js +439 -97
- package/dist/resolution/name-matcher.js.map +1 -1
- package/dist/resolution/resolver-pool.d.ts +106 -0
- package/dist/resolution/resolver-pool.d.ts.map +1 -0
- package/dist/resolution/resolver-pool.js +344 -0
- package/dist/resolution/resolver-pool.js.map +1 -0
- package/dist/resolution/resolver-worker.d.ts +17 -0
- package/dist/resolution/resolver-worker.d.ts.map +1 -0
- package/dist/resolution/resolver-worker.js +141 -0
- package/dist/resolution/resolver-worker.js.map +1 -0
- package/dist/resolution/types.d.ts +3 -0
- package/dist/resolution/types.d.ts.map +1 -1
- package/dist/spec/build/diff-parser.d.ts +55 -0
- package/dist/spec/build/diff-parser.d.ts.map +1 -0
- package/dist/spec/build/diff-parser.js +205 -0
- package/dist/spec/build/diff-parser.js.map +1 -0
- package/dist/spec/build/git-scanner.d.ts +93 -0
- package/dist/spec/build/git-scanner.d.ts.map +1 -0
- package/dist/spec/build/git-scanner.js +254 -0
- package/dist/spec/build/git-scanner.js.map +1 -0
- package/dist/spec/build/pipeline.d.ts +54 -0
- package/dist/spec/build/pipeline.d.ts.map +1 -0
- package/dist/spec/build/pipeline.js +170 -0
- package/dist/spec/build/pipeline.js.map +1 -0
- package/dist/spec/build/scan.d.ts +48 -0
- package/dist/spec/build/scan.d.ts.map +1 -0
- package/dist/spec/build/scan.js +89 -0
- package/dist/spec/build/scan.js.map +1 -0
- package/dist/spec/build/scope-resolver.d.ts +50 -0
- package/dist/spec/build/scope-resolver.d.ts.map +1 -0
- package/dist/spec/build/scope-resolver.js +105 -0
- package/dist/spec/build/scope-resolver.js.map +1 -0
- package/dist/spec/build/spec-extractor.d.ts +74 -0
- package/dist/spec/build/spec-extractor.d.ts.map +1 -0
- package/dist/spec/build/spec-extractor.js +344 -0
- package/dist/spec/build/spec-extractor.js.map +1 -0
- package/dist/spec/config.d.ts +35 -1
- package/dist/spec/config.d.ts.map +1 -1
- package/dist/spec/config.js +30 -5
- package/dist/spec/config.js.map +1 -1
- package/dist/spec/db/fts.d.ts.map +1 -1
- package/dist/spec/db/fts.js +19 -50
- package/dist/spec/db/fts.js.map +1 -1
- package/dist/spec/db/index.d.ts +5 -3
- package/dist/spec/db/index.d.ts.map +1 -1
- package/dist/spec/db/index.js +16 -1
- package/dist/spec/db/index.js.map +1 -1
- package/dist/spec/db/persist.d.ts +45 -0
- package/dist/spec/db/persist.d.ts.map +1 -0
- package/dist/spec/db/persist.js +66 -0
- package/dist/spec/db/persist.js.map +1 -0
- package/dist/spec/db/relations.d.ts +80 -1
- package/dist/spec/db/relations.d.ts.map +1 -1
- package/dist/spec/db/relations.js +175 -4
- package/dist/spec/db/relations.js.map +1 -1
- package/dist/spec/db/schema.d.ts +4 -0
- package/dist/spec/db/schema.d.ts.map +1 -1
- package/dist/spec/db/schema.js +4 -0
- package/dist/spec/db/schema.js.map +1 -1
- package/dist/spec/db/schema.sql +5 -1
- package/dist/spec/db/spec-node.d.ts +5 -0
- package/dist/spec/db/spec-node.d.ts.map +1 -1
- package/dist/spec/db/spec-node.js +11 -5
- package/dist/spec/db/spec-node.js.map +1 -1
- package/dist/spec/db/sql-utils.d.ts +11 -0
- package/dist/spec/db/sql-utils.d.ts.map +1 -0
- package/dist/spec/db/sql-utils.js +19 -0
- package/dist/spec/db/sql-utils.js.map +1 -0
- package/dist/spec/evolve/cluster-context.d.ts +30 -0
- package/dist/spec/evolve/cluster-context.d.ts.map +1 -0
- package/dist/spec/evolve/cluster-context.js +78 -0
- package/dist/spec/evolve/cluster-context.js.map +1 -0
- package/dist/spec/evolve/commit-spec-analyzer.d.ts +51 -0
- package/dist/spec/evolve/commit-spec-analyzer.d.ts.map +1 -0
- package/dist/spec/evolve/commit-spec-analyzer.js +88 -0
- package/dist/spec/evolve/commit-spec-analyzer.js.map +1 -0
- package/dist/spec/evolve/commit-spec-persister.d.ts +53 -0
- package/dist/spec/evolve/commit-spec-persister.d.ts.map +1 -0
- package/dist/spec/evolve/commit-spec-persister.js +93 -0
- package/dist/spec/evolve/commit-spec-persister.js.map +1 -0
- package/dist/spec/evolve/impact-locator.d.ts +23 -7
- package/dist/spec/evolve/impact-locator.d.ts.map +1 -1
- package/dist/spec/evolve/impact-locator.js +58 -14
- package/dist/spec/evolve/impact-locator.js.map +1 -1
- package/dist/spec/evolve/pipeline.d.ts +62 -25
- package/dist/spec/evolve/pipeline.d.ts.map +1 -1
- package/dist/spec/evolve/pipeline.js +436 -457
- package/dist/spec/evolve/pipeline.js.map +1 -1
- package/dist/spec/evolve/spec-rewriter.d.ts +13 -13
- package/dist/spec/evolve/spec-rewriter.d.ts.map +1 -1
- package/dist/spec/evolve/spec-rewriter.js +45 -45
- package/dist/spec/evolve/spec-rewriter.js.map +1 -1
- package/dist/spec/git/commits.d.ts +85 -0
- package/dist/spec/git/commits.d.ts.map +1 -0
- package/dist/spec/git/commits.js +218 -0
- package/dist/spec/git/commits.js.map +1 -0
- package/dist/spec/git/exec.d.ts +13 -0
- package/dist/spec/git/exec.d.ts.map +1 -0
- package/dist/spec/git/exec.js +19 -0
- package/dist/spec/git/exec.js.map +1 -0
- package/dist/spec/git/index.d.ts +9 -0
- package/dist/spec/git/index.d.ts.map +1 -0
- package/dist/spec/git/index.js +22 -0
- package/dist/spec/git/index.js.map +1 -0
- package/dist/spec/git-utils.d.ts +8 -0
- package/dist/spec/git-utils.d.ts.map +1 -0
- package/dist/spec/git-utils.js +14 -0
- package/dist/spec/git-utils.js.map +1 -0
- package/dist/spec/graph/index.d.ts +8 -0
- package/dist/spec/graph/index.d.ts.map +1 -0
- package/dist/spec/graph/index.js +17 -0
- package/dist/spec/graph/index.js.map +1 -0
- package/dist/spec/graph/queries.d.ts +6 -35
- package/dist/spec/graph/queries.d.ts.map +1 -1
- package/dist/spec/graph/queries.js +71 -248
- package/dist/spec/graph/queries.js.map +1 -1
- package/dist/spec/llm/agent-client.d.ts +59 -0
- package/dist/spec/llm/agent-client.d.ts.map +1 -0
- package/dist/spec/llm/agent-client.js +213 -0
- package/dist/spec/llm/agent-client.js.map +1 -0
- package/dist/spec/llm/agents/claude-code.d.ts +32 -0
- package/dist/spec/llm/agents/claude-code.d.ts.map +1 -0
- package/dist/spec/llm/agents/claude-code.js +125 -0
- package/dist/spec/llm/agents/claude-code.js.map +1 -0
- package/dist/spec/llm/agents/codex.d.ts +32 -0
- package/dist/spec/llm/agents/codex.d.ts.map +1 -0
- package/dist/spec/llm/agents/codex.js +145 -0
- package/dist/spec/llm/agents/codex.js.map +1 -0
- package/dist/spec/llm/agents/detect-utils.d.ts +28 -0
- package/dist/spec/llm/agents/detect-utils.d.ts.map +1 -0
- package/dist/spec/llm/agents/detect-utils.js +91 -0
- package/dist/spec/llm/agents/detect-utils.js.map +1 -0
- package/dist/spec/llm/agents/deveco-code.d.ts +33 -0
- package/dist/spec/llm/agents/deveco-code.d.ts.map +1 -0
- package/dist/spec/llm/agents/deveco-code.js +165 -0
- package/dist/spec/llm/agents/deveco-code.js.map +1 -0
- package/dist/spec/llm/agents/index.d.ts +31 -0
- package/dist/spec/llm/agents/index.d.ts.map +1 -0
- package/dist/spec/llm/agents/index.js +65 -0
- package/dist/spec/llm/agents/index.js.map +1 -0
- package/dist/spec/llm/agents/types.d.ts +76 -0
- package/dist/spec/llm/agents/types.d.ts.map +1 -0
- package/dist/spec/llm/agents/types.js +15 -0
- package/dist/spec/llm/agents/types.js.map +1 -0
- package/dist/spec/llm/client.d.ts +31 -11
- package/dist/spec/llm/client.d.ts.map +1 -1
- package/dist/spec/llm/client.js +143 -81
- package/dist/spec/llm/client.js.map +1 -1
- package/dist/spec/llm/factory.d.ts +41 -0
- package/dist/spec/llm/factory.d.ts.map +1 -0
- package/dist/spec/llm/factory.js +80 -0
- package/dist/spec/llm/factory.js.map +1 -0
- package/dist/spec/llm/prompts.d.ts +24 -8
- package/dist/spec/llm/prompts.d.ts.map +1 -1
- package/dist/spec/llm/prompts.js +100 -50
- package/dist/spec/llm/prompts.js.map +1 -1
- package/dist/spec/llm/retry.d.ts +53 -0
- package/dist/spec/llm/retry.d.ts.map +1 -0
- package/dist/spec/llm/retry.js +153 -0
- package/dist/spec/llm/retry.js.map +1 -0
- package/dist/spec/mine/clusterer.d.ts +63 -0
- package/dist/spec/mine/clusterer.d.ts.map +1 -0
- package/dist/spec/mine/clusterer.js +904 -0
- package/dist/spec/mine/clusterer.js.map +1 -0
- package/dist/spec/mine/clustering/features.d.ts +38 -0
- package/dist/spec/mine/clustering/features.d.ts.map +1 -0
- package/dist/spec/mine/clustering/features.js +108 -0
- package/dist/spec/mine/clustering/features.js.map +1 -0
- package/dist/spec/mine/clustering/index.d.ts +62 -0
- package/dist/spec/mine/clustering/index.d.ts.map +1 -0
- package/dist/spec/mine/clustering/index.js +259 -0
- package/dist/spec/mine/clustering/index.js.map +1 -0
- package/dist/spec/mine/clustering/leiden.d.ts +61 -0
- package/dist/spec/mine/clustering/leiden.d.ts.map +1 -0
- package/dist/spec/mine/clustering/leiden.js +489 -0
- package/dist/spec/mine/clustering/leiden.js.map +1 -0
- package/dist/spec/mine/clustering/text-similarity.d.ts +22 -0
- package/dist/spec/mine/clustering/text-similarity.d.ts.map +1 -0
- package/dist/spec/mine/clustering/text-similarity.js +98 -0
- package/dist/spec/mine/clustering/text-similarity.js.map +1 -0
- package/dist/spec/mine/generator.d.ts +54 -0
- package/dist/spec/mine/generator.d.ts.map +1 -0
- package/dist/spec/mine/generator.js +267 -0
- package/dist/spec/mine/generator.js.map +1 -0
- package/dist/spec/mine/persist.d.ts +37 -0
- package/dist/spec/mine/persist.d.ts.map +1 -0
- package/dist/spec/mine/persist.js +170 -0
- package/dist/spec/mine/persist.js.map +1 -0
- package/dist/spec/mine/pipeline.d.ts +41 -0
- package/dist/spec/mine/pipeline.d.ts.map +1 -0
- package/dist/spec/mine/pipeline.js +236 -0
- package/dist/spec/mine/pipeline.js.map +1 -0
- package/dist/spec/mine/progress-handler.d.ts +22 -0
- package/dist/spec/mine/progress-handler.d.ts.map +1 -0
- package/dist/spec/mine/progress-handler.js +108 -0
- package/dist/spec/mine/progress-handler.js.map +1 -0
- package/dist/spec/mine/progress.d.ts +23 -0
- package/dist/spec/mine/progress.d.ts.map +1 -0
- package/dist/spec/mine/progress.js +12 -0
- package/dist/spec/mine/progress.js.map +1 -0
- package/dist/spec/mine/scanner.d.ts +59 -0
- package/dist/spec/mine/scanner.d.ts.map +1 -0
- package/dist/spec/mine/scanner.js +383 -0
- package/dist/spec/mine/scanner.js.map +1 -0
- package/dist/spec/types.d.ts +32 -0
- package/dist/spec/types.d.ts.map +1 -1
- package/dist/spec/ui/index.d.ts +9 -0
- package/dist/spec/ui/index.d.ts.map +1 -0
- package/dist/spec/ui/index.js +16 -0
- package/dist/spec/ui/index.js.map +1 -0
- package/dist/spec/ui/progress-handler.d.ts +33 -0
- package/dist/spec/ui/progress-handler.d.ts.map +1 -0
- package/dist/spec/ui/progress-handler.js +132 -0
- package/dist/spec/ui/progress-handler.js.map +1 -0
- package/dist/spec/ui/progress.d.ts +24 -0
- package/dist/spec/ui/progress.d.ts.map +1 -0
- package/dist/spec/ui/progress.js +13 -0
- package/dist/spec/ui/progress.js.map +1 -0
- package/dist/spec/utils/fs.d.ts +45 -0
- package/dist/spec/utils/fs.d.ts.map +1 -0
- package/dist/spec/utils/fs.js +163 -0
- package/dist/spec/utils/fs.js.map +1 -0
- package/dist/spec/utils/index.d.ts +12 -0
- package/dist/spec/utils/index.d.ts.map +1 -0
- package/dist/spec/utils/index.js +26 -0
- package/dist/spec/utils/index.js.map +1 -0
- package/dist/spec/utils/meta.d.ts +32 -0
- package/dist/spec/utils/meta.d.ts.map +1 -0
- package/dist/spec/utils/meta.js +122 -0
- package/dist/spec/utils/meta.js.map +1 -0
- package/dist/spec/utils/truncate.d.ts +86 -0
- package/dist/spec/utils/truncate.d.ts.map +1 -0
- package/dist/spec/utils/truncate.js +172 -0
- package/dist/spec/utils/truncate.js.map +1 -0
- package/dist/spec/utils.d.ts +4 -16
- package/dist/spec/utils.d.ts.map +1 -1
- package/dist/spec/utils.js +6 -58
- package/dist/spec/utils.js.map +1 -1
- package/dist/sync/watcher.d.ts +25 -1
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +76 -3
- package/dist/sync/watcher.js.map +1 -1
- package/dist/telemetry/index.js +3 -3
- package/dist/telemetry/index.js.map +1 -1
- package/dist/types.d.ts +3 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-node.d.ts","sourceRoot":"","sources":["../../../src/spec/db/spec-node.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"spec-node.d.ts","sourceRoot":"","sources":["../../../src/spec/db/spec-node.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAqBpC;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAMxD;AAkBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CA2B3E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAMhF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,IAAI,CAErG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAE3F;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGnE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,cAAc,GAAG,QAAQ,EAAE,CAK3D;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,cAAc,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAW7F"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* text (see `fts.ts` for the segmentation logic).
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.parseSubtitlesJson = parseSubtitlesJson;
|
|
9
10
|
exports.insertSpecNode = insertSpecNode;
|
|
10
11
|
exports.findSpecById = findSpecById;
|
|
11
12
|
exports.updateSpecStatus = updateSpecStatus;
|
|
@@ -17,18 +18,23 @@ const fts_1 = require("./fts");
|
|
|
17
18
|
// ---------------------------------------------------------------------------
|
|
18
19
|
// Helpers
|
|
19
20
|
// ---------------------------------------------------------------------------
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Parse a JSON-encoded subtitles array, returning [] on any failure.
|
|
23
|
+
* Shared by every query that reads `spec_nodes.subtitles`.
|
|
24
|
+
*/
|
|
25
|
+
function parseSubtitlesJson(raw) {
|
|
22
26
|
try {
|
|
23
|
-
|
|
27
|
+
return JSON.parse(raw || '[]');
|
|
24
28
|
}
|
|
25
29
|
catch {
|
|
26
|
-
|
|
30
|
+
return [];
|
|
27
31
|
}
|
|
32
|
+
}
|
|
33
|
+
function rowToSpec(row) {
|
|
28
34
|
return {
|
|
29
35
|
id: row.id,
|
|
30
36
|
title: row.title,
|
|
31
|
-
subtitles,
|
|
37
|
+
subtitles: parseSubtitlesJson(row.subtitles),
|
|
32
38
|
status: row.status,
|
|
33
39
|
version: row.version,
|
|
34
40
|
filePath: row.file_path,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spec-node.js","sourceRoot":"","sources":["../../../src/spec/db/spec-node.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;
|
|
1
|
+
{"version":3,"file":"spec-node.js","sourceRoot":"","sources":["../../../src/spec/db/spec-node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared SQL helpers for the spec db layer.
|
|
3
|
+
*
|
|
4
|
+
* @module spec/db/sql-utils
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Escape LIKE metacharacters (`%`, `_`) and the escape character itself so
|
|
8
|
+
* the input is matched literally in `LIKE ... ESCAPE '\'` queries.
|
|
9
|
+
*/
|
|
10
|
+
export declare function escapeLike(str: string): string;
|
|
11
|
+
//# sourceMappingURL=sql-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-utils.d.ts","sourceRoot":"","sources":["../../../src/spec/db/sql-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK9C"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shared SQL helpers for the spec db layer.
|
|
4
|
+
*
|
|
5
|
+
* @module spec/db/sql-utils
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.escapeLike = escapeLike;
|
|
9
|
+
/**
|
|
10
|
+
* Escape LIKE metacharacters (`%`, `_`) and the escape character itself so
|
|
11
|
+
* the input is matched literally in `LIKE ... ESCAPE '\'` queries.
|
|
12
|
+
*/
|
|
13
|
+
function escapeLike(str) {
|
|
14
|
+
return str
|
|
15
|
+
.replace(/\\/g, '\\\\')
|
|
16
|
+
.replace(/%/g, '\\%')
|
|
17
|
+
.replace(/_/g, '\\_');
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=sql-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sql-utils.js","sourceRoot":"","sources":["../../../src/spec/db/sql-utils.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAMH,gCAKC;AATD;;;GAGG;AACH,SAAgB,UAAU,CAAC,GAAW;IACpC,OAAO,GAAG;SACP,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;SACpB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* cluster-context.ts — Build cluster-level context summary for LLM spec evaluation.
|
|
3
|
+
*
|
|
4
|
+
* References mine/generator.ts buildClusterPrompt for the multi-commit
|
|
5
|
+
* context aggregation pattern, but uses simpler data (diff-based instead of
|
|
6
|
+
* AST-based) since evolve works with unified diffs.
|
|
7
|
+
*
|
|
8
|
+
* The ClusterContext / CommitSummary / CommitContextInput types live in
|
|
9
|
+
* `../types` so the LLM layer can depend on them without importing from a
|
|
10
|
+
* pipeline module.
|
|
11
|
+
*
|
|
12
|
+
* @module spec/evolve/cluster-context
|
|
13
|
+
*/
|
|
14
|
+
import { ClusterContext, CommitSummary, CommitContextInput } from '../types';
|
|
15
|
+
export type { ClusterContext, CommitSummary, CommitContextInput };
|
|
16
|
+
/**
|
|
17
|
+
* Build a cluster context summary for a group of commits affecting the same spec.
|
|
18
|
+
*
|
|
19
|
+
* Steps:
|
|
20
|
+
* 1. For each affecting commit, build a CommitSummary with changed files.
|
|
21
|
+
* The `truncatedDiff` field is left as a placeholder — the caller is
|
|
22
|
+
* responsible for injecting actual diffs via `getCommitDiff()` + `truncateText()`.
|
|
23
|
+
* 2. Compute primaryFiles: files changed in the most commits (top TOP_PRIMARY_FILES).
|
|
24
|
+
*
|
|
25
|
+
* @param affectingCommits - Commit info for commits affecting this spec.
|
|
26
|
+
* @param maxChars - Maximum total characters for commit summaries (default 12000).
|
|
27
|
+
* @returns ClusterContext ready for LLM prompt construction.
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildClusterContext(affectingCommits: CommitContextInput[], maxChars?: number): ClusterContext;
|
|
30
|
+
//# sourceMappingURL=cluster-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-context.d.ts","sourceRoot":"","sources":["../../../src/spec/evolve/cluster-context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE7E,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC;AAgBlE;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,gBAAgB,EAAE,kBAAkB,EAAE,EACtC,QAAQ,GAAE,MAAkC,GAC3C,cAAc,CA2ChB"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* cluster-context.ts — Build cluster-level context summary for LLM spec evaluation.
|
|
4
|
+
*
|
|
5
|
+
* References mine/generator.ts buildClusterPrompt for the multi-commit
|
|
6
|
+
* context aggregation pattern, but uses simpler data (diff-based instead of
|
|
7
|
+
* AST-based) since evolve works with unified diffs.
|
|
8
|
+
*
|
|
9
|
+
* The ClusterContext / CommitSummary / CommitContextInput types live in
|
|
10
|
+
* `../types` so the LLM layer can depend on them without importing from a
|
|
11
|
+
* pipeline module.
|
|
12
|
+
*
|
|
13
|
+
* @module spec/evolve/cluster-context
|
|
14
|
+
*/
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.buildClusterContext = buildClusterContext;
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Constants
|
|
19
|
+
// =============================================================================
|
|
20
|
+
/** Maximum total characters for the cluster context (~12K tokens @ ~0.25 token/char). */
|
|
21
|
+
const DEFAULT_MAX_CONTEXT_CHARS = 48000;
|
|
22
|
+
/** Number of top files reported in primaryFiles. */
|
|
23
|
+
const TOP_PRIMARY_FILES = 10;
|
|
24
|
+
// =============================================================================
|
|
25
|
+
// Public API
|
|
26
|
+
// =============================================================================
|
|
27
|
+
/**
|
|
28
|
+
* Build a cluster context summary for a group of commits affecting the same spec.
|
|
29
|
+
*
|
|
30
|
+
* Steps:
|
|
31
|
+
* 1. For each affecting commit, build a CommitSummary with changed files.
|
|
32
|
+
* The `truncatedDiff` field is left as a placeholder — the caller is
|
|
33
|
+
* responsible for injecting actual diffs via `getCommitDiff()` + `truncateText()`.
|
|
34
|
+
* 2. Compute primaryFiles: files changed in the most commits (top TOP_PRIMARY_FILES).
|
|
35
|
+
*
|
|
36
|
+
* @param affectingCommits - Commit info for commits affecting this spec.
|
|
37
|
+
* @param maxChars - Maximum total characters for commit summaries (default 12000).
|
|
38
|
+
* @returns ClusterContext ready for LLM prompt construction.
|
|
39
|
+
*/
|
|
40
|
+
function buildClusterContext(affectingCommits, maxChars = DEFAULT_MAX_CONTEXT_CHARS) {
|
|
41
|
+
// 1. Build commit summaries
|
|
42
|
+
const commitSummaries = [];
|
|
43
|
+
let usedBudget = 0;
|
|
44
|
+
// Track file frequency for primaryFiles
|
|
45
|
+
const fileFrequency = new Map();
|
|
46
|
+
for (const input of affectingCommits) {
|
|
47
|
+
const files = input.filePaths;
|
|
48
|
+
for (const f of files) {
|
|
49
|
+
fileFrequency.set(f, (fileFrequency.get(f) ?? 0) + 1);
|
|
50
|
+
}
|
|
51
|
+
// Per-commit overhead estimate: header + file list area
|
|
52
|
+
const overhead = 150; // "### abc1234 — message\n\nFiles: ...\n\n```diff\n...```\n\n"
|
|
53
|
+
const remainingForThis = maxChars - usedBudget - overhead;
|
|
54
|
+
if (remainingForThis <= 0)
|
|
55
|
+
break; // Budget exhausted
|
|
56
|
+
const summary = {
|
|
57
|
+
fullHash: input.commitHash,
|
|
58
|
+
shortHash: input.commitHash.slice(0, 7),
|
|
59
|
+
message: input.message ?? input.commitHash.slice(0, 7),
|
|
60
|
+
changedFiles: files,
|
|
61
|
+
// Placeholder — caller populates with actual diff
|
|
62
|
+
truncatedDiff: '',
|
|
63
|
+
};
|
|
64
|
+
commitSummaries.push(summary);
|
|
65
|
+
usedBudget += overhead;
|
|
66
|
+
}
|
|
67
|
+
// 2. Compute primaryFiles (top-N by frequency)
|
|
68
|
+
const primaryFiles = [...fileFrequency.entries()]
|
|
69
|
+
.sort((a, b) => b[1] - a[1])
|
|
70
|
+
.slice(0, TOP_PRIMARY_FILES)
|
|
71
|
+
.map(([file]) => file);
|
|
72
|
+
return {
|
|
73
|
+
commitCount: affectingCommits.length,
|
|
74
|
+
commitSummaries,
|
|
75
|
+
primaryFiles,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=cluster-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cluster-context.js","sourceRoot":"","sources":["../../../src/spec/evolve/cluster-context.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAiCH,kDA8CC;AAzED,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,yFAAyF;AACzF,MAAM,yBAAyB,GAAG,KAAK,CAAC;AAExC,oDAAoD;AACpD,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;;;;;;;;;;;GAYG;AACH,SAAgB,mBAAmB,CACjC,gBAAsC,EACtC,WAAmB,yBAAyB;IAE5C,4BAA4B;IAC5B,MAAM,eAAe,GAAoB,EAAE,CAAC;IAC5C,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,wCAAwC;IACxC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEhD,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,aAAa,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,wDAAwD;QACxD,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,+DAA+D;QACrF,MAAM,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAC;QAC1D,IAAI,gBAAgB,IAAI,CAAC;YAAE,MAAM,CAAC,mBAAmB;QAErD,MAAM,OAAO,GAAkB;YAC7B,QAAQ,EAAE,KAAK,CAAC,UAAU;YAC1B,SAAS,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACvC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACtD,YAAY,EAAE,KAAK;YACnB,kDAAkD;YAClD,aAAa,EAAE,EAAE;SAClB,CAAC;QAEF,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,UAAU,IAAI,QAAQ,CAAC;IACzB,CAAC;IAED,+CAA+C;IAC/C,MAAM,YAAY,GAAG,CAAC,GAAG,aAAa,CAAC,OAAO,EAAE,CAAC;SAC9C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC;SAC3B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAEzB,OAAO;QACL,WAAW,EAAE,gBAAgB,CAAC,MAAM;QACpC,eAAe;QACf,YAAY;KACb,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commit-spec-analyzer.ts — Batch analysis of incremental commits.
|
|
3
|
+
*
|
|
4
|
+
* References build pipeline's scan() Strategy A pattern: iterate commits,
|
|
5
|
+
* resolve scopes, extract metadata, parse diffs — all before any DB writes.
|
|
6
|
+
*
|
|
7
|
+
* @module spec/evolve/commit-spec-analyzer
|
|
8
|
+
*/
|
|
9
|
+
import { SpecConfig } from '../config';
|
|
10
|
+
import { CommitInfo } from '../git';
|
|
11
|
+
import { SpecMetadata } from '../build/spec-extractor';
|
|
12
|
+
import { DiffFragment } from '../build/diff-parser';
|
|
13
|
+
/** Result of analyzing a single commit for spec match. */
|
|
14
|
+
export interface CommitSpecAnalysis {
|
|
15
|
+
/** The commit being analyzed. */
|
|
16
|
+
commit: CommitInfo;
|
|
17
|
+
/** Whether the commit's scope matched a local spec. */
|
|
18
|
+
matched: boolean;
|
|
19
|
+
/** Resolved spec ID (only when matched). */
|
|
20
|
+
specId?: string;
|
|
21
|
+
/** Extracted spec metadata (only when matched). */
|
|
22
|
+
metadata?: SpecMetadata;
|
|
23
|
+
/** Parsed diff fragments (only when matched). */
|
|
24
|
+
fragments?: DiffFragment[];
|
|
25
|
+
/** Human-readable reason for non-match. */
|
|
26
|
+
skipReason?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Batch-analyze a list of incremental commits for spec matching.
|
|
30
|
+
*
|
|
31
|
+
* For each commit:
|
|
32
|
+
* 1. Resolve scope from commit message.
|
|
33
|
+
* 2. If scope matches a local spec file, extract metadata and parse the diff.
|
|
34
|
+
* 3. Return a CommitSpecAnalysis for every commit (matched or not).
|
|
35
|
+
*
|
|
36
|
+
* This function performs NO database writes. All side effects are read-only:
|
|
37
|
+
* `getCommitDiff()` and `analyzeCommitDiff()` read from the git repo's
|
|
38
|
+
* object store but do not modify anything.
|
|
39
|
+
*
|
|
40
|
+
* The most expensive operations (`getCommitDiff` + `analyzeCommitDiff`) are
|
|
41
|
+
* only performed for scope-matched commits so that unmatched commits are
|
|
42
|
+
* nearly zero-cost during scan.
|
|
43
|
+
*
|
|
44
|
+
* @param repoPath - Absolute path to the git repository.
|
|
45
|
+
* @param specStoragePath - Path to spec storage directory.
|
|
46
|
+
* @param commits - Incremental commits to analyze (chronological order).
|
|
47
|
+
* @param config - Resolved SpecConfig.
|
|
48
|
+
* @returns Array of CommitSpecAnalysis, one per input commit.
|
|
49
|
+
*/
|
|
50
|
+
export declare function analyzeIncrementalCommits(repoPath: string, specStoragePath: string, commits: CommitInfo[], config: SpecConfig): CommitSpecAnalysis[];
|
|
51
|
+
//# sourceMappingURL=commit-spec-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-spec-analyzer.d.ts","sourceRoot":"","sources":["../../../src/spec/evolve/commit-spec-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAiB,MAAM,QAAQ,CAAC;AAEnD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAqB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAOvE,0DAA0D;AAC1D,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,MAAM,EAAE,UAAU,CAAC;IACnB,uDAAuD;IACvD,OAAO,EAAE,OAAO,CAAC;IACjB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,iDAAiD;IACjD,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,2CAA2C;IAC3C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,OAAO,EAAE,UAAU,EAAE,EACrB,MAAM,EAAE,UAAU,GACjB,kBAAkB,EAAE,CAqDtB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* commit-spec-analyzer.ts — Batch analysis of incremental commits.
|
|
4
|
+
*
|
|
5
|
+
* References build pipeline's scan() Strategy A pattern: iterate commits,
|
|
6
|
+
* resolve scopes, extract metadata, parse diffs — all before any DB writes.
|
|
7
|
+
*
|
|
8
|
+
* @module spec/evolve/commit-spec-analyzer
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.analyzeIncrementalCommits = analyzeIncrementalCommits;
|
|
12
|
+
const git_1 = require("../git");
|
|
13
|
+
const scan_1 = require("../build/scan");
|
|
14
|
+
const diff_parser_1 = require("../build/diff-parser");
|
|
15
|
+
const utils_1 = require("../utils");
|
|
16
|
+
// =============================================================================
|
|
17
|
+
// Public API
|
|
18
|
+
// =============================================================================
|
|
19
|
+
/**
|
|
20
|
+
* Batch-analyze a list of incremental commits for spec matching.
|
|
21
|
+
*
|
|
22
|
+
* For each commit:
|
|
23
|
+
* 1. Resolve scope from commit message.
|
|
24
|
+
* 2. If scope matches a local spec file, extract metadata and parse the diff.
|
|
25
|
+
* 3. Return a CommitSpecAnalysis for every commit (matched or not).
|
|
26
|
+
*
|
|
27
|
+
* This function performs NO database writes. All side effects are read-only:
|
|
28
|
+
* `getCommitDiff()` and `analyzeCommitDiff()` read from the git repo's
|
|
29
|
+
* object store but do not modify anything.
|
|
30
|
+
*
|
|
31
|
+
* The most expensive operations (`getCommitDiff` + `analyzeCommitDiff`) are
|
|
32
|
+
* only performed for scope-matched commits so that unmatched commits are
|
|
33
|
+
* nearly zero-cost during scan.
|
|
34
|
+
*
|
|
35
|
+
* @param repoPath - Absolute path to the git repository.
|
|
36
|
+
* @param specStoragePath - Path to spec storage directory.
|
|
37
|
+
* @param commits - Incremental commits to analyze (chronological order).
|
|
38
|
+
* @param config - Resolved SpecConfig.
|
|
39
|
+
* @returns Array of CommitSpecAnalysis, one per input commit.
|
|
40
|
+
*/
|
|
41
|
+
function analyzeIncrementalCommits(repoPath, specStoragePath, commits, config) {
|
|
42
|
+
const results = [];
|
|
43
|
+
// Hoist the directory read out of the per-commit loop.
|
|
44
|
+
const specIds = new Set((0, utils_1.discoverSpecs)(specStoragePath).map((e) => e.specId));
|
|
45
|
+
for (const commit of commits) {
|
|
46
|
+
// 1. Scope resolution + spec metadata
|
|
47
|
+
const { specId, metadata } = (0, scan_1.matchCommitToSpec)(commit.message, specIds, specStoragePath, config);
|
|
48
|
+
if (!specId) {
|
|
49
|
+
results.push({
|
|
50
|
+
commit,
|
|
51
|
+
matched: false,
|
|
52
|
+
skipReason: 'Commit message scope did not match any local spec',
|
|
53
|
+
});
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (!metadata) {
|
|
57
|
+
results.push({
|
|
58
|
+
commit,
|
|
59
|
+
matched: false,
|
|
60
|
+
skipReason: `Scope "${specId}" matched but no valid spec metadata found`,
|
|
61
|
+
});
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
// 3. Parse diff (only for matched commits — the expensive step)
|
|
65
|
+
let fragments;
|
|
66
|
+
try {
|
|
67
|
+
const diff = (0, git_1.getCommitDiff)(repoPath, commit.hash);
|
|
68
|
+
fragments = (0, diff_parser_1.analyzeCommitDiff)(repoPath, commit.hash, diff);
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
results.push({
|
|
72
|
+
commit,
|
|
73
|
+
matched: false,
|
|
74
|
+
skipReason: `Diff analysis failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
75
|
+
});
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
results.push({
|
|
79
|
+
commit,
|
|
80
|
+
matched: true,
|
|
81
|
+
specId,
|
|
82
|
+
metadata,
|
|
83
|
+
fragments,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
return results;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=commit-spec-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-spec-analyzer.js","sourceRoot":"","sources":["../../../src/spec/evolve/commit-spec-analyzer.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAuDH,8DA0DC;AA9GD,gCAAmD;AACnD,wCAAkD;AAElD,sDAAuE;AACvE,oCAAyC;AAsBzC,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,yBAAyB,CACvC,QAAgB,EAChB,eAAuB,EACvB,OAAqB,EACrB,MAAkB;IAElB,MAAM,OAAO,GAAyB,EAAE,CAAC;IAEzC,uDAAuD;IACvD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAA,qBAAa,EAAC,eAAe,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IAE7E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,sCAAsC;QACtC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,wBAAiB,EAC5C,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,CACjD,CAAC;QACF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM;gBACN,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,mDAAmD;aAChE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM;gBACN,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,UAAU,MAAM,4CAA4C;aACzE,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,gEAAgE;QAChE,IAAI,SAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAA,mBAAa,EAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAClD,SAAS,GAAG,IAAA,+BAAiB,EAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC;gBACX,MAAM;gBACN,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE,yBAAyB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aACxF,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,OAAO,CAAC,IAAI,CAAC;YACX,MAAM;YACN,OAAO,EAAE,IAAI;YACb,MAAM;YACN,QAAQ;YACR,SAAS;SACV,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* commit-spec-persister.ts — Per-commit graph persistence.
|
|
3
|
+
*
|
|
4
|
+
* Each commit is persisted in its own transaction so that a single failure
|
|
5
|
+
* does not roll back other successful commits. This aligns with the
|
|
6
|
+
* meta.json advancement rule: advance to the last commit whose phase-1
|
|
7
|
+
* persistence succeeded.
|
|
8
|
+
*
|
|
9
|
+
* @module spec/evolve/commit-spec-persister
|
|
10
|
+
*/
|
|
11
|
+
import { SqliteDatabase } from '../../db/sqlite-adapter';
|
|
12
|
+
import { CommitSpecAnalysis } from './commit-spec-analyzer';
|
|
13
|
+
export interface PersistResult {
|
|
14
|
+
/** Commit hash being persisted. */
|
|
15
|
+
commitHash: string;
|
|
16
|
+
/** Always true in a PersistResult — only matched analyses are persisted. */
|
|
17
|
+
matched: true;
|
|
18
|
+
/** The spec ID that was persisted. */
|
|
19
|
+
specId: string;
|
|
20
|
+
/** File paths from the diff fragments (for phase 2 impact location). */
|
|
21
|
+
filePaths: string[];
|
|
22
|
+
/** Statistics. */
|
|
23
|
+
stats: {
|
|
24
|
+
fragmentsInserted: number;
|
|
25
|
+
relationsCreated: number;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Persist the knowledge graph entries for a single scope-matched commit.
|
|
30
|
+
*
|
|
31
|
+
* All INSERTs use OR REPLACE / OR IGNORE semantics so repeated calls with
|
|
32
|
+
* the same data are idempotent.
|
|
33
|
+
*
|
|
34
|
+
* The caller is responsible for retry on failure — this function does
|
|
35
|
+
* not retry internally.
|
|
36
|
+
*
|
|
37
|
+
* Steps (inside a single DB transaction):
|
|
38
|
+
* 1. CommitNode (INSERT OR REPLACE)
|
|
39
|
+
* 2. SpecNode (INSERT OR REPLACE)
|
|
40
|
+
* 3. GENERATE relation (INSERT OR IGNORE)
|
|
41
|
+
* 4. For each diff fragment:
|
|
42
|
+
* a. CodeFragment node (INSERT, auto-generated id)
|
|
43
|
+
* b. CONTAINS relation (INSERT OR IGNORE)
|
|
44
|
+
*
|
|
45
|
+
* @param db - Active SQLite database handle.
|
|
46
|
+
* @param analysis - CommitSpecAnalysis with matched=true.
|
|
47
|
+
* @returns PersistResult on success.
|
|
48
|
+
* @throws On transaction failure (caller decides whether to retry or skip).
|
|
49
|
+
*/
|
|
50
|
+
export declare function persistCommitSpecGraph(db: SqliteDatabase, analysis: CommitSpecAnalysis & {
|
|
51
|
+
matched: true;
|
|
52
|
+
}): PersistResult;
|
|
53
|
+
//# sourceMappingURL=commit-spec-persister.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-spec-persister.d.ts","sourceRoot":"","sources":["../../../src/spec/evolve/commit-spec-persister.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAY5D,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,OAAO,EAAE,IAAI,CAAC;IACd,sCAAsC;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,kBAAkB;IAClB,KAAK,EAAE;QACL,iBAAiB,EAAE,MAAM,CAAC;QAC1B,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAMD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,sBAAsB,CACpC,EAAE,EAAE,cAAc,EAClB,QAAQ,EAAE,kBAAkB,GAAG;IAAE,OAAO,EAAE,IAAI,CAAA;CAAE,GAC/C,aAAa,CAuDf"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* commit-spec-persister.ts — Per-commit graph persistence.
|
|
4
|
+
*
|
|
5
|
+
* Each commit is persisted in its own transaction so that a single failure
|
|
6
|
+
* does not roll back other successful commits. This aligns with the
|
|
7
|
+
* meta.json advancement rule: advance to the last commit whose phase-1
|
|
8
|
+
* persistence succeeded.
|
|
9
|
+
*
|
|
10
|
+
* @module spec/evolve/commit-spec-persister
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.persistCommitSpecGraph = persistCommitSpecGraph;
|
|
14
|
+
const commit_node_1 = require("../db/commit-node");
|
|
15
|
+
const relations_1 = require("../db/relations");
|
|
16
|
+
const persist_1 = require("../db/persist");
|
|
17
|
+
const errors_1 = require("../../errors");
|
|
18
|
+
// =============================================================================
|
|
19
|
+
// Public API
|
|
20
|
+
// =============================================================================
|
|
21
|
+
/**
|
|
22
|
+
* Persist the knowledge graph entries for a single scope-matched commit.
|
|
23
|
+
*
|
|
24
|
+
* All INSERTs use OR REPLACE / OR IGNORE semantics so repeated calls with
|
|
25
|
+
* the same data are idempotent.
|
|
26
|
+
*
|
|
27
|
+
* The caller is responsible for retry on failure — this function does
|
|
28
|
+
* not retry internally.
|
|
29
|
+
*
|
|
30
|
+
* Steps (inside a single DB transaction):
|
|
31
|
+
* 1. CommitNode (INSERT OR REPLACE)
|
|
32
|
+
* 2. SpecNode (INSERT OR REPLACE)
|
|
33
|
+
* 3. GENERATE relation (INSERT OR IGNORE)
|
|
34
|
+
* 4. For each diff fragment:
|
|
35
|
+
* a. CodeFragment node (INSERT, auto-generated id)
|
|
36
|
+
* b. CONTAINS relation (INSERT OR IGNORE)
|
|
37
|
+
*
|
|
38
|
+
* @param db - Active SQLite database handle.
|
|
39
|
+
* @param analysis - CommitSpecAnalysis with matched=true.
|
|
40
|
+
* @returns PersistResult on success.
|
|
41
|
+
* @throws On transaction failure (caller decides whether to retry or skip).
|
|
42
|
+
*/
|
|
43
|
+
function persistCommitSpecGraph(db, analysis) {
|
|
44
|
+
const { commit } = analysis;
|
|
45
|
+
const metadata = analysis.metadata;
|
|
46
|
+
const fragments = analysis.fragments;
|
|
47
|
+
const filePaths = fragments.map((f) => f.filePath);
|
|
48
|
+
let fragmentsInserted = 0;
|
|
49
|
+
let relationsCreated = 0;
|
|
50
|
+
db.exec('BEGIN');
|
|
51
|
+
try {
|
|
52
|
+
// 1. CommitNode (idempotent — INSERT OR REPLACE)
|
|
53
|
+
(0, commit_node_1.insertCommitNode)(db, {
|
|
54
|
+
hash: commit.hash,
|
|
55
|
+
message: commit.message,
|
|
56
|
+
author: commit.author,
|
|
57
|
+
timestamp: commit.timestamp,
|
|
58
|
+
});
|
|
59
|
+
// 2. SpecNode (idempotent — INSERT OR REPLACE, last write wins for timestamp)
|
|
60
|
+
(0, persist_1.upsertSpecFromMetadata)(db, metadata, commit.timestamp);
|
|
61
|
+
// 3. GENERATE relation (idempotent — INSERT OR IGNORE)
|
|
62
|
+
(0, relations_1.insertSpecCommitRelation)(db, metadata.specId, commit.hash, 'GENERATE');
|
|
63
|
+
relationsCreated++;
|
|
64
|
+
// 4. CodeFragment nodes + CONTAINS relations
|
|
65
|
+
const persisted = (0, persist_1.persistCommitFragments)(db, commit.hash, fragments);
|
|
66
|
+
fragmentsInserted += persisted.fragmentsInserted;
|
|
67
|
+
relationsCreated += persisted.relationsCreated;
|
|
68
|
+
db.exec('COMMIT');
|
|
69
|
+
(0, errors_1.logDebug)('persistCommitSpecGraph: persisted', {
|
|
70
|
+
commitHash: commit.hash.slice(0, 7),
|
|
71
|
+
specId: metadata.specId,
|
|
72
|
+
fragments: fragmentsInserted,
|
|
73
|
+
relations: relationsCreated,
|
|
74
|
+
});
|
|
75
|
+
return {
|
|
76
|
+
commitHash: commit.hash,
|
|
77
|
+
matched: true,
|
|
78
|
+
specId: metadata.specId,
|
|
79
|
+
filePaths,
|
|
80
|
+
stats: { fragmentsInserted, relationsCreated },
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
catch (e) {
|
|
84
|
+
db.exec('ROLLBACK');
|
|
85
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
86
|
+
(0, errors_1.logWarn)('persistCommitSpecGraph: transaction failed', {
|
|
87
|
+
commitHash: commit.hash.slice(0, 7),
|
|
88
|
+
error: msg,
|
|
89
|
+
});
|
|
90
|
+
throw e; // Let the pipeline decide: skip this commit and advance or stop
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=commit-spec-persister.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"commit-spec-persister.js","sourceRoot":"","sources":["../../../src/spec/evolve/commit-spec-persister.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAyDH,wDA0DC;AA/GD,mDAAqD;AACrD,+CAEyB;AACzB,2CAA+E;AAC/E,yCAAiD;AAsBjD,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,SAAgB,sBAAsB,CACpC,EAAkB,EAClB,QAAgD;IAEhD,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;IAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAS,CAAC;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAU,CAAC;IACtC,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IACnD,IAAI,iBAAiB,GAAG,CAAC,CAAC;IAC1B,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC;QACH,iDAAiD;QACjD,IAAA,8BAAgB,EAAC,EAAE,EAAE;YACnB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,CAAC,CAAC;QAEH,8EAA8E;QAC9E,IAAA,gCAAsB,EAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;QAEvD,uDAAuD;QACvD,IAAA,oCAAwB,EAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACvE,gBAAgB,EAAE,CAAC;QAEnB,6CAA6C;QAC7C,MAAM,SAAS,GAAG,IAAA,gCAAsB,EAAC,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACrE,iBAAiB,IAAI,SAAS,CAAC,iBAAiB,CAAC;QACjD,gBAAgB,IAAI,SAAS,CAAC,gBAAgB,CAAC;QAE/C,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAElB,IAAA,iBAAQ,EAAC,mCAAmC,EAAE;YAC5C,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS,EAAE,iBAAiB;YAC5B,SAAS,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,SAAS;YACT,KAAK,EAAE,EAAE,iBAAiB,EAAE,gBAAgB,EAAE;SAC/C,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpB,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,IAAA,gBAAO,EAAC,4CAA4C,EAAE;YACpD,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACnC,KAAK,EAAE,GAAG;SACX,CAAC,CAAC;QACH,MAAM,CAAC,CAAC,CAAC,gEAAgE;IAC3E,CAAC;AACH,CAAC"}
|
|
@@ -1,13 +1,29 @@
|
|
|
1
1
|
import { SqliteDatabase } from '../../db/sqlite-adapter';
|
|
2
|
+
export interface AffectedSpecEntry {
|
|
3
|
+
/** The affected historical spec ID. */
|
|
4
|
+
specId: string;
|
|
5
|
+
/** New commit hashes that affect this spec (file path overlap). */
|
|
6
|
+
affectingCommits: string[];
|
|
7
|
+
}
|
|
2
8
|
/**
|
|
3
|
-
*
|
|
9
|
+
* Locate historical (pre-existing) specs affected by new commits, grouped
|
|
10
|
+
* by spec → affecting commit list in one pass.
|
|
4
11
|
*
|
|
5
|
-
*
|
|
6
|
-
* sourced from `DiffFragment.filePath` via diff-parser already have prefixes
|
|
7
|
-
* stripped.
|
|
12
|
+
* Two-phase query strategy:
|
|
8
13
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
14
|
+
* Phase A: For each file path in the new commits, find all spec IDs whose
|
|
15
|
+
* code fragments share the same file path (reusing findSpecIdsByFragmentPath).
|
|
16
|
+
* Exclude specIds in excludeSpecIds (phase 1 newly inserted specs).
|
|
17
|
+
*
|
|
18
|
+
* Phase B: For each candidate spec, determine which new commits' file paths
|
|
19
|
+
* overlap with the spec's known fragment file paths. File paths are
|
|
20
|
+
* considered overlapping when one contains the other (substring match).
|
|
21
|
+
*
|
|
22
|
+
* @param db Active SQLite database handle.
|
|
23
|
+
* @param commitFilePaths Map of new commit hash → file paths (from phase 1).
|
|
24
|
+
* @param excludeSpecIds Spec IDs to exclude (phase 1 newly inserted specs).
|
|
25
|
+
* @param onlyActive If true (default), filter to specs with status = 'active'.
|
|
26
|
+
* @returns Sorted array of AffectedSpecEntry.
|
|
11
27
|
*/
|
|
12
|
-
export declare function
|
|
28
|
+
export declare function locateAffectedSpecsWithCommits(db: SqliteDatabase, commitFilePaths: Map<string, string[]>, excludeSpecIds: Set<string>, onlyActive?: boolean): AffectedSpecEntry[];
|
|
13
29
|
//# sourceMappingURL=impact-locator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"impact-locator.d.ts","sourceRoot":"","sources":["../../../src/spec/evolve/impact-locator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"impact-locator.d.ts","sourceRoot":"","sources":["../../../src/spec/evolve/impact-locator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAWzD,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,8BAA8B,CAC5C,EAAE,EAAE,cAAc,EAClB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACtC,cAAc,EAAE,GAAG,CAAC,MAAM,CAAC,EAC3B,UAAU,GAAE,OAAc,GACzB,iBAAiB,EAAE,CAmDrB"}
|