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,105 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
Seer turns a directory of source files into a small SQLite graph that an agent
|
|
4
|
+
can query in milliseconds. This page is the high-level tour. For the lower-level
|
|
5
|
+
decisions (caching, edge resolution, worker pooling), see
|
|
6
|
+
[Implementation Notes](internals.md).
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## The pipeline
|
|
11
|
+
|
|
12
|
+
```mermaid
|
|
13
|
+
flowchart TD
|
|
14
|
+
A[Workspace files] -->|.gitignore + .seerignore| B[Discovery]
|
|
15
|
+
B -->|worker thread pool| C[Tree-sitter parsing WASM]
|
|
16
|
+
C --> D[Language extractors]
|
|
17
|
+
D -->|symbols, calls, routes, config, hashes| E[(SQLite store, schema v10)]
|
|
18
|
+
E --> F[Post-pass resolution]
|
|
19
|
+
F --> G[Service-link resolver]
|
|
20
|
+
G --> H[Louvain clustering]
|
|
21
|
+
H --> I[CLI / MCP server]
|
|
22
|
+
I -->|JIT freshness check| J[AI agent]
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
1. **Discovery.** A fast directory walker respects layered `.gitignore` and
|
|
26
|
+
`.seerignore` rules and classifies each file as `project`, `test`,
|
|
27
|
+
`generated`, or `vendor`. Low-value files are dropped before they ever reach
|
|
28
|
+
a parser.
|
|
29
|
+
2. **Parsing.** Files are parsed with Tree-sitter compiled to WASM, spread
|
|
30
|
+
across a pool of worker threads so a large repo is not bottlenecked on one V8
|
|
31
|
+
isolate.
|
|
32
|
+
3. **Extraction.** Per-language extractors walk the AST and emit symbols
|
|
33
|
+
(with qualified names), call edges, routes, config reads, complexity metrics,
|
|
34
|
+
and structural shape hashes.
|
|
35
|
+
4. **Storage.** Everything lands in one SQLite file, `<repo>/.seer/graph.db`,
|
|
36
|
+
under schema version 10. Writes are idempotent and incremental.
|
|
37
|
+
5. **Resolution.** A post-pass links each call to the exact symbol it targets,
|
|
38
|
+
using a three-pass scope-aware strategy (same-file, then imported-file, then
|
|
39
|
+
global fallback).
|
|
40
|
+
6. **Derived signals.** Service links, Louvain modules, shape hashes, and symbol
|
|
41
|
+
history are computed on top of the base graph (some during indexing, some
|
|
42
|
+
lazily on first query).
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## What gets stored
|
|
47
|
+
|
|
48
|
+
| Table | Holds |
|
|
49
|
+
|---|---|
|
|
50
|
+
| `files` | paths, hashes, language, role classification |
|
|
51
|
+
| `symbols` | definitions with short + qualified names, roles, `is_rankable` |
|
|
52
|
+
| `edges` | resolved caller/callee and import relationships |
|
|
53
|
+
| `routes` | HTTP / tRPC / GraphQL / gRPC / message-queue handlers |
|
|
54
|
+
| `service_calls` / `service_links` | outbound calls resolved to routes |
|
|
55
|
+
| `modules` / `boundaries` | Louvain clusters and monorepo partitions |
|
|
56
|
+
| `config_keys` | env/config reads mapped to their enclosing symbol |
|
|
57
|
+
| `external_dependencies` | packages declared in manifests |
|
|
58
|
+
| `external_bundles` | read-only layers imported from other repos |
|
|
59
|
+
| `symbol_history_continuity` | resolved rename/move lineage |
|
|
60
|
+
|
|
61
|
+
The full schema and table relationships are in [internals.md](internals.md).
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Three derived signals worth knowing
|
|
66
|
+
|
|
67
|
+
These are where Seer goes beyond "structured grep".
|
|
68
|
+
|
|
69
|
+
### Louvain modules
|
|
70
|
+
Seer builds a weighted file graph (import edges weigh 2, call edges 1, test
|
|
71
|
+
edges 3) and runs Louvain community detection. The result is a set of cohesive
|
|
72
|
+
modules, so an agent can find the "auth" or "billing" subsystem before scanning
|
|
73
|
+
directories.
|
|
74
|
+
|
|
75
|
+
### Tests as behavioral specs
|
|
76
|
+
Rather than a flat list of test files, `seer_behavior` ranks the tests that
|
|
77
|
+
exercise a symbol by how directly they hit it: direct calls first, then naming
|
|
78
|
+
conventions, then call-graph distance, then assertion density and recency.
|
|
79
|
+
|
|
80
|
+
### Decomposed edit-risk
|
|
81
|
+
`seer_risk` does not hand back a mystery number. It shows the components: caller
|
|
82
|
+
fan-in, public route exposure, missing test coverage, monorepo boundary
|
|
83
|
+
crossings, and complexity plus churn. The agent can see *why* a change is risky.
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## Freshness
|
|
88
|
+
|
|
89
|
+
Correctness is a product requirement. If an agent edits a file, the next query
|
|
90
|
+
must reflect it.
|
|
91
|
+
|
|
92
|
+
- A **Chokidar watcher** keeps the index warm in the background, debouncing
|
|
93
|
+
bursts of writes.
|
|
94
|
+
- A **JIT freshness check** runs an instant hash comparison before any query
|
|
95
|
+
returns. Anything that changed is re-parsed serially right then, so results
|
|
96
|
+
are never stale, and concurrent reads are never blocked.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Two product layers
|
|
101
|
+
|
|
102
|
+
Seer-Core (this repository) is the deterministic, local, zero-AI engine
|
|
103
|
+
described above. A separate Seer-Onboarding layer is designed to sit on top and
|
|
104
|
+
translate these facts into human-facing visual walkthroughs. Everything in this
|
|
105
|
+
repo is Core.
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# Benchmark Methodology
|
|
2
|
+
|
|
3
|
+
There are two very different kinds of claim in this project, and they need two
|
|
4
|
+
very different kinds of evidence.
|
|
5
|
+
|
|
6
|
+
- **Speed** is deterministic. It does not involve an LLM, so we can measure it
|
|
7
|
+
directly and reproducibly, and we do.
|
|
8
|
+
- **Accuracy** and **token usage** are about how much Seer helps an *agent*.
|
|
9
|
+
That necessarily involves an LLM, so the numbers come from running real models
|
|
10
|
+
on a fixed task suite. Those measurements are in progress; this page describes
|
|
11
|
+
exactly how they are run so the results are honest and reproducible.
|
|
12
|
+
|
|
13
|
+
Accuracy and token-usage measurements use: **GPT-5.5, Claude Opus 4.8, Gemini
|
|
14
|
+
3.5 Flash (High), and Gemini 3.1 Pro.**
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Speed (deterministic)
|
|
19
|
+
|
|
20
|
+
Speed comes straight from `npm run scale-test`, which indexes each repo twice
|
|
21
|
+
(a cold fresh pass and a warm cached pass) and records:
|
|
22
|
+
|
|
23
|
+
- **Fresh time** and **ms/file** for the cold index.
|
|
24
|
+
- **Cached time** and the **cache speedup** for the warm re-index.
|
|
25
|
+
- **Symbols**, **edges**, **resolution rate**, and **database size**.
|
|
26
|
+
|
|
27
|
+
The same run also asserts determinism: the cached pass must reproduce the fresh
|
|
28
|
+
pass's counts exactly, and a separate parity gate proves the parallel and serial
|
|
29
|
+
indexers agree row-for-row. So the speed numbers are taken from runs that also
|
|
30
|
+
prove correctness, not from a separate "fast but maybe wrong" path.
|
|
31
|
+
|
|
32
|
+
To reproduce on your machine:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm run scale-test # all repos under Large Codebases/
|
|
36
|
+
npm run scale-test -- --only helix,react # a subset
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Hardware and Node version are recorded in `tests/outputs/latest.md`. Numbers
|
|
40
|
+
vary with disk and CPU; the shape (linear-ish ms/file, large cache speedup) is
|
|
41
|
+
what to compare.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Accuracy and token usage (model-in-the-loop)
|
|
46
|
+
|
|
47
|
+
This is the part that proves the actual pitch: that an agent with Seer answers
|
|
48
|
+
more correctly while spending fewer tokens and fewer round-trips than the same
|
|
49
|
+
agent armed only with grep and file reads.
|
|
50
|
+
|
|
51
|
+
### The design
|
|
52
|
+
|
|
53
|
+
It is an A/B test where the only thing that changes is whether Seer is
|
|
54
|
+
available.
|
|
55
|
+
|
|
56
|
+
- **Condition A (baseline):** the agent has its normal file-read, grep/search,
|
|
57
|
+
and shell tools. No Seer.
|
|
58
|
+
- **Condition B (Seer):** the same agent, same harness, same task, plus the Seer
|
|
59
|
+
MCP tools.
|
|
60
|
+
|
|
61
|
+
Everything else (model, temperature, system prompt, repo, task wording) is held
|
|
62
|
+
constant. Each task is run several times per model, because models are
|
|
63
|
+
stochastic, and we report the mean and the spread rather than a single lucky
|
|
64
|
+
run.
|
|
65
|
+
|
|
66
|
+
### The task suite
|
|
67
|
+
|
|
68
|
+
A fixed set of repo tasks with deterministic ground truth, for example:
|
|
69
|
+
|
|
70
|
+
- "List every caller of function X." (ground truth: the resolved caller set)
|
|
71
|
+
- "Which tests exercise Y?" (ground truth: the tests that actually call it)
|
|
72
|
+
- "If I change the signature of Z, what breaks?" (ground truth: the transitive
|
|
73
|
+
dependents and the routes/contracts affected)
|
|
74
|
+
- "Where is the handler for `POST /api/checkout`?" (ground truth: the route)
|
|
75
|
+
- "How did this function change over the last N commits?" (ground truth: git)
|
|
76
|
+
|
|
77
|
+
The tasks live alongside the repos so anyone can rerun them. Each task ships with
|
|
78
|
+
its verified answer.
|
|
79
|
+
|
|
80
|
+
### Establishing ground truth honestly
|
|
81
|
+
|
|
82
|
+
This is the part people get wrong. **Do not let Seer grade its own homework.**
|
|
83
|
+
Ground truth is established independently of Seer:
|
|
84
|
+
|
|
85
|
+
- caller and dependent sets are verified by hand and cross-checked with a
|
|
86
|
+
compiler/LSP or a language-server where one exists,
|
|
87
|
+
- "which tests cover this" is verified by actually running the tests and seeing
|
|
88
|
+
what executes the symbol,
|
|
89
|
+
- route and history answers are checked against the framework config and git
|
|
90
|
+
directly.
|
|
91
|
+
|
|
92
|
+
Only after the answer key exists independently do we score the agent runs
|
|
93
|
+
against it.
|
|
94
|
+
|
|
95
|
+
### What gets measured
|
|
96
|
+
|
|
97
|
+
For each task, condition, and model:
|
|
98
|
+
|
|
99
|
+
| Metric | Definition |
|
|
100
|
+
|---|---|
|
|
101
|
+
| **Correctness** | Did the final answer match ground truth? For set answers, precision and recall of the items found. |
|
|
102
|
+
| **Tokens** | Total input + output tokens across every tool round-trip to reach the answer. |
|
|
103
|
+
| **Round-trips** | Number of tool calls the agent made. |
|
|
104
|
+
| **Wall time** | End-to-end time to a final answer. |
|
|
105
|
+
|
|
106
|
+
The headline numbers are the **deltas**: accuracy gain, token reduction, and
|
|
107
|
+
round-trip reduction of Condition B over Condition A, averaged across tasks and
|
|
108
|
+
models.
|
|
109
|
+
|
|
110
|
+
### Reporting rules (so it stays honest)
|
|
111
|
+
|
|
112
|
+
- Report every task, not a cherry-picked subset. Include the cases where the
|
|
113
|
+
baseline ties or wins (small repos and trivial lookups, where grep is already
|
|
114
|
+
fine). Showing where Seer does *not* help is what makes the cases where it
|
|
115
|
+
does believable.
|
|
116
|
+
- Report variance, not just means.
|
|
117
|
+
- Keep the harness, prompts, and task suite public so the run is reproducible.
|
|
118
|
+
- Separate "got it right" from "got it cheaply." A tool that is right but
|
|
119
|
+
expensive, or cheap but wrong, is not the claim.
|
|
120
|
+
|
|
121
|
+
### Why this is favorable to Seer without fudging
|
|
122
|
+
|
|
123
|
+
The pitch is structural: an agent without Seer reaches a caller set or a blast
|
|
124
|
+
radius by issuing many searches and reading many files, which costs tokens and
|
|
125
|
+
round-trips and still misses transitive and cross-file relationships. Seer
|
|
126
|
+
returns those as one deterministic fact. So on the tasks that are about
|
|
127
|
+
structure and impact, fewer round-trips and higher recall are the expected,
|
|
128
|
+
honest outcome. On tasks that are not about structure, it should be a wash, and
|
|
129
|
+
the report should say so.
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
See [raw-results.md](raw-results.md) for the measured speed numbers and the
|
|
134
|
+
accuracy/token tables (filled in as the model runs complete).
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Raw Results
|
|
2
|
+
|
|
3
|
+
Full numbers behind the [benchmark summary](../benchmarks.md). Speed is measured
|
|
4
|
+
and reproducible. Accuracy and token usage are model-in-the-loop and are filled
|
|
5
|
+
in as those runs complete; see [methodology](methodology.md).
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Speed
|
|
10
|
+
|
|
11
|
+
Generated by `npm run scale-test`. Each repo is indexed cold (fresh) and then
|
|
12
|
+
warm (cached); the cached pass must reproduce the fresh pass's counts exactly,
|
|
13
|
+
so these timings come from runs that also prove determinism.
|
|
14
|
+
|
|
15
|
+
- Node: v26.1.0
|
|
16
|
+
- Platform: win32
|
|
17
|
+
- Codebase-Memory is excluded from the benchmark set on purpose (it is a
|
|
18
|
+
self-validation fixture, not a public comparison repo).
|
|
19
|
+
|
|
20
|
+
<!-- speed-table-begin -->
|
|
21
|
+
| Codebase | Language(s) | Files | Symbols | Edges | Resolved | Fresh index | ms/file | Cached re-index | Cache speedup | DB size |
|
|
22
|
+
|---|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|
|
|
23
|
+
| helix | Rust | (pending) | | | | | | | | |
|
|
24
|
+
| client-go | Go | (pending) | | | | | | | | |
|
|
25
|
+
| react | TS/JS | (pending) | | | | | | | | |
|
|
26
|
+
| godot | C++/C#/Java | (pending) | | | | | | | | |
|
|
27
|
+
| TypeScript | TS | (pending) | | | | | | | | |
|
|
28
|
+
| linux | C/C++ | (pending) | | | | | | | | |
|
|
29
|
+
| Unreal Engine | C++ | (pending) | | | | | | | | |
|
|
30
|
+
<!-- speed-table-end -->
|
|
31
|
+
|
|
32
|
+
Notes:
|
|
33
|
+
|
|
34
|
+
- **Fresh** is a cold index from an empty database. **Cached** re-runs the same
|
|
35
|
+
index with every file unchanged, so almost all work is skipped.
|
|
36
|
+
- **Resolved** is the share of call edges bound to a concrete definition. It is
|
|
37
|
+
naturally lower in repos that lean heavily on external libraries, whose targets
|
|
38
|
+
are not in the index. It is a health signal, not a quality grade.
|
|
39
|
+
- DB size is the on-disk SQLite file.
|
|
40
|
+
|
|
41
|
+
Reproduce:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
npm run scale-test # all repos under Large Codebases/
|
|
45
|
+
npm run scale-test -- --skip cbm # the public benchmark set used here
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Accuracy (model-in-the-loop)
|
|
51
|
+
|
|
52
|
+
A/B over a fixed task suite, scored against deterministic ground truth. Models:
|
|
53
|
+
GPT-5.5, Claude Opus 4.8, Gemini 3.5 Flash (High), Gemini 3.1 Pro. See
|
|
54
|
+
[methodology](methodology.md) for the protocol and the honesty rules.
|
|
55
|
+
|
|
56
|
+
<!-- accuracy-raw-begin -->
|
|
57
|
+
_Runs in progress. Each cell will report mean correctness (and precision/recall
|
|
58
|
+
for set answers) over N trials per model, baseline vs Seer._
|
|
59
|
+
<!-- accuracy-raw-end -->
|
|
60
|
+
|
|
61
|
+
---
|
|
62
|
+
|
|
63
|
+
## Token usage (model-in-the-loop)
|
|
64
|
+
|
|
65
|
+
Same suite and design; metric is total tokens and tool round-trips to a correct
|
|
66
|
+
answer.
|
|
67
|
+
|
|
68
|
+
<!-- token-raw-begin -->
|
|
69
|
+
_Runs in progress. Each cell will report mean tokens and round-trips over N
|
|
70
|
+
trials per model, baseline vs Seer, plus the reduction._
|
|
71
|
+
<!-- token-raw-end -->
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Benchmarks
|
|
2
|
+
|
|
3
|
+
## Summary
|
|
4
|
+
|
|
5
|
+
Seer makes three claims. One is deterministic and measured here. Two depend on a
|
|
6
|
+
model in the loop and are being measured now.
|
|
7
|
+
|
|
8
|
+
- **Speed.** Indexing is fast and the cache is near-instant. Measured directly,
|
|
9
|
+
reproducibly, on eight real open-source repos up to the size of the Linux
|
|
10
|
+
kernel and Unreal Engine. Numbers below.
|
|
11
|
+
- **Accuracy.** An agent with Seer answers structural and impact questions more
|
|
12
|
+
correctly than the same agent with only grep. In progress.
|
|
13
|
+
- **Token usage.** That same agent gets there with fewer tokens and fewer tool
|
|
14
|
+
round-trips. In progress.
|
|
15
|
+
|
|
16
|
+
Accuracy and token-usage numbers are measured with **GPT-5.5, Claude Opus 4.8,
|
|
17
|
+
Gemini 3.5 Flash (High), and Gemini 3.1 Pro**. See
|
|
18
|
+
[methodology](benchmarks/methodology.md) for exactly how, and
|
|
19
|
+
[raw-results](benchmarks/raw-results.md) for the full tables.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## Speed (measured)
|
|
24
|
+
|
|
25
|
+
Indexing throughput and cache speedup across the large-codebase suite. See
|
|
26
|
+
[raw-results](benchmarks/raw-results.md) for the full table, hardware, and the
|
|
27
|
+
determinism guarantees that ride along with these runs.
|
|
28
|
+
|
|
29
|
+
<!-- speed-summary: populated from a single clean `npm run scale-test` -->
|
|
30
|
+
|
|
31
|
+
The shape that matters: indexing scales roughly linearly in files, and a warm
|
|
32
|
+
re-index is one to two orders of magnitude faster than a cold one because
|
|
33
|
+
unchanged files are skipped entirely. Query latency against the finished index
|
|
34
|
+
is SQLite-fast (low single-digit milliseconds for typical lookups), which is why
|
|
35
|
+
an agent can afford to ask Seer many small questions.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Accuracy (in progress)
|
|
40
|
+
|
|
41
|
+
For a fixed suite of repo tasks with deterministic ground truth, we run each
|
|
42
|
+
model twice: once with only its normal tools, once with Seer added, and score
|
|
43
|
+
the final answer against the answer key.
|
|
44
|
+
|
|
45
|
+
<!-- accuracy-table: filled in as model runs complete -->
|
|
46
|
+
|
|
47
|
+
| Task family | Baseline (grep only) | With Seer | Models |
|
|
48
|
+
|---|---|---|---|
|
|
49
|
+
| Caller / dependent sets | (pending) | (pending) | GPT-5.5, Opus 4.8, Gemini 3.5 Flash (High), Gemini 3.1 Pro |
|
|
50
|
+
| Test coverage of a symbol | (pending) | (pending) | " |
|
|
51
|
+
| Change blast radius | (pending) | (pending) | " |
|
|
52
|
+
| Route / handler lookup | (pending) | (pending) | " |
|
|
53
|
+
| Symbol history | (pending) | (pending) | " |
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Token usage (in progress)
|
|
58
|
+
|
|
59
|
+
Same task suite, same A/B design. The metric is total tokens and tool
|
|
60
|
+
round-trips to reach a correct answer.
|
|
61
|
+
|
|
62
|
+
<!-- token-table: filled in as model runs complete -->
|
|
63
|
+
|
|
64
|
+
| Task family | Baseline tokens | With Seer | Reduction | Round-trips (base / Seer) |
|
|
65
|
+
|---|---|---|---|---|
|
|
66
|
+
| Caller / dependent sets | (pending) | (pending) | (pending) | (pending) |
|
|
67
|
+
| Test coverage of a symbol | (pending) | (pending) | (pending) | (pending) |
|
|
68
|
+
| Change blast radius | (pending) | (pending) | (pending) | (pending) |
|
|
69
|
+
| Route / handler lookup | (pending) | (pending) | (pending) | (pending) |
|
|
70
|
+
| Symbol history | (pending) | (pending) | (pending) | (pending) |
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
→ [Methodology](benchmarks/methodology.md) · [Raw results](benchmarks/raw-results.md)
|
package/docs/cli.md
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# CLI Reference
|
|
2
|
+
|
|
3
|
+
Every Seer capability is available from a plain shell, not just over MCP. This
|
|
4
|
+
is useful for scripting, CI, and just looking around a repo yourself. All query
|
|
5
|
+
commands auto-detect `.seer/graph.db` by walking up from the current directory;
|
|
6
|
+
pass `--db <path>` to point at a saved index.
|
|
7
|
+
|
|
8
|
+
Run `seer --help`, or `seer <command> --help`, for the full flag list of any
|
|
9
|
+
command.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Setup
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
seer init [workspace] # wire Seer into your agents (see docs/mcp.md)
|
|
17
|
+
seer index <repo-path> # build or refresh the index
|
|
18
|
+
seer mcp --workspace <path> # run the MCP server over the index
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### `seer index` options
|
|
22
|
+
|
|
23
|
+
| Flag | Meaning |
|
|
24
|
+
|---|---|
|
|
25
|
+
| `--reset` | Delete the existing index first. |
|
|
26
|
+
| `--mode full\|standard\|fast` | Discovery breadth. `standard` is the default. |
|
|
27
|
+
| `--include-vendor` / `--include-generated` | Pull in normally-excluded files. |
|
|
28
|
+
| `--max-file-kb <n>` | Skip files larger than `n` KiB (0 = no cap, the default). |
|
|
29
|
+
| `--parallel` / `--no-parallel` | Force or disable worker-thread parsing. |
|
|
30
|
+
| `--jobs <n>` | Worker thread count (default: cores minus one, capped at 8). |
|
|
31
|
+
| `-v, --verbose` | Per-file progress. |
|
|
32
|
+
|
|
33
|
+
`standard` excludes big dependency and generated trees. `fast` also drops docs,
|
|
34
|
+
fixtures, and static assets. `full` indexes everything.
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## Orientation
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
seer health # schema version, role counts, watcher state (cheap)
|
|
42
|
+
seer stats # file / symbol / edge / route / config counts
|
|
43
|
+
seer architecture # one-page snapshot: top symbols, modules, frameworks
|
|
44
|
+
seer boundaries # detected monorepo package boundaries
|
|
45
|
+
seer modules # Louvain module clusters
|
|
46
|
+
seer module <label> # files and top symbols inside a module
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Search and symbols
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
seer symbols [query] # search by name, or list top symbols by PageRank
|
|
55
|
+
seer symbols <q> --top 20
|
|
56
|
+
seer symbols <q> --include-tests --include-declarations --include-type-refs
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
By default, vendor, generated, test-file symbols, forward declarations, and type
|
|
60
|
+
references are hidden. Opt in with the `--include-*` flags.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Call graph
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
seer callers <symbol> [--limit n] # who calls this (name-based, broad)
|
|
68
|
+
seer callees <symbol> [--limit n] # what this calls
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
For precise, id-scoped call graphs, prefer `seer preflight` / `seer context`,
|
|
72
|
+
which resolve to exact symbol IDs.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Routes, dependencies, config
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
seer routes [--method POST] [--framework express] [--path checkout]
|
|
80
|
+
seer deps [--ecosystem npm] [--name react]
|
|
81
|
+
seer config [--key DATABASE_URL]
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Pre-edit intelligence
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
seer preflight --symbol <name> [--file <path>] # full pre-edit packet
|
|
90
|
+
seer preflight --from main --to HEAD # blast radius of a diff
|
|
91
|
+
seer preflight --from main --to HEAD --old-bundle a.seerbundle --new-bundle b.seerbundle
|
|
92
|
+
|
|
93
|
+
seer context <symbol> # definition + callers + tests + history + risk
|
|
94
|
+
seer risk <symbol> # decomposed edit-risk score
|
|
95
|
+
seer behavior <symbol> # ranked tests that exercise the symbol
|
|
96
|
+
seer detect-changes --from main --to HEAD # standalone diff blast radius
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`preflight` is the one to reach for first. It folds definition, callers,
|
|
100
|
+
transitive dependents, tests, recent history, and risk into a single packet.
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Git history and continuity
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
seer churn # file-level git stats
|
|
108
|
+
seer symbol-history [--force] # build the per-symbol history index (opt-in)
|
|
109
|
+
seer history <symbol> # commit blame chain for one symbol
|
|
110
|
+
seer continuity <symbol> # rename/move continuity evidence (advisory)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## Portability and diffing
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
seer bundle export [--out file.seerbundle]
|
|
119
|
+
seer bundle import <bundle> [--external --alias <name>]
|
|
120
|
+
seer bundle info <bundle>
|
|
121
|
+
seer bundle external # list imported external layers
|
|
122
|
+
seer contract diff <old> <new> [--include-callers]
|
|
123
|
+
seer ci bundle # fresh-index + emit a bundle (for CI)
|
|
124
|
+
seer ci workflow # print a GitHub Actions YAML
|
|
125
|
+
seer scip-import <scip.json> # add a SCIP precision overlay
|
|
126
|
+
seer duplicates [--max-distance 4] [--min-loc 5]
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## Service links
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
seer service-calls [--protocol http] [--path /users]
|
|
135
|
+
seer service-links [--match-kind exact]
|
|
136
|
+
seer trace-service <from> <to> [--depth n]
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
These resolve outbound network calls (fetch, axios, gRPC, tRPC, GraphQL, message
|
|
140
|
+
queues) to the concrete route handlers that serve them.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Common flags
|
|
145
|
+
|
|
146
|
+
- `--db <path>` on any query command points at a specific index.
|
|
147
|
+
- `--limit <n>` caps list output on most list commands.
|
|
148
|
+
- `--json` is available on `preflight` and `contract diff` for machine output.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
# Behavior and tests
|
|
2
|
+
|
|
3
|
+
A flat "here are the test files that mention this symbol" list is noisy. Seer
|
|
4
|
+
ranks tests by how directly they exercise the symbol, so the agent reads the
|
|
5
|
+
specification that actually matters first.
|
|
6
|
+
|
|
7
|
+
## The call
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
seer_behavior { "symbol": "chargeCard" }
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Trimmed response:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"symbol": "billing.PaymentService.chargeCard",
|
|
18
|
+
"tests": [
|
|
19
|
+
{
|
|
20
|
+
"name": "charges a valid card",
|
|
21
|
+
"file": "test/payment.spec.ts",
|
|
22
|
+
"line": 24,
|
|
23
|
+
"directness": "direct-call",
|
|
24
|
+
"assertions": 4,
|
|
25
|
+
"lastCommit": "2026-04-18"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "rejects an expired card",
|
|
29
|
+
"file": "test/payment.spec.ts",
|
|
30
|
+
"line": 51,
|
|
31
|
+
"directness": "direct-call",
|
|
32
|
+
"assertions": 3
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "checkout completes end to end",
|
|
36
|
+
"file": "test/checkout.e2e.ts",
|
|
37
|
+
"line": 12,
|
|
38
|
+
"directness": "graph-distance-2",
|
|
39
|
+
"assertions": 7
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## How the ranking works
|
|
46
|
+
|
|
47
|
+
Tests are scored by, in order:
|
|
48
|
+
|
|
49
|
+
1. **Direct call** the test invokes the symbol itself.
|
|
50
|
+
2. **Naming convention** the test file mirrors the symbol's file.
|
|
51
|
+
3. **Graph distance** how many call-graph steps from the test to the symbol.
|
|
52
|
+
4. **Assertion count and recency** denser, more recently touched tests rank up.
|
|
53
|
+
|
|
54
|
+
So in the example, the two unit tests that call `chargeCard` directly sit above
|
|
55
|
+
the end-to-end test that only reaches it two hops away, even though the e2e test
|
|
56
|
+
has more assertions.
|
|
57
|
+
|
|
58
|
+
## Why an agent wants this
|
|
59
|
+
|
|
60
|
+
Before changing behavior, the agent can read the existing contract: an expired
|
|
61
|
+
card is rejected, a valid card charges. If the change should preserve that, the
|
|
62
|
+
agent knows which tests must stay green. If the change alters it, the agent knows
|
|
63
|
+
exactly which spec to update.
|
|
64
|
+
|
|
65
|
+
## From the CLI
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
seer behavior chargeCard
|
|
69
|
+
seer behavior chargeCard --depth 3 --limit 20
|
|
70
|
+
```
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Change history
|
|
2
|
+
|
|
3
|
+
Generic MCP servers show file-level churn. Seer's differentiator is symbol-level
|
|
4
|
+
history: the commit blame chain for the exact function, method, or class, and
|
|
5
|
+
the blast radius of a diff mapped to symbols rather than line numbers.
|
|
6
|
+
|
|
7
|
+
## History for one symbol
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
seer_history { "symbol": "chargeCard" }
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Trimmed response:
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"symbol": "billing.PaymentService.chargeCard",
|
|
18
|
+
"commits": [
|
|
19
|
+
{ "sha": "a1b2c3d", "date": "2026-04-18", "author": "Dana", "summary": "handle declined cards" },
|
|
20
|
+
{ "sha": "9f8e7d6", "date": "2026-02-02", "author": "Sam", "summary": "add retry on timeout" },
|
|
21
|
+
{ "sha": "1122334", "date": "2025-11-20", "author": "Dana", "summary": "extract chargeCard from checkout" }
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The last entry shows `chargeCard` was extracted out of `checkout` in November.
|
|
27
|
+
That is lineage a per-file blame would blur, because the code used to live in a
|
|
28
|
+
different function.
|
|
29
|
+
|
|
30
|
+
## Diff blast radius
|
|
31
|
+
|
|
32
|
+
When work is already underway, point Seer at the range:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
seer_preflight { "fromRef": "main", "toRef": "HEAD" }
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Trimmed response:
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"changedSymbols": [
|
|
43
|
+
{
|
|
44
|
+
"name": "chargeCard",
|
|
45
|
+
"file": "src/billing/payment.ts",
|
|
46
|
+
"changeKind": "modified",
|
|
47
|
+
"transitiveDependents": 9,
|
|
48
|
+
"routeExposure": [{ "method": "POST", "path": "/api/checkout" }],
|
|
49
|
+
"risk": { "verdict": "high" }
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "formatAmount",
|
|
53
|
+
"file": "src/billing/format.ts",
|
|
54
|
+
"changeKind": "modified",
|
|
55
|
+
"transitiveDependents": 31,
|
|
56
|
+
"risk": { "verdict": "medium" }
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Seer translated the raw line diff into the two symbols you actually changed, then
|
|
63
|
+
told you `formatAmount` has 31 dependents, which is the kind of thing easy to
|
|
64
|
+
miss when a one-line format tweak looks harmless.
|
|
65
|
+
|
|
66
|
+
## Continuity across renames
|
|
67
|
+
|
|
68
|
+
If a symbol was recently renamed or moved and you want the evidence:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
seer_continuity { "symbol": "chargeCard" }
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
This is advisory and confidence-labeled. It will not invent a link it cannot
|
|
75
|
+
justify by shape and scope similarity. For the authoritative cross-commit lineage
|
|
76
|
+
(across moves and renames), `seer_history` follows the file through git.
|
|
77
|
+
|
|
78
|
+
## From the CLI
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
seer symbol-history # build the per-symbol history index (opt-in, once)
|
|
82
|
+
seer history chargeCard
|
|
83
|
+
seer continuity chargeCard
|
|
84
|
+
seer detect-changes --from main --to HEAD
|
|
85
|
+
```
|