pi-lens 4.3.0 → 4.4.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 (650) hide show
  1. package/CHANGELOG.md +1064 -0
  2. package/README.md +115 -25
  3. package/config/dependency-cruiser-eager-allowlist.json +6 -2
  4. package/dist/chunk-22AVIGXS.js +560 -0
  5. package/dist/chunk-27BBHSZC.js +106 -0
  6. package/dist/chunk-2BEMIWEW.js +51 -0
  7. package/dist/chunk-2EECBNC5.js +89 -0
  8. package/dist/chunk-34U7PLGE.js +23 -0
  9. package/dist/chunk-3I5QFT3N.js +181 -0
  10. package/dist/chunk-3MED75HT.js +37 -0
  11. package/dist/chunk-47D2BO4S.js +87 -0
  12. package/dist/chunk-4RERDEXR.js +348 -0
  13. package/dist/chunk-4W2PLC4J.js +27 -0
  14. package/dist/chunk-52H5B5TC.js +202 -0
  15. package/dist/chunk-54B42YRX.js +27 -0
  16. package/dist/chunk-5RXBNSW2.js +266 -0
  17. package/dist/chunk-5THXD6X5.js +201 -0
  18. package/dist/chunk-5W3R6LFT.js +24 -0
  19. package/dist/chunk-5ZEJHV35.js +341 -0
  20. package/dist/chunk-6P62QVEA.js +118 -0
  21. package/dist/chunk-6QIUX4EP.js +459 -0
  22. package/dist/chunk-6VCD4VKZ.js +78 -0
  23. package/dist/chunk-7F72PXY2.js +326 -0
  24. package/dist/chunk-7FBF7NPR.js +998 -0
  25. package/dist/chunk-7U2IDNXN.js +37 -0
  26. package/dist/chunk-ABBOA7UD.js +157 -0
  27. package/dist/chunk-AHDW3GPE.js +50 -0
  28. package/dist/chunk-AJ3QXTRQ.js +756 -0
  29. package/dist/chunk-AJVLWNFN.js +1610 -0
  30. package/dist/chunk-AJXODZY6.js +112 -0
  31. package/dist/chunk-ARFCXG7S.js +84 -0
  32. package/dist/chunk-AS44CFQ4.js +708 -0
  33. package/dist/chunk-AWE5TMPO.js +38 -0
  34. package/dist/chunk-B3I2UUT4.js +4692 -0
  35. package/dist/chunk-BRJKOBZP.js +331 -0
  36. package/dist/chunk-BW5KFIQC.js +59 -0
  37. package/dist/chunk-C2AUYXQH.js +149 -0
  38. package/dist/chunk-CGGAIP7J.js +29 -0
  39. package/dist/chunk-D6QS3U6M.js +30 -0
  40. package/dist/chunk-DFVMIKMQ.js +349 -0
  41. package/dist/chunk-DIULIWKU.js +169 -0
  42. package/dist/chunk-DQ2NZ7C4.js +2317 -0
  43. package/dist/chunk-E2WFBRHM.js +213 -0
  44. package/dist/chunk-E4MAEDPM.js +50 -0
  45. package/dist/chunk-EOKRQ3SA.js +30 -0
  46. package/dist/chunk-F3AU2TMM.js +2626 -0
  47. package/dist/chunk-F3P7VQ7H.js +170 -0
  48. package/dist/chunk-FC4RP4I2.js +12 -0
  49. package/dist/chunk-FJNKANOS.js +32 -0
  50. package/dist/chunk-GUOGVTCQ.js +146 -0
  51. package/dist/chunk-GVXA6CCE.js +18 -0
  52. package/dist/chunk-HHYAELLJ.js +2334 -0
  53. package/dist/chunk-HMFXILPV.js +83 -0
  54. package/dist/chunk-HVUZXSWK.js +421 -0
  55. package/dist/chunk-HWBZIGMJ.js +62 -0
  56. package/dist/chunk-I3R7GKDR.js +17 -0
  57. package/dist/chunk-I7SPGOWI.js +55 -0
  58. package/dist/chunk-IIXOAGHR.js +38 -0
  59. package/dist/chunk-IVP5KAB7.js +2250 -0
  60. package/dist/chunk-IXEBJSUE.js +22 -0
  61. package/dist/chunk-JOLITGCC.js +27 -0
  62. package/dist/chunk-K6VYLB2U.js +145 -0
  63. package/dist/chunk-LJDODBBZ.js +78 -0
  64. package/dist/chunk-LNAKEO63.js +78 -0
  65. package/dist/chunk-LSMJ6KBE.js +4139 -0
  66. package/dist/chunk-LW6XKDZQ.js +5565 -0
  67. package/dist/chunk-N3YQJI6O.js +899 -0
  68. package/dist/chunk-NABLC7W3.js +148 -0
  69. package/dist/chunk-NKOUFPQF.js +659 -0
  70. package/dist/chunk-NL5GLMFI.js +211 -0
  71. package/dist/chunk-NMABWBZN.js +327 -0
  72. package/dist/chunk-NTHH2J74.js +27 -0
  73. package/dist/chunk-NTUJEGDZ.js +59 -0
  74. package/dist/chunk-NXL4FFQQ.js +47 -0
  75. package/dist/chunk-NXPS2L6U.js +466 -0
  76. package/dist/chunk-O5WILGMI.js +42 -0
  77. package/dist/chunk-O6TQT6RI.js +48 -0
  78. package/dist/chunk-OAXNDZJ7.js +323 -0
  79. package/dist/chunk-ODEEOXPH.js +44 -0
  80. package/dist/chunk-OQGFCZJ4.js +4533 -0
  81. package/dist/chunk-ORTMY4Q4.js +282 -0
  82. package/dist/chunk-OS32RNR2.js +442 -0
  83. package/dist/chunk-PAK6IDME.js +189 -0
  84. package/dist/chunk-PWFHBTSF.js +406 -0
  85. package/dist/chunk-Q5U6FMDI.js +2352 -0
  86. package/dist/chunk-QOZXJ4NA.js +3364 -0
  87. package/dist/chunk-QYF5S6P6.js +45 -0
  88. package/dist/chunk-RIISMHKN.js +36 -0
  89. package/dist/chunk-RPD4ZSB7.js +25 -0
  90. package/dist/chunk-RPD5K5NC.js +79 -0
  91. package/dist/chunk-RUOG5D2C.js +262 -0
  92. package/dist/chunk-T4ERT73Y.js +599 -0
  93. package/dist/chunk-T6D4Q4AQ.js +54 -0
  94. package/dist/chunk-TGPXLY2J.js +391 -0
  95. package/dist/chunk-TLGFBM3F.js +12116 -0
  96. package/dist/chunk-TO6WL3GM.js +88 -0
  97. package/dist/chunk-TT22N74J.js +517 -0
  98. package/dist/chunk-TVN5N6GY.js +21216 -0
  99. package/dist/chunk-U3VGR4VU.js +308 -0
  100. package/dist/chunk-UK3CMEAL.js +1250 -0
  101. package/dist/chunk-UOPVJQ4N.js +103 -0
  102. package/dist/chunk-UXVNL3D7.js +23 -0
  103. package/dist/chunk-UY752QSN.js +45 -0
  104. package/dist/chunk-V5PXFSZK.js +188 -0
  105. package/dist/chunk-V7R425XG.js +398 -0
  106. package/dist/chunk-VCSRSYLF.js +81 -0
  107. package/dist/chunk-VD4JQCQC.js +162 -0
  108. package/dist/chunk-VDBPVIKD.js +62 -0
  109. package/dist/chunk-VHQLPIRJ.js +114 -0
  110. package/dist/chunk-VN2AXLEX.js +5414 -0
  111. package/dist/chunk-VNMT7C64.js +478 -0
  112. package/dist/chunk-WONERJTP.js +309 -0
  113. package/dist/chunk-XECLWQZN.js +85 -0
  114. package/dist/chunk-XIMYZ3JA.js +27 -0
  115. package/dist/chunk-XK4CIILI.js +144 -0
  116. package/dist/chunk-Y4T27COV.js +562 -0
  117. package/dist/chunk-YGVYKNSN.js +1860 -0
  118. package/dist/chunk-YLF3PPT5.js +308 -0
  119. package/dist/chunk-YSNFMJKN.js +14 -0
  120. package/dist/chunk-Z3CCVDUB.js +76 -0
  121. package/dist/chunk-Z54ZSOBZ.js +61 -0
  122. package/dist/chunk-ZAWW3AF6.js +97 -0
  123. package/dist/chunk-ZMOL6RQC.js +167 -0
  124. package/dist/index.js +16456 -8335
  125. package/dist/mcp/analyze-cli.js +186 -232
  126. package/dist/mcp/cli.js +137 -98
  127. package/dist/mcp/server.js +22589 -1573
  128. package/dist/mcp/worker.js +97 -38
  129. package/dist/probes/installer.js +135 -0
  130. package/dist/workers/project-snapshot-persist-worker.js +22 -0
  131. package/dist/workers/review-graph-persist-worker.js +15 -0
  132. package/docs/agent-guide.md +13 -4
  133. package/docs/agent-tools.md +42 -0
  134. package/docs/ast-grep_rules_catalog.md +3 -2
  135. package/docs/configuration.md +20 -1
  136. package/docs/environment-variables.md +52 -2
  137. package/docs/features.md +8 -4
  138. package/docs/globalconfig.md +1 -0
  139. package/docs/io-bridge-v2-migration.md +94 -0
  140. package/docs/lsp-capability-matrix.md +36 -4
  141. package/docs/lsp-idle-eviction.md +124 -0
  142. package/docs/mcp.md +21 -5
  143. package/docs/merge-queue-rollout.md +77 -0
  144. package/docs/pi-lens-fixer.md +156 -88
  145. package/docs/pi-lens-investigator.md +74 -26
  146. package/docs/pi-lens-merge-policy.md +694 -0
  147. package/docs/pi-lens-monitor.md +73 -7
  148. package/docs/pi-lens-retro.md +6 -4
  149. package/docs/pi-lens-reviewer.md +188 -48
  150. package/docs/pi-lens-subagent.md +246 -45
  151. package/docs/pi-lens-warden.md +18 -7
  152. package/docs/public-api-stability.md +55 -0
  153. package/docs/release-qa-baseline.md +84 -17
  154. package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  155. package/docs/servercapabilities.md +53 -49
  156. package/docs/settings.md +1 -0
  157. package/docs/usage.md +5 -1
  158. package/grammars/tree-sitter-bash.wasm +0 -0
  159. package/grammars/tree-sitter-bash.wasm.json +3 -3
  160. package/package.json +19 -7
  161. package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  162. package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  163. package/scripts/analyze-pi-lens-logs.mjs +1275 -62
  164. package/scripts/download-grammars.js +5 -0
  165. package/scripts/grammars.lock.json +6 -1
  166. package/scripts/install-selftest.mjs +33 -34
  167. package/scripts/lib/host-provided-deps.mjs +13 -4
  168. package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  169. package/dist/clients/actionable-warnings-logger.js +0 -35
  170. package/dist/clients/actionable-warnings.js +0 -1610
  171. package/dist/clients/advisory-provenance.js +0 -593
  172. package/dist/clients/agent-behavior-client.js +0 -147
  173. package/dist/clients/agent-nudge.js +0 -325
  174. package/dist/clients/analysed-root.js +0 -1
  175. package/dist/clients/ast-grep-client.js +0 -731
  176. package/dist/clients/ast-grep-rule-manager.js +0 -146
  177. package/dist/clients/ast-grep-tool-logger.js +0 -118
  178. package/dist/clients/ast-grep-types.js +0 -10
  179. package/dist/clients/ast-grep-yaml-synth.js +0 -154
  180. package/dist/clients/atomic-write-staging.js +0 -75
  181. package/dist/clients/atomic-write.js +0 -189
  182. package/dist/clients/availability-probe-flight.js +0 -12
  183. package/dist/clients/bash-file-access.js +0 -1056
  184. package/dist/clients/biome-client.js +0 -357
  185. package/dist/clients/blocker-freshness.js +0 -837
  186. package/dist/clients/blocker-past-eof.js +0 -129
  187. package/dist/clients/bootstrap.js +0 -569
  188. package/dist/clients/bounded-cache.js +0 -190
  189. package/dist/clients/bounded-pid-file-lock.js +0 -202
  190. package/dist/clients/bounded-telemetry.js +0 -295
  191. package/dist/clients/build-identity.js +0 -95
  192. package/dist/clients/bundled-resource-health.js +0 -113
  193. package/dist/clients/bus-events-logger.js +0 -105
  194. package/dist/clients/bus-publish.js +0 -171
  195. package/dist/clients/cache/rule-cache.js +0 -190
  196. package/dist/clients/cache-manager.js +0 -524
  197. package/dist/clients/cache-observability.js +0 -1313
  198. package/dist/clients/call-graph.js +0 -852
  199. package/dist/clients/cargo-manifest.js +0 -422
  200. package/dist/clients/cascade-budget.js +0 -196
  201. package/dist/clients/cascade-format.js +0 -315
  202. package/dist/clients/cascade-logger.js +0 -31
  203. package/dist/clients/cascade-types.js +0 -9
  204. package/dist/clients/child-unref.js +0 -124
  205. package/dist/clients/code-quality-warnings.js +0 -286
  206. package/dist/clients/codebase-model.js +0 -173
  207. package/dist/clients/collateral-test-role.js +0 -40
  208. package/dist/clients/complexity-client.js +0 -462
  209. package/dist/clients/config-core/deny.js +0 -221
  210. package/dist/clients/config-core/index.js +0 -50
  211. package/dist/clients/config-core/merge.js +0 -357
  212. package/dist/clients/config-core/normalize.js +0 -340
  213. package/dist/clients/config-core/process-spec.js +0 -248
  214. package/dist/clients/config-core/provenance.js +0 -164
  215. package/dist/clients/config-core/records.js +0 -218
  216. package/dist/clients/config-core/resolve.js +0 -125
  217. package/dist/clients/config-core/safe-object.js +0 -78
  218. package/dist/clients/config-core/schema.js +0 -165
  219. package/dist/clients/config-diagnostic-codes.js +0 -285
  220. package/dist/clients/config-locations.js +0 -388
  221. package/dist/clients/config-resolve.js +0 -798
  222. package/dist/clients/config-schema.js +0 -251
  223. package/dist/clients/config-warn.js +0 -407
  224. package/dist/clients/console-guard-install.js +0 -26
  225. package/dist/clients/cooperative-budget.js +0 -42
  226. package/dist/clients/dead-code-client.js +0 -510
  227. package/dist/clients/dead-code-logger.js +0 -30
  228. package/dist/clients/deadline-utils.js +0 -280
  229. package/dist/clients/debug-handles.js +0 -211
  230. package/dist/clients/debug-heap.js +0 -174
  231. package/dist/clients/deferred-lsp-work.js +0 -106
  232. package/dist/clients/degradation-ledger.js +0 -426
  233. package/dist/clients/demoted-finding-render.js +0 -169
  234. package/dist/clients/dependency-checker.js +0 -885
  235. package/dist/clients/deps/ast-grep-napi.js +0 -22
  236. package/dist/clients/deps/js-yaml.js +0 -9
  237. package/dist/clients/deps/minimatch.js +0 -4
  238. package/dist/clients/deps/pi-tui.js +0 -14
  239. package/dist/clients/deps/typebox.js +0 -14
  240. package/dist/clients/deps/vscode-jsonrpc.js +0 -1
  241. package/dist/clients/deps/web-tree-sitter.js +0 -24
  242. package/dist/clients/diagnostic-dispositions.js +0 -630
  243. package/dist/clients/diagnostic-line-freshness.js +0 -305
  244. package/dist/clients/diagnostic-logger.js +0 -73
  245. package/dist/clients/diagnostic-tracker.js +0 -105
  246. package/dist/clients/diagnostics-publish.js +0 -230
  247. package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  248. package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  249. package/dist/clients/dispatch/collect-later-tier.js +0 -35
  250. package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  251. package/dist/clients/dispatch/dispatcher.js +0 -1269
  252. package/dist/clients/dispatch/fact-provider-types.js +0 -1
  253. package/dist/clients/dispatch/fact-rule-runner.js +0 -17
  254. package/dist/clients/dispatch/fact-runner.js +0 -30
  255. package/dist/clients/dispatch/fact-scheduler.js +0 -68
  256. package/dist/clients/dispatch/fact-store.js +0 -377
  257. package/dist/clients/dispatch/facts/comment-facts.js +0 -22
  258. package/dist/clients/dispatch/facts/file-content.js +0 -19
  259. package/dist/clients/dispatch/facts/function-facts.js +0 -348
  260. package/dist/clients/dispatch/facts/import-facts.js +0 -204
  261. package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  262. package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  263. package/dist/clients/dispatch/finding-policy.js +0 -339
  264. package/dist/clients/dispatch/indent-detect.js +0 -417
  265. package/dist/clients/dispatch/inline-suppressions.js +0 -89
  266. package/dist/clients/dispatch/integration.js +0 -2377
  267. package/dist/clients/dispatch/lazy.js +0 -11
  268. package/dist/clients/dispatch/pending-runner-findings.js +0 -87
  269. package/dist/clients/dispatch/plan.js +0 -278
  270. package/dist/clients/dispatch/priorities.js +0 -20
  271. package/dist/clients/dispatch/rule-id-normalize.js +0 -50
  272. package/dist/clients/dispatch/rule-ignores.js +0 -69
  273. package/dist/clients/dispatch/rule-policy.js +0 -135
  274. package/dist/clients/dispatch/rules/async-noise.js +0 -40
  275. package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  276. package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  277. package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  278. package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  279. package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  280. package/dist/clients/dispatch/rules/high-complexity.js +0 -72
  281. package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  282. package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  283. package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  284. package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  285. package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  286. package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  287. package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  288. package/dist/clients/dispatch/runner-context.js +0 -52
  289. package/dist/clients/dispatch/runners/actionlint.js +0 -111
  290. package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  291. package/dist/clients/dispatch/runners/biome-check.js +0 -296
  292. package/dist/clients/dispatch/runners/cpp-check.js +0 -219
  293. package/dist/clients/dispatch/runners/credo.js +0 -82
  294. package/dist/clients/dispatch/runners/cue-vet.js +0 -416
  295. package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  296. package/dist/clients/dispatch/runners/detekt.js +0 -176
  297. package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  298. package/dist/clients/dispatch/runners/elixir-check.js +0 -195
  299. package/dist/clients/dispatch/runners/eslint.js +0 -137
  300. package/dist/clients/dispatch/runners/fact-rules.js +0 -29
  301. package/dist/clients/dispatch/runners/fish-indent.js +0 -69
  302. package/dist/clients/dispatch/runners/gleam-check.js +0 -167
  303. package/dist/clients/dispatch/runners/go-vet.js +0 -104
  304. package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  305. package/dist/clients/dispatch/runners/hadolint.js +0 -91
  306. package/dist/clients/dispatch/runners/helm-lint.js +0 -171
  307. package/dist/clients/dispatch/runners/helm-render.js +0 -940
  308. package/dist/clients/dispatch/runners/htmlhint.js +0 -117
  309. package/dist/clients/dispatch/runners/index.js +0 -108
  310. package/dist/clients/dispatch/runners/javac.js +0 -99
  311. package/dist/clients/dispatch/runners/ktlint.js +0 -110
  312. package/dist/clients/dispatch/runners/lsp.js +0 -379
  313. package/dist/clients/dispatch/runners/markdownlint.js +0 -167
  314. package/dist/clients/dispatch/runners/mypy.js +0 -102
  315. package/dist/clients/dispatch/runners/oxlint.js +0 -414
  316. package/dist/clients/dispatch/runners/php-lint.js +0 -85
  317. package/dist/clients/dispatch/runners/phpstan.js +0 -120
  318. package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  319. package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  320. package/dist/clients/dispatch/runners/pyright.js +0 -169
  321. package/dist/clients/dispatch/runners/rubocop.js +0 -99
  322. package/dist/clients/dispatch/runners/ruff.js +0 -88
  323. package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  324. package/dist/clients/dispatch/runners/shellcheck.js +0 -173
  325. package/dist/clients/dispatch/runners/shfmt.js +0 -102
  326. package/dist/clients/dispatch/runners/spellcheck.js +0 -128
  327. package/dist/clients/dispatch/runners/spotbugs.js +0 -259
  328. package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  329. package/dist/clients/dispatch/runners/stylelint.js +0 -166
  330. package/dist/clients/dispatch/runners/swiftlint.js +0 -163
  331. package/dist/clients/dispatch/runners/taplo.js +0 -174
  332. package/dist/clients/dispatch/runners/terragrunt.js +0 -168
  333. package/dist/clients/dispatch/runners/tflint.js +0 -125
  334. package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  335. package/dist/clients/dispatch/runners/trivy-config.js +0 -253
  336. package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  337. package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  338. package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  339. package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  340. package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  341. package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  342. package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  343. package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  344. package/dist/clients/dispatch/runners/utils.js +0 -15
  345. package/dist/clients/dispatch/runners/vale.js +0 -128
  346. package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  347. package/dist/clients/dispatch/runners/yamllint.js +0 -95
  348. package/dist/clients/dispatch/runners/zig-check.js +0 -79
  349. package/dist/clients/dispatch/suppress-writer.js +0 -79
  350. package/dist/clients/dispatch/tool-profile.js +0 -30
  351. package/dist/clients/dispatch/types.js +0 -21
  352. package/dist/clients/dispatch/utils/format-utils.js +0 -45
  353. package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  354. package/dist/clients/disposition-logger.js +0 -32
  355. package/dist/clients/disposition-publish.js +0 -124
  356. package/dist/clients/durable-store.js +0 -97
  357. package/dist/clients/effective-config.js +0 -415
  358. package/dist/clients/env-utils.js +0 -83
  359. package/dist/clients/error-class.js +0 -23
  360. package/dist/clients/eval-timestamp.js +0 -17
  361. package/dist/clients/event-loop-hold.js +0 -274
  362. package/dist/clients/event-loop-monitor.js +0 -250
  363. package/dist/clients/extension-log.js +0 -504
  364. package/dist/clients/extension-mode.js +0 -73
  365. package/dist/clients/feature-hints.js +0 -103
  366. package/dist/clients/file-kinds.js +0 -412
  367. package/dist/clients/file-role.js +0 -134
  368. package/dist/clients/file-time.js +0 -160
  369. package/dist/clients/file-utils.js +0 -1032
  370. package/dist/clients/finding-delivery-gate.js +0 -494
  371. package/dist/clients/finding-identity.js +0 -88
  372. package/dist/clients/fix-worklog.js +0 -103
  373. package/dist/clients/format-events-publish.js +0 -343
  374. package/dist/clients/format-service.js +0 -222
  375. package/dist/clients/formatters-lazy.js +0 -9
  376. package/dist/clients/formatters.js +0 -2032
  377. package/dist/clients/freshness-cadence.js +0 -17
  378. package/dist/clients/freshness.js +0 -38
  379. package/dist/clients/generated-artifacts.js +0 -394
  380. package/dist/clients/generation-guard.js +0 -215
  381. package/dist/clients/git-guard.js +0 -1136
  382. package/dist/clients/git-tracked-ignore.js +0 -243
  383. package/dist/clients/gitleaks-client.js +0 -509
  384. package/dist/clients/go-client.js +0 -104
  385. package/dist/clients/govulncheck-client.js +0 -605
  386. package/dist/clients/gradle-ktfmt-style.js +0 -348
  387. package/dist/clients/grammar-source.js +0 -465
  388. package/dist/clients/gzip-stage-write.js +0 -135
  389. package/dist/clients/hashline-anchor.js +0 -424
  390. package/dist/clients/hook-budgets.js +0 -76
  391. package/dist/clients/host-edit-normalize.js +0 -140
  392. package/dist/clients/host-ports.js +0 -39
  393. package/dist/clients/indent-retarget.js +0 -154
  394. package/dist/clients/inline-blocker-dispositions.js +0 -186
  395. package/dist/clients/install-diagnostics.js +0 -156
  396. package/dist/clients/installer/index.js +0 -5416
  397. package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  398. package/dist/clients/installer/managed-tool-refresh.js +0 -783
  399. package/dist/clients/instance-reaper-state.js +0 -7
  400. package/dist/clients/instance-reaper.js +0 -1137
  401. package/dist/clients/instance-registry-lock.js +0 -145
  402. package/dist/clients/instance-registry.js +0 -773
  403. package/dist/clients/jscpd-client.js +0 -378
  404. package/dist/clients/json-cache-read.js +0 -65
  405. package/dist/clients/knip-client.js +0 -788
  406. package/dist/clients/language-policy.js +0 -252
  407. package/dist/clients/language-profile.js +0 -361
  408. package/dist/clients/language-registry.js +0 -603
  409. package/dist/clients/latency-logger.js +0 -727
  410. package/dist/clients/lazy-import.js +0 -21
  411. package/dist/clients/ledger-bounds.js +0 -54
  412. package/dist/clients/lens-config.js +0 -404
  413. package/dist/clients/lens-engine.js +0 -358
  414. package/dist/clients/lens-events.js +0 -125
  415. package/dist/clients/lens-flag-registry.js +0 -467
  416. package/dist/clients/lens-map.js +0 -1156
  417. package/dist/clients/live-bus-emitter.js +0 -74
  418. package/dist/clients/log-cleanup.js +0 -222
  419. package/dist/clients/lsp/aggregation.js +0 -178
  420. package/dist/clients/lsp/cascade-tier.js +0 -421
  421. package/dist/clients/lsp/client.js +0 -4593
  422. package/dist/clients/lsp/config.js +0 -691
  423. package/dist/clients/lsp/content-limits.js +0 -41
  424. package/dist/clients/lsp/diagnostic-binding.js +0 -225
  425. package/dist/clients/lsp/document-drift.js +0 -467
  426. package/dist/clients/lsp/edits.js +0 -1219
  427. package/dist/clients/lsp/index.js +0 -8305
  428. package/dist/clients/lsp/inferred-project.js +0 -216
  429. package/dist/clients/lsp/jvm-runtime.js +0 -298
  430. package/dist/clients/lsp/language.js +0 -63
  431. package/dist/clients/lsp/launch.js +0 -746
  432. package/dist/clients/lsp/lombok.js +0 -158
  433. package/dist/clients/lsp/path-utils.js +0 -5
  434. package/dist/clients/lsp/pending-aux-coverage.js +0 -251
  435. package/dist/clients/lsp/position-encoding.js +0 -61
  436. package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  437. package/dist/clients/lsp/server.js +0 -3290
  438. package/dist/clients/lsp/session-roots.js +0 -192
  439. package/dist/clients/lsp/spawn-history.js +0 -17
  440. package/dist/clients/lsp/sync-kind.js +0 -56
  441. package/dist/clients/lsp/tsserver-sync.js +0 -332
  442. package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  443. package/dist/clients/lsp/wait-policy/classification.js +0 -85
  444. package/dist/clients/lsp/wait-policy/index.js +0 -10
  445. package/dist/clients/lsp/wait-policy/strategies.js +0 -392
  446. package/dist/clients/lsp/watch-queue.js +0 -61
  447. package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  448. package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  449. package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  450. package/dist/clients/lsp-budget.js +0 -186
  451. package/dist/clients/lsp-document-symbols.js +0 -110
  452. package/dist/clients/lsp-lazy.js +0 -9
  453. package/dist/clients/lsp-mutation.js +0 -396
  454. package/dist/clients/lsp-status.js +0 -59
  455. package/dist/clients/map-with-concurrency.js +0 -40
  456. package/dist/clients/mcp/analyze.js +0 -420
  457. package/dist/clients/mcp/host-shim.js +0 -31
  458. package/dist/clients/mcp/ipc.js +0 -523
  459. package/dist/clients/mcp/review.js +0 -197
  460. package/dist/clients/mcp/session.js +0 -412
  461. package/dist/clients/memory-sampler.js +0 -208
  462. package/dist/clients/message-end-attribution.js +0 -30
  463. package/dist/clients/metrics-client.js +0 -107
  464. package/dist/clients/metrics-history.js +0 -327
  465. package/dist/clients/middle-man-analysis.js +0 -263
  466. package/dist/clients/model-provider.js +0 -53
  467. package/dist/clients/module-report-lsp.js +0 -189
  468. package/dist/clients/module-report.js +0 -2150
  469. package/dist/clients/mutating-tool.js +0 -651
  470. package/dist/clients/mutation-attribution.js +0 -368
  471. package/dist/clients/mutation-bridge.js +0 -240
  472. package/dist/clients/ndjson-logger.js +0 -734
  473. package/dist/clients/observed-mutation-sources.js +0 -101
  474. package/dist/clients/observed-mutation.js +0 -1253
  475. package/dist/clients/oldtext-autopatch.js +0 -128
  476. package/dist/clients/opaque-mutation-scan.js +0 -496
  477. package/dist/clients/opengrep-client.js +0 -333
  478. package/dist/clients/opengrep-config.js +0 -76
  479. package/dist/clients/package-manager.js +0 -607
  480. package/dist/clients/package-root.js +0 -38
  481. package/dist/clients/partial-edit-apply.js +0 -439
  482. package/dist/clients/path-attribution-telemetry.js +0 -43
  483. package/dist/clients/path-keyed-map.js +0 -108
  484. package/dist/clients/path-utils.js +0 -1244
  485. package/dist/clients/performance-report.js +0 -331
  486. package/dist/clients/persist-debounce.js +0 -70
  487. package/dist/clients/persistent-reverify.js +0 -271
  488. package/dist/clients/php-cs-fixer-config.js +0 -119
  489. package/dist/clients/pipeline.js +0 -1480
  490. package/dist/clients/post-autofix-notice.js +0 -37
  491. package/dist/clients/print-mode.js +0 -21
  492. package/dist/clients/probe-home-state.js +0 -228
  493. package/dist/clients/process-bridge.js +0 -66
  494. package/dist/clients/process-singletons.js +0 -210
  495. package/dist/clients/process-snapshot.js +0 -68
  496. package/dist/clients/project-changes.js +0 -181
  497. package/dist/clients/project-conventions.js +0 -171
  498. package/dist/clients/project-diagnostics/cache.js +0 -137
  499. package/dist/clients/project-diagnostics/extractors.js +0 -109
  500. package/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  501. package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  502. package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  503. package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  504. package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  505. package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  506. package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  507. package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  508. package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  509. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  510. package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  511. package/dist/clients/project-diagnostics/scanner.js +0 -520
  512. package/dist/clients/project-diagnostics/types.js +0 -1
  513. package/dist/clients/project-lens-config.js +0 -807
  514. package/dist/clients/project-report.js +0 -701
  515. package/dist/clients/project-scale.js +0 -237
  516. package/dist/clients/project-scan-policy.js +0 -11
  517. package/dist/clients/project-snapshot-fingerprint.js +0 -48
  518. package/dist/clients/project-snapshot-persist-worker.js +0 -20
  519. package/dist/clients/project-snapshot.js +0 -1653
  520. package/dist/clients/project-trust.js +0 -181
  521. package/dist/clients/python-environment.js +0 -217
  522. package/dist/clients/python-provenance.js +0 -639
  523. package/dist/clients/quiet-window-config.js +0 -47
  524. package/dist/clients/quiet-window.js +0 -236
  525. package/dist/clients/read-bridge.js +0 -139
  526. package/dist/clients/read-expansion.js +0 -266
  527. package/dist/clients/read-guard-logger.js +0 -251
  528. package/dist/clients/read-guard-tool-lines.js +0 -1306
  529. package/dist/clients/read-guard.js +0 -1561
  530. package/dist/clients/recent-touches.js +0 -240
  531. package/dist/clients/redact/secrets.js +0 -449
  532. package/dist/clients/resource-sampler.js +0 -628
  533. package/dist/clients/reverse-deps.js +0 -270
  534. package/dist/clients/review-graph/builder.js +0 -5126
  535. package/dist/clients/review-graph/format.js +0 -33
  536. package/dist/clients/review-graph/git-identity.js +0 -163
  537. package/dist/clients/review-graph/import-resolvers.js +0 -481
  538. package/dist/clients/review-graph/persist-worker.js +0 -10
  539. package/dist/clients/review-graph/query.js +0 -244
  540. package/dist/clients/review-graph/revision-drift.js +0 -21
  541. package/dist/clients/review-graph/service.js +0 -96
  542. package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  543. package/dist/clients/review-graph/symbol-id.js +0 -103
  544. package/dist/clients/review-graph/tsconfig-paths.js +0 -299
  545. package/dist/clients/review-graph/types.js +0 -1
  546. package/dist/clients/review-graph/workspace-modules.js +0 -449
  547. package/dist/clients/review-graph-logger.js +0 -81
  548. package/dist/clients/ruff-client.js +0 -179
  549. package/dist/clients/rules-scanner.js +0 -131
  550. package/dist/clients/run-duration.js +0 -55
  551. package/dist/clients/runtime-agent-end.js +0 -746
  552. package/dist/clients/runtime-config.js +0 -77
  553. package/dist/clients/runtime-context.js +0 -211
  554. package/dist/clients/runtime-coordinator.js +0 -1324
  555. package/dist/clients/runtime-session.js +0 -2485
  556. package/dist/clients/runtime-tool-call.js +0 -1295
  557. package/dist/clients/runtime-tool-result.js +0 -2049
  558. package/dist/clients/runtime-turn.js +0 -3767
  559. package/dist/clients/rust-client.js +0 -97
  560. package/dist/clients/safe-spawn.js +0 -2357
  561. package/dist/clients/sanitize.js +0 -286
  562. package/dist/clients/scan-utils.js +0 -25
  563. package/dist/clients/scratch-tree-policy.js +0 -165
  564. package/dist/clients/search-read-registration.js +0 -94
  565. package/dist/clients/secret-findings.js +0 -114
  566. package/dist/clients/security-scan-client.js +0 -352
  567. package/dist/clients/session-event-guard.js +0 -297
  568. package/dist/clients/session-lifecycle.js +0 -484
  569. package/dist/clients/session-start-observability.js +0 -94
  570. package/dist/clients/session-state-store.js +0 -101
  571. package/dist/clients/session-summary.js +0 -15
  572. package/dist/clients/sessionstart-logger.js +0 -27
  573. package/dist/clients/sg-runner.js +0 -876
  574. package/dist/clients/sgconfig.js +0 -347
  575. package/dist/clients/shared-checkout-guard.js +0 -338
  576. package/dist/clients/single-flight.js +0 -158
  577. package/dist/clients/situational-tool-telemetry.js +0 -108
  578. package/dist/clients/skills-resolver.js +0 -141
  579. package/dist/clients/slow-fs.js +0 -138
  580. package/dist/clients/smells-rollup.js +0 -231
  581. package/dist/clients/source-filter.js +0 -596
  582. package/dist/clients/source-walker.js +0 -211
  583. package/dist/clients/spawn-output-cap.js +0 -120
  584. package/dist/clients/spawn-timeout-cooldown.js +0 -110
  585. package/dist/clients/stale-marker.js +0 -17
  586. package/dist/clients/startup-scan.js +0 -400
  587. package/dist/clients/startup-timing.js +0 -130
  588. package/dist/clients/string-utils.js +0 -33
  589. package/dist/clients/subagent-mode.js +0 -111
  590. package/dist/clients/symbol-containment.js +0 -24
  591. package/dist/clients/symbol-types.js +0 -5
  592. package/dist/clients/test-runner-client.js +0 -2507
  593. package/dist/clients/test-runner-delivery.js +0 -287
  594. package/dist/clients/todo-scanner.js +0 -229
  595. package/dist/clients/tool-agreement.js +0 -423
  596. package/dist/clients/tool-config.js +0 -249
  597. package/dist/clients/tool-cwd.js +0 -270
  598. package/dist/clients/tool-definition.js +0 -47
  599. package/dist/clients/tool-event.js +0 -105
  600. package/dist/clients/tool-policy.js +0 -2755
  601. package/dist/clients/tool-probe.js +0 -53
  602. package/dist/clients/tool-render.js +0 -156
  603. package/dist/clients/tool-set-policy.js +0 -118
  604. package/dist/clients/tree-sitter-cache.js +0 -364
  605. package/dist/clients/tree-sitter-client.js +0 -4195
  606. package/dist/clients/tree-sitter-logger.js +0 -100
  607. package/dist/clients/tree-sitter-navigator.js +0 -269
  608. package/dist/clients/tree-sitter-query-loader.js +0 -569
  609. package/dist/clients/tree-sitter-shared.js +0 -158
  610. package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  611. package/dist/clients/trivy-client.js +0 -467
  612. package/dist/clients/tui-fit.js +0 -50
  613. package/dist/clients/turn-context.js +0 -52
  614. package/dist/clients/turn-end/lane.js +0 -51
  615. package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  616. package/dist/clients/turn-end/lanes/secrets.js +0 -204
  617. package/dist/clients/turn-summary-render.js +0 -72
  618. package/dist/clients/turn-summary.js +0 -132
  619. package/dist/clients/typos-config.js +0 -29
  620. package/dist/clients/user-notify.js +0 -51
  621. package/dist/clients/vanished-instance-marker.js +0 -57
  622. package/dist/clients/warm-attach.js +0 -305
  623. package/dist/clients/widget-state.js +0 -1808
  624. package/dist/clients/word-index-logger.js +0 -49
  625. package/dist/clients/word-index-store.js +0 -459
  626. package/dist/clients/word-index.js +0 -2080
  627. package/dist/clients/workspace-topology.js +0 -443
  628. package/dist/clients/write-ordering-guard.js +0 -65
  629. package/dist/clients/zizmor-config.js +0 -340
  630. package/dist/i18n.js +0 -69
  631. package/dist/mcp/build-staleness.js +0 -124
  632. package/dist/scripts/lib/process-scan.mjs +0 -583
  633. package/dist/scripts/lib/skills-predicate.mjs +0 -129
  634. package/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  635. package/dist/tools/activate-tools.js +0 -87
  636. package/dist/tools/ast-grep-outline.js +0 -137
  637. package/dist/tools/ast-grep-replace.js +0 -244
  638. package/dist/tools/ast-grep-search.js +0 -762
  639. package/dist/tools/effective-config.js +0 -90
  640. package/dist/tools/lens-diagnostic-mark.js +0 -375
  641. package/dist/tools/lens-diagnostics.js +0 -2571
  642. package/dist/tools/lsp-diagnostics.js +0 -1745
  643. package/dist/tools/lsp-navigation.js +0 -1367
  644. package/dist/tools/lsp-structured-output.js +0 -294
  645. package/dist/tools/module-report.js +0 -382
  646. package/dist/tools/project-report.js +0 -86
  647. package/dist/tools/render-compact.js +0 -374
  648. package/dist/tools/scan-progress.js +0 -53
  649. package/dist/tools/shared.js +0 -29
  650. package/dist/tools/symbol-search.js +0 -155
@@ -1,569 +0,0 @@
1
- /**
2
- * Tree-sitter Query Loader
3
- *
4
- * Loads tree-sitter queries from YAML files in rules/tree-sitter-queries/
5
- * and provides them to the TreeSitterClient.
6
- */
7
- import { logTreeSitterDiagnostic } from "./tree-sitter-logger.js";
8
- import * as fs from "node:fs";
9
- import * as path from "node:path";
10
- import { classifyBundledResourceDir, reportBundledResourceDirHealth, } from "./bundled-resource-health.js";
11
- import { getDegradationLedgerGeneration, recordDegradationOnce, } from "./degradation-ledger.js";
12
- import yaml from "./deps/js-yaml.js";
13
- import { resolvePackagePath } from "./package-root.js";
14
- /**
15
- * The bundled `rules/tree-sitter-queries` root — the ONE spelling of this
16
- * path, imported by `clients/cache/rule-cache.ts` (re-exported there as
17
- * `BUNDLED_RULES_ROOT`, #2636 review F4) rather than computed a second time,
18
- * so the "one ledger row, not two" claim for `tree-sitter-queries-dir-missing`
19
- * rests on reference equality, not merely two independently-resolved strings
20
- * that happen to match.
21
- */
22
- export const BUNDLED_QUERIES_ROOT = resolvePackagePath(import.meta.url, "rules", "tree-sitter-queries");
23
- let cachedBundledQueriesRootHealth;
24
- let cachedBundledQueriesRootHealthGeneration;
25
- /**
26
- * #2636 review F6/round-2 F3: memoized, but keyed on the degradation
27
- * ledger's OWN generation counter (bumped by `resetDegradationLedger`, wired
28
- * into `handleSessionStart`) rather than "compute once, forever" — round 1's
29
- * version overclaimed that the underlying fact "cannot change mid-process
30
- * any more than the package's own install location can", but a managed
31
- * extension cache RELOCATING a live install mid-process is exactly the
32
- * failure #2587/#2626 investigated: a permanently-cached "absent" verdict
33
- * from the FIRST probe would never notice the directory coming back (or
34
- * disappearing later), the same silent-zero shape this issue exists to end.
35
- * Re-probing once per SESSION (not once per call) is the right middle
36
- * ground: a real, measured `readdirSync` cost (4.2 µs) is paid once per
37
- * session rather than on every dispatched file — same generation-keyed
38
- * pattern `clients/ast-grep-client.ts`'s `ensureRulesHealthReported` uses
39
- * for its own per-instance re-check.
40
- */
41
- export function getBundledQueriesRootHealth() {
42
- const generation = getDegradationLedgerGeneration();
43
- if (cachedBundledQueriesRootHealth === undefined ||
44
- cachedBundledQueriesRootHealthGeneration !== generation) {
45
- cachedBundledQueriesRootHealthGeneration = generation;
46
- cachedBundledQueriesRootHealth =
47
- classifyBundledResourceDir(BUNDLED_QUERIES_ROOT);
48
- }
49
- return cachedBundledQueriesRootHealth;
50
- }
51
- /** Test-only: clear the memo so a scenario can simulate a different install layout. */
52
- export function _resetBundledQueriesRootHealthForTests() {
53
- cachedBundledQueriesRootHealth = undefined;
54
- cachedBundledQueriesRootHealthGeneration = undefined;
55
- }
56
- export function isDisabledQueryDirectoryName(name) {
57
- return name.endsWith("-disabled");
58
- }
59
- export function getQueryLanguageKey(directoryName) {
60
- return isDisabledQueryDirectoryName(directoryName)
61
- ? directoryName.slice(0, -"-disabled".length)
62
- : directoryName;
63
- }
64
- /**
65
- * Languages that inherit the typescript rule set on top of their own.
66
- *
67
- * ONLY `tsx`: verified rule-for-rule identical on the same source parsed under
68
- * both grammars (console-statement 16/16, ts-path-traversal 277/277, …), which
69
- * makes sense — tsx IS typescript plus JSX. `javascript` is deliberately NOT
70
- * here. It looks like it should be, and the merge existed for years, but the
71
- * queries were compiled against the typescript grammar and run against
72
- * javascript trees, so they matched nothing and nobody noticed. Compiled
73
- * correctly they misfire: JS parameters are bare `(identifier)` where
74
- * typescript has `required_parameter`, so `duplicate-function-arg` alone
75
- * reports 59 phantom duplicates across 60 files. Re-enabling it needs the
76
- * typescript rules validated against the javascript grammar first.
77
- */
78
- const TYPESCRIPT_RULE_HEIRS = new Set(["tsx"]);
79
- /**
80
- * The rule-source languages whose directories make up the effective rule set
81
- * for a file parsed as `languageId`. This is the SINGLE SOURCE OF TRUTH for
82
- * rule-set composition: `queriesForLanguage` (selection) and
83
- * `ruleFilesForLanguage` (the RuleCache fingerprint, #878) both derive from
84
- * it, so the cache key can never drift from the rules the runner actually runs.
85
- */
86
- export function ruleSourceLanguages(languageId) {
87
- return TYPESCRIPT_RULE_HEIRS.has(languageId)
88
- ? [languageId, "typescript"]
89
- : [languageId];
90
- }
91
- /**
92
- * Every rule file contributing to the effective rule set for `languageId`,
93
- * from BOTH the project's own `rules/tree-sitter-queries/` tree and the
94
- * bundled built-ins, across every rule-source language.
95
- *
96
- * The dispatch runner hashes this list into the RuleCache key. Fingerprinting
97
- * only the language's OWN directory missed inherited rule sets — tsx runs the
98
- * typescript rules too, so editing a typescript rule never invalidated the tsx
99
- * cache and stale compiled rules kept firing until the process restarted or a
100
- * tsx rule happened to change (#878).
101
- */
102
- export function ruleFilesForLanguage(languageId, rootDir = process.cwd()) {
103
- const resolvedRoot = path.resolve(rootDir);
104
- const files = new Set();
105
- for (const lang of ruleSourceLanguages(languageId)) {
106
- for (const dir of [
107
- path.join(resolvedRoot, "rules", "tree-sitter-queries", lang),
108
- path.join(BUNDLED_QUERIES_ROOT, lang),
109
- ]) {
110
- if (!fs.existsSync(dir))
111
- continue;
112
- for (const f of fs.readdirSync(dir)) {
113
- if (f.endsWith(".yml"))
114
- files.add(path.join(dir, f));
115
- }
116
- }
117
- }
118
- // #2636 (review F2): a language resolving zero files here is NORMAL when
119
- // nobody has authored bundled/project queries for it — seven REACHABLE
120
- // grammars have none by design: bash, dart, elixir, lua, ocaml, swift, zig
121
- // (`.sh`/`.bash`, `.dart`, `.ex`/`.exs`, `.lua`, `.ml`/`.mli`, `.swift`,
122
- // `.zig` — see `language-registry.ts`'s `EXTENSION_TO_GRAMMAR`). cobol and
123
- // plsql are NOT in that registry at all — only their `-disabled` query
124
- // directories exist — so `ruleFilesForLanguage` never actually resolves
125
- // those two languageIds in production; they are not examples of this
126
- // case. A BUG looks identical from an empty `files` set alone: the
127
- // bundled root itself relocated out from under the package (same
128
- // managed-cache-relocation shape #2626 fixed for skills/). Only pay for
129
- // the extra classification in this COLD branch (never on the common,
130
- // non-empty path), key it on the shared ROOT rather than this call's
131
- // `languageId` (every language hitting an actually-missing root collapses
132
- // into the SAME ledger row instead of one per language), and only RECORD
133
- // when the root is actually unhealthy — one of the seven by-design-empty
134
- // languages is touched routinely (any `.sh`/`.lua` edit).
135
- //
136
- // #2636 review round 2, F2: NO separate phase/latency row here (unlike
137
- // the ast-grep/skills sibling sites, which log one PER CONSTRUCTION or
138
- // PER REQUEST — a bounded cardinality). This branch runs on EVERY
139
- // dispatched file while the root stays broken (AGENTS.md's "no raw
140
- // per-occurrence log for repeats"): 200 touches of a by-design-empty
141
- // language against a broken root would otherwise write 200 raw
142
- // `latency.log` rows. `reportBundledResourceDirHealth`'s
143
- // `incrementDegradationCount` already answers "did this run" AND "how
144
- // many times" in a BOUNDED way — one row per session at count 1, then
145
- // only at power-of-two milestones (1, 2, 4, 8, … so 200 occurrences write
146
- // exactly 8 durable rows) — so a second, unbounded record here would add
147
- // nothing the ledger row lacks.
148
- if (files.size === 0) {
149
- const health = getBundledQueriesRootHealth();
150
- if (health.status !== "healthy") {
151
- reportBundledResourceDirHealth("tree-sitter-queries-dir-missing", BUNDLED_QUERIES_ROOT, health, "bundled tree-sitter query rules");
152
- }
153
- }
154
- return [...files];
155
- }
156
- /**
157
- * The rule set that applies to a file parsed as `languageId`, in a stable order.
158
- *
159
- * Excludes `<language>-disabled/` rules. `getQueriesForLanguage` filtered these
160
- * for the per-edit runner, but the project scanner read the raw loader map and
161
- * ran them anyway — 1,936 of a scan's 2,590 tree-sitter findings came from
162
- * rules somebody had explicitly switched off.
163
- */
164
- export function queriesForLanguage(queries, languageId) {
165
- const enabled = (langId) => (queries.get(langId) ?? []).filter((q) => !isDisabledQueryFilePath(q.filePath));
166
- return ruleSourceLanguages(languageId).flatMap((langId) => enabled(langId));
167
- }
168
- /**
169
- * Coerce a parsed YAML scalar to a string, refusing a mapping or array.
170
- * `String({})`/`String([])` silently produce the literal text
171
- * `"[object Object]"`/`"a,b"` — SonarCloud typescript:S6551 flagged this at
172
- * every scalar field in `parseQueryFile` once `parseYaml` widened to
173
- * `Record<string, unknown>` (#3054 review F2). Returns `undefined` for
174
- * `null`/`undefined`/a non-scalar so call sites keep using `||`/`??` for
175
- * defaults exactly as the old `String(x || fallback)` calls did.
176
- */
177
- function str(value) {
178
- return typeof value === "string" ||
179
- typeof value === "number" ||
180
- typeof value === "boolean"
181
- ? String(value)
182
- : undefined;
183
- }
184
- export function isDisabledQueryFilePath(filePath) {
185
- const normalized = filePath.replaceAll("\\", "/");
186
- const parts = normalized.split("/").filter(Boolean);
187
- const parent = parts.length >= 2 ? parts[parts.length - 2] : "";
188
- return isDisabledQueryDirectoryName(parent);
189
- }
190
- export class TreeSitterQueryLoader {
191
- queries = new Map();
192
- loaded = false;
193
- loadedRoot = null;
194
- verbose;
195
- /**
196
- * This root's per-file parse failures, remembered across the memoized
197
- * (no-`force`) `loadQueries` path so a later session's ledger can carry
198
- * the same row without re-parsing every file (#3070 N1).
199
- */
200
- parseFailures = new Map();
201
- /**
202
- * Generation (`getDegradationLedgerGeneration()`) at which `parseFailures`
203
- * was last replayed into the ledger — the same generation-keyed memo
204
- * idiom `getBundledQueriesRootHealth` above uses, applied here so a
205
- * memoized `loadQueries` return still re-arms `recordDegradationOnce` once
206
- * per session rather than only in the session that actually parsed.
207
- */
208
- parseFailuresReplayedGeneration;
209
- constructor(verbose = false) {
210
- this.verbose = verbose;
211
- }
212
- /** Debug logging helper */
213
- dbg(msg) {
214
- if (this.verbose) {
215
- // #1333: verbose gate preserved, sink moved to tree-sitter.log.
216
- logTreeSitterDiagnostic({
217
- subsystem: "query-loader",
218
- level: "debug",
219
- message: msg,
220
- });
221
- }
222
- }
223
- /**
224
- * One degradation-ledger record per malformed rule file per session
225
- * (#3054 review F1). The old hand-rolled scanner tolerated almost any
226
- * line-level mistake and still produced SOME parsed shape; `yaml.load`
227
- * correctly throws on realistic authoring mistakes the scanner shrugged
228
- * off (a colon in an unquoted scalar, a tab in list indentation, a
229
- * duplicate key, an unclosed quote, a bare `@` value — fuzzed over 800
230
- * corruptions of one shipped query: 139 that loaded before now skip, 0
231
- * the other way). Before this, the only sink on that skip path was
232
- * `dbg()`, gated behind `verbose` — both production instantiations
233
- * (this file's `queryLoader` singleton and `tree-sitter-client.ts`'s
234
- * `new TreeSitterQueryLoader()`) construct with the `verbose = false`
235
- * default — so a silently-dropped custom rule had no surviving signal.
236
- */
237
- recordQueryParseFailure(filePath, reason) {
238
- this.parseFailures.set(filePath, reason);
239
- recordDegradationOnce({
240
- kind: "tree-sitter-query-parse-failed",
241
- subject: filePath,
242
- reason,
243
- });
244
- }
245
- /**
246
- * Replay every remembered per-file parse failure into the CURRENT
247
- * session's ledger, at most once per ledger generation (#3070 N1). A
248
- * memoized `loadQueries` return skips `parseQueryFile` entirely, so
249
- * without this replay the `tree-sitter-query-parse-failed` record only
250
- * ever reached the FIRST session that actually parsed — `resetDegradationLedger`
251
- * (wired into `handleSessionStart`) clears the once-keys every session,
252
- * but the loader instance and its `parseFailures` memo are kept across
253
- * sessions (`clients/tree-sitter-shared.ts:39`), the same shape
254
- * `getBundledQueriesRootHealth` above already re-probes per generation.
255
- */
256
- replayQueryParseFailures() {
257
- const generation = getDegradationLedgerGeneration();
258
- if (this.parseFailuresReplayedGeneration === generation)
259
- return;
260
- this.parseFailuresReplayedGeneration = generation;
261
- for (const [filePath, reason] of this.parseFailures) {
262
- recordDegradationOnce({
263
- kind: "tree-sitter-query-parse-failed",
264
- subject: filePath,
265
- reason,
266
- });
267
- }
268
- }
269
- /**
270
- * Load all queries from the rules/tree-sitter-queries directory.
271
- *
272
- * Returns the in-memory memo when the same root was already loaded.
273
- * `force: true` re-reads from disk even then — the memo has no notion of
274
- * rule-file mtimes, so a caller that KNOWS the files changed (the dispatch
275
- * runner's RuleCache-miss path: a miss means the rule-file fingerprint
276
- * moved) must force, or it gets the pre-edit rules back and persists them
277
- * under the fresh fingerprint (#878).
278
- */
279
- async loadQueries(rootDir = process.cwd(), options = {}) {
280
- const resolvedRoot = path.resolve(rootDir);
281
- if (!options.force && this.loaded && this.loadedRoot === resolvedRoot) {
282
- this.replayQueryParseFailures();
283
- return this.queries;
284
- }
285
- this.queries.clear();
286
- this.parseFailures.clear();
287
- this.loaded = false;
288
- // Load from user's project rules AND package built-in rules (coexist)
289
- const queryDirs = [
290
- ...new Set([
291
- path.join(resolvedRoot, "rules", "tree-sitter-queries"),
292
- resolvePackagePath(import.meta.url, "rules", "tree-sitter-queries"),
293
- ]),
294
- ];
295
- for (const queriesDir of queryDirs) {
296
- if (!fs.existsSync(queriesDir)) {
297
- this.dbg(`Queries directory not found: ${queriesDir}`);
298
- continue;
299
- }
300
- const languageDirs = fs
301
- .readdirSync(queriesDir, { withFileTypes: true })
302
- .filter((d) => d.isDirectory())
303
- .map((d) => d.name);
304
- for (const lang of languageDirs) {
305
- const langDir = path.join(queriesDir, lang);
306
- const languageKey = getQueryLanguageKey(lang);
307
- const queryFiles = fs
308
- .readdirSync(langDir)
309
- .filter((f) => f.endsWith(".yml"));
310
- const langQueries = this.queries.get(languageKey) ?? [];
311
- for (const file of queryFiles) {
312
- const filePath = path.join(langDir, file);
313
- const query = this.parseQueryFile(filePath, languageKey);
314
- if (query) {
315
- langQueries.push(query);
316
- }
317
- }
318
- if (langQueries.length > 0) {
319
- this.queries.set(languageKey, langQueries);
320
- this.dbg(`Loaded ${langQueries.length} queries for ${languageKey}`);
321
- }
322
- }
323
- }
324
- this.loaded = true;
325
- this.loadedRoot = resolvedRoot;
326
- // Every failure hit above was recorded into THIS generation's ledger
327
- // directly (via recordQueryParseFailure); mark it replayed so a
328
- // same-generation memoized call right after this one doesn't redo the
329
- // (harmless but pointless) replay loop.
330
- this.parseFailuresReplayedGeneration = getDegradationLedgerGeneration();
331
- return this.queries;
332
- }
333
- /**
334
- * Parse a single YAML query file
335
- */
336
- parseQueryFile(filePath, language) {
337
- try {
338
- const content = fs.readFileSync(filePath, "utf-8");
339
- const parsed = this.parseYaml(content);
340
- // #3054 review F2: type-checked, not just truthy. `yaml.load` widened
341
- // `parsed` to `Record<string, unknown>`, so a mapping- or
342
- // array-valued `id`/`query` (a plausible authoring slip: forgetting
343
- // the `|` on `query:` turns the block into a nested mapping) is
344
- // truthy and used to sail through the old `!parsed.id || !parsed.query`
345
- // check, then `String(...)` turned it into the literal text
346
- // `"[object Object]"` — which for `query` reached the Query
347
- // constructor (SonarCloud typescript:S6551 flagged every such
348
- // stringification in this function; fixed below via `str()`).
349
- const id = str(parsed.id);
350
- const query = typeof parsed.query === "string" ? parsed.query : undefined;
351
- if (!id || !query) {
352
- this.dbg(`Invalid query file: ${filePath}`);
353
- this.recordQueryParseFailure(filePath, !id
354
- ? `'id' is missing or not a scalar (got ${typeof parsed.id})`
355
- : `'query' is missing or not a string (got ${typeof parsed.query})`);
356
- return null;
357
- }
358
- return {
359
- id,
360
- name: str(parsed.name) || id,
361
- severity: this.parseSeverity(parsed.severity),
362
- category: str(parsed.category) || "general",
363
- language: str(parsed.language) || language,
364
- message: str(parsed.message) || `Pattern: ${id}`,
365
- description: str(parsed.description) || undefined,
366
- query,
367
- metavars: Array.isArray(parsed.metavars)
368
- ? parsed.metavars.map(String)
369
- : this.extractMetavars(query),
370
- post_filter: str(parsed.post_filter) || undefined,
371
- // biome-ignore lint/suspicious/noExplicitAny: Post filter params
372
- post_filter_params: parsed.post_filter_params,
373
- defect_class: str(parsed.defect_class) || undefined,
374
- inline_tier: (str(parsed.inline_tier) || undefined),
375
- skip_test_files: parsed.skip_test_files === true,
376
- ignore_paths: Array.isArray(parsed.ignore_paths)
377
- ? parsed.ignore_paths.map(String)
378
- : undefined,
379
- // Parse predicates if present
380
- predicates: Array.isArray(parsed.predicates)
381
- ? parsed.predicates.map((p) => ({
382
- type: p.type,
383
- var: p.var,
384
- value: p.value,
385
- }))
386
- : undefined,
387
- tags: Array.isArray(parsed.tags) ? parsed.tags.map(String) : undefined,
388
- cwe: Array.isArray(parsed.cwe) ? parsed.cwe.map(String) : undefined,
389
- owasp: Array.isArray(parsed.owasp)
390
- ? parsed.owasp.map(String)
391
- : undefined,
392
- confidence: (str(parsed.confidence) || undefined),
393
- has_fix: parsed.has_fix === true || parsed.has_fix === "true",
394
- fix_action: str(parsed.fix_action) || undefined,
395
- filePath,
396
- };
397
- }
398
- catch (err) {
399
- this.dbg(`Failed to parse ${filePath}: ${err}`);
400
- this.recordQueryParseFailure(filePath, err instanceof Error ? err.message : String(err));
401
- return null;
402
- }
403
- }
404
- /**
405
- * Parse a query file's YAML with `js-yaml` — the same real parser
406
- * `clients/dispatch/runners/yaml-rule-parser.ts` uses for ast-grep rules
407
- * (#206: a hand-rolled line scanner flattened nested structures there; the
408
- * hand-rolled scanner this loader carried made the identical mistake,
409
- * twice over — its inline `[a, b]` array branch unquoted list items but
410
- * its multi-line `- item` branch did not, so `console-statement.yml`'s
411
- * quoted `ignore_paths` glob parsed with the quote marks attached and the
412
- * #965 carve-out never matched a path, #3041/#3046). A genuine syntax
413
- * error throws, caught by `parseQueryFile`'s `try`/`catch`; a
414
- * syntactically valid but wrong-shaped document (a bare scalar, a list,
415
- * `null`) is cast here and skipped by `parseQueryFile`'s `id`/`query`
416
- * type check below — property access on a non-object primitive never
417
- * throws in JS, so no separate `typeof parsed !== "object"` guard is
418
- * needed here (#3054 review F3: that guard was vacuous — deleting it
419
- * reds nothing, every case it caught was already caught one frame up).
420
- */
421
- parseYaml(content) {
422
- return yaml.load(content);
423
- }
424
- /**
425
- * Parse severity string to valid type
426
- */
427
- parseSeverity(value) {
428
- if (value === "error")
429
- return "error";
430
- if (value === "warning")
431
- return "warning";
432
- if (value === "info")
433
- return "info";
434
- return "warning"; // default
435
- }
436
- /**
437
- * Extract @VAR patterns from query string
438
- */
439
- extractMetavars(query) {
440
- const matches = query.match(/@([A-Z_][A-Z0-9_]*)/g);
441
- if (!matches)
442
- return [];
443
- return [...new Set(matches.map((m) => m.slice(1)))];
444
- }
445
- /**
446
- * Get queries for a specific language
447
- */
448
- getQueriesForLanguage(language) {
449
- const all = this.queries.get(language) || [];
450
- // Exclude queries from <language>-disabled/ directories.
451
- // Disabled rules are loaded (needed by tests via getAllQueries)
452
- // but excluded from production dispatch.
453
- return all.filter((q) => !isDisabledQueryFilePath(q.filePath));
454
- }
455
- /**
456
- * Get a specific query by ID
457
- */
458
- getQueryById(id) {
459
- for (const langQueries of this.queries.values()) {
460
- const query = langQueries.find((q) => q.id === id);
461
- if (query)
462
- return query;
463
- }
464
- return undefined;
465
- }
466
- /**
467
- * Find matching query for a pattern string
468
- */
469
- findMatchingQuery(pattern, language) {
470
- const langQueries = this.getQueriesForLanguage(language);
471
- // Check for pattern keywords
472
- for (const query of langQueries) {
473
- // Match by ID
474
- if (pattern.includes(query.id))
475
- return query;
476
- // Match by keywords in pattern
477
- switch (query.id) {
478
- case "empty-catch":
479
- if (pattern.includes("empty-catch") || pattern.includes("catch {}"))
480
- return query;
481
- break;
482
- case "debugger-statement":
483
- if (pattern.includes("debugger"))
484
- return query;
485
- break;
486
- case "await-in-loop":
487
- if (pattern.includes("await-in-loop") || pattern.includes("await"))
488
- return query;
489
- break;
490
- case "hardcoded-secrets":
491
- if (pattern.includes("hardcoded") ||
492
- pattern.includes("api_key") ||
493
- pattern.includes("password"))
494
- return query;
495
- break;
496
- case "dangerously-set-inner-html":
497
- if (pattern.includes("dangerously") || pattern.includes("innerHTML"))
498
- return query;
499
- break;
500
- case "nested-ternary":
501
- if (pattern.includes("ternary") || pattern.includes("? :"))
502
- return query;
503
- break;
504
- case "no-eval":
505
- if (pattern.includes("eval") && !pattern.includes("console"))
506
- return query;
507
- break;
508
- case "deep-promise-chain":
509
- if (pattern.includes(".then") && pattern.includes(".catch"))
510
- return query;
511
- break;
512
- case "console-statement":
513
- if (pattern.includes("console") && !pattern.includes("test"))
514
- return query;
515
- break;
516
- case "long-parameter-list":
517
- if (pattern.includes("PARAMS"))
518
- return query;
519
- break;
520
- // Python queries
521
- case "bare-except":
522
- if (pattern.includes("bare-except") || pattern.includes("except:"))
523
- return query;
524
- break;
525
- case "mutable-default-arg":
526
- if (pattern.includes("mutable") || pattern.includes("default"))
527
- return query;
528
- break;
529
- case "wildcard-import":
530
- if (pattern.includes("wildcard") || pattern.includes("import *"))
531
- return query;
532
- break;
533
- case "eval-exec":
534
- if (pattern.includes("eval") || pattern.includes("exec"))
535
- return query;
536
- break;
537
- case "is-vs-equals":
538
- if (pattern.includes("is") || pattern.includes("equals"))
539
- return query;
540
- break;
541
- case "unreachable-except":
542
- if (pattern.includes("unreachable") || pattern.includes("except"))
543
- return query;
544
- break;
545
- }
546
- }
547
- return undefined;
548
- }
549
- /**
550
- * Get all loaded queries
551
- */
552
- getAllQueries() {
553
- const all = [];
554
- for (const queries of this.queries.values()) {
555
- all.push(...queries);
556
- }
557
- return all;
558
- }
559
- /**
560
- * Reload queries from disk
561
- */
562
- async reload() {
563
- this.queries.clear();
564
- this.loaded = false;
565
- await this.loadQueries();
566
- }
567
- }
568
- // Singleton instance
569
- export const queryLoader = new TreeSitterQueryLoader();