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,47 @@
1
+ import { ExportResult } from './export.js';
2
+ import type { DiscoveryMode } from '../indexer/discovery.js';
3
+ export interface CiBuildOptions {
4
+ /** Repo root to index. Required. */
5
+ repoRoot: string;
6
+ /** Where to write the bundle. Defaults to `<repoRoot>/.seer/index.seerbundle`. */
7
+ out?: string;
8
+ /** Discovery mode for the index pass. CI defaults to `'standard'`. */
9
+ mode?: DiscoveryMode;
10
+ /** Wipe any existing DB before the indexing pass. CI defaults to `true`. */
11
+ reset?: boolean;
12
+ /** Pass through to the indexer's `parallel` toggle. */
13
+ parallel?: boolean;
14
+ /** Optional gitHead/gitBranch overrides (CI runners frequently know them). */
15
+ gitHead?: string;
16
+ gitBranch?: string;
17
+ /** Pin manifest.builtAt for reproducible bundles (defaults to Date.now()). */
18
+ builtAt?: number;
19
+ /** Logger. */
20
+ log?: (msg: string) => void;
21
+ }
22
+ export interface CiBuildResult {
23
+ /** Result of the indexing pass (file/symbol counts). */
24
+ index: {
25
+ filesIndexed: number;
26
+ symbols: number;
27
+ edges: number;
28
+ elapsedMs: number;
29
+ };
30
+ /** Result of the bundle export. */
31
+ bundle: ExportResult;
32
+ totalElapsedMs: number;
33
+ }
34
+ /**
35
+ * One-call CI pipeline: fresh-index a repo, export the result as a portable
36
+ * bundle, and report both phases. Exits with a non-zero status if either
37
+ * phase fails — wired up in the CLI command's caller.
38
+ */
39
+ export declare function buildCiBundle(options: CiBuildOptions): Promise<CiBuildResult>;
40
+ /**
41
+ * Emit a ready-to-paste GitHub Actions workflow that runs the CI bundle
42
+ * pipeline on every push to main and uploads the resulting bundle as a
43
+ * build artifact. The workflow is self-contained — no per-repo edits
44
+ * required beyond dropping it at `.github/workflows/seer-bundle.yml`.
45
+ */
46
+ export declare function workflowTemplate(): string;
47
+ //# sourceMappingURL=ci.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.d.ts","sourceRoot":"","sources":["../../src/bundle/ci.ts"],"names":[],"mappings":"AAIA,OAAO,EAAgB,YAAY,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,kFAAkF;IAClF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sEAAsE;IACtE,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,4EAA4E;IAC5E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc;IACd,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,mCAAmC;IACnC,MAAM,EAAE,YAAY,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAuDnF;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAgCzC"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildCiBundle = buildCiBundle;
7
+ exports.workflowTemplate = workflowTemplate;
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const store_js_1 = require("../db/store.js");
11
+ const index_js_1 = require("../indexer/index.js");
12
+ const export_js_1 = require("./export.js");
13
+ /**
14
+ * One-call CI pipeline: fresh-index a repo, export the result as a portable
15
+ * bundle, and report both phases. Exits with a non-zero status if either
16
+ * phase fails — wired up in the CLI command's caller.
17
+ */
18
+ async function buildCiBundle(options) {
19
+ const start = Date.now();
20
+ const log = options.log ?? ((msg) => process.stdout.write(`${msg}\n`));
21
+ const repoRoot = path_1.default.resolve(options.repoRoot);
22
+ if (!fs_1.default.existsSync(repoRoot)) {
23
+ throw new Error(`Repo not found: ${repoRoot}`);
24
+ }
25
+ const dbPath = path_1.default.join(repoRoot, '.seer', 'graph.db');
26
+ fs_1.default.mkdirSync(path_1.default.dirname(dbPath), { recursive: true });
27
+ // CI mode wipes the DB by default — every pipeline run should be a clean
28
+ // snapshot, not an incremental update over whatever junk was on the runner.
29
+ const reset = options.reset ?? true;
30
+ if (reset && fs_1.default.existsSync(dbPath)) {
31
+ fs_1.default.unlinkSync(dbPath);
32
+ for (const sfx of ['-wal', '-shm']) {
33
+ try {
34
+ fs_1.default.unlinkSync(dbPath + sfx);
35
+ }
36
+ catch { /* */ }
37
+ }
38
+ }
39
+ log(`[ci] Indexing ${repoRoot}...`);
40
+ const store = new store_js_1.Store(dbPath);
41
+ const indexer = new index_js_1.Indexer(store);
42
+ let indexResult;
43
+ try {
44
+ indexResult = await indexer.indexDirectory(repoRoot, {
45
+ mode: options.mode ?? 'standard',
46
+ parallel: options.parallel,
47
+ quiet: true,
48
+ });
49
+ }
50
+ finally {
51
+ store.close();
52
+ }
53
+ log(`[ci] Indexed ${indexResult.filesIndexed} files, ${indexResult.symbols} symbols, ${indexResult.edges} edges in ${indexResult.elapsedMs}ms`);
54
+ log(`[ci] Exporting bundle...`);
55
+ const bundle = await (0, export_js_1.exportBundle)(dbPath, repoRoot, {
56
+ out: options.out,
57
+ log: (m) => log(` ${m}`),
58
+ gitHead: options.gitHead,
59
+ gitBranch: options.gitBranch,
60
+ builtAt: options.builtAt,
61
+ });
62
+ log(`[ci] Wrote ${bundle.bundlePath} (${bundle.bytes.toLocaleString()} bytes) in ${bundle.elapsedMs}ms`);
63
+ return {
64
+ index: {
65
+ filesIndexed: indexResult.filesIndexed,
66
+ symbols: indexResult.symbols,
67
+ edges: indexResult.edges,
68
+ elapsedMs: indexResult.elapsedMs,
69
+ },
70
+ bundle,
71
+ totalElapsedMs: Date.now() - start,
72
+ };
73
+ }
74
+ /**
75
+ * Emit a ready-to-paste GitHub Actions workflow that runs the CI bundle
76
+ * pipeline on every push to main and uploads the resulting bundle as a
77
+ * build artifact. The workflow is self-contained — no per-repo edits
78
+ * required beyond dropping it at `.github/workflows/seer-bundle.yml`.
79
+ */
80
+ function workflowTemplate() {
81
+ return [
82
+ "name: Seer bundle",
83
+ "",
84
+ "on:",
85
+ " push:",
86
+ " branches: [main]",
87
+ " workflow_dispatch:",
88
+ "",
89
+ "jobs:",
90
+ " build:",
91
+ " runs-on: ubuntu-latest",
92
+ " permissions:",
93
+ " contents: read",
94
+ " steps:",
95
+ " - uses: actions/checkout@v4",
96
+ " with:",
97
+ " fetch-depth: 0 # full history so symbol-history pass works",
98
+ " - uses: actions/setup-node@v4",
99
+ " with:",
100
+ " node-version: '22'",
101
+ " - run: npm ci",
102
+ " - run: npm run build",
103
+ " - name: Build Seer bundle",
104
+ " run: node dist/cli/index.js ci bundle --workspace ${{ github.workspace }} --out seer-index.seerbundle",
105
+ " - uses: actions/upload-artifact@v4",
106
+ " with:",
107
+ " name: seer-index",
108
+ " path: seer-index.seerbundle",
109
+ " if-no-files-found: error",
110
+ "",
111
+ ].join('\n');
112
+ }
113
+ //# sourceMappingURL=ci.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci.js","sourceRoot":"","sources":["../../src/bundle/ci.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * v10 — Contract Diff between two `.seerbundle` artifacts.
3
+ *
4
+ * Goal: deterministically compute the change set in the API/service surface
5
+ * exposed by an indexed repo, treating the bundle as the source of truth.
6
+ * The diff is ADVISORY — exit code is always 0 even when breaking changes
7
+ * appear. Seer-Core does not gate CI.
8
+ *
9
+ * Comparison happens at the protocol-aware "endpoint" level:
10
+ * - HTTP: key = `${method}|${path}`, framework recorded
11
+ * - tRPC: key = `trpc|${operation}` (method = 'query' / 'mutation' / 'subscription')
12
+ * - GraphQL: key = `graphql|${operation}`
13
+ * - gRPC: key = `grpc|${service}.${operation}`
14
+ * - Messaging (kafka/sqs/sns/rabbitmq/nats/redis_pubsub):
15
+ * key = `${protocol}|${topic|queue|exchange}`
16
+ *
17
+ * Output:
18
+ * - added[]
19
+ * - removed[]
20
+ * - changed[] (key matched; surfaced field differs — handler, framework,
21
+ * metadata, service)
22
+ * - optionally affectedCallers[] when both bundles include service-link
23
+ * evidence (caller symbol qualifiedName / file).
24
+ *
25
+ * Deterministic ordering: every list is sorted by (protocol, key) ASC.
26
+ */
27
+ import { Store } from '../db/store.js';
28
+ export interface ContractEndpoint {
29
+ protocol: string;
30
+ /** Stable identity key for this endpoint within its protocol. */
31
+ key: string;
32
+ method: string | null;
33
+ path: string | null;
34
+ framework: string | null;
35
+ handlerName: string | null;
36
+ operation: string | null;
37
+ topic: string | null;
38
+ queue: string | null;
39
+ exchange: string | null;
40
+ service: string | null;
41
+ }
42
+ export interface AffectedCaller {
43
+ callerQualifiedName: string | null;
44
+ callerFile: string | null;
45
+ callerLine: number | null;
46
+ /** Where the caller is referenced — either 'old' or 'new' bundle. */
47
+ source: 'old' | 'new';
48
+ }
49
+ export interface ContractChange {
50
+ protocol: string;
51
+ key: string;
52
+ before: ContractEndpoint;
53
+ after: ContractEndpoint;
54
+ /** Field names whose value differs between before/after. */
55
+ changedFields: string[];
56
+ }
57
+ export interface ContractDiff {
58
+ oldBundle: {
59
+ path: string;
60
+ gitHead: string | null;
61
+ rosterHash: string;
62
+ };
63
+ newBundle: {
64
+ path: string;
65
+ gitHead: string | null;
66
+ rosterHash: string;
67
+ };
68
+ /** Per-protocol totals on both sides, for sanity. */
69
+ totals: {
70
+ old: number;
71
+ new: number;
72
+ added: number;
73
+ removed: number;
74
+ changed: number;
75
+ };
76
+ added: Array<ContractEndpoint & {
77
+ affectedCallers?: AffectedCaller[];
78
+ }>;
79
+ removed: Array<ContractEndpoint & {
80
+ affectedCallers?: AffectedCaller[];
81
+ }>;
82
+ changed: Array<ContractChange & {
83
+ affectedCallers?: AffectedCaller[];
84
+ }>;
85
+ /** True when the affected-callers section is non-empty for at least one row. */
86
+ affectedCallersAvailable: boolean;
87
+ }
88
+ /**
89
+ * Build the "contract surface" — one entry per route — from a bundle Store.
90
+ * Stable key:
91
+ * - HTTP → `http|${method}|${path}`
92
+ * - tRPC → `trpc|${operation}`
93
+ * - GraphQL → `graphql|${operation}`
94
+ * - gRPC → `grpc|${service}.${operation}`
95
+ * - Messaging → `${protocol}|${topic|queue|exchange}`
96
+ */
97
+ export declare function collectContractSurface(store: Store): Map<string, ContractEndpoint>;
98
+ /**
99
+ * Diff two bundles' contract surfaces. Both bundles are opened read-only,
100
+ * the surfaces are collected, and the diff is computed without importing
101
+ * either bundle into a workspace.
102
+ */
103
+ export declare function contractDiff(oldBundlePath: string, newBundlePath: string, options?: {
104
+ includeAffectedCallers?: boolean;
105
+ }): Promise<ContractDiff>;
106
+ /**
107
+ * Convenience: format the diff as a compact human-readable table.
108
+ * Deterministic ordering by protocol + key.
109
+ */
110
+ export declare function formatContractDiffTable(diff: ContractDiff): string;
111
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/bundle/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAOH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,qEAAqE;IACrE,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,gBAAgB,CAAC;IACxB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACxE,qDAAqD;IACrD,MAAM,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,KAAK,EAAE,KAAK,CAAC,gBAAgB,GAAG;QAAE,eAAe,CAAC,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC,CAAC;IACxE,OAAO,EAAE,KAAK,CAAC,gBAAgB,GAAG;QAAE,eAAe,CAAC,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC,CAAC;IAC1E,OAAO,EAAE,KAAK,CAAC,cAAc,GAAG;QAAE,eAAe,CAAC,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC,CAAC;IACxE,gFAAgF;IAChF,wBAAwB,EAAE,OAAO,CAAC;CACnC;AAwCD;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAsBlF;AAqCD;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;IAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAO,GACjD,OAAO,CAAC,YAAY,CAAC,CA0FvB;AA8DD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAuBlE"}
@@ -0,0 +1,352 @@
1
+ "use strict";
2
+ /**
3
+ * v10 — Contract Diff between two `.seerbundle` artifacts.
4
+ *
5
+ * Goal: deterministically compute the change set in the API/service surface
6
+ * exposed by an indexed repo, treating the bundle as the source of truth.
7
+ * The diff is ADVISORY — exit code is always 0 even when breaking changes
8
+ * appear. Seer-Core does not gate CI.
9
+ *
10
+ * Comparison happens at the protocol-aware "endpoint" level:
11
+ * - HTTP: key = `${method}|${path}`, framework recorded
12
+ * - tRPC: key = `trpc|${operation}` (method = 'query' / 'mutation' / 'subscription')
13
+ * - GraphQL: key = `graphql|${operation}`
14
+ * - gRPC: key = `grpc|${service}.${operation}`
15
+ * - Messaging (kafka/sqs/sns/rabbitmq/nats/redis_pubsub):
16
+ * key = `${protocol}|${topic|queue|exchange}`
17
+ *
18
+ * Output:
19
+ * - added[]
20
+ * - removed[]
21
+ * - changed[] (key matched; surfaced field differs — handler, framework,
22
+ * metadata, service)
23
+ * - optionally affectedCallers[] when both bundles include service-link
24
+ * evidence (caller symbol qualifiedName / file).
25
+ *
26
+ * Deterministic ordering: every list is sorted by (protocol, key) ASC.
27
+ */
28
+ var __importDefault = (this && this.__importDefault) || function (mod) {
29
+ return (mod && mod.__esModule) ? mod : { "default": mod };
30
+ };
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.collectContractSurface = collectContractSurface;
33
+ exports.contractDiff = contractDiff;
34
+ exports.formatContractDiffTable = formatContractDiffTable;
35
+ const fs_1 = __importDefault(require("fs"));
36
+ const path_1 = __importDefault(require("path"));
37
+ const os_1 = __importDefault(require("os"));
38
+ const zlib_1 = __importDefault(require("zlib"));
39
+ const format_js_1 = require("./format.js");
40
+ const store_js_1 = require("../db/store.js");
41
+ /**
42
+ * Open a bundle's payload as a read-only Store (decompressed to a temp file).
43
+ * Returns the Store plus a cleanup() function the caller MUST invoke.
44
+ */
45
+ async function openBundleStore(bundlePath) {
46
+ if (!fs_1.default.existsSync(bundlePath)) {
47
+ throw new Error(`No bundle at ${bundlePath}`);
48
+ }
49
+ const fileBuf = fs_1.default.readFileSync(bundlePath);
50
+ if (fileBuf.length < 12 || !fileBuf.subarray(0, 4).equals(format_js_1.BUNDLE_MAGIC)) {
51
+ throw new Error(`Not a Seer bundle: ${bundlePath} (bad magic)`);
52
+ }
53
+ const formatVersion = fileBuf.readUInt32BE(4);
54
+ if (formatVersion > format_js_1.BUNDLE_FORMAT_VERSION) {
55
+ throw new Error(`Bundle format v${formatVersion} is newer than this build (v${format_js_1.BUNDLE_FORMAT_VERSION}). Upgrade Seer.`);
56
+ }
57
+ const manifestLen = fileBuf.readUInt32BE(8);
58
+ const manifestEnd = 12 + manifestLen;
59
+ if (manifestLen <= 0 || manifestEnd > fileBuf.length) {
60
+ throw new Error(`Bundle truncated: ${bundlePath} (manifest length ${manifestLen} exceeds file size)`);
61
+ }
62
+ const manifest = JSON.parse(fileBuf.slice(12, manifestEnd).toString('utf-8'));
63
+ const dbBuf = zlib_1.default.gunzipSync(fileBuf.slice(manifestEnd));
64
+ const tmpDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'seer-contractdiff-'));
65
+ const dbPath = path_1.default.join(tmpDir, 'bundle.db');
66
+ fs_1.default.writeFileSync(dbPath, dbBuf);
67
+ const store = store_js_1.Store.openReadOnly(dbPath);
68
+ return {
69
+ store, manifest,
70
+ cleanup: () => {
71
+ try {
72
+ store.close();
73
+ }
74
+ catch { /* */ }
75
+ try {
76
+ fs_1.default.unlinkSync(dbPath);
77
+ fs_1.default.rmdirSync(tmpDir);
78
+ }
79
+ catch { /* */ }
80
+ },
81
+ };
82
+ }
83
+ /**
84
+ * Build the "contract surface" — one entry per route — from a bundle Store.
85
+ * Stable key:
86
+ * - HTTP → `http|${method}|${path}`
87
+ * - tRPC → `trpc|${operation}`
88
+ * - GraphQL → `graphql|${operation}`
89
+ * - gRPC → `grpc|${service}.${operation}`
90
+ * - Messaging → `${protocol}|${topic|queue|exchange}`
91
+ */
92
+ function collectContractSurface(store) {
93
+ const surface = new Map();
94
+ const rows = store.listRoutes({ limit: 1_000_000 });
95
+ for (const r of rows) {
96
+ const protocol = r.protocol ?? 'http';
97
+ const key = endpointKey(protocol, r);
98
+ if (key == null)
99
+ continue;
100
+ surface.set(key, {
101
+ protocol,
102
+ key,
103
+ method: r.method ?? null,
104
+ path: r.path ?? null,
105
+ framework: r.framework ?? null,
106
+ handlerName: r.handlerName ?? null,
107
+ operation: r.operation ?? null,
108
+ topic: r.topic ?? null,
109
+ queue: r.queue ?? null,
110
+ exchange: r.exchange ?? null,
111
+ service: r.service ?? null,
112
+ });
113
+ }
114
+ return surface;
115
+ }
116
+ function endpointKey(protocol, r) {
117
+ if (protocol === 'http') {
118
+ if (!r.path)
119
+ return null;
120
+ return `http|${(r.method ?? 'ANY').toUpperCase()}|${r.path}`;
121
+ }
122
+ if (protocol === 'trpc') {
123
+ if (!r.operation)
124
+ return null;
125
+ return `trpc|${r.operation}`;
126
+ }
127
+ if (protocol === 'graphql') {
128
+ if (!r.operation)
129
+ return null;
130
+ return `graphql|${r.operation}`;
131
+ }
132
+ if (protocol === 'grpc') {
133
+ if (!r.operation)
134
+ return null;
135
+ const svc = r.service ?? '';
136
+ return `grpc|${svc}.${r.operation}`;
137
+ }
138
+ if (protocol === 'kafka' || protocol === 'redis_pubsub' || protocol === 'nats' || protocol === 'sns') {
139
+ if (!r.topic)
140
+ return null;
141
+ return `${protocol}|${r.topic}`;
142
+ }
143
+ if (protocol === 'sqs' || protocol === 'rabbitmq') {
144
+ const key = r.queue ?? r.exchange;
145
+ if (!key)
146
+ return null;
147
+ return `${protocol}|${key}`;
148
+ }
149
+ return null;
150
+ }
151
+ /**
152
+ * Diff two bundles' contract surfaces. Both bundles are opened read-only,
153
+ * the surfaces are collected, and the diff is computed without importing
154
+ * either bundle into a workspace.
155
+ */
156
+ async function contractDiff(oldBundlePath, newBundlePath, options = {}) {
157
+ const oldH = await openBundleStore(oldBundlePath);
158
+ const newH = await openBundleStore(newBundlePath);
159
+ try {
160
+ const oldSurface = collectContractSurface(oldH.store);
161
+ const newSurface = collectContractSurface(newH.store);
162
+ const added = [];
163
+ const removed = [];
164
+ const changed = [];
165
+ for (const [key, before] of oldSurface) {
166
+ const after = newSurface.get(key);
167
+ if (!after) {
168
+ removed.push(before);
169
+ continue;
170
+ }
171
+ const fields = diffEndpointFields(before, after);
172
+ if (fields.length > 0) {
173
+ changed.push({ protocol: before.protocol, key, before, after, changedFields: fields });
174
+ }
175
+ }
176
+ for (const [key, after] of newSurface) {
177
+ if (!oldSurface.has(key))
178
+ added.push(after);
179
+ }
180
+ sortByProtocolKey(added);
181
+ sortByProtocolKey(removed);
182
+ changed.sort((a, b) => a.protocol < b.protocol ? -1 :
183
+ a.protocol > b.protocol ? 1 :
184
+ a.key < b.key ? -1 :
185
+ a.key > b.key ? 1 : 0);
186
+ let affectedCallersAvailable = false;
187
+ let augmented = false;
188
+ if (options.includeAffectedCallers) {
189
+ augmented = true;
190
+ const oldCallersByRouteKey = collectCallersByRouteKey(oldH.store);
191
+ const newCallersByRouteKey = collectCallersByRouteKey(newH.store);
192
+ const attach = (item, side) => {
193
+ const src = side === 'old' ? oldCallersByRouteKey : newCallersByRouteKey;
194
+ const callers = src.get(item.key);
195
+ if (callers && callers.length > 0) {
196
+ item.affectedCallers = callers.map(c => ({ ...c, source: side }));
197
+ affectedCallersAvailable = true;
198
+ }
199
+ };
200
+ for (const item of added)
201
+ attach(item, 'new');
202
+ for (const item of removed)
203
+ attach(item, 'old');
204
+ for (const item of changed) {
205
+ const sideOld = oldCallersByRouteKey.get(item.key);
206
+ const sideNew = newCallersByRouteKey.get(item.key);
207
+ const callers = [];
208
+ if (sideOld)
209
+ for (const c of sideOld)
210
+ callers.push({ ...c, source: 'old' });
211
+ if (sideNew)
212
+ for (const c of sideNew)
213
+ callers.push({ ...c, source: 'new' });
214
+ if (callers.length > 0) {
215
+ item.affectedCallers = callers;
216
+ affectedCallersAvailable = true;
217
+ }
218
+ }
219
+ void augmented;
220
+ }
221
+ return {
222
+ oldBundle: {
223
+ path: path_1.default.resolve(oldBundlePath),
224
+ gitHead: oldH.manifest.source.gitHead,
225
+ rosterHash: oldH.manifest.source.rosterHash,
226
+ },
227
+ newBundle: {
228
+ path: path_1.default.resolve(newBundlePath),
229
+ gitHead: newH.manifest.source.gitHead,
230
+ rosterHash: newH.manifest.source.rosterHash,
231
+ },
232
+ totals: {
233
+ old: oldSurface.size,
234
+ new: newSurface.size,
235
+ added: added.length,
236
+ removed: removed.length,
237
+ changed: changed.length,
238
+ },
239
+ added,
240
+ removed,
241
+ changed,
242
+ affectedCallersAvailable,
243
+ };
244
+ }
245
+ finally {
246
+ oldH.cleanup();
247
+ newH.cleanup();
248
+ }
249
+ }
250
+ function sortByProtocolKey(items) {
251
+ items.sort((a, b) => a.protocol < b.protocol ? -1 :
252
+ a.protocol > b.protocol ? 1 :
253
+ a.key < b.key ? -1 :
254
+ a.key > b.key ? 1 : 0);
255
+ }
256
+ function diffEndpointFields(a, b) {
257
+ const fields = [];
258
+ const keys = [
259
+ 'method', 'path', 'framework', 'handlerName',
260
+ 'operation', 'topic', 'queue', 'exchange', 'service',
261
+ ];
262
+ for (const k of keys) {
263
+ if (a[k] !== b[k])
264
+ fields.push(k);
265
+ }
266
+ return fields;
267
+ }
268
+ /**
269
+ * For each route in the bundle, build a list of caller previews using
270
+ * service_links + service_calls when present. Lets the diff report
271
+ * affectedCallers without importing the bundle.
272
+ */
273
+ function collectCallersByRouteKey(store) {
274
+ const out = new Map();
275
+ try {
276
+ const links = store.listServiceLinks({ limit: 1_000_000 });
277
+ const routesById = new Map();
278
+ for (const r of store.listRoutes({ limit: 1_000_000 })) {
279
+ const protocol = r.protocol ?? 'http';
280
+ const key = endpointKey(protocol, r);
281
+ if (!key)
282
+ continue;
283
+ routesById.set(r.id, {
284
+ protocol, key,
285
+ method: r.method, path: r.path, framework: r.framework,
286
+ handlerName: r.handlerName,
287
+ operation: r.operation ?? null, topic: r.topic ?? null,
288
+ queue: r.queue ?? null, exchange: r.exchange ?? null,
289
+ service: r.service ?? null,
290
+ });
291
+ }
292
+ for (const l of links) {
293
+ if (l.routeId == null)
294
+ continue;
295
+ const ep = routesById.get(l.routeId);
296
+ if (!ep)
297
+ continue;
298
+ const list = out.get(ep.key) ?? [];
299
+ list.push({
300
+ callerQualifiedName: l.callerQualifiedName ?? l.callerName ?? null,
301
+ callerFile: l.callerFile,
302
+ callerLine: l.callerLine ?? null,
303
+ source: 'old',
304
+ });
305
+ out.set(ep.key, list);
306
+ }
307
+ }
308
+ catch { /* */ }
309
+ return out;
310
+ }
311
+ /**
312
+ * Convenience: format the diff as a compact human-readable table.
313
+ * Deterministic ordering by protocol + key.
314
+ */
315
+ function formatContractDiffTable(diff) {
316
+ const lines = [];
317
+ lines.push(`Contract diff ${diff.oldBundle.path} → ${diff.newBundle.path}`);
318
+ lines.push(` old endpoints: ${diff.totals.old} new: ${diff.totals.new} ` +
319
+ `added: ${diff.totals.added} removed: ${diff.totals.removed} changed: ${diff.totals.changed}`);
320
+ if (diff.added.length > 0) {
321
+ lines.push('');
322
+ lines.push(' Added:');
323
+ for (const a of diff.added)
324
+ lines.push(` + [${a.protocol}] ${labelEndpoint(a)}`);
325
+ }
326
+ if (diff.removed.length > 0) {
327
+ lines.push('');
328
+ lines.push(' Removed:');
329
+ for (const r of diff.removed)
330
+ lines.push(` - [${r.protocol}] ${labelEndpoint(r)}`);
331
+ }
332
+ if (diff.changed.length > 0) {
333
+ lines.push('');
334
+ lines.push(' Changed:');
335
+ for (const c of diff.changed) {
336
+ lines.push(` ~ [${c.protocol}] ${labelEndpoint(c.before)} (${c.changedFields.join(', ')})`);
337
+ }
338
+ }
339
+ return lines.join('\n') + '\n';
340
+ }
341
+ function labelEndpoint(e) {
342
+ if (e.protocol === 'http')
343
+ return `${e.method ?? 'ANY'} ${e.path ?? ''} (${e.framework ?? '?'})`;
344
+ if (e.protocol === 'trpc')
345
+ return `${e.operation ?? ''}`;
346
+ if (e.protocol === 'graphql')
347
+ return `${e.operation ?? ''}`;
348
+ if (e.protocol === 'grpc')
349
+ return `${e.service ?? ''}.${e.operation ?? ''}`;
350
+ return e.topic ?? e.queue ?? e.exchange ?? '?';
351
+ }
352
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/bundle/contract.ts"],"names":[],"mappings":"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"}