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
|
@@ -1,296 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Biome check runner for dispatch system
|
|
3
|
-
*
|
|
4
|
-
* Dispatch mode is diagnostics-only.
|
|
5
|
-
* Autofix is handled earlier by the post-write pipeline to avoid
|
|
6
|
-
* mutating files mid-dispatch after LSP sync has already happened.
|
|
7
|
-
*/
|
|
8
|
-
import * as path from "node:path";
|
|
9
|
-
import { incrementDegradationCount } from "../../degradation-ledger.js";
|
|
10
|
-
import { pathsEqual } from "../../path-utils.js";
|
|
11
|
-
import { mapWithConcurrency } from "../../dependency-checker.js";
|
|
12
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
13
|
-
import { biomeConfigArgs, getAutofixCapability, getJstsLintPolicyForCwd, } from "../../tool-policy.js";
|
|
14
|
-
import { PRIORITY } from "../priorities.js";
|
|
15
|
-
import { resolveRunnerCwd, resolveToolCommandWithInstallFallback, } from "./utils/runner-helpers.js";
|
|
16
|
-
import { finishParsedRun } from "./utils/tool-failure.js";
|
|
17
|
-
/**
|
|
18
|
-
* Map biome's own severity vocabulary onto the four-tier `Diagnostic.severity`
|
|
19
|
-
* (clients/dispatch/types.ts), the same way `normalizeRuleSeverity` does for
|
|
20
|
-
* ast-grep-napi post-#1787. Biome's real `lint --reporter=json` output
|
|
21
|
-
* (re-probed live for #1810's review round) spells its info tier `"info"`,
|
|
22
|
-
* not `"information"` — the value this switch matched before, which meant a
|
|
23
|
-
* real info-tier diagnostic fell through the `default` and was silently
|
|
24
|
-
* promoted to `"warning"`, one tier too loud. Every other tier is a direct
|
|
25
|
-
* pass-through; an unrecognized value still falls back to `"warning"` — the
|
|
26
|
-
* tier every biome diagnostic reported at before this fix, so reviving
|
|
27
|
-
* hint/info never silently demotes an existing finding.
|
|
28
|
-
*/
|
|
29
|
-
export function normalizeBiomeSeverity(raw) {
|
|
30
|
-
switch (raw) {
|
|
31
|
-
case "error":
|
|
32
|
-
return "error";
|
|
33
|
-
case "info":
|
|
34
|
-
return "info";
|
|
35
|
-
case "hint":
|
|
36
|
-
return "hint";
|
|
37
|
-
case "warning":
|
|
38
|
-
return "warning";
|
|
39
|
-
default:
|
|
40
|
-
return "warning";
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* A diagnostic's `category` is `"lint/<group>/<ruleName>"` — extracts the
|
|
45
|
-
* bare rule name `biome explain` expects. Returns `undefined` for anything
|
|
46
|
-
* that isn't a `lint/` category (e.g. a parse-error pseudo-category), so
|
|
47
|
-
* callers never look up fixability for a rule that was never a real rule.
|
|
48
|
-
*/
|
|
49
|
-
export function biomeRuleNameFromCategory(category) {
|
|
50
|
-
if (!category?.startsWith("lint/"))
|
|
51
|
-
return undefined;
|
|
52
|
-
const parts = category.split("/");
|
|
53
|
-
return parts[parts.length - 1] || undefined;
|
|
54
|
-
}
|
|
55
|
-
export function parseBiomeJson(raw, filePath, cwd, fixKindByRule) {
|
|
56
|
-
try {
|
|
57
|
-
const result = JSON.parse(raw);
|
|
58
|
-
const diagnostics = result.diagnostics || [];
|
|
59
|
-
const autofix = getAutofixCapability("biome");
|
|
60
|
-
const absTarget = path.resolve(cwd, filePath);
|
|
61
|
-
return {
|
|
62
|
-
diagnostics: diagnostics.flatMap((d) => {
|
|
63
|
-
// #3295: `location.path` is biome's own name for the file each
|
|
64
|
-
// diagnostic is about; `biome.json` `files.includes` can widen the
|
|
65
|
-
// run past the argv.
|
|
66
|
-
if (d.location?.path &&
|
|
67
|
-
!pathsEqual(path.resolve(cwd, d.location.path), absTarget))
|
|
68
|
-
return [];
|
|
69
|
-
{
|
|
70
|
-
const ruleName = biomeRuleNameFromCategory(d.category);
|
|
71
|
-
const fixKind = ruleName ? fixKindByRule?.get(ruleName) : undefined;
|
|
72
|
-
const isFixable = fixKind === "safe" || fixKind === "unsafe";
|
|
73
|
-
return [
|
|
74
|
-
{
|
|
75
|
-
id: `biome:${d.category}:${d.location.start.line}`,
|
|
76
|
-
message: d.message,
|
|
77
|
-
filePath,
|
|
78
|
-
line: d.location.start.line,
|
|
79
|
-
column: d.location.start.column,
|
|
80
|
-
severity: normalizeBiomeSeverity(d.severity),
|
|
81
|
-
semantic: d.severity === "error" ? "blocking" : "warning",
|
|
82
|
-
tool: "biome",
|
|
83
|
-
rule: d.category,
|
|
84
|
-
fixable: isFixable,
|
|
85
|
-
// Mirrors `biomeClient.fixFileAsync`'s own `lint --write` call
|
|
86
|
-
// (no `--unsafe`, clients/biome-client.ts): the pipeline only
|
|
87
|
-
// ever applies SAFE fixes, so only "safe" earns autoFixAvailable.
|
|
88
|
-
autoFixAvailable: fixKind === "safe" && (autofix?.safePipelineAutofix ?? false),
|
|
89
|
-
fixKind: isFixable && autofix?.fixKind !== "none"
|
|
90
|
-
? autofix?.fixKind
|
|
91
|
-
: undefined,
|
|
92
|
-
},
|
|
93
|
-
];
|
|
94
|
-
}
|
|
95
|
-
}),
|
|
96
|
-
};
|
|
97
|
-
}
|
|
98
|
-
catch (err) {
|
|
99
|
-
return {
|
|
100
|
-
diagnostics: [],
|
|
101
|
-
parseError: err instanceof Error ? err.message : String(err),
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
// Process-lifetime cache: a rule's fix kind is a static property of the
|
|
106
|
-
// (biome binary, rule name) pair, not of any one diagnostic occurrence, so
|
|
107
|
-
// it's resolved once and reused. Keyed on the resolved `cmd` so a different
|
|
108
|
-
// biome binary (e.g. a different project's pinned version) never reuses
|
|
109
|
-
// another binary's answer. Registered in
|
|
110
|
-
// tests/support/session-state-registry.ts as `process_lifetime` — the
|
|
111
|
-
// answer cannot change without a different biome binary, which is a
|
|
112
|
-
// different cache key, so there is nothing for a session boundary to
|
|
113
|
-
// invalidate.
|
|
114
|
-
const biomeFixKindCache = new Map();
|
|
115
|
-
/** Test-only: drop every cached verdict so a test starts from a clean cache. */
|
|
116
|
-
export function _resetBiomeFixKindCacheForTests() {
|
|
117
|
-
biomeFixKindCache.clear();
|
|
118
|
-
}
|
|
119
|
-
const BIOME_FIX_KIND_PATTERN = /^-\s*Fix:\s*(safe|unsafe)\s*$/m;
|
|
120
|
-
// The explicit "no fix" statement `biome explain` prints for a rule with no
|
|
121
|
-
// autofix at all (e.g. `noConstantCondition`). Matching this SEPARATELY from
|
|
122
|
-
// "the safe/unsafe pattern didn't match" is the point (#1810 review F1/F2):
|
|
123
|
-
// only a POSITIVE read — either a stated fix tier or this explicit negative
|
|
124
|
-
// — is trustworthy enough to cache. Anything else (a differently-shaped
|
|
125
|
-
// `explain` output, e.g. a biome 1.x install) is a parse failure, not a
|
|
126
|
-
// verdict, and must never be cached as one.
|
|
127
|
-
const BIOME_NO_FIX_PATTERN = /^-\s*No fix available\.\s*$/m;
|
|
128
|
-
/** At most this many `biome explain` spawns run concurrently (#1810 review F6). */
|
|
129
|
-
const EXPLAIN_CONCURRENCY = 4;
|
|
130
|
-
/**
|
|
131
|
-
* Resolves each rule referenced by `categories` to its fix kind via
|
|
132
|
-
* `biome explain <rule>` — the one place biome's shipped CLI states
|
|
133
|
-
* fixability as structured text (`- Fix: safe|unsafe`, or `- No fix
|
|
134
|
-
* available.` when absent), sourced live from the running binary's own rule
|
|
135
|
-
* registry rather than a hand-maintained table (#1810; real diagnostics
|
|
136
|
-
* carry no per-occurrence fixability field — see `BiomeDiagnostic`).
|
|
137
|
-
*
|
|
138
|
-
* Only a POSITIVE read is cached: either `- Fix: safe|unsafe` or the
|
|
139
|
-
* explicit `- No fix available.` statement. A spawn failure, a nonzero
|
|
140
|
-
* exit, or output that matches NEITHER pattern (e.g. a biome 1.x install —
|
|
141
|
-
* its `explain` text differs and would otherwise poison every rule as
|
|
142
|
-
* permanently unfixable, #1810 review F1) resolves to `"none"` for THIS
|
|
143
|
-
* call only and is never written to the cache — caching an unparsed result
|
|
144
|
-
* would permanently under-report a genuinely fixable rule for the rest of
|
|
145
|
-
* the process's life (the never-cache-a-transient-failure screen).
|
|
146
|
-
*/
|
|
147
|
-
export async function resolveBiomeFixKinds(cmd, cwd, categories) {
|
|
148
|
-
const resolved = new Map();
|
|
149
|
-
const ruleNames = new Set();
|
|
150
|
-
for (const category of categories) {
|
|
151
|
-
const ruleName = biomeRuleNameFromCategory(category);
|
|
152
|
-
if (ruleName)
|
|
153
|
-
ruleNames.add(ruleName);
|
|
154
|
-
}
|
|
155
|
-
const toResolve = [];
|
|
156
|
-
for (const ruleName of ruleNames) {
|
|
157
|
-
const cacheKey = `${cmd}::${ruleName}`;
|
|
158
|
-
const cached = biomeFixKindCache.get(cacheKey);
|
|
159
|
-
if (cached === undefined) {
|
|
160
|
-
toResolve.push(ruleName);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
resolved.set(ruleName, cached);
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
await mapWithConcurrency(toResolve, EXPLAIN_CONCURRENCY, async (ruleName) => {
|
|
167
|
-
const cacheKey = `${cmd}::${ruleName}`;
|
|
168
|
-
const spawned = await safeSpawnAsync(cmd, ["explain", ruleName], {
|
|
169
|
-
timeout: 10000,
|
|
170
|
-
cwd,
|
|
171
|
-
});
|
|
172
|
-
if (spawned.error || spawned.status !== 0) {
|
|
173
|
-
incrementDegradationCount({
|
|
174
|
-
kind: "biome-explain-unavailable",
|
|
175
|
-
subject: ruleName,
|
|
176
|
-
reason: spawned.error
|
|
177
|
-
? `spawn failed: ${spawned.error}`
|
|
178
|
-
: `explain exited ${spawned.status}`,
|
|
179
|
-
});
|
|
180
|
-
resolved.set(ruleName, "none");
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
const stdout = spawned.stdout || "";
|
|
184
|
-
const fixMatch = stdout.match(BIOME_FIX_KIND_PATTERN);
|
|
185
|
-
if (fixMatch) {
|
|
186
|
-
const kind = fixMatch[1] === "safe" ? "safe" : "unsafe";
|
|
187
|
-
biomeFixKindCache.set(cacheKey, kind);
|
|
188
|
-
resolved.set(ruleName, kind);
|
|
189
|
-
return;
|
|
190
|
-
}
|
|
191
|
-
if (BIOME_NO_FIX_PATTERN.test(stdout)) {
|
|
192
|
-
biomeFixKindCache.set(cacheKey, "none");
|
|
193
|
-
resolved.set(ruleName, "none");
|
|
194
|
-
return;
|
|
195
|
-
}
|
|
196
|
-
// Neither pattern matched — an unrecognized `explain` output shape, not
|
|
197
|
-
// a confirmed negative. Resolve to "none" for this call, but leave the
|
|
198
|
-
// cache untouched so the next batch retries against real output.
|
|
199
|
-
incrementDegradationCount({
|
|
200
|
-
kind: "biome-explain-unavailable",
|
|
201
|
-
subject: ruleName,
|
|
202
|
-
reason: "explain output matched neither the Fix nor No-fix pattern",
|
|
203
|
-
});
|
|
204
|
-
resolved.set(ruleName, "none");
|
|
205
|
-
});
|
|
206
|
-
return resolved;
|
|
207
|
-
}
|
|
208
|
-
const biomeCheckJsonRunner = {
|
|
209
|
-
id: "biome-check-json",
|
|
210
|
-
appliesTo: ["jsts"],
|
|
211
|
-
priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
|
|
212
|
-
async run(ctx) {
|
|
213
|
-
const cwd = resolveRunnerCwd(ctx, "biome");
|
|
214
|
-
const policy = getJstsLintPolicyForCwd(cwd);
|
|
215
|
-
// Defer to ESLint/oxlint if the project has explicitly configured one —
|
|
216
|
-
// biome runs as the default linter only when no alternative is present.
|
|
217
|
-
if (!policy.hasBiomeConfig && policy.hasExplicitNonBiomeLinter) {
|
|
218
|
-
return {
|
|
219
|
-
status: "skipped",
|
|
220
|
-
diagnostics: [],
|
|
221
|
-
semantic: "none",
|
|
222
|
-
skipReason: "configured-non-biome-linter",
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
const cmd = await resolveToolCommandWithInstallFallback(cwd, "biome");
|
|
226
|
-
if (!cmd) {
|
|
227
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
228
|
-
}
|
|
229
|
-
// Shared config-args seam (#1247): `biomeClient.fixFileAsync` consumes
|
|
230
|
-
// the same builder, so the user's config / package fallback applies on
|
|
231
|
-
// `lint --write` too.
|
|
232
|
-
const configArg = biomeConfigArgs(cwd);
|
|
233
|
-
// Run biome lint (diagnostics only - format is handled separately)
|
|
234
|
-
const checkResult = await safeSpawnAsync(cmd, [
|
|
235
|
-
"lint",
|
|
236
|
-
"--reporter=json",
|
|
237
|
-
"--no-errors-on-unmatched",
|
|
238
|
-
...configArg,
|
|
239
|
-
ctx.filePath,
|
|
240
|
-
], { timeout: 30000, cwd });
|
|
241
|
-
// Handle spawn errors (e.g., binary not found)
|
|
242
|
-
if (checkResult.error) {
|
|
243
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
244
|
-
}
|
|
245
|
-
let fixKindByRule;
|
|
246
|
-
if (checkResult.status === 0 || checkResult.status === 1) {
|
|
247
|
-
// Cheap pre-parse just to collect rule categories — the real parse
|
|
248
|
-
// (with parseError handling) happens below via parseBiomeJson. A
|
|
249
|
-
// malformed-JSON pre-parse simply yields no categories, and
|
|
250
|
-
// `resolveBiomeFixKinds` no-ops on an empty list (no spawn, an
|
|
251
|
-
// immediately-resolved empty map) — the real parse still surfaces
|
|
252
|
-
// the parseError diagnostic as before.
|
|
253
|
-
let categories = [];
|
|
254
|
-
try {
|
|
255
|
-
const preParsed = JSON.parse(checkResult.stdout || "{}");
|
|
256
|
-
categories = (preParsed.diagnostics || []).map((d) => d.category);
|
|
257
|
-
}
|
|
258
|
-
catch {
|
|
259
|
-
categories = [];
|
|
260
|
-
}
|
|
261
|
-
fixKindByRule = await resolveBiomeFixKinds(cmd, cwd, categories);
|
|
262
|
-
}
|
|
263
|
-
const parsed = checkResult.status === 0 || checkResult.status === 1
|
|
264
|
-
? parseBiomeJson(checkResult.stdout || "", ctx.filePath, cwd, fixKindByRule)
|
|
265
|
-
: { diagnostics: [] };
|
|
266
|
-
if (parsed.parseError) {
|
|
267
|
-
const raw = checkResult.stdout || checkResult.stderr || "";
|
|
268
|
-
const preview = raw.replace(/\s+/g, " ").slice(0, 160);
|
|
269
|
-
return {
|
|
270
|
-
status: "failed",
|
|
271
|
-
diagnostics: [
|
|
272
|
-
{
|
|
273
|
-
id: "biome:parse-error:1",
|
|
274
|
-
message: "Biome JSON parse failed: " +
|
|
275
|
-
parsed.parseError +
|
|
276
|
-
(preview ? " (output preview: " + preview + ")" : ""),
|
|
277
|
-
filePath: ctx.filePath,
|
|
278
|
-
line: 1,
|
|
279
|
-
column: 1,
|
|
280
|
-
severity: "warning",
|
|
281
|
-
semantic: "warning",
|
|
282
|
-
tool: "biome",
|
|
283
|
-
},
|
|
284
|
-
],
|
|
285
|
-
semantic: "warning",
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
return finishParsedRun({
|
|
289
|
-
tool: "biome",
|
|
290
|
-
ctx,
|
|
291
|
-
result: checkResult,
|
|
292
|
-
diagnostics: parsed.diagnostics,
|
|
293
|
-
});
|
|
294
|
-
},
|
|
295
|
-
};
|
|
296
|
-
export default biomeCheckJsonRunner;
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
import * as fs from "node:fs";
|
|
2
|
-
import * as path from "node:path";
|
|
3
|
-
import { pathsEqual } from "../../path-utils.js";
|
|
4
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
5
|
-
import { probeToolAsync } from "../../tool-probe.js";
|
|
6
|
-
import { resolveRunnerCwd } from "../../tool-cwd.js";
|
|
7
|
-
import { PRIORITY } from "../priorities.js";
|
|
8
|
-
import { createAvailabilityChecker } from "./utils/runner-helpers.js";
|
|
9
|
-
import { finishParsedRun, parseToolRun } from "./utils/tool-failure.js";
|
|
10
|
-
// Per-compiler availability checkers — each one caches per-cwd and
|
|
11
|
-
// dedupes concurrent --version probes, the same protections every other
|
|
12
|
-
// runner gets via createAvailabilityChecker. cpp-check previously
|
|
13
|
-
// re-spawned its full candidate sweep on every edit.
|
|
14
|
-
const compilerCheckers = {
|
|
15
|
-
clang: createAvailabilityChecker("clang", ".exe"),
|
|
16
|
-
gcc: createAvailabilityChecker("gcc", ".exe"),
|
|
17
|
-
cc: createAvailabilityChecker("cc", ".exe"),
|
|
18
|
-
"clang++": createAvailabilityChecker("clang++", ".exe"),
|
|
19
|
-
"g++": createAvailabilityChecker("g++", ".exe"),
|
|
20
|
-
"c++": createAvailabilityChecker("c++", ".exe"),
|
|
21
|
-
cl: createAvailabilityChecker("cl", ".exe"),
|
|
22
|
-
};
|
|
23
|
-
const C_SOURCE_EXTENSIONS = new Set([".c"]);
|
|
24
|
-
const C_HEADER_EXTENSIONS = new Set([".h"]);
|
|
25
|
-
const CPP_SOURCE_EXTENSIONS = new Set([
|
|
26
|
-
".c++",
|
|
27
|
-
".cc",
|
|
28
|
-
".cp",
|
|
29
|
-
".cpp",
|
|
30
|
-
".cxx",
|
|
31
|
-
".c++m",
|
|
32
|
-
".cppm",
|
|
33
|
-
".cxxm",
|
|
34
|
-
".ixx",
|
|
35
|
-
".cu",
|
|
36
|
-
".hip",
|
|
37
|
-
".mm",
|
|
38
|
-
".clcpp",
|
|
39
|
-
]);
|
|
40
|
-
const CPP_HEADER_EXTENSIONS = new Set([
|
|
41
|
-
".hh",
|
|
42
|
-
".hpp",
|
|
43
|
-
".hxx",
|
|
44
|
-
".inl",
|
|
45
|
-
".ipp",
|
|
46
|
-
".tpp",
|
|
47
|
-
".txx",
|
|
48
|
-
]);
|
|
49
|
-
function headerLooksLikeCpp(absPath) {
|
|
50
|
-
try {
|
|
51
|
-
const content = fs.readFileSync(absPath, "utf-8");
|
|
52
|
-
return /\b(namespace|template|class|constexpr|concept|using)\b|std::|\b(public|private|protected)\s*:/.test(content);
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
return false;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
function getGccLikeCandidates(absPath) {
|
|
59
|
-
const ext = path.extname(absPath).toLowerCase();
|
|
60
|
-
const cMode = C_SOURCE_EXTENSIONS.has(ext) ||
|
|
61
|
-
(C_HEADER_EXTENSIONS.has(ext) && !headerLooksLikeCpp(absPath));
|
|
62
|
-
const cppMode = CPP_SOURCE_EXTENSIONS.has(ext) || CPP_HEADER_EXTENSIONS.has(ext);
|
|
63
|
-
if (cMode) {
|
|
64
|
-
const cArgs = C_HEADER_EXTENSIONS.has(ext)
|
|
65
|
-
? ["-x", "c-header", "-fsyntax-only", absPath]
|
|
66
|
-
: ["-x", "c", "-fsyntax-only", absPath];
|
|
67
|
-
return [
|
|
68
|
-
{ key: "clang", args: cArgs },
|
|
69
|
-
{ key: "gcc", args: cArgs },
|
|
70
|
-
{ key: "cc", args: cArgs },
|
|
71
|
-
];
|
|
72
|
-
}
|
|
73
|
-
if (cppMode || ext) {
|
|
74
|
-
return [
|
|
75
|
-
{ key: "clang++", args: ["-fsyntax-only", absPath] },
|
|
76
|
-
{ key: "g++", args: ["-fsyntax-only", absPath] },
|
|
77
|
-
{ key: "c++", args: ["-fsyntax-only", absPath] },
|
|
78
|
-
];
|
|
79
|
-
}
|
|
80
|
-
return [];
|
|
81
|
-
}
|
|
82
|
-
async function resolveCompiler(absPath, cwd) {
|
|
83
|
-
for (const candidate of getGccLikeCandidates(absPath)) {
|
|
84
|
-
const checker = compilerCheckers[candidate.key];
|
|
85
|
-
if (await checker.isAvailableAsync(cwd)) {
|
|
86
|
-
const command = checker.getCommand(cwd) ?? candidate.key;
|
|
87
|
-
return { command, args: candidate.args, flavor: "gcc" };
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// MSVC `cl.exe` doesn't accept `--version`; the createAvailabilityChecker
|
|
91
|
-
// probe used by every other compiler returns false even when cl is on
|
|
92
|
-
// PATH. Keep the ad-hoc no-arg probe but cache the resolution via the
|
|
93
|
-
// shared checker so subsequent edits don't re-spawn.
|
|
94
|
-
const clChecker = compilerCheckers.cl;
|
|
95
|
-
const clCmd = clChecker.getCommand(cwd);
|
|
96
|
-
if (clCmd) {
|
|
97
|
-
// Already probed in a previous turn and resolved.
|
|
98
|
-
return {
|
|
99
|
-
command: clCmd,
|
|
100
|
-
args: ["/nologo", "/Zs", absPath],
|
|
101
|
-
flavor: "msvc",
|
|
102
|
-
};
|
|
103
|
-
}
|
|
104
|
-
// Mirrors the deliberate global-PATH probes in utils/runner-helpers.ts:
|
|
105
|
-
// this never resolves a config file or a target path, so there is no cwd
|
|
106
|
-
// for it to get wrong.
|
|
107
|
-
const clProbe = await probeToolAsync("cl", [], { timeout: 5000 });
|
|
108
|
-
if (!clProbe.error && clProbe.status !== null) {
|
|
109
|
-
return {
|
|
110
|
-
command: "cl",
|
|
111
|
-
args: ["/nologo", "/Zs", absPath],
|
|
112
|
-
flavor: "msvc",
|
|
113
|
-
};
|
|
114
|
-
}
|
|
115
|
-
return undefined;
|
|
116
|
-
}
|
|
117
|
-
function parseGccLikeOutput(raw, filePath, cwd) {
|
|
118
|
-
const diagnostics = [];
|
|
119
|
-
const absTarget = path.resolve(cwd, filePath);
|
|
120
|
-
for (const line of raw.split(/\r?\n/)) {
|
|
121
|
-
const match = line.match(/^(.*?):(\d+):(?:(\d+):)?\s*(fatal error|error|warning|note):\s+(.+)$/i);
|
|
122
|
-
if (!match)
|
|
123
|
-
continue;
|
|
124
|
-
const [, sourcePath, lineStr, colStr, severityLabel, message] = match;
|
|
125
|
-
// #3278: one seam for reported-path attribution — see javac.ts.
|
|
126
|
-
if (!pathsEqual(path.resolve(cwd, sourcePath.trim()), absTarget))
|
|
127
|
-
continue;
|
|
128
|
-
const severity = severityLabel.toLowerCase().includes("error")
|
|
129
|
-
? "error"
|
|
130
|
-
: "warning";
|
|
131
|
-
diagnostics.push({
|
|
132
|
-
id: `cpp-check-${severityLabel}-${lineStr}-${colStr || "1"}`,
|
|
133
|
-
message: message.trim(),
|
|
134
|
-
filePath,
|
|
135
|
-
line: Number.parseInt(lineStr, 10) || 1,
|
|
136
|
-
column: Number.parseInt(colStr || "1", 10) || 1,
|
|
137
|
-
severity,
|
|
138
|
-
// This single-file syntax check has no compile database, include path,
|
|
139
|
-
// or build flags. It can inform, but cannot prove a project blocker.
|
|
140
|
-
semantic: "warning",
|
|
141
|
-
tool: "cpp-check",
|
|
142
|
-
rule: severityLabel.toLowerCase(),
|
|
143
|
-
fixable: false,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
return diagnostics;
|
|
147
|
-
}
|
|
148
|
-
function parseMsvcOutput(raw, filePath, cwd) {
|
|
149
|
-
const diagnostics = [];
|
|
150
|
-
const absTarget = path.resolve(cwd, filePath);
|
|
151
|
-
for (const line of raw.split(/\r?\n/)) {
|
|
152
|
-
const match = line.match(/^(.*)\((\d+)(?:,(\d+))?\):\s*(fatal error|error|warning)\s+([A-Z]+\d+):\s+(.+)$/i);
|
|
153
|
-
if (!match)
|
|
154
|
-
continue;
|
|
155
|
-
const [, sourcePath, lineStr, colStr, severityLabel, rule, message] = match;
|
|
156
|
-
// #3278: one seam for reported-path attribution — see javac.ts.
|
|
157
|
-
if (!pathsEqual(path.resolve(cwd, sourcePath.trim()), absTarget))
|
|
158
|
-
continue;
|
|
159
|
-
const severity = severityLabel.toLowerCase().includes("error")
|
|
160
|
-
? "error"
|
|
161
|
-
: "warning";
|
|
162
|
-
diagnostics.push({
|
|
163
|
-
id: `cpp-check-${rule}-${lineStr}-${colStr || "1"}`,
|
|
164
|
-
message: `[${rule}] ${message.trim()}`,
|
|
165
|
-
filePath,
|
|
166
|
-
line: Number.parseInt(lineStr, 10) || 1,
|
|
167
|
-
column: Number.parseInt(colStr || "1", 10) || 1,
|
|
168
|
-
severity,
|
|
169
|
-
// MSVC is invoked with the same context-free single-file contract.
|
|
170
|
-
semantic: "warning",
|
|
171
|
-
tool: "cpp-check",
|
|
172
|
-
rule,
|
|
173
|
-
fixable: false,
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
return diagnostics;
|
|
177
|
-
}
|
|
178
|
-
const cppCheckRunner = {
|
|
179
|
-
id: "cpp-check",
|
|
180
|
-
appliesTo: ["cxx"],
|
|
181
|
-
priority: PRIORITY.GENERAL_ANALYSIS,
|
|
182
|
-
skipTestFiles: false,
|
|
183
|
-
async run(ctx) {
|
|
184
|
-
const cwd = resolveRunnerCwd(ctx, "cpp-check");
|
|
185
|
-
const absPath = path.resolve(cwd, ctx.filePath);
|
|
186
|
-
const compiler = await resolveCompiler(absPath, cwd);
|
|
187
|
-
if (!compiler) {
|
|
188
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
189
|
-
}
|
|
190
|
-
const result = await safeSpawnAsync(compiler.command, compiler.args, {
|
|
191
|
-
cwd,
|
|
192
|
-
timeout: 30000,
|
|
193
|
-
});
|
|
194
|
-
const raw = `${result.stdout ?? ""}\n${result.stderr ?? ""}`.trim();
|
|
195
|
-
const parsed = parseToolRun("cpp-check", {
|
|
196
|
-
result,
|
|
197
|
-
output: raw,
|
|
198
|
-
// EXIT TABLE (gcc/clang 13 measured fixture): 0 clean; 1 findings; 2 error; other nonzero rejected.
|
|
199
|
-
exitCodes: { ran: [1, 2] },
|
|
200
|
-
}, (output) => compiler.flavor === "msvc"
|
|
201
|
-
? parseMsvcOutput(output, ctx.filePath, cwd)
|
|
202
|
-
: parseGccLikeOutput(output, ctx.filePath, cwd));
|
|
203
|
-
if (parsed.skipped)
|
|
204
|
-
return parsed.skipped;
|
|
205
|
-
return finishParsedRun({
|
|
206
|
-
tool: "cpp-check",
|
|
207
|
-
ctx,
|
|
208
|
-
result,
|
|
209
|
-
diagnostics: parsed.diagnostics,
|
|
210
|
-
classify: (diagnostics) => ({
|
|
211
|
-
status: diagnostics.some((d) => d.severity === "error")
|
|
212
|
-
? "failed"
|
|
213
|
-
: "succeeded",
|
|
214
|
-
semantic: "warning",
|
|
215
|
-
}),
|
|
216
|
-
});
|
|
217
|
-
},
|
|
218
|
-
};
|
|
219
|
-
export default cppCheckRunner;
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import * as path from "node:path";
|
|
2
|
-
import * as fs from "node:fs";
|
|
3
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
4
|
-
import { resolveRunnerCwd } from "../../tool-cwd.js";
|
|
5
|
-
import { PRIORITY } from "../priorities.js";
|
|
6
|
-
import { finishParsedRun, parseToolRun } from "./utils/tool-failure.js";
|
|
7
|
-
import { createCwdCachedProbe } from "./utils/runner-helpers.js";
|
|
8
|
-
const CREDO_PROBE_BUDGET_MS = 10_000;
|
|
9
|
-
// Per-cwd cached `mix credo --version` probe (#120), governed by the shared
|
|
10
|
-
// availability policy (#1494). The probe returns the spawn result so the policy
|
|
11
|
-
// can tell a cold-BEAM timeout from a genuinely absent credo: the 10 s budget
|
|
12
|
-
// here is the widest in the repo and the most likely to expire on a slow first
|
|
13
|
-
// compile, and latching that as "not installed" used to disable credo for the
|
|
14
|
-
// rest of the session.
|
|
15
|
-
const probeCredo = createCwdCachedProbe((cwd) => safeSpawnAsync("mix", ["credo", "--version"], {
|
|
16
|
-
timeout: CREDO_PROBE_BUDGET_MS,
|
|
17
|
-
cwd,
|
|
18
|
-
}), { tool: "credo", budgetMs: CREDO_PROBE_BUDGET_MS });
|
|
19
|
-
// `mix credo <file>` is single-file-scoped today, so blanket attribution would
|
|
20
|
-
// be correct — but map issue.filename (resolved against cwd) for robustness so
|
|
21
|
-
// this stays correct if the invocation ever widens to a directory (#265 A4).
|
|
22
|
-
export function parseCredoJson(raw, fallbackPath, cwd) {
|
|
23
|
-
try {
|
|
24
|
-
const output = JSON.parse(raw);
|
|
25
|
-
return (output.issues ?? []).map((issue) => ({
|
|
26
|
-
id: `credo:${issue.check}:${issue.line_no}`,
|
|
27
|
-
message: `[${issue.check}] ${issue.message}`,
|
|
28
|
-
filePath: issue.filename && issue.filename.trim()
|
|
29
|
-
? path.isAbsolute(issue.filename)
|
|
30
|
-
? issue.filename
|
|
31
|
-
: path.resolve(cwd, issue.filename)
|
|
32
|
-
: fallbackPath,
|
|
33
|
-
line: issue.line_no,
|
|
34
|
-
column: issue.column ?? 1,
|
|
35
|
-
severity: issue.priority <= 10 ? "error" : "warning",
|
|
36
|
-
semantic: issue.priority <= 10 ? "blocking" : "warning",
|
|
37
|
-
tool: "credo",
|
|
38
|
-
rule: issue.check,
|
|
39
|
-
fixable: false,
|
|
40
|
-
}));
|
|
41
|
-
}
|
|
42
|
-
catch {
|
|
43
|
-
return [];
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
function hasMixExs(cwd) {
|
|
47
|
-
return fs.existsSync(path.join(cwd, "mix.exs"));
|
|
48
|
-
}
|
|
49
|
-
const credoRunner = {
|
|
50
|
-
id: "credo",
|
|
51
|
-
appliesTo: ["elixir"],
|
|
52
|
-
priority: PRIORITY.GENERAL_ANALYSIS,
|
|
53
|
-
skipTestFiles: false,
|
|
54
|
-
async run(ctx) {
|
|
55
|
-
const cwd = resolveRunnerCwd(ctx, "credo");
|
|
56
|
-
if (!hasMixExs(cwd)) {
|
|
57
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
58
|
-
}
|
|
59
|
-
// Credo ships as a mix dependency — cached per-cwd probe (see probeCredo).
|
|
60
|
-
if (!(await probeCredo(cwd))) {
|
|
61
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
62
|
-
}
|
|
63
|
-
const absPath = path.resolve(cwd, ctx.filePath);
|
|
64
|
-
const result = await safeSpawnAsync("mix", ["credo", "--format", "json", "--strict", absPath], { timeout: 30000, cwd });
|
|
65
|
-
const output = `${result.stdout ?? ""}${result.stderr ?? ""}`;
|
|
66
|
-
const parsed = parseToolRun("credo", {
|
|
67
|
-
result,
|
|
68
|
-
output,
|
|
69
|
-
// EXIT TABLE (Credo 1.7 measured fixture): 0 clean; 1 findings; 2 error; other nonzero rejected.
|
|
70
|
-
exitCodes: { ran: [1, 2] },
|
|
71
|
-
}, (raw) => parseCredoJson(raw, ctx.filePath, cwd));
|
|
72
|
-
if (parsed.skipped)
|
|
73
|
-
return parsed.skipped;
|
|
74
|
-
return finishParsedRun({
|
|
75
|
-
tool: "credo",
|
|
76
|
-
ctx,
|
|
77
|
-
result,
|
|
78
|
-
diagnostics: parsed.diagnostics,
|
|
79
|
-
});
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
export default credoRunner;
|