homegraph 1.2.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +48 -11
- package/dist/bin/homegraph.js +298 -72
- package/dist/bin/homegraph.js.map +1 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +117 -11
- package/dist/context/index.js.map +1 -1
- package/dist/db/index.d.ts +207 -6
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +461 -20
- 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 +19 -1
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +157 -3
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +426 -9
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +32 -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 +119 -0
- package/dist/db/wal-valve.d.ts.map +1 -0
- package/dist/db/wal-valve.js +290 -0
- package/dist/db/wal-valve.js.map +1 -0
- package/dist/directory.d.ts +9 -5
- package/dist/directory.d.ts.map +1 -1
- package/dist/directory.js +210 -19
- package/dist/directory.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/cfml-extractor.d.ts +107 -0
- package/dist/extraction/cfml-extractor.d.ts.map +1 -0
- package/dist/extraction/cfml-extractor.js +494 -0
- package/dist/extraction/cfml-extractor.js.map +1 -0
- 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/grammars.d.ts +25 -1
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +177 -24
- package/dist/extraction/grammars.js.map +1 -1
- package/dist/extraction/index.d.ts +52 -14
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +521 -314
- 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/languages/c-cpp.d.ts +42 -0
- package/dist/extraction/languages/c-cpp.d.ts.map +1 -1
- package/dist/extraction/languages/c-cpp.js +369 -4
- package/dist/extraction/languages/c-cpp.js.map +1 -1
- package/dist/extraction/languages/cfquery.d.ts +12 -0
- package/dist/extraction/languages/cfquery.d.ts.map +1 -0
- package/dist/extraction/languages/cfquery.js +28 -0
- package/dist/extraction/languages/cfquery.js.map +1 -0
- package/dist/extraction/languages/cfscript.d.ts +3 -0
- package/dist/extraction/languages/cfscript.d.ts.map +1 -0
- package/dist/extraction/languages/cfscript.js +73 -0
- package/dist/extraction/languages/cfscript.js.map +1 -0
- package/dist/extraction/languages/cobol.d.ts +33 -0
- package/dist/extraction/languages/cobol.d.ts.map +1 -0
- package/dist/extraction/languages/cobol.js +499 -0
- package/dist/extraction/languages/cobol.js.map +1 -0
- package/dist/extraction/languages/erlang.d.ts +3 -0
- package/dist/extraction/languages/erlang.d.ts.map +1 -0
- package/dist/extraction/languages/erlang.js +350 -0
- package/dist/extraction/languages/erlang.js.map +1 -0
- package/dist/extraction/languages/index.d.ts.map +1 -1
- package/dist/extraction/languages/index.js +16 -0
- package/dist/extraction/languages/index.js.map +1 -1
- package/dist/extraction/languages/nix.d.ts +3 -0
- package/dist/extraction/languages/nix.d.ts.map +1 -0
- package/dist/extraction/languages/nix.js +294 -0
- package/dist/extraction/languages/nix.js.map +1 -0
- package/dist/extraction/languages/solidity.d.ts +3 -0
- package/dist/extraction/languages/solidity.d.ts.map +1 -0
- package/dist/extraction/languages/solidity.js +293 -0
- package/dist/extraction/languages/solidity.js.map +1 -0
- package/dist/extraction/languages/terraform.d.ts +3 -0
- package/dist/extraction/languages/terraform.d.ts.map +1 -0
- package/dist/extraction/languages/terraform.js +641 -0
- package/dist/extraction/languages/terraform.js.map +1 -0
- package/dist/extraction/languages/vbnet.d.ts +11 -0
- package/dist/extraction/languages/vbnet.d.ts.map +1 -0
- package/dist/extraction/languages/vbnet.js +141 -0
- package/dist/extraction/languages/vbnet.js.map +1 -0
- package/dist/extraction/mybatis-extractor.d.ts +30 -10
- package/dist/extraction/mybatis-extractor.d.ts.map +1 -1
- package/dist/extraction/mybatis-extractor.js +140 -38
- package/dist/extraction/mybatis-extractor.js.map +1 -1
- package/dist/extraction/parse-pool.d.ts +27 -1
- package/dist/extraction/parse-pool.d.ts.map +1 -1
- package/dist/extraction/parse-pool.js +75 -7
- package/dist/extraction/parse-pool.js.map +1 -1
- package/dist/extraction/parse-worker.js +9 -2
- package/dist/extraction/parse-worker.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-helpers.d.ts.map +1 -1
- package/dist/extraction/tree-sitter-helpers.js +1 -0
- package/dist/extraction/tree-sitter-helpers.js.map +1 -1
- package/dist/extraction/tree-sitter-types.d.ts +3 -1
- package/dist/extraction/tree-sitter-types.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.d.ts +38 -0
- package/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.js +801 -10
- package/dist/extraction/tree-sitter.js.map +1 -1
- package/dist/extraction/wasm/tree-sitter-arkts.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfml.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfquery.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cfscript.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-cobol.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-erlang.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-nix.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-terraform.wasm +0 -0
- package/dist/extraction/wasm/tree-sitter-vbnet.wasm +0 -0
- 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/graph/traversal.d.ts.map +1 -1
- package/dist/graph/traversal.js +1 -1
- package/dist/graph/traversal.js.map +1 -1
- package/dist/index.d.ts +74 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +436 -55
- package/dist/index.js.map +1 -1
- package/dist/installer/index.d.ts +42 -0
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +97 -2
- package/dist/installer/index.js.map +1 -1
- package/dist/mcp/daemon.d.ts +25 -3
- package/dist/mcp/daemon.d.ts.map +1 -1
- package/dist/mcp/daemon.js +62 -8
- package/dist/mcp/daemon.js.map +1 -1
- package/dist/mcp/dynamic-boundaries.d.ts.map +1 -1
- package/dist/mcp/dynamic-boundaries.js +2 -1
- package/dist/mcp/dynamic-boundaries.js.map +1 -1
- package/dist/mcp/early-ppid.d.ts +26 -0
- package/dist/mcp/early-ppid.d.ts.map +1 -0
- package/dist/mcp/early-ppid.js +29 -0
- package/dist/mcp/early-ppid.js.map +1 -0
- package/dist/mcp/engine.d.ts +4 -5
- package/dist/mcp/engine.d.ts.map +1 -1
- package/dist/mcp/engine.js +27 -1
- package/dist/mcp/engine.js.map +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +41 -6
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/liveness-watchdog.d.ts +18 -1
- package/dist/mcp/liveness-watchdog.d.ts.map +1 -1
- package/dist/mcp/liveness-watchdog.js +73 -13
- package/dist/mcp/liveness-watchdog.js.map +1 -1
- package/dist/mcp/memory-budget.d.ts +30 -0
- package/dist/mcp/memory-budget.d.ts.map +1 -0
- package/dist/mcp/memory-budget.js +123 -0
- package/dist/mcp/memory-budget.js.map +1 -0
- package/dist/mcp/proxy.d.ts.map +1 -1
- package/dist/mcp/proxy.js +88 -4
- package/dist/mcp/proxy.js.map +1 -1
- package/dist/mcp/query-cache.d.ts +35 -4
- package/dist/mcp/query-cache.d.ts.map +1 -1
- package/dist/mcp/query-cache.js +89 -19
- package/dist/mcp/query-cache.js.map +1 -1
- package/dist/mcp/query-pool.d.ts +46 -12
- package/dist/mcp/query-pool.d.ts.map +1 -1
- package/dist/mcp/query-pool.js +100 -23
- package/dist/mcp/query-pool.js.map +1 -1
- package/dist/mcp/query-worker.d.ts +2 -2
- package/dist/mcp/query-worker.js +2 -2
- package/dist/mcp/server-instructions.d.ts +4 -27
- package/dist/mcp/server-instructions.d.ts.map +1 -1
- package/dist/mcp/server-instructions.js +39 -84
- package/dist/mcp/server-instructions.js.map +1 -1
- package/dist/mcp/session.d.ts +14 -0
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js +28 -1
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/startup-handshake.d.ts +44 -0
- package/dist/mcp/startup-handshake.d.ts.map +1 -0
- package/dist/mcp/startup-handshake.js +73 -0
- package/dist/mcp/startup-handshake.js.map +1 -0
- package/dist/mcp/tools.d.ts +104 -4
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +2432 -217
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/transport.d.ts.map +1 -1
- package/dist/mcp/transport.js +18 -0
- package/dist/mcp/transport.js.map +1 -1
- package/dist/project-config.d.ts +38 -0
- package/dist/project-config.d.ts.map +1 -1
- package/dist/project-config.js +101 -2
- package/dist/project-config.js.map +1 -1
- package/dist/resolution/c-fnptr-synthesizer.d.ts +2 -1
- package/dist/resolution/c-fnptr-synthesizer.d.ts.map +1 -1
- package/dist/resolution/c-fnptr-synthesizer.js +178 -146
- package/dist/resolution/c-fnptr-synthesizer.js.map +1 -1
- package/dist/resolution/callback-synthesizer.d.ts +54 -10
- package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
- package/dist/resolution/callback-synthesizer.js +1299 -257
- 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/cics.d.ts +20 -0
- package/dist/resolution/frameworks/cics.d.ts.map +1 -0
- package/dist/resolution/frameworks/cics.js +90 -0
- package/dist/resolution/frameworks/cics.js.map +1 -0
- 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/frameworks/index.d.ts.map +1 -1
- package/dist/resolution/frameworks/index.js +3 -0
- package/dist/resolution/frameworks/index.js.map +1 -1
- package/dist/resolution/frameworks/java.d.ts.map +1 -1
- package/dist/resolution/frameworks/java.js +14 -6
- package/dist/resolution/frameworks/java.js.map +1 -1
- package/dist/resolution/frameworks/terraform.d.ts +38 -0
- package/dist/resolution/frameworks/terraform.d.ts.map +1 -0
- package/dist/resolution/frameworks/terraform.js +277 -0
- package/dist/resolution/frameworks/terraform.js.map +1 -0
- package/dist/resolution/goframe-synthesizer.d.ts +2 -1
- package/dist/resolution/goframe-synthesizer.d.ts.map +1 -1
- package/dist/resolution/goframe-synthesizer.js +8 -3
- package/dist/resolution/goframe-synthesizer.js.map +1 -1
- package/dist/resolution/import-resolver.d.ts +9 -3
- package/dist/resolution/import-resolver.d.ts.map +1 -1
- package/dist/resolution/import-resolver.js +295 -11
- package/dist/resolution/import-resolver.js.map +1 -1
- package/dist/resolution/index.d.ts +146 -8
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +1089 -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 -4
- package/dist/resolution/name-matcher.d.ts.map +1 -1
- package/dist/resolution/name-matcher.js +793 -130
- 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/strip-comments.d.ts +1 -1
- package/dist/resolution/strip-comments.d.ts.map +1 -1
- package/dist/resolution/strip-comments.js +49 -0
- package/dist/resolution/strip-comments.js.map +1 -1
- package/dist/resolution/types.d.ts +32 -0
- package/dist/resolution/types.d.ts.map +1 -1
- package/dist/resolution/workspace-packages.d.ts +10 -0
- package/dist/resolution/workspace-packages.d.ts.map +1 -1
- package/dist/resolution/workspace-packages.js +142 -4
- package/dist/resolution/workspace-packages.js.map +1 -1
- package/dist/search/identifier-segments.d.ts +60 -0
- package/dist/search/identifier-segments.d.ts.map +1 -0
- package/dist/search/identifier-segments.js +176 -0
- package/dist/search/identifier-segments.js.map +1 -0
- package/dist/search/query-utils.d.ts +201 -0
- package/dist/search/query-utils.d.ts.map +1 -1
- package/dist/search/query-utils.js +919 -2
- package/dist/search/query-utils.js.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/git-hooks.d.ts.map +1 -1
- package/dist/sync/git-hooks.js +2 -0
- package/dist/sync/git-hooks.js.map +1 -1
- package/dist/sync/watcher.d.ts +35 -6
- package/dist/sync/watcher.d.ts.map +1 -1
- package/dist/sync/watcher.js +127 -17
- package/dist/sync/watcher.js.map +1 -1
- package/dist/sync/worktree.d.ts.map +1 -1
- package/dist/sync/worktree.js +5 -0
- package/dist/sync/worktree.js.map +1 -1
- package/dist/telemetry/index.js +3 -3
- package/dist/telemetry/index.js.map +1 -1
- package/dist/types.d.ts +22 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -1
- package/dist/upgrade/index.d.ts +32 -0
- package/dist/upgrade/index.d.ts.map +1 -1
- package/dist/upgrade/index.js +162 -14
- package/dist/upgrade/index.js.map +1 -1
- package/dist/upgrade/remove-binary.d.ts +87 -0
- package/dist/upgrade/remove-binary.d.ts.map +1 -0
- package/dist/upgrade/remove-binary.js +289 -0
- package/dist/upgrade/remove-binary.js.map +1 -0
- package/dist/upgrade/update-check.d.ts +92 -0
- package/dist/upgrade/update-check.d.ts.map +1 -0
- package/dist/upgrade/update-check.js +258 -0
- package/dist/upgrade/update-check.js.map +1 -0
- package/package.json +6 -2
- package/scripts/agent-eval/run-all.sh +6 -0
- package/scripts/build-bundle.sh +5 -0
- package/scripts/npm-shim.js +8 -1
- 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/data/agents.json +0 -109
- package/scripts/exp_boundary_eval/data/experiments.json +0 -140
- package/scripts/qa_eval/README.md +0 -407
- package/scripts/qa_eval/_test_deveco_probe.py +0 -41
- package/scripts/qa_eval/agent_runner.py +0 -526
- package/scripts/qa_eval/data/.gitignore +0 -4
- package/scripts/qa_eval/data/test-set.jsonl +0 -2
- package/scripts/qa_eval/eval_metrics.py +0 -274
- package/scripts/qa_eval/external_agent.py +0 -976
- package/scripts/qa_eval/llm_config.py +0 -92
- package/scripts/qa_eval/memory_monitor.py +0 -132
- package/scripts/qa_eval/my_answer_accuracy.py +0 -187
- package/scripts/qa_eval/requirements.txt +0 -2
- package/scripts/qa_eval/run_pipeline.py +0 -804
- package/scripts/qa_eval/stats_efficiency.py +0 -279
- package/scripts/qa_eval/stats_scores.py +0 -207
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Git commit history scanning and spec↔commit pairing.
|
|
4
|
+
*
|
|
5
|
+
* Replaces `commit4spec/reverse_engineer/git_scanner.py` and
|
|
6
|
+
* `commit4spec/reverse_engineer/git_utils.py`. Discovers spec↔commit pairs via
|
|
7
|
+
* conventional-commit scope extraction: extracts scopes from commit messages
|
|
8
|
+
* and resolves them to spec IDs on disk.
|
|
9
|
+
*
|
|
10
|
+
* All Git operations use `execFileSync` with an args array (never template
|
|
11
|
+
* strings) to avoid shell injection risks — matching the HomeGraph convention
|
|
12
|
+
* in `src/sync/git-hooks.ts` and `src/sync/worktree.ts`.
|
|
13
|
+
*
|
|
14
|
+
* @module spec/build/git-scanner
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.isGitRepo = isGitRepo;
|
|
18
|
+
exports.getAllCommits = getAllCommits;
|
|
19
|
+
exports.getCommitInfo = getCommitInfo;
|
|
20
|
+
exports.getCommitDiff = getCommitDiff;
|
|
21
|
+
exports.getCommitRange = getCommitRange;
|
|
22
|
+
exports.scan = scan;
|
|
23
|
+
const child_process_1 = require("child_process");
|
|
24
|
+
const scope_resolver_1 = require("./scope-resolver");
|
|
25
|
+
const spec_extractor_1 = require("./spec-extractor");
|
|
26
|
+
const errors_1 = require("../../errors");
|
|
27
|
+
const git_utils_1 = require("../git-utils");
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
// Helpers
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
/**
|
|
32
|
+
* Convert an ISO-8601 string to Unix epoch milliseconds.
|
|
33
|
+
* Returns 0 for invalid or unparseable strings.
|
|
34
|
+
*/
|
|
35
|
+
function parseISOTimestamp(isoString) {
|
|
36
|
+
const ts = new Date(isoString).getTime();
|
|
37
|
+
return isNaN(ts) ? 0 : ts;
|
|
38
|
+
}
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// isGitRepo
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
/**
|
|
43
|
+
* Check whether `repoPath` is a git repository.
|
|
44
|
+
*
|
|
45
|
+
* Runs `git rev-parse --git-dir` and returns `true` on success, `false`
|
|
46
|
+
* when the command fails (not a repo, git not installed, etc.).
|
|
47
|
+
*/
|
|
48
|
+
function isGitRepo(repoPath) {
|
|
49
|
+
try {
|
|
50
|
+
(0, child_process_1.execFileSync)('git', ['rev-parse', '--git-dir'], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
// getAllCommits
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
/**
|
|
61
|
+
* Return every commit in `repoPath` as `CommitInfo` objects.
|
|
62
|
+
*
|
|
63
|
+
* Runs `git log --format='%H%n%aI%n%an%n%s%n---END---'` and parses the
|
|
64
|
+
* output one five-line block per commit. Commits are returned in reverse
|
|
65
|
+
* chronological order (most recent first), matching Git's default.
|
|
66
|
+
*
|
|
67
|
+
* An empty repo yields an empty array.
|
|
68
|
+
*/
|
|
69
|
+
function getAllCommits(repoPath) {
|
|
70
|
+
let stdout;
|
|
71
|
+
try {
|
|
72
|
+
stdout = (0, child_process_1.execFileSync)('git', ['log', "--format=%H%x00%aI%x00%an%x00%s%x00"], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
const parts = stdout.replace(/\0+$/, '').trim().split('\0');
|
|
78
|
+
const commits = [];
|
|
79
|
+
// Each commit occupies 4 NUL-separated fields: hash, timestamp, author, message
|
|
80
|
+
for (let i = 0; i + 3 < parts.length; i += 4) {
|
|
81
|
+
const hash = parts[i].trim();
|
|
82
|
+
const isoString = parts[i + 1].trim();
|
|
83
|
+
const author = parts[i + 2].trim();
|
|
84
|
+
const message = parts[i + 3].trim();
|
|
85
|
+
if (!hash)
|
|
86
|
+
continue;
|
|
87
|
+
commits.push({
|
|
88
|
+
hash,
|
|
89
|
+
message,
|
|
90
|
+
author,
|
|
91
|
+
timestamp: parseISOTimestamp(isoString),
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return commits;
|
|
95
|
+
}
|
|
96
|
+
// ---------------------------------------------------------------------------
|
|
97
|
+
// getCommitInfo
|
|
98
|
+
// ---------------------------------------------------------------------------
|
|
99
|
+
/**
|
|
100
|
+
* Retrieve metadata for a single commit.
|
|
101
|
+
*
|
|
102
|
+
* Runs `git show -s --format='%H%n%aI%n%an%n%s' <commitHash>`. Returns
|
|
103
|
+
* `null` when the command fails (hash not found, invalid repo, etc.).
|
|
104
|
+
*/
|
|
105
|
+
function getCommitInfo(repoPath, commitHash) {
|
|
106
|
+
let stdout;
|
|
107
|
+
try {
|
|
108
|
+
stdout = (0, child_process_1.execFileSync)('git', ['show', '-s', "--format=%H%n%aI%n%an%n%s", commitHash], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const lines = stdout.trim().split('\n');
|
|
114
|
+
if (lines.length < 4)
|
|
115
|
+
return null;
|
|
116
|
+
const hash = lines[0].trim();
|
|
117
|
+
const isoString = lines[1].trim();
|
|
118
|
+
const author = lines[2].trim();
|
|
119
|
+
const message = lines[3].trim();
|
|
120
|
+
if (!hash)
|
|
121
|
+
return null;
|
|
122
|
+
return {
|
|
123
|
+
hash,
|
|
124
|
+
message,
|
|
125
|
+
author,
|
|
126
|
+
timestamp: parseISOTimestamp(isoString),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
// ---------------------------------------------------------------------------
|
|
130
|
+
// getCommitDiff
|
|
131
|
+
// ---------------------------------------------------------------------------
|
|
132
|
+
/**
|
|
133
|
+
* Return the full unified diff introduced by `commitHash`.
|
|
134
|
+
*
|
|
135
|
+
* Strategy:
|
|
136
|
+
* 1. Query the parent hash(es) via `git log --pretty=%P -n 1 <commitHash>`.
|
|
137
|
+
* 2. If a parent exists, diff it against the commit: `git diff <parent> <commitHash>`.
|
|
138
|
+
* 3. For an initial (root) commit with no parent, use `git diff <commitHash>`
|
|
139
|
+
* which shows all files added in that commit.
|
|
140
|
+
*
|
|
141
|
+
* Returns an empty string when any Git command fails.
|
|
142
|
+
*/
|
|
143
|
+
function getCommitDiff(repoPath, commitHash) {
|
|
144
|
+
// Step 1 — get parent hashes.
|
|
145
|
+
let parentStdout;
|
|
146
|
+
try {
|
|
147
|
+
parentStdout = (0, child_process_1.execFileSync)('git', ['log', '--pretty=%P', '-n', '1', commitHash], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return '';
|
|
151
|
+
}
|
|
152
|
+
const parents = parentStdout.trim().split(/\s+/).filter(Boolean);
|
|
153
|
+
// Step 2 & 3 — run the appropriate diff.
|
|
154
|
+
try {
|
|
155
|
+
if (parents.length > 0) {
|
|
156
|
+
const diffs = [];
|
|
157
|
+
for (const parent of parents) {
|
|
158
|
+
try {
|
|
159
|
+
diffs.push((0, child_process_1.execFileSync)('git', ['diff', parent, commitHash], (0, git_utils_1.gitExecOptions)(repoPath)));
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Skip diffs that fail for an individual parent
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return diffs.join('\n');
|
|
166
|
+
}
|
|
167
|
+
// Initial commit — no parent.
|
|
168
|
+
return (0, child_process_1.execFileSync)('git', ['diff', commitHash], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
169
|
+
}
|
|
170
|
+
catch {
|
|
171
|
+
return '';
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// ---------------------------------------------------------------------------
|
|
175
|
+
// getCommitRange
|
|
176
|
+
// ---------------------------------------------------------------------------
|
|
177
|
+
/**
|
|
178
|
+
* Return every commit between `fromHash` (exclusive) and `toHash`
|
|
179
|
+
* (inclusive) in chronological order (oldest first).
|
|
180
|
+
*
|
|
181
|
+
* Runs `git log --reverse --format="..." fromHash..toHash`. Returns an empty
|
|
182
|
+
* array when either hash is not found or the range is empty.
|
|
183
|
+
*
|
|
184
|
+
* Callers should validate that `fromHash` is an ancestor of `toHash` before
|
|
185
|
+
* calling this function (use `git merge-base --is-ancestor`). Results are
|
|
186
|
+
* undefined when the two hashes are on unrelated branches.
|
|
187
|
+
*/
|
|
188
|
+
function getCommitRange(repoPath, fromHash, toHash) {
|
|
189
|
+
let stdout;
|
|
190
|
+
try {
|
|
191
|
+
stdout = (0, child_process_1.execFileSync)('git', ['log', '--no-merges', '--reverse', `--format=%H%x00%aI%x00%an%x00%s%x00`, `${fromHash}..${toHash}`], (0, git_utils_1.gitExecOptions)(repoPath));
|
|
192
|
+
}
|
|
193
|
+
catch {
|
|
194
|
+
return [];
|
|
195
|
+
}
|
|
196
|
+
const parts = stdout.replace(/\0+$/, '').trim().split('\0');
|
|
197
|
+
const commits = [];
|
|
198
|
+
// Each commit occupies 4 NUL-separated fields: hash, timestamp, author, message
|
|
199
|
+
for (let i = 0; i + 3 < parts.length; i += 4) {
|
|
200
|
+
const hash = parts[i].trim();
|
|
201
|
+
const isoString = parts[i + 1].trim();
|
|
202
|
+
const author = parts[i + 2].trim();
|
|
203
|
+
const message = parts[i + 3].trim();
|
|
204
|
+
if (!hash)
|
|
205
|
+
continue;
|
|
206
|
+
commits.push({
|
|
207
|
+
hash,
|
|
208
|
+
message,
|
|
209
|
+
author,
|
|
210
|
+
timestamp: parseISOTimestamp(isoString),
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
return commits;
|
|
214
|
+
}
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
// scan
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
/**
|
|
219
|
+
* Main scanning function — discovers spec↔commit pairs from commit history.
|
|
220
|
+
*
|
|
221
|
+
* Iterates every commit in the repo, extracts a conventional-commit scope from
|
|
222
|
+
* its message, normalizes it, and checks whether the resulting spec ID exists
|
|
223
|
+
* on disk. When a match is found the pair is recorded with full spec and
|
|
224
|
+
* commit metadata.
|
|
225
|
+
*
|
|
226
|
+
* Duplicates (identical specId + commitHash) are de-duplicated via a
|
|
227
|
+
* `Map` keyed on `"${specId}|${commitHash}"`.
|
|
228
|
+
*/
|
|
229
|
+
function scan(repoPath, specStoragePath, config) {
|
|
230
|
+
const pairs = new Map();
|
|
231
|
+
const commits = getAllCommits(repoPath);
|
|
232
|
+
for (const commit of commits) {
|
|
233
|
+
const specId = (0, scope_resolver_1.resolveScopeToSpec)(commit.message, specStoragePath, config);
|
|
234
|
+
if (!specId) {
|
|
235
|
+
(0, errors_1.logDebug)('scan: no scope match', {
|
|
236
|
+
commitHash: commit.hash.slice(0, 7),
|
|
237
|
+
message: commit.message,
|
|
238
|
+
});
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
const specMetadata = (0, spec_extractor_1.extractSpecMetadata)(specStoragePath, specId, config);
|
|
242
|
+
const key = `${specId}|${commit.hash}`;
|
|
243
|
+
if (!pairs.has(key)) {
|
|
244
|
+
pairs.set(key, {
|
|
245
|
+
specId,
|
|
246
|
+
commitHash: commit.hash,
|
|
247
|
+
specMetadata,
|
|
248
|
+
commitMetadata: commit,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return Array.from(pairs.values());
|
|
253
|
+
}
|
|
254
|
+
//# sourceMappingURL=git-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-scanner.js","sourceRoot":"","sources":["../../../src/spec/build/git-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Build pipeline orchestrator — main entry point for building spec
|
|
3
|
+
* knowledge from Git history.
|
|
4
|
+
*
|
|
5
|
+
* Replaces `commit4spec/reverse_engineer/pipeline.py`. Discovers spec↔commit
|
|
6
|
+
* pairs via `scan()`, persists them into the SQLite knowledge graph, and
|
|
7
|
+
* writes a `.homegraph/commit4spec/meta.json` anchor so the self-evolve pipeline can
|
|
8
|
+
* pick up where build left off.
|
|
9
|
+
*
|
|
10
|
+
* @module spec/build/pipeline
|
|
11
|
+
*/
|
|
12
|
+
import { SqliteDatabase } from '../../db/sqlite-adapter';
|
|
13
|
+
import type { ProgressCallback } from '../ui';
|
|
14
|
+
export interface BuildResult {
|
|
15
|
+
specsFound: number;
|
|
16
|
+
commitsFound: number;
|
|
17
|
+
fragmentsFound: number;
|
|
18
|
+
relationsCreated: number;
|
|
19
|
+
totalEntries: number;
|
|
20
|
+
skippedEntries: Array<{
|
|
21
|
+
specId: string;
|
|
22
|
+
reason: string;
|
|
23
|
+
}>;
|
|
24
|
+
upToDate?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Run the full build pipeline.
|
|
28
|
+
*
|
|
29
|
+
* Steps (ported from `pipeline.py:49-151`):
|
|
30
|
+
*
|
|
31
|
+
* 1. Initialise the spec knowledge-graph schema in the database.
|
|
32
|
+
* 2. Discover all specs on disk (for the `totalEntries` count).
|
|
33
|
+
* 3. Scan the repository for spec↔commit pairs.
|
|
34
|
+
* 4. Sort pairs by commit timestamp ascending so that `INSERT OR REPLACE`
|
|
35
|
+
* gives the most-recent commit the final word for each spec node.
|
|
36
|
+
* 5. Process each pair:
|
|
37
|
+
* - Insert a SpecNode (once per specId; deduplicated by commit timestamp).
|
|
38
|
+
* - Insert a CommitNode (once per commit hash).
|
|
39
|
+
* - Insert a SUMMARIZED_FROM relation.
|
|
40
|
+
* - Parse the commit diff into code fragments and persist them.
|
|
41
|
+
* 6. Build a list of specs discovered on disk but never matched to a commit.
|
|
42
|
+
* 7. Write `.homegraph/commit4spec/meta.json`.
|
|
43
|
+
* 8. Return the `BuildResult` with all counts.
|
|
44
|
+
*
|
|
45
|
+
* Edge cases:
|
|
46
|
+
* - Empty pairs → zero counts, write meta anyway, return result.
|
|
47
|
+
* - Pair with commit metadata but no spec metadata → commit and fragments
|
|
48
|
+
* are still persisted; SpecNode and spec_commit_relation are skipped.
|
|
49
|
+
* - Pair with spec metadata but no commit metadata → entire pair is skipped.
|
|
50
|
+
* - Same spec in multiple pairs → only counted once in `specsFound`, but
|
|
51
|
+
* every commit relation is created.
|
|
52
|
+
*/
|
|
53
|
+
export declare function runBuildPipeline(repoPath: string, specStoragePath: string, db: SqliteDatabase, onProgress?: ProgressCallback): BuildResult;
|
|
54
|
+
//# sourceMappingURL=pipeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../src/spec/build/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAWzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAM9C,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,EAAE,EAAE,cAAc,EAClB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,WAAW,CAoIb"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Build pipeline orchestrator — main entry point for building spec
|
|
4
|
+
* knowledge from Git history.
|
|
5
|
+
*
|
|
6
|
+
* Replaces `commit4spec/reverse_engineer/pipeline.py`. Discovers spec↔commit
|
|
7
|
+
* pairs via `scan()`, persists them into the SQLite knowledge graph, and
|
|
8
|
+
* writes a `.homegraph/commit4spec/meta.json` anchor so the self-evolve pipeline can
|
|
9
|
+
* pick up where build left off.
|
|
10
|
+
*
|
|
11
|
+
* @module spec/build/pipeline
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.runBuildPipeline = runBuildPipeline;
|
|
15
|
+
const config_1 = require("../config");
|
|
16
|
+
const utils_1 = require("../utils");
|
|
17
|
+
const schema_1 = require("../db/schema");
|
|
18
|
+
const commit_node_1 = require("../db/commit-node");
|
|
19
|
+
const relations_1 = require("../db/relations");
|
|
20
|
+
const persist_1 = require("../db/persist");
|
|
21
|
+
const scan_1 = require("./scan");
|
|
22
|
+
const git_1 = require("../git");
|
|
23
|
+
const diff_parser_1 = require("./diff-parser");
|
|
24
|
+
const errors_1 = require("../../errors");
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// runBuildPipeline
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/**
|
|
29
|
+
* Run the full build pipeline.
|
|
30
|
+
*
|
|
31
|
+
* Steps (ported from `pipeline.py:49-151`):
|
|
32
|
+
*
|
|
33
|
+
* 1. Initialise the spec knowledge-graph schema in the database.
|
|
34
|
+
* 2. Discover all specs on disk (for the `totalEntries` count).
|
|
35
|
+
* 3. Scan the repository for spec↔commit pairs.
|
|
36
|
+
* 4. Sort pairs by commit timestamp ascending so that `INSERT OR REPLACE`
|
|
37
|
+
* gives the most-recent commit the final word for each spec node.
|
|
38
|
+
* 5. Process each pair:
|
|
39
|
+
* - Insert a SpecNode (once per specId; deduplicated by commit timestamp).
|
|
40
|
+
* - Insert a CommitNode (once per commit hash).
|
|
41
|
+
* - Insert a SUMMARIZED_FROM relation.
|
|
42
|
+
* - Parse the commit diff into code fragments and persist them.
|
|
43
|
+
* 6. Build a list of specs discovered on disk but never matched to a commit.
|
|
44
|
+
* 7. Write `.homegraph/commit4spec/meta.json`.
|
|
45
|
+
* 8. Return the `BuildResult` with all counts.
|
|
46
|
+
*
|
|
47
|
+
* Edge cases:
|
|
48
|
+
* - Empty pairs → zero counts, write meta anyway, return result.
|
|
49
|
+
* - Pair with commit metadata but no spec metadata → commit and fragments
|
|
50
|
+
* are still persisted; SpecNode and spec_commit_relation are skipped.
|
|
51
|
+
* - Pair with spec metadata but no commit metadata → entire pair is skipped.
|
|
52
|
+
* - Same spec in multiple pairs → only counted once in `specsFound`, but
|
|
53
|
+
* every commit relation is created.
|
|
54
|
+
*/
|
|
55
|
+
function runBuildPipeline(repoPath, specStoragePath, db, onProgress) {
|
|
56
|
+
// Pre-check: if meta.json exists and HEAD hasn't changed since the last
|
|
57
|
+
// build, the knowledge graph is already current — skip the full rebuild.
|
|
58
|
+
const existingMeta = (0, utils_1.readMeta)(repoPath);
|
|
59
|
+
if (existingMeta?.currentCommitID) {
|
|
60
|
+
const headHash = (0, git_1.getHeadHash)(repoPath);
|
|
61
|
+
if (headHash && headHash === existingMeta.currentCommitID) {
|
|
62
|
+
(0, errors_1.logDebug)('Skipping spec build: knowledge graph is up to date', {
|
|
63
|
+
currentCommitID: existingMeta.currentCommitID,
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
specsFound: 0,
|
|
67
|
+
commitsFound: 0,
|
|
68
|
+
fragmentsFound: 0,
|
|
69
|
+
relationsCreated: 0,
|
|
70
|
+
totalEntries: (0, utils_1.discoverSpecs)(specStoragePath).length,
|
|
71
|
+
skippedEntries: [],
|
|
72
|
+
upToDate: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// ---- Step 1: init schema ----
|
|
77
|
+
(0, schema_1.initSpecSchema)(db);
|
|
78
|
+
// ---- Step 2: discover specs (for totalEntries) ----
|
|
79
|
+
const allEntries = (0, utils_1.discoverSpecs)(specStoragePath);
|
|
80
|
+
const totalEntries = allEntries.length;
|
|
81
|
+
// ---- Step 3: scan for pairs ----
|
|
82
|
+
const pairs = (0, scan_1.scan)(repoPath, specStoragePath, (0, config_1.loadSpecConfig)(repoPath), onProgress);
|
|
83
|
+
// ---- Step 4: sort by commit timestamp ascending (oldest first) ----
|
|
84
|
+
// INSERT OR REPLACE is used for SpecNode — when the same spec appears
|
|
85
|
+
// in multiple pairs, the LAST write (most-recent commit) naturally wins.
|
|
86
|
+
pairs.sort((a, b) => {
|
|
87
|
+
const aTs = a.commitMetadata?.timestamp ?? 0;
|
|
88
|
+
const bTs = b.commitMetadata?.timestamp ?? 0;
|
|
89
|
+
return aTs - bTs;
|
|
90
|
+
});
|
|
91
|
+
// ---- Step 5: process pairs ----
|
|
92
|
+
const writtenSpecIds = new Set();
|
|
93
|
+
const seenCommitHashes = new Set();
|
|
94
|
+
let specsFound = 0;
|
|
95
|
+
let commitsFound = 0;
|
|
96
|
+
let fragmentsFound = 0;
|
|
97
|
+
let relationsCreated = 0;
|
|
98
|
+
const pairsTotal = pairs.length;
|
|
99
|
+
let pairsCurrent = 0;
|
|
100
|
+
for (const pair of pairs) {
|
|
101
|
+
pairsCurrent++;
|
|
102
|
+
onProgress?.({
|
|
103
|
+
phase: 'persisting',
|
|
104
|
+
current: pairsCurrent,
|
|
105
|
+
total: pairsTotal,
|
|
106
|
+
message: `${pair.specId} @ ${pair.commitHash.slice(0, 7)}`,
|
|
107
|
+
});
|
|
108
|
+
// Skip if no commit metadata (no data to insert).
|
|
109
|
+
const cm = pair.commitMetadata;
|
|
110
|
+
if (!cm) {
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const sm = pair.specMetadata;
|
|
114
|
+
// Insert SpecNode if spec metadata is present.
|
|
115
|
+
// INSERT OR REPLACE lets the most-recent commit (last in ascending
|
|
116
|
+
// order) overwrite the timestamp. We still track writtenSpecIds to
|
|
117
|
+
// correctly count distinct specs (not overwrites).
|
|
118
|
+
if (sm) {
|
|
119
|
+
(0, errors_1.logDebug)('Processing pair: inserting SpecNode', {
|
|
120
|
+
specId: sm.specId,
|
|
121
|
+
title: sm.title,
|
|
122
|
+
});
|
|
123
|
+
(0, persist_1.upsertSpecFromMetadata)(db, sm, cm.timestamp);
|
|
124
|
+
if (!writtenSpecIds.has(pair.specId)) {
|
|
125
|
+
writtenSpecIds.add(pair.specId);
|
|
126
|
+
specsFound++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Insert CommitNode if not yet seen.
|
|
130
|
+
if (!seenCommitHashes.has(cm.hash)) {
|
|
131
|
+
(0, commit_node_1.insertCommitNode)(db, {
|
|
132
|
+
hash: cm.hash,
|
|
133
|
+
message: cm.message,
|
|
134
|
+
author: cm.author,
|
|
135
|
+
timestamp: cm.timestamp,
|
|
136
|
+
});
|
|
137
|
+
seenCommitHashes.add(cm.hash);
|
|
138
|
+
commitsFound++;
|
|
139
|
+
}
|
|
140
|
+
// Insert spec_commit_relation (only when spec metadata exists).
|
|
141
|
+
if (sm) {
|
|
142
|
+
(0, relations_1.insertSpecCommitRelation)(db, pair.specId, cm.hash, 'SUMMARIZED_FROM');
|
|
143
|
+
relationsCreated++;
|
|
144
|
+
}
|
|
145
|
+
// ---- Analyze diff and insert fragments ----
|
|
146
|
+
const preFetchedDiff = (0, git_1.getCommitDiff)(repoPath, cm.hash);
|
|
147
|
+
const fragments = (0, diff_parser_1.analyzeCommitDiff)(repoPath, cm.hash, preFetchedDiff);
|
|
148
|
+
const persisted = (0, persist_1.persistCommitFragments)(db, cm.hash, fragments);
|
|
149
|
+
fragmentsFound += persisted.fragmentsInserted;
|
|
150
|
+
relationsCreated += persisted.relationsCreated;
|
|
151
|
+
}
|
|
152
|
+
// ---- Step 6: build skipped entries ----
|
|
153
|
+
const skippedEntries = allEntries
|
|
154
|
+
.filter((e) => !writtenSpecIds.has(e.specId))
|
|
155
|
+
.map((e) => ({ specId: e.specId, reason: 'No matching commits found' }));
|
|
156
|
+
// ---- Step 7: write meta ----
|
|
157
|
+
const headHash = (0, git_1.getHeadHash)(repoPath) ?? undefined;
|
|
158
|
+
(0, utils_1.writeMeta)(repoPath, specStoragePath, headHash);
|
|
159
|
+
onProgress?.({ phase: 'done', current: 0, total: 0 });
|
|
160
|
+
// ---- Step 8: return result ----
|
|
161
|
+
return {
|
|
162
|
+
specsFound,
|
|
163
|
+
commitsFound,
|
|
164
|
+
fragmentsFound,
|
|
165
|
+
relationsCreated,
|
|
166
|
+
totalEntries,
|
|
167
|
+
skippedEntries,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../../src/spec/build/pipeline.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spec↔commit pairing — discovers which commits reference which specs via
|
|
3
|
+
* conventional-commit scope extraction.
|
|
4
|
+
*
|
|
5
|
+
* Replaces `commit4spec/reverse_engineer/git_scanner.py`'s `scan()` (Strategy
|
|
6
|
+
* A). Shared by the build pipeline and the evolve pipeline's incremental
|
|
7
|
+
* commit analyzer.
|
|
8
|
+
*
|
|
9
|
+
* @module spec/build/scan
|
|
10
|
+
*/
|
|
11
|
+
import { SpecConfig } from '../config';
|
|
12
|
+
import { CommitInfo } from '../git';
|
|
13
|
+
import type { ProgressCallback } from '../ui';
|
|
14
|
+
import { SpecMetadata } from './spec-extractor';
|
|
15
|
+
export interface SpecCommitPair {
|
|
16
|
+
specId: string;
|
|
17
|
+
commitHash: string;
|
|
18
|
+
specMetadata: SpecMetadata | null;
|
|
19
|
+
commitMetadata: CommitInfo | null;
|
|
20
|
+
}
|
|
21
|
+
/** Result of matching a single commit message against the on-disk specs. */
|
|
22
|
+
export interface SpecMatch {
|
|
23
|
+
/** Resolved spec ID, or null when the commit scope matched nothing. */
|
|
24
|
+
specId: string | null;
|
|
25
|
+
/** Extracted spec metadata (null when the spec doc could not be read). */
|
|
26
|
+
metadata: SpecMetadata | null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Match a single commit message to an on-disk spec: resolve the
|
|
30
|
+
* conventional-commit scope to a spec ID, then extract that spec's metadata.
|
|
31
|
+
*
|
|
32
|
+
* This is the shared per-commit matching step used by both {@link scan}
|
|
33
|
+
* (build) and the evolve pipeline's incremental analyzer.
|
|
34
|
+
*/
|
|
35
|
+
export declare function matchCommitToSpec(message: string, specIds: Set<string>, specStoragePath: string, config: SpecConfig): SpecMatch;
|
|
36
|
+
/**
|
|
37
|
+
* Main scanning function — discovers spec↔commit pairs from commit history.
|
|
38
|
+
*
|
|
39
|
+
* Iterates every commit in the repo, extracts a conventional-commit scope from
|
|
40
|
+
* its message, normalizes it, and checks whether the resulting spec ID exists
|
|
41
|
+
* on disk. When a match is found the pair is recorded with full spec and
|
|
42
|
+
* commit metadata.
|
|
43
|
+
*
|
|
44
|
+
* Duplicates (identical specId + commitHash) are de-duplicated via a
|
|
45
|
+
* `Map` keyed on `"${specId}|${commitHash}"`.
|
|
46
|
+
*/
|
|
47
|
+
export declare function scan(repoPath: string, specStoragePath: string, config: SpecConfig, onProgress?: ProgressCallback): SpecCommitPair[];
|
|
48
|
+
//# sourceMappingURL=scan.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../../src/spec/build/scan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,UAAU,EAAiB,MAAM,QAAQ,CAAC;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAuB,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAOrE,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAClC,cAAc,EAAE,UAAU,GAAG,IAAI,CAAC;CACnC;AAED,4EAA4E;AAC5E,MAAM,WAAW,SAAS;IACxB,uEAAuE;IACvE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,0EAA0E;IAC1E,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B;AAMD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EACpB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,UAAU,GACjB,SAAS,CASX;AAMD;;;;;;;;;;GAUG;AACH,wBAAgB,IAAI,CAClB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,MAAM,EAAE,UAAU,EAClB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,cAAc,EAAE,CA0ClB"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Spec↔commit pairing — discovers which commits reference which specs via
|
|
4
|
+
* conventional-commit scope extraction.
|
|
5
|
+
*
|
|
6
|
+
* Replaces `commit4spec/reverse_engineer/git_scanner.py`'s `scan()` (Strategy
|
|
7
|
+
* A). Shared by the build pipeline and the evolve pipeline's incremental
|
|
8
|
+
* commit analyzer.
|
|
9
|
+
*
|
|
10
|
+
* @module spec/build/scan
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.matchCommitToSpec = matchCommitToSpec;
|
|
14
|
+
exports.scan = scan;
|
|
15
|
+
const git_1 = require("../git");
|
|
16
|
+
const utils_1 = require("../utils");
|
|
17
|
+
const scope_resolver_1 = require("./scope-resolver");
|
|
18
|
+
const spec_extractor_1 = require("./spec-extractor");
|
|
19
|
+
const errors_1 = require("../../errors");
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// matchCommitToSpec
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
/**
|
|
24
|
+
* Match a single commit message to an on-disk spec: resolve the
|
|
25
|
+
* conventional-commit scope to a spec ID, then extract that spec's metadata.
|
|
26
|
+
*
|
|
27
|
+
* This is the shared per-commit matching step used by both {@link scan}
|
|
28
|
+
* (build) and the evolve pipeline's incremental analyzer.
|
|
29
|
+
*/
|
|
30
|
+
function matchCommitToSpec(message, specIds, specStoragePath, config) {
|
|
31
|
+
const specId = (0, scope_resolver_1.resolveScopeToSpec)(message, specIds, config);
|
|
32
|
+
if (!specId) {
|
|
33
|
+
return { specId: null, metadata: null };
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
specId,
|
|
37
|
+
metadata: (0, spec_extractor_1.extractSpecMetadata)(specStoragePath, specId, config),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// scan
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/**
|
|
44
|
+
* Main scanning function — discovers spec↔commit pairs from commit history.
|
|
45
|
+
*
|
|
46
|
+
* Iterates every commit in the repo, extracts a conventional-commit scope from
|
|
47
|
+
* its message, normalizes it, and checks whether the resulting spec ID exists
|
|
48
|
+
* on disk. When a match is found the pair is recorded with full spec and
|
|
49
|
+
* commit metadata.
|
|
50
|
+
*
|
|
51
|
+
* Duplicates (identical specId + commitHash) are de-duplicated via a
|
|
52
|
+
* `Map` keyed on `"${specId}|${commitHash}"`.
|
|
53
|
+
*/
|
|
54
|
+
function scan(repoPath, specStoragePath, config, onProgress) {
|
|
55
|
+
const pairs = new Map();
|
|
56
|
+
// Hoist the directory read out of the per-commit loop.
|
|
57
|
+
const specIds = new Set((0, utils_1.discoverSpecs)(specStoragePath).map((e) => e.specId));
|
|
58
|
+
const commits = (0, git_1.getAllCommits)(repoPath);
|
|
59
|
+
const total = commits.length;
|
|
60
|
+
let current = 0;
|
|
61
|
+
for (const commit of commits) {
|
|
62
|
+
current++;
|
|
63
|
+
onProgress?.({
|
|
64
|
+
phase: 'scanning',
|
|
65
|
+
current,
|
|
66
|
+
total,
|
|
67
|
+
message: `${commit.hash.slice(0, 7)} ${commit.message.slice(0, 30)}`,
|
|
68
|
+
});
|
|
69
|
+
const { specId, metadata } = matchCommitToSpec(commit.message, specIds, specStoragePath, config);
|
|
70
|
+
if (!specId) {
|
|
71
|
+
(0, errors_1.logDebug)('scan: no scope match', {
|
|
72
|
+
commitHash: commit.hash.slice(0, 7),
|
|
73
|
+
message: commit.message,
|
|
74
|
+
});
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const key = `${specId}|${commit.hash}`;
|
|
78
|
+
if (!pairs.has(key)) {
|
|
79
|
+
pairs.set(key, {
|
|
80
|
+
specId,
|
|
81
|
+
commitHash: commit.hash,
|
|
82
|
+
specMetadata: metadata,
|
|
83
|
+
commitMetadata: commit,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return Array.from(pairs.values());
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../src/spec/build/scan.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;AAwCH,8CAcC;AAiBD,oBA+CC;AAnHD,gCAAmD;AACnD,oCAAyC;AAEzC,qDAAsD;AACtD,qDAAqE;AACrE,yCAAwC;AAqBxC,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAC/B,OAAe,EACf,OAAoB,EACpB,eAAuB,EACvB,MAAkB;IAElB,MAAM,MAAM,GAAG,IAAA,mCAAkB,EAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO;QACL,MAAM;QACN,QAAQ,EAAE,IAAA,oCAAmB,EAAC,eAAe,EAAE,MAAM,EAAE,MAAM,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,SAAgB,IAAI,CAClB,QAAgB,EAChB,eAAuB,EACvB,MAAkB,EAClB,UAA6B;IAE7B,MAAM,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEhD,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,MAAM,OAAO,GAAG,IAAA,mBAAa,EAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAC7B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,CAAC;YACX,KAAK,EAAE,UAAU;YACjB,OAAO;YACP,KAAK;YACL,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;SACrE,CAAC,CAAC;QAEH,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,iBAAiB,CAC5C,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,CACjD,CAAC;QACF,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAA,iBAAQ,EAAC,sBAAsB,EAAE;gBAC/B,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBACnC,OAAO,EAAE,MAAM,CAAC,OAAO;aACxB,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACb,MAAM;gBACN,UAAU,EAAE,MAAM,CAAC,IAAI;gBACvB,YAAY,EAAE,QAAQ;gBACtB,cAAc,EAAE,MAAM;aACvB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC"}
|