pi-lens 4.2.1 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1562 -0
- package/README.md +157 -24
- package/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/dist/chunk-22AVIGXS.js +560 -0
- package/dist/chunk-27BBHSZC.js +106 -0
- package/dist/chunk-2BEMIWEW.js +51 -0
- package/dist/chunk-2EECBNC5.js +89 -0
- package/dist/chunk-34U7PLGE.js +23 -0
- package/dist/chunk-3I5QFT3N.js +181 -0
- package/dist/chunk-3MED75HT.js +37 -0
- package/dist/chunk-47D2BO4S.js +87 -0
- package/dist/chunk-4RERDEXR.js +348 -0
- package/dist/chunk-4W2PLC4J.js +27 -0
- package/dist/chunk-52H5B5TC.js +202 -0
- package/dist/chunk-54B42YRX.js +27 -0
- package/dist/chunk-5RXBNSW2.js +266 -0
- package/dist/chunk-5THXD6X5.js +201 -0
- package/dist/chunk-5W3R6LFT.js +24 -0
- package/dist/chunk-5ZEJHV35.js +341 -0
- package/dist/chunk-6P62QVEA.js +118 -0
- package/dist/chunk-6QIUX4EP.js +459 -0
- package/dist/chunk-6VCD4VKZ.js +78 -0
- package/dist/chunk-7F72PXY2.js +326 -0
- package/dist/chunk-7FBF7NPR.js +998 -0
- package/dist/chunk-7U2IDNXN.js +37 -0
- package/dist/chunk-ABBOA7UD.js +157 -0
- package/dist/chunk-AHDW3GPE.js +50 -0
- package/dist/chunk-AJ3QXTRQ.js +756 -0
- package/dist/chunk-AJVLWNFN.js +1610 -0
- package/dist/chunk-AJXODZY6.js +112 -0
- package/dist/chunk-ARFCXG7S.js +84 -0
- package/dist/chunk-AS44CFQ4.js +708 -0
- package/dist/chunk-AWE5TMPO.js +38 -0
- package/dist/chunk-B3I2UUT4.js +4692 -0
- package/dist/chunk-BRJKOBZP.js +331 -0
- package/dist/chunk-BW5KFIQC.js +59 -0
- package/dist/chunk-C2AUYXQH.js +149 -0
- package/dist/chunk-CGGAIP7J.js +29 -0
- package/dist/chunk-D6QS3U6M.js +30 -0
- package/dist/chunk-DFVMIKMQ.js +349 -0
- package/dist/chunk-DIULIWKU.js +169 -0
- package/dist/chunk-DQ2NZ7C4.js +2317 -0
- package/dist/chunk-E2WFBRHM.js +213 -0
- package/dist/chunk-E4MAEDPM.js +50 -0
- package/dist/chunk-EOKRQ3SA.js +30 -0
- package/dist/chunk-F3AU2TMM.js +2626 -0
- package/dist/chunk-F3P7VQ7H.js +170 -0
- package/dist/chunk-FC4RP4I2.js +12 -0
- package/dist/chunk-FJNKANOS.js +32 -0
- package/dist/chunk-GUOGVTCQ.js +146 -0
- package/dist/chunk-GVXA6CCE.js +18 -0
- package/dist/chunk-HHYAELLJ.js +2334 -0
- package/dist/chunk-HMFXILPV.js +83 -0
- package/dist/chunk-HVUZXSWK.js +421 -0
- package/dist/chunk-HWBZIGMJ.js +62 -0
- package/dist/chunk-I3R7GKDR.js +17 -0
- package/dist/chunk-I7SPGOWI.js +55 -0
- package/dist/chunk-IIXOAGHR.js +38 -0
- package/dist/chunk-IVP5KAB7.js +2250 -0
- package/dist/chunk-IXEBJSUE.js +22 -0
- package/dist/chunk-JOLITGCC.js +27 -0
- package/dist/chunk-K6VYLB2U.js +145 -0
- package/dist/chunk-LJDODBBZ.js +78 -0
- package/dist/chunk-LNAKEO63.js +78 -0
- package/dist/chunk-LSMJ6KBE.js +4139 -0
- package/dist/chunk-LW6XKDZQ.js +5565 -0
- package/dist/chunk-N3YQJI6O.js +899 -0
- package/dist/chunk-NABLC7W3.js +148 -0
- package/dist/chunk-NKOUFPQF.js +659 -0
- package/dist/chunk-NL5GLMFI.js +211 -0
- package/dist/chunk-NMABWBZN.js +327 -0
- package/dist/chunk-NTHH2J74.js +27 -0
- package/dist/chunk-NTUJEGDZ.js +59 -0
- package/dist/chunk-NXL4FFQQ.js +47 -0
- package/dist/chunk-NXPS2L6U.js +466 -0
- package/dist/chunk-O5WILGMI.js +42 -0
- package/dist/chunk-O6TQT6RI.js +48 -0
- package/dist/chunk-OAXNDZJ7.js +323 -0
- package/dist/chunk-ODEEOXPH.js +44 -0
- package/dist/chunk-OQGFCZJ4.js +4533 -0
- package/dist/chunk-ORTMY4Q4.js +282 -0
- package/dist/chunk-OS32RNR2.js +442 -0
- package/dist/chunk-PAK6IDME.js +189 -0
- package/dist/chunk-PWFHBTSF.js +406 -0
- package/dist/chunk-Q5U6FMDI.js +2352 -0
- package/dist/chunk-QOZXJ4NA.js +3364 -0
- package/dist/chunk-QYF5S6P6.js +45 -0
- package/dist/chunk-RIISMHKN.js +36 -0
- package/dist/chunk-RPD4ZSB7.js +25 -0
- package/dist/chunk-RPD5K5NC.js +79 -0
- package/dist/chunk-RUOG5D2C.js +262 -0
- package/dist/chunk-T4ERT73Y.js +599 -0
- package/dist/chunk-T6D4Q4AQ.js +54 -0
- package/dist/chunk-TGPXLY2J.js +391 -0
- package/dist/chunk-TLGFBM3F.js +12116 -0
- package/dist/chunk-TO6WL3GM.js +88 -0
- package/dist/chunk-TT22N74J.js +517 -0
- package/dist/chunk-TVN5N6GY.js +21216 -0
- package/dist/chunk-U3VGR4VU.js +308 -0
- package/dist/chunk-UK3CMEAL.js +1250 -0
- package/dist/chunk-UOPVJQ4N.js +103 -0
- package/dist/chunk-UXVNL3D7.js +23 -0
- package/dist/chunk-UY752QSN.js +45 -0
- package/dist/chunk-V5PXFSZK.js +188 -0
- package/dist/chunk-V7R425XG.js +398 -0
- package/dist/chunk-VCSRSYLF.js +81 -0
- package/dist/chunk-VD4JQCQC.js +162 -0
- package/dist/chunk-VDBPVIKD.js +62 -0
- package/dist/chunk-VHQLPIRJ.js +114 -0
- package/dist/chunk-VN2AXLEX.js +5414 -0
- package/dist/chunk-VNMT7C64.js +478 -0
- package/dist/chunk-WONERJTP.js +309 -0
- package/dist/chunk-XECLWQZN.js +85 -0
- package/dist/chunk-XIMYZ3JA.js +27 -0
- package/dist/chunk-XK4CIILI.js +144 -0
- package/dist/chunk-Y4T27COV.js +562 -0
- package/dist/chunk-YGVYKNSN.js +1860 -0
- package/dist/chunk-YLF3PPT5.js +308 -0
- package/dist/chunk-YSNFMJKN.js +14 -0
- package/dist/chunk-Z3CCVDUB.js +76 -0
- package/dist/chunk-Z54ZSOBZ.js +61 -0
- package/dist/chunk-ZAWW3AF6.js +97 -0
- package/dist/chunk-ZMOL6RQC.js +167 -0
- package/dist/index.js +19039 -8956
- package/dist/mcp/analyze-cli.js +186 -228
- package/dist/mcp/cli.js +137 -98
- package/dist/mcp/server.js +22592 -1564
- package/dist/mcp/worker.js +97 -38
- package/dist/probes/installer.js +135 -0
- package/dist/workers/project-snapshot-persist-worker.js +22 -0
- package/dist/workers/review-graph-persist-worker.js +15 -0
- package/docs/adr/0001-stale-advisory-live-arm.md +29 -0
- package/docs/adr/0002-workspace-hash-rendezvous.md +30 -0
- package/docs/adr/0003-git-guard-latch-writer.md +203 -0
- package/docs/adr/0004-disposition-policy-seam.md +38 -0
- package/docs/adr/0005-tool-availability-enforcement-seam.md +29 -0
- package/docs/adr/0006-derived-state-benchmark-first.md +31 -0
- package/docs/adr/0007-end-to-end-witness-per-seam-slice.md +38 -0
- package/docs/adr/0008-turn-end-lane-interface.md +165 -0
- package/docs/adr/0009-reported-path-attribution.md +114 -0
- package/docs/adr/README.md +26 -0
- package/docs/agent-guide.md +13 -4
- package/docs/agent-tools.md +60 -1
- package/docs/ast-grep_rules_catalog.md +6 -4
- package/docs/configuration.md +75 -2
- package/docs/engineering-principles.md +202 -0
- package/docs/environment-variables.md +113 -6
- package/docs/features.md +10 -6
- package/docs/globalconfig.md +7 -1
- package/docs/io-bridge-v2-migration.md +94 -0
- package/docs/language-coverage.md +17 -0
- package/docs/lsp-capability-matrix.md +131 -32
- package/docs/lsp-idle-eviction.md +124 -0
- package/docs/mcp.md +21 -5
- package/docs/merge-queue-rollout.md +77 -0
- package/docs/pi-lens-fixer.md +161 -39
- package/docs/pi-lens-investigator.md +77 -20
- package/docs/pi-lens-merge-policy.md +694 -0
- package/docs/pi-lens-monitor.md +73 -7
- package/docs/pi-lens-retro.md +6 -4
- package/docs/pi-lens-reviewer.md +190 -34
- package/docs/pi-lens-subagent.md +247 -37
- package/docs/pi-lens-warden.md +18 -7
- package/docs/public-api-stability.md +56 -0
- package/docs/release-qa-baseline.md +86 -17
- package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/docs/servercapabilities.md +66 -52
- package/docs/settings.md +13 -3
- package/docs/subagent-compat.md +1 -1
- package/docs/usage.md +5 -1
- package/grammars/tree-sitter-bash.wasm +0 -0
- package/grammars/tree-sitter-bash.wasm.json +3 -3
- package/package.json +23 -9
- package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
- package/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
- package/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
- package/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
- package/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
- package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
- package/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
- package/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
- package/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
- package/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
- package/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
- package/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
- package/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
- package/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
- package/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/scripts/download-grammars.js +5 -0
- package/scripts/grammars.lock.json +6 -1
- package/scripts/install-selftest.mjs +38 -35
- package/scripts/lib/host-provided-deps.mjs +13 -4
- package/scripts/lib/web-tree-sitter-dir.mjs +141 -0
- package/dist/clients/actionable-warnings-logger.js +0 -35
- package/dist/clients/actionable-warnings.js +0 -1594
- package/dist/clients/advisory-provenance.js +0 -457
- package/dist/clients/agent-behavior-client.js +0 -147
- package/dist/clients/agent-nudge.js +0 -325
- package/dist/clients/analysed-root.js +0 -1
- package/dist/clients/ast-grep-client.js +0 -731
- package/dist/clients/ast-grep-rule-manager.js +0 -146
- package/dist/clients/ast-grep-tool-logger.js +0 -118
- package/dist/clients/ast-grep-types.js +0 -10
- package/dist/clients/ast-grep-yaml-synth.js +0 -154
- package/dist/clients/atomic-write-staging.js +0 -75
- package/dist/clients/atomic-write.js +0 -189
- package/dist/clients/availability-probe-flight.js +0 -12
- package/dist/clients/bash-file-access.js +0 -1056
- package/dist/clients/biome-client.js +0 -357
- package/dist/clients/blocker-freshness.js +0 -837
- package/dist/clients/blocker-past-eof.js +0 -129
- package/dist/clients/bootstrap.js +0 -569
- package/dist/clients/bounded-cache.js +0 -190
- package/dist/clients/bounded-pid-file-lock.js +0 -202
- package/dist/clients/bounded-telemetry.js +0 -295
- package/dist/clients/build-identity.js +0 -95
- package/dist/clients/bundled-resource-health.js +0 -113
- package/dist/clients/bus-events-logger.js +0 -105
- package/dist/clients/bus-publish.js +0 -171
- package/dist/clients/cache/rule-cache.js +0 -190
- package/dist/clients/cache-manager.js +0 -465
- package/dist/clients/cache-observability.js +0 -1313
- package/dist/clients/call-graph.js +0 -852
- package/dist/clients/cargo-manifest.js +0 -422
- package/dist/clients/cascade-budget.js +0 -196
- package/dist/clients/cascade-format.js +0 -315
- package/dist/clients/cascade-logger.js +0 -31
- package/dist/clients/cascade-types.js +0 -9
- package/dist/clients/child-unref.js +0 -115
- package/dist/clients/code-quality-warnings.js +0 -286
- package/dist/clients/codebase-model.js +0 -173
- package/dist/clients/collateral-test-role.js +0 -40
- package/dist/clients/complexity-client.js +0 -462
- package/dist/clients/config-core/deny.js +0 -221
- package/dist/clients/config-core/index.js +0 -50
- package/dist/clients/config-core/merge.js +0 -357
- package/dist/clients/config-core/normalize.js +0 -340
- package/dist/clients/config-core/process-spec.js +0 -248
- package/dist/clients/config-core/provenance.js +0 -164
- package/dist/clients/config-core/records.js +0 -218
- package/dist/clients/config-core/resolve.js +0 -125
- package/dist/clients/config-core/safe-object.js +0 -78
- package/dist/clients/config-core/schema.js +0 -165
- package/dist/clients/config-diagnostic-codes.js +0 -283
- package/dist/clients/config-locations.js +0 -160
- package/dist/clients/config-resolve.js +0 -792
- package/dist/clients/config-schema.js +0 -251
- package/dist/clients/config-warn.js +0 -407
- package/dist/clients/console-guard-install.js +0 -26
- package/dist/clients/cooperative-budget.js +0 -42
- package/dist/clients/dead-code-client.js +0 -510
- package/dist/clients/dead-code-logger.js +0 -30
- package/dist/clients/deadline-utils.js +0 -280
- package/dist/clients/debug-handles.js +0 -211
- package/dist/clients/debug-heap.js +0 -174
- package/dist/clients/deferred-lsp-work.js +0 -106
- package/dist/clients/degradation-ledger.js +0 -396
- package/dist/clients/demoted-finding-render.js +0 -169
- package/dist/clients/dependency-checker.js +0 -862
- package/dist/clients/deps/ast-grep-napi.js +0 -22
- package/dist/clients/deps/js-yaml.js +0 -9
- package/dist/clients/deps/minimatch.js +0 -4
- package/dist/clients/deps/pi-tui.js +0 -14
- package/dist/clients/deps/typebox.js +0 -14
- package/dist/clients/deps/vscode-jsonrpc.js +0 -1
- package/dist/clients/deps/web-tree-sitter.js +0 -24
- package/dist/clients/diagnostic-dispositions.js +0 -594
- package/dist/clients/diagnostic-line-freshness.js +0 -305
- package/dist/clients/diagnostic-logger.js +0 -73
- package/dist/clients/diagnostic-tracker.js +0 -105
- package/dist/clients/diagnostics-publish.js +0 -230
- package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
- package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
- package/dist/clients/dispatch/collect-later-tier.js +0 -35
- package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
- package/dist/clients/dispatch/dispatcher.js +0 -1269
- package/dist/clients/dispatch/fact-provider-types.js +0 -1
- package/dist/clients/dispatch/fact-rule-runner.js +0 -17
- package/dist/clients/dispatch/fact-runner.js +0 -30
- package/dist/clients/dispatch/fact-scheduler.js +0 -68
- package/dist/clients/dispatch/fact-store.js +0 -377
- package/dist/clients/dispatch/facts/comment-facts.js +0 -22
- package/dist/clients/dispatch/facts/file-content.js +0 -19
- package/dist/clients/dispatch/facts/function-facts.js +0 -348
- package/dist/clients/dispatch/facts/import-facts.js +0 -204
- package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
- package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
- package/dist/clients/dispatch/finding-policy.js +0 -222
- package/dist/clients/dispatch/indent-detect.js +0 -411
- package/dist/clients/dispatch/inline-suppressions.js +0 -70
- package/dist/clients/dispatch/integration.js +0 -2377
- package/dist/clients/dispatch/lazy.js +0 -11
- package/dist/clients/dispatch/pending-runner-findings.js +0 -87
- package/dist/clients/dispatch/plan.js +0 -278
- package/dist/clients/dispatch/priorities.js +0 -20
- package/dist/clients/dispatch/rule-id-normalize.js +0 -50
- package/dist/clients/dispatch/rule-ignores.js +0 -62
- package/dist/clients/dispatch/rule-policy.js +0 -135
- package/dist/clients/dispatch/rules/async-noise.js +0 -40
- package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
- package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
- package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
- package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
- package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
- package/dist/clients/dispatch/rules/high-complexity.js +0 -72
- package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
- package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
- package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
- package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
- package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
- package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
- package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
- package/dist/clients/dispatch/runner-context.js +0 -52
- package/dist/clients/dispatch/runners/actionlint.js +0 -113
- package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/dist/clients/dispatch/runners/biome-check.js +0 -283
- package/dist/clients/dispatch/runners/cpp-check.js +0 -236
- package/dist/clients/dispatch/runners/credo.js +0 -80
- package/dist/clients/dispatch/runners/cue-vet.js +0 -398
- package/dist/clients/dispatch/runners/dart-analyze.js +0 -202
- package/dist/clients/dispatch/runners/detekt.js +0 -169
- package/dist/clients/dispatch/runners/dotnet-build.js +0 -159
- package/dist/clients/dispatch/runners/elixir-check.js +0 -210
- package/dist/clients/dispatch/runners/eslint.js +0 -154
- package/dist/clients/dispatch/runners/fact-rules.js +0 -29
- package/dist/clients/dispatch/runners/fish-indent.js +0 -69
- package/dist/clients/dispatch/runners/gleam-check.js +0 -87
- package/dist/clients/dispatch/runners/go-vet.js +0 -90
- package/dist/clients/dispatch/runners/golangci-lint.js +0 -120
- package/dist/clients/dispatch/runners/hadolint.js +0 -79
- package/dist/clients/dispatch/runners/helm-lint.js +0 -171
- package/dist/clients/dispatch/runners/helm-render.js +0 -940
- package/dist/clients/dispatch/runners/htmlhint.js +0 -108
- package/dist/clients/dispatch/runners/index.js +0 -108
- package/dist/clients/dispatch/runners/javac.js +0 -89
- package/dist/clients/dispatch/runners/ktlint.js +0 -136
- package/dist/clients/dispatch/runners/lsp.js +0 -378
- package/dist/clients/dispatch/runners/markdownlint.js +0 -160
- package/dist/clients/dispatch/runners/mypy.js +0 -101
- package/dist/clients/dispatch/runners/oxlint.js +0 -398
- package/dist/clients/dispatch/runners/php-lint.js +0 -62
- package/dist/clients/dispatch/runners/phpstan.js +0 -120
- package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
- package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
- package/dist/clients/dispatch/runners/pyright.js +0 -169
- package/dist/clients/dispatch/runners/rubocop.js +0 -90
- package/dist/clients/dispatch/runners/ruff.js +0 -89
- package/dist/clients/dispatch/runners/rust-clippy.js +0 -251
- package/dist/clients/dispatch/runners/shellcheck.js +0 -169
- package/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/dist/clients/dispatch/runners/spellcheck.js +0 -121
- package/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/dist/clients/dispatch/runners/sqlfluff.js +0 -174
- package/dist/clients/dispatch/runners/stylelint.js +0 -158
- package/dist/clients/dispatch/runners/swiftlint.js +0 -154
- package/dist/clients/dispatch/runners/taplo.js +0 -168
- package/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/dist/clients/dispatch/runners/tflint.js +0 -110
- package/dist/clients/dispatch/runners/tree-sitter.js +0 -620
- package/dist/clients/dispatch/runners/trivy-config.js +0 -247
- package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
- package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
- package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -85
- package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
- package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
- package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
- package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
- package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
- package/dist/clients/dispatch/runners/utils.js +0 -15
- package/dist/clients/dispatch/runners/vale.js +0 -116
- package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/dist/clients/dispatch/runners/yamllint.js +0 -85
- package/dist/clients/dispatch/runners/zig-check.js +0 -91
- package/dist/clients/dispatch/suppress-writer.js +0 -69
- package/dist/clients/dispatch/tool-profile.js +0 -30
- package/dist/clients/dispatch/types.js +0 -21
- package/dist/clients/dispatch/utils/format-utils.js +0 -45
- package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
- package/dist/clients/disposition-logger.js +0 -32
- package/dist/clients/disposition-publish.js +0 -124
- package/dist/clients/durable-store.js +0 -97
- package/dist/clients/effective-config.js +0 -413
- package/dist/clients/env-utils.js +0 -83
- package/dist/clients/error-class.js +0 -23
- package/dist/clients/eval-timestamp.js +0 -17
- package/dist/clients/event-loop-hold.js +0 -274
- package/dist/clients/event-loop-monitor.js +0 -250
- package/dist/clients/extension-log.js +0 -504
- package/dist/clients/extension-mode.js +0 -73
- package/dist/clients/feature-hints.js +0 -103
- package/dist/clients/file-kinds.js +0 -412
- package/dist/clients/file-role.js +0 -134
- package/dist/clients/file-time.js +0 -160
- package/dist/clients/file-utils.js +0 -1032
- package/dist/clients/finding-delivery-gate.js +0 -463
- package/dist/clients/finding-identity.js +0 -88
- package/dist/clients/fix-worklog.js +0 -103
- package/dist/clients/format-events-publish.js +0 -343
- package/dist/clients/format-service.js +0 -222
- package/dist/clients/formatters-lazy.js +0 -9
- package/dist/clients/formatters.js +0 -1994
- package/dist/clients/freshness-cadence.js +0 -17
- package/dist/clients/freshness.js +0 -38
- package/dist/clients/generated-artifacts.js +0 -394
- package/dist/clients/generation-guard.js +0 -215
- package/dist/clients/git-guard.js +0 -923
- package/dist/clients/git-tracked-ignore.js +0 -243
- package/dist/clients/gitleaks-client.js +0 -509
- package/dist/clients/go-client.js +0 -104
- package/dist/clients/govulncheck-client.js +0 -605
- package/dist/clients/gradle-ktfmt-style.js +0 -252
- package/dist/clients/grammar-source.js +0 -465
- package/dist/clients/gzip-stage-write.js +0 -135
- package/dist/clients/hashline-anchor.js +0 -424
- package/dist/clients/hook-budgets.js +0 -76
- package/dist/clients/host-edit-normalize.js +0 -140
- package/dist/clients/host-ports.js +0 -39
- package/dist/clients/indent-retarget.js +0 -154
- package/dist/clients/install-diagnostics.js +0 -143
- package/dist/clients/installer/index.js +0 -5167
- package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
- package/dist/clients/installer/managed-tool-refresh.js +0 -783
- package/dist/clients/instance-reaper-state.js +0 -7
- package/dist/clients/instance-reaper.js +0 -1137
- package/dist/clients/instance-registry-lock.js +0 -145
- package/dist/clients/instance-registry.js +0 -773
- package/dist/clients/jscpd-client.js +0 -370
- package/dist/clients/json-cache-read.js +0 -65
- package/dist/clients/knip-client.js +0 -788
- package/dist/clients/language-policy.js +0 -252
- package/dist/clients/language-profile.js +0 -361
- package/dist/clients/language-registry.js +0 -603
- package/dist/clients/latency-logger.js +0 -719
- package/dist/clients/lazy-import.js +0 -21
- package/dist/clients/ledger-bounds.js +0 -54
- package/dist/clients/lens-config.js +0 -346
- package/dist/clients/lens-engine.js +0 -358
- package/dist/clients/lens-events.js +0 -125
- package/dist/clients/lens-flag-registry.js +0 -467
- package/dist/clients/lens-map.js +0 -1156
- package/dist/clients/live-bus-emitter.js +0 -74
- package/dist/clients/log-cleanup.js +0 -222
- package/dist/clients/lsp/aggregation.js +0 -178
- package/dist/clients/lsp/cascade-tier.js +0 -421
- package/dist/clients/lsp/client.js +0 -4465
- package/dist/clients/lsp/config.js +0 -689
- package/dist/clients/lsp/diagnostic-binding.js +0 -225
- package/dist/clients/lsp/document-drift.js +0 -467
- package/dist/clients/lsp/edits.js +0 -1219
- package/dist/clients/lsp/index.js +0 -8305
- package/dist/clients/lsp/inferred-project.js +0 -216
- package/dist/clients/lsp/jvm-runtime.js +0 -298
- package/dist/clients/lsp/language.js +0 -63
- package/dist/clients/lsp/launch.js +0 -725
- package/dist/clients/lsp/lombok.js +0 -158
- package/dist/clients/lsp/path-utils.js +0 -5
- package/dist/clients/lsp/pending-aux-coverage.js +0 -251
- package/dist/clients/lsp/position-encoding.js +0 -61
- package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
- package/dist/clients/lsp/server.js +0 -3209
- package/dist/clients/lsp/session-roots.js +0 -192
- package/dist/clients/lsp/spawn-history.js +0 -17
- package/dist/clients/lsp/sync-kind.js +0 -42
- package/dist/clients/lsp/tsserver-sync.js +0 -332
- package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
- package/dist/clients/lsp/wait-policy/classification.js +0 -85
- package/dist/clients/lsp/wait-policy/index.js +0 -10
- package/dist/clients/lsp/wait-policy/strategies.js +0 -303
- package/dist/clients/lsp/watch-queue.js +0 -61
- package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
- package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
- package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
- package/dist/clients/lsp-budget.js +0 -186
- package/dist/clients/lsp-document-symbols.js +0 -110
- package/dist/clients/lsp-lazy.js +0 -9
- package/dist/clients/lsp-mutation.js +0 -396
- package/dist/clients/lsp-status.js +0 -59
- package/dist/clients/map-with-concurrency.js +0 -40
- package/dist/clients/mcp/analyze.js +0 -420
- package/dist/clients/mcp/host-shim.js +0 -31
- package/dist/clients/mcp/ipc.js +0 -335
- package/dist/clients/mcp/review.js +0 -151
- package/dist/clients/mcp/session.js +0 -412
- package/dist/clients/memory-sampler.js +0 -208
- package/dist/clients/message-end-attribution.js +0 -30
- package/dist/clients/metrics-client.js +0 -107
- package/dist/clients/metrics-history.js +0 -327
- package/dist/clients/middle-man-analysis.js +0 -263
- package/dist/clients/model-provider.js +0 -53
- package/dist/clients/module-report-lsp.js +0 -189
- package/dist/clients/module-report.js +0 -2150
- package/dist/clients/mutating-tool.js +0 -651
- package/dist/clients/mutation-attribution.js +0 -368
- package/dist/clients/mutation-bridge.js +0 -240
- package/dist/clients/ndjson-logger.js +0 -734
- package/dist/clients/observed-mutation-sources.js +0 -101
- package/dist/clients/observed-mutation.js +0 -1253
- package/dist/clients/oldtext-autopatch.js +0 -128
- package/dist/clients/opaque-mutation-scan.js +0 -496
- package/dist/clients/opengrep-client.js +0 -328
- package/dist/clients/opengrep-config.js +0 -76
- package/dist/clients/package-manager.js +0 -607
- package/dist/clients/package-root.js +0 -38
- package/dist/clients/partial-edit-apply.js +0 -439
- package/dist/clients/path-attribution-telemetry.js +0 -43
- package/dist/clients/path-keyed-map.js +0 -108
- package/dist/clients/path-utils.js +0 -1244
- package/dist/clients/performance-report.js +0 -331
- package/dist/clients/persist-debounce.js +0 -70
- package/dist/clients/persistent-reverify.js +0 -271
- package/dist/clients/php-cs-fixer-config.js +0 -119
- package/dist/clients/pipeline.js +0 -1425
- package/dist/clients/post-autofix-notice.js +0 -37
- package/dist/clients/print-mode.js +0 -21
- package/dist/clients/probe-home-state.js +0 -228
- package/dist/clients/process-bridge.js +0 -66
- package/dist/clients/process-singletons.js +0 -210
- package/dist/clients/process-snapshot.js +0 -68
- package/dist/clients/project-changes.js +0 -181
- package/dist/clients/project-conventions.js +0 -171
- package/dist/clients/project-diagnostics/cache.js +0 -137
- package/dist/clients/project-diagnostics/extractors.js +0 -109
- package/dist/clients/project-diagnostics/fresh-fetch.js +0 -650
- package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
- package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
- package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
- package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
- package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
- package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
- package/dist/clients/project-diagnostics/scanner.js +0 -520
- package/dist/clients/project-diagnostics/types.js +0 -1
- package/dist/clients/project-lens-config.js +0 -799
- package/dist/clients/project-report.js +0 -701
- package/dist/clients/project-scale.js +0 -237
- package/dist/clients/project-scan-policy.js +0 -11
- package/dist/clients/project-snapshot-fingerprint.js +0 -48
- package/dist/clients/project-snapshot-persist-worker.js +0 -20
- package/dist/clients/project-snapshot.js +0 -1653
- package/dist/clients/project-trust.js +0 -181
- package/dist/clients/python-environment.js +0 -217
- package/dist/clients/python-provenance.js +0 -639
- package/dist/clients/quiet-window-config.js +0 -47
- package/dist/clients/quiet-window.js +0 -236
- package/dist/clients/read-bridge.js +0 -139
- package/dist/clients/read-expansion.js +0 -266
- package/dist/clients/read-guard-logger.js +0 -251
- package/dist/clients/read-guard-tool-lines.js +0 -1306
- package/dist/clients/read-guard.js +0 -1561
- package/dist/clients/recent-touches.js +0 -240
- package/dist/clients/redact/secrets.js +0 -449
- package/dist/clients/resource-sampler.js +0 -628
- package/dist/clients/reverse-deps.js +0 -270
- package/dist/clients/review-graph/builder.js +0 -5118
- package/dist/clients/review-graph/format.js +0 -33
- package/dist/clients/review-graph/git-identity.js +0 -157
- package/dist/clients/review-graph/import-resolvers.js +0 -481
- package/dist/clients/review-graph/persist-worker.js +0 -10
- package/dist/clients/review-graph/query.js +0 -244
- package/dist/clients/review-graph/revision-drift.js +0 -21
- package/dist/clients/review-graph/service.js +0 -96
- package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
- package/dist/clients/review-graph/symbol-id.js +0 -103
- package/dist/clients/review-graph/tsconfig-paths.js +0 -299
- package/dist/clients/review-graph/types.js +0 -1
- package/dist/clients/review-graph/workspace-modules.js +0 -449
- package/dist/clients/review-graph-logger.js +0 -81
- package/dist/clients/ruff-client.js +0 -152
- package/dist/clients/rules-scanner.js +0 -131
- package/dist/clients/run-duration.js +0 -55
- package/dist/clients/runtime-agent-end.js +0 -746
- package/dist/clients/runtime-config.js +0 -77
- package/dist/clients/runtime-context.js +0 -211
- package/dist/clients/runtime-coordinator.js +0 -1290
- package/dist/clients/runtime-session.js +0 -2485
- package/dist/clients/runtime-tool-call.js +0 -1284
- package/dist/clients/runtime-tool-result.js +0 -2034
- package/dist/clients/runtime-turn.js +0 -3600
- package/dist/clients/rust-client.js +0 -97
- package/dist/clients/safe-spawn.js +0 -2166
- package/dist/clients/sanitize.js +0 -286
- package/dist/clients/scan-utils.js +0 -25
- package/dist/clients/scratch-tree-policy.js +0 -165
- package/dist/clients/search-read-registration.js +0 -94
- package/dist/clients/secret-findings.js +0 -114
- package/dist/clients/security-scan-client.js +0 -352
- package/dist/clients/session-event-guard.js +0 -297
- package/dist/clients/session-lifecycle.js +0 -484
- package/dist/clients/session-start-observability.js +0 -94
- package/dist/clients/session-state-store.js +0 -101
- package/dist/clients/session-summary.js +0 -15
- package/dist/clients/sessionstart-logger.js +0 -27
- package/dist/clients/sg-runner.js +0 -876
- package/dist/clients/sgconfig.js +0 -347
- package/dist/clients/shared-checkout-guard.js +0 -338
- package/dist/clients/single-flight.js +0 -158
- package/dist/clients/situational-tool-telemetry.js +0 -108
- package/dist/clients/skills-resolver.js +0 -141
- package/dist/clients/slow-fs.js +0 -138
- package/dist/clients/smells-rollup.js +0 -231
- package/dist/clients/source-filter.js +0 -596
- package/dist/clients/source-walker.js +0 -211
- package/dist/clients/spawn-output-cap.js +0 -37
- package/dist/clients/spawn-timeout-cooldown.js +0 -110
- package/dist/clients/stale-marker.js +0 -17
- package/dist/clients/startup-scan.js +0 -400
- package/dist/clients/startup-timing.js +0 -130
- package/dist/clients/string-utils.js +0 -33
- package/dist/clients/subagent-mode.js +0 -111
- package/dist/clients/symbol-containment.js +0 -24
- package/dist/clients/symbol-types.js +0 -5
- package/dist/clients/test-runner-client.js +0 -2507
- package/dist/clients/test-runner-delivery.js +0 -287
- package/dist/clients/todo-scanner.js +0 -229
- package/dist/clients/tool-agreement.js +0 -423
- package/dist/clients/tool-config.js +0 -249
- package/dist/clients/tool-cwd.js +0 -270
- package/dist/clients/tool-definition.js +0 -47
- package/dist/clients/tool-event.js +0 -105
- package/dist/clients/tool-policy.js +0 -2755
- package/dist/clients/tool-probe.js +0 -53
- package/dist/clients/tool-render.js +0 -156
- package/dist/clients/tool-set-policy.js +0 -118
- package/dist/clients/tree-sitter-cache.js +0 -364
- package/dist/clients/tree-sitter-client.js +0 -4134
- package/dist/clients/tree-sitter-logger.js +0 -100
- package/dist/clients/tree-sitter-navigator.js +0 -269
- package/dist/clients/tree-sitter-query-loader.js +0 -569
- package/dist/clients/tree-sitter-shared.js +0 -158
- package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
- package/dist/clients/trivy-client.js +0 -467
- package/dist/clients/tui-fit.js +0 -50
- package/dist/clients/turn-context.js +0 -52
- package/dist/clients/turn-summary-render.js +0 -72
- package/dist/clients/turn-summary.js +0 -132
- package/dist/clients/typos-config.js +0 -29
- package/dist/clients/user-notify.js +0 -51
- package/dist/clients/vanished-instance-marker.js +0 -57
- package/dist/clients/warm-attach.js +0 -246
- package/dist/clients/widget-state.js +0 -1677
- package/dist/clients/word-index-logger.js +0 -49
- package/dist/clients/word-index-store.js +0 -459
- package/dist/clients/word-index.js +0 -2080
- package/dist/clients/workspace-topology.js +0 -389
- package/dist/clients/write-ordering-guard.js +0 -65
- package/dist/clients/zizmor-config.js +0 -327
- package/dist/i18n.js +0 -69
- package/dist/mcp/build-staleness.js +0 -124
- package/dist/scripts/lib/process-scan.mjs +0 -583
- package/dist/scripts/lib/skills-predicate.mjs +0 -129
- package/dist/tools/activate-tools.js +0 -87
- package/dist/tools/ast-grep-outline.js +0 -137
- package/dist/tools/ast-grep-replace.js +0 -244
- package/dist/tools/ast-grep-search.js +0 -762
- package/dist/tools/effective-config.js +0 -90
- package/dist/tools/lens-diagnostic-mark.js +0 -375
- package/dist/tools/lens-diagnostics.js +0 -2544
- package/dist/tools/lsp-diagnostics.js +0 -1634
- package/dist/tools/lsp-navigation.js +0 -1367
- package/dist/tools/lsp-structured-output.js +0 -294
- package/dist/tools/module-report.js +0 -382
- package/dist/tools/project-report.js +0 -86
- package/dist/tools/render-compact.js +0 -374
- package/dist/tools/scan-progress.js +0 -53
- package/dist/tools/shared.js +0 -29
- package/dist/tools/symbol-search.js +0 -155
package/docs/usage.md
CHANGED
|
@@ -114,6 +114,7 @@ pi --lens-turn-summary # Persist a per-turn summary of diagnostics, autofixes,
|
|
|
114
114
|
pi --lens-compact-tool-line # Render tool results as one compact, theme-aware line (closes #1327)
|
|
115
115
|
pi --lens-compact-lsp-status # Collapse the footer LSP status to one state glyph instead of the server names (refs #3099)
|
|
116
116
|
pi --lens-hide-lsp-status # Publish no pi-lens-lsp footer status at all, so a status-rendering host stops showing the key (closes #3099)
|
|
117
|
+
pi --lens-compact-widget # Render the widget as one summary line (languages + totals, LSP↑ chip while servers spawn) with no file rows or blocker details (refs #3959)
|
|
117
118
|
pi --no-lazy-tools # Keep every pi-lens tool active instead of activating the situational ones on demand
|
|
118
119
|
pi --lens-turn-end-madge # Run the madge circular-dependency check at every turn end, not just at session start
|
|
119
120
|
pi --no-knip # Disable the knip session-start analyzer
|
|
@@ -199,4 +200,7 @@ turn-end is skipped, not faked: one line on stderr and nothing on stdout.
|
|
|
199
200
|
- Check `~/.pi-lens/sessionstart.log`, `~/.pi-lens/latency.log`, and
|
|
200
201
|
`~/.pi-lens/cascade.log` for lifecycle/performance/debug traces.
|
|
201
202
|
- For live tool validation, use `node scripts/smoke-tools.mjs` with the relevant
|
|
202
|
-
`--lsp`, `--format`, or `--autofix` layer.
|
|
203
|
+
`--lsp`, `--format`, or `--autofix` layer. `--resolution` checks, without
|
|
204
|
+
installing or spawning anything, that the resolvers find project-local tools in
|
|
205
|
+
`.venv/bin`, `vendor/bin` and `node_modules/.bin` (it runs nightly in
|
|
206
|
+
tool-smoke).
|
|
Binary file
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"npmPackage": "tree-sitter-
|
|
3
|
-
"version": "0.1
|
|
4
|
-
"sha256": "sha256:
|
|
2
|
+
"npmPackage": "tree-sitter-bash",
|
|
3
|
+
"version": "0.25.1",
|
|
4
|
+
"sha256": "sha256:8292919c88a0f7d3fb31d0cd0253ca5a9531bc1ede82b0537f2c63dd8abe6a7a"
|
|
5
5
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-lens",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo",
|
|
6
6
|
"repository": {
|
|
@@ -17,12 +17,13 @@
|
|
|
17
17
|
"build": "tsc --project tsconfig.build.json",
|
|
18
18
|
"build:dist": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && node scripts/build-dist-tsc.mjs tsconfig.dist.json && npm run bundle:dist",
|
|
19
19
|
"bundle:dist": "node scripts/bundle-dist.mjs",
|
|
20
|
-
"prepare": "npm run build:dist && node scripts/download-grammars.js --core --dest grammars && node scripts/setup-git-hooks.mjs && node scripts/warm-loader-cache.mjs",
|
|
20
|
+
"prepare": "npm run build:dist && node scripts/download-grammars.js --core --dest grammars && node scripts/setup-git-hooks.mjs && node scripts/stamp-package-lock.mjs && node scripts/warm-loader-cache.mjs",
|
|
21
21
|
"prepack": "node scripts/strip-dev-deps-for-pack.mjs --strip",
|
|
22
22
|
"postpack": "node scripts/strip-dev-deps-for-pack.mjs --restore",
|
|
23
|
-
"lint": "tsc --project tsconfig.json && npm run lint:js",
|
|
23
|
+
"lint": "tsc --project tsconfig.json && npm run lint:js && npm run lint:js:tests",
|
|
24
24
|
"lint:js": "oxlint --deny-warnings --import-plugin --promise-plugin -D block-scoped-var -D import/default -D import/namespace -D import/no-absolute-path -D import/no-empty-named-blocks -D import/no-named-as-default -D import/no-self-import -D no-extend-native -D no-extra-bind -D no-implied-eval -D no-new -D no-unexpected-multiline -D no-useless-constructor -D oxc/approx-constant -D oxc/misrefactored-assign-op -D oxc/no-accumulating-spread -D oxc/no-async-endpoint-handlers -D oxc/no-this-in-exported-function -D promise/no-callback-in-promise -D promise/no-multiple-resolved -D promise/no-new-statics -D promise/valid-params -D typescript/no-confusing-non-null-assertion -D typescript/no-extraneous-class -D typescript/no-unnecessary-type-constraint -D typescript/no-unsafe-enum-comparison -D unicorn/no-accessor-recursion -D unicorn/no-array-fill-with-reference-type -D unicorn/no-confusing-array-with -D unicorn/no-instanceof-builtins -D unicorn/prefer-array-flat-map -D unicorn/require-module-specifiers --ignore-pattern \"tests/**/*.ts\" --ignore-pattern \"tests/**/*.tsx\" --ignore-pattern \"**/*.d.mts\" --ignore-pattern \"tests/fixtures/autofix-smoke/**\" --ignore-pattern \"tests/fixtures/format-smoke/**\" --ignore-pattern \"tests/fixtures/tool-smoke/**\" --ignore-pattern \"tests/fixtures/call-graph/javascript/**\" --ignore-pattern \"tests/fixtures/function-facts/javascript-parameter.js\" .",
|
|
25
|
-
"lint:js:advisory": "node scripts/lint-js-advisory.mjs --deny-warnings --format
|
|
25
|
+
"lint:js:advisory": "node scripts/lint-js-advisory.mjs --deny-warnings --format unix -D correctness -D suspicious -D perf --import-plugin --promise-plugin --type-aware -A no-underscore-dangle -A no-await-in-loop -A unicorn/no-array-sort -A unicorn/consistent-function-scoping -A promise/no-promise-in-callback -A no-useless-call -A import/no-unassigned-import -A no-unmodified-loop-condition --ignore-pattern \"**/*.d.mts\" --ignore-pattern \"tests/fixtures/autofix-smoke/**\" --ignore-pattern \"tests/fixtures/format-smoke/**\" --ignore-pattern \"tests/fixtures/tool-smoke/**\" --ignore-pattern \"tests/fixtures/call-graph/javascript/**\" --ignore-pattern \"tests/fixtures/function-facts/javascript-parameter.js\" .",
|
|
26
|
+
"lint:js:tests": "node scripts/lint-js-advisory.mjs --deny-warnings --format unix --type-aware -A correctness -A suspicious -A perf --ignore-pattern \"tests/fixtures/**\" tests",
|
|
26
27
|
"depcruise:check": "depcruise --validate --config .dependency-cruiser.cjs --ignore-known .dependency-cruiser-known-violations.json --output-type err index.ts \"clients/**/*.ts\"",
|
|
27
28
|
"fmt": "oxfmt",
|
|
28
29
|
"fmt:check": "oxfmt --check",
|
|
@@ -39,6 +40,7 @@
|
|
|
39
40
|
"check": "node scripts/check-extensions.mjs",
|
|
40
41
|
"selftest:install": "node scripts/install-selftest.mjs",
|
|
41
42
|
"check:lockfile": "node scripts/check-lockfile-sync.mjs",
|
|
43
|
+
"check:allow-scripts": "node scripts/check-allow-scripts.mjs",
|
|
42
44
|
"preflight": "node scripts/pr-preflight.mjs",
|
|
43
45
|
"knip": "node scripts/run-knip.mjs",
|
|
44
46
|
"check:grammars": "node scripts/check-grammar-provenance.mjs",
|
|
@@ -47,6 +49,7 @@
|
|
|
47
49
|
"audit:rule-catalog": "node scripts/validate-rule-catalog.mjs",
|
|
48
50
|
"audit:astgrep-rule-pairs": "node scripts/audit-astgrep-rule-pairs.mjs",
|
|
49
51
|
"astgrep:self-scan": "node scripts/run-astgrep-pi-lens.mjs",
|
|
52
|
+
"lane:check": "node scripts/lane-check.mjs",
|
|
50
53
|
"astgrep:self-scan:update-baseline": "node scripts/run-astgrep-pi-lens.mjs --update-baseline",
|
|
51
54
|
"audit:playground": "node scripts/playground-verify-rule.mjs",
|
|
52
55
|
"bench:cascade-budget": "node scripts/bench-cascade-budget.mjs",
|
|
@@ -54,6 +57,7 @@
|
|
|
54
57
|
"logs:smells": "node scripts/analyze-pi-lens-logs.mjs",
|
|
55
58
|
"complexity": "node scripts/complexity-report.mjs",
|
|
56
59
|
"changelog:check": "node scripts/rollup-changelog.mjs --check",
|
|
60
|
+
"contributors:update": "node scripts/update-contributors.mjs",
|
|
57
61
|
"test:regen": "node scripts/regen-test-baseline.mjs",
|
|
58
62
|
"changelog:release": "node scripts/changelog-release.mjs",
|
|
59
63
|
"changelog:extract": "node scripts/changelog-extract.mjs",
|
|
@@ -90,7 +94,14 @@
|
|
|
90
94
|
},
|
|
91
95
|
"packageManager": "npm@11.18.0",
|
|
92
96
|
"files": [
|
|
93
|
-
"dist/",
|
|
97
|
+
"dist/index.js",
|
|
98
|
+
"dist/chunk-*.js",
|
|
99
|
+
"dist/mcp/cli.js",
|
|
100
|
+
"dist/mcp/server.js",
|
|
101
|
+
"dist/mcp/analyze-cli.js",
|
|
102
|
+
"dist/mcp/worker.js",
|
|
103
|
+
"dist/workers/",
|
|
104
|
+
"dist/probes/",
|
|
94
105
|
"docs/",
|
|
95
106
|
"grammars/",
|
|
96
107
|
"vendor/grammars/",
|
|
@@ -103,6 +114,7 @@
|
|
|
103
114
|
"scripts/install-selftest.mjs",
|
|
104
115
|
"scripts/lib/host-provided-deps.mjs",
|
|
105
116
|
"scripts/lib/skills-predicate.mjs",
|
|
117
|
+
"scripts/lib/web-tree-sitter-dir.mjs",
|
|
106
118
|
"scripts/lib/warm-loader-cache.mjs",
|
|
107
119
|
"scripts/warm-loader-cache.mjs",
|
|
108
120
|
"scripts/rpc-load-check.mjs",
|
|
@@ -112,7 +124,7 @@
|
|
|
112
124
|
"banner.png"
|
|
113
125
|
],
|
|
114
126
|
"dependencies": {
|
|
115
|
-
"@ast-grep/cli": "
|
|
127
|
+
"@ast-grep/cli": "0.45.3",
|
|
116
128
|
"@ast-grep/napi": "^0.45.0",
|
|
117
129
|
"js-yaml": "^5.2.2",
|
|
118
130
|
"minimatch": "^10.2.6",
|
|
@@ -121,7 +133,7 @@
|
|
|
121
133
|
},
|
|
122
134
|
"peerDependencies": {
|
|
123
135
|
"@earendil-works/pi-coding-agent": "*",
|
|
124
|
-
"@earendil-works/pi-tui": "
|
|
136
|
+
"@earendil-works/pi-tui": "*",
|
|
125
137
|
"typebox": "^1.0.0"
|
|
126
138
|
},
|
|
127
139
|
"peerDependenciesMeta": {
|
|
@@ -149,8 +161,10 @@
|
|
|
149
161
|
},
|
|
150
162
|
"allowScripts": {
|
|
151
163
|
"@ast-grep/cli@0.45.3": true,
|
|
152
|
-
"@google/genai@
|
|
153
|
-
"
|
|
164
|
+
"@google/genai@2.21.0": true,
|
|
165
|
+
"esbuild@0.28.2": true,
|
|
166
|
+
"fsevents@2.3.3": false,
|
|
167
|
+
"protobufjs@7.6.6": true
|
|
154
168
|
},
|
|
155
169
|
"overrides": {
|
|
156
170
|
"qs": "^6.15.4"
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
id: advisory-registry-subset
|
|
2
|
+
valid:
|
|
3
|
+
- |
|
|
4
|
+
// /^(typescript|python|marksman|opengrep):/ is prose, not code.
|
|
5
|
+
const one = "typescript|python";
|
|
6
|
+
- |
|
|
7
|
+
// ["typescript", "python"] is prose, not code.
|
|
8
|
+
const one = "['typescript', 'python']";
|
|
9
|
+
- |
|
|
10
|
+
const one = /^(typescript):/;
|
|
11
|
+
- |
|
|
12
|
+
const one = ["typescript"];
|
|
13
|
+
- |
|
|
14
|
+
const one = ["typescript", "not-a-server"];
|
|
15
|
+
- |
|
|
16
|
+
const one = /^(go|typescript-x):/;
|
|
17
|
+
- |
|
|
18
|
+
const one = /^(foo|typescript):/;
|
|
19
|
+
- |
|
|
20
|
+
const one = /^(typescript|foo):/;
|
|
21
|
+
- |
|
|
22
|
+
const one = /^typescript-python$/;
|
|
23
|
+
invalid:
|
|
24
|
+
- |
|
|
25
|
+
const servers = /^(typescript|python|marksman|opengrep):/;
|
|
26
|
+
- |
|
|
27
|
+
const servers = ["typescript", "python", "marksman"];
|
|
28
|
+
- |
|
|
29
|
+
const servers = ["typescript", "python"];
|
|
30
|
+
- |
|
|
31
|
+
const servers = ['typescript', 'python', 'marksman'];
|
|
32
|
+
- |
|
|
33
|
+
const servers = ["foo", "typescript", "python"];
|
|
34
|
+
- |
|
|
35
|
+
const servers = ["typescript", "foo", "python"];
|
|
36
|
+
- |
|
|
37
|
+
const servers = ["foo", "typescript", "bar", "python"];
|
|
38
|
+
- |
|
|
39
|
+
const servers = /^(go|rust|ruby):/;
|
|
40
|
+
- |
|
|
41
|
+
const servers = /^(foo|typescript|python):/;
|
|
@@ -4,9 +4,22 @@ valid:
|
|
|
4
4
|
- 'assert x == 1'
|
|
5
5
|
- 'assert x, "message"'
|
|
6
6
|
- 'assert (x == 1), "message"' # explicit grouping, not a tuple
|
|
7
|
+
- 'assert actual == (1, 2)'
|
|
8
|
+
- 'assert (actual == (1, 2))'
|
|
9
|
+
- 'assert (f((1, 2)))'
|
|
10
|
+
- 'assert (left, right) == expected'
|
|
11
|
+
- 'assert value in {(1, 2), (3, 4)}'
|
|
12
|
+
- 'assert {item for item in values if item != (1, 2)}'
|
|
13
|
+
- 'assert all(item in {(1, 2)} for item in values)'
|
|
14
|
+
- 'assert True, ("tuple", "message")'
|
|
15
|
+
- 'assert actual == (1, 2), ("tuple", "message")'
|
|
7
16
|
invalid:
|
|
17
|
+
- 'assert ()'
|
|
8
18
|
- 'assert (1, 2)'
|
|
9
19
|
- 'assert (x, y)'
|
|
20
|
+
- 'assert ((x, y))'
|
|
21
|
+
- 'assert (((x, y)))'
|
|
22
|
+
- 'assert (x, y), ("tuple", "message")'
|
|
10
23
|
- 'assert (1, 2, 3), "message"'
|
|
11
24
|
- |
|
|
12
25
|
def f():
|
|
@@ -15,6 +15,21 @@ valid:
|
|
|
15
15
|
x()
|
|
16
16
|
except:
|
|
17
17
|
pass
|
|
18
|
+
- |
|
|
19
|
+
# #3211: body-only `or` must not be flagged — the handler condition
|
|
20
|
+
# itself is a plain exception type, only the return value uses `or`.
|
|
21
|
+
try:
|
|
22
|
+
x()
|
|
23
|
+
except Exception:
|
|
24
|
+
return 2 or 3
|
|
25
|
+
- |
|
|
26
|
+
# #3211: same shape one level deeper (an `if` inside the handler
|
|
27
|
+
# body) — still not a boolean-in-except-clause target.
|
|
28
|
+
try:
|
|
29
|
+
x()
|
|
30
|
+
except Exception:
|
|
31
|
+
if cond:
|
|
32
|
+
x = a or b
|
|
18
33
|
invalid:
|
|
19
34
|
- |
|
|
20
35
|
try:
|
|
@@ -26,3 +41,14 @@ invalid:
|
|
|
26
41
|
x()
|
|
27
42
|
except ValueError and KeyError:
|
|
28
43
|
pass
|
|
44
|
+
- |
|
|
45
|
+
# #3211: a nested try whose OWN except clause has the boolean
|
|
46
|
+
# condition must still be flagged, even though it sits inside an
|
|
47
|
+
# outer handler whose body also contains an `or`.
|
|
48
|
+
try:
|
|
49
|
+
outer()
|
|
50
|
+
except Exception:
|
|
51
|
+
try:
|
|
52
|
+
inner()
|
|
53
|
+
except (A or B):
|
|
54
|
+
return 3 or 4
|
|
@@ -2,6 +2,16 @@ id: no-http-headers-bracket-access
|
|
|
2
2
|
valid:
|
|
3
3
|
- "auth = request.headers.get('Authorization')"
|
|
4
4
|
- "auth = request.headers.get('Authorization', '')"
|
|
5
|
+
- |
|
|
6
|
+
# #3211: a plain assignment through the bracket sets the header —
|
|
7
|
+
# it cannot raise KeyError, so it is not a read-site false positive.
|
|
8
|
+
resp.headers["X"] = "v"
|
|
9
|
+
- |
|
|
10
|
+
# #3211: augmented assignment is still a write, not a read.
|
|
11
|
+
resp.headers["X"] += "b"
|
|
12
|
+
- |
|
|
13
|
+
# #3211: `del` removes the key; it never raises KeyError either.
|
|
14
|
+
del resp.headers["Y"]
|
|
5
15
|
invalid:
|
|
6
16
|
- 'auth = request.headers["Authorization"]'
|
|
7
17
|
- 'auth = response.headers["X-Request-Id"]'
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
id: unchecked-numeric-parse-python
|
|
2
|
+
valid:
|
|
3
|
+
- |
|
|
4
|
+
# #3211: already-converted-by-construction — Decimal raises
|
|
5
|
+
# decimal.InvalidOperation, not ValueError, and is excluded here.
|
|
6
|
+
x = float(Decimal("1.5"))
|
|
7
|
+
- |
|
|
8
|
+
# #3211: a numeric literal argument can never raise ValueError.
|
|
9
|
+
x = int(3.7)
|
|
10
|
+
- |
|
|
11
|
+
try:
|
|
12
|
+
g = int(s)
|
|
13
|
+
except ValueError:
|
|
14
|
+
pass
|
|
15
|
+
invalid:
|
|
16
|
+
- 'int("42")'
|
|
17
|
+
- 'float("3.14")'
|
|
18
|
+
- 'int(user_input)'
|
|
@@ -12,12 +12,13 @@ valid:
|
|
|
12
12
|
except OSError:
|
|
13
13
|
return None
|
|
14
14
|
- 'CONSTANT = 42'
|
|
15
|
+
- |
|
|
16
|
+
# #3211: int()/float() moved to unchecked-numeric-parse-python — this
|
|
17
|
+
# rule no longer fires on the numeric-parse shape.
|
|
18
|
+
x = int(s)
|
|
15
19
|
invalid:
|
|
16
20
|
- 'data = json.loads(raw)'
|
|
17
21
|
- 'f = open(path)'
|
|
18
22
|
- 'os.remove(path)'
|
|
19
23
|
- 'os.stat(path)'
|
|
20
24
|
- 'shutil.rmtree(path)'
|
|
21
|
-
- 'int("42")'
|
|
22
|
-
- 'float("3.14")'
|
|
23
|
-
- 'int(user_input)'
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
id: advisory-registry-subset
|
|
2
|
+
language: TypeScript
|
|
3
|
+
severity: info
|
|
4
|
+
metadata:
|
|
5
|
+
category: pi-lens-self-scan
|
|
6
|
+
message: "Hand-enumerated registry subset — explain the excluded ids or use the registry"
|
|
7
|
+
ignores:
|
|
8
|
+
- "**/tests/**"
|
|
9
|
+
note: |
|
|
10
|
+
Advisory only: `severity: info` self-scan rules are printed by
|
|
11
|
+
`npm run astgrep:self-scan` and never gate or enter the baseline
|
|
12
|
+
(scripts/lib/astgrep-self-scan.mjs), and are reported only in files
|
|
13
|
+
changed against a diff base (`--base <ref>`, CI's GITHUB_BASE_REF), or
|
|
14
|
+
everywhere with `--all-advisory`. This is a population-screening
|
|
15
|
+
prompt: two or more LSP server ids from clients/lsp/server.ts in a regex
|
|
16
|
+
alternation (any branch position) or in a string array (any position,
|
|
17
|
+
either quote style). The AST matcher does not scan comments or ordinary
|
|
18
|
+
strings. Tool and language registries remain a follow-up because their
|
|
19
|
+
larger populations need a separate low-noise rule shape.
|
|
20
|
+
|
|
21
|
+
Admission classes (every current hit belongs to one; the reader decides
|
|
22
|
+
whether a new hit needs a reason in the owning change):
|
|
23
|
+
- Extension / shell-name regexes (`file-role.ts`, `word-index.ts`,
|
|
24
|
+
`cache-manager.ts`, `jscpd-client.ts`, `tree-sitter-client.ts`,
|
|
25
|
+
`git-guard.ts`): file suffixes or shell binaries that share a spelling
|
|
26
|
+
with a server id; lexical coincidence, not a registry subset.
|
|
27
|
+
- Language-kind and runner-applicability arrays (`language-registry.ts`,
|
|
28
|
+
`tree-sitter-shared.ts`, `tree-sitter.ts`, `review-graph/builder.ts`,
|
|
29
|
+
`fact-rules.ts`, `biome-client.ts`, `ast-grep-napi.ts`,
|
|
30
|
+
`integration.ts`, `spotbugs.ts`, `test-runner-client.ts`,
|
|
31
|
+
`trivy-config.ts`): file-kind or language ids, an intentional
|
|
32
|
+
per-consumer applicability subset.
|
|
33
|
+
- `clients/file-kinds.ts` CODE_KINDS and NON_CODE_KINDS: derived
|
|
34
|
+
partitions of one registry, not independent registry choices.
|
|
35
|
+
- `clients/lsp/server.ts` OPENGREP_KINDS and AST_GREP_KINDS: auxiliary
|
|
36
|
+
servers attach to a deliberate cross-language subset.
|
|
37
|
+
- `clients/installer/index.ts` GITHUB_TOOLS: tool names, enforced against
|
|
38
|
+
the tool registry by tool-registry-consistency.
|
|
39
|
+
rule:
|
|
40
|
+
any:
|
|
41
|
+
- kind: regex
|
|
42
|
+
regex: '^/[^/\n]*\b(?:typescript|deno|python|python-jedi|rust|ruby|php|powershell|csharp|omnisharp|fsharp|java|kotlin|swift|dart|lua|cpp|zig|haskell|elixir|expert|gleam|tinymist|marksman|ocaml|clojure|cue|terraform|nix|bash|fish|cmake|docker|yaml|json|html|toml|prisma|vue|svelte|css|opengrep|ast-grep|zizmor|typos)\b[^/\n]*\|[^/\n]*\b(?:typescript|deno|python|python-jedi|rust|ruby|php|powershell|csharp|omnisharp|fsharp|java|kotlin|swift|dart|lua|cpp|zig|haskell|elixir|expert|gleam|tinymist|marksman|ocaml|clojure|cue|terraform|nix|bash|fish|cmake|docker|yaml|json|html|toml|prisma|vue|svelte|css|opengrep|ast-grep|zizmor|typos)\b[^/\n]*/[dgimsuvy]*$'
|
|
43
|
+
- kind: array
|
|
44
|
+
has:
|
|
45
|
+
kind: string
|
|
46
|
+
regex: '^["''](typescript|deno|python|python-jedi|go|rust|ruby|php|powershell|csharp|omnisharp|fsharp|java|kotlin|swift|dart|lua|cpp|zig|haskell|elixir|expert|gleam|tinymist|marksman|ocaml|clojure|cue|terraform|nix|bash|fish|cmake|docker|yaml|json|html|toml|prisma|vue|svelte|css|opengrep|ast-grep|zizmor|typos)["'']$'
|
|
47
|
+
follows:
|
|
48
|
+
kind: string
|
|
49
|
+
regex: '^["''](typescript|deno|python|python-jedi|go|rust|ruby|php|powershell|csharp|omnisharp|fsharp|java|kotlin|swift|dart|lua|cpp|zig|haskell|elixir|expert|gleam|tinymist|marksman|ocaml|clojure|cue|terraform|nix|bash|fish|cmake|docker|yaml|json|html|toml|prisma|vue|svelte|css|opengrep|ast-grep|zizmor|typos)["'']$'
|
|
50
|
+
stopBy: end
|
|
@@ -1,24 +1,34 @@
|
|
|
1
1
|
id: no-assert-tuple
|
|
2
2
|
language: Python
|
|
3
3
|
message: "Assert should not be called on a tuple literal"
|
|
4
|
-
severity:
|
|
4
|
+
severity: warning
|
|
5
5
|
note: |
|
|
6
6
|
Port of SonarCloud python:S5905.
|
|
7
7
|
|
|
8
8
|
`assert (a, b)` is always truthy because the tuple `(a, b)` is a
|
|
9
|
-
non-empty object.
|
|
10
|
-
|
|
11
|
-
`assert (a == b)`.
|
|
9
|
+
non-empty object. The developer probably meant `assert a, b` (an
|
|
10
|
+
assertion with a message) or `assert (a == b)`.
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
Bind the assertion's condition separately from its optional message,
|
|
13
|
+
then require that condition to be a tuple or a parentheses-only chain
|
|
14
|
+
ending in a tuple. Comparisons, calls, comprehensions, containers, and
|
|
15
|
+
tuple-valued assertion messages remain valid. The rule remains a
|
|
16
|
+
warning pending the multi-corpus false-positive audit required for
|
|
17
|
+
error severity.
|
|
17
18
|
metadata:
|
|
18
19
|
sonar: S5905
|
|
19
20
|
rule:
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
pattern: assert $COND
|
|
22
|
+
constraints:
|
|
23
|
+
COND:
|
|
24
|
+
any:
|
|
25
|
+
- kind: tuple
|
|
26
|
+
- all:
|
|
27
|
+
- kind: parenthesized_expression
|
|
28
|
+
- has:
|
|
29
|
+
kind: tuple
|
|
30
|
+
stopBy:
|
|
31
|
+
not:
|
|
32
|
+
any:
|
|
33
|
+
- kind: parenthesized_expression
|
|
34
|
+
- kind: tuple
|
|
@@ -11,8 +11,12 @@ note: |
|
|
|
11
11
|
developer meant `except (ValueError, KeyError):` (a tuple of
|
|
12
12
|
exception types).
|
|
13
13
|
|
|
14
|
-
Matches an `except_clause` whose
|
|
15
|
-
|
|
14
|
+
Matches an `except_clause` whose search for a `boolean_operator`
|
|
15
|
+
(and/or) descendant stops at the handler's own `block` — the
|
|
16
|
+
clause's condition, not anything inside the handler's body (a
|
|
17
|
+
`return x or y` or an `x = a or b` in the body is not a false
|
|
18
|
+
target; a nested `try`'s own `except` clause is checked on its
|
|
19
|
+
own merits when the walk reaches it).
|
|
16
20
|
metadata:
|
|
17
21
|
sonar: S5714
|
|
18
22
|
rule:
|
|
@@ -20,4 +24,4 @@ rule:
|
|
|
20
24
|
- kind: except_clause
|
|
21
25
|
- has:
|
|
22
26
|
kind: boolean_operator
|
|
23
|
-
stopBy:
|
|
27
|
+
stopBy: { kind: block }
|
|
@@ -11,8 +11,8 @@ note: |
|
|
|
11
11
|
just trains users to ignore the rule; `ignores` below carves those paths
|
|
12
12
|
out while application/library code elsewhere still gets flagged (#965).
|
|
13
13
|
ignores:
|
|
14
|
-
- "scripts/**"
|
|
15
|
-
- "bin/**"
|
|
14
|
+
- "**/scripts/**"
|
|
15
|
+
- "**/bin/**"
|
|
16
16
|
- "**/logger.ts"
|
|
17
17
|
- "**/logger.js"
|
|
18
18
|
- "**/logger.mjs"
|
|
@@ -11,8 +11,8 @@ note: |
|
|
|
11
11
|
just trains users to ignore the rule; `ignores` below carves those paths
|
|
12
12
|
out while application/library code elsewhere still gets flagged (#965).
|
|
13
13
|
ignores:
|
|
14
|
-
- "scripts/**"
|
|
15
|
-
- "bin/**"
|
|
14
|
+
- "**/scripts/**"
|
|
15
|
+
- "**/bin/**"
|
|
16
16
|
- "**/logger.ts"
|
|
17
17
|
- "**/logger.js"
|
|
18
18
|
- "**/logger.mjs"
|
|
@@ -9,14 +9,19 @@ note: |
|
|
|
9
9
|
missing. Use `request.headers.get("X-Foo")` (returns None) or
|
|
10
10
|
`request.headers["X-Foo"]` after a guard check.
|
|
11
11
|
|
|
12
|
-
Matches bracket-style subscript on a `headers` attribute
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
Matches bracket-style subscript READS on a `headers` attribute
|
|
13
|
+
(`$REQ.headers[$KEY]` already subsumes the `request.`/`response.`-
|
|
14
|
+
named forms). A write through the same bracket syntax —
|
|
15
|
+
`resp.headers["X"] = v`, `resp.headers["X"] += v`, or
|
|
16
|
+
`del resp.headers["X"]` — sets or removes the header and can never
|
|
17
|
+
raise KeyError, so those are excluded.
|
|
15
18
|
metadata:
|
|
16
19
|
sonar: S8371
|
|
17
20
|
rule:
|
|
18
|
-
|
|
21
|
+
all:
|
|
19
22
|
- pattern: "$REQ.headers[$KEY]"
|
|
20
|
-
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
+
- not:
|
|
24
|
+
any:
|
|
25
|
+
- inside: { kind: assignment, field: left }
|
|
26
|
+
- inside: { kind: augmented_assignment, field: left }
|
|
27
|
+
- inside: { kind: delete_statement }
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
id: unchecked-numeric-parse-python
|
|
2
|
+
language: Python
|
|
3
|
+
severity: warning
|
|
4
|
+
message: "int()/float() without try/except — raises ValueError on non-numeric input"
|
|
5
|
+
note: |
|
|
6
|
+
Split out of `unchecked-throwing-call-python` (#3211): `int()`/`float()`
|
|
7
|
+
raise `ValueError` on non-numeric strings, but whether a given call CAN
|
|
8
|
+
raise depends on the argument's runtime type — often undecidable from
|
|
9
|
+
syntax alone — so this ships at `warning`, separate from the
|
|
10
|
+
syntactically-certain `error`-level calls (open/json/os/shutil).
|
|
11
|
+
|
|
12
|
+
Excluded as already-safe by construction: a numeric literal argument
|
|
13
|
+
(`int(3.7)`), and an argument that is itself a call to `int()`/
|
|
14
|
+
`float()`/`Decimal()` (already-converted, or a `Decimal` — which raises
|
|
15
|
+
`decimal.InvalidOperation`, not `ValueError`, and is out of scope here).
|
|
16
|
+
|
|
17
|
+
Residual, undecidable false positive: a call whose argument is a typed
|
|
18
|
+
parameter already known to be numeric, e.g.
|
|
19
|
+
|
|
20
|
+
def f(valor: Decimal):
|
|
21
|
+
return float(valor) # valor is a Decimal, not a raw string
|
|
22
|
+
|
|
23
|
+
The rule cannot see the parameter's declared type from the call site.
|
|
24
|
+
Suppress that shape explicitly:
|
|
25
|
+
|
|
26
|
+
return float(valor) # pi-lens-ignore: unchecked-numeric-parse-python
|
|
27
|
+
rule:
|
|
28
|
+
any:
|
|
29
|
+
- pattern: int($EXPR)
|
|
30
|
+
- pattern: float($EXPR)
|
|
31
|
+
not:
|
|
32
|
+
any:
|
|
33
|
+
- inside:
|
|
34
|
+
stopBy: end
|
|
35
|
+
kind: try_statement
|
|
36
|
+
- has:
|
|
37
|
+
field: arguments
|
|
38
|
+
has:
|
|
39
|
+
any:
|
|
40
|
+
- kind: integer
|
|
41
|
+
- kind: float
|
|
42
|
+
- pattern: Decimal($$$)
|
|
43
|
+
- pattern: int($$$)
|
|
44
|
+
- pattern: float($$$)
|
|
@@ -9,7 +9,11 @@ note: |
|
|
|
9
9
|
json.loads(): raises json.JSONDecodeError on malformed JSON
|
|
10
10
|
os.stat(): raises FileNotFoundError, PermissionError
|
|
11
11
|
os.remove(): raises FileNotFoundError, PermissionError
|
|
12
|
-
|
|
12
|
+
|
|
13
|
+
`int()`/`float()` are a separate rule, `unchecked-numeric-parse-python`
|
|
14
|
+
(#3211): whether they can raise depends on the argument's runtime type,
|
|
15
|
+
which is often undecidable from syntax alone (a typed parameter, a prior
|
|
16
|
+
guard), so they ship at `warning` instead of `error` here.
|
|
13
17
|
|
|
14
18
|
✅ WRAP IN TRY/EXCEPT:
|
|
15
19
|
try:
|
|
@@ -40,8 +44,6 @@ rule:
|
|
|
40
44
|
- pattern: shutil.copy($$$)
|
|
41
45
|
- pattern: shutil.move($$$)
|
|
42
46
|
- pattern: shutil.rmtree($$$)
|
|
43
|
-
- pattern: int($EXPR)
|
|
44
|
-
- pattern: float($EXPR)
|
|
45
47
|
not:
|
|
46
48
|
inside:
|
|
47
49
|
stopBy: end
|
|
@@ -29,8 +29,8 @@ post_filter: not_in_test_block # skip test blocks — no-console-in-tests handl
|
|
|
29
29
|
# trains users to ignore the rule (#965). Application/library code outside
|
|
30
30
|
# these paths still gets flagged.
|
|
31
31
|
ignore_paths:
|
|
32
|
-
- "scripts/**"
|
|
33
|
-
- "bin/**"
|
|
32
|
+
- "**/scripts/**"
|
|
33
|
+
- "**/bin/**"
|
|
34
34
|
- "**/logger.ts"
|
|
35
35
|
- "**/logger.js"
|
|
36
36
|
- "**/logger.mjs"
|