pi-lens 4.3.0 → 4.4.1

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 (659) hide show
  1. package/CHANGELOG.md +1159 -0
  2. package/README.md +116 -25
  3. package/config/dependency-cruiser-eager-allowlist.json +6 -2
  4. package/dist/chunk-2BEMIWEW.js +51 -0
  5. package/dist/chunk-2EECBNC5.js +89 -0
  6. package/dist/chunk-2FQ62SPM.js +83 -0
  7. package/dist/chunk-2UMYMRI3.js +118 -0
  8. package/dist/chunk-34OCDWOS.js +48 -0
  9. package/dist/chunk-3FERWMCH.js +144 -0
  10. package/dist/chunk-3JL6IFD7.js +97 -0
  11. package/dist/chunk-3JSEWUWI.js +327 -0
  12. package/dist/chunk-3MED75HT.js +37 -0
  13. package/dist/chunk-3MRXIJ6I.js +79 -0
  14. package/dist/chunk-3P4PF2BX.js +2250 -0
  15. package/dist/chunk-3PNFWVHT.js +201 -0
  16. package/dist/chunk-3TTPKMEF.js +162 -0
  17. package/dist/chunk-5JHXUETW.js +326 -0
  18. package/dist/chunk-5W3R6LFT.js +24 -0
  19. package/dist/chunk-64LU2OVH.js +341 -0
  20. package/dist/chunk-6B5I6ICN.js +44 -0
  21. package/dist/chunk-6P54TMWL.js +274 -0
  22. package/dist/chunk-6UYA642J.js +145 -0
  23. package/dist/chunk-6XX5HCLK.js +398 -0
  24. package/dist/chunk-7AXO3ZDF.js +30 -0
  25. package/dist/chunk-7BX5DWSA.js +1907 -0
  26. package/dist/chunk-7ELY2CSM.js +902 -0
  27. package/dist/chunk-7M4T5N3V.js +38 -0
  28. package/dist/chunk-7U2IDNXN.js +37 -0
  29. package/dist/chunk-ABBOA7UD.js +157 -0
  30. package/dist/chunk-AFZYMAIV.js +756 -0
  31. package/dist/chunk-ALQRYH6O.js +112 -0
  32. package/dist/chunk-AXKPQ6ZI.js +1610 -0
  33. package/dist/chunk-BHWHXMQ2.js +62 -0
  34. package/dist/chunk-BJF25SUG.js +22 -0
  35. package/dist/chunk-BNKLYOOO.js +18 -0
  36. package/dist/chunk-BW5KFIQC.js +59 -0
  37. package/dist/chunk-CBD2B5CP.js +599 -0
  38. package/dist/chunk-CFYISHUW.js +42 -0
  39. package/dist/chunk-CMU4RMJB.js +30 -0
  40. package/dist/chunk-CULQYFLU.js +14 -0
  41. package/dist/chunk-D65GOCJB.js +289 -0
  42. package/dist/chunk-D6YF5HKX.js +59 -0
  43. package/dist/chunk-DMS52BEP.js +342 -0
  44. package/dist/chunk-ELVWJYRV.js +211 -0
  45. package/dist/chunk-EUT3B22Y.js +27 -0
  46. package/dist/chunk-F5VLZHUW.js +146 -0
  47. package/dist/chunk-FC4RP4I2.js +12 -0
  48. package/dist/chunk-FGALODG3.js +55 -0
  49. package/dist/chunk-G3RLJYA2.js +2358 -0
  50. package/dist/chunk-GAYGGICG.js +32 -0
  51. package/dist/chunk-H2W2AXD3.js +419 -0
  52. package/dist/chunk-H5EV3VMF.js +114 -0
  53. package/dist/chunk-HREZQCT3.js +106 -0
  54. package/dist/chunk-HSIRMK2D.js +517 -0
  55. package/dist/chunk-IMSQR4WO.js +184 -0
  56. package/dist/chunk-IQZXOZ7S.js +4816 -0
  57. package/dist/chunk-IR6XFA5P.js +37 -0
  58. package/dist/chunk-IUKPRZER.js +78 -0
  59. package/dist/chunk-IUR76K6A.js +262 -0
  60. package/dist/chunk-J3FZR3YY.js +98 -0
  61. package/dist/chunk-J6DFZDFA.js +562 -0
  62. package/dist/chunk-J7WJZ6W7.js +50 -0
  63. package/dist/chunk-JONGANYH.js +202 -0
  64. package/dist/chunk-KJCWXUUS.js +425 -0
  65. package/dist/chunk-KJN4IOEJ.js +17 -0
  66. package/dist/chunk-KMGPUKFD.js +25 -0
  67. package/dist/chunk-LD7WFTRX.js +4533 -0
  68. package/dist/chunk-LJDODBBZ.js +78 -0
  69. package/dist/chunk-LNOMA3MP.js +169 -0
  70. package/dist/chunk-MGIWSROG.js +2334 -0
  71. package/dist/chunk-MQA2YBAH.js +308 -0
  72. package/dist/chunk-MTDRLSI7.js +21720 -0
  73. package/dist/chunk-N2IRDBZI.js +2355 -0
  74. package/dist/chunk-N77WFUL7.js +50 -0
  75. package/dist/chunk-N7YNJE5R.js +466 -0
  76. package/dist/chunk-NABLC7W3.js +148 -0
  77. package/dist/chunk-NFXP47RV.js +999 -0
  78. package/dist/chunk-NJF2X5XF.js +45 -0
  79. package/dist/chunk-NXL4FFQQ.js +47 -0
  80. package/dist/chunk-O7HZX7CA.js +309 -0
  81. package/dist/chunk-OC7LYAU5.js +708 -0
  82. package/dist/chunk-OEX24ECI.js +348 -0
  83. package/dist/chunk-OYOB3ZFG.js +78 -0
  84. package/dist/chunk-OYTMZXRF.js +41 -0
  85. package/dist/chunk-OZJINN4O.js +84 -0
  86. package/dist/chunk-PCHDGUKT.js +23 -0
  87. package/dist/chunk-QOZXJ4NA.js +3364 -0
  88. package/dist/chunk-QYF5S6P6.js +45 -0
  89. package/dist/chunk-RJFED73B.js +79 -0
  90. package/dist/chunk-RTQNRM5X.js +27 -0
  91. package/dist/chunk-S6AMWKPC.js +189 -0
  92. package/dist/chunk-T4QZ6FEH.js +308 -0
  93. package/dist/chunk-T54VJRAD.js +5456 -0
  94. package/dist/chunk-TA5L5KWQ.js +167 -0
  95. package/dist/chunk-TQFBZVCG.js +27 -0
  96. package/dist/chunk-U52SAGRM.js +62 -0
  97. package/dist/chunk-UEAHAMEI.js +5814 -0
  98. package/dist/chunk-UGSMCQ4D.js +327 -0
  99. package/dist/chunk-UOPVJQ4N.js +103 -0
  100. package/dist/chunk-USHG4DLH.js +459 -0
  101. package/dist/chunk-UXVNL3D7.js +23 -0
  102. package/dist/chunk-V5MEBST3.js +4139 -0
  103. package/dist/chunk-VGEVL5EQ.js +29 -0
  104. package/dist/chunk-VPWKF3GN.js +87 -0
  105. package/dist/chunk-VSMJK3ZJ.js +1250 -0
  106. package/dist/chunk-VYKKMYVT.js +560 -0
  107. package/dist/chunk-VZHJS6DR.js +442 -0
  108. package/dist/chunk-WATC3IQR.js +213 -0
  109. package/dist/chunk-WPE5FPGR.js +54 -0
  110. package/dist/chunk-WSEWKCXU.js +188 -0
  111. package/dist/chunk-WW5BLB74.js +659 -0
  112. package/dist/chunk-XGUL4SLQ.js +406 -0
  113. package/dist/chunk-XHSCVSOL.js +170 -0
  114. package/dist/chunk-XIMYZ3JA.js +27 -0
  115. package/dist/chunk-YLN4K6WD.js +385 -0
  116. package/dist/chunk-Z3CCVDUB.js +76 -0
  117. package/dist/chunk-Z54ZSOBZ.js +61 -0
  118. package/dist/chunk-Z6BB4JLQ.js +478 -0
  119. package/dist/chunk-Z7QQA2KT.js +27 -0
  120. package/dist/chunk-ZETYB3XG.js +2626 -0
  121. package/dist/chunk-ZMOMPX2Z.js +87 -0
  122. package/dist/chunk-ZOEYVXSV.js +149 -0
  123. package/dist/chunk-ZZUFZUQZ.js +12120 -0
  124. package/dist/index.js +39712 -29876
  125. package/dist/mcp/analyze-cli.js +186 -232
  126. package/dist/mcp/cli.js +137 -98
  127. package/dist/mcp/server.js +22688 -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 +5 -4
  135. package/docs/configuration.md +28 -2
  136. package/docs/custom-rules.md +25 -2
  137. package/docs/environment-variables.md +86 -8
  138. package/docs/features.md +45 -5
  139. package/docs/globalconfig.md +2 -1
  140. package/docs/io-bridge-v2-migration.md +94 -0
  141. package/docs/lsp-capability-matrix.md +37 -4
  142. package/docs/lsp-idle-eviction.md +124 -0
  143. package/docs/mcp.md +21 -5
  144. package/docs/merge-queue-rollout.md +77 -0
  145. package/docs/pi-lens-fixer.md +160 -88
  146. package/docs/pi-lens-investigator.md +74 -26
  147. package/docs/pi-lens-merge-policy.md +736 -0
  148. package/docs/pi-lens-monitor.md +75 -7
  149. package/docs/pi-lens-retro.md +6 -4
  150. package/docs/pi-lens-reviewer.md +189 -48
  151. package/docs/pi-lens-subagent.md +246 -45
  152. package/docs/pi-lens-warden.md +18 -7
  153. package/docs/public-api-stability.md +55 -0
  154. package/docs/release-qa-baseline.md +84 -17
  155. package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
  156. package/docs/schema/pi-lens-config-v1.json +530 -0
  157. package/docs/servercapabilities.md +56 -49
  158. package/docs/settings.md +1 -0
  159. package/docs/usage.md +5 -1
  160. package/docs/word-index.md +6 -0
  161. package/grammars/tree-sitter-bash.wasm +0 -0
  162. package/grammars/tree-sitter-bash.wasm.json +3 -3
  163. package/package.json +19 -7
  164. package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
  165. package/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
  166. package/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
  167. package/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
  168. package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
  169. package/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
  170. package/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
  171. package/rules/ast-grep-rules/rules/throw-new-error.yml +2 -2
  172. package/scripts/analyze-pi-lens-logs.mjs +1275 -62
  173. package/scripts/download-grammars.js +5 -0
  174. package/scripts/grammars.lock.json +6 -1
  175. package/scripts/install-selftest.mjs +33 -34
  176. package/scripts/lib/host-provided-deps.mjs +13 -4
  177. package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
  178. package/dist/clients/actionable-warnings-logger.js +0 -35
  179. package/dist/clients/actionable-warnings.js +0 -1610
  180. package/dist/clients/advisory-provenance.js +0 -593
  181. package/dist/clients/agent-behavior-client.js +0 -147
  182. package/dist/clients/agent-nudge.js +0 -325
  183. package/dist/clients/analysed-root.js +0 -1
  184. package/dist/clients/ast-grep-client.js +0 -731
  185. package/dist/clients/ast-grep-rule-manager.js +0 -146
  186. package/dist/clients/ast-grep-tool-logger.js +0 -118
  187. package/dist/clients/ast-grep-types.js +0 -10
  188. package/dist/clients/ast-grep-yaml-synth.js +0 -154
  189. package/dist/clients/atomic-write-staging.js +0 -75
  190. package/dist/clients/atomic-write.js +0 -189
  191. package/dist/clients/availability-probe-flight.js +0 -12
  192. package/dist/clients/bash-file-access.js +0 -1056
  193. package/dist/clients/biome-client.js +0 -357
  194. package/dist/clients/blocker-freshness.js +0 -837
  195. package/dist/clients/blocker-past-eof.js +0 -129
  196. package/dist/clients/bootstrap.js +0 -569
  197. package/dist/clients/bounded-cache.js +0 -190
  198. package/dist/clients/bounded-pid-file-lock.js +0 -202
  199. package/dist/clients/bounded-telemetry.js +0 -295
  200. package/dist/clients/build-identity.js +0 -95
  201. package/dist/clients/bundled-resource-health.js +0 -113
  202. package/dist/clients/bus-events-logger.js +0 -105
  203. package/dist/clients/bus-publish.js +0 -171
  204. package/dist/clients/cache/rule-cache.js +0 -190
  205. package/dist/clients/cache-manager.js +0 -524
  206. package/dist/clients/cache-observability.js +0 -1313
  207. package/dist/clients/call-graph.js +0 -852
  208. package/dist/clients/cargo-manifest.js +0 -422
  209. package/dist/clients/cascade-budget.js +0 -196
  210. package/dist/clients/cascade-format.js +0 -315
  211. package/dist/clients/cascade-logger.js +0 -31
  212. package/dist/clients/cascade-types.js +0 -9
  213. package/dist/clients/child-unref.js +0 -124
  214. package/dist/clients/code-quality-warnings.js +0 -286
  215. package/dist/clients/codebase-model.js +0 -173
  216. package/dist/clients/collateral-test-role.js +0 -40
  217. package/dist/clients/complexity-client.js +0 -462
  218. package/dist/clients/config-core/deny.js +0 -221
  219. package/dist/clients/config-core/index.js +0 -50
  220. package/dist/clients/config-core/merge.js +0 -357
  221. package/dist/clients/config-core/normalize.js +0 -340
  222. package/dist/clients/config-core/process-spec.js +0 -248
  223. package/dist/clients/config-core/provenance.js +0 -164
  224. package/dist/clients/config-core/records.js +0 -218
  225. package/dist/clients/config-core/resolve.js +0 -125
  226. package/dist/clients/config-core/safe-object.js +0 -78
  227. package/dist/clients/config-core/schema.js +0 -165
  228. package/dist/clients/config-diagnostic-codes.js +0 -285
  229. package/dist/clients/config-locations.js +0 -388
  230. package/dist/clients/config-resolve.js +0 -798
  231. package/dist/clients/config-schema.js +0 -251
  232. package/dist/clients/config-warn.js +0 -407
  233. package/dist/clients/console-guard-install.js +0 -26
  234. package/dist/clients/cooperative-budget.js +0 -42
  235. package/dist/clients/dead-code-client.js +0 -510
  236. package/dist/clients/dead-code-logger.js +0 -30
  237. package/dist/clients/deadline-utils.js +0 -280
  238. package/dist/clients/debug-handles.js +0 -211
  239. package/dist/clients/debug-heap.js +0 -174
  240. package/dist/clients/deferred-lsp-work.js +0 -106
  241. package/dist/clients/degradation-ledger.js +0 -426
  242. package/dist/clients/demoted-finding-render.js +0 -169
  243. package/dist/clients/dependency-checker.js +0 -885
  244. package/dist/clients/deps/ast-grep-napi.js +0 -22
  245. package/dist/clients/deps/js-yaml.js +0 -9
  246. package/dist/clients/deps/minimatch.js +0 -4
  247. package/dist/clients/deps/pi-tui.js +0 -14
  248. package/dist/clients/deps/typebox.js +0 -14
  249. package/dist/clients/deps/vscode-jsonrpc.js +0 -1
  250. package/dist/clients/deps/web-tree-sitter.js +0 -24
  251. package/dist/clients/diagnostic-dispositions.js +0 -630
  252. package/dist/clients/diagnostic-line-freshness.js +0 -305
  253. package/dist/clients/diagnostic-logger.js +0 -73
  254. package/dist/clients/diagnostic-tracker.js +0 -105
  255. package/dist/clients/diagnostics-publish.js +0 -230
  256. package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
  257. package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
  258. package/dist/clients/dispatch/collect-later-tier.js +0 -35
  259. package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
  260. package/dist/clients/dispatch/dispatcher.js +0 -1269
  261. package/dist/clients/dispatch/fact-provider-types.js +0 -1
  262. package/dist/clients/dispatch/fact-rule-runner.js +0 -17
  263. package/dist/clients/dispatch/fact-runner.js +0 -30
  264. package/dist/clients/dispatch/fact-scheduler.js +0 -68
  265. package/dist/clients/dispatch/fact-store.js +0 -377
  266. package/dist/clients/dispatch/facts/comment-facts.js +0 -22
  267. package/dist/clients/dispatch/facts/file-content.js +0 -19
  268. package/dist/clients/dispatch/facts/function-facts.js +0 -348
  269. package/dist/clients/dispatch/facts/import-facts.js +0 -204
  270. package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
  271. package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
  272. package/dist/clients/dispatch/finding-policy.js +0 -339
  273. package/dist/clients/dispatch/indent-detect.js +0 -417
  274. package/dist/clients/dispatch/inline-suppressions.js +0 -89
  275. package/dist/clients/dispatch/integration.js +0 -2377
  276. package/dist/clients/dispatch/lazy.js +0 -11
  277. package/dist/clients/dispatch/pending-runner-findings.js +0 -87
  278. package/dist/clients/dispatch/plan.js +0 -278
  279. package/dist/clients/dispatch/priorities.js +0 -20
  280. package/dist/clients/dispatch/rule-id-normalize.js +0 -50
  281. package/dist/clients/dispatch/rule-ignores.js +0 -69
  282. package/dist/clients/dispatch/rule-policy.js +0 -135
  283. package/dist/clients/dispatch/rules/async-noise.js +0 -40
  284. package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
  285. package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
  286. package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
  287. package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
  288. package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
  289. package/dist/clients/dispatch/rules/high-complexity.js +0 -72
  290. package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
  291. package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
  292. package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
  293. package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
  294. package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
  295. package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
  296. package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
  297. package/dist/clients/dispatch/runner-context.js +0 -52
  298. package/dist/clients/dispatch/runners/actionlint.js +0 -111
  299. package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
  300. package/dist/clients/dispatch/runners/biome-check.js +0 -296
  301. package/dist/clients/dispatch/runners/cpp-check.js +0 -219
  302. package/dist/clients/dispatch/runners/credo.js +0 -82
  303. package/dist/clients/dispatch/runners/cue-vet.js +0 -416
  304. package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
  305. package/dist/clients/dispatch/runners/detekt.js +0 -176
  306. package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
  307. package/dist/clients/dispatch/runners/elixir-check.js +0 -195
  308. package/dist/clients/dispatch/runners/eslint.js +0 -137
  309. package/dist/clients/dispatch/runners/fact-rules.js +0 -29
  310. package/dist/clients/dispatch/runners/fish-indent.js +0 -69
  311. package/dist/clients/dispatch/runners/gleam-check.js +0 -167
  312. package/dist/clients/dispatch/runners/go-vet.js +0 -104
  313. package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
  314. package/dist/clients/dispatch/runners/hadolint.js +0 -91
  315. package/dist/clients/dispatch/runners/helm-lint.js +0 -171
  316. package/dist/clients/dispatch/runners/helm-render.js +0 -940
  317. package/dist/clients/dispatch/runners/htmlhint.js +0 -117
  318. package/dist/clients/dispatch/runners/index.js +0 -108
  319. package/dist/clients/dispatch/runners/javac.js +0 -99
  320. package/dist/clients/dispatch/runners/ktlint.js +0 -110
  321. package/dist/clients/dispatch/runners/lsp.js +0 -379
  322. package/dist/clients/dispatch/runners/markdownlint.js +0 -167
  323. package/dist/clients/dispatch/runners/mypy.js +0 -102
  324. package/dist/clients/dispatch/runners/oxlint.js +0 -414
  325. package/dist/clients/dispatch/runners/php-lint.js +0 -85
  326. package/dist/clients/dispatch/runners/phpstan.js +0 -120
  327. package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
  328. package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
  329. package/dist/clients/dispatch/runners/pyright.js +0 -169
  330. package/dist/clients/dispatch/runners/rubocop.js +0 -99
  331. package/dist/clients/dispatch/runners/ruff.js +0 -88
  332. package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
  333. package/dist/clients/dispatch/runners/shellcheck.js +0 -173
  334. package/dist/clients/dispatch/runners/shfmt.js +0 -102
  335. package/dist/clients/dispatch/runners/spellcheck.js +0 -128
  336. package/dist/clients/dispatch/runners/spotbugs.js +0 -259
  337. package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
  338. package/dist/clients/dispatch/runners/stylelint.js +0 -166
  339. package/dist/clients/dispatch/runners/swiftlint.js +0 -163
  340. package/dist/clients/dispatch/runners/taplo.js +0 -174
  341. package/dist/clients/dispatch/runners/terragrunt.js +0 -168
  342. package/dist/clients/dispatch/runners/tflint.js +0 -125
  343. package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
  344. package/dist/clients/dispatch/runners/trivy-config.js +0 -253
  345. package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
  346. package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
  347. package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
  348. package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
  349. package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
  350. package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
  351. package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
  352. package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
  353. package/dist/clients/dispatch/runners/utils.js +0 -15
  354. package/dist/clients/dispatch/runners/vale.js +0 -128
  355. package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
  356. package/dist/clients/dispatch/runners/yamllint.js +0 -95
  357. package/dist/clients/dispatch/runners/zig-check.js +0 -79
  358. package/dist/clients/dispatch/suppress-writer.js +0 -79
  359. package/dist/clients/dispatch/tool-profile.js +0 -30
  360. package/dist/clients/dispatch/types.js +0 -21
  361. package/dist/clients/dispatch/utils/format-utils.js +0 -45
  362. package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
  363. package/dist/clients/disposition-logger.js +0 -32
  364. package/dist/clients/disposition-publish.js +0 -124
  365. package/dist/clients/durable-store.js +0 -97
  366. package/dist/clients/effective-config.js +0 -415
  367. package/dist/clients/env-utils.js +0 -83
  368. package/dist/clients/error-class.js +0 -23
  369. package/dist/clients/eval-timestamp.js +0 -17
  370. package/dist/clients/event-loop-hold.js +0 -274
  371. package/dist/clients/event-loop-monitor.js +0 -250
  372. package/dist/clients/extension-log.js +0 -504
  373. package/dist/clients/extension-mode.js +0 -73
  374. package/dist/clients/feature-hints.js +0 -103
  375. package/dist/clients/file-kinds.js +0 -412
  376. package/dist/clients/file-role.js +0 -134
  377. package/dist/clients/file-time.js +0 -160
  378. package/dist/clients/file-utils.js +0 -1032
  379. package/dist/clients/finding-delivery-gate.js +0 -494
  380. package/dist/clients/finding-identity.js +0 -88
  381. package/dist/clients/fix-worklog.js +0 -103
  382. package/dist/clients/format-events-publish.js +0 -343
  383. package/dist/clients/format-service.js +0 -222
  384. package/dist/clients/formatters-lazy.js +0 -9
  385. package/dist/clients/formatters.js +0 -2032
  386. package/dist/clients/freshness-cadence.js +0 -17
  387. package/dist/clients/freshness.js +0 -38
  388. package/dist/clients/generated-artifacts.js +0 -394
  389. package/dist/clients/generation-guard.js +0 -215
  390. package/dist/clients/git-guard.js +0 -1136
  391. package/dist/clients/git-tracked-ignore.js +0 -243
  392. package/dist/clients/gitleaks-client.js +0 -509
  393. package/dist/clients/go-client.js +0 -104
  394. package/dist/clients/govulncheck-client.js +0 -605
  395. package/dist/clients/gradle-ktfmt-style.js +0 -348
  396. package/dist/clients/grammar-source.js +0 -465
  397. package/dist/clients/gzip-stage-write.js +0 -135
  398. package/dist/clients/hashline-anchor.js +0 -424
  399. package/dist/clients/hook-budgets.js +0 -76
  400. package/dist/clients/host-edit-normalize.js +0 -140
  401. package/dist/clients/host-ports.js +0 -39
  402. package/dist/clients/indent-retarget.js +0 -154
  403. package/dist/clients/inline-blocker-dispositions.js +0 -186
  404. package/dist/clients/install-diagnostics.js +0 -156
  405. package/dist/clients/installer/index.js +0 -5416
  406. package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
  407. package/dist/clients/installer/managed-tool-refresh.js +0 -783
  408. package/dist/clients/instance-reaper-state.js +0 -7
  409. package/dist/clients/instance-reaper.js +0 -1137
  410. package/dist/clients/instance-registry-lock.js +0 -145
  411. package/dist/clients/instance-registry.js +0 -773
  412. package/dist/clients/jscpd-client.js +0 -378
  413. package/dist/clients/json-cache-read.js +0 -65
  414. package/dist/clients/knip-client.js +0 -788
  415. package/dist/clients/language-policy.js +0 -252
  416. package/dist/clients/language-profile.js +0 -361
  417. package/dist/clients/language-registry.js +0 -603
  418. package/dist/clients/latency-logger.js +0 -727
  419. package/dist/clients/lazy-import.js +0 -21
  420. package/dist/clients/ledger-bounds.js +0 -54
  421. package/dist/clients/lens-config.js +0 -404
  422. package/dist/clients/lens-engine.js +0 -358
  423. package/dist/clients/lens-events.js +0 -125
  424. package/dist/clients/lens-flag-registry.js +0 -467
  425. package/dist/clients/lens-map.js +0 -1156
  426. package/dist/clients/live-bus-emitter.js +0 -74
  427. package/dist/clients/log-cleanup.js +0 -222
  428. package/dist/clients/lsp/aggregation.js +0 -178
  429. package/dist/clients/lsp/cascade-tier.js +0 -421
  430. package/dist/clients/lsp/client.js +0 -4593
  431. package/dist/clients/lsp/config.js +0 -691
  432. package/dist/clients/lsp/content-limits.js +0 -41
  433. package/dist/clients/lsp/diagnostic-binding.js +0 -225
  434. package/dist/clients/lsp/document-drift.js +0 -467
  435. package/dist/clients/lsp/edits.js +0 -1219
  436. package/dist/clients/lsp/index.js +0 -8305
  437. package/dist/clients/lsp/inferred-project.js +0 -216
  438. package/dist/clients/lsp/jvm-runtime.js +0 -298
  439. package/dist/clients/lsp/language.js +0 -63
  440. package/dist/clients/lsp/launch.js +0 -746
  441. package/dist/clients/lsp/lombok.js +0 -158
  442. package/dist/clients/lsp/path-utils.js +0 -5
  443. package/dist/clients/lsp/pending-aux-coverage.js +0 -251
  444. package/dist/clients/lsp/position-encoding.js +0 -61
  445. package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
  446. package/dist/clients/lsp/server.js +0 -3290
  447. package/dist/clients/lsp/session-roots.js +0 -192
  448. package/dist/clients/lsp/spawn-history.js +0 -17
  449. package/dist/clients/lsp/sync-kind.js +0 -56
  450. package/dist/clients/lsp/tsserver-sync.js +0 -332
  451. package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
  452. package/dist/clients/lsp/wait-policy/classification.js +0 -85
  453. package/dist/clients/lsp/wait-policy/index.js +0 -10
  454. package/dist/clients/lsp/wait-policy/strategies.js +0 -392
  455. package/dist/clients/lsp/watch-queue.js +0 -61
  456. package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
  457. package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
  458. package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
  459. package/dist/clients/lsp-budget.js +0 -186
  460. package/dist/clients/lsp-document-symbols.js +0 -110
  461. package/dist/clients/lsp-lazy.js +0 -9
  462. package/dist/clients/lsp-mutation.js +0 -396
  463. package/dist/clients/lsp-status.js +0 -59
  464. package/dist/clients/map-with-concurrency.js +0 -40
  465. package/dist/clients/mcp/analyze.js +0 -420
  466. package/dist/clients/mcp/host-shim.js +0 -31
  467. package/dist/clients/mcp/ipc.js +0 -523
  468. package/dist/clients/mcp/review.js +0 -197
  469. package/dist/clients/mcp/session.js +0 -412
  470. package/dist/clients/memory-sampler.js +0 -208
  471. package/dist/clients/message-end-attribution.js +0 -30
  472. package/dist/clients/metrics-client.js +0 -107
  473. package/dist/clients/metrics-history.js +0 -327
  474. package/dist/clients/middle-man-analysis.js +0 -263
  475. package/dist/clients/model-provider.js +0 -53
  476. package/dist/clients/module-report-lsp.js +0 -189
  477. package/dist/clients/module-report.js +0 -2150
  478. package/dist/clients/mutating-tool.js +0 -651
  479. package/dist/clients/mutation-attribution.js +0 -368
  480. package/dist/clients/mutation-bridge.js +0 -240
  481. package/dist/clients/ndjson-logger.js +0 -734
  482. package/dist/clients/observed-mutation-sources.js +0 -101
  483. package/dist/clients/observed-mutation.js +0 -1253
  484. package/dist/clients/oldtext-autopatch.js +0 -128
  485. package/dist/clients/opaque-mutation-scan.js +0 -496
  486. package/dist/clients/opengrep-client.js +0 -333
  487. package/dist/clients/opengrep-config.js +0 -76
  488. package/dist/clients/package-manager.js +0 -607
  489. package/dist/clients/package-root.js +0 -38
  490. package/dist/clients/partial-edit-apply.js +0 -439
  491. package/dist/clients/path-attribution-telemetry.js +0 -43
  492. package/dist/clients/path-keyed-map.js +0 -108
  493. package/dist/clients/path-utils.js +0 -1244
  494. package/dist/clients/performance-report.js +0 -331
  495. package/dist/clients/persist-debounce.js +0 -70
  496. package/dist/clients/persistent-reverify.js +0 -271
  497. package/dist/clients/php-cs-fixer-config.js +0 -119
  498. package/dist/clients/pipeline.js +0 -1480
  499. package/dist/clients/post-autofix-notice.js +0 -37
  500. package/dist/clients/print-mode.js +0 -21
  501. package/dist/clients/probe-home-state.js +0 -228
  502. package/dist/clients/process-bridge.js +0 -66
  503. package/dist/clients/process-singletons.js +0 -210
  504. package/dist/clients/process-snapshot.js +0 -68
  505. package/dist/clients/project-changes.js +0 -181
  506. package/dist/clients/project-conventions.js +0 -171
  507. package/dist/clients/project-diagnostics/cache.js +0 -137
  508. package/dist/clients/project-diagnostics/extractors.js +0 -109
  509. package/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
  510. package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
  511. package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
  512. package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
  513. package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
  514. package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
  515. package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
  516. package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
  517. package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
  518. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
  519. package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
  520. package/dist/clients/project-diagnostics/scanner.js +0 -520
  521. package/dist/clients/project-diagnostics/types.js +0 -1
  522. package/dist/clients/project-lens-config.js +0 -807
  523. package/dist/clients/project-report.js +0 -701
  524. package/dist/clients/project-scale.js +0 -237
  525. package/dist/clients/project-scan-policy.js +0 -11
  526. package/dist/clients/project-snapshot-fingerprint.js +0 -48
  527. package/dist/clients/project-snapshot-persist-worker.js +0 -20
  528. package/dist/clients/project-snapshot.js +0 -1653
  529. package/dist/clients/project-trust.js +0 -181
  530. package/dist/clients/python-environment.js +0 -217
  531. package/dist/clients/python-provenance.js +0 -639
  532. package/dist/clients/quiet-window-config.js +0 -47
  533. package/dist/clients/quiet-window.js +0 -236
  534. package/dist/clients/read-bridge.js +0 -139
  535. package/dist/clients/read-expansion.js +0 -266
  536. package/dist/clients/read-guard-logger.js +0 -251
  537. package/dist/clients/read-guard-tool-lines.js +0 -1306
  538. package/dist/clients/read-guard.js +0 -1561
  539. package/dist/clients/recent-touches.js +0 -240
  540. package/dist/clients/redact/secrets.js +0 -449
  541. package/dist/clients/resource-sampler.js +0 -628
  542. package/dist/clients/reverse-deps.js +0 -270
  543. package/dist/clients/review-graph/builder.js +0 -5126
  544. package/dist/clients/review-graph/format.js +0 -33
  545. package/dist/clients/review-graph/git-identity.js +0 -163
  546. package/dist/clients/review-graph/import-resolvers.js +0 -481
  547. package/dist/clients/review-graph/persist-worker.js +0 -10
  548. package/dist/clients/review-graph/query.js +0 -244
  549. package/dist/clients/review-graph/revision-drift.js +0 -21
  550. package/dist/clients/review-graph/service.js +0 -96
  551. package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
  552. package/dist/clients/review-graph/symbol-id.js +0 -103
  553. package/dist/clients/review-graph/tsconfig-paths.js +0 -299
  554. package/dist/clients/review-graph/types.js +0 -1
  555. package/dist/clients/review-graph/workspace-modules.js +0 -449
  556. package/dist/clients/review-graph-logger.js +0 -81
  557. package/dist/clients/ruff-client.js +0 -179
  558. package/dist/clients/rules-scanner.js +0 -131
  559. package/dist/clients/run-duration.js +0 -55
  560. package/dist/clients/runtime-agent-end.js +0 -746
  561. package/dist/clients/runtime-config.js +0 -77
  562. package/dist/clients/runtime-context.js +0 -211
  563. package/dist/clients/runtime-coordinator.js +0 -1324
  564. package/dist/clients/runtime-session.js +0 -2485
  565. package/dist/clients/runtime-tool-call.js +0 -1295
  566. package/dist/clients/runtime-tool-result.js +0 -2049
  567. package/dist/clients/runtime-turn.js +0 -3767
  568. package/dist/clients/rust-client.js +0 -97
  569. package/dist/clients/safe-spawn.js +0 -2357
  570. package/dist/clients/sanitize.js +0 -286
  571. package/dist/clients/scan-utils.js +0 -25
  572. package/dist/clients/scratch-tree-policy.js +0 -165
  573. package/dist/clients/search-read-registration.js +0 -94
  574. package/dist/clients/secret-findings.js +0 -114
  575. package/dist/clients/security-scan-client.js +0 -352
  576. package/dist/clients/session-event-guard.js +0 -297
  577. package/dist/clients/session-lifecycle.js +0 -484
  578. package/dist/clients/session-start-observability.js +0 -94
  579. package/dist/clients/session-state-store.js +0 -101
  580. package/dist/clients/session-summary.js +0 -15
  581. package/dist/clients/sessionstart-logger.js +0 -27
  582. package/dist/clients/sg-runner.js +0 -876
  583. package/dist/clients/sgconfig.js +0 -347
  584. package/dist/clients/shared-checkout-guard.js +0 -338
  585. package/dist/clients/single-flight.js +0 -158
  586. package/dist/clients/situational-tool-telemetry.js +0 -108
  587. package/dist/clients/skills-resolver.js +0 -141
  588. package/dist/clients/slow-fs.js +0 -138
  589. package/dist/clients/smells-rollup.js +0 -231
  590. package/dist/clients/source-filter.js +0 -596
  591. package/dist/clients/source-walker.js +0 -211
  592. package/dist/clients/spawn-output-cap.js +0 -120
  593. package/dist/clients/spawn-timeout-cooldown.js +0 -110
  594. package/dist/clients/stale-marker.js +0 -17
  595. package/dist/clients/startup-scan.js +0 -400
  596. package/dist/clients/startup-timing.js +0 -130
  597. package/dist/clients/string-utils.js +0 -33
  598. package/dist/clients/subagent-mode.js +0 -111
  599. package/dist/clients/symbol-containment.js +0 -24
  600. package/dist/clients/symbol-types.js +0 -5
  601. package/dist/clients/test-runner-client.js +0 -2507
  602. package/dist/clients/test-runner-delivery.js +0 -287
  603. package/dist/clients/todo-scanner.js +0 -229
  604. package/dist/clients/tool-agreement.js +0 -423
  605. package/dist/clients/tool-config.js +0 -249
  606. package/dist/clients/tool-cwd.js +0 -270
  607. package/dist/clients/tool-definition.js +0 -47
  608. package/dist/clients/tool-event.js +0 -105
  609. package/dist/clients/tool-policy.js +0 -2755
  610. package/dist/clients/tool-probe.js +0 -53
  611. package/dist/clients/tool-render.js +0 -156
  612. package/dist/clients/tool-set-policy.js +0 -118
  613. package/dist/clients/tree-sitter-cache.js +0 -364
  614. package/dist/clients/tree-sitter-client.js +0 -4195
  615. package/dist/clients/tree-sitter-logger.js +0 -100
  616. package/dist/clients/tree-sitter-navigator.js +0 -269
  617. package/dist/clients/tree-sitter-query-loader.js +0 -569
  618. package/dist/clients/tree-sitter-shared.js +0 -158
  619. package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
  620. package/dist/clients/trivy-client.js +0 -467
  621. package/dist/clients/tui-fit.js +0 -50
  622. package/dist/clients/turn-context.js +0 -52
  623. package/dist/clients/turn-end/lane.js +0 -51
  624. package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
  625. package/dist/clients/turn-end/lanes/secrets.js +0 -204
  626. package/dist/clients/turn-summary-render.js +0 -72
  627. package/dist/clients/turn-summary.js +0 -132
  628. package/dist/clients/typos-config.js +0 -29
  629. package/dist/clients/user-notify.js +0 -51
  630. package/dist/clients/vanished-instance-marker.js +0 -57
  631. package/dist/clients/warm-attach.js +0 -305
  632. package/dist/clients/widget-state.js +0 -1808
  633. package/dist/clients/word-index-logger.js +0 -49
  634. package/dist/clients/word-index-store.js +0 -459
  635. package/dist/clients/word-index.js +0 -2080
  636. package/dist/clients/workspace-topology.js +0 -443
  637. package/dist/clients/write-ordering-guard.js +0 -65
  638. package/dist/clients/zizmor-config.js +0 -340
  639. package/dist/i18n.js +0 -69
  640. package/dist/mcp/build-staleness.js +0 -124
  641. package/dist/scripts/lib/process-scan.mjs +0 -583
  642. package/dist/scripts/lib/skills-predicate.mjs +0 -129
  643. package/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
  644. package/dist/tools/activate-tools.js +0 -87
  645. package/dist/tools/ast-grep-outline.js +0 -137
  646. package/dist/tools/ast-grep-replace.js +0 -244
  647. package/dist/tools/ast-grep-search.js +0 -762
  648. package/dist/tools/effective-config.js +0 -90
  649. package/dist/tools/lens-diagnostic-mark.js +0 -375
  650. package/dist/tools/lens-diagnostics.js +0 -2571
  651. package/dist/tools/lsp-diagnostics.js +0 -1745
  652. package/dist/tools/lsp-navigation.js +0 -1367
  653. package/dist/tools/lsp-structured-output.js +0 -294
  654. package/dist/tools/module-report.js +0 -382
  655. package/dist/tools/project-report.js +0 -86
  656. package/dist/tools/render-compact.js +0 -374
  657. package/dist/tools/scan-progress.js +0 -53
  658. package/dist/tools/shared.js +0 -29
  659. package/dist/tools/symbol-search.js +0 -155
@@ -1,99 +0,0 @@
1
- /**
2
- * RuboCop runner for dispatch system
3
- *
4
- * Runs rubocop in lint-only mode (no auto-correct) on Ruby files.
5
- * Auto-correct is handled by the formatter pipeline — this runner
6
- * only reports remaining offenses after formatting.
7
- *
8
- * Supports bundle exec (preferred in Bundler projects).
9
- */
10
- import * as path from "node:path";
11
- import { pathsEqual } from "../../path-utils.js";
12
- import { safeSpawnAsync } from "../../safe-spawn.js";
13
- import { resolveRunnerCwd } from "../../tool-cwd.js";
14
- import { getAutofixCapability, getLinterPolicyForCwd, getRubocopCommand, } from "../../tool-policy.js";
15
- import { PRIORITY } from "../priorities.js";
16
- import { resolveCommandArgsWithInstallFallback } from "./utils/runner-helpers.js";
17
- import { finishParsedRun, parseToolRun } from "./utils/tool-failure.js";
18
- const SEVERITY_MAP = {
19
- fatal: "error",
20
- error: "error",
21
- warning: "warning",
22
- convention: "warning",
23
- refactor: "info",
24
- };
25
- function parseRubocopJson(raw, filePath, cwd) {
26
- try {
27
- const output = JSON.parse(raw);
28
- const autofix = getAutofixCapability("rubocop");
29
- const diagnostics = [];
30
- const absTarget = path.resolve(cwd, filePath);
31
- for (const file of output.files) {
32
- // #3295: `.rubocop.yml` `Include:`/`inherit_from` can widen the run past
33
- // the argv, and each result carries its own `path`.
34
- if (file.path && !pathsEqual(path.resolve(cwd, file.path), absTarget))
35
- continue;
36
- for (const offense of file.offenses) {
37
- const severity = SEVERITY_MAP[offense.severity] ?? "warning";
38
- diagnostics.push({
39
- id: `rubocop:${offense.cop_name}:${offense.location.line}`,
40
- message: `${offense.cop_name}: ${offense.message}`,
41
- filePath,
42
- line: offense.location.line,
43
- column: offense.location.column,
44
- severity,
45
- semantic: severity === "error" ? "blocking" : "warning",
46
- tool: "rubocop",
47
- rule: offense.cop_name,
48
- fixable: offense.correctable,
49
- autoFixAvailable: offense.correctable && (autofix?.safePipelineAutofix ?? false),
50
- fixKind: offense.correctable && autofix?.fixKind !== "none"
51
- ? autofix?.fixKind
52
- : undefined,
53
- });
54
- }
55
- }
56
- return diagnostics;
57
- }
58
- catch {
59
- return [];
60
- }
61
- }
62
- const rubocopRunner = {
63
- id: "rubocop",
64
- appliesTo: ["ruby"],
65
- priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
66
- async run(ctx) {
67
- const cwd = resolveRunnerCwd(ctx, "rubocop");
68
- const policy = getLinterPolicyForCwd(ctx.filePath, cwd);
69
- if (policy && !policy.preferredRunners.includes("rubocop")) {
70
- return { status: "skipped", diagnostics: [], semantic: "none" };
71
- }
72
- const resolved = await resolveCommandArgsWithInstallFallback(getRubocopCommand(cwd), "rubocop", cwd, ["--version"], 10000);
73
- if (!resolved) {
74
- return { status: "skipped", diagnostics: [], semantic: "none" };
75
- }
76
- const { cmd, args } = resolved;
77
- // Lint only — no auto-correct (formatter handles that)
78
- const result = await safeSpawnAsync(cmd, [...args, "--format", "json", "--no-color", ctx.filePath], { timeout: 30000, cwd });
79
- // EXIT TABLE (RuboCop 1.66 docs https://docs.rubocop.org/rubocop/usage/basic_usage.html): 0 = clean, 1 = offenses/findings, 2 = fatal/error or rejected
80
- // invocation. A nonzero exit with valid JSON remains findings; a nonzero
81
- // exit with empty or unparsable JSON is never clean (#1816).
82
- const run = parseToolRun("rubocop", {
83
- result,
84
- // Classify both streams so stderr-only failures reach the parse-error
85
- // path, while parseOutput keeps RuboCop's native JSON parser on stdout.
86
- output: `${result.stdout}${result.stderr}`,
87
- exitCodes: { ran: [1, 2] },
88
- }, (output) => parseRubocopJson(output, ctx.filePath, cwd), { parseOutput: result.stdout });
89
- if (run.skipped)
90
- return run.skipped;
91
- return finishParsedRun({
92
- tool: "rubocop",
93
- ctx,
94
- result,
95
- diagnostics: run.diagnostics,
96
- });
97
- },
98
- };
99
- export default rubocopRunner;
@@ -1,88 +0,0 @@
1
- /**
2
- * Ruff runner for dispatch system
3
- *
4
- * Dispatch mode is diagnostics-only.
5
- * Autofix is handled earlier by the post-write pipeline to avoid
6
- * mutating files mid-dispatch after LSP sync has already happened.
7
- * Supports venv-local installations.
8
- */
9
- import { safeSpawnAsync } from "../../safe-spawn.js";
10
- import { stripAnsi } from "../../sanitize.js";
11
- import { getAutofixCapability, getLinterPolicyForCwd, ruffConfigArgs, } from "../../tool-policy.js";
12
- import { PRIORITY } from "../priorities.js";
13
- import { finishParsedRun, parseToolRun } from "./utils/tool-failure.js";
14
- import { parseRuffOutput } from "./utils/diagnostic-parsers.js";
15
- import { createAvailabilityChecker, resolveAvailableOrInstall, resolveRunnerCwd, } from "./utils/runner-helpers.js";
16
- const ruff = createAvailabilityChecker("ruff", ".exe");
17
- function parseRuffJson(raw, filePath) {
18
- try {
19
- const parsed = JSON.parse(raw);
20
- if (!Array.isArray(parsed))
21
- return [];
22
- const autofix = getAutofixCapability("ruff");
23
- return parsed.map((item, index) => {
24
- const severity = item.severity === "error" ? "error" : "warning";
25
- const code = item.code || "ruff";
26
- const toolFixable = Boolean(item.fix);
27
- return {
28
- id: `ruff-${code}-${item.location?.row ?? index + 1}`,
29
- message: item.message || code,
30
- filePath: item.filename || filePath,
31
- line: item.location?.row ?? 1,
32
- column: item.location?.column ?? 1,
33
- severity,
34
- semantic: severity === "error" ? "blocking" : "warning",
35
- tool: "ruff",
36
- rule: code,
37
- fixable: toolFixable,
38
- autoFixAvailable: toolFixable && (autofix?.safePipelineAutofix ?? false),
39
- fixKind: toolFixable && autofix?.fixKind !== "none"
40
- ? autofix?.fixKind
41
- : undefined,
42
- };
43
- });
44
- }
45
- catch {
46
- return [];
47
- }
48
- }
49
- const ruffRunner = {
50
- id: "ruff-lint",
51
- appliesTo: ["python"],
52
- priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
53
- async run(ctx) {
54
- const cwd = resolveRunnerCwd(ctx, "ruff");
55
- const policy = getLinterPolicyForCwd(ctx.filePath, cwd);
56
- if (policy && !policy.preferredRunners.includes("ruff-lint")) {
57
- return { status: "skipped", diagnostics: [], semantic: "none" };
58
- }
59
- const cmd = await resolveAvailableOrInstall(ruff, "ruff", cwd);
60
- if (!cmd) {
61
- return { status: "skipped", diagnostics: [], semantic: "none" };
62
- }
63
- // Shared config-args seam (#1247): the autofix path consumes the same
64
- // builder, so the package-owned fallback config can never drift.
65
- const configArgs = ruffConfigArgs(cwd);
66
- // Step 1: Capture diagnostics (before fixing) — teaching signal for the agent
67
- const checkResult = await safeSpawnAsync(cmd, ["check", "--output-format", "json", ...configArgs, ctx.filePath], { cwd, timeout: 30000 });
68
- const raw = stripAnsi(checkResult.stdout + checkResult.stderr);
69
- // EXIT TABLE (Ruff 0.6 docs https://docs.astral.sh/ruff/linter/): 0 = clean, 1 = findings, 2 = findings/error or
70
- // tool error. A nonzero exit with valid findings stays findings; empty or
71
- // unparsable output must never become clean (#1816).
72
- const run = parseToolRun("ruff", { result: checkResult, output: raw, exitCodes: { ran: [1, 2] } }, (output) => {
73
- const diagnostics = parseRuffJson(output, ctx.filePath);
74
- return diagnostics.length > 0
75
- ? diagnostics
76
- : parseRuffOutput(output, ctx.filePath, cwd);
77
- });
78
- if (run.skipped)
79
- return run.skipped;
80
- return finishParsedRun({
81
- tool: "ruff",
82
- ctx,
83
- result: checkResult,
84
- diagnostics: run.diagnostics,
85
- });
86
- },
87
- };
88
- export default ruffRunner;
@@ -1,256 +0,0 @@
1
- /**
2
- * Rust clippy runner for dispatch system
3
- *
4
- * Runs `cargo clippy` for Rust files to catch common mistakes.
5
- */
6
- import { isAbsolute, resolve } from "node:path";
7
- import { pathsEqual } from "../../path-utils.js";
8
- import { rustClient } from "../../rust-client.js";
9
- import { safeSpawnAsync } from "../../safe-spawn.js";
10
- import { stripAnsi } from "../../sanitize.js";
11
- import { getLazyInstallAttempt, tryLazyInstall, } from "./utils/lazy-installer.js";
12
- import { describeInstallAttempt, logAvailabilityDecision, } from "./utils/availability-policy.js";
13
- import { PRIORITY } from "../priorities.js";
14
- import { resolveRunnerCwdWithReason } from "../../tool-cwd.js";
15
- import { createCwdCachedProbe } from "./utils/runner-helpers.js";
16
- // Cached per-cwd `cargo clippy --version` probe (#120). Before this, the
17
- // probe fired on every Rust file save in a project where clippy was already
18
- // installed.
19
- //
20
- // `tryLazyInstall("rust-clippy", cwd)` mutates installed state, so on a
21
- // false initial result the runner needs a way to bust the cache and re-probe
22
- // after install. We can't `delete` a Promise mid-flight, so the safe path
23
- // is: if the cached probe resolves false AND the install just succeeded,
24
- // fall back to a one-shot fresh probe rather than reusing the cached false.
25
- //
26
- // The verdict is governed by the shared availability policy (#1494): a probe
27
- // timeout expires on a cooldown, so only a genuinely absent clippy latches.
28
- const CLIPPY_PROBE_BUDGET_MS = 8000;
29
- let clippyProbeRevision = 0;
30
- const makeClippyProbe = (cargoExe, flightKeyComponent = cargoExe) => createCwdCachedProbe((cwd) => safeSpawnAsync(cargoExe, ["clippy", "--version"], {
31
- timeout: CLIPPY_PROBE_BUDGET_MS,
32
- cwd,
33
- }), {
34
- tool: "clippy",
35
- budgetMs: CLIPPY_PROBE_BUDGET_MS,
36
- flightKeyComponent,
37
- });
38
- const clippyAvailabilityByCargo = new Map();
39
- function getClippyProbe(cargoExe) {
40
- return (clippyAvailabilityByCargo.get(cargoExe) ?? refreshClippyProbe(cargoExe));
41
- }
42
- /** Replace the cached probe so a post-install state is observed. */
43
- function refreshClippyProbe(cargoExe) {
44
- const created = makeClippyProbe(cargoExe, `${cargoExe}#refresh-${++clippyProbeRevision}`);
45
- clippyAvailabilityByCargo.set(cargoExe, created);
46
- return created;
47
- }
48
- const rustClippyRunner = {
49
- id: "rust-clippy",
50
- appliesTo: ["rust"],
51
- priority: PRIORITY.SPECIALIZED_ANALYSIS,
52
- timeoutMs: 90_000,
53
- async run(ctx) {
54
- // Resolve cargo path using platform-aware lookup (handles ~/.cargo/bin on Windows)
55
- const cargoExe = await rustClient.findCargoPathAsync();
56
- if (!cargoExe) {
57
- return { status: "skipped", diagnostics: [], semantic: "none" };
58
- }
59
- const clippyProbe = getClippyProbe(cargoExe);
60
- if (!(await clippyProbe(ctx.cwd))) {
61
- // A timed-out probe is not evidence that clippy is missing, so it must
62
- // not drive an install. Skip this turn and let the policy re-probe once
63
- // its cooldown expires (#1494).
64
- if (clippyProbe.getVerdict(ctx.cwd).outcome === "transient") {
65
- return { status: "skipped", diagnostics: [], semantic: "none" };
66
- }
67
- await tryLazyInstall("rust-clippy", ctx.cwd);
68
- // Bust the cwd-keyed cache so the post-install state is observed. Held in
69
- // a local: `refreshClippyProbe` REPLACES the cached probe, so calling it
70
- // again to read the verdict would spend a second probe.
71
- const refreshedProbe = refreshClippyProbe(cargoExe);
72
- if (!(await refreshedProbe(ctx.cwd))) {
73
- // #1537: clippy is still absent, and the interesting question is WHY —
74
- // "we tried `rustup component add` and the network failed" is a
75
- // different fact from "this machine has no rustup", and until now the
76
- // lazy installers recorded neither. Put the attempt beside the verdict
77
- // it produced (#1500), so a reader does not have to infer the install
78
- // from a runner that silently skipped.
79
- const verdict = refreshedProbe.getVerdict(ctx.cwd);
80
- logAvailabilityDecision({
81
- tool: "rust-clippy",
82
- verdict: "unavailable",
83
- outcome: verdict.outcome ?? "missing",
84
- cause: verdict.cause ?? "not-found",
85
- classifiedBy: "caller",
86
- evidence: describeInstallAttempt(getLazyInstallAttempt("rust-clippy", ctx.cwd)),
87
- elapsedMs: 0,
88
- latched: false,
89
- });
90
- return { status: "skipped", diagnostics: [], semantic: "none" };
91
- }
92
- }
93
- // The package root (where Cargo.toml is), through the shared cwd seam
94
- // (#2894): the shared language marker vocabulary includes `Cargo.toml`, so
95
- // this IS the walk this runner used to do with `findNearestContaining` — plus
96
- // the seam's dispatch-root and `$HOME` ceilings, which the hand-rolled
97
- // walk had neither of. The gate then asks about exactly the directory
98
- // cargo will run in, rather than about a separately-derived one.
99
- const cargoResolution = resolveRunnerCwdWithReason(ctx, "rust-clippy");
100
- const cargoDir = cargoResolution.cwd;
101
- if (cargoResolution.marker !== "Cargo.toml") {
102
- return { status: "skipped", diagnostics: [], semantic: "none" };
103
- }
104
- // Run cargo clippy on the package
105
- const result = await safeSpawnAsync(cargoExe, ["clippy", "--message-format=json", "-q"], {
106
- timeout: 60000,
107
- cwd: cargoDir,
108
- });
109
- const raw = stripAnsi(result.stdout + result.stderr);
110
- if (result.status === 0 && !raw.trim()) {
111
- return { status: "succeeded", diagnostics: [], semantic: "none" };
112
- }
113
- // Parse JSON output. span.file is relative to the package root, so pass
114
- // the cargo dir to resolve diagnostics to absolute paths for filtering.
115
- const allDiagnostics = parseClippyOutput(raw, ctx.filePath, cargoDir);
116
- if (allDiagnostics.length === 0) {
117
- // Non-parseable output
118
- return {
119
- status: "failed",
120
- diagnostics: [],
121
- semantic: "warning",
122
- rawOutput: raw.substring(0, 500),
123
- };
124
- }
125
- // Lint-style policy (#265 B1): `cargo clippy` compiles the whole crate, so
126
- // a crate-mate's pre-existing diagnostic must NOT fail the edited file's
127
- // turn. Filter to the edited file like golangci-lint — if the edited file
128
- // is clean, this turn succeeds even when siblings carry warnings/errors.
129
- // #3278: one seam for reported-path attribution — see javac.ts. This
130
- // member already had the right BASE (`parseClippyOutput` resolves
131
- // `span.file` against `cargoDir`); what it lacked was the on-disk
132
- // identity predicate.
133
- const absEdited = resolve(ctx.filePath);
134
- const diagnostics = allDiagnostics.filter((d) => pathsEqual(resolve(cargoDir, d.filePath), absEdited));
135
- const hasErrors = diagnostics.some((d) => d.semantic === "blocking");
136
- return {
137
- status: hasErrors ? "failed" : "succeeded",
138
- diagnostics,
139
- semantic: hasErrors
140
- ? "blocking"
141
- : diagnostics.length > 0
142
- ? "warning"
143
- : "none",
144
- };
145
- },
146
- };
147
- /**
148
- * #1802 fix round: the original review claimed rustc/clippy's top-level
149
- * `compiler-message.level` is genuinely two-valued (error/warning). A live
150
- * `cargo clippy --message-format=json` repro falsified that: rustc_errors's
151
- * `Level` serializes SIX values, and top-level messages with a real primary
152
- * span are NOT limited to error/warning —
153
- *
154
- * - `"error"` — a hard compiler/lint error.
155
- * - `"warning"` — the common clippy-lint case.
156
- * - `"note"` — DOES appear as a top-level message with a non-empty primary
157
- * span (repro: an erroneous-constant note pointing at the offending
158
- * expression), not only as a `message.children[].level` annotation.
159
- * - `"help"` — a top-level suggestion-carrying message.
160
- * - `"failure-note"` — observed with an empty `spans` array, so it is
161
- * already filtered out by the `if (!span) continue` guard below; no
162
- * diagnostic is ever built from it. Verified, not assumed.
163
- * - `"error: internal compiler error"` — an ICE. The old `level === "error"`
164
- * exact-match ternary silently mapped this to `"warning"`, because the
165
- * string doesn't equal `"error"` — an ICE must never be under-reported,
166
- * so it is normalized to `"error"` here explicitly.
167
- *
168
- * `note`/`help` don't have a `"blocking"`-worthy tier of their own in the
169
- * four-valued `Diagnostic.severity`, so they land on the two quiet tiers:
170
- * `note` → `hint`, `help` → `info`. Blocking stays derived from the
171
- * *normalized* severity (not the raw string), which is what makes the ICE
172
- * case blocking too instead of silently passing.
173
- */
174
- export function normalizeClippyLevel(raw) {
175
- if (raw === "error")
176
- return "error";
177
- if (typeof raw === "string" &&
178
- raw.startsWith("error: internal compiler error")) {
179
- return "error";
180
- }
181
- if (raw === "note")
182
- return "hint";
183
- if (raw === "help")
184
- return "info";
185
- // "warning", "failure-note" (unreachable here, see above), and anything
186
- // unrecognized fall back to "warning" — the tier every clippy diagnostic
187
- // reported at before this fix.
188
- return "warning";
189
- }
190
- /**
191
- * Find a machine-applicable suggested replacement across the message's spans.
192
- * Clippy emits one diagnostic per warning but can attach the auto-fix to a
193
- * span other than the primary one (e.g. a fix that rewrites a use-site AND
194
- * removes the now-unused import). We treat the diagnostic as fixable if any
195
- * span carries a MachineApplicable suggestion — that's the applicability
196
- * level clippy promises is safe for `cargo clippy --fix` to apply without
197
- * human review.
198
- */
199
- function findMachineApplicableSpan(spans) {
200
- return spans.find((s) => typeof s.suggested_replacement === "string" &&
201
- s.suggestion_applicability === "MachineApplicable");
202
- }
203
- export function parseClippyOutput(raw, fallbackPath, cargoDir) {
204
- const diagnostics = [];
205
- const lines = raw.split("\n").filter((l) => l.trim());
206
- for (const line of lines) {
207
- try {
208
- const msg = JSON.parse(line);
209
- if (msg.reason !== "compiler-message")
210
- continue;
211
- const message = msg.message;
212
- if (!message)
213
- continue;
214
- // Only include messages for this file or project-wide
215
- const spans = message.spans ?? [];
216
- const span = spans[0];
217
- if (!span)
218
- continue;
219
- const fixableSpan = findMachineApplicableSpan(spans);
220
- // span.file is relative to the package root; resolve to absolute when
221
- // the cargo dir is known so callers can filter by edited file (#265 B1).
222
- const rawFile = span.file || span.file_name;
223
- const filePath = rawFile
224
- ? cargoDir && !isAbsolute(rawFile)
225
- ? resolve(cargoDir, rawFile)
226
- : rawFile
227
- : fallbackPath;
228
- // #1802: preserve clippy's real six-level vocabulary instead of
229
- // collapsing it. See `normalizeClippyLevel` above for the verified
230
- // mapping and the repro that falsified the original "two-valued"
231
- // claim. Blocking is derived from the NORMALIZED severity so an ICE
232
- // (`"error: internal compiler error"`) is blocking too, not just an
233
- // exact-match `"error"` string.
234
- const normalizedSeverity = normalizeClippyLevel(message.level);
235
- diagnostics.push({
236
- id: `clippy-${message.code?.code || "unknown"}`,
237
- message: message.message || "Clippy warning",
238
- filePath,
239
- line: span.line_start || 0,
240
- column: span.column_start || 0,
241
- severity: normalizedSeverity,
242
- semantic: normalizedSeverity === "error" ? "blocking" : "warning",
243
- tool: "rust-clippy",
244
- rule: message.code?.code,
245
- defectClass: "correctness",
246
- fixable: fixableSpan !== undefined,
247
- fixSuggestion: fixableSpan?.suggested_replacement,
248
- });
249
- }
250
- catch {
251
- // Not a JSON line, skip
252
- }
253
- }
254
- return diagnostics;
255
- }
256
- export default rustClippyRunner;
@@ -1,173 +0,0 @@
1
- /**
2
- * Shellcheck runner for dispatch system
3
- *
4
- * Industry-standard linter for shell scripts (bash, sh, zsh).
5
- * Detects syntax errors, undefined variables, quoting issues, and best practices.
6
- *
7
- * Why shellcheck?
8
- * - Industry standard (used in CI/CD everywhere)
9
- * - Comprehensive checks (syntax, variables, quotes, best practices)
10
- * - JSON output for easy parsing
11
- * - Available on all platforms (apt, brew, cargo, etc.)
12
- *
13
- * Alternative considered: bash-language-server
14
- * - LSP approach like OpenCode uses
15
- * - Richer features but heavier
16
- * - shellcheck is simpler and faster for basic linting
17
- *
18
- * Install: apt install shellcheck, brew install shellcheck, or cargo install shellcheck
19
- *
20
- * Config: .shellcheckrc (optional, zero-config works)
21
- */
22
- import * as fs from "node:fs";
23
- import * as path from "node:path";
24
- import { pathsEqual } from "../../path-utils.js";
25
- import { safeSpawnAsync } from "../../safe-spawn.js";
26
- import { resolveRunnerCwd } from "../../tool-cwd.js";
27
- import { PRIORITY } from "../priorities.js";
28
- import { createAvailabilityChecker, lspPrimaryCoversFile, resolveAvailableOrInstall, } from "./utils/runner-helpers.js";
29
- import { finishParsedRun } from "./utils/tool-failure.js";
30
- const shellcheck = createAvailabilityChecker("shellcheck", ".exe");
31
- function findShellcheckConfig(cwd) {
32
- const local = path.join(cwd, ".shellcheckrc");
33
- if (fs.existsSync(local))
34
- return local;
35
- let current = path.resolve(cwd);
36
- while (true) {
37
- const candidate = path.join(current, ".shellcheckrc");
38
- if (fs.existsSync(candidate))
39
- return candidate;
40
- const parent = path.dirname(current);
41
- if (parent === current)
42
- break;
43
- current = parent;
44
- }
45
- return undefined;
46
- }
47
- /**
48
- * Parse shellcheck JSON output
49
- *
50
- * Format: Array of check objects
51
- * [{
52
- * "file": "script.sh",
53
- * "line": 10,
54
- * "endLine": 10,
55
- * "column": 5,
56
- * "endColumn": 10,
57
- * "level": "warning",
58
- * "code": 2154,
59
- * "message": "var is referenced but not assigned.",
60
- * "fix": null
61
- * }]
62
- *
63
- * Levels: "error", "warning", "info", "style"
64
- */
65
- function parseShellcheckOutput(raw, filePath, cwd) {
66
- const diagnostics = [];
67
- const absTarget = path.resolve(cwd, filePath);
68
- if (!raw.trim()) {
69
- return diagnostics;
70
- }
71
- try {
72
- const parsed = JSON.parse(raw);
73
- if (!Array.isArray(parsed)) {
74
- return diagnostics;
75
- }
76
- for (const item of parsed) {
77
- if (!item.message || !item.line)
78
- continue;
79
- if (!item.file || !pathsEqual(path.resolve(cwd, item.file), absTarget))
80
- continue;
81
- // Map shellcheck levels to our severity
82
- const severityMap = {
83
- error: "error",
84
- warning: "warning",
85
- info: "info",
86
- style: "info",
87
- };
88
- const severity = severityMap[item.level || "warning"] || "warning";
89
- const ruleCode = item.code ? `SC${item.code}` : "unknown";
90
- diagnostics.push({
91
- id: `shellcheck-${item.line}-${ruleCode}`,
92
- message: `[${ruleCode}] ${item.message}`,
93
- filePath,
94
- line: item.line,
95
- column: item.column || 1,
96
- severity,
97
- semantic: severity === "error" ? "blocking" : "warning",
98
- tool: "shellcheck",
99
- rule: ruleCode,
100
- fixable: !!item.fix,
101
- autoFixAvailable: false,
102
- fixKind: item.fix ? "suggestion" : undefined,
103
- });
104
- }
105
- }
106
- catch {
107
- // JSON parse failed, return empty
108
- return diagnostics;
109
- }
110
- return diagnostics;
111
- }
112
- const shellcheckRunner = {
113
- id: "shellcheck",
114
- appliesTo: ["shell"],
115
- priority: PRIORITY.GENERAL_ANALYSIS,
116
- skipTestFiles: false, // Shell scripts in test directories should still be checked
117
- async run(ctx) {
118
- const cwd = resolveRunnerCwd(ctx, "shellcheck");
119
- // #233: bash-language-server runs shellcheck internally. When the `bash` LSP
120
- // covers this file AND shellcheck is on PATH (so the LSP actually emits its
121
- // findings), the warm server already produces these diagnostics — skip the
122
- // redundant CLI scan. Stays active when the LSP or shellcheck is absent so
123
- // shell coverage never regresses.
124
- if (lspPrimaryCoversFile(ctx, "bash") &&
125
- (await ctx.hasTool("bash-language-server")) &&
126
- (await ctx.hasTool("shellcheck"))) {
127
- return { status: "skipped", diagnostics: [], semantic: "none" };
128
- }
129
- let cmd = null;
130
- if (await shellcheck.isAvailableAsync(cwd)) {
131
- cmd = shellcheck.getCommand(cwd);
132
- }
133
- else {
134
- const managed = await resolveAvailableOrInstall(shellcheck, "shellcheck", cwd);
135
- if (managed)
136
- cmd = managed;
137
- }
138
- if (!cmd)
139
- return { status: "skipped", diagnostics: [], semantic: "none" };
140
- // Determine shell dialect from file extension (all map to bash for shellcheck)
141
- const shellDialect = "bash";
142
- // Build args
143
- // --format json: JSON output
144
- // --shell: Specify shell dialect (bash, sh, zsh, ksh, busybox)
145
- // --severity: Minimum severity (we'll filter ourselves)
146
- const args = ["--format", "json", "--shell", shellDialect];
147
- // Check for config file
148
- const configPath = findShellcheckConfig(ctx.cwd);
149
- if (!configPath) {
150
- // No config file: surface `info`-level findings (e.g. SC2086
151
- // double-quote-to-prevent-globbing — a high-value, commonly-relevant
152
- // check that was previously dropped, #213) while still excluding pure
153
- // `style` rules to limit noise. Projects opt into style via .shellcheckrc.
154
- args.push("--severity", "info");
155
- }
156
- args.push(ctx.filePath);
157
- const result = await safeSpawnAsync(cmd, args, { cwd, timeout: 15000 });
158
- // shellcheck exits with code 1 if issues found, 0 if clean
159
- if (result.status === 0 && !result.stdout?.trim()) {
160
- return { status: "succeeded", diagnostics: [], semantic: "none" };
161
- }
162
- // Parse diagnostics
163
- const raw = result.stdout + result.stderr;
164
- const diagnostics = parseShellcheckOutput(raw, ctx.filePath, cwd);
165
- return finishParsedRun({
166
- tool: "shellcheck",
167
- ctx,
168
- result,
169
- diagnostics,
170
- });
171
- },
172
- };
173
- export default shellcheckRunner;