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,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Track-F SCIP import.
|
|
3
|
+
*
|
|
4
|
+
* Seer accepts SCIP-format precision indexes (https://github.com/sourcegraph/scip)
|
|
5
|
+
* as an ADDITIVE precision uplift over the tree-sitter baseline. A SCIP index
|
|
6
|
+
* carries precise definitions and references produced by a real type-aware
|
|
7
|
+
* indexer (rust-analyzer, scip-typescript, scip-java, etc.). Importing one
|
|
8
|
+
* lets Seer overlay precise edges where tree-sitter's syntactic heuristics
|
|
9
|
+
* were guessing.
|
|
10
|
+
*
|
|
11
|
+
* The import is source-labelled (`provenance = 'scip'`) so consumers can
|
|
12
|
+
* always see which signals came from SCIP vs which were tree-sitter's best
|
|
13
|
+
* effort. Tree-sitter rows are never deleted by a SCIP import; when a SCIP
|
|
14
|
+
* symbol overlaps an existing tree-sitter row at the same file/line/kind, the
|
|
15
|
+
* tree-sitter row is re-labeled `'scip-merge'` (precision confirmed) and
|
|
16
|
+
* SCIP edges target its existing id.
|
|
17
|
+
*
|
|
18
|
+
* Format support:
|
|
19
|
+
* - .scip : binary protobuf (the canonical SCIP format)
|
|
20
|
+
* - .scip.json : Seer's JSON envelope mirroring the protobuf shape. Many
|
|
21
|
+
* SCIP producers can dump JSON directly; the schema is also
|
|
22
|
+
* easy to hand-author for testing and migration scripts.
|
|
23
|
+
*
|
|
24
|
+
* The JSON envelope is the SUBSET of SCIP that Seer actually consumes — we
|
|
25
|
+
* don't carry hover-doc payloads or signature_documentation because Seer
|
|
26
|
+
* doesn't surface them. Adding more fields later is purely additive: a
|
|
27
|
+
* consumer that doesn't recognize a field ignores it.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
export type ScipSymbolKind =
|
|
31
|
+
| 'function' | 'method' | 'constructor' | 'class'
|
|
32
|
+
| 'interface' | 'struct' | 'enum' | 'type' | 'variable';
|
|
33
|
+
|
|
34
|
+
export interface ScipSymbol {
|
|
35
|
+
/**
|
|
36
|
+
* Globally unique SCIP symbol id. Opaque string; the importer never parses
|
|
37
|
+
* it — it's just a primary key for cross-document references.
|
|
38
|
+
*/
|
|
39
|
+
symbolId: string;
|
|
40
|
+
displayName: string;
|
|
41
|
+
/** Optional dotted qualified name (e.g. `auth.AuthService.login`). */
|
|
42
|
+
qualifiedName?: string;
|
|
43
|
+
kind: ScipSymbolKind;
|
|
44
|
+
/** Repo-relative file path. */
|
|
45
|
+
relativePath: string;
|
|
46
|
+
/** 0-indexed source range. */
|
|
47
|
+
range: { startLine: number; startCharacter: number; endLine: number; endCharacter: number };
|
|
48
|
+
signature?: string;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export interface ScipOccurrence {
|
|
52
|
+
/** SCIP symbol id being referenced. */
|
|
53
|
+
symbolId: string;
|
|
54
|
+
relativePath: string;
|
|
55
|
+
range: { startLine: number; startCharacter: number; endLine: number; endCharacter: number };
|
|
56
|
+
/**
|
|
57
|
+
* 'definition' for the canonical defining occurrence (one per symbol),
|
|
58
|
+
* 'reference' for every other use site.
|
|
59
|
+
*/
|
|
60
|
+
role: 'definition' | 'reference';
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface ScipDocument {
|
|
64
|
+
/**
|
|
65
|
+
* Repo-relative path the document covers. Symbol/occurrence rows can also
|
|
66
|
+
* carry their own relativePath, but the doc-level one is the default.
|
|
67
|
+
*/
|
|
68
|
+
relativePath: string;
|
|
69
|
+
symbols: ScipSymbol[];
|
|
70
|
+
occurrences: ScipOccurrence[];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface ScipIndex {
|
|
74
|
+
/** Producer identifier — e.g. `scip-typescript 0.3.5`. */
|
|
75
|
+
tool?: string;
|
|
76
|
+
/** Absolute project root used by the producer (informational). */
|
|
77
|
+
projectRoot?: string;
|
|
78
|
+
/**
|
|
79
|
+
* Documents keyed by repo-relative path. The same shape SCIP uses, just
|
|
80
|
+
* flattened for ergonomic JSON authoring.
|
|
81
|
+
*/
|
|
82
|
+
documents: ScipDocument[];
|
|
83
|
+
}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import crypto from 'crypto';
|
|
4
|
+
import { Store } from '../db/store.js';
|
|
5
|
+
import type { SymbolDef, SymbolKind } from '../types.js';
|
|
6
|
+
import { ScipIndex, ScipDocument, ScipSymbol, ScipOccurrence } from './format.js';
|
|
7
|
+
|
|
8
|
+
export interface ScipImportOptions {
|
|
9
|
+
/** Workspace root — used to resolve SCIP relativePaths to absolute paths. */
|
|
10
|
+
repoRoot: string;
|
|
11
|
+
/** Logger; defaults to no-op. */
|
|
12
|
+
log?: (msg: string) => void;
|
|
13
|
+
/**
|
|
14
|
+
* Skip ALL inserts for files that aren't already indexed by tree-sitter.
|
|
15
|
+
* Default true: SCIP precision is meant to enhance the existing index, not
|
|
16
|
+
* to introduce phantom symbols for files Seer can't see (e.g. a SCIP that
|
|
17
|
+
* covers `vendor/` we deliberately skipped). Set false to widen.
|
|
18
|
+
*/
|
|
19
|
+
requireFileInIndex?: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface ScipImportResult {
|
|
23
|
+
path: string;
|
|
24
|
+
sha256: string;
|
|
25
|
+
tool: string | null;
|
|
26
|
+
documentsProcessed: number;
|
|
27
|
+
symbolsInserted: number;
|
|
28
|
+
symbolsMerged: number;
|
|
29
|
+
edgesInserted: number;
|
|
30
|
+
filesMissing: number;
|
|
31
|
+
elapsedMs: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Import a SCIP index into the Store, layering precise SCIP symbols and
|
|
36
|
+
* references over the existing tree-sitter graph. Tree-sitter rows are never
|
|
37
|
+
* deleted; SCIP symbols with the same file/line/kind/qualified-name as an
|
|
38
|
+
* existing row reuse its id (and the existing row is re-labeled 'scip-merge').
|
|
39
|
+
*
|
|
40
|
+
* The import is idempotent on the (path, sha256) pair: re-importing the exact
|
|
41
|
+
* same file is a no-op. Re-importing the same path with new content clears
|
|
42
|
+
* the SCIP-sourced rows for that path first.
|
|
43
|
+
*/
|
|
44
|
+
export async function importScip(
|
|
45
|
+
scipPath: string, store: Store, options: ScipImportOptions,
|
|
46
|
+
): Promise<ScipImportResult> {
|
|
47
|
+
const start = Date.now();
|
|
48
|
+
const log = options.log ?? (() => { /* */ });
|
|
49
|
+
const abs = path.resolve(scipPath);
|
|
50
|
+
if (!fs.existsSync(abs)) {
|
|
51
|
+
throw new Error(`SCIP index not found: ${abs}`);
|
|
52
|
+
}
|
|
53
|
+
const content = fs.readFileSync(abs);
|
|
54
|
+
const sha = crypto.createHash('sha256').update(content).digest('hex');
|
|
55
|
+
|
|
56
|
+
// Idempotency check — same path + sha = already imported, return a cheap
|
|
57
|
+
// no-op result.
|
|
58
|
+
if (store.hasScipImport(abs, sha)) {
|
|
59
|
+
log(`SCIP ${path.basename(abs)} already imported (sha ${sha.slice(0, 8)}); skipping`);
|
|
60
|
+
return {
|
|
61
|
+
path: abs, sha256: sha, tool: null,
|
|
62
|
+
documentsProcessed: 0, symbolsInserted: 0, symbolsMerged: 0, edgesInserted: 0,
|
|
63
|
+
filesMissing: 0, elapsedMs: Date.now() - start,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Wipe SCIP rows from THIS exact path so re-imports don't accumulate.
|
|
68
|
+
// Other SCIP layers stay untouched — clearScipProvenance(path) is scoped
|
|
69
|
+
// to the path's scip_imports.id.
|
|
70
|
+
store.clearScipProvenance(abs);
|
|
71
|
+
|
|
72
|
+
// Currently we only parse the JSON envelope. Binary .scip support can be
|
|
73
|
+
// added later by piping through a protobuf decoder; the rest of the
|
|
74
|
+
// pipeline below stays unchanged because it works against the parsed
|
|
75
|
+
// ScipIndex shape.
|
|
76
|
+
let scip: ScipIndex;
|
|
77
|
+
try {
|
|
78
|
+
scip = JSON.parse(content.toString('utf-8')) as ScipIndex;
|
|
79
|
+
} catch (err) {
|
|
80
|
+
throw new Error(`Failed to parse SCIP JSON ${abs}: ${(err as Error).message}`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Map repo-relative paths → file_id by matching against the indexer's view.
|
|
84
|
+
const allFiles = store.listFiles();
|
|
85
|
+
const fileByRel = new Map<string, number>();
|
|
86
|
+
for (const f of allFiles) {
|
|
87
|
+
fileByRel.set(normalizePath(f.relPath), f.id);
|
|
88
|
+
}
|
|
89
|
+
const requireFileInIndex = options.requireFileInIndex ?? true;
|
|
90
|
+
|
|
91
|
+
let documentsProcessed = 0;
|
|
92
|
+
let symbolsInserted = 0;
|
|
93
|
+
let symbolsMerged = 0;
|
|
94
|
+
let edgesInserted = 0;
|
|
95
|
+
let filesMissing = 0;
|
|
96
|
+
|
|
97
|
+
// Record the import FIRST so we have an id to link every symbol/edge back
|
|
98
|
+
// to. Counts are zero now and patched up at the end — the row exists from
|
|
99
|
+
// the moment of insertion so scip_import_id foreign keys are always valid.
|
|
100
|
+
const scipImportId = store.recordScipImport(
|
|
101
|
+
abs, sha, scip.tool ?? null, scip.projectRoot ?? options.repoRoot,
|
|
102
|
+
0, 0,
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
// Pass 1: insert SCIP symbols, keep a (scipSymbolId → storeSymbolId) map.
|
|
106
|
+
const idMap = new Map<string, number>();
|
|
107
|
+
// Track per-file definition occurrences so pass 2 can resolve references.
|
|
108
|
+
store.rawDb().exec('BEGIN');
|
|
109
|
+
try {
|
|
110
|
+
for (const doc of scip.documents) {
|
|
111
|
+
const rel = normalizePath(doc.relativePath);
|
|
112
|
+
const fileId = fileByRel.get(rel);
|
|
113
|
+
if (fileId == null) {
|
|
114
|
+
if (requireFileInIndex) {
|
|
115
|
+
filesMissing++;
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
documentsProcessed++;
|
|
120
|
+
|
|
121
|
+
const fid = fileId ?? -1;
|
|
122
|
+
if (fid < 0) continue;
|
|
123
|
+
for (const sym of doc.symbols) {
|
|
124
|
+
const def = scipSymbolToSymbolDef(sym);
|
|
125
|
+
const { id, merged } = store.insertOrMergeScipSymbol(fid, def, scipImportId);
|
|
126
|
+
idMap.set(sym.symbolId, id);
|
|
127
|
+
if (merged) symbolsMerged++;
|
|
128
|
+
else symbolsInserted++;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Pass 2: insert reference edges. We need both ends in the idMap, so any
|
|
133
|
+
// reference whose target wasn't defined in this SCIP doc (cross-package
|
|
134
|
+
// refs) is skipped. For each reference occurrence inside a function/
|
|
135
|
+
// method's range we attribute the edge to that enclosing symbol — same
|
|
136
|
+
// strategy tree-sitter uses for call-edge resolution.
|
|
137
|
+
for (const doc of scip.documents) {
|
|
138
|
+
const rel = normalizePath(doc.relativePath);
|
|
139
|
+
const fileId = fileByRel.get(rel);
|
|
140
|
+
if (fileId == null) continue;
|
|
141
|
+
|
|
142
|
+
// Build a per-file ordered list of (definitionSymbolId, range) so we
|
|
143
|
+
// can attribute references to the smallest enclosing definition.
|
|
144
|
+
const localDefs: Array<{ id: number; symbolId: string; startLine: number; endLine: number }> = [];
|
|
145
|
+
for (const sym of doc.symbols) {
|
|
146
|
+
const storeId = idMap.get(sym.symbolId);
|
|
147
|
+
if (storeId == null) continue;
|
|
148
|
+
localDefs.push({
|
|
149
|
+
id: storeId,
|
|
150
|
+
symbolId: sym.symbolId,
|
|
151
|
+
startLine: sym.range.startLine,
|
|
152
|
+
endLine: sym.range.endLine,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
// Sort by line range size ascending so the smallest enclosing def wins.
|
|
156
|
+
localDefs.sort((a, b) => (a.endLine - a.startLine) - (b.endLine - b.startLine));
|
|
157
|
+
|
|
158
|
+
for (const occ of doc.occurrences) {
|
|
159
|
+
if (occ.role !== 'reference') continue;
|
|
160
|
+
const targetId = idMap.get(occ.symbolId);
|
|
161
|
+
if (targetId == null) continue;
|
|
162
|
+
// Find smallest enclosing local definition.
|
|
163
|
+
let fromId: number | null = null;
|
|
164
|
+
for (const d of localDefs) {
|
|
165
|
+
if (occ.range.startLine >= d.startLine && occ.range.startLine <= d.endLine) {
|
|
166
|
+
fromId = d.id; break;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (fromId == null) continue;
|
|
170
|
+
// Use the displayName of the target symbol so to_name stays consistent
|
|
171
|
+
// with tree-sitter's edge representation.
|
|
172
|
+
const targetSymbol = doc.symbols.find(s => s.symbolId === occ.symbolId);
|
|
173
|
+
const toName = targetSymbol?.displayName ?? occ.symbolId;
|
|
174
|
+
store.insertScipEdge(fromId, targetId, toName, 'call', occ.range.startLine, scipImportId);
|
|
175
|
+
edgesInserted++;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
store.rawDb().exec('COMMIT');
|
|
179
|
+
} catch (err) {
|
|
180
|
+
store.rawDb().exec('ROLLBACK');
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Patch the counts now that we know them — keeps the layer self-describing
|
|
185
|
+
// for the bundle manifest.
|
|
186
|
+
store.recordScipImport(
|
|
187
|
+
abs, sha, scip.tool ?? null, scip.projectRoot ?? options.repoRoot,
|
|
188
|
+
symbolsInserted + symbolsMerged, edgesInserted,
|
|
189
|
+
);
|
|
190
|
+
|
|
191
|
+
log(`SCIP ${path.basename(abs)}: ${documentsProcessed} docs, ${symbolsInserted} new, ${symbolsMerged} merged, ${edgesInserted} edges (${filesMissing} files missing)`);
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
path: abs, sha256: sha, tool: scip.tool ?? null,
|
|
195
|
+
documentsProcessed, symbolsInserted, symbolsMerged, edgesInserted,
|
|
196
|
+
filesMissing, elapsedMs: Date.now() - start,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function scipSymbolToSymbolDef(sym: ScipSymbol): SymbolDef {
|
|
201
|
+
// SCIP doesn't carry symbol_role; assume 'definition'.
|
|
202
|
+
return {
|
|
203
|
+
name: sym.displayName,
|
|
204
|
+
qualifiedName: sym.qualifiedName,
|
|
205
|
+
kind: sym.kind as SymbolKind,
|
|
206
|
+
lineStart: sym.range.startLine,
|
|
207
|
+
lineEnd: sym.range.endLine,
|
|
208
|
+
colStart: sym.range.startCharacter,
|
|
209
|
+
colEnd: sym.range.endCharacter,
|
|
210
|
+
signature: sym.signature,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function normalizePath(p: string): string {
|
|
215
|
+
return p.replace(/\\/g, '/');
|
|
216
|
+
}
|