pi-lens 4.1.2 → 4.1.4

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 (359) hide show
  1. package/CHANGELOG.md +1308 -0
  2. package/README.md +3 -0
  3. package/config/biome/core.jsonc +11 -2
  4. package/config/dependency-cruiser-eager-allowlist.json +91 -0
  5. package/dist/clients/actionable-warnings-logger.js +18 -3
  6. package/dist/clients/actionable-warnings.js +927 -80
  7. package/dist/clients/agent-behavior-client.js +13 -4
  8. package/dist/clients/ast-grep-client.js +136 -9
  9. package/dist/clients/ast-grep-rule-manager.js +60 -5
  10. package/dist/clients/ast-grep-tool-logger.js +2 -2
  11. package/dist/clients/availability-probe-flight.js +12 -0
  12. package/dist/clients/bash-file-access.js +1 -3
  13. package/dist/clients/biome-client.js +16 -2
  14. package/dist/clients/blocker-freshness.js +34 -0
  15. package/dist/clients/bootstrap.js +509 -73
  16. package/dist/clients/bounded-cache.js +152 -12
  17. package/dist/clients/bounded-telemetry.js +115 -23
  18. package/dist/clients/build-identity.js +95 -0
  19. package/dist/clients/bundled-resource-health.js +113 -0
  20. package/dist/clients/bus-events-logger.js +2 -2
  21. package/dist/clients/bus-publish.js +3 -0
  22. package/dist/clients/cache/rule-cache.js +33 -5
  23. package/dist/clients/cache-manager.js +105 -6
  24. package/dist/clients/cache-observability.js +46 -19
  25. package/dist/clients/cargo-manifest.js +422 -0
  26. package/dist/clients/cascade-logger.js +17 -3
  27. package/dist/clients/code-quality-warnings.js +13 -3
  28. package/dist/clients/complexity-client.js +16 -5
  29. package/dist/clients/config-core/deny.js +221 -0
  30. package/dist/clients/config-core/index.js +47 -0
  31. package/dist/clients/config-core/merge.js +357 -0
  32. package/dist/clients/config-core/normalize.js +340 -0
  33. package/dist/clients/config-core/process-spec.js +248 -0
  34. package/dist/clients/config-core/provenance.js +171 -0
  35. package/dist/clients/config-core/records.js +218 -0
  36. package/dist/clients/config-core/resolve.js +125 -0
  37. package/dist/clients/config-core/safe-object.js +78 -0
  38. package/dist/clients/config-core/schema.js +167 -0
  39. package/dist/clients/config-diagnostic-codes.js +281 -0
  40. package/dist/clients/config-locations.js +160 -0
  41. package/dist/clients/config-resolve.js +789 -0
  42. package/dist/clients/config-schema.js +197 -0
  43. package/dist/clients/config-warn.js +407 -0
  44. package/dist/clients/dead-code-client.js +33 -25
  45. package/dist/clients/dead-code-logger.js +2 -2
  46. package/dist/clients/deadline-utils.js +178 -0
  47. package/dist/clients/debug-handles.js +2 -2
  48. package/dist/clients/debug-heap.js +3 -3
  49. package/dist/clients/deferred-lsp-work.js +106 -0
  50. package/dist/clients/degradation-ledger.js +166 -8
  51. package/dist/clients/demoted-finding-render.js +14 -0
  52. package/dist/clients/dependency-checker.js +28 -22
  53. package/dist/clients/deps/minimatch.js +1 -1
  54. package/dist/clients/diagnostic-line-freshness.js +12 -9
  55. package/dist/clients/diagnostic-logger.js +14 -4
  56. package/dist/clients/dispatch/collect-later-tier.js +39 -0
  57. package/dist/clients/dispatch/dispatcher.js +304 -19
  58. package/dist/clients/dispatch/fact-store.js +328 -9
  59. package/dist/clients/dispatch/integration.js +214 -107
  60. package/dist/clients/dispatch/pending-runner-findings.js +87 -0
  61. package/dist/clients/dispatch/plan.js +21 -5
  62. package/dist/clients/dispatch/runners/actionlint.js +0 -1
  63. package/dist/clients/dispatch/runners/ast-grep-napi.js +550 -77
  64. package/dist/clients/dispatch/runners/biome-check.js +0 -1
  65. package/dist/clients/dispatch/runners/cpp-check.js +0 -1
  66. package/dist/clients/dispatch/runners/credo.js +0 -1
  67. package/dist/clients/dispatch/runners/cue-vet.js +0 -1
  68. package/dist/clients/dispatch/runners/dart-analyze.js +0 -1
  69. package/dist/clients/dispatch/runners/detekt.js +0 -1
  70. package/dist/clients/dispatch/runners/dotnet-build.js +0 -1
  71. package/dist/clients/dispatch/runners/elixir-check.js +0 -1
  72. package/dist/clients/dispatch/runners/eslint.js +5 -2
  73. package/dist/clients/dispatch/runners/fact-rules.js +0 -1
  74. package/dist/clients/dispatch/runners/fish-indent.js +0 -1
  75. package/dist/clients/dispatch/runners/gleam-check.js +0 -1
  76. package/dist/clients/dispatch/runners/go-vet.js +1 -3
  77. package/dist/clients/dispatch/runners/golangci-lint.js +0 -1
  78. package/dist/clients/dispatch/runners/hadolint.js +0 -1
  79. package/dist/clients/dispatch/runners/helm-lint.js +16 -4
  80. package/dist/clients/dispatch/runners/helm-render.js +54 -10
  81. package/dist/clients/dispatch/runners/htmlhint.js +0 -1
  82. package/dist/clients/dispatch/runners/index.js +1 -3
  83. package/dist/clients/dispatch/runners/javac.js +0 -1
  84. package/dist/clients/dispatch/runners/ktlint.js +0 -1
  85. package/dist/clients/dispatch/runners/lsp.js +37 -2
  86. package/dist/clients/dispatch/runners/markdownlint.js +4 -2
  87. package/dist/clients/dispatch/runners/mypy.js +0 -1
  88. package/dist/clients/dispatch/runners/oxlint.js +24 -22
  89. package/dist/clients/dispatch/runners/php-lint.js +0 -1
  90. package/dist/clients/dispatch/runners/phpstan.js +0 -1
  91. package/dist/clients/dispatch/runners/prisma-validate.js +0 -1
  92. package/dist/clients/dispatch/runners/psscriptanalyzer.js +4 -1
  93. package/dist/clients/dispatch/runners/pyright.js +7 -4
  94. package/dist/clients/dispatch/runners/rubocop.js +0 -1
  95. package/dist/clients/dispatch/runners/ruff.js +0 -1
  96. package/dist/clients/dispatch/runners/rust-clippy.js +9 -6
  97. package/dist/clients/dispatch/runners/shellcheck.js +0 -1
  98. package/dist/clients/dispatch/runners/shfmt.js +0 -1
  99. package/dist/clients/dispatch/runners/spellcheck.js +0 -1
  100. package/dist/clients/dispatch/runners/spotbugs.js +0 -1
  101. package/dist/clients/dispatch/runners/sqlfluff.js +0 -1
  102. package/dist/clients/dispatch/runners/stylelint.js +0 -1
  103. package/dist/clients/dispatch/runners/swiftlint.js +0 -1
  104. package/dist/clients/dispatch/runners/taplo.js +0 -1
  105. package/dist/clients/dispatch/runners/terragrunt.js +0 -1
  106. package/dist/clients/dispatch/runners/tflint.js +0 -1
  107. package/dist/clients/dispatch/runners/tree-sitter.js +0 -1
  108. package/dist/clients/dispatch/runners/trivy-config.js +0 -1
  109. package/dist/clients/dispatch/runners/utils/availability-policy.js +3 -0
  110. package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +3 -4
  111. package/dist/clients/dispatch/runners/utils/runner-helpers.js +270 -105
  112. package/dist/clients/dispatch/runners/utils/spawn-outcome.js +4 -0
  113. package/dist/clients/dispatch/runners/utils/tool-failure.js +19 -7
  114. package/dist/clients/dispatch/runners/utils/toolchain-availability.js +89 -26
  115. package/dist/clients/dispatch/runners/vale.js +0 -1
  116. package/dist/clients/dispatch/runners/yaml-rule-parser.js +51 -17
  117. package/dist/clients/dispatch/runners/yamllint.js +0 -1
  118. package/dist/clients/dispatch/runners/zig-check.js +0 -1
  119. package/dist/clients/disposition-logger.js +3 -3
  120. package/dist/clients/effective-config.js +403 -0
  121. package/dist/clients/error-class.js +23 -0
  122. package/dist/clients/event-loop-hold.js +274 -0
  123. package/dist/clients/event-loop-monitor.js +66 -1
  124. package/dist/clients/extension-log.js +2 -2
  125. package/dist/clients/feature-hints.js +2 -1
  126. package/dist/clients/file-time.js +6 -1
  127. package/dist/clients/file-utils.js +266 -13
  128. package/dist/clients/finding-delivery-gate.js +55 -13
  129. package/dist/clients/format-service.js +6 -1
  130. package/dist/clients/formatters.js +303 -104
  131. package/dist/clients/freshness-cadence.js +17 -0
  132. package/dist/clients/generated-artifacts.js +114 -19
  133. package/dist/clients/generation-guard.js +4 -9
  134. package/dist/clients/git-guard.js +198 -48
  135. package/dist/clients/git-tracked-ignore.js +32 -1
  136. package/dist/clients/go-client.js +39 -0
  137. package/dist/clients/govulncheck-client.js +5 -1
  138. package/dist/clients/gradle-ktfmt-style.js +252 -0
  139. package/dist/clients/gzip-stage-write.js +7 -0
  140. package/dist/clients/hashline-anchor.js +424 -0
  141. package/dist/clients/hook-budgets.js +76 -0
  142. package/dist/clients/host-edit-normalize.js +5 -2
  143. package/dist/clients/host-ports.js +1 -1
  144. package/dist/clients/installer/index.js +200 -84
  145. package/dist/clients/installer/managed-tool-refresh.js +3 -1
  146. package/dist/clients/instance-reaper.js +108 -243
  147. package/dist/clients/instance-registry-lock.js +145 -0
  148. package/dist/clients/instance-registry.js +435 -122
  149. package/dist/clients/jscpd-client.js +6 -1
  150. package/dist/clients/language-profile.js +4 -2
  151. package/dist/clients/language-registry.js +595 -0
  152. package/dist/clients/latency-logger.js +179 -3
  153. package/dist/clients/ledger-bounds.js +13 -0
  154. package/dist/clients/lens-config.js +141 -30
  155. package/dist/clients/lens-engine.js +30 -37
  156. package/dist/clients/lens-flag-registry.js +67 -6
  157. package/dist/clients/lens-map.js +3 -1
  158. package/dist/clients/log-cleanup.js +2 -2
  159. package/dist/clients/lsp/aggregation.js +3 -1
  160. package/dist/clients/lsp/cascade-tier.js +4 -0
  161. package/dist/clients/lsp/client.js +672 -49
  162. package/dist/clients/lsp/config.js +504 -156
  163. package/dist/clients/lsp/diagnostic-binding.js +10 -5
  164. package/dist/clients/lsp/edits.js +15 -2
  165. package/dist/clients/lsp/index.js +1179 -247
  166. package/dist/clients/lsp/jvm-runtime.js +5 -0
  167. package/dist/clients/lsp/language.js +18 -169
  168. package/dist/clients/lsp/launch.js +38 -9
  169. package/dist/clients/lsp/pending-aux-coverage.js +113 -12
  170. package/dist/clients/lsp/server.js +426 -160
  171. package/dist/clients/lsp/session-roots.js +192 -0
  172. package/dist/clients/lsp/spawn-history.js +2 -7
  173. package/dist/clients/lsp/tsserver-sync.js +9 -2
  174. package/dist/clients/lsp/workspace-diagnostics-cache.js +17 -7
  175. package/dist/clients/lsp/workspace-sweep-hold.js +32 -23
  176. package/dist/clients/lsp-mutation.js +179 -23
  177. package/dist/clients/map-with-concurrency.js +36 -0
  178. package/dist/clients/mcp/analyze.js +45 -10
  179. package/dist/clients/mcp/session.js +19 -17
  180. package/dist/clients/memory-sampler.js +28 -1
  181. package/dist/clients/message-end-attribution.js +30 -0
  182. package/dist/clients/metrics-history.js +21 -4
  183. package/dist/clients/middle-man-analysis.js +2 -4
  184. package/dist/clients/module-report.js +20 -45
  185. package/dist/clients/mutating-tool.js +651 -0
  186. package/dist/clients/mutation-attribution.js +368 -0
  187. package/dist/clients/mutation-bridge.js +240 -0
  188. package/dist/clients/ndjson-logger.js +247 -20
  189. package/dist/clients/observed-mutation-sources.js +101 -0
  190. package/dist/clients/observed-mutation.js +1215 -0
  191. package/dist/clients/opaque-mutation-scan.js +300 -40
  192. package/dist/clients/opengrep-config.js +4 -0
  193. package/dist/clients/package-manager.js +201 -44
  194. package/dist/clients/partial-edit-apply.js +359 -80
  195. package/dist/clients/path-attribution-telemetry.js +23 -7
  196. package/dist/clients/path-keyed-map.js +35 -3
  197. package/dist/clients/path-utils.js +460 -13
  198. package/dist/clients/persist-debounce.js +8 -1
  199. package/dist/clients/php-cs-fixer-config.js +114 -0
  200. package/dist/clients/pipeline.js +77 -24
  201. package/dist/clients/probe-home-state.js +228 -0
  202. package/dist/clients/process-bridge.js +66 -0
  203. package/dist/clients/process-singletons.js +210 -0
  204. package/dist/clients/process-snapshot.js +68 -0
  205. package/dist/clients/project-diagnostics/fresh-fetch.js +4 -3
  206. package/dist/clients/project-diagnostics/runner-adapters/madge.js +2 -1
  207. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +27 -3
  208. package/dist/clients/project-diagnostics/scanner.js +61 -24
  209. package/dist/clients/project-lens-config.js +393 -122
  210. package/dist/clients/project-snapshot.js +85 -35
  211. package/dist/clients/python-environment.js +217 -0
  212. package/dist/clients/python-provenance.js +639 -0
  213. package/dist/clients/quiet-window.js +6 -1
  214. package/dist/clients/read-bridge.js +13 -21
  215. package/dist/clients/read-expansion.js +9 -46
  216. package/dist/clients/read-guard-logger.js +39 -6
  217. package/dist/clients/read-guard-tool-lines.js +364 -212
  218. package/dist/clients/read-guard.js +95 -7
  219. package/dist/clients/recent-touches.js +17 -5
  220. package/dist/clients/resource-sampler.js +195 -96
  221. package/dist/clients/review-graph/builder.js +752 -132
  222. package/dist/clients/review-graph/service.js +55 -3
  223. package/dist/clients/review-graph/shared-extraction-ir.js +7 -15
  224. package/dist/clients/review-graph/tsconfig-paths.js +5 -1
  225. package/dist/clients/review-graph/workspace-modules.js +10 -74
  226. package/dist/clients/review-graph-logger.js +30 -4
  227. package/dist/clients/runtime-agent-end.js +18 -2
  228. package/dist/clients/runtime-context.js +49 -16
  229. package/dist/clients/runtime-coordinator.js +93 -6
  230. package/dist/clients/runtime-session.js +169 -34
  231. package/dist/clients/runtime-tool-call.js +183 -35
  232. package/dist/clients/runtime-tool-result.js +894 -241
  233. package/dist/clients/runtime-turn.js +1264 -74
  234. package/dist/clients/rust-client.js +31 -0
  235. package/dist/clients/safe-spawn.js +191 -28
  236. package/dist/clients/sanitize.js +7 -1
  237. package/dist/clients/scratch-tree-policy.js +1 -3
  238. package/dist/clients/security-scan-client.js +51 -17
  239. package/dist/clients/session-lifecycle.js +238 -42
  240. package/dist/clients/session-start-observability.js +79 -0
  241. package/dist/clients/sessionstart-logger.js +12 -3
  242. package/dist/clients/sg-runner.js +27 -15
  243. package/dist/clients/sgconfig.js +6 -1
  244. package/dist/clients/shared-checkout-guard.js +338 -0
  245. package/dist/clients/skills-resolver.js +105 -0
  246. package/dist/clients/smells-rollup.js +2 -2
  247. package/dist/clients/spawn-output-cap.js +37 -0
  248. package/dist/clients/spawn-timeout-cooldown.js +15 -1
  249. package/dist/clients/startup-scan.js +6 -7
  250. package/dist/clients/startup-timing.js +69 -4
  251. package/dist/clients/string-utils.js +33 -0
  252. package/dist/clients/subagent-mode.js +17 -4
  253. package/dist/clients/test-runner-client.js +586 -118
  254. package/dist/clients/test-runner-delivery.js +239 -0
  255. package/dist/clients/tool-definition.js +41 -1
  256. package/dist/clients/tool-policy.js +92 -22
  257. package/dist/clients/tree-sitter-cache.js +40 -40
  258. package/dist/clients/tree-sitter-client.js +97 -53
  259. package/dist/clients/tree-sitter-logger.js +19 -3
  260. package/dist/clients/tree-sitter-query-loader.js +81 -1
  261. package/dist/clients/tree-sitter-shared.js +51 -46
  262. package/dist/clients/tree-sitter-symbol-extractor.js +28 -0
  263. package/dist/clients/typos-config.js +5 -0
  264. package/dist/clients/user-notify.js +6 -2
  265. package/dist/clients/warm-attach.js +8 -10
  266. package/dist/clients/widget-state.js +191 -26
  267. package/dist/clients/word-index-logger.js +15 -3
  268. package/dist/clients/word-index-store.js +463 -0
  269. package/dist/clients/word-index.js +815 -125
  270. package/dist/clients/workspace-topology.js +25 -1
  271. package/dist/clients/zizmor-config.js +29 -6
  272. package/dist/index.js +68577 -53950
  273. package/dist/mcp/analyze-cli.js +3 -1
  274. package/dist/mcp/build-staleness.js +8 -7
  275. package/dist/mcp/cli.js +3 -1
  276. package/dist/mcp/server.js +133 -6
  277. package/dist/scripts/lib/process-scan.mjs +583 -0
  278. package/dist/scripts/lib/skills-predicate.mjs +129 -0
  279. package/dist/tools/effective-config.js +89 -0
  280. package/dist/tools/lens-diagnostics.js +99 -24
  281. package/dist/tools/lsp-diagnostics.js +81 -85
  282. package/dist/tools/lsp-navigation.js +40 -17
  283. package/dist/tools/shared.js +0 -1
  284. package/docs/agent-guide.md +68 -3
  285. package/docs/ast-grep_rules_catalog.md +41 -10
  286. package/docs/astplayground.md +26 -17
  287. package/docs/configuration.md +222 -0
  288. package/docs/dependencies.md +3 -3
  289. package/docs/features.md +44 -5
  290. package/docs/language-coverage.md +2 -2
  291. package/docs/pi-lens-fixer.md +25 -0
  292. package/docs/pi-lens-investigator.md +25 -0
  293. package/docs/pi-lens-reviewer.md +27 -0
  294. package/docs/pi-lens-subagent.md +38 -0
  295. package/docs/pi-lens-warden.md +55 -0
  296. package/docs/public-api-stability.md +359 -0
  297. package/docs/release-qa-baseline.md +182 -0
  298. package/docs/subagent-compat.md +110 -30
  299. package/docs/tree-sitter_rules_catalog.md +2 -2
  300. package/package.json +17 -21
  301. package/rules/ast-grep-rules/rule-tests/c-no-malloc-free-test.yml +20 -0
  302. package/rules/ast-grep-rules/rule-tests/cpp-no-malloc-free-test.yml +25 -0
  303. package/rules/ast-grep-rules/rule-tests/cpp-no-printf-test.yml +19 -0
  304. package/rules/ast-grep-rules/rule-tests/go-no-fmt-println-test.yml +19 -0
  305. package/rules/ast-grep-rules/rule-tests/go-no-panic-in-lib-test.yml +17 -0
  306. package/rules/ast-grep-rules/rule-tests/go-no-underscore-func-name-test.yml +18 -0
  307. package/rules/ast-grep-rules/rule-tests/go-prefer-errors-is-test.yml +15 -0
  308. package/rules/ast-grep-rules/rule-tests/go-prefer-string-builder-test.yml +21 -0
  309. package/rules/ast-grep-rules/rule-tests/hyphenated-svg-attribute-test.yml +11 -0
  310. package/rules/ast-grep-rules/rule-tests/kotlin-no-lateinit-test.yml +17 -0
  311. package/rules/ast-grep-rules/rule-tests/kotlin-no-nullable-boolean-test.yml +15 -0
  312. package/rules/ast-grep-rules/rule-tests/kotlin-no-println-test.yml +19 -0
  313. package/rules/ast-grep-rules/rule-tests/kotlin-no-unnecessary-let-test.yml +7 -0
  314. package/rules/ast-grep-rules/rule-tests/kotlin-no-unsafe-cast-test.yml +7 -0
  315. package/rules/ast-grep-rules/rule-tests/kotlin-no-var-test.yml +7 -0
  316. package/rules/ast-grep-rules/rule-tests/kotlin-prefer-data-class-test.yml +25 -0
  317. package/rules/ast-grep-rules/rule-tests/kotlin-prefer-is-empty-test.yml +11 -0
  318. package/rules/ast-grep-rules/rule-tests/no-important-test.yml +21 -0
  319. package/rules/ast-grep-rules/rule-tests/no-raw-types-test.yml +30 -0
  320. package/rules/ast-grep-rules/rule-tests/no-string-concat-in-loop-test.yml +100 -0
  321. package/rules/ast-grep-rules/rule-tests/no-system-out-println-test.yml +7 -0
  322. package/rules/ast-grep-rules/rule-tests/prefer-string-is-empty-test.yml +7 -0
  323. package/rules/ast-grep-rules/rule-tests/python-optional-type-test.yml +9 -0
  324. package/rules/ast-grep-rules/rule-tests/reducible-list-comprehension-test.yml +11 -0
  325. package/rules/ast-grep-rules/rule-tests/ruby-symbol-to-proc-candidate-test.yml +10 -0
  326. package/rules/ast-grep-rules/rule-tests/rust-no-chars-enumerate-test.yml +7 -0
  327. package/rules/ast-grep-rules/rules/c-no-malloc-free.yml +39 -0
  328. package/rules/ast-grep-rules/rules/cpp-no-malloc-free.yml +45 -0
  329. package/rules/ast-grep-rules/rules/cpp-no-printf.yml +41 -0
  330. package/rules/ast-grep-rules/rules/go-no-fmt-println.yml +43 -0
  331. package/rules/ast-grep-rules/rules/go-no-panic-in-lib.yml +41 -0
  332. package/rules/ast-grep-rules/rules/go-no-underscore-func-name.yml +35 -0
  333. package/rules/ast-grep-rules/rules/go-prefer-errors-is.yml +40 -0
  334. package/rules/ast-grep-rules/rules/go-prefer-string-builder.yml +43 -0
  335. package/rules/ast-grep-rules/rules/hyphenated-svg-attribute.yml +32 -0
  336. package/rules/ast-grep-rules/rules/kotlin-no-lateinit.yml +37 -0
  337. package/rules/ast-grep-rules/rules/kotlin-no-nullable-boolean.yml +33 -0
  338. package/rules/ast-grep-rules/rules/kotlin-no-println.yml +42 -0
  339. package/rules/ast-grep-rules/rules/kotlin-no-unnecessary-let.yml +28 -0
  340. package/rules/ast-grep-rules/rules/kotlin-no-unsafe-cast.yml +28 -0
  341. package/rules/ast-grep-rules/rules/kotlin-no-var.yml +35 -0
  342. package/rules/ast-grep-rules/rules/kotlin-prefer-data-class.yml +66 -0
  343. package/rules/ast-grep-rules/rules/kotlin-prefer-is-empty.yml +35 -0
  344. package/rules/ast-grep-rules/rules/no-important.yml +21 -0
  345. package/rules/ast-grep-rules/rules/no-raw-types.yml +33 -0
  346. package/rules/ast-grep-rules/rules/no-string-concat-in-loop.yml +90 -0
  347. package/rules/ast-grep-rules/rules/no-system-out-println.yml +16 -0
  348. package/rules/ast-grep-rules/rules/prefer-string-is-empty.yml +11 -0
  349. package/rules/ast-grep-rules/rules/python-optional-type.yml +22 -0
  350. package/rules/ast-grep-rules/rules/reducible-list-comprehension.yml +29 -0
  351. package/rules/ast-grep-rules/rules/ruby-symbol-to-proc-candidate.yml +25 -0
  352. package/rules/ast-grep-rules/rules/rust-no-chars-enumerate.yml +19 -0
  353. package/rules/tree-sitter-queries/python/python-cross-language-method.yml +3 -3
  354. package/rules/tree-sitter-queries/python/python-hallucinated-import.yml +2 -2
  355. package/rules/tree-sitter-queries/python/python-sql-injection.yml +12 -2
  356. package/scripts/analyze-pi-lens-logs.mjs +192 -1
  357. package/scripts/install-selftest.mjs +58 -2
  358. package/scripts/lib/skills-predicate.mjs +129 -0
  359. package/scripts/rpc-load-check.mjs +3 -1
@@ -8,6 +8,7 @@
8
8
  */
9
9
  import { logExtension } from "../../extension-log.js";
10
10
  import { getLSPService } from "../../lsp/index.js";
11
+ import { augmentPythonEnvironment, detectPythonEnvironment, } from "../../python-environment.js";
11
12
  import { safeSpawnAsync } from "../../safe-spawn.js";
12
13
  import { PRIORITY } from "../priorities.js";
13
14
  import { createAvailabilityChecker, resolveAvailableOrInstall, } from "./utils/runner-helpers.js";
@@ -17,7 +18,6 @@ const pyrightRunner = {
17
18
  id: "pyright",
18
19
  appliesTo: ["python"],
19
20
  priority: PRIORITY.LSP_FALLBACK,
20
- enabledByDefault: true,
21
21
  timeoutMs: 75_000,
22
22
  async run(ctx) {
23
23
  // Always allow pyright CLI fallback even when LSP is enabled.
@@ -52,12 +52,15 @@ const pyrightRunner = {
52
52
  if (!cmd) {
53
53
  return { status: "skipped", diagnostics: [], semantic: "none" };
54
54
  }
55
- // Run pyright with JSON output. Pass cwd so pyright resolves
56
- // pyrightconfig.json / the project venv from the project root rather than
57
- // falling back to process.cwd() (which mis-resolves in multi-root setups).
55
+ // Pyright's Node CLI falls back to `python` on PATH when the project has no
56
+ // explicit Pyright config. Apply the same environment the Python LSP uses so
57
+ // a conventional project .venv resolves without shell activation.
58
+ const pythonEnvironment = await detectPythonEnvironment(cwd);
59
+ const env = augmentPythonEnvironment(process.env, pythonEnvironment);
58
60
  const result = await safeSpawnAsync(cmd, ["--outputjson", ctx.filePath], {
59
61
  timeout: 60000,
60
62
  cwd,
63
+ env,
61
64
  });
62
65
  // Pyright returns non-zero when errors found, that's OK
63
66
  if (result.error) {
@@ -54,7 +54,6 @@ const rubocopRunner = {
54
54
  id: "rubocop",
55
55
  appliesTo: ["ruby"],
56
56
  priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
57
- enabledByDefault: true,
58
57
  async run(ctx) {
59
58
  const cwd = ctx.cwd || process.cwd();
60
59
  const policy = getLinterPolicyForCwd(ctx.filePath, cwd);
@@ -49,7 +49,6 @@ const ruffRunner = {
49
49
  id: "ruff-lint",
50
50
  appliesTo: ["python"],
51
51
  priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
52
- enabledByDefault: true,
53
52
  async run(ctx) {
54
53
  const cwd = ctx.cwd || process.cwd();
55
54
  const policy = getLinterPolicyForCwd(ctx.filePath, cwd);
@@ -5,14 +5,13 @@
5
5
  */
6
6
  import { dirname, isAbsolute, join, resolve } from "node:path";
7
7
  import { findNearestContaining } from "../../path-utils.js";
8
- import { RustClient } from "../../rust-client.js";
8
+ import { rustClient } from "../../rust-client.js";
9
9
  import { safeSpawnAsync } from "../../safe-spawn.js";
10
10
  import { stripAnsi } from "../../sanitize.js";
11
11
  import { getLazyInstallAttempt, tryLazyInstall, } from "./utils/lazy-installer.js";
12
12
  import { describeInstallAttempt, logAvailabilityDecision, } from "./utils/availability-policy.js";
13
13
  import { PRIORITY } from "../priorities.js";
14
14
  import { createCwdCachedProbe } from "./utils/runner-helpers.js";
15
- const rustClient = new RustClient();
16
15
  // Cached per-cwd `cargo clippy --version` probe (#120). Before this, the
17
16
  // probe fired on every Rust file save in a project where clippy was already
18
17
  // installed.
@@ -26,17 +25,22 @@ const rustClient = new RustClient();
26
25
  // The verdict is governed by the shared availability policy (#1494): a probe
27
26
  // timeout expires on a cooldown, so only a genuinely absent clippy latches.
28
27
  const CLIPPY_PROBE_BUDGET_MS = 8000;
29
- const makeClippyProbe = (cargoExe) => createCwdCachedProbe((cwd) => safeSpawnAsync(cargoExe, ["clippy", "--version"], {
28
+ let clippyProbeRevision = 0;
29
+ const makeClippyProbe = (cargoExe, flightKeyComponent = cargoExe) => createCwdCachedProbe((cwd) => safeSpawnAsync(cargoExe, ["clippy", "--version"], {
30
30
  timeout: CLIPPY_PROBE_BUDGET_MS,
31
31
  cwd,
32
- }), { tool: "clippy", budgetMs: CLIPPY_PROBE_BUDGET_MS });
32
+ }), {
33
+ tool: "clippy",
34
+ budgetMs: CLIPPY_PROBE_BUDGET_MS,
35
+ flightKeyComponent,
36
+ });
33
37
  const clippyAvailabilityByCargo = new Map();
34
38
  function getClippyProbe(cargoExe) {
35
39
  return (clippyAvailabilityByCargo.get(cargoExe) ?? refreshClippyProbe(cargoExe));
36
40
  }
37
41
  /** Replace the cached probe so a post-install state is observed. */
38
42
  function refreshClippyProbe(cargoExe) {
39
- const created = makeClippyProbe(cargoExe);
43
+ const created = makeClippyProbe(cargoExe, `${cargoExe}#refresh-${++clippyProbeRevision}`);
40
44
  clippyAvailabilityByCargo.set(cargoExe, created);
41
45
  return created;
42
46
  }
@@ -44,7 +48,6 @@ const rustClippyRunner = {
44
48
  id: "rust-clippy",
45
49
  appliesTo: ["rust"],
46
50
  priority: PRIORITY.SPECIALIZED_ANALYSIS,
47
- enabledByDefault: true,
48
51
  timeoutMs: 90_000,
49
52
  async run(ctx) {
50
53
  // Resolve cargo path using platform-aware lookup (handles ~/.cargo/bin on Windows)
@@ -108,7 +108,6 @@ const shellcheckRunner = {
108
108
  id: "shellcheck",
109
109
  appliesTo: ["shell"],
110
110
  priority: PRIORITY.GENERAL_ANALYSIS,
111
- enabledByDefault: true,
112
111
  skipTestFiles: false, // Shell scripts in test directories should still be checked
113
112
  async run(ctx) {
114
113
  const cwd = ctx.cwd || process.cwd();
@@ -29,7 +29,6 @@ const shfmtRunner = {
29
29
  id: "shfmt",
30
30
  appliesTo: ["shell"],
31
31
  priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
32
- enabledByDefault: true,
33
32
  skipTestFiles: false,
34
33
  async run(ctx) {
35
34
  const cwd = ctx.cwd || process.cwd();
@@ -80,7 +80,6 @@ const spellcheckRunner = {
80
80
  id: "spellcheck",
81
81
  appliesTo: ["markdown"],
82
82
  priority: PRIORITY.DOC_QUALITY,
83
- enabledByDefault: true,
84
83
  skipTestFiles: false, // Check docs in test files too
85
84
  async run(ctx) {
86
85
  // Skip if typos-cli is not installed
@@ -190,7 +190,6 @@ const spotbugsRunner = {
190
190
  id: "spotbugs",
191
191
  appliesTo: ["java", "kotlin"],
192
192
  priority: PRIORITY.DEEP_LANGUAGE_ANALYSIS,
193
- enabledByDefault: false,
194
193
  async run(ctx) {
195
194
  const cwd = ctx.cwd || process.cwd();
196
195
  const classesDir = findCompiledClassesDir(cwd);
@@ -115,7 +115,6 @@ const sqlfluffRunner = {
115
115
  id: "sqlfluff",
116
116
  appliesTo: ["sql"],
117
117
  priority: PRIORITY.SQL_LINT,
118
- enabledByDefault: true,
119
118
  skipTestFiles: false,
120
119
  async run(ctx) {
121
120
  const cwd = ctx.cwd || process.cwd();
@@ -114,7 +114,6 @@ const stylelintRunner = {
114
114
  id: "stylelint",
115
115
  appliesTo: ["css"],
116
116
  priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
117
- enabledByDefault: true,
118
117
  skipTestFiles: false,
119
118
  async run(ctx) {
120
119
  const cwd = ctx.cwd || process.cwd();
@@ -113,7 +113,6 @@ const swiftlintRunner = {
113
113
  id: "swiftlint",
114
114
  appliesTo: ["swift"],
115
115
  priority: PRIORITY.GENERAL_ANALYSIS,
116
- enabledByDefault: true,
117
116
  skipTestFiles: false,
118
117
  async run(ctx) {
119
118
  const cwd = ctx.cwd || process.cwd();
@@ -104,7 +104,6 @@ const taploRunner = {
104
104
  id: "taplo",
105
105
  appliesTo: ["toml"],
106
106
  priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
107
- enabledByDefault: true,
108
107
  skipTestFiles: false,
109
108
  async run(ctx) {
110
109
  const cwd = ctx.cwd || process.cwd();
@@ -126,7 +126,6 @@ const terragruntRunner = {
126
126
  id: "terragrunt",
127
127
  appliesTo: ["terragrunt"],
128
128
  priority: PRIORITY.GENERAL_ANALYSIS,
129
- enabledByDefault: true,
130
129
  skipTestFiles: false,
131
130
  async run(ctx) {
132
131
  const cwd = ctx.cwd || process.cwd();
@@ -50,7 +50,6 @@ const tflintRunner = {
50
50
  id: "tflint",
51
51
  appliesTo: ["terraform"],
52
52
  priority: PRIORITY.GENERAL_ANALYSIS,
53
- enabledByDefault: true,
54
53
  skipTestFiles: false,
55
54
  async run(ctx) {
56
55
  const cwd = ctx.cwd || process.cwd();
@@ -325,7 +325,6 @@ const treeSitterRunner = {
325
325
  "css",
326
326
  ],
327
327
  priority: PRIORITY.STRUCTURAL_ANALYSIS,
328
- enabledByDefault: true,
329
328
  skipTestFiles: false, // Run on test files too (structural issues matter there)
330
329
  async run(ctx) {
331
330
  // Use singleton client — WASM must never be re-initialized after first call
@@ -146,7 +146,6 @@ const trivyConfigRunner = {
146
146
  id: "trivy-config",
147
147
  appliesTo: ["docker", "yaml", "terraform", "json"],
148
148
  priority: PRIORITY.GENERAL_ANALYSIS,
149
- enabledByDefault: true,
150
149
  skipTestFiles: false,
151
150
  async run(ctx) {
152
151
  const cwd = ctx.cwd || process.cwd();
@@ -460,6 +460,9 @@ export function logAvailabilityDecision(decision, filePath = "<pi-lens>") {
460
460
  durationMs: Math.round(decision.elapsedMs),
461
461
  metadata: {
462
462
  tool: decision.tool,
463
+ ...(decision.producer !== undefined && {
464
+ producer: decision.producer,
465
+ }),
463
466
  verdict: decision.verdict,
464
467
  outcome: decision.outcome,
465
468
  cause: decision.cause,
@@ -4,6 +4,8 @@
4
4
  * Common patterns for parsing tool output into standardized diagnostics.
5
5
  * Supports the common `file:line:col: message` format used by most linters.
6
6
  */
7
+ import { stripAnsi } from "../../../sanitize.js";
8
+ import { escapeRegExp } from "../../../string-utils.js";
7
9
  import { getAutofixCapability } from "../../../tool-policy.js";
8
10
  /**
9
11
  * Create a parser for line-based tool output.
@@ -13,7 +15,7 @@ export function createLineParser(config) {
13
15
  return (raw, filePath) => {
14
16
  const diagnostics = [];
15
17
  // Optionally strip ANSI codes (for tools that output colored text)
16
- const clean = config.stripAnsi !== false ? raw.replace(/\x1b\[[0-9;]*m/g, "") : raw;
18
+ const clean = config.stripAnsi !== false ? stripAnsi(raw) : raw;
17
19
  const lines = clean.split("\n").filter((l) => l.trim());
18
20
  for (const line of lines) {
19
21
  const match = line.match(config.regex);
@@ -144,6 +146,3 @@ export function createSimpleParser(tool, options = {}) {
144
146
  return diagnostics;
145
147
  };
146
148
  }
147
- function escapeRegExp(string) {
148
- return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
149
- }