pi-lens 4.3.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1064 -0
- package/README.md +115 -25
- 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 +16456 -8335
- package/dist/mcp/analyze-cli.js +186 -232
- package/dist/mcp/cli.js +137 -98
- package/dist/mcp/server.js +22589 -1573
- 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/agent-guide.md +13 -4
- package/docs/agent-tools.md +42 -0
- package/docs/ast-grep_rules_catalog.md +3 -2
- package/docs/configuration.md +20 -1
- package/docs/environment-variables.md +52 -2
- package/docs/features.md +8 -4
- package/docs/globalconfig.md +1 -0
- package/docs/io-bridge-v2-migration.md +94 -0
- package/docs/lsp-capability-matrix.md +36 -4
- 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 +156 -88
- package/docs/pi-lens-investigator.md +74 -26
- 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 +188 -48
- package/docs/pi-lens-subagent.md +246 -45
- package/docs/pi-lens-warden.md +18 -7
- package/docs/public-api-stability.md +55 -0
- package/docs/release-qa-baseline.md +84 -17
- package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/docs/servercapabilities.md +53 -49
- package/docs/settings.md +1 -0
- 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 +19 -7
- package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- 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 +33 -34
- package/scripts/lib/host-provided-deps.mjs +13 -4
- package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
- package/dist/clients/actionable-warnings-logger.js +0 -35
- package/dist/clients/actionable-warnings.js +0 -1610
- package/dist/clients/advisory-provenance.js +0 -593
- 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 -524
- 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 -124
- 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 -285
- package/dist/clients/config-locations.js +0 -388
- package/dist/clients/config-resolve.js +0 -798
- 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 -426
- package/dist/clients/demoted-finding-render.js +0 -169
- package/dist/clients/dependency-checker.js +0 -885
- 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 -630
- 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 -339
- package/dist/clients/dispatch/indent-detect.js +0 -417
- package/dist/clients/dispatch/inline-suppressions.js +0 -89
- 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 -69
- 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 -111
- package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/dist/clients/dispatch/runners/biome-check.js +0 -296
- package/dist/clients/dispatch/runners/cpp-check.js +0 -219
- package/dist/clients/dispatch/runners/credo.js +0 -82
- package/dist/clients/dispatch/runners/cue-vet.js +0 -416
- package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
- package/dist/clients/dispatch/runners/detekt.js +0 -176
- package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
- package/dist/clients/dispatch/runners/elixir-check.js +0 -195
- package/dist/clients/dispatch/runners/eslint.js +0 -137
- 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 -167
- package/dist/clients/dispatch/runners/go-vet.js +0 -104
- package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
- package/dist/clients/dispatch/runners/hadolint.js +0 -91
- 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 -117
- package/dist/clients/dispatch/runners/index.js +0 -108
- package/dist/clients/dispatch/runners/javac.js +0 -99
- package/dist/clients/dispatch/runners/ktlint.js +0 -110
- package/dist/clients/dispatch/runners/lsp.js +0 -379
- package/dist/clients/dispatch/runners/markdownlint.js +0 -167
- package/dist/clients/dispatch/runners/mypy.js +0 -102
- package/dist/clients/dispatch/runners/oxlint.js +0 -414
- package/dist/clients/dispatch/runners/php-lint.js +0 -85
- 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 -99
- package/dist/clients/dispatch/runners/ruff.js +0 -88
- package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
- package/dist/clients/dispatch/runners/shellcheck.js +0 -173
- package/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/dist/clients/dispatch/runners/spellcheck.js +0 -128
- package/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
- package/dist/clients/dispatch/runners/stylelint.js +0 -166
- package/dist/clients/dispatch/runners/swiftlint.js +0 -163
- package/dist/clients/dispatch/runners/taplo.js +0 -174
- package/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/dist/clients/dispatch/runners/tflint.js +0 -125
- package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
- package/dist/clients/dispatch/runners/trivy-config.js +0 -253
- 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 -95
- 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 -128
- package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/dist/clients/dispatch/runners/yamllint.js +0 -95
- package/dist/clients/dispatch/runners/zig-check.js +0 -79
- package/dist/clients/dispatch/suppress-writer.js +0 -79
- 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 -415
- 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 -494
- 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 -2032
- 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 -1136
- 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 -348
- 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/inline-blocker-dispositions.js +0 -186
- package/dist/clients/install-diagnostics.js +0 -156
- package/dist/clients/installer/index.js +0 -5416
- 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 -378
- 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 -727
- package/dist/clients/lazy-import.js +0 -21
- package/dist/clients/ledger-bounds.js +0 -54
- package/dist/clients/lens-config.js +0 -404
- 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 -4593
- package/dist/clients/lsp/config.js +0 -691
- package/dist/clients/lsp/content-limits.js +0 -41
- 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 -746
- 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 -3290
- 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 -56
- 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 -392
- 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 -523
- package/dist/clients/mcp/review.js +0 -197
- 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 -333
- 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 -1480
- 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 -668
- 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 -807
- 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 -5126
- package/dist/clients/review-graph/format.js +0 -33
- package/dist/clients/review-graph/git-identity.js +0 -163
- 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 -179
- 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 -1324
- package/dist/clients/runtime-session.js +0 -2485
- package/dist/clients/runtime-tool-call.js +0 -1295
- package/dist/clients/runtime-tool-result.js +0 -2049
- package/dist/clients/runtime-turn.js +0 -3767
- package/dist/clients/rust-client.js +0 -97
- package/dist/clients/safe-spawn.js +0 -2357
- 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 -120
- 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 -4195
- 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-end/lane.js +0 -51
- package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
- package/dist/clients/turn-end/lanes/secrets.js +0 -204
- 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 -305
- package/dist/clients/widget-state.js +0 -1808
- 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 -443
- package/dist/clients/write-ordering-guard.js +0 -65
- package/dist/clients/zizmor-config.js +0 -340
- 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/scripts/lib/web-tree-sitter-dir.mjs +0 -123
- 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 -2571
- package/dist/tools/lsp-diagnostics.js +0 -1745
- 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
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
EXCLUDED_DIRS,
|
|
4
|
+
getExcludedDirGlobs
|
|
5
|
+
} from "./chunk-VN2AXLEX.js";
|
|
6
|
+
import {
|
|
7
|
+
escapeRegExp
|
|
8
|
+
} from "./chunk-N3YQJI6O.js";
|
|
9
|
+
|
|
10
|
+
// dist/clients/scratch-tree-policy.js
|
|
11
|
+
function literalExcludedDirNames() {
|
|
12
|
+
return EXCLUDED_DIRS.filter((name) => !name.includes("*") && !name.includes("?"));
|
|
13
|
+
}
|
|
14
|
+
function getScratchTreeGlobPatterns() {
|
|
15
|
+
return getExcludedDirGlobs();
|
|
16
|
+
}
|
|
17
|
+
function getScratchTreeDirNames() {
|
|
18
|
+
return literalExcludedDirNames();
|
|
19
|
+
}
|
|
20
|
+
function getScratchTreeFnmatchPatterns() {
|
|
21
|
+
return literalExcludedDirNames().map((name) => `*/${name}/*`);
|
|
22
|
+
}
|
|
23
|
+
var SECRETS_LANE_SCRATCH_DIR_NAMES = [
|
|
24
|
+
// pi-ecosystem / coding-agent data + cache directories.
|
|
25
|
+
".pi",
|
|
26
|
+
// The same agent's rebranded config dir (#3112) — pi's config-dir name is
|
|
27
|
+
// `pkg.piConfig?.configDir || ".pi"`, so `.omp/agent/sessions` is the very
|
|
28
|
+
// history `.pi/agent/sessions` holds. Without it the secrets lane READS a
|
|
29
|
+
// project-local session history and can report a key a user pasted into a
|
|
30
|
+
// transcript as a blocking first-party leak.
|
|
31
|
+
".omp",
|
|
32
|
+
".pi-lens",
|
|
33
|
+
".claude",
|
|
34
|
+
".codex",
|
|
35
|
+
".agents",
|
|
36
|
+
".worktrees",
|
|
37
|
+
".rescue",
|
|
38
|
+
".gstack",
|
|
39
|
+
".superpowers",
|
|
40
|
+
".guardrails",
|
|
41
|
+
".playwright-cli",
|
|
42
|
+
".playwright-mcp",
|
|
43
|
+
// git's own internal object storage — binary/compressed, not readable
|
|
44
|
+
// source; a byte-regex scan of it produces garbage, not real findings.
|
|
45
|
+
".git",
|
|
46
|
+
// Vendored/installed npm packages — third-party noise, not a first-party
|
|
47
|
+
// leak surface (unlike `vendor`/`third_party`, which are vendored SOURCE
|
|
48
|
+
// a project can carry an upstream leak in and stays in scope).
|
|
49
|
+
"node_modules",
|
|
50
|
+
// Generic build/package-manager CACHES — regenerated from source on every
|
|
51
|
+
// build/install, never a place a human commits a credential on purpose.
|
|
52
|
+
// Deliberately excludes build OUTPUT (`dist`/`build`/`out`/`target`/
|
|
53
|
+
// `coverage`) — a bundler/compiler CAN bake a real secret into output.
|
|
54
|
+
".turbo",
|
|
55
|
+
".cache",
|
|
56
|
+
".parcel-cache",
|
|
57
|
+
".svelte-kit",
|
|
58
|
+
".nuxt",
|
|
59
|
+
".yarn",
|
|
60
|
+
".pnpm-store",
|
|
61
|
+
".gradle",
|
|
62
|
+
".next",
|
|
63
|
+
".ruff_cache",
|
|
64
|
+
".tox",
|
|
65
|
+
".pytest_cache",
|
|
66
|
+
"venv",
|
|
67
|
+
".venv",
|
|
68
|
+
"__pycache__"
|
|
69
|
+
];
|
|
70
|
+
function getSecretsLaneAllowlistPaths() {
|
|
71
|
+
return SECRETS_LANE_SCRATCH_DIR_NAMES.map((name) => {
|
|
72
|
+
const escaped = escapeRegExp(name);
|
|
73
|
+
return `(?:^|[/\\\\])${escaped}(?:[/\\\\].*)?$`;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function isUnderSecretsLaneScratchTree(relPath) {
|
|
77
|
+
const names = new Set(SECRETS_LANE_SCRATCH_DIR_NAMES.map((n) => n.toLowerCase()));
|
|
78
|
+
const segments = relPath.split(/[/\\]/).filter(Boolean);
|
|
79
|
+
return segments.some((segment) => names.has(segment.toLowerCase()));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export {
|
|
83
|
+
getScratchTreeGlobPatterns,
|
|
84
|
+
getScratchTreeDirNames,
|
|
85
|
+
getScratchTreeFnmatchPatterns,
|
|
86
|
+
getSecretsLaneAllowlistPaths,
|
|
87
|
+
isUnderSecretsLaneScratchTree
|
|
88
|
+
};
|
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
import { createRequire as __pilensCreateRequire } from "node:module"; const require = __pilensCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
HardFailureStamps
|
|
4
|
+
} from "./chunk-7U2IDNXN.js";
|
|
5
|
+
import {
|
|
6
|
+
getScratchTreeFnmatchPatterns
|
|
7
|
+
} from "./chunk-TO6WL3GM.js";
|
|
8
|
+
import {
|
|
9
|
+
formatToolFailure
|
|
10
|
+
} from "./chunk-ZMOL6RQC.js";
|
|
11
|
+
import {
|
|
12
|
+
firstOutputLine,
|
|
13
|
+
spawnFailedWithNoOutput
|
|
14
|
+
} from "./chunk-I7SPGOWI.js";
|
|
15
|
+
import {
|
|
16
|
+
listNestedLinkedWorktreeRoots
|
|
17
|
+
} from "./chunk-3I5QFT3N.js";
|
|
18
|
+
import {
|
|
19
|
+
extractTomlTableSection,
|
|
20
|
+
parseTomlStringArray
|
|
21
|
+
} from "./chunk-PAK6IDME.js";
|
|
22
|
+
import {
|
|
23
|
+
VENV_BIN_DIRS,
|
|
24
|
+
findLocalBinsAt
|
|
25
|
+
} from "./chunk-U3VGR4VU.js";
|
|
26
|
+
import {
|
|
27
|
+
probeToolAsync
|
|
28
|
+
} from "./chunk-EOKRQ3SA.js";
|
|
29
|
+
import {
|
|
30
|
+
classifyProbeFailure,
|
|
31
|
+
createAvailabilityLatch,
|
|
32
|
+
logAvailabilityDecision,
|
|
33
|
+
startHostStallSampler
|
|
34
|
+
} from "./chunk-WONERJTP.js";
|
|
35
|
+
import {
|
|
36
|
+
safeSpawnAsync
|
|
37
|
+
} from "./chunk-VN2AXLEX.js";
|
|
38
|
+
import {
|
|
39
|
+
incrementDegradationCount
|
|
40
|
+
} from "./chunk-N3YQJI6O.js";
|
|
41
|
+
import {
|
|
42
|
+
createSubsystemLogger
|
|
43
|
+
} from "./chunk-O6TQT6RI.js";
|
|
44
|
+
import {
|
|
45
|
+
findNearestMarkerRoot
|
|
46
|
+
} from "./chunk-Q5U6FMDI.js";
|
|
47
|
+
|
|
48
|
+
// dist/clients/dead-code-client.js
|
|
49
|
+
import * as fs from "node:fs";
|
|
50
|
+
import * as path from "node:path";
|
|
51
|
+
import { resolve as resolve2 } from "node:path";
|
|
52
|
+
function emptyResult(language) {
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
language,
|
|
56
|
+
unusedExports: [],
|
|
57
|
+
unusedFiles: [],
|
|
58
|
+
unusedDeps: [],
|
|
59
|
+
unlistedDeps: []
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
var ANALYSIS_TIMEOUT_MS = 3e4;
|
|
63
|
+
var VULTURE_PYTHON_ONLY_EXCLUDES = ["*/site-packages/*", "*/.eggs/*"];
|
|
64
|
+
var VULTURE_EXCLUDES = [
|
|
65
|
+
...getScratchTreeFnmatchPatterns(),
|
|
66
|
+
...VULTURE_PYTHON_ONLY_EXCLUDES
|
|
67
|
+
];
|
|
68
|
+
var VULTURE_IGNORE_DECORATORS = [
|
|
69
|
+
"@pytest.fixture",
|
|
70
|
+
"@pytest.fixture(*",
|
|
71
|
+
"@fixture",
|
|
72
|
+
"@fixture(*",
|
|
73
|
+
"@app.*",
|
|
74
|
+
"@router.*",
|
|
75
|
+
"@celery.task*",
|
|
76
|
+
"@task",
|
|
77
|
+
"@shared_task*"
|
|
78
|
+
];
|
|
79
|
+
var VULTURE_LINE = /^(.*?):(\d+): unused (\w[\w ]*?) '([^']+)' \((\d+)% confidence\)\s*$/;
|
|
80
|
+
function parseVultureOutput(output, root) {
|
|
81
|
+
const issues = [];
|
|
82
|
+
for (const raw of output.split(/\r?\n/)) {
|
|
83
|
+
const m = raw.match(VULTURE_LINE);
|
|
84
|
+
if (!m)
|
|
85
|
+
continue;
|
|
86
|
+
const [, file, line, kind, name, confidence] = m;
|
|
87
|
+
let rel = file;
|
|
88
|
+
try {
|
|
89
|
+
rel = path.relative(root, file) || file;
|
|
90
|
+
} catch {
|
|
91
|
+
rel = file;
|
|
92
|
+
}
|
|
93
|
+
issues.push({
|
|
94
|
+
category: "export",
|
|
95
|
+
kind: kind.trim(),
|
|
96
|
+
name,
|
|
97
|
+
file: rel,
|
|
98
|
+
line: Number.parseInt(line, 10),
|
|
99
|
+
confidence: Number.parseInt(confidence, 10)
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
return issues;
|
|
103
|
+
}
|
|
104
|
+
function escapeFnmatchLiteral(text) {
|
|
105
|
+
return text.replace(/[*?[]/g, (ch) => `[${ch}]`);
|
|
106
|
+
}
|
|
107
|
+
var PythonDeadCodeClient = class {
|
|
108
|
+
id = "python";
|
|
109
|
+
language = "Python";
|
|
110
|
+
/**
|
|
111
|
+
* Transient-aware memo (#1467): only a durable "vulture is not installed"
|
|
112
|
+
* verdict is remembered for the session. A probe that timed out expires and
|
|
113
|
+
* is re-probed, so vulture cannot be disabled for the process by one stall.
|
|
114
|
+
*/
|
|
115
|
+
availabilityLatch = createAvailabilityLatch();
|
|
116
|
+
resolved = null;
|
|
117
|
+
ensureInFlight = null;
|
|
118
|
+
inFlight = /* @__PURE__ */ new Map();
|
|
119
|
+
/**
|
|
120
|
+
* Per project root, the last run that died to a timeout or kill (#4117).
|
|
121
|
+
* Set where the scan SETTLES, so a scan turn_end abandoned at its budget and
|
|
122
|
+
* that later timed out still leaves the failure the next turn must see: the
|
|
123
|
+
* turn's own cache row only exists for a scan that settled inside it, and a
|
|
124
|
+
* failure never replaces a good baseline row.
|
|
125
|
+
*/
|
|
126
|
+
hardFailures = new HardFailureStamps();
|
|
127
|
+
log;
|
|
128
|
+
constructor(verbose = false) {
|
|
129
|
+
this.log = verbose ? createSubsystemLogger("dead-code:python") : () => {
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
recentHardFailure(cwd) {
|
|
133
|
+
const root = this.resolveProjectRoot(cwd || process.cwd());
|
|
134
|
+
if (!root)
|
|
135
|
+
return null;
|
|
136
|
+
return this.hardFailures.recent(resolve2(root));
|
|
137
|
+
}
|
|
138
|
+
get minConfidence() {
|
|
139
|
+
const raw = Number.parseInt(process.env.PI_LENS_VULTURE_MIN_CONFIDENCE ?? "60", 10);
|
|
140
|
+
return Number.isFinite(raw) ? Math.min(100, Math.max(0, raw)) : 60;
|
|
141
|
+
}
|
|
142
|
+
detect(cwd) {
|
|
143
|
+
return this.resolveProjectRoot(cwd) !== null;
|
|
144
|
+
}
|
|
145
|
+
owns(filePath) {
|
|
146
|
+
const ext = path.extname(filePath).toLowerCase();
|
|
147
|
+
return ext === ".py" || ext === ".pyi";
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Nearest dir with a Python project marker, never at/above $HOME and never
|
|
151
|
+
* escaping a VCS boundary — same containment rules as KnipClient so a scan
|
|
152
|
+
* launched from a bare cwd can't recurse the whole home tree (#250/#296).
|
|
153
|
+
* Delegates to the shared path-utils helper (refs #625) rather than
|
|
154
|
+
* hand-rolling the climb; only the marker list differs from KnipClient's.
|
|
155
|
+
*/
|
|
156
|
+
resolveProjectRoot(startDir, homeDirOverride) {
|
|
157
|
+
return findNearestMarkerRoot(startDir, [
|
|
158
|
+
"pyproject.toml",
|
|
159
|
+
"setup.py",
|
|
160
|
+
"setup.cfg",
|
|
161
|
+
"requirements.txt",
|
|
162
|
+
"Pipfile",
|
|
163
|
+
"tox.ini"
|
|
164
|
+
], { boundaries: [".git", ".hg", ".svn"], homeDir: homeDirOverride });
|
|
165
|
+
}
|
|
166
|
+
async ensureAvailable(root) {
|
|
167
|
+
const memo = this.availabilityLatch.read();
|
|
168
|
+
if (memo !== null)
|
|
169
|
+
return memo;
|
|
170
|
+
if (this.ensureInFlight)
|
|
171
|
+
return this.ensureInFlight;
|
|
172
|
+
this.ensureInFlight = this.doEnsureAvailable(root);
|
|
173
|
+
try {
|
|
174
|
+
return await this.ensureInFlight;
|
|
175
|
+
} finally {
|
|
176
|
+
this.ensureInFlight = null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* `<root>/.venv/bin/vulture` (and `venv`/Windows `Scripts` equivalents),
|
|
181
|
+
* checked by existence only — no spawn. A project's own venv is the vulture
|
|
182
|
+
* that project's own config and dependency set were written against; the
|
|
183
|
+
* bare `vulture`/`python -m vulture` PATH probes below only ever see
|
|
184
|
+
* whatever happens to be active in the CALLING shell, not the project's
|
|
185
|
+
* (#1731, discipline B — the same venv-first shape sqlfluff's binary
|
|
186
|
+
* resolution already uses, `runner-helpers.ts` `createVenvFinder`).
|
|
187
|
+
*
|
|
188
|
+
* The directory list is the shared `VENV_BIN_DIRS` — this was a third
|
|
189
|
+
* private spelling of the same four venv directories, with a
|
|
190
|
+
* `process.platform` branch that meant the ubuntu lane never saw the
|
|
191
|
+
* `Scripts` half at all (defect shape 30).
|
|
192
|
+
*
|
|
193
|
+
* The search is a fixed lookup at `root` ONLY (`findLocalBinsAt`, no
|
|
194
|
+
* ancestor walk) — #2544 review round 3 folded this onto the shared
|
|
195
|
+
* ancestor walker, reasoning a monorepo package should find its
|
|
196
|
+
* repo-root venv, but that was an unrequested behaviour change with no
|
|
197
|
+
* #2514 defect behind it. Reverted in round 4 F2. `findLocalBinsAt`
|
|
198
|
+
* returns EVERY match at `root` rather than the first, because
|
|
199
|
+
* `doEnsureAvailable` probes candidates in order and must keep the
|
|
200
|
+
* `venv/` fallback when a `.venv/` vulture exists but cannot run.
|
|
201
|
+
*/
|
|
202
|
+
venvCandidates(root) {
|
|
203
|
+
return findLocalBinsAt(["vulture"], root, {
|
|
204
|
+
windowsExt: ".exe",
|
|
205
|
+
binDirs: VENV_BIN_DIRS
|
|
206
|
+
}).map((full) => ({ cmd: full, prefix: [] }));
|
|
207
|
+
}
|
|
208
|
+
async doEnsureAvailable(root) {
|
|
209
|
+
const candidates = [
|
|
210
|
+
...root ? this.venvCandidates(root) : [],
|
|
211
|
+
{ cmd: "vulture", prefix: [] },
|
|
212
|
+
{ cmd: "python", prefix: ["-m", "vulture"] },
|
|
213
|
+
{ cmd: "python3", prefix: ["-m", "vulture"] }
|
|
214
|
+
];
|
|
215
|
+
let sawTransient = false;
|
|
216
|
+
let transientCause = "probe-timeout";
|
|
217
|
+
const sweepStartedAt = Date.now();
|
|
218
|
+
let sweepHostStallMs = 0;
|
|
219
|
+
let sweepEvidence;
|
|
220
|
+
for (const c of candidates) {
|
|
221
|
+
const sampler = startHostStallSampler();
|
|
222
|
+
const startedAt = Date.now();
|
|
223
|
+
let probe;
|
|
224
|
+
let hostStallMs;
|
|
225
|
+
try {
|
|
226
|
+
probe = await probeToolAsync(c.cmd, [...c.prefix, "--version"], {
|
|
227
|
+
timeout: 5e3
|
|
228
|
+
});
|
|
229
|
+
} finally {
|
|
230
|
+
hostStallMs = sampler.stop();
|
|
231
|
+
sweepHostStallMs += hostStallMs;
|
|
232
|
+
}
|
|
233
|
+
if (!probe.error && probe.status === 0) {
|
|
234
|
+
this.resolved = c;
|
|
235
|
+
this.availabilityLatch.noteAvailable();
|
|
236
|
+
this.log(`vulture found: ${[c.cmd, ...c.prefix].join(" ")}`);
|
|
237
|
+
logAvailabilityDecision({
|
|
238
|
+
tool: "vulture",
|
|
239
|
+
verdict: "available",
|
|
240
|
+
outcome: "success",
|
|
241
|
+
cause: "ok",
|
|
242
|
+
elapsedMs: Date.now() - startedAt,
|
|
243
|
+
latched: true,
|
|
244
|
+
hostStallMs,
|
|
245
|
+
budgetMs: 5e3,
|
|
246
|
+
classifiedBy: "probe"
|
|
247
|
+
});
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
const classified = classifyProbeFailure(probe, {
|
|
251
|
+
hostStallMs,
|
|
252
|
+
command: c.cmd
|
|
253
|
+
});
|
|
254
|
+
sweepEvidence = classified.evidence;
|
|
255
|
+
if (classified.outcome === "transient") {
|
|
256
|
+
sawTransient = true;
|
|
257
|
+
transientCause = classified.cause;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
if (sawTransient) {
|
|
261
|
+
const retryAfterMs = this.availabilityLatch.noteUnavailable("transient", transientCause);
|
|
262
|
+
this.log("vulture probe timed out; will retry (not treated as missing)");
|
|
263
|
+
logAvailabilityDecision({
|
|
264
|
+
tool: "vulture",
|
|
265
|
+
verdict: "unavailable",
|
|
266
|
+
outcome: "transient",
|
|
267
|
+
cause: transientCause,
|
|
268
|
+
elapsedMs: Date.now() - sweepStartedAt,
|
|
269
|
+
hostStallMs: sweepHostStallMs,
|
|
270
|
+
latched: false,
|
|
271
|
+
retryAfterMs,
|
|
272
|
+
budgetMs: 5e3,
|
|
273
|
+
classifiedBy: "probe",
|
|
274
|
+
...sweepEvidence !== void 0 && { evidence: sweepEvidence }
|
|
275
|
+
});
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
this.availabilityLatch.noteUnavailable("missing", "not-found");
|
|
279
|
+
this.log("vulture not installed; skipping (no auto-install)");
|
|
280
|
+
logAvailabilityDecision({
|
|
281
|
+
tool: "vulture",
|
|
282
|
+
verdict: "unavailable",
|
|
283
|
+
outcome: "missing",
|
|
284
|
+
cause: "not-found",
|
|
285
|
+
elapsedMs: Date.now() - sweepStartedAt,
|
|
286
|
+
hostStallMs: sweepHostStallMs,
|
|
287
|
+
latched: true,
|
|
288
|
+
budgetMs: 5e3,
|
|
289
|
+
// Every candidate probe was classified, and none was transient (#1500).
|
|
290
|
+
classifiedBy: "probe",
|
|
291
|
+
...sweepEvidence !== void 0 && { evidence: sweepEvidence }
|
|
292
|
+
});
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
async analyze(cwd) {
|
|
296
|
+
const root = this.resolveProjectRoot(cwd || process.cwd());
|
|
297
|
+
if (!root) {
|
|
298
|
+
return {
|
|
299
|
+
...emptyResult(this.language),
|
|
300
|
+
success: true,
|
|
301
|
+
summary: "No Python project root found; vulture skipped"
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
if (!await this.ensureAvailable(root)) {
|
|
305
|
+
return {
|
|
306
|
+
...emptyResult(this.language),
|
|
307
|
+
success: true,
|
|
308
|
+
summary: "vulture not installed; skipped. Install vulture (pip/uv/pipx) to enable Python dead-code detection."
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
const key = path.resolve(root);
|
|
312
|
+
const existing = this.inFlight.get(key);
|
|
313
|
+
if (existing)
|
|
314
|
+
return existing;
|
|
315
|
+
const promise = this.runAnalyze(key).then((result) => {
|
|
316
|
+
this.hardFailures.settle(key, result);
|
|
317
|
+
return result;
|
|
318
|
+
});
|
|
319
|
+
const wrapped = promise.finally(() => {
|
|
320
|
+
if (this.inFlight.get(key) === wrapped)
|
|
321
|
+
this.inFlight.delete(key);
|
|
322
|
+
});
|
|
323
|
+
this.inFlight.set(key, wrapped);
|
|
324
|
+
return wrapped;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* The project's own `[tool.vulture]` table, or `null` when
|
|
328
|
+
* `<root>/pyproject.toml` carries none. vulture's own config discovery reads
|
|
329
|
+
* that table, but CLI flags override it -- passing `--min-confidence` or
|
|
330
|
+
* `--exclude` unconditionally silently overrode a project's own thresholds
|
|
331
|
+
* and ignore list (#1731, discipline A). The table is read with the shared
|
|
332
|
+
* TOML table/array readers (`cargo-manifest.ts`) so the one list vulture's
|
|
333
|
+
* `--exclude` would replace can be merged instead (#4117).
|
|
334
|
+
*/
|
|
335
|
+
readProjectVultureConfig(root) {
|
|
336
|
+
let content;
|
|
337
|
+
try {
|
|
338
|
+
content = fs.readFileSync(path.join(root, "pyproject.toml"), "utf-8");
|
|
339
|
+
} catch {
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
if (!content.includes("[tool.vulture]"))
|
|
343
|
+
return null;
|
|
344
|
+
const table = extractTomlTableSection(content, "tool.vulture") ?? "";
|
|
345
|
+
const exclude = parseTomlStringArray(table, "exclude");
|
|
346
|
+
const keyed = /^[ \t]*exclude[ \t]*=/m.test(table);
|
|
347
|
+
const emptyList = /^[ \t]*exclude[ \t]*=[ \t]*\[\s*\]/m.test(table);
|
|
348
|
+
const unreadable = keyed && exclude.length === 0 && !emptyList || exclude.some((entry) => entry.includes(","));
|
|
349
|
+
return { exclude: unreadable ? null : exclude };
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* `--exclude` patterns for the linked worktrees under `root` (#4117), and how
|
|
353
|
+
* many of them could not be spelled. vulture matches each pattern against the
|
|
354
|
+
* module's RESOLVED path (`Path.resolve()` in `get_modules`), and a pattern
|
|
355
|
+
* without a glob character is wrapped as `*pattern*`, so a bare name would
|
|
356
|
+
* also drop `pkg/<name>-utils/`: the pattern is the absolute real path plus
|
|
357
|
+
* `/*`, with glob characters in the path made literal. A comma cannot be
|
|
358
|
+
* escaped (the list is comma-split), so that worktree is counted, not passed.
|
|
359
|
+
*/
|
|
360
|
+
worktreeExcludes(root) {
|
|
361
|
+
const nested = listNestedLinkedWorktreeRoots(root);
|
|
362
|
+
const patterns = [];
|
|
363
|
+
for (const worktree of nested) {
|
|
364
|
+
if (worktree.includes(",")) {
|
|
365
|
+
incrementDegradationCount({
|
|
366
|
+
kind: "scan-worktree-exclusion-skipped",
|
|
367
|
+
subject: "vulture",
|
|
368
|
+
reason: `comma-in-path: ${worktree} not excluded under ${root}`
|
|
369
|
+
});
|
|
370
|
+
continue;
|
|
371
|
+
}
|
|
372
|
+
patterns.push(`${escapeFnmatchLiteral(worktree)}/*`);
|
|
373
|
+
}
|
|
374
|
+
return { patterns };
|
|
375
|
+
}
|
|
376
|
+
async runAnalyze(root) {
|
|
377
|
+
const scannedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
378
|
+
const startMs = Date.now();
|
|
379
|
+
const invocation = this.resolved ?? { cmd: "vulture", prefix: [] };
|
|
380
|
+
const config = this.readProjectVultureConfig(root);
|
|
381
|
+
const worktrees = this.worktreeExcludes(root);
|
|
382
|
+
let exclude;
|
|
383
|
+
if (config === null) {
|
|
384
|
+
exclude = [...VULTURE_EXCLUDES, ...worktrees.patterns];
|
|
385
|
+
} else if (worktrees.patterns.length > 0) {
|
|
386
|
+
if (config.exclude === null) {
|
|
387
|
+
incrementDegradationCount({
|
|
388
|
+
kind: "scan-worktree-exclusion-skipped",
|
|
389
|
+
subject: "vulture",
|
|
390
|
+
reason: `config-exclude-unreadable: ${worktrees.patterns.length} linked worktree(s) under ${root} not excluded`
|
|
391
|
+
});
|
|
392
|
+
} else {
|
|
393
|
+
exclude = [...config.exclude, ...worktrees.patterns];
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
const excludedWorktrees = exclude === void 0 ? 0 : worktrees.patterns.length;
|
|
397
|
+
const args = [
|
|
398
|
+
...invocation.prefix,
|
|
399
|
+
".",
|
|
400
|
+
...config === null ? [`--min-confidence=${this.minConfidence}`] : [],
|
|
401
|
+
...exclude === void 0 ? [] : [`--exclude=${exclude.join(",")}`],
|
|
402
|
+
`--ignore-decorators=${VULTURE_IGNORE_DECORATORS.join(",")}`
|
|
403
|
+
];
|
|
404
|
+
const result = await safeSpawnAsync(invocation.cmd, args, {
|
|
405
|
+
timeout: ANALYSIS_TIMEOUT_MS,
|
|
406
|
+
cwd: root
|
|
407
|
+
});
|
|
408
|
+
const durationMs = Date.now() - startMs;
|
|
409
|
+
if (result.error) {
|
|
410
|
+
this.log(`scan error: ${result.error.message}`);
|
|
411
|
+
return {
|
|
412
|
+
...emptyResult(this.language),
|
|
413
|
+
summary: `Error: ${result.error.message}`,
|
|
414
|
+
durationMs
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
const output = result.stdout || "";
|
|
418
|
+
if (!output.trim()) {
|
|
419
|
+
const stderr = (result.stderr || "").trim();
|
|
420
|
+
if (spawnFailedWithNoOutput(result, output)) {
|
|
421
|
+
const reason = formatToolFailure({
|
|
422
|
+
tool: "vulture",
|
|
423
|
+
status: result.status,
|
|
424
|
+
signal: result.signal,
|
|
425
|
+
stderr: result.stderr
|
|
426
|
+
});
|
|
427
|
+
this.log(reason);
|
|
428
|
+
incrementDegradationCount({
|
|
429
|
+
kind: "runner-empty-result",
|
|
430
|
+
subject: "vulture",
|
|
431
|
+
reason
|
|
432
|
+
});
|
|
433
|
+
return {
|
|
434
|
+
...emptyResult(this.language),
|
|
435
|
+
summary: stderr ? `vulture error: ${firstOutputLine(stderr)}` : reason,
|
|
436
|
+
durationMs
|
|
437
|
+
};
|
|
438
|
+
}
|
|
439
|
+
return {
|
|
440
|
+
...emptyResult(this.language),
|
|
441
|
+
success: true,
|
|
442
|
+
analyzed: true,
|
|
443
|
+
summary: "No dead code found",
|
|
444
|
+
durationMs,
|
|
445
|
+
scannedAt,
|
|
446
|
+
excludedWorktrees
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
return {
|
|
450
|
+
...this.parseOutput(output, root),
|
|
451
|
+
durationMs,
|
|
452
|
+
scannedAt,
|
|
453
|
+
excludedWorktrees
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
parseOutput(output, root) {
|
|
457
|
+
const unusedExports = parseVultureOutput(output, root);
|
|
458
|
+
const total = unusedExports.length;
|
|
459
|
+
return {
|
|
460
|
+
...emptyResult(this.language),
|
|
461
|
+
success: true,
|
|
462
|
+
// #2154: parsed vulture output for this root.
|
|
463
|
+
analyzed: true,
|
|
464
|
+
unusedExports,
|
|
465
|
+
summary: total === 0 ? "No dead code found" : `Found ${total} unused Python symbol(s)`
|
|
466
|
+
};
|
|
467
|
+
}
|
|
468
|
+
};
|
|
469
|
+
function getDeadCodeClients(verbose = false) {
|
|
470
|
+
return [new PythonDeadCodeClient(verbose)];
|
|
471
|
+
}
|
|
472
|
+
function deadCodeIssueCount(result) {
|
|
473
|
+
return result.unusedExports.length + result.unusedFiles.length + result.unusedDeps.length + result.unlistedDeps.length;
|
|
474
|
+
}
|
|
475
|
+
function deadCodeIssues(result) {
|
|
476
|
+
return [
|
|
477
|
+
...result.unusedExports,
|
|
478
|
+
...result.unusedFiles,
|
|
479
|
+
...result.unusedDeps,
|
|
480
|
+
...result.unlistedDeps
|
|
481
|
+
];
|
|
482
|
+
}
|
|
483
|
+
function stableFindingKey(...parts) {
|
|
484
|
+
return parts.map((part) => part ?? "").join(":");
|
|
485
|
+
}
|
|
486
|
+
function deadCodeIssueKey(issue) {
|
|
487
|
+
return stableFindingKey(issue.category, issue.file, issue.name);
|
|
488
|
+
}
|
|
489
|
+
var DEAD_CODE_DELTA_MAX_SHOWN = 5;
|
|
490
|
+
function formatDeadCodeDelta(issues, language, max = DEAD_CODE_DELTA_MAX_SHOWN) {
|
|
491
|
+
if (issues.length === 0)
|
|
492
|
+
return "";
|
|
493
|
+
let report = `\u{1F480} Newly unused ${language} symbols in files you edited \u2014 check if callers need updating (dead-code):
|
|
494
|
+
`;
|
|
495
|
+
for (const issue of issues.slice(0, max)) {
|
|
496
|
+
const loc = issue.file ? `${issue.file}${issue.line ? `:${issue.line}` : ""}` : "(unknown)";
|
|
497
|
+
report += ` ${loc} \u2014 unused ${issue.kind} ${issue.name}
|
|
498
|
+
`;
|
|
499
|
+
}
|
|
500
|
+
if (issues.length > max) {
|
|
501
|
+
report += ` \u2026 and ${issues.length - max} more
|
|
502
|
+
`;
|
|
503
|
+
}
|
|
504
|
+
return report;
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
export {
|
|
508
|
+
parseVultureOutput,
|
|
509
|
+
PythonDeadCodeClient,
|
|
510
|
+
getDeadCodeClients,
|
|
511
|
+
deadCodeIssueCount,
|
|
512
|
+
deadCodeIssues,
|
|
513
|
+
stableFindingKey,
|
|
514
|
+
deadCodeIssueKey,
|
|
515
|
+
DEAD_CODE_DELTA_MAX_SHOWN,
|
|
516
|
+
formatDeadCodeDelta
|
|
517
|
+
};
|