pi-lens 4.2.1 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1562 -0
- package/README.md +157 -24
- package/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/dist/chunk-22AVIGXS.js +560 -0
- package/dist/chunk-27BBHSZC.js +106 -0
- package/dist/chunk-2BEMIWEW.js +51 -0
- package/dist/chunk-2EECBNC5.js +89 -0
- package/dist/chunk-34U7PLGE.js +23 -0
- package/dist/chunk-3I5QFT3N.js +181 -0
- package/dist/chunk-3MED75HT.js +37 -0
- package/dist/chunk-47D2BO4S.js +87 -0
- package/dist/chunk-4RERDEXR.js +348 -0
- package/dist/chunk-4W2PLC4J.js +27 -0
- package/dist/chunk-52H5B5TC.js +202 -0
- package/dist/chunk-54B42YRX.js +27 -0
- package/dist/chunk-5RXBNSW2.js +266 -0
- package/dist/chunk-5THXD6X5.js +201 -0
- package/dist/chunk-5W3R6LFT.js +24 -0
- package/dist/chunk-5ZEJHV35.js +341 -0
- package/dist/chunk-6P62QVEA.js +118 -0
- package/dist/chunk-6QIUX4EP.js +459 -0
- package/dist/chunk-6VCD4VKZ.js +78 -0
- package/dist/chunk-7F72PXY2.js +326 -0
- package/dist/chunk-7FBF7NPR.js +998 -0
- package/dist/chunk-7U2IDNXN.js +37 -0
- package/dist/chunk-ABBOA7UD.js +157 -0
- package/dist/chunk-AHDW3GPE.js +50 -0
- package/dist/chunk-AJ3QXTRQ.js +756 -0
- package/dist/chunk-AJVLWNFN.js +1610 -0
- package/dist/chunk-AJXODZY6.js +112 -0
- package/dist/chunk-ARFCXG7S.js +84 -0
- package/dist/chunk-AS44CFQ4.js +708 -0
- package/dist/chunk-AWE5TMPO.js +38 -0
- package/dist/chunk-B3I2UUT4.js +4692 -0
- package/dist/chunk-BRJKOBZP.js +331 -0
- package/dist/chunk-BW5KFIQC.js +59 -0
- package/dist/chunk-C2AUYXQH.js +149 -0
- package/dist/chunk-CGGAIP7J.js +29 -0
- package/dist/chunk-D6QS3U6M.js +30 -0
- package/dist/chunk-DFVMIKMQ.js +349 -0
- package/dist/chunk-DIULIWKU.js +169 -0
- package/dist/chunk-DQ2NZ7C4.js +2317 -0
- package/dist/chunk-E2WFBRHM.js +213 -0
- package/dist/chunk-E4MAEDPM.js +50 -0
- package/dist/chunk-EOKRQ3SA.js +30 -0
- package/dist/chunk-F3AU2TMM.js +2626 -0
- package/dist/chunk-F3P7VQ7H.js +170 -0
- package/dist/chunk-FC4RP4I2.js +12 -0
- package/dist/chunk-FJNKANOS.js +32 -0
- package/dist/chunk-GUOGVTCQ.js +146 -0
- package/dist/chunk-GVXA6CCE.js +18 -0
- package/dist/chunk-HHYAELLJ.js +2334 -0
- package/dist/chunk-HMFXILPV.js +83 -0
- package/dist/chunk-HVUZXSWK.js +421 -0
- package/dist/chunk-HWBZIGMJ.js +62 -0
- package/dist/chunk-I3R7GKDR.js +17 -0
- package/dist/chunk-I7SPGOWI.js +55 -0
- package/dist/chunk-IIXOAGHR.js +38 -0
- package/dist/chunk-IVP5KAB7.js +2250 -0
- package/dist/chunk-IXEBJSUE.js +22 -0
- package/dist/chunk-JOLITGCC.js +27 -0
- package/dist/chunk-K6VYLB2U.js +145 -0
- package/dist/chunk-LJDODBBZ.js +78 -0
- package/dist/chunk-LNAKEO63.js +78 -0
- package/dist/chunk-LSMJ6KBE.js +4139 -0
- package/dist/chunk-LW6XKDZQ.js +5565 -0
- package/dist/chunk-N3YQJI6O.js +899 -0
- package/dist/chunk-NABLC7W3.js +148 -0
- package/dist/chunk-NKOUFPQF.js +659 -0
- package/dist/chunk-NL5GLMFI.js +211 -0
- package/dist/chunk-NMABWBZN.js +327 -0
- package/dist/chunk-NTHH2J74.js +27 -0
- package/dist/chunk-NTUJEGDZ.js +59 -0
- package/dist/chunk-NXL4FFQQ.js +47 -0
- package/dist/chunk-NXPS2L6U.js +466 -0
- package/dist/chunk-O5WILGMI.js +42 -0
- package/dist/chunk-O6TQT6RI.js +48 -0
- package/dist/chunk-OAXNDZJ7.js +323 -0
- package/dist/chunk-ODEEOXPH.js +44 -0
- package/dist/chunk-OQGFCZJ4.js +4533 -0
- package/dist/chunk-ORTMY4Q4.js +282 -0
- package/dist/chunk-OS32RNR2.js +442 -0
- package/dist/chunk-PAK6IDME.js +189 -0
- package/dist/chunk-PWFHBTSF.js +406 -0
- package/dist/chunk-Q5U6FMDI.js +2352 -0
- package/dist/chunk-QOZXJ4NA.js +3364 -0
- package/dist/chunk-QYF5S6P6.js +45 -0
- package/dist/chunk-RIISMHKN.js +36 -0
- package/dist/chunk-RPD4ZSB7.js +25 -0
- package/dist/chunk-RPD5K5NC.js +79 -0
- package/dist/chunk-RUOG5D2C.js +262 -0
- package/dist/chunk-T4ERT73Y.js +599 -0
- package/dist/chunk-T6D4Q4AQ.js +54 -0
- package/dist/chunk-TGPXLY2J.js +391 -0
- package/dist/chunk-TLGFBM3F.js +12116 -0
- package/dist/chunk-TO6WL3GM.js +88 -0
- package/dist/chunk-TT22N74J.js +517 -0
- package/dist/chunk-TVN5N6GY.js +21216 -0
- package/dist/chunk-U3VGR4VU.js +308 -0
- package/dist/chunk-UK3CMEAL.js +1250 -0
- package/dist/chunk-UOPVJQ4N.js +103 -0
- package/dist/chunk-UXVNL3D7.js +23 -0
- package/dist/chunk-UY752QSN.js +45 -0
- package/dist/chunk-V5PXFSZK.js +188 -0
- package/dist/chunk-V7R425XG.js +398 -0
- package/dist/chunk-VCSRSYLF.js +81 -0
- package/dist/chunk-VD4JQCQC.js +162 -0
- package/dist/chunk-VDBPVIKD.js +62 -0
- package/dist/chunk-VHQLPIRJ.js +114 -0
- package/dist/chunk-VN2AXLEX.js +5414 -0
- package/dist/chunk-VNMT7C64.js +478 -0
- package/dist/chunk-WONERJTP.js +309 -0
- package/dist/chunk-XECLWQZN.js +85 -0
- package/dist/chunk-XIMYZ3JA.js +27 -0
- package/dist/chunk-XK4CIILI.js +144 -0
- package/dist/chunk-Y4T27COV.js +562 -0
- package/dist/chunk-YGVYKNSN.js +1860 -0
- package/dist/chunk-YLF3PPT5.js +308 -0
- package/dist/chunk-YSNFMJKN.js +14 -0
- package/dist/chunk-Z3CCVDUB.js +76 -0
- package/dist/chunk-Z54ZSOBZ.js +61 -0
- package/dist/chunk-ZAWW3AF6.js +97 -0
- package/dist/chunk-ZMOL6RQC.js +167 -0
- package/dist/index.js +19039 -8956
- package/dist/mcp/analyze-cli.js +186 -228
- package/dist/mcp/cli.js +137 -98
- package/dist/mcp/server.js +22592 -1564
- package/dist/mcp/worker.js +97 -38
- package/dist/probes/installer.js +135 -0
- package/dist/workers/project-snapshot-persist-worker.js +22 -0
- package/dist/workers/review-graph-persist-worker.js +15 -0
- package/docs/adr/0001-stale-advisory-live-arm.md +29 -0
- package/docs/adr/0002-workspace-hash-rendezvous.md +30 -0
- package/docs/adr/0003-git-guard-latch-writer.md +203 -0
- package/docs/adr/0004-disposition-policy-seam.md +38 -0
- package/docs/adr/0005-tool-availability-enforcement-seam.md +29 -0
- package/docs/adr/0006-derived-state-benchmark-first.md +31 -0
- package/docs/adr/0007-end-to-end-witness-per-seam-slice.md +38 -0
- package/docs/adr/0008-turn-end-lane-interface.md +165 -0
- package/docs/adr/0009-reported-path-attribution.md +114 -0
- package/docs/adr/README.md +26 -0
- package/docs/agent-guide.md +13 -4
- package/docs/agent-tools.md +60 -1
- package/docs/ast-grep_rules_catalog.md +6 -4
- package/docs/configuration.md +75 -2
- package/docs/engineering-principles.md +202 -0
- package/docs/environment-variables.md +113 -6
- package/docs/features.md +10 -6
- package/docs/globalconfig.md +7 -1
- package/docs/io-bridge-v2-migration.md +94 -0
- package/docs/language-coverage.md +17 -0
- package/docs/lsp-capability-matrix.md +131 -32
- package/docs/lsp-idle-eviction.md +124 -0
- package/docs/mcp.md +21 -5
- package/docs/merge-queue-rollout.md +77 -0
- package/docs/pi-lens-fixer.md +161 -39
- package/docs/pi-lens-investigator.md +77 -20
- package/docs/pi-lens-merge-policy.md +694 -0
- package/docs/pi-lens-monitor.md +73 -7
- package/docs/pi-lens-retro.md +6 -4
- package/docs/pi-lens-reviewer.md +190 -34
- package/docs/pi-lens-subagent.md +247 -37
- package/docs/pi-lens-warden.md +18 -7
- package/docs/public-api-stability.md +56 -0
- package/docs/release-qa-baseline.md +86 -17
- package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/docs/servercapabilities.md +66 -52
- package/docs/settings.md +13 -3
- package/docs/subagent-compat.md +1 -1
- package/docs/usage.md +5 -1
- package/grammars/tree-sitter-bash.wasm +0 -0
- package/grammars/tree-sitter-bash.wasm.json +3 -3
- package/package.json +23 -9
- package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
- package/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +26 -0
- package/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +10 -0
- package/rules/ast-grep-rules/rule-tests/unchecked-numeric-parse-python-test.yml +18 -0
- package/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +4 -3
- package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/rules/ast-grep-rules/rules/go-no-fmt-println.yml +2 -2
- package/rules/ast-grep-rules/rules/no-assert-tuple.yml +23 -13
- package/rules/ast-grep-rules/rules/no-boolean-in-except.yml +7 -3
- package/rules/ast-grep-rules/rules/no-console-except-error-js.yml +2 -2
- package/rules/ast-grep-rules/rules/no-console-except-error.yml +2 -2
- package/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +12 -7
- package/rules/ast-grep-rules/rules/unchecked-numeric-parse-python.yml +44 -0
- package/rules/ast-grep-rules/rules/unchecked-throwing-call-python.yml +5 -3
- package/rules/tree-sitter-queries/typescript/console-statement.yml +2 -2
- package/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/scripts/download-grammars.js +5 -0
- package/scripts/grammars.lock.json +6 -1
- package/scripts/install-selftest.mjs +38 -35
- package/scripts/lib/host-provided-deps.mjs +13 -4
- package/scripts/lib/web-tree-sitter-dir.mjs +141 -0
- package/dist/clients/actionable-warnings-logger.js +0 -35
- package/dist/clients/actionable-warnings.js +0 -1594
- package/dist/clients/advisory-provenance.js +0 -457
- package/dist/clients/agent-behavior-client.js +0 -147
- package/dist/clients/agent-nudge.js +0 -325
- package/dist/clients/analysed-root.js +0 -1
- package/dist/clients/ast-grep-client.js +0 -731
- package/dist/clients/ast-grep-rule-manager.js +0 -146
- package/dist/clients/ast-grep-tool-logger.js +0 -118
- package/dist/clients/ast-grep-types.js +0 -10
- package/dist/clients/ast-grep-yaml-synth.js +0 -154
- package/dist/clients/atomic-write-staging.js +0 -75
- package/dist/clients/atomic-write.js +0 -189
- package/dist/clients/availability-probe-flight.js +0 -12
- package/dist/clients/bash-file-access.js +0 -1056
- package/dist/clients/biome-client.js +0 -357
- package/dist/clients/blocker-freshness.js +0 -837
- package/dist/clients/blocker-past-eof.js +0 -129
- package/dist/clients/bootstrap.js +0 -569
- package/dist/clients/bounded-cache.js +0 -190
- package/dist/clients/bounded-pid-file-lock.js +0 -202
- package/dist/clients/bounded-telemetry.js +0 -295
- package/dist/clients/build-identity.js +0 -95
- package/dist/clients/bundled-resource-health.js +0 -113
- package/dist/clients/bus-events-logger.js +0 -105
- package/dist/clients/bus-publish.js +0 -171
- package/dist/clients/cache/rule-cache.js +0 -190
- package/dist/clients/cache-manager.js +0 -465
- package/dist/clients/cache-observability.js +0 -1313
- package/dist/clients/call-graph.js +0 -852
- package/dist/clients/cargo-manifest.js +0 -422
- package/dist/clients/cascade-budget.js +0 -196
- package/dist/clients/cascade-format.js +0 -315
- package/dist/clients/cascade-logger.js +0 -31
- package/dist/clients/cascade-types.js +0 -9
- package/dist/clients/child-unref.js +0 -115
- package/dist/clients/code-quality-warnings.js +0 -286
- package/dist/clients/codebase-model.js +0 -173
- package/dist/clients/collateral-test-role.js +0 -40
- package/dist/clients/complexity-client.js +0 -462
- package/dist/clients/config-core/deny.js +0 -221
- package/dist/clients/config-core/index.js +0 -50
- package/dist/clients/config-core/merge.js +0 -357
- package/dist/clients/config-core/normalize.js +0 -340
- package/dist/clients/config-core/process-spec.js +0 -248
- package/dist/clients/config-core/provenance.js +0 -164
- package/dist/clients/config-core/records.js +0 -218
- package/dist/clients/config-core/resolve.js +0 -125
- package/dist/clients/config-core/safe-object.js +0 -78
- package/dist/clients/config-core/schema.js +0 -165
- package/dist/clients/config-diagnostic-codes.js +0 -283
- package/dist/clients/config-locations.js +0 -160
- package/dist/clients/config-resolve.js +0 -792
- package/dist/clients/config-schema.js +0 -251
- package/dist/clients/config-warn.js +0 -407
- package/dist/clients/console-guard-install.js +0 -26
- package/dist/clients/cooperative-budget.js +0 -42
- package/dist/clients/dead-code-client.js +0 -510
- package/dist/clients/dead-code-logger.js +0 -30
- package/dist/clients/deadline-utils.js +0 -280
- package/dist/clients/debug-handles.js +0 -211
- package/dist/clients/debug-heap.js +0 -174
- package/dist/clients/deferred-lsp-work.js +0 -106
- package/dist/clients/degradation-ledger.js +0 -396
- package/dist/clients/demoted-finding-render.js +0 -169
- package/dist/clients/dependency-checker.js +0 -862
- package/dist/clients/deps/ast-grep-napi.js +0 -22
- package/dist/clients/deps/js-yaml.js +0 -9
- package/dist/clients/deps/minimatch.js +0 -4
- package/dist/clients/deps/pi-tui.js +0 -14
- package/dist/clients/deps/typebox.js +0 -14
- package/dist/clients/deps/vscode-jsonrpc.js +0 -1
- package/dist/clients/deps/web-tree-sitter.js +0 -24
- package/dist/clients/diagnostic-dispositions.js +0 -594
- package/dist/clients/diagnostic-line-freshness.js +0 -305
- package/dist/clients/diagnostic-logger.js +0 -73
- package/dist/clients/diagnostic-tracker.js +0 -105
- package/dist/clients/diagnostics-publish.js +0 -230
- package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
- package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
- package/dist/clients/dispatch/collect-later-tier.js +0 -35
- package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
- package/dist/clients/dispatch/dispatcher.js +0 -1269
- package/dist/clients/dispatch/fact-provider-types.js +0 -1
- package/dist/clients/dispatch/fact-rule-runner.js +0 -17
- package/dist/clients/dispatch/fact-runner.js +0 -30
- package/dist/clients/dispatch/fact-scheduler.js +0 -68
- package/dist/clients/dispatch/fact-store.js +0 -377
- package/dist/clients/dispatch/facts/comment-facts.js +0 -22
- package/dist/clients/dispatch/facts/file-content.js +0 -19
- package/dist/clients/dispatch/facts/function-facts.js +0 -348
- package/dist/clients/dispatch/facts/import-facts.js +0 -204
- package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
- package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
- package/dist/clients/dispatch/finding-policy.js +0 -222
- package/dist/clients/dispatch/indent-detect.js +0 -411
- package/dist/clients/dispatch/inline-suppressions.js +0 -70
- package/dist/clients/dispatch/integration.js +0 -2377
- package/dist/clients/dispatch/lazy.js +0 -11
- package/dist/clients/dispatch/pending-runner-findings.js +0 -87
- package/dist/clients/dispatch/plan.js +0 -278
- package/dist/clients/dispatch/priorities.js +0 -20
- package/dist/clients/dispatch/rule-id-normalize.js +0 -50
- package/dist/clients/dispatch/rule-ignores.js +0 -62
- package/dist/clients/dispatch/rule-policy.js +0 -135
- package/dist/clients/dispatch/rules/async-noise.js +0 -40
- package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
- package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
- package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
- package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
- package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
- package/dist/clients/dispatch/rules/high-complexity.js +0 -72
- package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
- package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
- package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
- package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
- package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
- package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
- package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
- package/dist/clients/dispatch/runner-context.js +0 -52
- package/dist/clients/dispatch/runners/actionlint.js +0 -113
- package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/dist/clients/dispatch/runners/biome-check.js +0 -283
- package/dist/clients/dispatch/runners/cpp-check.js +0 -236
- package/dist/clients/dispatch/runners/credo.js +0 -80
- package/dist/clients/dispatch/runners/cue-vet.js +0 -398
- package/dist/clients/dispatch/runners/dart-analyze.js +0 -202
- package/dist/clients/dispatch/runners/detekt.js +0 -169
- package/dist/clients/dispatch/runners/dotnet-build.js +0 -159
- package/dist/clients/dispatch/runners/elixir-check.js +0 -210
- package/dist/clients/dispatch/runners/eslint.js +0 -154
- package/dist/clients/dispatch/runners/fact-rules.js +0 -29
- package/dist/clients/dispatch/runners/fish-indent.js +0 -69
- package/dist/clients/dispatch/runners/gleam-check.js +0 -87
- package/dist/clients/dispatch/runners/go-vet.js +0 -90
- package/dist/clients/dispatch/runners/golangci-lint.js +0 -120
- package/dist/clients/dispatch/runners/hadolint.js +0 -79
- package/dist/clients/dispatch/runners/helm-lint.js +0 -171
- package/dist/clients/dispatch/runners/helm-render.js +0 -940
- package/dist/clients/dispatch/runners/htmlhint.js +0 -108
- package/dist/clients/dispatch/runners/index.js +0 -108
- package/dist/clients/dispatch/runners/javac.js +0 -89
- package/dist/clients/dispatch/runners/ktlint.js +0 -136
- package/dist/clients/dispatch/runners/lsp.js +0 -378
- package/dist/clients/dispatch/runners/markdownlint.js +0 -160
- package/dist/clients/dispatch/runners/mypy.js +0 -101
- package/dist/clients/dispatch/runners/oxlint.js +0 -398
- package/dist/clients/dispatch/runners/php-lint.js +0 -62
- package/dist/clients/dispatch/runners/phpstan.js +0 -120
- package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
- package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
- package/dist/clients/dispatch/runners/pyright.js +0 -169
- package/dist/clients/dispatch/runners/rubocop.js +0 -90
- package/dist/clients/dispatch/runners/ruff.js +0 -89
- package/dist/clients/dispatch/runners/rust-clippy.js +0 -251
- package/dist/clients/dispatch/runners/shellcheck.js +0 -169
- package/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/dist/clients/dispatch/runners/spellcheck.js +0 -121
- package/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/dist/clients/dispatch/runners/sqlfluff.js +0 -174
- package/dist/clients/dispatch/runners/stylelint.js +0 -158
- package/dist/clients/dispatch/runners/swiftlint.js +0 -154
- package/dist/clients/dispatch/runners/taplo.js +0 -168
- package/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/dist/clients/dispatch/runners/tflint.js +0 -110
- package/dist/clients/dispatch/runners/tree-sitter.js +0 -620
- package/dist/clients/dispatch/runners/trivy-config.js +0 -247
- package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
- package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
- package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -85
- package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
- package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
- package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
- package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
- package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
- package/dist/clients/dispatch/runners/utils.js +0 -15
- package/dist/clients/dispatch/runners/vale.js +0 -116
- package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/dist/clients/dispatch/runners/yamllint.js +0 -85
- package/dist/clients/dispatch/runners/zig-check.js +0 -91
- package/dist/clients/dispatch/suppress-writer.js +0 -69
- package/dist/clients/dispatch/tool-profile.js +0 -30
- package/dist/clients/dispatch/types.js +0 -21
- package/dist/clients/dispatch/utils/format-utils.js +0 -45
- package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
- package/dist/clients/disposition-logger.js +0 -32
- package/dist/clients/disposition-publish.js +0 -124
- package/dist/clients/durable-store.js +0 -97
- package/dist/clients/effective-config.js +0 -413
- package/dist/clients/env-utils.js +0 -83
- package/dist/clients/error-class.js +0 -23
- package/dist/clients/eval-timestamp.js +0 -17
- package/dist/clients/event-loop-hold.js +0 -274
- package/dist/clients/event-loop-monitor.js +0 -250
- package/dist/clients/extension-log.js +0 -504
- package/dist/clients/extension-mode.js +0 -73
- package/dist/clients/feature-hints.js +0 -103
- package/dist/clients/file-kinds.js +0 -412
- package/dist/clients/file-role.js +0 -134
- package/dist/clients/file-time.js +0 -160
- package/dist/clients/file-utils.js +0 -1032
- package/dist/clients/finding-delivery-gate.js +0 -463
- package/dist/clients/finding-identity.js +0 -88
- package/dist/clients/fix-worklog.js +0 -103
- package/dist/clients/format-events-publish.js +0 -343
- package/dist/clients/format-service.js +0 -222
- package/dist/clients/formatters-lazy.js +0 -9
- package/dist/clients/formatters.js +0 -1994
- package/dist/clients/freshness-cadence.js +0 -17
- package/dist/clients/freshness.js +0 -38
- package/dist/clients/generated-artifacts.js +0 -394
- package/dist/clients/generation-guard.js +0 -215
- package/dist/clients/git-guard.js +0 -923
- package/dist/clients/git-tracked-ignore.js +0 -243
- package/dist/clients/gitleaks-client.js +0 -509
- package/dist/clients/go-client.js +0 -104
- package/dist/clients/govulncheck-client.js +0 -605
- package/dist/clients/gradle-ktfmt-style.js +0 -252
- package/dist/clients/grammar-source.js +0 -465
- package/dist/clients/gzip-stage-write.js +0 -135
- package/dist/clients/hashline-anchor.js +0 -424
- package/dist/clients/hook-budgets.js +0 -76
- package/dist/clients/host-edit-normalize.js +0 -140
- package/dist/clients/host-ports.js +0 -39
- package/dist/clients/indent-retarget.js +0 -154
- package/dist/clients/install-diagnostics.js +0 -143
- package/dist/clients/installer/index.js +0 -5167
- package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
- package/dist/clients/installer/managed-tool-refresh.js +0 -783
- package/dist/clients/instance-reaper-state.js +0 -7
- package/dist/clients/instance-reaper.js +0 -1137
- package/dist/clients/instance-registry-lock.js +0 -145
- package/dist/clients/instance-registry.js +0 -773
- package/dist/clients/jscpd-client.js +0 -370
- package/dist/clients/json-cache-read.js +0 -65
- package/dist/clients/knip-client.js +0 -788
- package/dist/clients/language-policy.js +0 -252
- package/dist/clients/language-profile.js +0 -361
- package/dist/clients/language-registry.js +0 -603
- package/dist/clients/latency-logger.js +0 -719
- package/dist/clients/lazy-import.js +0 -21
- package/dist/clients/ledger-bounds.js +0 -54
- package/dist/clients/lens-config.js +0 -346
- package/dist/clients/lens-engine.js +0 -358
- package/dist/clients/lens-events.js +0 -125
- package/dist/clients/lens-flag-registry.js +0 -467
- package/dist/clients/lens-map.js +0 -1156
- package/dist/clients/live-bus-emitter.js +0 -74
- package/dist/clients/log-cleanup.js +0 -222
- package/dist/clients/lsp/aggregation.js +0 -178
- package/dist/clients/lsp/cascade-tier.js +0 -421
- package/dist/clients/lsp/client.js +0 -4465
- package/dist/clients/lsp/config.js +0 -689
- package/dist/clients/lsp/diagnostic-binding.js +0 -225
- package/dist/clients/lsp/document-drift.js +0 -467
- package/dist/clients/lsp/edits.js +0 -1219
- package/dist/clients/lsp/index.js +0 -8305
- package/dist/clients/lsp/inferred-project.js +0 -216
- package/dist/clients/lsp/jvm-runtime.js +0 -298
- package/dist/clients/lsp/language.js +0 -63
- package/dist/clients/lsp/launch.js +0 -725
- package/dist/clients/lsp/lombok.js +0 -158
- package/dist/clients/lsp/path-utils.js +0 -5
- package/dist/clients/lsp/pending-aux-coverage.js +0 -251
- package/dist/clients/lsp/position-encoding.js +0 -61
- package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
- package/dist/clients/lsp/server.js +0 -3209
- package/dist/clients/lsp/session-roots.js +0 -192
- package/dist/clients/lsp/spawn-history.js +0 -17
- package/dist/clients/lsp/sync-kind.js +0 -42
- package/dist/clients/lsp/tsserver-sync.js +0 -332
- package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
- package/dist/clients/lsp/wait-policy/classification.js +0 -85
- package/dist/clients/lsp/wait-policy/index.js +0 -10
- package/dist/clients/lsp/wait-policy/strategies.js +0 -303
- package/dist/clients/lsp/watch-queue.js +0 -61
- package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
- package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
- package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
- package/dist/clients/lsp-budget.js +0 -186
- package/dist/clients/lsp-document-symbols.js +0 -110
- package/dist/clients/lsp-lazy.js +0 -9
- package/dist/clients/lsp-mutation.js +0 -396
- package/dist/clients/lsp-status.js +0 -59
- package/dist/clients/map-with-concurrency.js +0 -40
- package/dist/clients/mcp/analyze.js +0 -420
- package/dist/clients/mcp/host-shim.js +0 -31
- package/dist/clients/mcp/ipc.js +0 -335
- package/dist/clients/mcp/review.js +0 -151
- package/dist/clients/mcp/session.js +0 -412
- package/dist/clients/memory-sampler.js +0 -208
- package/dist/clients/message-end-attribution.js +0 -30
- package/dist/clients/metrics-client.js +0 -107
- package/dist/clients/metrics-history.js +0 -327
- package/dist/clients/middle-man-analysis.js +0 -263
- package/dist/clients/model-provider.js +0 -53
- package/dist/clients/module-report-lsp.js +0 -189
- package/dist/clients/module-report.js +0 -2150
- package/dist/clients/mutating-tool.js +0 -651
- package/dist/clients/mutation-attribution.js +0 -368
- package/dist/clients/mutation-bridge.js +0 -240
- package/dist/clients/ndjson-logger.js +0 -734
- package/dist/clients/observed-mutation-sources.js +0 -101
- package/dist/clients/observed-mutation.js +0 -1253
- package/dist/clients/oldtext-autopatch.js +0 -128
- package/dist/clients/opaque-mutation-scan.js +0 -496
- package/dist/clients/opengrep-client.js +0 -328
- package/dist/clients/opengrep-config.js +0 -76
- package/dist/clients/package-manager.js +0 -607
- package/dist/clients/package-root.js +0 -38
- package/dist/clients/partial-edit-apply.js +0 -439
- package/dist/clients/path-attribution-telemetry.js +0 -43
- package/dist/clients/path-keyed-map.js +0 -108
- package/dist/clients/path-utils.js +0 -1244
- package/dist/clients/performance-report.js +0 -331
- package/dist/clients/persist-debounce.js +0 -70
- package/dist/clients/persistent-reverify.js +0 -271
- package/dist/clients/php-cs-fixer-config.js +0 -119
- package/dist/clients/pipeline.js +0 -1425
- package/dist/clients/post-autofix-notice.js +0 -37
- package/dist/clients/print-mode.js +0 -21
- package/dist/clients/probe-home-state.js +0 -228
- package/dist/clients/process-bridge.js +0 -66
- package/dist/clients/process-singletons.js +0 -210
- package/dist/clients/process-snapshot.js +0 -68
- package/dist/clients/project-changes.js +0 -181
- package/dist/clients/project-conventions.js +0 -171
- package/dist/clients/project-diagnostics/cache.js +0 -137
- package/dist/clients/project-diagnostics/extractors.js +0 -109
- package/dist/clients/project-diagnostics/fresh-fetch.js +0 -650
- package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
- package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
- package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
- package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
- package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
- package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
- package/dist/clients/project-diagnostics/scanner.js +0 -520
- package/dist/clients/project-diagnostics/types.js +0 -1
- package/dist/clients/project-lens-config.js +0 -799
- package/dist/clients/project-report.js +0 -701
- package/dist/clients/project-scale.js +0 -237
- package/dist/clients/project-scan-policy.js +0 -11
- package/dist/clients/project-snapshot-fingerprint.js +0 -48
- package/dist/clients/project-snapshot-persist-worker.js +0 -20
- package/dist/clients/project-snapshot.js +0 -1653
- package/dist/clients/project-trust.js +0 -181
- package/dist/clients/python-environment.js +0 -217
- package/dist/clients/python-provenance.js +0 -639
- package/dist/clients/quiet-window-config.js +0 -47
- package/dist/clients/quiet-window.js +0 -236
- package/dist/clients/read-bridge.js +0 -139
- package/dist/clients/read-expansion.js +0 -266
- package/dist/clients/read-guard-logger.js +0 -251
- package/dist/clients/read-guard-tool-lines.js +0 -1306
- package/dist/clients/read-guard.js +0 -1561
- package/dist/clients/recent-touches.js +0 -240
- package/dist/clients/redact/secrets.js +0 -449
- package/dist/clients/resource-sampler.js +0 -628
- package/dist/clients/reverse-deps.js +0 -270
- package/dist/clients/review-graph/builder.js +0 -5118
- package/dist/clients/review-graph/format.js +0 -33
- package/dist/clients/review-graph/git-identity.js +0 -157
- package/dist/clients/review-graph/import-resolvers.js +0 -481
- package/dist/clients/review-graph/persist-worker.js +0 -10
- package/dist/clients/review-graph/query.js +0 -244
- package/dist/clients/review-graph/revision-drift.js +0 -21
- package/dist/clients/review-graph/service.js +0 -96
- package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
- package/dist/clients/review-graph/symbol-id.js +0 -103
- package/dist/clients/review-graph/tsconfig-paths.js +0 -299
- package/dist/clients/review-graph/types.js +0 -1
- package/dist/clients/review-graph/workspace-modules.js +0 -449
- package/dist/clients/review-graph-logger.js +0 -81
- package/dist/clients/ruff-client.js +0 -152
- package/dist/clients/rules-scanner.js +0 -131
- package/dist/clients/run-duration.js +0 -55
- package/dist/clients/runtime-agent-end.js +0 -746
- package/dist/clients/runtime-config.js +0 -77
- package/dist/clients/runtime-context.js +0 -211
- package/dist/clients/runtime-coordinator.js +0 -1290
- package/dist/clients/runtime-session.js +0 -2485
- package/dist/clients/runtime-tool-call.js +0 -1284
- package/dist/clients/runtime-tool-result.js +0 -2034
- package/dist/clients/runtime-turn.js +0 -3600
- package/dist/clients/rust-client.js +0 -97
- package/dist/clients/safe-spawn.js +0 -2166
- package/dist/clients/sanitize.js +0 -286
- package/dist/clients/scan-utils.js +0 -25
- package/dist/clients/scratch-tree-policy.js +0 -165
- package/dist/clients/search-read-registration.js +0 -94
- package/dist/clients/secret-findings.js +0 -114
- package/dist/clients/security-scan-client.js +0 -352
- package/dist/clients/session-event-guard.js +0 -297
- package/dist/clients/session-lifecycle.js +0 -484
- package/dist/clients/session-start-observability.js +0 -94
- package/dist/clients/session-state-store.js +0 -101
- package/dist/clients/session-summary.js +0 -15
- package/dist/clients/sessionstart-logger.js +0 -27
- package/dist/clients/sg-runner.js +0 -876
- package/dist/clients/sgconfig.js +0 -347
- package/dist/clients/shared-checkout-guard.js +0 -338
- package/dist/clients/single-flight.js +0 -158
- package/dist/clients/situational-tool-telemetry.js +0 -108
- package/dist/clients/skills-resolver.js +0 -141
- package/dist/clients/slow-fs.js +0 -138
- package/dist/clients/smells-rollup.js +0 -231
- package/dist/clients/source-filter.js +0 -596
- package/dist/clients/source-walker.js +0 -211
- package/dist/clients/spawn-output-cap.js +0 -37
- package/dist/clients/spawn-timeout-cooldown.js +0 -110
- package/dist/clients/stale-marker.js +0 -17
- package/dist/clients/startup-scan.js +0 -400
- package/dist/clients/startup-timing.js +0 -130
- package/dist/clients/string-utils.js +0 -33
- package/dist/clients/subagent-mode.js +0 -111
- package/dist/clients/symbol-containment.js +0 -24
- package/dist/clients/symbol-types.js +0 -5
- package/dist/clients/test-runner-client.js +0 -2507
- package/dist/clients/test-runner-delivery.js +0 -287
- package/dist/clients/todo-scanner.js +0 -229
- package/dist/clients/tool-agreement.js +0 -423
- package/dist/clients/tool-config.js +0 -249
- package/dist/clients/tool-cwd.js +0 -270
- package/dist/clients/tool-definition.js +0 -47
- package/dist/clients/tool-event.js +0 -105
- package/dist/clients/tool-policy.js +0 -2755
- package/dist/clients/tool-probe.js +0 -53
- package/dist/clients/tool-render.js +0 -156
- package/dist/clients/tool-set-policy.js +0 -118
- package/dist/clients/tree-sitter-cache.js +0 -364
- package/dist/clients/tree-sitter-client.js +0 -4134
- package/dist/clients/tree-sitter-logger.js +0 -100
- package/dist/clients/tree-sitter-navigator.js +0 -269
- package/dist/clients/tree-sitter-query-loader.js +0 -569
- package/dist/clients/tree-sitter-shared.js +0 -158
- package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
- package/dist/clients/trivy-client.js +0 -467
- package/dist/clients/tui-fit.js +0 -50
- package/dist/clients/turn-context.js +0 -52
- package/dist/clients/turn-summary-render.js +0 -72
- package/dist/clients/turn-summary.js +0 -132
- package/dist/clients/typos-config.js +0 -29
- package/dist/clients/user-notify.js +0 -51
- package/dist/clients/vanished-instance-marker.js +0 -57
- package/dist/clients/warm-attach.js +0 -246
- package/dist/clients/widget-state.js +0 -1677
- package/dist/clients/word-index-logger.js +0 -49
- package/dist/clients/word-index-store.js +0 -459
- package/dist/clients/word-index.js +0 -2080
- package/dist/clients/workspace-topology.js +0 -389
- package/dist/clients/write-ordering-guard.js +0 -65
- package/dist/clients/zizmor-config.js +0 -327
- package/dist/i18n.js +0 -69
- package/dist/mcp/build-staleness.js +0 -124
- package/dist/scripts/lib/process-scan.mjs +0 -583
- package/dist/scripts/lib/skills-predicate.mjs +0 -129
- package/dist/tools/activate-tools.js +0 -87
- package/dist/tools/ast-grep-outline.js +0 -137
- package/dist/tools/ast-grep-replace.js +0 -244
- package/dist/tools/ast-grep-search.js +0 -762
- package/dist/tools/effective-config.js +0 -90
- package/dist/tools/lens-diagnostic-mark.js +0 -375
- package/dist/tools/lens-diagnostics.js +0 -2544
- package/dist/tools/lsp-diagnostics.js +0 -1634
- package/dist/tools/lsp-navigation.js +0 -1367
- package/dist/tools/lsp-structured-output.js +0 -294
- package/dist/tools/module-report.js +0 -382
- package/dist/tools/project-report.js +0 -86
- package/dist/tools/render-compact.js +0 -374
- package/dist/tools/scan-progress.js +0 -53
- package/dist/tools/shared.js +0 -29
- package/dist/tools/symbol-search.js +0 -155
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ESLint runner for dispatch system
|
|
3
|
-
*
|
|
4
|
-
* Runs ESLint on JS/TS files when an ESLint config is present in the project.
|
|
5
|
-
* Prefers the local node_modules installation over global.
|
|
6
|
-
*
|
|
7
|
-
* Gate: skips when no ESLint config is detected (project uses Biome/OxLint instead).
|
|
8
|
-
*/
|
|
9
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
10
|
-
import { resolveRunnerCwd } from "../../tool-cwd.js";
|
|
11
|
-
import { getAutofixCapability, hasEslintConfig } from "../../tool-policy.js";
|
|
12
|
-
import { PRIORITY } from "../priorities.js";
|
|
13
|
-
import { createCwdCachedProbe, resolveToolCommand, } from "./utils/runner-helpers.js";
|
|
14
|
-
const ESLINT_PROBE_BUDGET_MS = 5000;
|
|
15
|
-
// Per-cwd cached eslint `--version` verification (#120). Before this, every
|
|
16
|
-
// dispatch invocation ran a fresh `safeSpawnAsync(cmd, ["--version"])` after
|
|
17
|
-
// the local cmd resolution. The probe is cached per cwd because
|
|
18
|
-
// `resolveToolCommand("eslint")` is deterministic from cwd; the underlying
|
|
19
|
-
// cmd identity is captured inside the probe closure.
|
|
20
|
-
//
|
|
21
|
-
// The verdict is governed by the shared availability policy (#1494): the probe
|
|
22
|
-
// hands back the spawn result, so one stalled probe on the first JS/TS save
|
|
23
|
-
// expires on a cooldown instead of disabling eslint for the whole session.
|
|
24
|
-
function makeEslintProbe(cmd) {
|
|
25
|
-
return createCwdCachedProbe((cwd) => safeSpawnAsync(cmd, ["--version"], {
|
|
26
|
-
timeout: ESLINT_PROBE_BUDGET_MS,
|
|
27
|
-
cwd,
|
|
28
|
-
}), {
|
|
29
|
-
tool: "eslint",
|
|
30
|
-
budgetMs: ESLINT_PROBE_BUDGET_MS,
|
|
31
|
-
flightKeyComponent: cmd,
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
const eslintAvailabilityByCmd = new Map();
|
|
35
|
-
function getEslintProbe(cmd) {
|
|
36
|
-
const existing = eslintAvailabilityByCmd.get(cmd);
|
|
37
|
-
if (existing)
|
|
38
|
-
return existing;
|
|
39
|
-
const created = makeEslintProbe(cmd);
|
|
40
|
-
eslintAvailabilityByCmd.set(cmd, created);
|
|
41
|
-
return created;
|
|
42
|
-
}
|
|
43
|
-
function parseEslintJson(raw, filePath) {
|
|
44
|
-
try {
|
|
45
|
-
const results = JSON.parse(raw);
|
|
46
|
-
const autofix = getAutofixCapability("eslint");
|
|
47
|
-
const diagnostics = [];
|
|
48
|
-
for (const fileResult of results) {
|
|
49
|
-
for (const msg of fileResult.messages) {
|
|
50
|
-
const severity = msg.severity === 2 ? "error" : "warning";
|
|
51
|
-
diagnostics.push({
|
|
52
|
-
id: `eslint:${msg.ruleId ?? "unknown"}:${msg.line}`,
|
|
53
|
-
message: msg.ruleId ? `${msg.ruleId}: ${msg.message}` : msg.message,
|
|
54
|
-
filePath,
|
|
55
|
-
line: msg.line ?? 1,
|
|
56
|
-
column: msg.column ?? 1,
|
|
57
|
-
severity,
|
|
58
|
-
semantic: severity === "error" ? "blocking" : "warning",
|
|
59
|
-
tool: "eslint",
|
|
60
|
-
rule: msg.ruleId ?? undefined,
|
|
61
|
-
fixable: !!msg.fix,
|
|
62
|
-
autoFixAvailable: !!msg.fix && (autofix?.safePipelineAutofix ?? false),
|
|
63
|
-
fixKind: !!msg.fix && autofix?.fixKind !== "none"
|
|
64
|
-
? autofix?.fixKind
|
|
65
|
-
: undefined,
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
return { diagnostics };
|
|
70
|
-
}
|
|
71
|
-
catch (err) {
|
|
72
|
-
return {
|
|
73
|
-
diagnostics: [],
|
|
74
|
-
parseError: err instanceof Error ? err.message : String(err),
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
const eslintRunner = {
|
|
79
|
-
id: "eslint",
|
|
80
|
-
appliesTo: ["jsts"],
|
|
81
|
-
priority: PRIORITY.LINT_SECONDARY,
|
|
82
|
-
async run(ctx) {
|
|
83
|
-
const cwd = resolveRunnerCwd(ctx, "eslint");
|
|
84
|
-
const userHasConfig = hasEslintConfig(cwd);
|
|
85
|
-
// Only run if project has an ESLint config.
|
|
86
|
-
if (!userHasConfig) {
|
|
87
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
88
|
-
}
|
|
89
|
-
const cmd = resolveToolCommand(cwd, "eslint") ?? "eslint";
|
|
90
|
-
// Verify ESLint is actually executable (cached per cwd, see getEslintProbe).
|
|
91
|
-
if (!(await getEslintProbe(cmd)(cwd))) {
|
|
92
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
93
|
-
}
|
|
94
|
-
const result = await safeSpawnAsync(cmd, ["--format", "json", "--no-error-on-unmatched-pattern", ctx.filePath], { timeout: 30000, cwd });
|
|
95
|
-
// ESLint exits 2 on fatal/config errors — nothing was linted, so this
|
|
96
|
-
// is an unavailable run, not a clean or failed one.
|
|
97
|
-
if (result.status === 2) {
|
|
98
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
99
|
-
}
|
|
100
|
-
// ESLint exits 0 whenever nothing reached ERROR severity — that
|
|
101
|
-
// includes a run that found only warnings (#1954), which also prints a
|
|
102
|
-
// full JSON report. So parse stdout unconditionally and branch on the
|
|
103
|
-
// parsed diagnostic count instead of letting the exit code discard the
|
|
104
|
-
// warning case. Stderr is only a fallback for a failing run whose
|
|
105
|
-
// stdout went missing; parsing stderr noise on a healthy exit-0 run
|
|
106
|
-
// would turn deprecation chatter into spurious parse-error findings.
|
|
107
|
-
const stdout = result.stdout ?? "";
|
|
108
|
-
let raw = stdout;
|
|
109
|
-
if (raw.length === 0 && result.status !== 0) {
|
|
110
|
-
raw = result.stderr || "";
|
|
111
|
-
}
|
|
112
|
-
const parsed = parseEslintJson(raw, ctx.filePath);
|
|
113
|
-
if (parsed.parseError && raw.trim().length > 0) {
|
|
114
|
-
const preview = raw.replace(/\s+/g, " ").slice(0, 160);
|
|
115
|
-
return {
|
|
116
|
-
status: "failed",
|
|
117
|
-
diagnostics: [
|
|
118
|
-
{
|
|
119
|
-
id: "eslint:parse-error:1",
|
|
120
|
-
message: "ESLint JSON parse failed: " +
|
|
121
|
-
parsed.parseError +
|
|
122
|
-
(preview ? " (output preview: " + preview + ")" : ""),
|
|
123
|
-
filePath: ctx.filePath,
|
|
124
|
-
line: 1,
|
|
125
|
-
column: 1,
|
|
126
|
-
severity: "warning",
|
|
127
|
-
semantic: "warning",
|
|
128
|
-
tool: "eslint",
|
|
129
|
-
},
|
|
130
|
-
],
|
|
131
|
-
semantic: "warning",
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
|
-
const diagnostics = parsed.diagnostics;
|
|
135
|
-
if (diagnostics.length === 0) {
|
|
136
|
-
return { status: "succeeded", diagnostics: [], semantic: "none" };
|
|
137
|
-
}
|
|
138
|
-
const hasErrors = diagnostics.some((d) => d.semantic === "blocking");
|
|
139
|
-
// A warning-only result on exit 0 is ESLint's normal outcome, not a
|
|
140
|
-
// failure: exit 0 means nothing hit ERROR severity. Keying status off
|
|
141
|
-
// blocking severity plus exit code (the sibling convention from oxlint,
|
|
142
|
-
// biome-check, golangci-lint, rubocop) keeps plan.ts's fallback group
|
|
143
|
-
// ["eslint", "oxlint", "biome-check-json"] stopping at eslint instead
|
|
144
|
-
// of re-running oxlint and biome-check-json on every warning-only save.
|
|
145
|
-
// The findings reach delivery regardless of status — dispatcher.ts
|
|
146
|
-
// buckets by each diagnostic's own `semantic`.
|
|
147
|
-
return {
|
|
148
|
-
status: !hasErrors && result.status === 0 ? "succeeded" : "failed",
|
|
149
|
-
diagnostics,
|
|
150
|
-
semantic: hasErrors ? "blocking" : "warning",
|
|
151
|
-
};
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
export default eslintRunner;
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Fact-rules runner — executes all registered FactRule instances against
|
|
3
|
-
* the populated fact store. Each FactRule has its own appliesTo() guard
|
|
4
|
-
* so this runner can be registered broadly; rules self-select.
|
|
5
|
-
*
|
|
6
|
-
* Severity semantics follow each rule's own diagnostic output.
|
|
7
|
-
* Blocking rules surface on every write; warning-tier rules surface
|
|
8
|
-
* only during full scans (blockingOnly === false).
|
|
9
|
-
*/
|
|
10
|
-
import { PRIORITY } from "../priorities.js";
|
|
11
|
-
import { evaluateRules } from "../fact-rule-runner.js";
|
|
12
|
-
const factRulesRunner = {
|
|
13
|
-
id: "fact-rules",
|
|
14
|
-
appliesTo: ["jsts", "python", "go", "rust", "ruby", "shell", "cmake"],
|
|
15
|
-
priority: PRIORITY.GENERAL_ANALYSIS + 1,
|
|
16
|
-
async run(ctx) {
|
|
17
|
-
const diagnostics = evaluateRules(ctx);
|
|
18
|
-
if (diagnostics.length === 0) {
|
|
19
|
-
return { status: "succeeded", diagnostics: [], semantic: "none" };
|
|
20
|
-
}
|
|
21
|
-
const hasBlocking = diagnostics.some((d) => d.semantic === "blocking" || d.severity === "error");
|
|
22
|
-
return {
|
|
23
|
-
status: hasBlocking ? "failed" : "succeeded",
|
|
24
|
-
diagnostics,
|
|
25
|
-
semantic: hasBlocking ? "blocking" : "warning",
|
|
26
|
-
};
|
|
27
|
-
},
|
|
28
|
-
};
|
|
29
|
-
export default factRulesRunner;
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
2
|
-
import { resolveRunnerCwd } from "../../tool-cwd.js";
|
|
3
|
-
import { PRIORITY } from "../priorities.js";
|
|
4
|
-
import { createAvailabilityChecker } from "./utils/runner-helpers.js";
|
|
5
|
-
// fish_indent ships with fish — not separately installable, no managed fallback
|
|
6
|
-
const fishIndent = createAvailabilityChecker("fish_indent");
|
|
7
|
-
const fishIndentRunner = {
|
|
8
|
-
id: "fish-indent",
|
|
9
|
-
appliesTo: ["fish"],
|
|
10
|
-
priority: PRIORITY.FORMAT_AND_LINT_PRIMARY,
|
|
11
|
-
skipTestFiles: false,
|
|
12
|
-
async run(ctx) {
|
|
13
|
-
const cwd = resolveRunnerCwd(ctx, "fish-indent");
|
|
14
|
-
const available = await fishIndent.isAvailableAsync(cwd);
|
|
15
|
-
if (!available)
|
|
16
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
17
|
-
const cmd = fishIndent.getCommand(cwd);
|
|
18
|
-
if (!cmd)
|
|
19
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
20
|
-
// --check: exits 0 if already formatted, 1 if reformatting would change the file
|
|
21
|
-
const result = await safeSpawnAsync(cmd, ["--check", ctx.filePath], {
|
|
22
|
-
timeout: 10000,
|
|
23
|
-
cwd,
|
|
24
|
-
});
|
|
25
|
-
if (result.status === 0) {
|
|
26
|
-
return { status: "succeeded", diagnostics: [], semantic: "none" };
|
|
27
|
-
}
|
|
28
|
-
// Non-zero exit: either needs formatting or a parse error was reported on stderr
|
|
29
|
-
const stderrLine = (result.stderr ?? "").split("\n").find((l) => l.trim());
|
|
30
|
-
if (stderrLine) {
|
|
31
|
-
// Parse/syntax error — extract line number from "filename (line N): message" if present
|
|
32
|
-
const lineMatch = stderrLine.match(/\(line\s+(\d+)\)/);
|
|
33
|
-
const line = lineMatch ? Number(lineMatch[1]) : 1;
|
|
34
|
-
const diagnostics = [
|
|
35
|
-
{
|
|
36
|
-
id: `fish-indent-parse-${ctx.filePath}`,
|
|
37
|
-
message: `fish_indent: ${stderrLine.trim()}`,
|
|
38
|
-
filePath: ctx.filePath,
|
|
39
|
-
line,
|
|
40
|
-
column: 1,
|
|
41
|
-
severity: "error",
|
|
42
|
-
semantic: "blocking",
|
|
43
|
-
tool: "fish-indent",
|
|
44
|
-
rule: "fish-indent-parse-error",
|
|
45
|
-
},
|
|
46
|
-
];
|
|
47
|
-
return { status: "failed", diagnostics, semantic: "blocking" };
|
|
48
|
-
}
|
|
49
|
-
// Clean stderr — file just needs formatting
|
|
50
|
-
const diagnostics = [
|
|
51
|
-
{
|
|
52
|
-
id: `fish-indent-format-${ctx.filePath}`,
|
|
53
|
-
message: "Fish script is not formatted — run `fish_indent -w` to fix",
|
|
54
|
-
filePath: ctx.filePath,
|
|
55
|
-
line: 1,
|
|
56
|
-
column: 1,
|
|
57
|
-
severity: "warning",
|
|
58
|
-
semantic: "warning",
|
|
59
|
-
tool: "fish-indent",
|
|
60
|
-
rule: "fish-indent-unformatted",
|
|
61
|
-
fixable: true,
|
|
62
|
-
autoFixAvailable: false,
|
|
63
|
-
fixKind: "manual",
|
|
64
|
-
},
|
|
65
|
-
];
|
|
66
|
-
return { status: "succeeded", diagnostics, semantic: "warning" };
|
|
67
|
-
},
|
|
68
|
-
};
|
|
69
|
-
export default fishIndentRunner;
|
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
2
|
-
import { resolveRunnerCwd } from "../../tool-cwd.js";
|
|
3
|
-
import { createAvailabilityChecker } from "./utils/runner-helpers.js";
|
|
4
|
-
import { PRIORITY } from "../priorities.js";
|
|
5
|
-
const gleam = createAvailabilityChecker("gleam", ".exe");
|
|
6
|
-
function parseGleamOutput(raw, filePath) {
|
|
7
|
-
const diagnostics = [];
|
|
8
|
-
const lines = raw.split(/\r?\n/);
|
|
9
|
-
for (let i = 0; i < lines.length; i++) {
|
|
10
|
-
const location = lines[i].match(/^(.+?):(\d+):(\d+)$/);
|
|
11
|
-
if (!location)
|
|
12
|
-
continue;
|
|
13
|
-
const [, sourcePath, lineStr, colStr] = location;
|
|
14
|
-
if (!sourcePath.replace(/\\/g, "/").endsWith(filePath.replace(/\\/g, "/"))) {
|
|
15
|
-
continue;
|
|
16
|
-
}
|
|
17
|
-
const message = lines.slice(i + 1).find((line) => line.trim().length > 0);
|
|
18
|
-
diagnostics.push({
|
|
19
|
-
id: `gleam-check-${lineStr}-${colStr}`,
|
|
20
|
-
message: message?.trim() || "gleam check reported an error",
|
|
21
|
-
filePath,
|
|
22
|
-
line: Number.parseInt(lineStr, 10) || 1,
|
|
23
|
-
column: Number.parseInt(colStr, 10) || 1,
|
|
24
|
-
severity: "error",
|
|
25
|
-
semantic: "blocking",
|
|
26
|
-
tool: "gleam",
|
|
27
|
-
rule: "gleam-check",
|
|
28
|
-
fixable: false,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
return diagnostics;
|
|
32
|
-
}
|
|
33
|
-
function firstOutputLine(result) {
|
|
34
|
-
return `${result.stderr || ""}\n${result.stdout || ""}`
|
|
35
|
-
.trim()
|
|
36
|
-
.split(/\r?\n/, 1)[0]
|
|
37
|
-
.slice(0, 200);
|
|
38
|
-
}
|
|
39
|
-
const gleamCheckRunner = {
|
|
40
|
-
id: "gleam-check",
|
|
41
|
-
appliesTo: ["gleam"],
|
|
42
|
-
priority: PRIORITY.GENERAL_ANALYSIS,
|
|
43
|
-
skipTestFiles: false,
|
|
44
|
-
async run(ctx) {
|
|
45
|
-
const cwd = resolveRunnerCwd(ctx, "gleam-check");
|
|
46
|
-
if (!(await gleam.isAvailableAsync(cwd))) {
|
|
47
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
48
|
-
}
|
|
49
|
-
const cmd = gleam.getCommand(cwd);
|
|
50
|
-
const result = await safeSpawnAsync(cmd, ["check"], {
|
|
51
|
-
cwd,
|
|
52
|
-
timeout: 30000,
|
|
53
|
-
});
|
|
54
|
-
if (result.error && !result.stdout && !result.stderr) {
|
|
55
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
56
|
-
}
|
|
57
|
-
const diagnostics = parseGleamOutput(`${result.stderr || ""}\n${result.stdout || ""}`, ctx.filePath);
|
|
58
|
-
if (diagnostics.length === 0) {
|
|
59
|
-
if (result.status && result.status !== 0) {
|
|
60
|
-
return {
|
|
61
|
-
status: "failed",
|
|
62
|
-
diagnostics: [
|
|
63
|
-
{
|
|
64
|
-
id: "gleam-check-nonzero-no-diagnostics",
|
|
65
|
-
message: firstOutputLine(result) ||
|
|
66
|
-
"gleam check exited non-zero without structured diagnostics",
|
|
67
|
-
filePath: ctx.filePath,
|
|
68
|
-
severity: "error",
|
|
69
|
-
semantic: "blocking",
|
|
70
|
-
tool: "gleam",
|
|
71
|
-
rule: "gleam-check",
|
|
72
|
-
fixable: false,
|
|
73
|
-
},
|
|
74
|
-
],
|
|
75
|
-
semantic: "blocking",
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
return { status: "succeeded", diagnostics: [], semantic: "none" };
|
|
79
|
-
}
|
|
80
|
-
return {
|
|
81
|
-
status: "failed",
|
|
82
|
-
diagnostics,
|
|
83
|
-
semantic: "blocking",
|
|
84
|
-
};
|
|
85
|
-
},
|
|
86
|
-
};
|
|
87
|
-
export default gleamCheckRunner;
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Go vet runner for dispatch system
|
|
3
|
-
*
|
|
4
|
-
* Runs `go vet` for Go files to catch common mistakes.
|
|
5
|
-
*/
|
|
6
|
-
import { relative, resolve, sep, posix } from "node:path";
|
|
7
|
-
import { goClient } from "../../go-client.js";
|
|
8
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
9
|
-
import { resolveRunnerCwd } from "../../tool-cwd.js";
|
|
10
|
-
import { stripAnsi } from "../../sanitize.js";
|
|
11
|
-
import { skipUnlessToolRan } from "./utils/tool-failure.js";
|
|
12
|
-
import { parseGoVetOutput } from "./utils/diagnostic-parsers.js";
|
|
13
|
-
import { PRIORITY } from "../priorities.js";
|
|
14
|
-
const goVetRunner = {
|
|
15
|
-
id: "go-vet",
|
|
16
|
-
appliesTo: ["go"],
|
|
17
|
-
priority: PRIORITY.SPECIALIZED_ANALYSIS,
|
|
18
|
-
timeoutMs: 40_000,
|
|
19
|
-
async run(ctx) {
|
|
20
|
-
// Resolve go path using platform-aware lookup (handles system install paths on Windows)
|
|
21
|
-
const goExe = await goClient.findGoPathAsync();
|
|
22
|
-
if (!goExe) {
|
|
23
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
24
|
-
}
|
|
25
|
-
// Vet the package containing the file from the module root.
|
|
26
|
-
//
|
|
27
|
-
// `go vet <one-file.go>` compiles that file in isolation, so same-package
|
|
28
|
-
// symbols defined in sibling files read as false `undefined: X`, and when
|
|
29
|
-
// the spawn cwd is outside the module the run also reports
|
|
30
|
-
// `go.mod file not found` (#263). ctx.cwd is the go.mod module root
|
|
31
|
-
// (resolveLanguageRootForFile, markers ["go.mod"]), so vet the file's
|
|
32
|
-
// package from there.
|
|
33
|
-
const cwd = resolveRunnerCwd(ctx, "go-vet");
|
|
34
|
-
const fileRel = relative(cwd, ctx.filePath).split(sep).join(posix.sep);
|
|
35
|
-
const pkgPath = fileRel.startsWith("../")
|
|
36
|
-
? // File isn't under ctx.cwd (unexpected — ctx.cwd is the go.mod root).
|
|
37
|
-
// Vet the root package as a safe fallback rather than emit `./../x`;
|
|
38
|
-
// the filename filter below still prevents mis-attribution.
|
|
39
|
-
"."
|
|
40
|
-
: fileRel.includes("/")
|
|
41
|
-
? "./" + fileRel.slice(0, fileRel.lastIndexOf("/"))
|
|
42
|
-
: ".";
|
|
43
|
-
const result = await safeSpawnAsync(goExe, ["vet", pkgPath], {
|
|
44
|
-
timeout: 30000,
|
|
45
|
-
cwd,
|
|
46
|
-
});
|
|
47
|
-
const raw = stripAnsi(result.stdout + result.stderr);
|
|
48
|
-
// #1816: `go vet` exits nonzero both for "found problems" and for a
|
|
49
|
-
// toolchain failure it never got past — `go.mod file not found in
|
|
50
|
-
// current directory or any parent directory` is the one that bit us
|
|
51
|
-
// (#263). That prose carries no `file:line:col:` prefix, so it parsed to
|
|
52
|
-
// zero diagnostics and the file was reported CLEAN by a vet that never
|
|
53
|
-
// ran. The exit code cannot separate the two cases; the presence of a
|
|
54
|
-
// parsable diagnostic line can, so that is what the gate is handed.
|
|
55
|
-
const parsableLines = raw
|
|
56
|
-
.split("\n")
|
|
57
|
-
.filter((line) => /^.+?:\d+:\d+:/.test(line))
|
|
58
|
-
.join("\n");
|
|
59
|
-
const skipped = skipUnlessToolRan("go-vet", {
|
|
60
|
-
result,
|
|
61
|
-
output: parsableLines,
|
|
62
|
-
});
|
|
63
|
-
if (skipped)
|
|
64
|
-
return skipped;
|
|
65
|
-
if (result.status === 0 && !raw.trim()) {
|
|
66
|
-
return { status: "succeeded", diagnostics: [], semantic: "none" };
|
|
67
|
-
}
|
|
68
|
-
// createLineParser ignores the output filename and attributes every
|
|
69
|
-
// diagnostic to ctx.filePath, so keep only this file's lines — package
|
|
70
|
-
// vetting reports siblings too. Resolve each output path against the vet
|
|
71
|
-
// cwd before comparing, so go's path FORM (a leading `./` for the
|
|
72
|
-
// module-root package, an absolute path, `.` segments) can't cause the
|
|
73
|
-
// edited file's OWN diagnostics to be silently dropped.
|
|
74
|
-
const absTarget = resolve(ctx.filePath);
|
|
75
|
-
const relevant = raw
|
|
76
|
-
.split("\n")
|
|
77
|
-
.filter((line) => {
|
|
78
|
-
const m = line.match(/^(.+?):(\d+):(\d+):\s*(.+)/);
|
|
79
|
-
return m != null && resolve(cwd, m[1].trim()) === absTarget;
|
|
80
|
-
})
|
|
81
|
-
.join("\n");
|
|
82
|
-
const diagnostics = parseGoVetOutput(relevant, ctx.filePath);
|
|
83
|
-
// Edited file clean → succeeded: a sibling-file error no longer flags
|
|
84
|
-
// the edited file's turn (it surfaces when that file is itself edited).
|
|
85
|
-
return diagnostics.length > 0
|
|
86
|
-
? { status: "failed", diagnostics, semantic: "warning" }
|
|
87
|
-
: { status: "succeeded", diagnostics: [], semantic: "none" };
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
export default goVetRunner;
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* golangci-lint runner for dispatch system
|
|
3
|
-
*
|
|
4
|
-
* Runs golangci-lint when a .golangci.yml config is present.
|
|
5
|
-
* golangci-lint is the standard meta-linter for Go projects — it runs
|
|
6
|
-
* staticcheck, errcheck, gosimple, and many others in one pass.
|
|
7
|
-
*
|
|
8
|
-
* Gate: skips when no .golangci.yml/.golangci.yaml config is found (project
|
|
9
|
-
* relies on go-vet only). This avoids noisy default-rule runs on projects
|
|
10
|
-
* that haven't opted in.
|
|
11
|
-
*/
|
|
12
|
-
import * as path from "node:path";
|
|
13
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
14
|
-
import { resolveRunnerCwd } from "../../tool-cwd.js";
|
|
15
|
-
import { getLinterPolicyForCwd, hasGolangciConfig } from "../../tool-policy.js";
|
|
16
|
-
import { PRIORITY } from "../priorities.js";
|
|
17
|
-
import { createAvailabilityChecker, resolveAvailableOrInstall, } from "./utils/runner-helpers.js";
|
|
18
|
-
const golangci = createAvailabilityChecker("golangci-lint", ".exe");
|
|
19
|
-
/**
|
|
20
|
-
* Summarize a golangci-lint Replacement into a single-line fixSuggestion.
|
|
21
|
-
* Prefers the Inline rewrite (precise + short) over multi-line block
|
|
22
|
-
* replacements, and reports a delete-only fix when there's no new content.
|
|
23
|
-
* Returns undefined when there is no Replacement attached.
|
|
24
|
-
*/
|
|
25
|
-
function describeReplacement(replacement) {
|
|
26
|
-
if (!replacement)
|
|
27
|
-
return undefined;
|
|
28
|
-
if (replacement.Inline?.NewString !== undefined) {
|
|
29
|
-
return `Replace with: ${replacement.Inline.NewString}`;
|
|
30
|
-
}
|
|
31
|
-
if (replacement.NeedOnlyDelete)
|
|
32
|
-
return "Delete this code";
|
|
33
|
-
if (replacement.NewLines && replacement.NewLines.length > 0) {
|
|
34
|
-
const preview = replacement.NewLines[0].trim();
|
|
35
|
-
const hint = replacement.NewLines.length > 1
|
|
36
|
-
? ` (+${replacement.NewLines.length - 1} more lines)`
|
|
37
|
-
: "";
|
|
38
|
-
return `Replace with: ${preview}${hint}`;
|
|
39
|
-
}
|
|
40
|
-
return "Apply golangci-lint suggested fix";
|
|
41
|
-
}
|
|
42
|
-
function parseGolangciJson(raw, filePath) {
|
|
43
|
-
try {
|
|
44
|
-
const output = JSON.parse(raw);
|
|
45
|
-
if (!output.Issues)
|
|
46
|
-
return [];
|
|
47
|
-
const absFile = path.resolve(filePath);
|
|
48
|
-
return output.Issues.filter((issue) => path.resolve(issue.Pos.Filename) === absFile).map((issue) => {
|
|
49
|
-
const severity = issue.Severity === "error" ? "error" : "warning";
|
|
50
|
-
// golangci-lint's --out-format=json emits a Replacement object per
|
|
51
|
-
// issue when `golangci-lint run --fix` would deterministically
|
|
52
|
-
// rewrite the code. Mirror the rust-clippy structured-output path
|
|
53
|
-
// (commit 221b34d): propagate the field to fixable / fixSuggestion
|
|
54
|
-
// so the diagnostic routes through actionable-warnings.
|
|
55
|
-
const fixSuggestion = describeReplacement(issue.Replacement);
|
|
56
|
-
return {
|
|
57
|
-
id: `golangci:${issue.FromLinter}:${issue.Pos.Line}`,
|
|
58
|
-
message: `${issue.FromLinter}: ${issue.Text}`,
|
|
59
|
-
filePath,
|
|
60
|
-
line: issue.Pos.Line,
|
|
61
|
-
column: issue.Pos.Column,
|
|
62
|
-
severity,
|
|
63
|
-
semantic: severity === "error" ? "blocking" : "warning",
|
|
64
|
-
tool: "golangci-lint",
|
|
65
|
-
rule: issue.FromLinter,
|
|
66
|
-
defectClass: "correctness",
|
|
67
|
-
fixable: Boolean(issue.Replacement),
|
|
68
|
-
fixSuggestion,
|
|
69
|
-
};
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
catch {
|
|
73
|
-
return [];
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
// Exported for the parser unit tests (#112 golangci-lint slice).
|
|
77
|
-
export { parseGolangciJson };
|
|
78
|
-
const golangciRunner = {
|
|
79
|
-
id: "golangci-lint",
|
|
80
|
-
appliesTo: ["go"],
|
|
81
|
-
priority: PRIORITY.GENERAL_ANALYSIS,
|
|
82
|
-
timeoutMs: 90_000,
|
|
83
|
-
async run(ctx) {
|
|
84
|
-
const cwd = resolveRunnerCwd(ctx, "golangci-lint");
|
|
85
|
-
const policy = getLinterPolicyForCwd(ctx.filePath, cwd);
|
|
86
|
-
if (policy && !policy.preferredRunners.includes("golangci-lint")) {
|
|
87
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
88
|
-
}
|
|
89
|
-
// Only run if project has opted in via config file
|
|
90
|
-
if (!hasGolangciConfig(cwd)) {
|
|
91
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
92
|
-
}
|
|
93
|
-
const cmd = await resolveAvailableOrInstall(golangci, "golangci-lint", cwd);
|
|
94
|
-
if (!cmd)
|
|
95
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
96
|
-
// Run on the specific file. golangci-lint accepts file paths directly.
|
|
97
|
-
const result = await safeSpawnAsync(cmd, ["run", "--out-format=json", ctx.filePath], { timeout: 60000, cwd });
|
|
98
|
-
if (result.status === 0) {
|
|
99
|
-
return { status: "succeeded", diagnostics: [], semantic: "none" };
|
|
100
|
-
}
|
|
101
|
-
const diagnostics = parseGolangciJson(result.stdout, ctx.filePath);
|
|
102
|
-
let semantic = "none";
|
|
103
|
-
if (diagnostics.some((d) => d.semantic === "blocking")) {
|
|
104
|
-
semantic = "blocking";
|
|
105
|
-
}
|
|
106
|
-
else if (diagnostics.length > 0) {
|
|
107
|
-
semantic = "warning";
|
|
108
|
-
}
|
|
109
|
-
if (semantic === "none") {
|
|
110
|
-
// Non-zero exit but no parseable issues — likely a config/tool error
|
|
111
|
-
return { status: "skipped", diagnostics: [], semantic };
|
|
112
|
-
}
|
|
113
|
-
return {
|
|
114
|
-
status: semantic === "blocking" ? "failed" : "succeeded",
|
|
115
|
-
diagnostics,
|
|
116
|
-
semantic,
|
|
117
|
-
};
|
|
118
|
-
},
|
|
119
|
-
};
|
|
120
|
-
export default golangciRunner;
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import * as path from "node:path";
|
|
2
|
-
import { safeSpawnAsync } from "../../safe-spawn.js";
|
|
3
|
-
import { resolveRunnerCwd } from "../../tool-cwd.js";
|
|
4
|
-
import { getLinterPolicyForCwd } from "../../tool-policy.js";
|
|
5
|
-
import { PRIORITY } from "../priorities.js";
|
|
6
|
-
import { createAvailabilityChecker, resolveToolCommandWithInstallFallback, } from "./utils/runner-helpers.js";
|
|
7
|
-
import { parseToolRun } from "./utils/tool-failure.js";
|
|
8
|
-
import { finishParsedRun } from "./utils/tool-failure.js";
|
|
9
|
-
const hadolint = createAvailabilityChecker("hadolint", ".exe");
|
|
10
|
-
function parseHadolintOutput(raw, filePath) {
|
|
11
|
-
try {
|
|
12
|
-
const parsed = JSON.parse(raw);
|
|
13
|
-
if (!Array.isArray(parsed))
|
|
14
|
-
return [];
|
|
15
|
-
return parsed.map((item) => {
|
|
16
|
-
const severity = item.level === "error" ? "error" : "warning";
|
|
17
|
-
return {
|
|
18
|
-
id: `hadolint-${item.code}-${item.line}`,
|
|
19
|
-
message: `[${item.code}] ${item.message}`,
|
|
20
|
-
filePath,
|
|
21
|
-
line: item.line,
|
|
22
|
-
column: item.column ?? 1,
|
|
23
|
-
severity,
|
|
24
|
-
semantic: severity === "error" ? "blocking" : "warning",
|
|
25
|
-
tool: "hadolint",
|
|
26
|
-
rule: item.code,
|
|
27
|
-
fixable: false,
|
|
28
|
-
};
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
catch {
|
|
32
|
-
return [];
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
const hadolintRunner = {
|
|
36
|
-
id: "hadolint",
|
|
37
|
-
appliesTo: ["docker"],
|
|
38
|
-
priority: PRIORITY.GENERAL_ANALYSIS,
|
|
39
|
-
skipTestFiles: false,
|
|
40
|
-
async run(ctx) {
|
|
41
|
-
const cwd = resolveRunnerCwd(ctx, "hadolint");
|
|
42
|
-
const policy = getLinterPolicyForCwd(ctx.filePath, cwd);
|
|
43
|
-
if (policy && !policy.preferredRunners.includes("hadolint")) {
|
|
44
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
45
|
-
}
|
|
46
|
-
let cmd = null;
|
|
47
|
-
if (await hadolint.isAvailableAsync(cwd)) {
|
|
48
|
-
cmd = hadolint.getCommand(cwd);
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
cmd = await resolveToolCommandWithInstallFallback(cwd, "hadolint");
|
|
52
|
-
}
|
|
53
|
-
if (!cmd) {
|
|
54
|
-
return { status: "skipped", diagnostics: [], semantic: "none" };
|
|
55
|
-
}
|
|
56
|
-
const result = await safeSpawnAsync(cmd, ["--format", "json", "--no-fail", path.resolve(cwd, ctx.filePath)], { cwd });
|
|
57
|
-
// #1948: hadolint runs with `--no-fail`, so it exits 0 even when it finds
|
|
58
|
-
// something. A nonzero exit therefore means hadolint itself failed, and
|
|
59
|
-
// zero parsed diagnostics out of whatever it printed is a parser break.
|
|
60
|
-
const run = parseToolRun("hadolint", { result }, (out) => parseHadolintOutput(out, ctx.filePath));
|
|
61
|
-
if (run.skipped)
|
|
62
|
-
return run.skipped;
|
|
63
|
-
const diagnostics = run.diagnostics;
|
|
64
|
-
return finishParsedRun({
|
|
65
|
-
tool: "hadolint",
|
|
66
|
-
ctx,
|
|
67
|
-
result,
|
|
68
|
-
diagnostics,
|
|
69
|
-
classify: (diagnostics) => {
|
|
70
|
-
const hasErrors = diagnostics.some((d) => d.severity === "error");
|
|
71
|
-
return {
|
|
72
|
-
status: "failed",
|
|
73
|
-
semantic: hasErrors ? "blocking" : "warning",
|
|
74
|
-
};
|
|
75
|
-
},
|
|
76
|
-
});
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
export default hadolintRunner;
|