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,366 @@
1
+ "use strict";
2
+ /**
3
+ * v10 — Monorepo package/service boundary detection.
4
+ *
5
+ * Source signals (in priority order — earlier sources win on overlap):
6
+ * 1. Nested manifest files:
7
+ * - package.json (npm/yarn/pnpm workspaces)
8
+ * - pyproject.toml
9
+ * - Cargo.toml
10
+ * - go.mod
11
+ * - composer.json
12
+ * 2. Workspace-declared globs:
13
+ * - package.json:workspaces
14
+ * - pnpm-workspace.yaml
15
+ * - turbo.json / nx.json pipelines
16
+ * - go.work
17
+ * - Cargo workspace members (parent Cargo.toml [workspace])
18
+ * 3. Convention fallback:
19
+ * - packages/<name>/
20
+ * - services/<name>/
21
+ * - apps/<name>/
22
+ * - libs/<name>/
23
+ *
24
+ * Each detected boundary owns a contiguous subtree of files. The TRUE root
25
+ * is the deepest manifest/glob root — so `packages/core/src/lib/foo.ts`
26
+ * belongs to `packages/core/` if a package.json sits there.
27
+ *
28
+ * Boundary `label` is derived from the manifest name (`@scope/pkg` → `pkg`,
29
+ * etc.) when present, else from the root_rel_path segment.
30
+ *
31
+ * Boundary dependencies come from cross-boundary call/import/service edges
32
+ * aggregated across resolved graphs. Strictly advisory — never gates anything.
33
+ */
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.buildBoundaries = buildBoundaries;
39
+ const fs_1 = __importDefault(require("fs"));
40
+ const path_1 = __importDefault(require("path"));
41
+ /**
42
+ * Detect boundaries by walking the workspace once for manifests + convention
43
+ * fallback, then assigning each indexed file to the deepest matching
44
+ * boundary root.
45
+ */
46
+ function buildBoundaries(workspace, store) {
47
+ const absRoot = path_1.default.resolve(workspace);
48
+ // Discover manifest hits.
49
+ const hits = discoverManifests(absRoot);
50
+ // Also seed convention-based hits when no manifest matches a directory.
51
+ seedConventionRoots(absRoot, hits);
52
+ // Materialize hits as boundary defs. De-dup by relRoot — manifest wins
53
+ // over convention.
54
+ const byRel = new Map();
55
+ for (const h of hits) {
56
+ const prev = byRel.get(h.relRoot);
57
+ if (!prev || rank(h) > rank(prev))
58
+ byRel.set(h.relRoot, h);
59
+ }
60
+ const sortedHits = Array.from(byRel.values()).sort((a, b) => b.relRoot.length - a.relRoot.length || (a.relRoot < b.relRoot ? -1 : 1));
61
+ // Assign every indexed file to the deepest matching hit.
62
+ const files = store.listFiles();
63
+ const fileToHit = new Map();
64
+ for (const f of files) {
65
+ let assigned = null;
66
+ const rel = normalizePath(f.relPath);
67
+ for (const h of sortedHits) {
68
+ const root = h.relRoot;
69
+ if (root === '' || root === '.')
70
+ continue;
71
+ if (rel === root || rel.startsWith(root + '/')) {
72
+ assigned = h;
73
+ break;
74
+ }
75
+ }
76
+ fileToHit.set(f.id, assigned);
77
+ }
78
+ // Build boundary list (only include hits that own at least one file).
79
+ const boundariesByRoot = new Map();
80
+ const definitions = [];
81
+ let nextIndex = 0;
82
+ for (const h of sortedHits) {
83
+ const def = {
84
+ label: h.label, kind: h.kind, rootRelPath: h.relRoot,
85
+ manifestPath: h.manifestPath || null, ecosystem: h.ecosystem,
86
+ fileIds: [],
87
+ };
88
+ boundariesByRoot.set(h.relRoot, { ...def, _index: nextIndex });
89
+ nextIndex++;
90
+ }
91
+ for (const [fileId, hit] of fileToHit) {
92
+ if (!hit)
93
+ continue;
94
+ const b = boundariesByRoot.get(hit.relRoot);
95
+ if (!b)
96
+ continue;
97
+ b.fileIds.push(fileId);
98
+ }
99
+ // Drop empty boundaries (e.g. convention `services/` parent with no files).
100
+ for (const b of boundariesByRoot.values()) {
101
+ if (b.fileIds.length === 0)
102
+ continue;
103
+ definitions.push({
104
+ label: b.label, kind: b.kind, rootRelPath: b.rootRelPath,
105
+ manifestPath: b.manifestPath, ecosystem: b.ecosystem, fileIds: b.fileIds,
106
+ });
107
+ }
108
+ // Re-index after dropping.
109
+ const indexByRoot = new Map();
110
+ definitions.forEach((d, i) => indexByRoot.set(d.rootRelPath, i));
111
+ // Build boundary→boundary edges from the resolved file-call / file-import /
112
+ // service-link graphs.
113
+ const edges = aggregateBoundaryEdges(store, fileToHit, indexByRoot);
114
+ let orphan = 0;
115
+ for (const [_id, h] of fileToHit)
116
+ if (!h)
117
+ orphan++;
118
+ return { boundaries: definitions, edges, orphanFiles: orphan };
119
+ }
120
+ function rank(h) {
121
+ // Manifest > convention.
122
+ return h.kind === 'convention' ? 0 : 1;
123
+ }
124
+ function aggregateBoundaryEdges(store, fileToHit, indexByRoot) {
125
+ const buckets = new Map();
126
+ const lookup = (fileId) => {
127
+ const h = fileToHit.get(fileId) ?? null;
128
+ if (!h)
129
+ return null;
130
+ const idx = indexByRoot.get(h.relRoot);
131
+ return idx == null ? null : idx;
132
+ };
133
+ const push = (from, to, kind, weight) => {
134
+ if (from === to)
135
+ return;
136
+ const key = `${from}|${to}|${kind}`;
137
+ const existing = buckets.get(key);
138
+ if (existing)
139
+ existing.weight += weight;
140
+ else
141
+ buckets.set(key, { fromIndex: from, toIndex: to, kind, weight });
142
+ };
143
+ for (const e of store.fileCallEdgeWeights()) {
144
+ const a = lookup(e.from);
145
+ const b = lookup(e.to);
146
+ if (a != null && b != null)
147
+ push(a, b, 'call', e.weight);
148
+ }
149
+ for (const e of store.fileImportEdgeWeights()) {
150
+ const a = lookup(e.from);
151
+ const b = lookup(e.to);
152
+ if (a != null && b != null)
153
+ push(a, b, 'import', e.weight);
154
+ }
155
+ try {
156
+ for (const e of store.fileServiceLinkEdgeWeights()) {
157
+ const a = lookup(e.from);
158
+ const b = lookup(e.to);
159
+ if (a != null && b != null)
160
+ push(a, b, 'service', e.weight);
161
+ }
162
+ }
163
+ catch { /* */ }
164
+ return Array.from(buckets.values()).sort((a, b) => a.fromIndex - b.fromIndex || a.toIndex - b.toIndex || (a.kind < b.kind ? -1 : 1));
165
+ }
166
+ // ── Manifest discovery ──────────────────────────────────────────────────
167
+ function discoverManifests(absRoot) {
168
+ const hits = [];
169
+ // Skip dirs that never own boundaries.
170
+ const SKIP = new Set([
171
+ 'node_modules', '.git', 'dist', 'build', 'out', '.next', '.nuxt',
172
+ 'target', 'obj', '.gradle', '__pycache__', '.cache', '.idea',
173
+ '.vs', '.seer',
174
+ ]);
175
+ function walk(absDir, relDir, depth) {
176
+ if (depth > 6)
177
+ return; // bound recursion — boundaries beyond ~6 levels are rare
178
+ let entries;
179
+ try {
180
+ entries = fs_1.default.readdirSync(absDir);
181
+ }
182
+ catch {
183
+ return;
184
+ }
185
+ const fileSet = new Set(entries);
186
+ let claimed = false;
187
+ // package.json — may declare workspaces.
188
+ if (fileSet.has('package.json')) {
189
+ const manifestRel = relDir === '' ? 'package.json' : `${relDir}/package.json`;
190
+ try {
191
+ const pkg = JSON.parse(fs_1.default.readFileSync(path_1.default.join(absDir, 'package.json'), 'utf8'));
192
+ const label = derivePackageName(pkg, relDir);
193
+ const isRoot = Array.isArray(pkg.workspaces) || (pkg.workspaces && Array.isArray(pkg.workspaces.packages));
194
+ hits.push({
195
+ relRoot: relDir,
196
+ manifestPath: manifestRel,
197
+ label,
198
+ kind: isRoot ? 'workspace-root' : 'package',
199
+ ecosystem: 'npm',
200
+ });
201
+ claimed = true;
202
+ }
203
+ catch { /* */ }
204
+ }
205
+ // pyproject.toml
206
+ if (fileSet.has('pyproject.toml')) {
207
+ const manifestRel = relDir === '' ? 'pyproject.toml' : `${relDir}/pyproject.toml`;
208
+ hits.push({
209
+ relRoot: relDir,
210
+ manifestPath: manifestRel,
211
+ label: derivePyProjectLabel(absDir, relDir),
212
+ kind: 'package',
213
+ ecosystem: 'pypi',
214
+ });
215
+ claimed = true;
216
+ }
217
+ // Cargo.toml
218
+ if (fileSet.has('Cargo.toml')) {
219
+ const manifestRel = relDir === '' ? 'Cargo.toml' : `${relDir}/Cargo.toml`;
220
+ hits.push({
221
+ relRoot: relDir,
222
+ manifestPath: manifestRel,
223
+ label: deriveCargoLabel(absDir, relDir),
224
+ kind: 'package',
225
+ ecosystem: 'cargo',
226
+ });
227
+ claimed = true;
228
+ }
229
+ // go.mod
230
+ if (fileSet.has('go.mod')) {
231
+ const manifestRel = relDir === '' ? 'go.mod' : `${relDir}/go.mod`;
232
+ hits.push({
233
+ relRoot: relDir,
234
+ manifestPath: manifestRel,
235
+ label: deriveGoModuleLabel(absDir, relDir),
236
+ kind: 'package',
237
+ ecosystem: 'go',
238
+ });
239
+ claimed = true;
240
+ }
241
+ // composer.json
242
+ if (fileSet.has('composer.json')) {
243
+ const manifestRel = relDir === '' ? 'composer.json' : `${relDir}/composer.json`;
244
+ hits.push({
245
+ relRoot: relDir,
246
+ manifestPath: manifestRel,
247
+ label: path_1.default.basename(relDir || '.'),
248
+ kind: 'package',
249
+ ecosystem: 'composer',
250
+ });
251
+ claimed = true;
252
+ }
253
+ void claimed;
254
+ // Recurse into subdirectories. Always recurse if THIS level didn't
255
+ // declare a non-root package — that's how packages/<x> work — but DO
256
+ // recurse anyway through workspace-root or convention dirs.
257
+ for (const entry of entries) {
258
+ if (SKIP.has(entry))
259
+ continue;
260
+ const abs = path_1.default.join(absDir, entry);
261
+ let st;
262
+ try {
263
+ st = fs_1.default.statSync(abs);
264
+ }
265
+ catch {
266
+ continue;
267
+ }
268
+ if (!st.isDirectory())
269
+ continue;
270
+ const sub = relDir === '' ? entry : `${relDir}/${entry}`;
271
+ walk(abs, sub, depth + 1);
272
+ }
273
+ }
274
+ walk(absRoot, '', 0);
275
+ return hits;
276
+ }
277
+ function seedConventionRoots(absRoot, hits) {
278
+ // For each <conventionDir>/<sub>/ that exists and isn't already a manifest
279
+ // root, register a fallback boundary so services/* / packages/* still get
280
+ // surfaced even without a manifest.
281
+ const conventionDirs = [
282
+ { dir: 'services', kind: 'service' },
283
+ { dir: 'packages', kind: 'package' },
284
+ { dir: 'apps', kind: 'app' },
285
+ { dir: 'libs', kind: 'lib' },
286
+ ];
287
+ const existingRoots = new Set(hits.map(h => h.relRoot));
288
+ for (const c of conventionDirs) {
289
+ const abs = path_1.default.join(absRoot, c.dir);
290
+ if (!fs_1.default.existsSync(abs))
291
+ continue;
292
+ let entries;
293
+ try {
294
+ entries = fs_1.default.readdirSync(abs);
295
+ }
296
+ catch {
297
+ continue;
298
+ }
299
+ for (const e of entries) {
300
+ const subAbs = path_1.default.join(abs, e);
301
+ try {
302
+ if (!fs_1.default.statSync(subAbs).isDirectory())
303
+ continue;
304
+ }
305
+ catch {
306
+ continue;
307
+ }
308
+ const rel = `${c.dir}/${e}`;
309
+ if (existingRoots.has(rel))
310
+ continue;
311
+ hits.push({
312
+ relRoot: rel,
313
+ manifestPath: '',
314
+ label: e,
315
+ kind: c.kind,
316
+ ecosystem: null,
317
+ });
318
+ }
319
+ }
320
+ }
321
+ function derivePackageName(pkg, relDir) {
322
+ const name = (pkg && pkg.name && typeof pkg.name === 'string') ? pkg.name : null;
323
+ if (!name)
324
+ return path_1.default.basename(relDir || '.');
325
+ // Strip @scope/
326
+ const m = /^@[^/]+\/(.+)$/.exec(name);
327
+ return m ? m[1] : name;
328
+ }
329
+ function derivePyProjectLabel(absDir, relDir) {
330
+ try {
331
+ const text = fs_1.default.readFileSync(path_1.default.join(absDir, 'pyproject.toml'), 'utf8');
332
+ const m = /^\s*name\s*=\s*['"]([^'"]+)['"]/m.exec(text);
333
+ if (m)
334
+ return m[1];
335
+ }
336
+ catch { /* */ }
337
+ return path_1.default.basename(relDir || '.');
338
+ }
339
+ function deriveCargoLabel(absDir, relDir) {
340
+ try {
341
+ const text = fs_1.default.readFileSync(path_1.default.join(absDir, 'Cargo.toml'), 'utf8');
342
+ // Capture [package].name; skip [workspace] sections.
343
+ const pkgSection = /^\s*\[package\][\s\S]*?(?=^\s*\[)/m.exec(text)?.[0] ?? text;
344
+ const m = /^\s*name\s*=\s*['"]([^'"]+)['"]/m.exec(pkgSection);
345
+ if (m)
346
+ return m[1];
347
+ }
348
+ catch { /* */ }
349
+ return path_1.default.basename(relDir || '.');
350
+ }
351
+ function deriveGoModuleLabel(absDir, relDir) {
352
+ try {
353
+ const text = fs_1.default.readFileSync(path_1.default.join(absDir, 'go.mod'), 'utf8');
354
+ const m = /^\s*module\s+([^\s]+)/m.exec(text);
355
+ if (m) {
356
+ // Take the last path segment.
357
+ return path_1.default.basename(m[1]);
358
+ }
359
+ }
360
+ catch { /* */ }
361
+ return path_1.default.basename(relDir || '.');
362
+ }
363
+ function normalizePath(p) {
364
+ return p.replace(/\\/g, '/');
365
+ }
366
+ //# sourceMappingURL=boundaries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boundaries.js","sourceRoot":"","sources":["../../src/indexer/boundaries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { Store } from '../db/store.js';
2
+ export interface ChurnResult {
3
+ filesAnalyzed: number;
4
+ filesWithChurn: number;
5
+ headSha: string | null;
6
+ elapsedMs: number;
7
+ }
8
+ /**
9
+ * File-level git churn pass — populates `file_churn` for every indexed file.
10
+ * Independent of the symbol-history pass: file churn is cheap (~one git log
11
+ * over the whole repo) and useful on its own as a "what's risky to edit"
12
+ * signal even before the per-symbol history pass.
13
+ */
14
+ export declare function collectChurn(repoRoot: string, store: Store): Promise<ChurnResult>;
15
+ //# sourceMappingURL=churn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"churn.d.ts","sourceRoot":"","sources":["../../src/indexer/churn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAGvC,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;GAKG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAyCvF"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectChurn = collectChurn;
4
+ const git_js_1 = require("./git.js");
5
+ /**
6
+ * File-level git churn pass — populates `file_churn` for every indexed file.
7
+ * Independent of the symbol-history pass: file churn is cheap (~one git log
8
+ * over the whole repo) and useful on its own as a "what's risky to edit"
9
+ * signal even before the per-symbol history pass.
10
+ */
11
+ async function collectChurn(repoRoot, store) {
12
+ const start = Date.now();
13
+ if (!(0, git_js_1.isGitRepo)(repoRoot)) {
14
+ return { filesAnalyzed: 0, filesWithChurn: 0, headSha: null, elapsedMs: Date.now() - start };
15
+ }
16
+ const files = store.listFiles();
17
+ if (files.length === 0) {
18
+ return { filesAnalyzed: 0, filesWithChurn: 0, headSha: (0, git_js_1.gitHeadSha)(repoRoot), elapsedMs: Date.now() - start };
19
+ }
20
+ const churn = await (0, git_js_1.collectFileChurn)(repoRoot, files.map(f => f.path));
21
+ let withChurn = 0;
22
+ // Normalize path comparison the same way collectFileChurn does internally.
23
+ const norm = (p) => {
24
+ const n = p.replace(/\\/g, '/');
25
+ return process.platform === 'win32' ? n.toLowerCase() : n;
26
+ };
27
+ const churnByNorm = new Map();
28
+ for (const [k, v] of churn)
29
+ churnByNorm.set(norm(k), v);
30
+ for (const f of files) {
31
+ const stats = churnByNorm.get(norm(f.path));
32
+ if (!stats || stats.commitCount === 0)
33
+ continue;
34
+ store.upsertFileChurn(f.id, stats.commitCount, stats.lastCommitSha, stats.lastCommitAt, stats.topAuthor, stats.secondAuthor);
35
+ withChurn++;
36
+ }
37
+ // Stamp git_index_state with HEAD so detect_changes can compute "since
38
+ // last index" diffs.
39
+ const head = (0, git_js_1.gitHeadSha)(repoRoot);
40
+ const remote = (0, git_js_1.gitRemoteUrl)(repoRoot);
41
+ store.setGitIndexState(repoRoot, head, remote);
42
+ return {
43
+ filesAnalyzed: files.length,
44
+ filesWithChurn: withChurn,
45
+ headSha: head,
46
+ elapsedMs: Date.now() - start,
47
+ };
48
+ }
49
+ //# sourceMappingURL=churn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"churn.js","sourceRoot":"","sources":["../../src/indexer/churn.ts"],"names":[],"mappings":";;AAgBA,oCAyCC;AAxDD,qCAAiF;AASjF;;;;;GAKG;AACI,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAY;IAC/D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,IAAI,CAAC,IAAA,kBAAS,EAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAC/F,CAAC;IACD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,IAAA,mBAAU,EAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;IAC/G,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,IAAA,yBAAgB,EAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,2EAA2E;IAC3E,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE;QACjC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAwC,CAAC;IACpE,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK;QAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAExD,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC;YAAE,SAAS;QAChD,KAAK,CAAC,eAAe,CACnB,CAAC,CAAC,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,EAChE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CACpC,CAAC;QACF,SAAS,EAAE,CAAC;IACd,CAAC;IAED,uEAAuE;IACvE,qBAAqB;IACrB,MAAM,IAAI,GAAG,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,QAAQ,CAAC,CAAC;IACtC,KAAK,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAE/C,OAAO;QACL,aAAa,EAAE,KAAK,CAAC,MAAM;QAC3B,cAAc,EAAE,SAAS;QACzB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK;KAC9B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { FileClassification } from '../db/store.js';
2
+ /**
3
+ * Compute classification flags for a discovered file. The role precedence is
4
+ * vendor → generated → test → project. Vendor wins over generated because a
5
+ * generated file inside a vendor tree is still vendored code we don't own;
6
+ * the `is_generated` flag remains true so users can still query for it.
7
+ */
8
+ export declare function classifyFile(relativePath: string): FileClassification;
9
+ //# sourceMappingURL=classify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/indexer/classify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAY,MAAM,gBAAgB,CAAC;AAuEnE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,kBAAkB,CAkBrE"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.classifyFile = classifyFile;
4
+ /**
5
+ * Classify a discovered file path as project-owned, vendored, generated, or
6
+ * test. The result is stored on `files.role` and used to keep PageRank,
7
+ * top-symbol queries, and search defaults focused on first-party code while
8
+ * still letting users opt into vendored/generated results explicitly.
9
+ *
10
+ * Conservative defaults — when in doubt, return 'project' so we don't quietly
11
+ * hide first-party code. The patterns here are kept tight on purpose; broader
12
+ * heuristics (e.g. "anything inside a directory called `lib`") would cause
13
+ * too many false positives across the polyglot scale-test corpus.
14
+ *
15
+ * The function works purely on the relative path string; no filesystem
16
+ * access. That keeps it cheap to call once per discovered file in the
17
+ * indexer hot loop.
18
+ */
19
+ // Vendored dependency directories at any nesting depth. The discovery layer
20
+ // already excludes most of these from the glob, but a few make it through
21
+ // (e.g. project-local copies of small utilities placed under `lib/vendor/`).
22
+ // We still tag those that get past discovery so the stored classification is
23
+ // useful even on unusual repo layouts.
24
+ const VENDOR_DIR_PATTERNS = [
25
+ /(^|[\\/])vendor[\\/]/i,
26
+ /(^|[\\/])vendored[\\/]/i,
27
+ /(^|[\\/])third[_-]?party[\\/]/i,
28
+ /(^|[\\/])external[\\/]/i,
29
+ /(^|[\\/])node_modules[\\/]/i,
30
+ /(^|[\\/])bower_components[\\/]/i,
31
+ // Common engine-specific vendored locations.
32
+ /(^|[\\/])Engine[\\/]Source[\\/]ThirdParty[\\/]/i,
33
+ ];
34
+ // Generated boilerplate. Filename patterns covering protobuf, Unreal header
35
+ // tool, gRPC, gqlgen, and a handful of common code-generators. We also tag
36
+ // files that live under a `generated/` directory since most projects put
37
+ // emitter output there.
38
+ const GENERATED_DIR_PATTERNS = [
39
+ /(^|[\\/])generated[\\/]/i,
40
+ /(^|[\\/])Generated[\\/]/, // Unreal Engine convention
41
+ /(^|[\\/])\.next[\\/]/,
42
+ /(^|[\\/])\.nuxt[\\/]/,
43
+ /(^|[\\/])__generated__[\\/]/,
44
+ ];
45
+ const GENERATED_FILENAME_PATTERNS = [
46
+ /\.generated\.[a-z]+$/i,
47
+ /\.gen\.[a-z]+$/i,
48
+ /\.pb\.[a-z]+$/i, // protobuf .pb.go / .pb.h / .pb.ts
49
+ /\.pb\.go$/,
50
+ /_pb\.[a-z]+$/i, // gqlgen / Python grpc style
51
+ /\.min\.(js|css)$/i,
52
+ /\.bundle\.js$/i,
53
+ ];
54
+ // Test directories — exposed for completeness even though we don't yet use
55
+ // the 'test' role to filter anywhere. Future work: surface test files in
56
+ // `seer_behavior` as a behavioral contract.
57
+ const TEST_DIR_PATTERNS = [
58
+ /(^|[\\/])tests?[\\/]/i,
59
+ /(^|[\\/])__tests__[\\/]/,
60
+ /(^|[\\/])spec[\\/]/i,
61
+ ];
62
+ const TEST_FILENAME_PATTERNS = [
63
+ /\.test\.[a-z]+$/i,
64
+ /\.spec\.[a-z]+$/i,
65
+ /_test\.[a-z]+$/i, // Go convention: foo_test.go
66
+ ];
67
+ /**
68
+ * Compute classification flags for a discovered file. The role precedence is
69
+ * vendor → generated → test → project. Vendor wins over generated because a
70
+ * generated file inside a vendor tree is still vendored code we don't own;
71
+ * the `is_generated` flag remains true so users can still query for it.
72
+ */
73
+ function classifyFile(relativePath) {
74
+ const isVendor = VENDOR_DIR_PATTERNS.some(p => p.test(relativePath)) ? 1 : 0;
75
+ const isGenerated = (GENERATED_DIR_PATTERNS.some(p => p.test(relativePath)) ||
76
+ GENERATED_FILENAME_PATTERNS.some(p => p.test(relativePath))) ? 1 : 0;
77
+ const isTest = (TEST_DIR_PATTERNS.some(p => p.test(relativePath)) ||
78
+ TEST_FILENAME_PATTERNS.some(p => p.test(relativePath)));
79
+ let role;
80
+ if (isVendor)
81
+ role = 'vendor';
82
+ else if (isGenerated)
83
+ role = 'generated';
84
+ else if (isTest)
85
+ role = 'test';
86
+ else
87
+ role = 'project';
88
+ return { role, isVendor: isVendor, isGenerated: isGenerated };
89
+ }
90
+ //# sourceMappingURL=classify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classify.js","sourceRoot":"","sources":["../../src/indexer/classify.ts"],"names":[],"mappings":";;AA6EA,oCAkBC;AA7FD;;;;;;;;;;;;;;GAcG;AAEH,4EAA4E;AAC5E,0EAA0E;AAC1E,6EAA6E;AAC7E,6EAA6E;AAC7E,uCAAuC;AACvC,MAAM,mBAAmB,GAAG;IAC1B,uBAAuB;IACvB,yBAAyB;IACzB,gCAAgC;IAChC,yBAAyB;IACzB,6BAA6B;IAC7B,iCAAiC;IACjC,6CAA6C;IAC7C,iDAAiD;CAClD,CAAC;AAEF,4EAA4E;AAC5E,2EAA2E;AAC3E,yEAAyE;AACzE,wBAAwB;AACxB,MAAM,sBAAsB,GAAG;IAC7B,0BAA0B;IAC1B,yBAAyB,EAAY,2BAA2B;IAChE,sBAAsB;IACtB,sBAAsB;IACtB,6BAA6B;CAC9B,CAAC;AAEF,MAAM,2BAA2B,GAAG;IAClC,uBAAuB;IACvB,iBAAiB;IACjB,gBAAgB,EAAqB,mCAAmC;IACxE,WAAW;IACX,eAAe,EAAsB,6BAA6B;IAClE,mBAAmB;IACnB,gBAAgB;CACjB,CAAC;AAEF,2EAA2E;AAC3E,yEAAyE;AACzE,4CAA4C;AAC5C,MAAM,iBAAiB,GAAG;IACxB,uBAAuB;IACvB,yBAAyB;IACzB,qBAAqB;CACtB,CAAC;AAEF,MAAM,sBAAsB,GAAG;IAC7B,kBAAkB;IAClB,kBAAkB;IAClB,iBAAiB,EAAoB,6BAA6B;CACnE,CAAC;AAEF;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,YAAoB;IAC/C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,MAAM,WAAW,GAAG,CAClB,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtD,2BAA2B,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAC5D,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACV,MAAM,MAAM,GAAG,CACb,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjD,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CACvD,CAAC;IAEF,IAAI,IAAc,CAAC;IACnB,IAAI,QAAQ;QAAE,IAAI,GAAG,QAAQ,CAAC;SACzB,IAAI,WAAW;QAAE,IAAI,GAAG,WAAW,CAAC;SACpC,IAAI,MAAM;QAAE,IAAI,GAAG,MAAM,CAAC;;QAC1B,IAAI,GAAG,SAAS,CAAC;IAEtB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAiB,EAAE,WAAW,EAAE,WAAoB,EAAE,CAAC;AAClF,CAAC"}