pi-lens 3.8.73 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. package/CHANGELOG.md +2614 -12
  2. package/README.md +50 -21
  3. package/dist/clients/actionable-warnings.js +73 -18
  4. package/dist/clients/agent-behavior-client.js +21 -4
  5. package/dist/clients/ast-grep-client.js +68 -16
  6. package/dist/clients/ast-grep-types.js +0 -1
  7. package/dist/clients/ast-grep-yaml-synth.js +37 -10
  8. package/dist/clients/atomic-write-staging.js +63 -0
  9. package/dist/clients/atomic-write.js +116 -16
  10. package/dist/clients/bash-file-access.js +193 -23
  11. package/dist/clients/biome-client.js +29 -25
  12. package/dist/clients/bootstrap.js +11 -2
  13. package/dist/clients/bounded-cache.js +34 -0
  14. package/dist/clients/bounded-pid-file-lock.js +192 -0
  15. package/dist/clients/bus-events-logger.js +5 -1
  16. package/dist/clients/bus-publish.js +10 -3
  17. package/dist/clients/cache/rule-cache.js +89 -6
  18. package/dist/clients/cache-manager.js +97 -9
  19. package/dist/clients/cache-observability.js +498 -0
  20. package/dist/clients/call-graph.js +460 -108
  21. package/dist/clients/cascade-logger.js +5 -1
  22. package/dist/clients/child-unref.js +85 -0
  23. package/dist/clients/codebase-model.js +52 -23
  24. package/dist/clients/collateral-test-role.js +40 -0
  25. package/dist/clients/complexity-client.js +6 -8
  26. package/dist/clients/console-guard-install.js +14 -0
  27. package/dist/clients/cooperative-budget.js +42 -0
  28. package/dist/clients/dead-code-client.js +2 -1
  29. package/dist/clients/debug-handles.js +206 -0
  30. package/dist/clients/debug-heap.js +167 -0
  31. package/dist/clients/degradation-ledger.js +153 -0
  32. package/dist/clients/dependency-checker.js +466 -63
  33. package/dist/clients/diagnostic-dispositions.js +83 -13
  34. package/dist/clients/diagnostics-publish.js +10 -3
  35. package/dist/clients/dispatch/auxiliary-lsp.js +34 -0
  36. package/dist/clients/dispatch/dispatcher.js +71 -13
  37. package/dist/clients/dispatch/fact-store.js +11 -0
  38. package/dist/clients/dispatch/facts/function-facts.js +37 -7
  39. package/dist/clients/dispatch/facts/import-facts.js +108 -119
  40. package/dist/clients/dispatch/facts/tree-sitter-facts.js +12 -12
  41. package/dist/clients/dispatch/facts/try-catch-facts.js +13 -0
  42. package/dist/clients/dispatch/indent-detect.js +35 -0
  43. package/dist/clients/dispatch/inline-suppressions.js +17 -8
  44. package/dist/clients/dispatch/integration.js +1094 -611
  45. package/dist/clients/dispatch/lazy.js +14 -0
  46. package/dist/clients/dispatch/plan.js +11 -1
  47. package/dist/clients/dispatch/rule-id-normalize.js +50 -0
  48. package/dist/clients/dispatch/rule-policy.js +135 -0
  49. package/dist/clients/dispatch/rules/async-noise.js +1 -0
  50. package/dist/clients/dispatch/rules/unsafe-boundary.js +7 -0
  51. package/dist/clients/dispatch/runners/ast-grep-napi.js +47 -6
  52. package/dist/clients/dispatch/runners/biome-check.js +5 -9
  53. package/dist/clients/dispatch/runners/detekt.js +3 -2
  54. package/dist/clients/dispatch/runners/hadolint.js +2 -1
  55. package/dist/clients/dispatch/runners/helm-lint.js +154 -0
  56. package/dist/clients/dispatch/runners/htmlhint.js +3 -2
  57. package/dist/clients/dispatch/runners/index.js +5 -1
  58. package/dist/clients/dispatch/runners/lsp.js +14 -6
  59. package/dist/clients/dispatch/runners/markdownlint.js +4 -9
  60. package/dist/clients/dispatch/runners/psscriptanalyzer.js +10 -1
  61. package/dist/clients/dispatch/runners/pyright.js +9 -5
  62. package/dist/clients/dispatch/runners/ruff.js +4 -8
  63. package/dist/clients/dispatch/runners/shellcheck.js +2 -3
  64. package/dist/clients/dispatch/runners/shfmt.js +2 -3
  65. package/dist/clients/dispatch/runners/spotbugs.js +2 -1
  66. package/dist/clients/dispatch/runners/taplo.js +2 -1
  67. package/dist/clients/dispatch/runners/terragrunt.js +163 -0
  68. package/dist/clients/dispatch/runners/tflint.js +37 -5
  69. package/dist/clients/dispatch/runners/tree-sitter.js +155 -166
  70. package/dist/clients/dispatch/runners/trivy-config.js +13 -7
  71. package/dist/clients/dispatch/runners/utils/lazy-installer.js +3 -0
  72. package/dist/clients/dispatch/runners/utils/runner-helpers.js +284 -34
  73. package/dist/clients/dispatch/runners/utils/spawn-outcome.js +22 -0
  74. package/dist/clients/dispatch/runners/yaml-rule-parser.js +5 -4
  75. package/dist/clients/disposition-publish.js +10 -3
  76. package/dist/clients/durable-store.js +97 -0
  77. package/dist/clients/event-loop-monitor.js +94 -3
  78. package/dist/clients/extension-log.js +139 -0
  79. package/dist/clients/extension-mode.js +73 -0
  80. package/dist/clients/feature-hints.js +53 -7
  81. package/dist/clients/file-kinds.js +143 -31
  82. package/dist/clients/file-role.js +18 -3
  83. package/dist/clients/file-utils.js +56 -34
  84. package/dist/clients/fix-worklog.js +14 -2
  85. package/dist/clients/format-events-publish.js +16 -3
  86. package/dist/clients/format-service.js +24 -8
  87. package/dist/clients/formatters-lazy.js +8 -0
  88. package/dist/clients/formatters.js +358 -61
  89. package/dist/clients/generated-artifacts.js +169 -15
  90. package/dist/clients/git-guard.js +681 -11
  91. package/dist/clients/git-tracked-ignore.js +4 -0
  92. package/dist/clients/go-client.js +2 -1
  93. package/dist/clients/govulncheck-client.js +8 -0
  94. package/dist/clients/grammar-source.js +12 -4
  95. package/dist/clients/gzip-stage-write.js +102 -0
  96. package/dist/clients/host-ports.js +31 -0
  97. package/dist/clients/installer/index.js +733 -213
  98. package/dist/clients/instance-reaper.js +142 -172
  99. package/dist/clients/jscpd-client.js +31 -54
  100. package/dist/clients/knip-client.js +78 -36
  101. package/dist/clients/language-policy.js +14 -2
  102. package/dist/clients/language-profile.js +72 -77
  103. package/dist/clients/latency-logger.js +28 -16
  104. package/dist/clients/lens-config.js +140 -166
  105. package/dist/clients/lens-engine.js +124 -21
  106. package/dist/clients/lens-events.js +27 -4
  107. package/dist/clients/lens-flag-registry.js +293 -0
  108. package/dist/clients/lens-map.js +96 -26
  109. package/dist/clients/live-bus-emitter.js +30 -0
  110. package/dist/clients/log-cleanup.js +8 -18
  111. package/dist/clients/lsp/cascade-tier.js +23 -3
  112. package/dist/clients/lsp/client.js +566 -57
  113. package/dist/clients/lsp/config.js +74 -10
  114. package/dist/clients/lsp/diagnostic-binding.js +86 -0
  115. package/dist/clients/lsp/edits.js +1012 -121
  116. package/dist/clients/lsp/index.js +1840 -803
  117. package/dist/clients/lsp/language.js +4 -1
  118. package/dist/clients/lsp/launch.js +40 -32
  119. package/dist/clients/lsp/path-utils.js +1 -1
  120. package/dist/clients/lsp/ruby-drive-dirs.js +83 -0
  121. package/dist/clients/lsp/server.js +279 -60
  122. package/dist/clients/lsp/workspace-diagnostics-cache.js +28 -4
  123. package/dist/clients/lsp-document-symbols.js +112 -0
  124. package/dist/clients/lsp-lazy.js +8 -0
  125. package/dist/clients/lsp-mutation.js +248 -0
  126. package/dist/clients/mcp/analyze.js +128 -36
  127. package/dist/clients/mcp/ipc.js +157 -24
  128. package/dist/clients/mcp/review.js +36 -3
  129. package/dist/clients/mcp/session.js +216 -8
  130. package/dist/clients/memory-sampler.js +115 -0
  131. package/dist/clients/metrics-client.js +2 -1
  132. package/dist/clients/metrics-history.js +2 -1
  133. package/dist/clients/module-report-lsp.js +5 -0
  134. package/dist/clients/module-report.js +267 -82
  135. package/dist/clients/ndjson-logger.js +334 -103
  136. package/dist/clients/opengrep-client.js +1 -1
  137. package/dist/clients/partial-edit-apply.js +120 -5
  138. package/dist/clients/path-keyed-map.js +76 -0
  139. package/dist/clients/path-utils.js +141 -5
  140. package/dist/clients/performance-report.js +327 -0
  141. package/dist/clients/pipeline.js +54 -13
  142. package/dist/clients/print-mode.js +21 -0
  143. package/dist/clients/project-changes.js +117 -4
  144. package/dist/clients/project-diagnostics/cache.js +3 -2
  145. package/dist/clients/project-diagnostics/extractors.js +26 -115
  146. package/dist/clients/project-diagnostics/fresh-fetch.js +149 -19
  147. package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +117 -0
  148. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +37 -5
  149. package/dist/clients/project-diagnostics/scanner.js +268 -128
  150. package/dist/clients/project-lens-config.js +138 -34
  151. package/dist/clients/project-report.js +64 -25
  152. package/dist/clients/project-scale.js +8 -10
  153. package/dist/clients/project-snapshot-persist-worker.js +6 -0
  154. package/dist/clients/project-snapshot.js +767 -8
  155. package/dist/clients/project-trust.js +181 -0
  156. package/dist/clients/quiet-window.js +27 -5
  157. package/dist/clients/read-bridge.js +147 -0
  158. package/dist/clients/read-expansion.js +22 -12
  159. package/dist/clients/read-guard-logger.js +159 -1
  160. package/dist/clients/read-guard-tool-lines.js +150 -29
  161. package/dist/clients/read-guard.js +262 -3
  162. package/dist/clients/redact/secrets.js +449 -0
  163. package/dist/clients/resource-sampler.js +144 -39
  164. package/dist/clients/reverse-deps.js +48 -0
  165. package/dist/clients/review-graph/builder.js +2570 -326
  166. package/dist/clients/review-graph/git-identity.js +2 -1
  167. package/dist/clients/review-graph/import-resolvers.js +21 -10
  168. package/dist/clients/review-graph/persist-worker.js +10 -0
  169. package/dist/clients/review-graph/query.js +5 -0
  170. package/dist/clients/review-graph/shared-extraction-ir.js +90 -0
  171. package/dist/clients/review-graph/symbol-id.js +46 -0
  172. package/dist/clients/review-graph/tsconfig-paths.js +57 -6
  173. package/dist/clients/review-graph/workspace-modules.js +51 -3
  174. package/dist/clients/review-graph-logger.js +53 -0
  175. package/dist/clients/ruff-client.js +27 -44
  176. package/dist/clients/runtime-agent-end.js +111 -75
  177. package/dist/clients/runtime-context.js +36 -12
  178. package/dist/clients/runtime-coordinator.js +76 -8
  179. package/dist/clients/runtime-session.js +799 -137
  180. package/dist/clients/runtime-tool-call.js +117 -62
  181. package/dist/clients/runtime-tool-result.js +218 -23
  182. package/dist/clients/runtime-turn.js +284 -40
  183. package/dist/clients/rust-client.js +2 -1
  184. package/dist/clients/safe-spawn.js +873 -71
  185. package/dist/clients/security-scan-client.js +2 -1
  186. package/dist/clients/session-start-observability.js +15 -0
  187. package/dist/clients/session-state-store.js +5 -3
  188. package/dist/clients/sessionstart-logger.js +18 -0
  189. package/dist/clients/sg-runner.js +284 -159
  190. package/dist/clients/slow-fs.js +2 -1
  191. package/dist/clients/smells-rollup.js +224 -0
  192. package/dist/clients/source-filter.js +231 -43
  193. package/dist/clients/source-walker.js +66 -10
  194. package/dist/clients/startup-scan.js +15 -16
  195. package/dist/clients/startup-timing.js +9 -0
  196. package/dist/clients/test-runner-client.js +38 -8
  197. package/dist/clients/todo-scanner.js +30 -3
  198. package/dist/clients/tool-event.js +35 -0
  199. package/dist/clients/tool-policy.js +388 -39
  200. package/dist/clients/tool-render.js +155 -0
  201. package/dist/clients/tree-sitter-cache.js +153 -140
  202. package/dist/clients/tree-sitter-client.js +1722 -80
  203. package/dist/clients/tree-sitter-logger.js +64 -1
  204. package/dist/clients/tree-sitter-query-loader.js +117 -12
  205. package/dist/clients/tree-sitter-shared.js +48 -19
  206. package/dist/clients/tree-sitter-symbol-extractor.js +115 -11
  207. package/dist/clients/user-notify.js +51 -0
  208. package/dist/clients/vanished-instance-marker.js +57 -0
  209. package/dist/clients/warm-attach.js +33 -13
  210. package/dist/clients/widget-state.js +342 -49
  211. package/dist/clients/word-index-logger.js +44 -0
  212. package/dist/clients/word-index.js +612 -68
  213. package/dist/clients/workspace-topology.js +100 -7
  214. package/dist/index.js +65923 -47161
  215. package/dist/mcp/analyze-cli.js +185 -29
  216. package/dist/mcp/cli.js +110 -0
  217. package/dist/mcp/server.js +272 -50
  218. package/dist/tools/ast-grep-search.js +93 -27
  219. package/dist/tools/lens-diagnostics.js +247 -41
  220. package/dist/tools/lsp-diagnostics.js +153 -40
  221. package/dist/tools/lsp-navigation.js +51 -31
  222. package/dist/tools/module-report.js +9 -0
  223. package/dist/tools/symbol-search.js +21 -2
  224. package/docs/agent-guide.md +247 -0
  225. package/docs/agent-tools.md +21 -10
  226. package/docs/analysisall.md +192 -0
  227. package/docs/api-ports-inventory.md +165 -0
  228. package/docs/ast-grep_rules_catalog.md +5 -2
  229. package/docs/astplayground.md +3 -4
  230. package/docs/audit1.md +5 -5
  231. package/docs/durable-store-audit-1202.md +32 -0
  232. package/docs/environment-variables.md +197 -11
  233. package/docs/fable.md +27 -0
  234. package/docs/features.md +35 -5
  235. package/docs/globalconfig.md +101 -5
  236. package/docs/language-coverage.md +6 -5
  237. package/docs/lsp-capability-matrix.md +2 -2
  238. package/docs/mcp.md +54 -20
  239. package/docs/servercapabilities.md +7 -4
  240. package/docs/settings.md +192 -0
  241. package/docs/tools.md +18 -1
  242. package/docs/tree-sitter_rules_catalog.md +11 -31
  243. package/docs/usage.md +31 -0
  244. package/package.json +139 -138
  245. package/rules/ast-grep-rules/rule-tests/hardcoded-url-js-test.yml +1 -0
  246. package/rules/ast-grep-rules/rule-tests/hardcoded-url-test.yml +2 -0
  247. package/rules/ast-grep-rules/rule-tests/no-bare-except-test.yml +49 -0
  248. package/rules/ast-grep-rules/rule-tests/no-bare-host-path-in-win32-branch-test.yml +87 -0
  249. package/rules/ast-grep-rules/rule-tests/no-case-declarations-js-test.yml +10 -0
  250. package/rules/ast-grep-rules/rule-tests/no-case-declarations-test.yml +10 -0
  251. package/rules/ast-grep-rules/rule-tests/no-javascript-url-js-test.yml +10 -0
  252. package/rules/ast-grep-rules/rule-tests/no-javascript-url-test.yml +10 -0
  253. package/rules/ast-grep-rules/rule-tests/no-nested-links-test.yml +11 -1
  254. package/rules/ast-grep-rules/rule-tests/no-raw-json-store-write-test.yml +17 -0
  255. package/rules/ast-grep-rules/rule-tests/no-win32-isabsolute-for-qualification-test.yml +16 -0
  256. package/rules/ast-grep-rules/rule-tests/strict-equality-js-test.yml +3 -0
  257. package/rules/ast-grep-rules/rule-tests/strict-equality-test.yml +3 -0
  258. package/rules/ast-grep-rules/rule-tests/strict-inequality-js-test.yml +3 -0
  259. package/rules/ast-grep-rules/rule-tests/strict-inequality-test.yml +4 -0
  260. package/rules/ast-grep-rules/rules/hardcoded-url-js.yml +22 -4
  261. package/rules/ast-grep-rules/rules/hardcoded-url.yml +22 -4
  262. package/rules/ast-grep-rules/rules/no-bare-except.yml +3 -15
  263. package/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +25 -0
  264. package/rules/ast-grep-rules/rules/no-case-declarations-js.yml +4 -3
  265. package/rules/ast-grep-rules/rules/no-case-declarations.yml +4 -3
  266. package/rules/ast-grep-rules/rules/no-console-except-error-js.yml +10 -0
  267. package/rules/ast-grep-rules/rules/no-console-except-error.yml +10 -0
  268. package/rules/ast-grep-rules/rules/no-javascript-url-js.yml +42 -6
  269. package/rules/ast-grep-rules/rules/no-javascript-url.yml +42 -6
  270. package/rules/ast-grep-rules/rules/no-nested-links.yml +7 -0
  271. package/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +30 -0
  272. package/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +23 -0
  273. package/rules/ast-grep-rules/rules/strict-equality-js.yml +14 -1
  274. package/rules/ast-grep-rules/rules/strict-equality.yml +14 -1
  275. package/rules/ast-grep-rules/rules/strict-inequality-js.yml +14 -1
  276. package/rules/ast-grep-rules/rules/strict-inequality.yml +14 -1
  277. package/rules/tree-sitter-queries/cpp/no-memset-sensitive-data.yml +9 -3
  278. package/rules/tree-sitter-queries/cpp/no-scoped-lock-without-args.yml +6 -6
  279. package/rules/tree-sitter-queries/css/calc-spacing.yml +8 -6
  280. package/rules/tree-sitter-queries/go/go-mutex-copy.yml +21 -18
  281. package/rules/tree-sitter-queries/go/go-shared-map-write-goroutine.yml +3 -3
  282. package/rules/tree-sitter-queries/java/infinite-loop-java.yml +3 -3
  283. package/rules/tree-sitter-queries/java/junit-call-super.yml +6 -4
  284. package/rules/tree-sitter-queries/java/no-double-checked-locking.yml +10 -8
  285. package/rules/tree-sitter-queries/java/no-field-shadowing.yml +1 -1
  286. package/rules/tree-sitter-queries/java/prepared-statement-valid-indices.yml +2 -3
  287. package/rules/tree-sitter-queries/java/resources-closed.yml +2 -2
  288. package/rules/tree-sitter-queries/java/springboot-default-package.yml +6 -3
  289. package/rules/tree-sitter-queries/java/switch-fall-through.yml +6 -4
  290. package/rules/tree-sitter-queries/java/switch-non-case-labels.yml +4 -3
  291. package/rules/tree-sitter-queries/java/tests-include-assertions.yml +6 -5
  292. package/rules/tree-sitter-queries/javascript/switch-case-termination-js.yml +5 -8
  293. package/rules/tree-sitter-queries/javascript/switch-non-case-labels.yml +3 -2
  294. package/rules/tree-sitter-queries/kotlin/prepared-statement-indices.yml +9 -5
  295. package/rules/tree-sitter-queries/php/this-in-static-context.yml +5 -5
  296. package/rules/tree-sitter-queries/python/exit-signature-check.yml +2 -9
  297. package/rules/tree-sitter-queries/python/in-operator-unsupported.yml +3 -4
  298. package/rules/tree-sitter-queries/python/no-super-torchscript.yml +4 -8
  299. package/rules/tree-sitter-queries/python/notimplemented-boolean-context.yml +1 -5
  300. package/rules/tree-sitter-queries/python/python-empty-except.yml +1 -1
  301. package/rules/tree-sitter-queries/python/return-in-init.yml +0 -2
  302. package/rules/tree-sitter-queries/python/yield-return-outside-function.yml +0 -3
  303. package/rules/tree-sitter-queries/ruby/ruby-command-injection.yml +1 -12
  304. package/rules/tree-sitter-queries/ruby/ruby-eval.yml +1 -1
  305. package/rules/tree-sitter-queries/ruby/ruby-insecure-deserialization.yml +4 -4
  306. package/rules/tree-sitter-queries/ruby/ruby-insecure-random.yml +4 -11
  307. package/rules/tree-sitter-queries/ruby/ruby-open-struct.yml +1 -1
  308. package/rules/tree-sitter-queries/ruby/ruby-string-eval.yml +2 -3
  309. package/rules/tree-sitter-queries/ruby/ruby-weak-hash.yml +4 -4
  310. package/rules/tree-sitter-queries/rust/rust-lock-held-across-await.yml +4 -3
  311. package/rules/tree-sitter-queries/tsx/no-nested-links.yml +4 -6
  312. package/rules/tree-sitter-queries/typescript/console-statement.yml +11 -0
  313. package/rules/tree-sitter-queries/typescript/duplicate-function-arg.yml +4 -9
  314. package/rules/tree-sitter-queries/typescript/empty-switch-case.yml +13 -9
  315. package/rules/tree-sitter-queries/typescript/infinite-loop.yml +2 -2
  316. package/rules/tree-sitter-queries/typescript/mixed-async-styles.yml +10 -1
  317. package/rules/tree-sitter-queries/typescript/switch-case-termination.yml +5 -8
  318. package/rules/tree-sitter-queries/typescript/ts-insecure-random.yml +7 -10
  319. package/rules/tree-sitter-queries/typescript/unsafe-regex.yml +4 -2
  320. package/rules/typos/_typos.toml +17 -0
  321. package/scripts/analyze-pi-lens-logs.mjs +55 -2
  322. package/skills/pi-lens-write-tree-sitter-rule/SKILL.md +5 -0
  323. package/dist/clients/ast-grep-parser.js +0 -86
  324. package/dist/clients/config-enabled-shape.js +0 -39
  325. package/dist/clients/lsp/interactive-install.js +0 -367
  326. package/dist/clients/lsp/lsp-index.js +0 -10
  327. package/dist/clients/lsp/server-strategies.js +0 -5
  328. package/dist/clients/project-metadata.js +0 -690
  329. package/dist/clients/source-groups.js +0 -96
  330. package/dist/clients/types.js +0 -11
  331. package/docs/env_variables.md +0 -10
  332. package/rules/tree-sitter-queries/abap-disabled/delete-where.yml +0 -46
  333. package/rules/tree-sitter-queries/cpp/no-confused-move-forward.yml +0 -59
  334. package/rules/tree-sitter-queries/cpp/noexcept-functions.yml +0 -58
  335. package/rules/tree-sitter-queries/java/mockito-initialized.yml +0 -66
  336. package/rules/tree-sitter-queries/java/no-wait-notify-on-thread.yml +0 -58
  337. package/rules/tree-sitter-queries/java/short-circuit-logic.yml +0 -57
  338. package/rules/tree-sitter-queries/java/spring-session-attributes-setcomplete.yml +0 -75
  339. package/rules/tree-sitter-queries/plsql-disabled/delete-update-where.yml +0 -56
  340. package/rules/tree-sitter-queries/plsql-disabled/end-loop-semicolon.yml +0 -51
  341. package/rules/tree-sitter-queries/plsql-disabled/fetch-bulk-collect-limit.yml +0 -47
  342. package/rules/tree-sitter-queries/plsql-disabled/forallsave-exceptions.yml +0 -51
  343. package/rules/tree-sitter-queries/plsql-disabled/nchar-nvarchar2-bytes.yml +0 -54
  344. package/rules/tree-sitter-queries/plsql-disabled/not-null-initialization.yml +0 -59
  345. package/rules/tree-sitter-queries/plsql-disabled/raise-application-error-codes.yml +0 -50
  346. package/rules/tree-sitter-queries/typescript-disabled/ts-path-traversal.yml +0 -71
package/package.json CHANGED
@@ -1,140 +1,141 @@
1
1
  {
2
- "name": "pi-lens",
3
- "version": "3.8.73",
4
- "type": "module",
5
- "description": "Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo",
6
- "repository": {
7
- "type": "git",
8
- "url": "git+https://github.com/apmantza/pi-lens.git"
9
- },
10
- "main": "./dist/index.js",
11
- "bin": {
12
- "pi-lens-mcp": "dist/mcp/server.js",
13
- "pi-lens-analyze": "dist/mcp/analyze-cli.js"
14
- },
15
- "scripts": {
16
- "build": "tsc --project tsconfig.build.json",
17
- "build:dist": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && npx --yes -p typescript@7.0.2 tsc --project tsconfig.dist.json --noCheck && npm run bundle:dist",
18
- "bundle:dist": "node scripts/bundle-dist.mjs",
19
- "prepare": "npm run build:dist && node scripts/download-grammars.js --core --dest grammars",
20
- "lint": "tsc --project tsconfig.json",
21
- "watch": "tsc --watch",
22
- "test": "vitest run",
23
- "test:unit": "vitest run --ignore tests/index-integration.test.ts --ignore tests/clients/lsp/integration.test.ts",
24
- "test:integration": "vitest run tests/index-integration.test.ts tests/clients/lsp/integration.test.ts",
25
- "test:watch": "vitest",
26
- "check": "node scripts/check-extensions.mjs",
27
- "selftest:install": "node scripts/install-selftest.mjs",
28
- "check:lockfile": "node scripts/check-lockfile-sync.mjs",
29
- "check:grammars": "node scripts/check-grammar-provenance.mjs",
30
- "check:grammar-load": "node scripts/check-grammar-load.mjs",
31
- "audit:tree-sitter": "node scripts/audit-tree-sitter-rules.mjs",
32
- "audit:rule-catalog": "node scripts/validate-rule-catalog.mjs",
33
- "audit:astgrep-rule-pairs": "node scripts/audit-astgrep-rule-pairs.mjs",
34
- "audit:playground": "node scripts/playground-verify-rule.mjs",
35
- "logs:smells": "node scripts/analyze-pi-lens-logs.mjs",
36
- "changelog:check": "node scripts/changelog-release.mjs --check",
37
- "changelog:release": "node scripts/changelog-release.mjs",
38
- "changelog:extract": "node scripts/changelog-extract.mjs",
39
- "release:backfill-notes": "node scripts/backfill-github-releases.mjs",
40
- "release:backfill-thanks": "node scripts/backfill-release-thanks.mjs",
41
- "docs:rule-catalogs": "node scripts/gen-rule-catalogs.mjs",
42
- "banner": "npx -y sharp-cli --input banner.svg --output banner.png resize 2200 620",
43
- "download-grammars": "node scripts/download-grammars.js",
44
- "harness:poc": "node scripts/run-harness.mjs cases/ts/pipeline-dispatch-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
45
- "harness:python-poc": "node scripts/run-harness.mjs cases/python/pipeline-dispatch-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
46
- "harness:ts-format-poc": "node scripts/run-harness.mjs cases/ts/format-default-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
47
- "harness:python-autofix-poc": "node scripts/run-harness.mjs cases/python/autofix-default-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
48
- "harness:go-poc": "node scripts/run-harness.mjs cases/go/pipeline-dispatch-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\""
49
- },
50
- "keywords": [
51
- "pi",
52
- "pi-extension",
53
- "pi-package",
54
- "linter",
55
- "biome",
56
- "ast-grep",
57
- "ruff",
58
- "typescript",
59
- "code-quality",
60
- "feedback",
61
- "type-coverage",
62
- "jscpd",
63
- "knip"
64
- ],
65
- "author": "Apostolos Mantzaris",
66
- "license": "MIT",
67
- "files": [
68
- "dist/",
69
- "docs/",
70
- "grammars/",
71
- "config/",
72
- "rules/",
73
- "skills/",
74
- "scripts/download-grammars.js",
75
- "scripts/grammars.lock.json",
76
- "scripts/analyze-pi-lens-logs.mjs",
77
- "scripts/install-selftest.mjs",
78
- "scripts/rpc-load-check.mjs",
79
- "README.md",
80
- "CHANGELOG.md",
81
- "banner.svg",
82
- "banner.png"
83
- ],
84
- "dependencies": {
85
- "@ast-grep/cli": "^0.45.0",
86
- "@ast-grep/napi": "^0.45.0",
87
- "@earendil-works/pi-tui": "^0.82.1",
88
- "js-yaml": "^5.2.2",
89
- "minimatch": "^10.2.5",
90
- "pidusage": "^4.0.1",
91
- "typebox": "^1.0.0",
92
- "vscode-jsonrpc": "^9.0.0"
93
- },
94
- "peerDependencies": {
95
- "@earendil-works/pi-coding-agent": "*"
96
- },
97
- "peerDependenciesMeta": {
98
- "@earendil-works/pi-coding-agent": {
99
- "optional": true
100
- }
101
- },
102
- "optionalDependencies": {
103
- "web-tree-sitter": "0.25.10"
104
- },
105
- "devDependencies": {
106
- "@biomejs/biome": "^2.4.10",
107
- "@earendil-works/pi-coding-agent": "^0.82.1",
108
- "@types/node": "^26.0.0",
109
- "@types/pidusage": "^2.0.5",
110
- "@vitest/coverage-v8": "^4.1.5",
111
- "typescript": "^7.0.2",
112
- "typescript-language-server": "^5.1.3",
113
- "vitest": "^4.1.1"
114
- },
115
- "pi": {
116
- "extensions": [
117
- "./dist/index.js"
118
- ],
119
- "skills": [
120
- "../../skills"
121
- ]
122
- },
123
- "knip": {
124
- "entry": [
125
- "index.ts"
126
- ],
127
- "project": [
128
- "**/*.ts",
129
- "!**/*.test.ts"
130
- ],
131
- "ignore": [
132
- "**/*.test.ts"
133
- ]
134
- },
135
- "allowScripts": {
136
- "@ast-grep/cli@0.44.1": true,
137
- "@google/genai@1.52.0": true,
138
- "protobufjs@7.6.4": true
139
- }
2
+ "name": "pi-lens",
3
+ "version": "4.0.0",
4
+ "type": "module",
5
+ "description": "Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/apmantza/pi-lens.git"
9
+ },
10
+ "main": "./dist/index.js",
11
+ "bin": {
12
+ "pi-lens": "dist/mcp/cli.js",
13
+ "pi-lens-mcp": "dist/mcp/server.js",
14
+ "pi-lens-analyze": "dist/mcp/analyze-cli.js"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc --project tsconfig.build.json",
18
+ "build:dist": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && npx --yes -p typescript@7.0.2 tsc --project tsconfig.dist.json --noCheck && npm run bundle:dist",
19
+ "bundle:dist": "node scripts/bundle-dist.mjs",
20
+ "prepare": "npm run build:dist && node scripts/download-grammars.js --core --dest grammars",
21
+ "lint": "tsc --project tsconfig.json",
22
+ "watch": "tsc --watch",
23
+ "test": "node scripts/with-test-lock.mjs -- vitest run",
24
+ "test:unit": "node scripts/with-test-lock.mjs -- vitest run",
25
+ "test:integration": "node scripts/with-test-lock.mjs -- vitest run tests/index-integration.test.ts tests/clients/lsp/integration.test.ts",
26
+ "test:watch": "vitest",
27
+ "check": "node scripts/check-extensions.mjs",
28
+ "selftest:install": "node scripts/install-selftest.mjs",
29
+ "check:lockfile": "node scripts/check-lockfile-sync.mjs",
30
+ "check:grammars": "node scripts/check-grammar-provenance.mjs",
31
+ "check:grammar-load": "node scripts/check-grammar-load.mjs",
32
+ "audit:tree-sitter": "node scripts/audit-tree-sitter-rules.mjs",
33
+ "audit:rule-catalog": "node scripts/validate-rule-catalog.mjs",
34
+ "audit:astgrep-rule-pairs": "node scripts/audit-astgrep-rule-pairs.mjs",
35
+ "audit:playground": "node scripts/playground-verify-rule.mjs",
36
+ "logs:smells": "node scripts/analyze-pi-lens-logs.mjs",
37
+ "changelog:check": "node scripts/rollup-changelog.mjs --check",
38
+ "changelog:release": "node scripts/changelog-release.mjs",
39
+ "changelog:extract": "node scripts/changelog-extract.mjs",
40
+ "release:backfill-notes": "node scripts/backfill-github-releases.mjs",
41
+ "release:backfill-thanks": "node scripts/backfill-release-thanks.mjs",
42
+ "docs:rule-catalogs": "node scripts/gen-rule-catalogs.mjs",
43
+ "banner": "npx -y sharp-cli --input banner.svg --output banner.png resize 2200 620",
44
+ "download-grammars": "node scripts/download-grammars.js",
45
+ "harness:poc": "node scripts/run-harness.mjs cases/ts/pipeline-dispatch-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
46
+ "harness:python-poc": "node scripts/run-harness.mjs cases/python/pipeline-dispatch-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
47
+ "harness:ts-format-poc": "node scripts/run-harness.mjs cases/ts/format-default-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
48
+ "harness:python-autofix-poc": "node scripts/run-harness.mjs cases/python/autofix-default-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
49
+ "harness:go-poc": "node scripts/run-harness.mjs cases/go/pipeline-dispatch-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\""
50
+ },
51
+ "keywords": [
52
+ "pi",
53
+ "pi-extension",
54
+ "pi-package",
55
+ "linter",
56
+ "biome",
57
+ "ast-grep",
58
+ "ruff",
59
+ "typescript",
60
+ "code-quality",
61
+ "feedback",
62
+ "type-coverage",
63
+ "jscpd",
64
+ "knip"
65
+ ],
66
+ "author": "Apostolos Mantzaris",
67
+ "license": "MIT",
68
+ "files": [
69
+ "dist/",
70
+ "docs/",
71
+ "grammars/",
72
+ "config/",
73
+ "rules/",
74
+ "skills/",
75
+ "scripts/download-grammars.js",
76
+ "scripts/grammars.lock.json",
77
+ "scripts/analyze-pi-lens-logs.mjs",
78
+ "scripts/install-selftest.mjs",
79
+ "scripts/rpc-load-check.mjs",
80
+ "README.md",
81
+ "CHANGELOG.md",
82
+ "banner.svg",
83
+ "banner.png"
84
+ ],
85
+ "dependencies": {
86
+ "@ast-grep/cli": "^0.45.0",
87
+ "@ast-grep/napi": "^0.45.0",
88
+ "@earendil-works/pi-tui": "^0.84.1",
89
+ "js-yaml": "^5.2.2",
90
+ "minimatch": "^10.2.6",
91
+ "pidusage": "^4.0.1",
92
+ "typebox": "^1.0.0",
93
+ "vscode-jsonrpc": "^9.0.0"
94
+ },
95
+ "peerDependencies": {
96
+ "@earendil-works/pi-coding-agent": "*"
97
+ },
98
+ "peerDependenciesMeta": {
99
+ "@earendil-works/pi-coding-agent": {
100
+ "optional": true
101
+ }
102
+ },
103
+ "optionalDependencies": {
104
+ "web-tree-sitter": "0.25.10"
105
+ },
106
+ "devDependencies": {
107
+ "@biomejs/biome": "^2.4.10",
108
+ "@earendil-works/pi-coding-agent": "^0.84.1",
109
+ "@types/node": "^26.0.0",
110
+ "@types/pidusage": "^2.0.5",
111
+ "@vitest/coverage-v8": "^4.1.5",
112
+ "typescript": "^7.0.2",
113
+ "typescript-language-server": "^5.1.3",
114
+ "vitest": "^4.1.1"
115
+ },
116
+ "pi": {
117
+ "extensions": [
118
+ "./dist/index.js"
119
+ ],
120
+ "skills": [
121
+ "../../skills"
122
+ ]
123
+ },
124
+ "knip": {
125
+ "entry": [
126
+ "index.ts"
127
+ ],
128
+ "project": [
129
+ "**/*.ts",
130
+ "!**/*.test.ts"
131
+ ],
132
+ "ignore": [
133
+ "**/*.test.ts"
134
+ ]
135
+ },
136
+ "allowScripts": {
137
+ "@ast-grep/cli@0.45.1": true,
138
+ "@google/genai@1.52.0": true,
139
+ "protobufjs@7.6.5": true
140
+ }
140
141
  }
@@ -2,6 +2,7 @@ id: hardcoded-url-js
2
2
  valid:
3
3
  - 'const url = process.env.API_URL'
4
4
  - 'const x = "hello"'
5
+ - 'export const BASE_URL_CLINE = "https://api.cline.bot";'
5
6
  invalid:
6
7
  - 'const url = "https://api.example.com"'
7
8
  - 'const endpoint = "http://localhost:3000"'
@@ -2,6 +2,8 @@ id: hardcoded-url
2
2
  valid:
3
3
  - 'const url = process.env.API_URL'
4
4
  - 'const x = "hello"'
5
+ - 'export const BASE_URL_CLINE = "https://api.cline.bot";'
6
+ - 'export const URL_KILO_TOS = "https://kilo.dev/tos";'
5
7
  invalid:
6
8
  - 'const url = "https://api.example.com"'
7
9
  - 'const endpoint = "http://localhost:3000"'
@@ -15,6 +15,55 @@ valid:
15
15
  doThing()
16
16
  except Exception as e:
17
17
  handle(e)
18
+ - |
19
+ # dotted/qualified name (#1031)
20
+ try:
21
+ doThing()
22
+ except asyncio.TimeoutError:
23
+ handle()
24
+ - |
25
+ # parenthesized single name (mirrors #1026's tree-sitter spec set)
26
+ try:
27
+ doThing()
28
+ except (ValueError):
29
+ handle()
30
+ - |
31
+ # subscripted generic (#1244)
32
+ try:
33
+ doThing()
34
+ except dict[str, int]:
35
+ handle()
36
+ - |
37
+ # subscripted PEP 654 exception group (#1244)
38
+ try:
39
+ doThing()
40
+ except BaseExceptionGroup[TypeError, ValueError]:
41
+ handle()
42
+ - |
43
+ try:
44
+ doThing()
45
+ except ValueError | TypeError:
46
+ handle()
47
+ - |
48
+ try:
49
+ doThing()
50
+ except cache[key]:
51
+ handle()
52
+ - |
53
+ try:
54
+ doThing()
55
+ except (ValueError,):
56
+ handle()
57
+ - |
58
+ try:
59
+ doThing()
60
+ except (mod.E1, E2) as error:
61
+ handle(error)
62
+ - |
63
+ try:
64
+ doThing()
65
+ except* ValueError:
66
+ handle()
18
67
  invalid:
19
68
  - |
20
69
  try:
@@ -0,0 +1,87 @@
1
+ id: no-bare-host-path-in-win32-branch
2
+ valid:
3
+ # DOCUMENTED LIMITATION (#1339 review): the exact pre-fix #1150 shape --
4
+ # bare dirname in an unguarded helper CALLED FROM the guarded branch.
5
+ # ast-grep has no cross-function reach, so this is deliberately a
6
+ # negative fixture; it exists so a future strengthening flips it to a
7
+ # positive consciously, not accidentally. Review-enforced meanwhile
8
+ # (AGENTS.md defect-shape 2).
9
+ - |
10
+ import * as path from "node:path";
11
+ import { isWindowsPath } from "./path-utils.js";
12
+ function resolveNonExisting(filePath: string) {
13
+ return path.dirname(filePath);
14
+ }
15
+ function normalize(filePath: string) {
16
+ if (isWindowsPath(filePath)) {
17
+ return resolveNonExisting(filePath);
18
+ }
19
+ }
20
+ - |
21
+ import * as path from "node:path";
22
+ import { isWindowsPath } from "./path-utils.js";
23
+ function f(filePath: string) {
24
+ if (isWindowsPath(filePath)) {
25
+ return path.win32.dirname(filePath);
26
+ }
27
+ return path.dirname(filePath);
28
+ }
29
+ - |
30
+ import * as path from "node:path";
31
+ import { isWindowsPath } from "./path-utils.js";
32
+ function f(filePath: string) {
33
+ return isWindowsPath(filePath)
34
+ ? path.win32.basename(filePath)
35
+ : path.basename(filePath);
36
+ }
37
+ - |
38
+ import { dirname } from "node:path";
39
+ function f(filePath: string) {
40
+ if (someOtherPredicate(filePath)) {
41
+ return dirname(filePath);
42
+ }
43
+ }
44
+ invalid:
45
+ # Fresh probes from the #1339 review, encoded so they stay covered.
46
+ - |
47
+ import * as path from "node:path";
48
+ import { isWindowsPath } from "./path-utils.js";
49
+ function f(filePath: string) {
50
+ if (isWindowsPath(filePath)) {
51
+ for (const part of parts) {
52
+ const nested = path.join(filePath, part);
53
+ }
54
+ }
55
+ }
56
+ - |
57
+ import * as path from "node:path";
58
+ import { isWindowsPath } from "./path-utils.js";
59
+ function f(filePath: string) {
60
+ if (isWindowsPath(filePath)) {
61
+ return filePath.split(path.sep);
62
+ }
63
+ }
64
+ - |
65
+ import * as path from "node:path";
66
+ import { isFullyQualifiedWin32 } from "./path-utils.js";
67
+ function f(filePath: string, other: boolean) {
68
+ if (isFullyQualifiedWin32(filePath) && other) {
69
+ return path.basename(filePath);
70
+ }
71
+ }
72
+ - |
73
+ import * as path from "node:path";
74
+ import { isWindowsPath } from "./path-utils.js";
75
+ function f(filePath: string) {
76
+ if (isWindowsPath(filePath)) {
77
+ return path.dirname(filePath);
78
+ }
79
+ }
80
+ - |
81
+ import { join, sep } from "node:path";
82
+ import { isFullyQualifiedWin32 } from "./path-utils.js";
83
+ function f(filePath: string) {
84
+ if (isFullyQualifiedWin32(filePath)) {
85
+ return join(filePath, sep);
86
+ }
87
+ }
@@ -7,6 +7,16 @@ valid:
7
7
  break;
8
8
  }
9
9
  }
10
+ - |
11
+ switch (x) {
12
+ case 1: {
13
+ if (x) {
14
+ const y = 1;
15
+ consume(y);
16
+ }
17
+ break;
18
+ }
19
+ }
10
20
  - |
11
21
  var z = 1; switch (x) { case 1: break; }
12
22
  invalid:
@@ -7,6 +7,16 @@ valid:
7
7
  break;
8
8
  }
9
9
  }
10
+ - |
11
+ switch (x) {
12
+ case 1: {
13
+ if (x) {
14
+ const y = 1;
15
+ consume(y);
16
+ }
17
+ break;
18
+ }
19
+ }
10
20
  - |
11
21
  var z = 1; switch (x) { case 1: break; }
12
22
  invalid:
@@ -8,7 +8,17 @@ valid:
8
8
  it("rejects javascript: urls", () => {
9
9
  expect(openBrowser("javascript:alert(1)")).toBe(false);
10
10
  });
11
+ - 'const links = arr.filter((l) => !l.startsWith("javascript:"))'
12
+ - 'if (url.includes("javascript:")) return null;'
13
+ - 'const isBlocked = url === "javascript:alert(1)"'
14
+ - 'const safe = url !== "javascript:alert(1)"'
15
+ - 'url?.startsWith("javascript:")'
11
16
  invalid:
12
17
  - 'a.href = "javascript:alert(1)"'
13
18
  - 'a.href = "javascript:void(0)"'
14
19
  - 'const u = "javascript:alert(1)"'
20
+ - 'a.href = str.replace("http:", "javascript:alert(1)")'
21
+ - 'if (candidates.includes(link.href = "javascript:alert(1)")) { doThing(); }'
22
+ - 'someArray.includes((a.href = "javascript:alert(1)", true));'
23
+ - 'if ((a.href = "javascript:alert(1)") === expected) { doThing(); }'
24
+ - 'const ok = (typeof (a.href = "javascript:alert(1)")) === "string";'
@@ -12,7 +12,17 @@ valid:
12
12
  test.each(["javascript:alert(1)"])("rejects %s", (url) => {
13
13
  expect(openBrowser(url)).toBe(false);
14
14
  });
15
+ - 'const links = arr.filter((l) => !l.startsWith("javascript:"))'
16
+ - 'if (url.includes("javascript:")) return null;'
17
+ - 'const isBlocked = url === "javascript:alert(1)"'
18
+ - 'const safe = url !== "javascript:alert(1)"'
19
+ - 'url?.startsWith("javascript:")'
15
20
  invalid:
16
21
  - 'a.href = "javascript:alert(1)"'
17
22
  - 'a.href = "javascript:void(0)"'
18
23
  - 'const u = "javascript:alert(1)"'
24
+ - 'a.href = str.replace("http:", "javascript:alert(1)")'
25
+ - 'if (candidates.includes(link.href = "javascript:alert(1)")) { doThing(); }'
26
+ - 'someArray.includes((a.href = "javascript:alert(1)", true));'
27
+ - 'if ((a.href = "javascript:alert(1)") === expected) { doThing(); }'
28
+ - 'const ok = (typeof (a.href = "javascript:alert(1)")) === "string";'
@@ -2,7 +2,17 @@ id: no-nested-links
2
2
  valid:
3
3
  - '<a href="/x">link</a>'
4
4
  - '<a href="/x"><span>nested</span></a>'
5
+ - '<div><a href="/x">link</a></div>'
6
+ - '<div><a href="/x">first</a><a href="/y">second</a></div>'
5
7
  invalid:
6
8
  - '<a href="/x">outer <a href="/y">inner</a></a>'
7
9
  - '<a><a>double</a></a>'
8
- - '<div><a href="/x">link</a></div>'
10
+ - '<a href="/x"><span><a href="/y">inner</a></span></a>'
11
+ - |
12
+ <a href="/outer">
13
+ <span>
14
+ <a href="/middle">
15
+ <em><a href="/inner">deep</a></em>
16
+ </a>
17
+ </span>
18
+ </a>
@@ -0,0 +1,17 @@
1
+ id: no-raw-json-store-write
2
+ valid:
3
+ - "writeFileAtomic(file, JSON.stringify(data))"
4
+ - "writeFileSync(file, text)"
5
+ invalid:
6
+ # #1349 review: encoding/replacer/indent variants are the same raw write.
7
+ - "writeFileSync(file, JSON.stringify(data), 'utf8')"
8
+ - "writeFileSync(file, JSON.stringify(data, null, 2))"
9
+ - "fs.writeFileSync(file, JSON.stringify(data, replacer), { encoding: 'utf8' })"
10
+ - "writeFileSync(file, JSON.stringify(data))"
11
+ - "fs.writeFileSync(file, JSON.stringify(data))"
12
+ - |
13
+ const payload = JSON.stringify(data)
14
+ writeFileSync(file, payload)
15
+ - |
16
+ const payload = JSON.stringify(data)
17
+ fs.writeFileSync(file, payload)
@@ -0,0 +1,16 @@
1
+ id: no-win32-isabsolute-for-qualification
2
+ valid:
3
+ # DOCUMENTED LIMITATION (#1349 review): the aliased parser -- the shape
4
+ # the actual pre-#1330 defect used -- is beyond ast-grep's reach and is
5
+ # deliberately a negative; flipping it to invalid requires an engine
6
+ # capability decision. Review-enforced meanwhile (AGENTS.md shape 2).
7
+ - |
8
+ const w = path.win32;
9
+ if (w.isAbsolute(filePath)) {
10
+ return true;
11
+ }
12
+ - "isFullyQualified(filePath)"
13
+ - "path.posix.isAbsolute(filePath)"
14
+ invalid:
15
+ - "path.win32.isAbsolute(filePath)"
16
+ - "win32.isAbsolute(filePath)"
@@ -3,6 +3,9 @@ valid:
3
3
  - 'a === b'
4
4
  - 'a !== b'
5
5
  - 'a = b'
6
+ - 'value == null'
7
+ - 'null == value'
8
+ - 'value == undefined'
6
9
  invalid:
7
10
  - 'a == b'
8
11
  - 'a == "x"'
@@ -3,6 +3,9 @@ valid:
3
3
  - 'a === b'
4
4
  - 'a !== b'
5
5
  - 'a = b'
6
+ - 'value == null'
7
+ - 'null == value'
8
+ - 'value == undefined'
6
9
  invalid:
7
10
  - 'a == b'
8
11
  - 'a == "x"'
@@ -3,6 +3,9 @@ valid:
3
3
  - 'a !== b'
4
4
  - 'a === b'
5
5
  - 'a < b'
6
+ - 'value != null'
7
+ - 'null != value'
8
+ - 'value != undefined'
6
9
  invalid:
7
10
  - 'a != b'
8
11
  - 'a != "x"'
@@ -3,6 +3,10 @@ valid:
3
3
  - 'a !== b'
4
4
  - 'a === b'
5
5
  - 'a < b'
6
+ - 'value != null'
7
+ - 'null != value'
8
+ - 'thinkingMap != null'
9
+ - 'value != undefined'
6
10
  invalid:
7
11
  - 'a != b'
8
12
  - 'a != "x"'