seer-mcp 0.1.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/.vscode/settings.json +3 -0
- package/LICENSE +176 -0
- package/README.md +272 -0
- package/README_dev.md +199 -0
- package/dist/bundle/ci.d.ts +47 -0
- package/dist/bundle/ci.d.ts.map +1 -0
- package/dist/bundle/ci.js +113 -0
- package/dist/bundle/ci.js.map +1 -0
- package/dist/bundle/contract.d.ts +111 -0
- package/dist/bundle/contract.d.ts.map +1 -0
- package/dist/bundle/contract.js +352 -0
- package/dist/bundle/contract.js.map +1 -0
- package/dist/bundle/export.d.ts +36 -0
- package/dist/bundle/export.d.ts.map +1 -0
- package/dist/bundle/export.js +152 -0
- package/dist/bundle/export.js.map +1 -0
- package/dist/bundle/external.d.ts +66 -0
- package/dist/bundle/external.d.ts.map +1 -0
- package/dist/bundle/external.js +238 -0
- package/dist/bundle/external.js.map +1 -0
- package/dist/bundle/format.d.ts +94 -0
- package/dist/bundle/format.d.ts.map +1 -0
- package/dist/bundle/format.js +42 -0
- package/dist/bundle/format.js.map +1 -0
- package/dist/bundle/import.d.ts +49 -0
- package/dist/bundle/import.d.ts.map +1 -0
- package/dist/bundle/import.js +116 -0
- package/dist/bundle/import.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +1402 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +48 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +284 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/db/schema.d.ts +3 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +616 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/db/store.d.ts +1011 -0
- package/dist/db/store.d.ts.map +1 -0
- package/dist/db/store.js +3888 -0
- package/dist/db/store.js.map +1 -0
- package/dist/graph/pagerank.d.ts +9 -0
- package/dist/graph/pagerank.d.ts.map +1 -0
- package/dist/graph/pagerank.js +47 -0
- package/dist/graph/pagerank.js.map +1 -0
- package/dist/indexer/architecture.d.ts +72 -0
- package/dist/indexer/architecture.d.ts.map +1 -0
- package/dist/indexer/architecture.js +112 -0
- package/dist/indexer/architecture.js.map +1 -0
- package/dist/indexer/behavior.d.ts +75 -0
- package/dist/indexer/behavior.d.ts.map +1 -0
- package/dist/indexer/behavior.js +395 -0
- package/dist/indexer/behavior.js.map +1 -0
- package/dist/indexer/boundaries.d.ts +60 -0
- package/dist/indexer/boundaries.d.ts.map +1 -0
- package/dist/indexer/boundaries.js +366 -0
- package/dist/indexer/boundaries.js.map +1 -0
- package/dist/indexer/churn.d.ts +15 -0
- package/dist/indexer/churn.d.ts.map +1 -0
- package/dist/indexer/churn.js +49 -0
- package/dist/indexer/churn.js.map +1 -0
- package/dist/indexer/classify.d.ts +9 -0
- package/dist/indexer/classify.d.ts.map +1 -0
- package/dist/indexer/classify.js +90 -0
- package/dist/indexer/classify.js.map +1 -0
- package/dist/indexer/context.d.ts +176 -0
- package/dist/indexer/context.d.ts.map +1 -0
- package/dist/indexer/context.js +193 -0
- package/dist/indexer/context.js.map +1 -0
- package/dist/indexer/continuity.d.ts +67 -0
- package/dist/indexer/continuity.d.ts.map +1 -0
- package/dist/indexer/continuity.js +288 -0
- package/dist/indexer/continuity.js.map +1 -0
- package/dist/indexer/detectchanges.d.ts +32 -0
- package/dist/indexer/detectchanges.d.ts.map +1 -0
- package/dist/indexer/detectchanges.js +74 -0
- package/dist/indexer/detectchanges.js.map +1 -0
- package/dist/indexer/discovery.d.ts +37 -0
- package/dist/indexer/discovery.d.ts.map +1 -0
- package/dist/indexer/discovery.js +136 -0
- package/dist/indexer/discovery.js.map +1 -0
- package/dist/indexer/externaldeps.d.ts +18 -0
- package/dist/indexer/externaldeps.d.ts.map +1 -0
- package/dist/indexer/externaldeps.js +288 -0
- package/dist/indexer/externaldeps.js.map +1 -0
- package/dist/indexer/freshness.d.ts +48 -0
- package/dist/indexer/freshness.d.ts.map +1 -0
- package/dist/indexer/freshness.js +128 -0
- package/dist/indexer/freshness.js.map +1 -0
- package/dist/indexer/git.d.ts +144 -0
- package/dist/indexer/git.d.ts.map +1 -0
- package/dist/indexer/git.js +444 -0
- package/dist/indexer/git.js.map +1 -0
- package/dist/indexer/index.d.ts +145 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +930 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/modules.d.ts +62 -0
- package/dist/indexer/modules.d.ts.map +1 -0
- package/dist/indexer/modules.js +293 -0
- package/dist/indexer/modules.js.map +1 -0
- package/dist/indexer/preflight.d.ts +154 -0
- package/dist/indexer/preflight.d.ts.map +1 -0
- package/dist/indexer/preflight.js +399 -0
- package/dist/indexer/preflight.js.map +1 -0
- package/dist/indexer/protoScanner.d.ts +34 -0
- package/dist/indexer/protoScanner.d.ts.map +1 -0
- package/dist/indexer/protoScanner.js +133 -0
- package/dist/indexer/protoScanner.js.map +1 -0
- package/dist/indexer/risk.d.ts +115 -0
- package/dist/indexer/risk.d.ts.map +1 -0
- package/dist/indexer/risk.js +194 -0
- package/dist/indexer/risk.js.map +1 -0
- package/dist/indexer/serviceHostScanner.d.ts +25 -0
- package/dist/indexer/serviceHostScanner.d.ts.map +1 -0
- package/dist/indexer/serviceHostScanner.js +95 -0
- package/dist/indexer/serviceHostScanner.js.map +1 -0
- package/dist/indexer/serviceLinks.d.ts +105 -0
- package/dist/indexer/serviceLinks.d.ts.map +1 -0
- package/dist/indexer/serviceLinks.js +509 -0
- package/dist/indexer/serviceLinks.js.map +1 -0
- package/dist/indexer/shapehash.d.ts +98 -0
- package/dist/indexer/shapehash.d.ts.map +1 -0
- package/dist/indexer/shapehash.js +354 -0
- package/dist/indexer/shapehash.js.map +1 -0
- package/dist/indexer/skeleton.d.ts +15 -0
- package/dist/indexer/skeleton.d.ts.map +1 -0
- package/dist/indexer/skeleton.js +136 -0
- package/dist/indexer/skeleton.js.map +1 -0
- package/dist/indexer/symbolhistory.d.ts +41 -0
- package/dist/indexer/symbolhistory.d.ts.map +1 -0
- package/dist/indexer/symbolhistory.js +124 -0
- package/dist/indexer/symbolhistory.js.map +1 -0
- package/dist/indexer/watcher.d.ts +68 -0
- package/dist/indexer/watcher.d.ts.map +1 -0
- package/dist/indexer/watcher.js +179 -0
- package/dist/indexer/watcher.js.map +1 -0
- package/dist/mcp/server.d.ts +80 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +1610 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/parser/index.d.ts +8 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +33 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/languages/cpp.d.ts +3 -0
- package/dist/parser/languages/cpp.d.ts.map +1 -0
- package/dist/parser/languages/cpp.js +350 -0
- package/dist/parser/languages/cpp.js.map +1 -0
- package/dist/parser/languages/csharp.d.ts +3 -0
- package/dist/parser/languages/csharp.d.ts.map +1 -0
- package/dist/parser/languages/csharp.js +239 -0
- package/dist/parser/languages/csharp.js.map +1 -0
- package/dist/parser/languages/go.d.ts +3 -0
- package/dist/parser/languages/go.d.ts.map +1 -0
- package/dist/parser/languages/go.js +259 -0
- package/dist/parser/languages/go.js.map +1 -0
- package/dist/parser/languages/java.d.ts +3 -0
- package/dist/parser/languages/java.d.ts.map +1 -0
- package/dist/parser/languages/java.js +391 -0
- package/dist/parser/languages/java.js.map +1 -0
- package/dist/parser/languages/python.d.ts +3 -0
- package/dist/parser/languages/python.d.ts.map +1 -0
- package/dist/parser/languages/python.js +396 -0
- package/dist/parser/languages/python.js.map +1 -0
- package/dist/parser/languages/rust.d.ts +3 -0
- package/dist/parser/languages/rust.d.ts.map +1 -0
- package/dist/parser/languages/rust.js +159 -0
- package/dist/parser/languages/rust.js.map +1 -0
- package/dist/parser/languages/typescript.d.ts +3 -0
- package/dist/parser/languages/typescript.d.ts.map +1 -0
- package/dist/parser/languages/typescript.js +1442 -0
- package/dist/parser/languages/typescript.js.map +1 -0
- package/dist/parser/parserContext.d.ts +77 -0
- package/dist/parser/parserContext.d.ts.map +1 -0
- package/dist/parser/parserContext.js +354 -0
- package/dist/parser/parserContext.js.map +1 -0
- package/dist/parser/walker.d.ts +81 -0
- package/dist/parser/walker.d.ts.map +1 -0
- package/dist/parser/walker.js +217 -0
- package/dist/parser/walker.js.map +1 -0
- package/dist/parser/worker.d.ts +66 -0
- package/dist/parser/worker.d.ts.map +1 -0
- package/dist/parser/worker.js +129 -0
- package/dist/parser/worker.js.map +1 -0
- package/dist/parser/workerpool.d.ts +107 -0
- package/dist/parser/workerpool.d.ts.map +1 -0
- package/dist/parser/workerpool.js +383 -0
- package/dist/parser/workerpool.js.map +1 -0
- package/dist/scip/format.d.ts +87 -0
- package/dist/scip/format.d.ts.map +1 -0
- package/dist/scip/format.js +31 -0
- package/dist/scip/format.js.map +1 -0
- package/dist/scip/import.d.ts +37 -0
- package/dist/scip/import.d.ts.map +1 -0
- package/dist/scip/import.js +180 -0
- package/dist/scip/import.js.map +1 -0
- package/dist/types.d.ts +392 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/docs/architecture.md +105 -0
- package/docs/benchmarks/methodology.md +134 -0
- package/docs/benchmarks/raw-results.md +71 -0
- package/docs/benchmarks.md +74 -0
- package/docs/cli.md +148 -0
- package/docs/examples/behavior-tests.md +70 -0
- package/docs/examples/change-history.md +85 -0
- package/docs/examples/pre-edit-context.md +81 -0
- package/docs/examples/service-links.md +88 -0
- package/docs/examples.md +80 -0
- package/docs/faq.md +70 -0
- package/docs/internals.md +104 -0
- package/docs/languages.md +70 -0
- package/docs/limits.md +52 -0
- package/docs/mcp.md +199 -0
- package/docs/quickstart.md +119 -0
- package/docs/testing.md +123 -0
- package/docs/tools.md +115 -0
- package/package.json +52 -0
- package/research-codebase.md +578 -0
- package/seer-cli-docs.md +326 -0
- package/seer-master-guide.md +246 -0
- package/src/bundle/ci.ts +141 -0
- package/src/bundle/contract.ts +387 -0
- package/src/bundle/export.ts +175 -0
- package/src/bundle/external.ts +285 -0
- package/src/bundle/format.ts +92 -0
- package/src/bundle/import.ts +157 -0
- package/src/cli/index.ts +1249 -0
- package/src/cli/init.ts +389 -0
- package/src/db/schema.ts +614 -0
- package/src/db/store.ts +4306 -0
- package/src/graph/pagerank.ts +53 -0
- package/src/indexer/architecture.ts +148 -0
- package/src/indexer/behavior.ts +466 -0
- package/src/indexer/boundaries.ts +374 -0
- package/src/indexer/churn.ts +58 -0
- package/src/indexer/classify.ts +96 -0
- package/src/indexer/context.ts +340 -0
- package/src/indexer/continuity.ts +322 -0
- package/src/indexer/detectchanges.ts +94 -0
- package/src/indexer/discovery.ts +176 -0
- package/src/indexer/externaldeps.ts +243 -0
- package/src/indexer/freshness.ts +166 -0
- package/src/indexer/git.ts +453 -0
- package/src/indexer/index.ts +1092 -0
- package/src/indexer/modules.ts +358 -0
- package/src/indexer/preflight.ts +548 -0
- package/src/indexer/protoScanner.ts +147 -0
- package/src/indexer/risk.ts +304 -0
- package/src/indexer/serviceHostScanner.ts +92 -0
- package/src/indexer/serviceLinks.ts +543 -0
- package/src/indexer/shapehash.ts +370 -0
- package/src/indexer/skeleton.ts +169 -0
- package/src/indexer/symbolhistory.ts +172 -0
- package/src/indexer/watcher.ts +206 -0
- package/src/mcp/server.ts +1659 -0
- package/src/parser/index.ts +37 -0
- package/src/parser/languages/cpp.ts +361 -0
- package/src/parser/languages/csharp.ts +235 -0
- package/src/parser/languages/go.ts +259 -0
- package/src/parser/languages/java.ts +382 -0
- package/src/parser/languages/python.ts +370 -0
- package/src/parser/languages/rust.ts +164 -0
- package/src/parser/languages/typescript.ts +1435 -0
- package/src/parser/parserContext.ts +392 -0
- package/src/parser/walker.ts +306 -0
- package/src/parser/worker.ts +181 -0
- package/src/parser/workerpool.ts +448 -0
- package/src/scip/format.ts +83 -0
- package/src/scip/import.ts +216 -0
- package/src/types.ts +457 -0
- package/tests/benchmark-service-links.ts +244 -0
- package/tests/bug-regressions.ts +626 -0
- package/tests/filters.ts +264 -0
- package/tests/fixtures/Counter.tsx +38 -0
- package/tests/fixtures/caller.ts +7 -0
- package/tests/fixtures/collisions.ts +23 -0
- package/tests/fixtures/local_helper.ts +5 -0
- package/tests/fixtures/overloads.java +17 -0
- package/tests/fixtures/remote_helper.ts +4 -0
- package/tests/fixtures/sample.c +15 -0
- package/tests/fixtures/sample.cpp +47 -0
- package/tests/fixtures/sample.cs +62 -0
- package/tests/fixtures/sample.go +68 -0
- package/tests/fixtures/sample.h +30 -0
- package/tests/fixtures/sample.java +85 -0
- package/tests/fixtures/sample.py +46 -0
- package/tests/fixtures/sample.rs +78 -0
- package/tests/fixtures/sample.ts +76 -0
- package/tests/fixtures-service/HttpClients.cs +30 -0
- package/tests/fixtures-service/HttpClients.java +24 -0
- package/tests/fixtures-service/billing.ts +15 -0
- package/tests/fixtures-service/docker-compose.yml +15 -0
- package/tests/fixtures-service/gateway.ts +10 -0
- package/tests/fixtures-service/get_user.ts +11 -0
- package/tests/fixtures-service/graphql_client.ts +63 -0
- package/tests/fixtures-service/graphql_server.ts +30 -0
- package/tests/fixtures-service/grpc_client.go +30 -0
- package/tests/fixtures-service/http_clients.go +23 -0
- package/tests/fixtures-service/http_clients.py +38 -0
- package/tests/fixtures-service/http_clients.ts +49 -0
- package/tests/fixtures-service/k8s/payment-service.yaml +22 -0
- package/tests/fixtures-service/k8s_calls.ts +20 -0
- package/tests/fixtures-service/messaging.ts +87 -0
- package/tests/fixtures-service/trpc_client.ts +39 -0
- package/tests/fixtures-service/trpc_server.ts +39 -0
- package/tests/fixtures-service/user_service.proto +33 -0
- package/tests/fixtures-trackcd/Cargo.toml +11 -0
- package/tests/fixtures-trackcd/SpringController.java +36 -0
- package/tests/fixtures-trackcd/auth_service.ts +19 -0
- package/tests/fixtures-trackcd/complex_module.py +50 -0
- package/tests/fixtures-trackcd/express_app.js +30 -0
- package/tests/fixtures-trackcd/fastapi_app.py +49 -0
- package/tests/fixtures-trackcd/fastify_object_routes.js +32 -0
- package/tests/fixtures-trackcd/go.mod +8 -0
- package/tests/fixtures-trackcd/package.json +15 -0
- package/tests/fixtures-trackcd/requirements.txt +4 -0
- package/tests/fixtures-trackcd/tests/auth_service.test.ts +13 -0
- package/tests/fixtures-tracke/auth/AuthService.ts +23 -0
- package/tests/fixtures-tracke/auth/crypto.ts +7 -0
- package/tests/fixtures-tracke/billing/Billing.ts +20 -0
- package/tests/fixtures-tracke/billing/Invoice.ts +10 -0
- package/tests/fixtures-tracke/billing/server.ts +17 -0
- package/tests/fixtures-tracke/package.json +7 -0
- package/tests/fixtures-tracke/tests/auth.test.ts +23 -0
- package/tests/fixtures-tracke/tests/billing.test.ts +14 -0
- package/tests/fixtures-trackf/package.json +5 -0
- package/tests/fixtures-trackf/src/auth.ts +26 -0
- package/tests/fixtures-trackf/src/handlers.ts +35 -0
- package/tests/fixtures-tracki/billing/routes.ts +12 -0
- package/tests/fixtures-tracki/gateway/client.ts +13 -0
- package/tests/git-features.ts +267 -0
- package/tests/init.ts +141 -0
- package/tests/mcp-jit.ts +130 -0
- package/tests/mcp-smoke.ts +191 -0
- package/tests/mcp-trackcd.ts +169 -0
- package/tests/mcp-tracke.ts +229 -0
- package/tests/mcp-trackf.ts +330 -0
- package/tests/mcp-trackg.ts +219 -0
- package/tests/mcp-tracki.ts +174 -0
- package/tests/mcp-watcher.ts +126 -0
- package/tests/optspec.ts +194 -0
- package/tests/parallel-index.ts +333 -0
- package/tests/parallel-read.ts +125 -0
- package/tests/parallel-recovery.ts +241 -0
- package/tests/perf-callers.ts +145 -0
- package/tests/query-parity.ts +184 -0
- package/tests/query-perf.ts +55 -0
- package/tests/scale-parallel-parity.ts +225 -0
- package/tests/scale-test.ts +523 -0
- package/tests/smoke.ts +396 -0
- package/tests/trackcd.ts +325 -0
- package/tests/tracke-collisions.ts +255 -0
- package/tests/tracke.ts +314 -0
- package/tests/trackf-bugs.ts +406 -0
- package/tests/trackf.ts +390 -0
- package/tests/trackg.ts +1372 -0
- package/tests/tracki-boundaries.ts +202 -0
- package/tests/tracki-continuity.ts +253 -0
- package/tests/tracki-contract-diff.ts +249 -0
- package/tests/tracki-external-bundles.ts +341 -0
- package/tests/tracki-preflight.ts +251 -0
- package/tests/verify-roles.ts +51 -0
- package/tests/worker-parity.ts +286 -0
- package/tests/worker-pool.ts +262 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,444 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.isGitRepo = isGitRepo;
|
|
7
|
+
exports.gitHeadSha = gitHeadSha;
|
|
8
|
+
exports.gitRemoteUrl = gitRemoteUrl;
|
|
9
|
+
exports.collectFileChurn = collectFileChurn;
|
|
10
|
+
exports.commitsForFile = commitsForFile;
|
|
11
|
+
exports.parseFollowLog = parseFollowLog;
|
|
12
|
+
exports.fileDiffHunks = fileDiffHunks;
|
|
13
|
+
exports.fileDiffInfo = fileDiffInfo;
|
|
14
|
+
exports.commitNumstat = commitNumstat;
|
|
15
|
+
exports.gitChangedFiles = gitChangedFiles;
|
|
16
|
+
exports.fileDiffHunksSync = fileDiffHunksSync;
|
|
17
|
+
exports.extractPrNumber = extractPrNumber;
|
|
18
|
+
exports.githubPrUrl = githubPrUrl;
|
|
19
|
+
const path_1 = __importDefault(require("path"));
|
|
20
|
+
const fs_1 = __importDefault(require("fs"));
|
|
21
|
+
const child_process_1 = require("child_process");
|
|
22
|
+
/**
|
|
23
|
+
* Thin async wrapper around `git` so the rest of the indexer doesn't deal
|
|
24
|
+
* with child_process directly. All commands run with `cwd = repoRoot`.
|
|
25
|
+
*
|
|
26
|
+
* Errors are surfaced as `null` returns (not throws) so a non-git workspace
|
|
27
|
+
* silently no-ops. Callers should check the return value.
|
|
28
|
+
*/
|
|
29
|
+
function isGitRepo(repoRoot) {
|
|
30
|
+
try {
|
|
31
|
+
const r = (0, child_process_1.spawnSync)('git', ['-C', repoRoot, 'rev-parse', '--is-inside-work-tree'], { encoding: 'utf8' });
|
|
32
|
+
return r.status === 0 && r.stdout.trim() === 'true';
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function gitHeadSha(repoRoot) {
|
|
39
|
+
try {
|
|
40
|
+
const r = (0, child_process_1.spawnSync)('git', ['-C', repoRoot, 'rev-parse', 'HEAD'], { encoding: 'utf8' });
|
|
41
|
+
if (r.status !== 0)
|
|
42
|
+
return null;
|
|
43
|
+
return r.stdout.trim() || null;
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function gitRemoteUrl(repoRoot, remote = 'origin') {
|
|
50
|
+
try {
|
|
51
|
+
const r = (0, child_process_1.spawnSync)('git', ['-C', repoRoot, 'config', '--get', `remote.${remote}.url`], { encoding: 'utf8' });
|
|
52
|
+
if (r.status !== 0)
|
|
53
|
+
return null;
|
|
54
|
+
return r.stdout.trim() || null;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Collect file-level churn stats by streaming `git log` once and bucketing
|
|
62
|
+
* per file. Uses `--follow` per-file would be ~slow on big repos, so we use
|
|
63
|
+
* a single `git log --name-only` pass and aggregate in JS. The trade-off is
|
|
64
|
+
* that renames lose their pre-rename history; callers documenting that fact
|
|
65
|
+
* matches the master guide's "honest about rename limits" stance.
|
|
66
|
+
*/
|
|
67
|
+
async function collectFileChurn(repoRoot, filesAbs) {
|
|
68
|
+
const result = new Map();
|
|
69
|
+
if (!isGitRepo(repoRoot))
|
|
70
|
+
return result;
|
|
71
|
+
// Build a quick lookup: relPath (forward slashes, normalized) → absPath.
|
|
72
|
+
// `git log` reports paths relative to repo root, so we have to translate
|
|
73
|
+
// back to absolute paths the indexer keyed off.
|
|
74
|
+
const absSet = new Set();
|
|
75
|
+
for (const a of filesAbs)
|
|
76
|
+
absSet.add(normalize(a));
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
const proc = (0, child_process_1.spawn)('git', ['-C', repoRoot, 'log', '--name-only', '--pretty=format:__COMMIT__%H%x09%an%x09%aI', '--no-merges'], { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
79
|
+
let buf = '';
|
|
80
|
+
let currentSha = null;
|
|
81
|
+
let currentAuthor = null;
|
|
82
|
+
let currentDateSec = null;
|
|
83
|
+
const perFile = new Map();
|
|
84
|
+
const handleLine = (line) => {
|
|
85
|
+
if (line.startsWith('__COMMIT__')) {
|
|
86
|
+
const parts = line.slice('__COMMIT__'.length).split('\t');
|
|
87
|
+
currentSha = parts[0] || null;
|
|
88
|
+
currentAuthor = parts[1] || null;
|
|
89
|
+
currentDateSec = parts[2] ? Math.floor(Date.parse(parts[2]) / 1000) : null;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
if (!line.trim())
|
|
93
|
+
return;
|
|
94
|
+
const rel = normalize(line);
|
|
95
|
+
// Resolve to absolute. Path may use forward slashes; we compare against
|
|
96
|
+
// absSet directly. Also fall back to repoRoot-joined.
|
|
97
|
+
const cand1 = normalize(path_1.default.resolve(repoRoot, rel));
|
|
98
|
+
let key = null;
|
|
99
|
+
if (absSet.has(cand1))
|
|
100
|
+
key = cand1;
|
|
101
|
+
else if (absSet.has(rel))
|
|
102
|
+
key = rel;
|
|
103
|
+
if (!key)
|
|
104
|
+
return;
|
|
105
|
+
let entry = perFile.get(key);
|
|
106
|
+
if (!entry) {
|
|
107
|
+
entry = { count: 0, lastSha: null, lastAt: null, authors: new Map() };
|
|
108
|
+
perFile.set(key, entry);
|
|
109
|
+
}
|
|
110
|
+
entry.count++;
|
|
111
|
+
if (entry.lastSha === null) {
|
|
112
|
+
entry.lastSha = currentSha;
|
|
113
|
+
entry.lastAt = currentDateSec;
|
|
114
|
+
}
|
|
115
|
+
if (currentAuthor) {
|
|
116
|
+
entry.authors.set(currentAuthor, (entry.authors.get(currentAuthor) ?? 0) + 1);
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
proc.stdout.on('data', (chunk) => {
|
|
120
|
+
buf += chunk.toString('utf8');
|
|
121
|
+
let nl;
|
|
122
|
+
while ((nl = buf.indexOf('\n')) >= 0) {
|
|
123
|
+
const line = buf.slice(0, nl);
|
|
124
|
+
buf = buf.slice(nl + 1);
|
|
125
|
+
handleLine(line);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
proc.stderr.on('data', () => { });
|
|
129
|
+
proc.on('error', reject);
|
|
130
|
+
proc.on('close', () => {
|
|
131
|
+
if (buf.length > 0)
|
|
132
|
+
handleLine(buf);
|
|
133
|
+
for (const [key, e] of perFile) {
|
|
134
|
+
const sortedAuthors = Array.from(e.authors.entries()).sort((a, b) => b[1] - a[1]);
|
|
135
|
+
result.set(key, {
|
|
136
|
+
commitCount: e.count,
|
|
137
|
+
lastCommitSha: e.lastSha,
|
|
138
|
+
lastCommitAt: e.lastAt,
|
|
139
|
+
topAuthor: sortedAuthors[0]?.[0] ?? null,
|
|
140
|
+
secondAuthor: sortedAuthors[1]?.[0] ?? null,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
resolve(result);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* `git log` commits that touched a single file, newest first. Each commit
|
|
149
|
+
* includes its author info and full message. Used by the symbol-history pass.
|
|
150
|
+
*
|
|
151
|
+
* `--name-status` is added on top of `--follow` so we get a per-commit path —
|
|
152
|
+
* critical for the rename case: the historical commits touched the OLD path,
|
|
153
|
+
* but our usual `git show <sha> -- <currentPath>` would look at the wrong
|
|
154
|
+
* path and return empty hunks. With pathAtCommit threaded through to
|
|
155
|
+
* fileDiffInfo(), pre-rename history is preserved.
|
|
156
|
+
*
|
|
157
|
+
* Parser shape: we ask git for a per-commit header line prefixed `__C__`
|
|
158
|
+
* (sha, author, email, ISO date — all NUL-free fields tab-separated), then
|
|
159
|
+
* the commit body (terminated by a unique end marker `__BODY_END__`), then
|
|
160
|
+
* the name-status lines that git appends after each commit. The name-status
|
|
161
|
+
* block has one path entry per commit relative to this file's --follow chain:
|
|
162
|
+
* either `M\tpath`, `A\tpath`, `D\tpath`, or `R<score>\toldPath\tnewPath`.
|
|
163
|
+
*
|
|
164
|
+
* Using a custom body terminator (instead of git's default blank-line
|
|
165
|
+
* separator) lets us handle commit messages that themselves contain blank
|
|
166
|
+
* lines or `__C__` literals without re-introducing the old `__C__ff8` bug.
|
|
167
|
+
*/
|
|
168
|
+
async function commitsForFile(repoRoot, filePath, options = {}) {
|
|
169
|
+
if (!isGitRepo(repoRoot))
|
|
170
|
+
return [];
|
|
171
|
+
const rel = path_1.default.relative(repoRoot, filePath);
|
|
172
|
+
const args = ['-C', repoRoot, 'log',
|
|
173
|
+
'--pretty=format:__C__%H%x09%an%x09%ae%x09%aI%n%B%n__BODY_END__',
|
|
174
|
+
'--no-merges',
|
|
175
|
+
'--follow',
|
|
176
|
+
'--name-status',
|
|
177
|
+
];
|
|
178
|
+
if (options.limit)
|
|
179
|
+
args.push(`-n${options.limit}`);
|
|
180
|
+
if (options.since)
|
|
181
|
+
args.push(`--since=${new Date(options.since * 1000).toISOString()}`);
|
|
182
|
+
args.push('--', rel);
|
|
183
|
+
return new Promise((resolve) => {
|
|
184
|
+
const proc = (0, child_process_1.spawn)('git', args, { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
185
|
+
let buf = '';
|
|
186
|
+
proc.stdout.on('data', (c) => { buf += c.toString('utf8'); });
|
|
187
|
+
proc.stderr.on('data', () => { });
|
|
188
|
+
proc.on('error', () => resolve([]));
|
|
189
|
+
proc.on('close', () => {
|
|
190
|
+
resolve(parseFollowLog(buf));
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Walk the line stream from `git log --follow --name-status` (with the
|
|
196
|
+
* `__C__` header / `__BODY_END__` body terminator format above) and emit
|
|
197
|
+
* one CommitMeta per `__C__` header. Exposed only for tests; the live
|
|
198
|
+
* pipeline goes through commitsForFile().
|
|
199
|
+
*/
|
|
200
|
+
function parseFollowLog(buf) {
|
|
201
|
+
const out = [];
|
|
202
|
+
// Normalize CRLF that Windows git may inject in some setups so the line
|
|
203
|
+
// walker doesn't end up with trailing \r in messages or paths.
|
|
204
|
+
const lines = buf.replace(/\r\n/g, '\n').split('\n');
|
|
205
|
+
let i = 0;
|
|
206
|
+
while (i < lines.length) {
|
|
207
|
+
const line = lines[i];
|
|
208
|
+
if (!line.startsWith('__C__')) {
|
|
209
|
+
i++;
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const headerParts = line.slice('__C__'.length).split('\t');
|
|
213
|
+
if (headerParts.length < 4) {
|
|
214
|
+
i++;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const [sha, author, email, dateStr] = headerParts;
|
|
218
|
+
const committedAt = Math.floor(Date.parse(dateStr) / 1000);
|
|
219
|
+
if (!sha || isNaN(committedAt)) {
|
|
220
|
+
i++;
|
|
221
|
+
continue;
|
|
222
|
+
}
|
|
223
|
+
// Collect message body until __BODY_END__.
|
|
224
|
+
i++;
|
|
225
|
+
const msgLines = [];
|
|
226
|
+
while (i < lines.length && lines[i] !== '__BODY_END__') {
|
|
227
|
+
msgLines.push(lines[i]);
|
|
228
|
+
i++;
|
|
229
|
+
}
|
|
230
|
+
// Skip the __BODY_END__ line itself.
|
|
231
|
+
if (i < lines.length)
|
|
232
|
+
i++;
|
|
233
|
+
// Collect name-status lines until the next __C__ header or EOF. Blank
|
|
234
|
+
// lines (which git emits between commit body and name-status) are
|
|
235
|
+
// skipped; we never have to interpret them.
|
|
236
|
+
let pathAtCommit = null;
|
|
237
|
+
while (i < lines.length && !lines[i].startsWith('__C__')) {
|
|
238
|
+
const nl = lines[i];
|
|
239
|
+
if (nl.length === 0) {
|
|
240
|
+
i++;
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
const fields = nl.split('\t');
|
|
244
|
+
if (fields.length >= 2) {
|
|
245
|
+
const code = fields[0];
|
|
246
|
+
if (code.startsWith('R') || code.startsWith('C')) {
|
|
247
|
+
// Rename/copy: code, oldPath, newPath. The NEW path is what this
|
|
248
|
+
// commit produced (and the path subsequent commits see).
|
|
249
|
+
if (fields.length >= 3)
|
|
250
|
+
pathAtCommit = fields[2];
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
pathAtCommit = fields[1];
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
i++;
|
|
257
|
+
}
|
|
258
|
+
const message = msgLines.join('\n').trimEnd();
|
|
259
|
+
out.push({
|
|
260
|
+
sha,
|
|
261
|
+
authorName: author || null,
|
|
262
|
+
authorEmail: email || null,
|
|
263
|
+
committedAt,
|
|
264
|
+
message,
|
|
265
|
+
pathAtCommit,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
return out;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Diff hunks for a file changed by a single commit. `git show -U0 <sha>`
|
|
272
|
+
* handles the root commit transparently (no parent → diff against the empty
|
|
273
|
+
* tree), so the caller doesn't need to pass parentSha. `parentSha` is kept
|
|
274
|
+
* for compatibility but ignored.
|
|
275
|
+
*/
|
|
276
|
+
async function fileDiffHunks(repoRoot, _parentSha, sha, filePath) {
|
|
277
|
+
const info = await fileDiffInfo(repoRoot, sha, filePath);
|
|
278
|
+
return info.hunks;
|
|
279
|
+
}
|
|
280
|
+
/** Like fileDiffHunks but returns extra metadata used for "this commit
|
|
281
|
+
* created the file → match every symbol" heuristic.
|
|
282
|
+
*
|
|
283
|
+
* `filePath` may be either an absolute path or a repo-relative one. When the
|
|
284
|
+
* file was renamed across history, callers should pass the PATH-AT-COMMIT
|
|
285
|
+
* (resolved from `git log --follow --name-status`) so `git show` looks at
|
|
286
|
+
* the right side of the rename — passing the current path would return
|
|
287
|
+
* empty hunks for pre-rename commits and silently lose history.
|
|
288
|
+
*/
|
|
289
|
+
async function fileDiffInfo(repoRoot, sha, filePath) {
|
|
290
|
+
if (!isGitRepo(repoRoot))
|
|
291
|
+
return { hunks: [], isFileAddition: false };
|
|
292
|
+
const rel = path_1.default.isAbsolute(filePath) ? path_1.default.relative(repoRoot, filePath) : filePath;
|
|
293
|
+
const args = ['-C', repoRoot, 'show', '--format=', '-U0', sha, '--', rel];
|
|
294
|
+
return new Promise(resolve => {
|
|
295
|
+
const proc = (0, child_process_1.spawn)('git', args, { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
296
|
+
let buf = '';
|
|
297
|
+
proc.stdout.on('data', (c) => { buf += c.toString('utf8'); });
|
|
298
|
+
proc.stderr.on('data', () => { });
|
|
299
|
+
proc.on('error', () => resolve({ hunks: [], isFileAddition: false }));
|
|
300
|
+
proc.on('close', () => {
|
|
301
|
+
const out = [];
|
|
302
|
+
const re = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm;
|
|
303
|
+
let m;
|
|
304
|
+
while ((m = re.exec(buf)) !== null) {
|
|
305
|
+
out.push({
|
|
306
|
+
oldStart: parseInt(m[1], 10),
|
|
307
|
+
oldLines: m[2] ? parseInt(m[2], 10) : 1,
|
|
308
|
+
newStart: parseInt(m[3], 10),
|
|
309
|
+
newLines: m[4] ? parseInt(m[4], 10) : 1,
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
const isFileAddition = /^--- \/dev\/null$/m.test(buf) || /^new file mode/m.test(buf);
|
|
313
|
+
resolve({ hunks: out, isFileAddition });
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Diff numstat for one commit: returns added/removed line counts per file
|
|
319
|
+
* (or aggregated when filePath is given).
|
|
320
|
+
*/
|
|
321
|
+
async function commitNumstat(repoRoot, sha, filePath) {
|
|
322
|
+
if (!isGitRepo(repoRoot))
|
|
323
|
+
return { added: 0, removed: 0 };
|
|
324
|
+
const args = ['-C', repoRoot, 'show', '--numstat', '--format=', sha];
|
|
325
|
+
if (filePath)
|
|
326
|
+
args.push('--', path_1.default.relative(repoRoot, filePath));
|
|
327
|
+
return new Promise(resolve => {
|
|
328
|
+
const proc = (0, child_process_1.spawn)('git', args, { stdio: ['ignore', 'pipe', 'pipe'] });
|
|
329
|
+
let buf = '';
|
|
330
|
+
proc.stdout.on('data', (c) => { buf += c.toString('utf8'); });
|
|
331
|
+
proc.on('error', () => resolve({ added: 0, removed: 0 }));
|
|
332
|
+
proc.on('close', () => {
|
|
333
|
+
let added = 0, removed = 0;
|
|
334
|
+
for (const line of buf.split('\n')) {
|
|
335
|
+
const parts = line.trim().split(/\s+/);
|
|
336
|
+
if (parts.length < 3)
|
|
337
|
+
continue;
|
|
338
|
+
const a = parseInt(parts[0], 10);
|
|
339
|
+
const r = parseInt(parts[1], 10);
|
|
340
|
+
if (!isNaN(a))
|
|
341
|
+
added += a;
|
|
342
|
+
if (!isNaN(r))
|
|
343
|
+
removed += r;
|
|
344
|
+
}
|
|
345
|
+
resolve({ added, removed });
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* git diff name-only between two refs. Defaults to HEAD vs the working
|
|
351
|
+
* tree (uncommitted changes) — used by `detect_changes`. Returns absolute
|
|
352
|
+
* paths (after path.resolve(repoRoot, rel)).
|
|
353
|
+
*/
|
|
354
|
+
function gitChangedFiles(repoRoot, fromRef, toRef) {
|
|
355
|
+
if (!isGitRepo(repoRoot))
|
|
356
|
+
return [];
|
|
357
|
+
const args = ['-C', repoRoot, 'diff', '--name-only'];
|
|
358
|
+
if (fromRef && toRef)
|
|
359
|
+
args.push(`${fromRef}..${toRef}`);
|
|
360
|
+
else if (fromRef)
|
|
361
|
+
args.push(fromRef);
|
|
362
|
+
// No refs → working-tree diff against HEAD.
|
|
363
|
+
const r = (0, child_process_1.spawnSync)('git', args, { encoding: 'utf8' });
|
|
364
|
+
if (r.status !== 0)
|
|
365
|
+
return [];
|
|
366
|
+
return r.stdout.split('\n').filter(Boolean).map(rel => path_1.default.resolve(repoRoot, rel));
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* git diff -U0 hunks for one file between two refs (or working tree if refs
|
|
370
|
+
* omitted). Returns parsed hunk headers (line ranges in the new file) so
|
|
371
|
+
* `detect_changes` can compute which symbols overlap.
|
|
372
|
+
*/
|
|
373
|
+
function fileDiffHunksSync(repoRoot, filePath, fromRef, toRef) {
|
|
374
|
+
if (!isGitRepo(repoRoot))
|
|
375
|
+
return [];
|
|
376
|
+
if (!fs_1.default.existsSync(filePath))
|
|
377
|
+
return [];
|
|
378
|
+
const rel = path_1.default.relative(repoRoot, filePath);
|
|
379
|
+
const args = ['-C', repoRoot, 'diff', '-U0'];
|
|
380
|
+
if (fromRef && toRef)
|
|
381
|
+
args.push(`${fromRef}..${toRef}`);
|
|
382
|
+
else if (fromRef)
|
|
383
|
+
args.push(fromRef);
|
|
384
|
+
args.push('--', rel);
|
|
385
|
+
const r = (0, child_process_1.spawnSync)('git', args, { encoding: 'utf8' });
|
|
386
|
+
if (r.status !== 0)
|
|
387
|
+
return [];
|
|
388
|
+
const out = [];
|
|
389
|
+
const re = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@/gm;
|
|
390
|
+
let m;
|
|
391
|
+
while ((m = re.exec(r.stdout)) !== null) {
|
|
392
|
+
out.push({
|
|
393
|
+
oldStart: parseInt(m[1], 10),
|
|
394
|
+
oldLines: m[2] ? parseInt(m[2], 10) : 1,
|
|
395
|
+
newStart: parseInt(m[3], 10),
|
|
396
|
+
newLines: m[4] ? parseInt(m[4], 10) : 1,
|
|
397
|
+
});
|
|
398
|
+
}
|
|
399
|
+
return out;
|
|
400
|
+
}
|
|
401
|
+
function normalize(p) {
|
|
402
|
+
const n = p.replace(/\\/g, '/');
|
|
403
|
+
return process.platform === 'win32' ? n.toLowerCase() : n;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Extract GitHub-style PR numbers from a commit message. We accept the
|
|
407
|
+
* common conventions:
|
|
408
|
+
* "Merge pull request #1234 from ..."
|
|
409
|
+
* "Fix something (#1234)"
|
|
410
|
+
* "#1234"
|
|
411
|
+
* "PR #1234"
|
|
412
|
+
*
|
|
413
|
+
* Returns the first matched PR number, or null.
|
|
414
|
+
*/
|
|
415
|
+
function extractPrNumber(message) {
|
|
416
|
+
if (!message)
|
|
417
|
+
return null;
|
|
418
|
+
const merge = message.match(/Merge pull request #(\d+)/i);
|
|
419
|
+
if (merge)
|
|
420
|
+
return parseInt(merge[1], 10);
|
|
421
|
+
// Trailing or inline `#1234` but not part of a hex-ish word
|
|
422
|
+
const m = message.match(/(?:^|[\s(])#(\d{1,7})\b/);
|
|
423
|
+
if (m)
|
|
424
|
+
return parseInt(m[1], 10);
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
/**
|
|
428
|
+
* If `remoteUrl` is a GitHub URL (HTTPS or SSH), return the matching
|
|
429
|
+
* `https://github.com/<owner>/<repo>/pull/<n>` URL for a PR number.
|
|
430
|
+
* Returns null for non-GitHub remotes so we don't fabricate links to
|
|
431
|
+
* GitLab/Bitbucket/etc.
|
|
432
|
+
*/
|
|
433
|
+
function githubPrUrl(remoteUrl, prNumber) {
|
|
434
|
+
if (!remoteUrl || !prNumber)
|
|
435
|
+
return null;
|
|
436
|
+
// git@github.com:owner/repo.git
|
|
437
|
+
let m = remoteUrl.match(/^git@github\.com:([^/]+)\/([^/.]+)(?:\.git)?$/);
|
|
438
|
+
if (!m)
|
|
439
|
+
m = remoteUrl.match(/^https?:\/\/github\.com\/([^/]+)\/([^/.]+?)(?:\.git)?\/?$/);
|
|
440
|
+
if (!m)
|
|
441
|
+
return null;
|
|
442
|
+
return `https://github.com/${m[1]}/${m[2]}/pull/${prNumber}`;
|
|
443
|
+
}
|
|
444
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/indexer/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { DiscoveryMode } from './discovery.js';
|
|
2
|
+
import { Store } from '../db/store.js';
|
|
3
|
+
export interface IndexOptions {
|
|
4
|
+
verbose?: boolean;
|
|
5
|
+
reset?: boolean;
|
|
6
|
+
/**
|
|
7
|
+
* When true, suppress all progress / post-processing chatter to stdout.
|
|
8
|
+
* `verbose` still wins if both are set. Useful for the scale-test runner
|
|
9
|
+
* which prints its own one-line-per-codebase summary.
|
|
10
|
+
*/
|
|
11
|
+
quiet?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Skip files larger than this many bytes. Default is 0 (no cap) — we'd
|
|
14
|
+
* rather index everything than create silent holes in the graph by
|
|
15
|
+
* skipping hand-crafted files just because they're large. The combination
|
|
16
|
+
* of `setTimeoutMicros(10s)` per parse + automatic WASM-runtime reset on
|
|
17
|
+
* failure means a pathological file degrades to "this file is missing"
|
|
18
|
+
* instead of "the indexer crashed."
|
|
19
|
+
*
|
|
20
|
+
* Setting a positive cap is purely an optimization for indexing speed in
|
|
21
|
+
* codebases where you know certain files are huge generated boilerplate
|
|
22
|
+
* (Vulkan headers, protobuf output, etc.) — those usually live in a
|
|
23
|
+
* `thirdparty/` or `Generated/` dir which we already skip by default.
|
|
24
|
+
*/
|
|
25
|
+
maxFileBytes?: number;
|
|
26
|
+
/**
|
|
27
|
+
* Max number of concurrent file reads issued by the async prefetcher.
|
|
28
|
+
* Defaults to 8. Each in-flight read holds an open file descriptor and the
|
|
29
|
+
* file's bytes in memory until the parser consumes it; the byte cap below
|
|
30
|
+
* is the real safety net, this just protects against FD exhaustion.
|
|
31
|
+
*/
|
|
32
|
+
ioConcurrency?: number;
|
|
33
|
+
/**
|
|
34
|
+
* Hard upper bound on total bytes held in the prefetch buffer at any time.
|
|
35
|
+
* Defaults to 64 MiB. If a single file is larger than the cap it is still
|
|
36
|
+
* read (we always allow at least one in-flight read so progress never
|
|
37
|
+
* stalls) — the cap only governs how many *additional* prefetches we may
|
|
38
|
+
* launch while bytes are outstanding.
|
|
39
|
+
*/
|
|
40
|
+
ioPrefetchBytes?: number;
|
|
41
|
+
/**
|
|
42
|
+
* Include vendored directories (`vendor/`, `vendored/`, `thirdparty/`, …)
|
|
43
|
+
* in discovery and indexing. By default these are skipped at discovery
|
|
44
|
+
* time AND tagged as `role='vendor'` if they leak through, so they don't
|
|
45
|
+
* dominate ranking. The flag exists for "I really do want to query into
|
|
46
|
+
* vendored code" workflows.
|
|
47
|
+
*/
|
|
48
|
+
includeVendor?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Include generated files (`*.pb.*`, `*.generated.*`, `*.gen.*`, …) in
|
|
51
|
+
* discovery and indexing. Off by default for the same reason as
|
|
52
|
+
* `includeVendor`.
|
|
53
|
+
*/
|
|
54
|
+
includeGenerated?: boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Discovery aggressiveness. `'full'` indexes everything we can parse
|
|
57
|
+
* (implicitly includes vendor + generated), `'standard'` (default) keeps
|
|
58
|
+
* vendor/generated out by default, and `'fast'` adds docs/examples/static
|
|
59
|
+
* skips on top of standard. See `DiscoveryMode` for the rationale.
|
|
60
|
+
*/
|
|
61
|
+
mode?: DiscoveryMode;
|
|
62
|
+
/**
|
|
63
|
+
* Parse files in a pool of worker_threads instead of inline. Each worker
|
|
64
|
+
* owns its own WASM heap so heavy parsing parallelizes across CPU cores.
|
|
65
|
+
* DB writes still happen on the main thread in the same insertion order
|
|
66
|
+
* as the serial path — symbol IDs stay deterministic.
|
|
67
|
+
*
|
|
68
|
+
* Default: on for normal/large workspaces, serial for tiny workspaces where
|
|
69
|
+
* worker startup/teardown costs more than it saves. Set
|
|
70
|
+
* `SEER_PARALLEL_PARSE=0` or pass `parallel:false` to force the serial
|
|
71
|
+
* fallback. Pass `parallel:true` to force workers even below the tiny-repo
|
|
72
|
+
* threshold (the parity tests do this). Scale parity verified the worker
|
|
73
|
+
* path against representative large repos with row-identical DB output.
|
|
74
|
+
*/
|
|
75
|
+
parallel?: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Worker thread count when `parallel` is on. Defaults to
|
|
78
|
+
* `min(8, max(1, availableParallelism()-1))`.
|
|
79
|
+
*/
|
|
80
|
+
jobs?: number;
|
|
81
|
+
}
|
|
82
|
+
export interface IndexResult {
|
|
83
|
+
filesDiscovered: number;
|
|
84
|
+
filesIndexed: number;
|
|
85
|
+
/**
|
|
86
|
+
* Files whose content hash matched the existing index row — we kept their
|
|
87
|
+
* symbols/edges/imports and skipped reparsing entirely. This is the single
|
|
88
|
+
* biggest win on a re-index: parse cost goes to ~0 for unchanged files.
|
|
89
|
+
*/
|
|
90
|
+
filesReusedFromCache: number;
|
|
91
|
+
filesSkipped: number;
|
|
92
|
+
filesSkippedTooLarge: number;
|
|
93
|
+
filesParseError: number;
|
|
94
|
+
wasmResets: number;
|
|
95
|
+
symbols: number;
|
|
96
|
+
edges: number;
|
|
97
|
+
resolvedEdges: number;
|
|
98
|
+
resolvedImports: number;
|
|
99
|
+
edgeResolution: {
|
|
100
|
+
sameFile: number;
|
|
101
|
+
imported: number;
|
|
102
|
+
global: number;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* True when the post-pass actually recomputed PageRank this run. False when
|
|
106
|
+
* the resolved edge graph was unchanged (every file came from cache, nothing
|
|
107
|
+
* was pruned, no new edge or import resolutions happened) — in that case
|
|
108
|
+
* every stored PageRank value is still correct and we kept it as-is. This
|
|
109
|
+
* is the "Lazy PageRank" optimization; the predicate lives at the bottom of
|
|
110
|
+
* `indexDirectory()`.
|
|
111
|
+
*/
|
|
112
|
+
pagerankRecomputed: boolean;
|
|
113
|
+
/** Routes whose handler symbol id was filled in this run. */
|
|
114
|
+
routesResolved?: number;
|
|
115
|
+
/** Config-key rows whose enclosing symbol id was filled in this run. */
|
|
116
|
+
configKeysResolved?: number;
|
|
117
|
+
/** Tests edges synthesized this run. */
|
|
118
|
+
testEdgesAdded?: number;
|
|
119
|
+
/** External dependency rows in the DB after this run. */
|
|
120
|
+
externalDependencies?: number;
|
|
121
|
+
/** Number of modules in the clustering after this run (0 if not built). */
|
|
122
|
+
modules?: number;
|
|
123
|
+
/** True when module clustering was recomputed this run. */
|
|
124
|
+
modulesRecomputed?: boolean;
|
|
125
|
+
/** Number of new shape hashes computed this run (Track-F SimHash pass). */
|
|
126
|
+
shapeHashesAdded?: number;
|
|
127
|
+
/** v8 Track-G — service_links rows produced by the resolver this run. */
|
|
128
|
+
serviceLinks?: number;
|
|
129
|
+
/** v8 Track-G — service_link counts grouped by match_kind. */
|
|
130
|
+
serviceLinksByKind?: Record<string, number>;
|
|
131
|
+
elapsedMs: number;
|
|
132
|
+
}
|
|
133
|
+
export declare class Indexer {
|
|
134
|
+
private store;
|
|
135
|
+
constructor(store: Store);
|
|
136
|
+
indexDirectory(repoRoot: string, options?: IndexOptions): Promise<IndexResult>;
|
|
137
|
+
/**
|
|
138
|
+
* Post-parse pipeline shared by the serial and parallel branches: prune
|
|
139
|
+
* stale files, resolve imports/edges/routes/config-keys, synthesize test
|
|
140
|
+
* edges, refresh external dependencies, lazily recompute PageRank, and
|
|
141
|
+
* assemble the `IndexResult`.
|
|
142
|
+
*/
|
|
143
|
+
private finishIndex;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/indexer/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiC,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAI9E,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAWvC,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB;;;;;;;;;;;;OAYG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;OAKG;IACH,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAsBD,MAAM,WAAW,WAAW;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF;;;;;;;OAOG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAC5B,6DAA6D;IAC7D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,wCAAwC;IACxC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,2EAA2E;IAC3E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,kBAAkB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAkED,qBAAa,OAAO;IACN,OAAO,CAAC,KAAK;gBAAL,KAAK,EAAE,KAAK;IAE1B,cAAc,CAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC;IAolBvB;;;;;OAKG;YACW,WAAW;CAwO1B"}
|