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,81 @@
|
|
|
1
|
+
# Pre-edit context
|
|
2
|
+
|
|
3
|
+
The single most useful thing Seer does: tell an agent what a change will touch
|
|
4
|
+
*before* it makes it.
|
|
5
|
+
|
|
6
|
+
## The problem
|
|
7
|
+
|
|
8
|
+
An agent asked to "add idempotency to `chargeCard`" usually starts by grepping
|
|
9
|
+
for `chargeCard`, opening the file, grepping for callers, opening those, hunting
|
|
10
|
+
for tests, and maybe checking git blame. That is six to ten tool calls and a lot
|
|
11
|
+
of tokens, and it still misses the transitive dependents and the risk.
|
|
12
|
+
|
|
13
|
+
## One call instead
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
seer_preflight { "symbol": "chargeCard" }
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Trimmed response:
|
|
20
|
+
|
|
21
|
+
```json
|
|
22
|
+
{
|
|
23
|
+
"symbol": {
|
|
24
|
+
"name": "chargeCard",
|
|
25
|
+
"qualifiedName": "billing.PaymentService.chargeCard",
|
|
26
|
+
"file": "src/billing/payment.ts",
|
|
27
|
+
"lineStart": 142,
|
|
28
|
+
"kind": "method"
|
|
29
|
+
},
|
|
30
|
+
"callers": [
|
|
31
|
+
{ "name": "checkout", "file": "src/api/checkout.ts", "line": 88 },
|
|
32
|
+
{ "name": "retryFailedPayment", "file": "src/jobs/retry.ts", "line": 31 }
|
|
33
|
+
],
|
|
34
|
+
"callerCount": 2,
|
|
35
|
+
"transitiveDependents": 9,
|
|
36
|
+
"routeExposure": [
|
|
37
|
+
{ "method": "POST", "path": "/api/checkout", "framework": "express" }
|
|
38
|
+
],
|
|
39
|
+
"tests": [
|
|
40
|
+
{ "name": "charges a valid card", "file": "test/payment.spec.ts", "directness": "direct" }
|
|
41
|
+
],
|
|
42
|
+
"history": [
|
|
43
|
+
{ "sha": "a1b2c3d", "date": "2026-04-18", "summary": "handle declined cards" }
|
|
44
|
+
],
|
|
45
|
+
"risk": {
|
|
46
|
+
"verdict": "high",
|
|
47
|
+
"reasons": ["sits on public route POST /api/checkout", "9 transitive dependents", "cyclomatic 14"]
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Why this matters
|
|
53
|
+
|
|
54
|
+
The agent now knows, in one shot, that `chargeCard`:
|
|
55
|
+
|
|
56
|
+
- is reached from a public checkout endpoint, so a regression is user-facing,
|
|
57
|
+
- has 9 downstream dependents, so the blast radius is wide,
|
|
58
|
+
- has exactly one direct test, so coverage is thin,
|
|
59
|
+
- was last touched to handle declined cards, so that path is load-bearing.
|
|
60
|
+
|
|
61
|
+
That is enough to write the change carefully and add the right test, without a
|
|
62
|
+
scavenger hunt.
|
|
63
|
+
|
|
64
|
+
## Diff mode
|
|
65
|
+
|
|
66
|
+
If you want the blast radius of work already in progress:
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
seer_preflight { "fromRef": "main", "toRef": "HEAD" }
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Seer maps the changed line ranges to the affected symbols and returns the same
|
|
73
|
+
kind of packet for each. See [Change history](change-history.md).
|
|
74
|
+
|
|
75
|
+
## From the CLI
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
seer preflight --symbol chargeCard
|
|
79
|
+
seer preflight --symbol chargeCard --file src/billing/payment.ts # disambiguate
|
|
80
|
+
seer preflight --from main --to HEAD --json
|
|
81
|
+
```
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Service links
|
|
2
|
+
|
|
3
|
+
In a microservice repo (or a set of repos), the interesting bugs live in the
|
|
4
|
+
gaps between services. Seer resolves an outbound network call in one service to
|
|
5
|
+
the concrete route handler that serves it in another, so an agent can follow a
|
|
6
|
+
request across a boundary.
|
|
7
|
+
|
|
8
|
+
## What gets connected
|
|
9
|
+
|
|
10
|
+
Seer scans for client call signatures (fetch, axios, requests, httpx,
|
|
11
|
+
HttpClient, RestTemplate, gRPC, tRPC, GraphQL, and message-queue producers) and
|
|
12
|
+
records them in `service_calls`. After indexing, a resolver normalizes those URLs
|
|
13
|
+
and patterns and matches them against the `routes` it extracted from server
|
|
14
|
+
frameworks, producing `service_links`.
|
|
15
|
+
|
|
16
|
+
## The call
|
|
17
|
+
|
|
18
|
+
```
|
|
19
|
+
seer_service_links { "pathSubstr": "/invoices" }
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Trimmed response:
|
|
23
|
+
|
|
24
|
+
```json
|
|
25
|
+
{
|
|
26
|
+
"links": [
|
|
27
|
+
{
|
|
28
|
+
"protocol": "http",
|
|
29
|
+
"method": "GET",
|
|
30
|
+
"path": "/api/invoices/:id",
|
|
31
|
+
"matchKind": "param",
|
|
32
|
+
"client": {
|
|
33
|
+
"symbol": "shop.getInvoice",
|
|
34
|
+
"file": "services/shop/src/billing.ts",
|
|
35
|
+
"line": 40
|
|
36
|
+
},
|
|
37
|
+
"handler": {
|
|
38
|
+
"symbol": "billing.getInvoice",
|
|
39
|
+
"file": "services/billing/src/routes.ts",
|
|
40
|
+
"line": 77
|
|
41
|
+
},
|
|
42
|
+
"confidence": 0.95
|
|
43
|
+
}
|
|
44
|
+
]
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
The `shop` service calls `GET /api/invoices/<id>`; Seer resolves that to the
|
|
49
|
+
`billing` service's `/api/invoices/:id` handler, even though the client wrote the
|
|
50
|
+
URL with a template literal.
|
|
51
|
+
|
|
52
|
+
## Tracing a chain
|
|
53
|
+
|
|
54
|
+
To follow a request across several hops:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
seer_trace_service_path { "from": "shop.getInvoice", "to": "billing.getInvoice" }
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
or fan out from one entry point:
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
seer_trace_service_dependencies { "from": "shop.checkout", "maxDepth": 3 }
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Crossing repos with external bundles
|
|
67
|
+
|
|
68
|
+
If the services live in separate repos, export a bundle from one and import it
|
|
69
|
+
additively into the other as a read-only layer:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
# in the billing repo
|
|
73
|
+
seer bundle export --out billing.seerbundle
|
|
74
|
+
|
|
75
|
+
# in the shop repo
|
|
76
|
+
seer bundle import billing.seerbundle --external --alias billing
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Now `shop`'s outbound calls resolve against `billing`'s real routes without
|
|
80
|
+
copying any source in. See [bundles in the CLI reference](../cli.md).
|
|
81
|
+
|
|
82
|
+
## From the CLI
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
seer service-calls --protocol http --path /invoices
|
|
86
|
+
seer service-links --match-kind exact
|
|
87
|
+
seer trace-service shop.getInvoice billing.getInvoice
|
|
88
|
+
```
|
package/docs/examples.md
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Examples
|
|
2
|
+
|
|
3
|
+
Real workflows, the way an agent (or you, from the CLI) would actually use Seer.
|
|
4
|
+
Each one links to a fuller walkthrough.
|
|
5
|
+
|
|
6
|
+
The outputs below are illustrative and trimmed for readability. Shapes are real;
|
|
7
|
+
exact numbers depend on your repo.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## Before editing unfamiliar code
|
|
12
|
+
|
|
13
|
+
You are about to change `chargeCard`. Instead of five searches, one call:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
seer_preflight { "symbol": "chargeCard" }
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
You get the definition, who calls it, the tests that cover it, recent commits,
|
|
20
|
+
and a risk verdict in a single packet. Full walkthrough:
|
|
21
|
+
[Pre-edit context](examples/pre-edit-context.md).
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Find the tests that actually exercise a symbol
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
seer_behavior { "symbol": "chargeCard" }
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Ranked by how directly each test hits the symbol, not just filename matching.
|
|
32
|
+
Full walkthrough: [Behavior and tests](examples/behavior-tests.md).
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Follow routes across service boundaries
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
seer_service_links { "pathSubstr": "/invoices" }
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
See which client call in one service resolves to which route handler in another.
|
|
43
|
+
Full walkthrough: [Service links](examples/service-links.md).
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Understand recent changes
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
seer_preflight { "fromRef": "main", "toRef": "HEAD" }
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Maps the diff to the affected symbols and their blast radius, then layers on the
|
|
54
|
+
history for each. Full walkthrough: [Change history](examples/change-history.md).
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Read a giant file cheaply
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
seer_skeleton { "file": "src/server.ts" }
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Returns every signature with bodies collapsed to `{ ... 40 lines ... }`. Add
|
|
65
|
+
`focusSymbol` to expand exactly one body. A 2,000-line file becomes an outline
|
|
66
|
+
you can scan for a few hundred tokens.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Batch several lookups into one round-trip
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
seer_batch { "calls": [
|
|
74
|
+
{ "tool": "seer_definition", "args": { "name": "chargeCard" } },
|
|
75
|
+
{ "tool": "seer_callers", "args": { "symbol": "chargeCard" } },
|
|
76
|
+
{ "tool": "seer_behavior", "args": { "symbol": "chargeCard" } }
|
|
77
|
+
] }
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
One request, three results, failure-isolated.
|
package/docs/faq.md
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# FAQ and positioning
|
|
2
|
+
|
|
3
|
+
## Is Seer just another codebase-graph MCP?
|
|
4
|
+
|
|
5
|
+
There is overlap, but the focus is different. Most graph tools help an agent
|
|
6
|
+
*explore* structure. Seer is built around the moment *before an edit*: it folds
|
|
7
|
+
callers, tests, risk, boundaries, and per-symbol history into one packet so the
|
|
8
|
+
agent understands the impact of a change, not just the shape of the code. The
|
|
9
|
+
headline differentiator is symbol-level git history, not file-level churn.
|
|
10
|
+
|
|
11
|
+
## How is Seer different from codebase-memory?
|
|
12
|
+
|
|
13
|
+
Codebase-memory and similar graph-first tools are great at structural
|
|
14
|
+
exploration. Seer leans into edit-awareness: tests that cover a symbol, the risk
|
|
15
|
+
of touching it, what a diff will break, and how a function changed over time.
|
|
16
|
+
Think of structural exploration as the floor, and edit-impact context as the
|
|
17
|
+
thing Seer adds on top.
|
|
18
|
+
|
|
19
|
+
## How is Seer different from Serena?
|
|
20
|
+
|
|
21
|
+
Serena-style tools focus on editing and refactoring symbols directly. Seer does
|
|
22
|
+
not edit your code. It tells the agent doing the editing what the change is going
|
|
23
|
+
to affect, so the edit is safer. They are complementary.
|
|
24
|
+
|
|
25
|
+
## Does Seer replace Claude, Cursor, or Codex?
|
|
26
|
+
|
|
27
|
+
No. Seer is an MCP server those tools call. It gives the agent better context;
|
|
28
|
+
the agent still does the reasoning and the editing. Seer works with all of them
|
|
29
|
+
at once (see [MCP Setup](mcp.md)).
|
|
30
|
+
|
|
31
|
+
## How is Seer different from grep?
|
|
32
|
+
|
|
33
|
+
Grep matches text. Seer understands structure. "Who calls this method", "which
|
|
34
|
+
tests cover it", "what does this diff break", and "how did this function change"
|
|
35
|
+
are not text queries. They also cost far fewer tokens than the multi-search,
|
|
36
|
+
multi-file-read dance an agent does with grep alone. Use grep for comments,
|
|
37
|
+
string literals, and config values; use Seer for everything structural.
|
|
38
|
+
|
|
39
|
+
## Does anything leave my machine?
|
|
40
|
+
|
|
41
|
+
No. Seer-Core is local and deterministic. No API keys, no network calls, no
|
|
42
|
+
telemetry. The index is a single SQLite file under `.seer/`.
|
|
43
|
+
|
|
44
|
+
## Does it use an LLM?
|
|
45
|
+
|
|
46
|
+
Seer-Core does not. It returns deterministic structural facts. The accuracy and
|
|
47
|
+
token-efficiency benchmarks use LLMs only to *measure* how much Seer helps an
|
|
48
|
+
agent, not inside Seer itself. (A separate Seer-Onboarding layer is the
|
|
49
|
+
LLM-enabled, human-facing product; this repo is Core.)
|
|
50
|
+
|
|
51
|
+
## Which languages are supported?
|
|
52
|
+
|
|
53
|
+
Python, JavaScript, TypeScript/TSX, Go, Java, Rust, C, C++, and C#. See
|
|
54
|
+
[Language Support](languages.md) for the capability matrix.
|
|
55
|
+
|
|
56
|
+
## How big a repo can it handle?
|
|
57
|
+
|
|
58
|
+
It has been run on the Linux kernel and Unreal Engine (millions of symbols, tens
|
|
59
|
+
of millions of edges). See [Benchmarks](benchmarks.md) for measured numbers.
|
|
60
|
+
|
|
61
|
+
## Do I have to commit the `.seer/` folder?
|
|
62
|
+
|
|
63
|
+
No. It rebuilds on demand. Add `.seer/` to `.gitignore` if you prefer. For
|
|
64
|
+
sharing a prebuilt index (for example in CI), use `seer bundle export`.
|
|
65
|
+
|
|
66
|
+
## How do I keep results fresh?
|
|
67
|
+
|
|
68
|
+
You do not have to do anything. A background watcher keeps the index warm, and a
|
|
69
|
+
hash-based freshness check re-parses anything that changed before a query
|
|
70
|
+
returns. If you ever suspect drift, `seer index . --reset` rebuilds clean.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Implementation Notes
|
|
2
|
+
|
|
3
|
+
This is the engineering companion to [Architecture](architecture.md). It covers
|
|
4
|
+
the decisions that are easy to get wrong and that Seer cares about: the stack,
|
|
5
|
+
caching, edge resolution, worker pooling, and the database schema.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Stack
|
|
10
|
+
|
|
11
|
+
| Piece | Choice | Why |
|
|
12
|
+
|---|---|---|
|
|
13
|
+
| Runtime | Node.js 18+ (26+ recommended) | Standard worker threads, fast local startup. |
|
|
14
|
+
| Language | TypeScript, CommonJS output | Type safety for graph code; CommonJS maps cleanly to Node tooling. |
|
|
15
|
+
| Database | built-in `node:sqlite` | Zero native npm dependencies; no compiler traps. |
|
|
16
|
+
| Parser | `web-tree-sitter` (WASM) | Tree-sitter parsing in V8 with no native C++ build. |
|
|
17
|
+
| Grammars | `tree-sitter-wasms` | Pre-compiled grammars, loaded lazily per language. |
|
|
18
|
+
|
|
19
|
+
The "zero native dependency" rule is deliberate. The whole thing installs and
|
|
20
|
+
runs without a compiler toolchain, which is what makes the `npx` install path
|
|
21
|
+
realistic across machines.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Database schema (v10)
|
|
26
|
+
|
|
27
|
+
One file, `<repo>/.seer/graph.db`, with `CURRENT_SCHEMA_VERSION = 10`.
|
|
28
|
+
Migrations are idempotent and run automatically when the database is opened for
|
|
29
|
+
writing, using `ALTER TABLE ADD COLUMN` and `CREATE TABLE IF NOT EXISTS` checks,
|
|
30
|
+
so an old index upgrades in place.
|
|
31
|
+
|
|
32
|
+
```mermaid
|
|
33
|
+
erDiagram
|
|
34
|
+
FILES ||--o{ SYMBOLS : defines
|
|
35
|
+
FILES ||--o{ FILE_IMPORTS : "declares imports"
|
|
36
|
+
SYMBOLS ||--o{ EDGES : "from_id / to_id"
|
|
37
|
+
MODULES ||--o{ MODULE_MEMBERS : clusters
|
|
38
|
+
BOUNDARIES ||--o{ BOUNDARY_MEMBERS : groups
|
|
39
|
+
EXTERNAL_BUNDLES ||--o{ ROUTES : embeds
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Symbols carry a `symbol_role` (`definition`, `declaration`, or `type_ref`) and an
|
|
43
|
+
`is_rankable` flag. Forward declarations and type references are stored but kept
|
|
44
|
+
out of PageRank and hidden from default search, which is what keeps a 3-million-
|
|
45
|
+
node C codebase from drowning in noise.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## Incremental caching and lazy PageRank
|
|
50
|
+
|
|
51
|
+
- **Content hashing.** Every file's SHA-256 is recorded. An unchanged file is
|
|
52
|
+
skipped entirely on re-index. When a file does change, foreign keys cascade
|
|
53
|
+
the old rows out cleanly before the new ones go in.
|
|
54
|
+
- **Lazy PageRank.** PageRank runs only over rankable symbols, and only when the
|
|
55
|
+
graph actually changed. No new files, edges, or deletions means the previous
|
|
56
|
+
vector is reused. On a large repo this turns a multi-second pass into a no-op.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Scope-aware edge resolution
|
|
61
|
+
|
|
62
|
+
Linking a call (`to_name`) to a concrete definition (`to_id`) is a three-pass
|
|
63
|
+
post-index step. Each pass only fills links still NULL, so the narrowest scope
|
|
64
|
+
wins:
|
|
65
|
+
|
|
66
|
+
1. **Same-file.** The callee is defined in the caller's own file.
|
|
67
|
+
2. **Imported-file.** Follow the caller's resolved imports and match there.
|
|
68
|
+
3. **Global fallback.** Bind to a global definition of that name, used only when
|
|
69
|
+
scope cannot decide.
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## Parser worker pooling
|
|
74
|
+
|
|
75
|
+
`web-tree-sitter` shares a single V8 isolate, which blocks normal Promise
|
|
76
|
+
concurrency. So parsing runs in a pool of native worker threads, each with its
|
|
77
|
+
own WASM heap and parser context. The main thread keeps all SQLite writes serial
|
|
78
|
+
and in input order, which keeps `AUTOINCREMENT` IDs deterministic across runs.
|
|
79
|
+
JIT freshness syncs stay serial on purpose, because spinning up workers for a
|
|
80
|
+
two-file edit is slower than just doing it.
|
|
81
|
+
|
|
82
|
+
A query-assisted walker compiles each extractor's declared candidate node types
|
|
83
|
+
into a Tree-sitter query once, then only runs extractor callbacks on captured
|
|
84
|
+
nodes. Set `SEER_USE_CANDIDATE_QUERY=0` to force the plain walker.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## Monorepo boundaries
|
|
89
|
+
|
|
90
|
+
Boundaries come from package manifests (`package.json`, `go.mod`, `Cargo.toml`)
|
|
91
|
+
or fallback paths like `packages/*` and `services/*`. When a call edge starts in
|
|
92
|
+
boundary A and resolves into boundary B, that crossing is recorded and surfaced
|
|
93
|
+
in the `boundaryCrossings` part of a risk profile.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Rename and move continuity
|
|
98
|
+
|
|
99
|
+
For per-symbol history that survives refactoring, Seer compares a 64-bit SimHash
|
|
100
|
+
over identifier-folded AST subtrees, plus Hamming distance and scope similarity.
|
|
101
|
+
Common shapes (think standard getters) with several matches are capped at low
|
|
102
|
+
confidence and require a name or scope match, so it does not invent links. This
|
|
103
|
+
is snapshot evidence; true cross-commit lineage is delivered by `seer history`
|
|
104
|
+
(git follow plus line overlap).
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Language Support
|
|
2
|
+
|
|
3
|
+
Seer parses with Tree-sitter, so adding depth to a language is mostly about
|
|
4
|
+
writing a good extractor, not wrestling a parser. Nine languages ship today.
|
|
5
|
+
|
|
6
|
+
## Supported languages
|
|
7
|
+
|
|
8
|
+
| Language | Symbols + calls | Imports | Routes | Service calls | Config reads |
|
|
9
|
+
|---|:---:|:---:|:---:|:---:|:---:|
|
|
10
|
+
| Python | yes | yes | FastAPI, Flask | requests, httpx | `os.getenv` |
|
|
11
|
+
| JavaScript | yes | yes | Express, Fastify | fetch, axios | `process.env` |
|
|
12
|
+
| TypeScript / TSX | yes | yes | Express, Fastify, tRPC, GraphQL | fetch, axios | `process.env` |
|
|
13
|
+
| Go | yes | yes | (via gRPC `.proto`) | gRPC, net/http clients | `os.Getenv` |
|
|
14
|
+
| Java | yes | yes | Spring Boot | gRPC, RestTemplate, HttpClient | `System.getenv` |
|
|
15
|
+
| Rust | yes | yes | no | reqwest-style clients | env reads |
|
|
16
|
+
| C | yes | yes | no | no | no |
|
|
17
|
+
| C++ | yes | yes | no | no | no |
|
|
18
|
+
| C# | yes | yes | no | gRPC, HttpClient | env reads |
|
|
19
|
+
|
|
20
|
+
"Routes" means server-side endpoint extraction. gRPC routes come from `.proto`
|
|
21
|
+
files regardless of the implementing language. A language without HTTP route
|
|
22
|
+
extraction can still be a *client* in a service link; it just cannot be the HTTP
|
|
23
|
+
*target*. See [Known Limits](limits.md) for the precise boundary.
|
|
24
|
+
|
|
25
|
+
Every language gets the structural core: definitions with qualified names, call
|
|
26
|
+
edges, imports, complexity metrics, and shape hashes. The columns above are the
|
|
27
|
+
extras layered on top.
|
|
28
|
+
|
|
29
|
+
## Notable per-language handling
|
|
30
|
+
|
|
31
|
+
- **C / C++** use syntactic body gating: a `struct device *dev` reference does
|
|
32
|
+
not create a phantom `device` symbol. Out-of-line method definitions
|
|
33
|
+
(`T Vec<T>::dot(...)`) reconstruct the owning class scope, so they qualify as
|
|
34
|
+
`Vec.dot`, not a free function.
|
|
35
|
+
- **TypeScript** maps the TSX grammar for React components and preserves path
|
|
36
|
+
parameters in template-literal URLs so cross-service links resolve.
|
|
37
|
+
- **Java** Spring controllers inherit class-level path prefixes.
|
|
38
|
+
- **C#** tracks constructor and member calls.
|
|
39
|
+
|
|
40
|
+
## Adding a language (for contributors)
|
|
41
|
+
|
|
42
|
+
Adding a language is mostly about writing a good extractor; Tree-sitter does the
|
|
43
|
+
parsing. The shape of the work:
|
|
44
|
+
|
|
45
|
+
1. **Register the grammar.** Map the file extensions and load the Tree-sitter
|
|
46
|
+
WASM grammar in the parser context.
|
|
47
|
+
2. **Write the extractor** in `src/parser/languages/<lang>.ts`. It walks the AST
|
|
48
|
+
and returns definitions (with short names), the names a node calls or
|
|
49
|
+
references, and imports. Declare its `candidateNodeTypes` so the walker only
|
|
50
|
+
runs your callbacks on the node types you care about, which keeps big repos
|
|
51
|
+
fast.
|
|
52
|
+
3. **Get qualified names right.** Return short names and, when a definition has
|
|
53
|
+
an owning scope (a class, a namespace, an out-of-line method), set the
|
|
54
|
+
`scopePath` hint and let the walker fold it into the qualified name. Do not
|
|
55
|
+
hand-build qualified names in the extractor.
|
|
56
|
+
4. **Layer on the optional signals** if the language has them: routes, config or
|
|
57
|
+
env reads, and outbound service calls.
|
|
58
|
+
5. **Add a smoke fixture** under `tests/fixtures/` and assertions in
|
|
59
|
+
`tests/smoke.ts`, so the new language is covered and stays covered.
|
|
60
|
+
|
|
61
|
+
The best starting point is an existing extractor close to your target:
|
|
62
|
+
`go.ts` for a C-family procedural language, `typescript.ts` for something with
|
|
63
|
+
rich imports and routes, `cpp.ts` for the gnarly cases (out-of-line methods,
|
|
64
|
+
body gating). The core pieces to read first are `src/types.ts`,
|
|
65
|
+
`src/parser/walker.ts`, and `src/parser/parserContext.ts`.
|
|
66
|
+
|
|
67
|
+
The watch-outs that tend to bite: emit type references and forward declarations
|
|
68
|
+
with the right `symbol_role` so they do not pollute search or PageRank; keep the
|
|
69
|
+
extractor pure and deterministic; and make sure cached re-indexing produces the
|
|
70
|
+
exact same rows (the scale and parity tests will catch you if it does not).
|
package/docs/limits.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Known Limits
|
|
2
|
+
|
|
3
|
+
Seer is honest about what it does not do. Knowing these keeps an agent from
|
|
4
|
+
trusting a signal further than it should.
|
|
5
|
+
|
|
6
|
+
## HTTP route extraction is framework-limited
|
|
7
|
+
|
|
8
|
+
Server-side routes are extracted for Java (Spring), Python (FastAPI, Flask), and
|
|
9
|
+
TypeScript/JavaScript (Express, Fastify, tRPC, GraphQL). Go `net/http`/gin/chi,
|
|
10
|
+
Rust axum/actix, C# ASP.NET, and C++ have no HTTP route extraction. Those
|
|
11
|
+
backends can still be a *client* in a service link, and they can be a *target*
|
|
12
|
+
over gRPC (routes come from `.proto` files), but not an HTTP target. See
|
|
13
|
+
[Language Support](languages.md).
|
|
14
|
+
|
|
15
|
+
## Continuity is a snapshot matcher, not a time machine
|
|
16
|
+
|
|
17
|
+
`seer_continuity` links a rename or move only when both identities exist in the
|
|
18
|
+
current working tree (for example a kept alias). A true cross-commit rename,
|
|
19
|
+
where the old symbol is gone, yields no continuity candidate, on purpose, because
|
|
20
|
+
inventing one would be a false positive. Cross-commit lineage is delivered by
|
|
21
|
+
`seer_history` instead, which follows the file through git. So the "trace
|
|
22
|
+
refactoring across renames" promise is real; it is just fulfilled by history,
|
|
23
|
+
with continuity as advisory snapshot evidence.
|
|
24
|
+
|
|
25
|
+
## Edge resolution is heuristic, not a compiler
|
|
26
|
+
|
|
27
|
+
The three-pass resolver (same-file, imported-file, global fallback) is fast and
|
|
28
|
+
language-agnostic, but it is not type-aware. On heavily overloaded or
|
|
29
|
+
dynamically dispatched code, the global fallback can bind to a plausible
|
|
30
|
+
same-name target rather than the exact one. For compiler-grade precision on a
|
|
31
|
+
specific language, layer in a SCIP index with `seer scip-import`; those edges are
|
|
32
|
+
labeled by provenance and sit on top of the tree-sitter baseline.
|
|
33
|
+
|
|
34
|
+
## It indexes what is on disk
|
|
35
|
+
|
|
36
|
+
Seer parses source files. Code generated at build time, behavior injected by
|
|
37
|
+
reflection or runtime DI, and routes registered dynamically at startup are
|
|
38
|
+
invisible until they exist as files. `--include-generated` pulls in generated
|
|
39
|
+
files if you want them.
|
|
40
|
+
|
|
41
|
+
## Resolution percentage is not coverage
|
|
42
|
+
|
|
43
|
+
The "resolved edges" percentage in `seer stats` reflects how many call edges
|
|
44
|
+
were bound to a definition, which is naturally lower in repos that lean on
|
|
45
|
+
external libraries (those targets are not in the index). It is a health signal,
|
|
46
|
+
not a quality grade.
|
|
47
|
+
|
|
48
|
+
## Deterministic, not semantic
|
|
49
|
+
|
|
50
|
+
Seer returns facts, not understanding. It will tell you a function has 9
|
|
51
|
+
dependents and sits on a public route; it will not tell you whether your change
|
|
52
|
+
is correct. That judgment stays with the agent and with you.
|