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.
Files changed (371) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/LICENSE +176 -0
  3. package/README.md +272 -0
  4. package/README_dev.md +199 -0
  5. package/dist/bundle/ci.d.ts +47 -0
  6. package/dist/bundle/ci.d.ts.map +1 -0
  7. package/dist/bundle/ci.js +113 -0
  8. package/dist/bundle/ci.js.map +1 -0
  9. package/dist/bundle/contract.d.ts +111 -0
  10. package/dist/bundle/contract.d.ts.map +1 -0
  11. package/dist/bundle/contract.js +352 -0
  12. package/dist/bundle/contract.js.map +1 -0
  13. package/dist/bundle/export.d.ts +36 -0
  14. package/dist/bundle/export.d.ts.map +1 -0
  15. package/dist/bundle/export.js +152 -0
  16. package/dist/bundle/export.js.map +1 -0
  17. package/dist/bundle/external.d.ts +66 -0
  18. package/dist/bundle/external.d.ts.map +1 -0
  19. package/dist/bundle/external.js +238 -0
  20. package/dist/bundle/external.js.map +1 -0
  21. package/dist/bundle/format.d.ts +94 -0
  22. package/dist/bundle/format.d.ts.map +1 -0
  23. package/dist/bundle/format.js +42 -0
  24. package/dist/bundle/format.js.map +1 -0
  25. package/dist/bundle/import.d.ts +49 -0
  26. package/dist/bundle/import.d.ts.map +1 -0
  27. package/dist/bundle/import.js +116 -0
  28. package/dist/bundle/import.js.map +1 -0
  29. package/dist/cli/index.d.ts +3 -0
  30. package/dist/cli/index.d.ts.map +1 -0
  31. package/dist/cli/index.js +1402 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/cli/init.d.ts +48 -0
  34. package/dist/cli/init.d.ts.map +1 -0
  35. package/dist/cli/init.js +284 -0
  36. package/dist/cli/init.js.map +1 -0
  37. package/dist/db/schema.d.ts +3 -0
  38. package/dist/db/schema.d.ts.map +1 -0
  39. package/dist/db/schema.js +616 -0
  40. package/dist/db/schema.js.map +1 -0
  41. package/dist/db/store.d.ts +1011 -0
  42. package/dist/db/store.d.ts.map +1 -0
  43. package/dist/db/store.js +3888 -0
  44. package/dist/db/store.js.map +1 -0
  45. package/dist/graph/pagerank.d.ts +9 -0
  46. package/dist/graph/pagerank.d.ts.map +1 -0
  47. package/dist/graph/pagerank.js +47 -0
  48. package/dist/graph/pagerank.js.map +1 -0
  49. package/dist/indexer/architecture.d.ts +72 -0
  50. package/dist/indexer/architecture.d.ts.map +1 -0
  51. package/dist/indexer/architecture.js +112 -0
  52. package/dist/indexer/architecture.js.map +1 -0
  53. package/dist/indexer/behavior.d.ts +75 -0
  54. package/dist/indexer/behavior.d.ts.map +1 -0
  55. package/dist/indexer/behavior.js +395 -0
  56. package/dist/indexer/behavior.js.map +1 -0
  57. package/dist/indexer/boundaries.d.ts +60 -0
  58. package/dist/indexer/boundaries.d.ts.map +1 -0
  59. package/dist/indexer/boundaries.js +366 -0
  60. package/dist/indexer/boundaries.js.map +1 -0
  61. package/dist/indexer/churn.d.ts +15 -0
  62. package/dist/indexer/churn.d.ts.map +1 -0
  63. package/dist/indexer/churn.js +49 -0
  64. package/dist/indexer/churn.js.map +1 -0
  65. package/dist/indexer/classify.d.ts +9 -0
  66. package/dist/indexer/classify.d.ts.map +1 -0
  67. package/dist/indexer/classify.js +90 -0
  68. package/dist/indexer/classify.js.map +1 -0
  69. package/dist/indexer/context.d.ts +176 -0
  70. package/dist/indexer/context.d.ts.map +1 -0
  71. package/dist/indexer/context.js +193 -0
  72. package/dist/indexer/context.js.map +1 -0
  73. package/dist/indexer/continuity.d.ts +67 -0
  74. package/dist/indexer/continuity.d.ts.map +1 -0
  75. package/dist/indexer/continuity.js +288 -0
  76. package/dist/indexer/continuity.js.map +1 -0
  77. package/dist/indexer/detectchanges.d.ts +32 -0
  78. package/dist/indexer/detectchanges.d.ts.map +1 -0
  79. package/dist/indexer/detectchanges.js +74 -0
  80. package/dist/indexer/detectchanges.js.map +1 -0
  81. package/dist/indexer/discovery.d.ts +37 -0
  82. package/dist/indexer/discovery.d.ts.map +1 -0
  83. package/dist/indexer/discovery.js +136 -0
  84. package/dist/indexer/discovery.js.map +1 -0
  85. package/dist/indexer/externaldeps.d.ts +18 -0
  86. package/dist/indexer/externaldeps.d.ts.map +1 -0
  87. package/dist/indexer/externaldeps.js +288 -0
  88. package/dist/indexer/externaldeps.js.map +1 -0
  89. package/dist/indexer/freshness.d.ts +48 -0
  90. package/dist/indexer/freshness.d.ts.map +1 -0
  91. package/dist/indexer/freshness.js +128 -0
  92. package/dist/indexer/freshness.js.map +1 -0
  93. package/dist/indexer/git.d.ts +144 -0
  94. package/dist/indexer/git.d.ts.map +1 -0
  95. package/dist/indexer/git.js +444 -0
  96. package/dist/indexer/git.js.map +1 -0
  97. package/dist/indexer/index.d.ts +145 -0
  98. package/dist/indexer/index.d.ts.map +1 -0
  99. package/dist/indexer/index.js +930 -0
  100. package/dist/indexer/index.js.map +1 -0
  101. package/dist/indexer/modules.d.ts +62 -0
  102. package/dist/indexer/modules.d.ts.map +1 -0
  103. package/dist/indexer/modules.js +293 -0
  104. package/dist/indexer/modules.js.map +1 -0
  105. package/dist/indexer/preflight.d.ts +154 -0
  106. package/dist/indexer/preflight.d.ts.map +1 -0
  107. package/dist/indexer/preflight.js +399 -0
  108. package/dist/indexer/preflight.js.map +1 -0
  109. package/dist/indexer/protoScanner.d.ts +34 -0
  110. package/dist/indexer/protoScanner.d.ts.map +1 -0
  111. package/dist/indexer/protoScanner.js +133 -0
  112. package/dist/indexer/protoScanner.js.map +1 -0
  113. package/dist/indexer/risk.d.ts +115 -0
  114. package/dist/indexer/risk.d.ts.map +1 -0
  115. package/dist/indexer/risk.js +194 -0
  116. package/dist/indexer/risk.js.map +1 -0
  117. package/dist/indexer/serviceHostScanner.d.ts +25 -0
  118. package/dist/indexer/serviceHostScanner.d.ts.map +1 -0
  119. package/dist/indexer/serviceHostScanner.js +95 -0
  120. package/dist/indexer/serviceHostScanner.js.map +1 -0
  121. package/dist/indexer/serviceLinks.d.ts +105 -0
  122. package/dist/indexer/serviceLinks.d.ts.map +1 -0
  123. package/dist/indexer/serviceLinks.js +509 -0
  124. package/dist/indexer/serviceLinks.js.map +1 -0
  125. package/dist/indexer/shapehash.d.ts +98 -0
  126. package/dist/indexer/shapehash.d.ts.map +1 -0
  127. package/dist/indexer/shapehash.js +354 -0
  128. package/dist/indexer/shapehash.js.map +1 -0
  129. package/dist/indexer/skeleton.d.ts +15 -0
  130. package/dist/indexer/skeleton.d.ts.map +1 -0
  131. package/dist/indexer/skeleton.js +136 -0
  132. package/dist/indexer/skeleton.js.map +1 -0
  133. package/dist/indexer/symbolhistory.d.ts +41 -0
  134. package/dist/indexer/symbolhistory.d.ts.map +1 -0
  135. package/dist/indexer/symbolhistory.js +124 -0
  136. package/dist/indexer/symbolhistory.js.map +1 -0
  137. package/dist/indexer/watcher.d.ts +68 -0
  138. package/dist/indexer/watcher.d.ts.map +1 -0
  139. package/dist/indexer/watcher.js +179 -0
  140. package/dist/indexer/watcher.js.map +1 -0
  141. package/dist/mcp/server.d.ts +80 -0
  142. package/dist/mcp/server.d.ts.map +1 -0
  143. package/dist/mcp/server.js +1610 -0
  144. package/dist/mcp/server.js.map +1 -0
  145. package/dist/parser/index.d.ts +8 -0
  146. package/dist/parser/index.d.ts.map +1 -0
  147. package/dist/parser/index.js +33 -0
  148. package/dist/parser/index.js.map +1 -0
  149. package/dist/parser/languages/cpp.d.ts +3 -0
  150. package/dist/parser/languages/cpp.d.ts.map +1 -0
  151. package/dist/parser/languages/cpp.js +350 -0
  152. package/dist/parser/languages/cpp.js.map +1 -0
  153. package/dist/parser/languages/csharp.d.ts +3 -0
  154. package/dist/parser/languages/csharp.d.ts.map +1 -0
  155. package/dist/parser/languages/csharp.js +239 -0
  156. package/dist/parser/languages/csharp.js.map +1 -0
  157. package/dist/parser/languages/go.d.ts +3 -0
  158. package/dist/parser/languages/go.d.ts.map +1 -0
  159. package/dist/parser/languages/go.js +259 -0
  160. package/dist/parser/languages/go.js.map +1 -0
  161. package/dist/parser/languages/java.d.ts +3 -0
  162. package/dist/parser/languages/java.d.ts.map +1 -0
  163. package/dist/parser/languages/java.js +391 -0
  164. package/dist/parser/languages/java.js.map +1 -0
  165. package/dist/parser/languages/python.d.ts +3 -0
  166. package/dist/parser/languages/python.d.ts.map +1 -0
  167. package/dist/parser/languages/python.js +396 -0
  168. package/dist/parser/languages/python.js.map +1 -0
  169. package/dist/parser/languages/rust.d.ts +3 -0
  170. package/dist/parser/languages/rust.d.ts.map +1 -0
  171. package/dist/parser/languages/rust.js +159 -0
  172. package/dist/parser/languages/rust.js.map +1 -0
  173. package/dist/parser/languages/typescript.d.ts +3 -0
  174. package/dist/parser/languages/typescript.d.ts.map +1 -0
  175. package/dist/parser/languages/typescript.js +1442 -0
  176. package/dist/parser/languages/typescript.js.map +1 -0
  177. package/dist/parser/parserContext.d.ts +77 -0
  178. package/dist/parser/parserContext.d.ts.map +1 -0
  179. package/dist/parser/parserContext.js +354 -0
  180. package/dist/parser/parserContext.js.map +1 -0
  181. package/dist/parser/walker.d.ts +81 -0
  182. package/dist/parser/walker.d.ts.map +1 -0
  183. package/dist/parser/walker.js +217 -0
  184. package/dist/parser/walker.js.map +1 -0
  185. package/dist/parser/worker.d.ts +66 -0
  186. package/dist/parser/worker.d.ts.map +1 -0
  187. package/dist/parser/worker.js +129 -0
  188. package/dist/parser/worker.js.map +1 -0
  189. package/dist/parser/workerpool.d.ts +107 -0
  190. package/dist/parser/workerpool.d.ts.map +1 -0
  191. package/dist/parser/workerpool.js +383 -0
  192. package/dist/parser/workerpool.js.map +1 -0
  193. package/dist/scip/format.d.ts +87 -0
  194. package/dist/scip/format.d.ts.map +1 -0
  195. package/dist/scip/format.js +31 -0
  196. package/dist/scip/format.js.map +1 -0
  197. package/dist/scip/import.d.ts +37 -0
  198. package/dist/scip/import.d.ts.map +1 -0
  199. package/dist/scip/import.js +180 -0
  200. package/dist/scip/import.js.map +1 -0
  201. package/dist/types.d.ts +392 -0
  202. package/dist/types.d.ts.map +1 -0
  203. package/dist/types.js +4 -0
  204. package/dist/types.js.map +1 -0
  205. package/docs/architecture.md +105 -0
  206. package/docs/benchmarks/methodology.md +134 -0
  207. package/docs/benchmarks/raw-results.md +71 -0
  208. package/docs/benchmarks.md +74 -0
  209. package/docs/cli.md +148 -0
  210. package/docs/examples/behavior-tests.md +70 -0
  211. package/docs/examples/change-history.md +85 -0
  212. package/docs/examples/pre-edit-context.md +81 -0
  213. package/docs/examples/service-links.md +88 -0
  214. package/docs/examples.md +80 -0
  215. package/docs/faq.md +70 -0
  216. package/docs/internals.md +104 -0
  217. package/docs/languages.md +70 -0
  218. package/docs/limits.md +52 -0
  219. package/docs/mcp.md +199 -0
  220. package/docs/quickstart.md +119 -0
  221. package/docs/testing.md +123 -0
  222. package/docs/tools.md +115 -0
  223. package/package.json +52 -0
  224. package/research-codebase.md +578 -0
  225. package/seer-cli-docs.md +326 -0
  226. package/seer-master-guide.md +246 -0
  227. package/src/bundle/ci.ts +141 -0
  228. package/src/bundle/contract.ts +387 -0
  229. package/src/bundle/export.ts +175 -0
  230. package/src/bundle/external.ts +285 -0
  231. package/src/bundle/format.ts +92 -0
  232. package/src/bundle/import.ts +157 -0
  233. package/src/cli/index.ts +1249 -0
  234. package/src/cli/init.ts +389 -0
  235. package/src/db/schema.ts +614 -0
  236. package/src/db/store.ts +4306 -0
  237. package/src/graph/pagerank.ts +53 -0
  238. package/src/indexer/architecture.ts +148 -0
  239. package/src/indexer/behavior.ts +466 -0
  240. package/src/indexer/boundaries.ts +374 -0
  241. package/src/indexer/churn.ts +58 -0
  242. package/src/indexer/classify.ts +96 -0
  243. package/src/indexer/context.ts +340 -0
  244. package/src/indexer/continuity.ts +322 -0
  245. package/src/indexer/detectchanges.ts +94 -0
  246. package/src/indexer/discovery.ts +176 -0
  247. package/src/indexer/externaldeps.ts +243 -0
  248. package/src/indexer/freshness.ts +166 -0
  249. package/src/indexer/git.ts +453 -0
  250. package/src/indexer/index.ts +1092 -0
  251. package/src/indexer/modules.ts +358 -0
  252. package/src/indexer/preflight.ts +548 -0
  253. package/src/indexer/protoScanner.ts +147 -0
  254. package/src/indexer/risk.ts +304 -0
  255. package/src/indexer/serviceHostScanner.ts +92 -0
  256. package/src/indexer/serviceLinks.ts +543 -0
  257. package/src/indexer/shapehash.ts +370 -0
  258. package/src/indexer/skeleton.ts +169 -0
  259. package/src/indexer/symbolhistory.ts +172 -0
  260. package/src/indexer/watcher.ts +206 -0
  261. package/src/mcp/server.ts +1659 -0
  262. package/src/parser/index.ts +37 -0
  263. package/src/parser/languages/cpp.ts +361 -0
  264. package/src/parser/languages/csharp.ts +235 -0
  265. package/src/parser/languages/go.ts +259 -0
  266. package/src/parser/languages/java.ts +382 -0
  267. package/src/parser/languages/python.ts +370 -0
  268. package/src/parser/languages/rust.ts +164 -0
  269. package/src/parser/languages/typescript.ts +1435 -0
  270. package/src/parser/parserContext.ts +392 -0
  271. package/src/parser/walker.ts +306 -0
  272. package/src/parser/worker.ts +181 -0
  273. package/src/parser/workerpool.ts +448 -0
  274. package/src/scip/format.ts +83 -0
  275. package/src/scip/import.ts +216 -0
  276. package/src/types.ts +457 -0
  277. package/tests/benchmark-service-links.ts +244 -0
  278. package/tests/bug-regressions.ts +626 -0
  279. package/tests/filters.ts +264 -0
  280. package/tests/fixtures/Counter.tsx +38 -0
  281. package/tests/fixtures/caller.ts +7 -0
  282. package/tests/fixtures/collisions.ts +23 -0
  283. package/tests/fixtures/local_helper.ts +5 -0
  284. package/tests/fixtures/overloads.java +17 -0
  285. package/tests/fixtures/remote_helper.ts +4 -0
  286. package/tests/fixtures/sample.c +15 -0
  287. package/tests/fixtures/sample.cpp +47 -0
  288. package/tests/fixtures/sample.cs +62 -0
  289. package/tests/fixtures/sample.go +68 -0
  290. package/tests/fixtures/sample.h +30 -0
  291. package/tests/fixtures/sample.java +85 -0
  292. package/tests/fixtures/sample.py +46 -0
  293. package/tests/fixtures/sample.rs +78 -0
  294. package/tests/fixtures/sample.ts +76 -0
  295. package/tests/fixtures-service/HttpClients.cs +30 -0
  296. package/tests/fixtures-service/HttpClients.java +24 -0
  297. package/tests/fixtures-service/billing.ts +15 -0
  298. package/tests/fixtures-service/docker-compose.yml +15 -0
  299. package/tests/fixtures-service/gateway.ts +10 -0
  300. package/tests/fixtures-service/get_user.ts +11 -0
  301. package/tests/fixtures-service/graphql_client.ts +63 -0
  302. package/tests/fixtures-service/graphql_server.ts +30 -0
  303. package/tests/fixtures-service/grpc_client.go +30 -0
  304. package/tests/fixtures-service/http_clients.go +23 -0
  305. package/tests/fixtures-service/http_clients.py +38 -0
  306. package/tests/fixtures-service/http_clients.ts +49 -0
  307. package/tests/fixtures-service/k8s/payment-service.yaml +22 -0
  308. package/tests/fixtures-service/k8s_calls.ts +20 -0
  309. package/tests/fixtures-service/messaging.ts +87 -0
  310. package/tests/fixtures-service/trpc_client.ts +39 -0
  311. package/tests/fixtures-service/trpc_server.ts +39 -0
  312. package/tests/fixtures-service/user_service.proto +33 -0
  313. package/tests/fixtures-trackcd/Cargo.toml +11 -0
  314. package/tests/fixtures-trackcd/SpringController.java +36 -0
  315. package/tests/fixtures-trackcd/auth_service.ts +19 -0
  316. package/tests/fixtures-trackcd/complex_module.py +50 -0
  317. package/tests/fixtures-trackcd/express_app.js +30 -0
  318. package/tests/fixtures-trackcd/fastapi_app.py +49 -0
  319. package/tests/fixtures-trackcd/fastify_object_routes.js +32 -0
  320. package/tests/fixtures-trackcd/go.mod +8 -0
  321. package/tests/fixtures-trackcd/package.json +15 -0
  322. package/tests/fixtures-trackcd/requirements.txt +4 -0
  323. package/tests/fixtures-trackcd/tests/auth_service.test.ts +13 -0
  324. package/tests/fixtures-tracke/auth/AuthService.ts +23 -0
  325. package/tests/fixtures-tracke/auth/crypto.ts +7 -0
  326. package/tests/fixtures-tracke/billing/Billing.ts +20 -0
  327. package/tests/fixtures-tracke/billing/Invoice.ts +10 -0
  328. package/tests/fixtures-tracke/billing/server.ts +17 -0
  329. package/tests/fixtures-tracke/package.json +7 -0
  330. package/tests/fixtures-tracke/tests/auth.test.ts +23 -0
  331. package/tests/fixtures-tracke/tests/billing.test.ts +14 -0
  332. package/tests/fixtures-trackf/package.json +5 -0
  333. package/tests/fixtures-trackf/src/auth.ts +26 -0
  334. package/tests/fixtures-trackf/src/handlers.ts +35 -0
  335. package/tests/fixtures-tracki/billing/routes.ts +12 -0
  336. package/tests/fixtures-tracki/gateway/client.ts +13 -0
  337. package/tests/git-features.ts +267 -0
  338. package/tests/init.ts +141 -0
  339. package/tests/mcp-jit.ts +130 -0
  340. package/tests/mcp-smoke.ts +191 -0
  341. package/tests/mcp-trackcd.ts +169 -0
  342. package/tests/mcp-tracke.ts +229 -0
  343. package/tests/mcp-trackf.ts +330 -0
  344. package/tests/mcp-trackg.ts +219 -0
  345. package/tests/mcp-tracki.ts +174 -0
  346. package/tests/mcp-watcher.ts +126 -0
  347. package/tests/optspec.ts +194 -0
  348. package/tests/parallel-index.ts +333 -0
  349. package/tests/parallel-read.ts +125 -0
  350. package/tests/parallel-recovery.ts +241 -0
  351. package/tests/perf-callers.ts +145 -0
  352. package/tests/query-parity.ts +184 -0
  353. package/tests/query-perf.ts +55 -0
  354. package/tests/scale-parallel-parity.ts +225 -0
  355. package/tests/scale-test.ts +523 -0
  356. package/tests/smoke.ts +396 -0
  357. package/tests/trackcd.ts +325 -0
  358. package/tests/tracke-collisions.ts +255 -0
  359. package/tests/tracke.ts +314 -0
  360. package/tests/trackf-bugs.ts +406 -0
  361. package/tests/trackf.ts +390 -0
  362. package/tests/trackg.ts +1372 -0
  363. package/tests/tracki-boundaries.ts +202 -0
  364. package/tests/tracki-continuity.ts +253 -0
  365. package/tests/tracki-contract-diff.ts +249 -0
  366. package/tests/tracki-external-bundles.ts +341 -0
  367. package/tests/tracki-preflight.ts +251 -0
  368. package/tests/verify-roles.ts +51 -0
  369. package/tests/worker-parity.ts +286 -0
  370. package/tests/worker-pool.ts +262 -0
  371. 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
+ ```