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