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,449 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Workspace / monorepo module scanner
|
|
3
|
-
*
|
|
4
|
-
* Detects monorepo structure from common manifest files and builds a
|
|
5
|
-
* module-level dependency graph for cascade downstream analysis.
|
|
6
|
-
*/
|
|
7
|
-
import * as fs from "node:fs";
|
|
8
|
-
import * as path from "node:path";
|
|
9
|
-
import { hasCargoWorkspaceTable, readCargoDependencyNames, readCargoPackageName, readCargoWorkspaceMembers, } from "../cargo-manifest.js";
|
|
10
|
-
import { getProjectIgnoreMatcher, isExcludedDirName, } from "../file-utils.js";
|
|
11
|
-
import { normalizeMapKey } from "../path-utils.js";
|
|
12
|
-
import { getWorkspaceManifestMarkers } from "../workspace-topology.js";
|
|
13
|
-
// Cap on candidate sub-directories probed per workspace glob level (#262).
|
|
14
|
-
const MAX_WORKSPACE_CANDIDATES = 5_000;
|
|
15
|
-
const SOURCE_EXTS = new Set([
|
|
16
|
-
".ts",
|
|
17
|
-
".tsx",
|
|
18
|
-
".js",
|
|
19
|
-
".jsx",
|
|
20
|
-
".py",
|
|
21
|
-
".go",
|
|
22
|
-
".rs",
|
|
23
|
-
".rb",
|
|
24
|
-
".cpp",
|
|
25
|
-
".c",
|
|
26
|
-
".cc",
|
|
27
|
-
".h",
|
|
28
|
-
".hpp",
|
|
29
|
-
]);
|
|
30
|
-
function readJsonSafe(filePath) {
|
|
31
|
-
try {
|
|
32
|
-
return JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
33
|
-
}
|
|
34
|
-
catch {
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Presence checks for the four workspace-manifest markers are sourced from
|
|
40
|
-
* the shared workspace-topology marker index (#806) — one `readdir` pass at
|
|
41
|
-
* `cwd` collects them alongside `.pi-lens.json`/`tsconfig.json` other
|
|
42
|
-
* consumers need for the SAME directory, instead of four independent
|
|
43
|
-
* `existsSync` probes. Manifest CONTENT (workspace globs, the `[workspace]`
|
|
44
|
-
* TOML section, the `workspaces` package.json field) is still read and
|
|
45
|
-
* parsed here — the topology index only answers "is the marker present".
|
|
46
|
-
*/
|
|
47
|
-
function detectWorkspaceType(cwd) {
|
|
48
|
-
const markers = getWorkspaceManifestMarkers(cwd);
|
|
49
|
-
if (markers.hasPnpmWorkspaceYaml)
|
|
50
|
-
return "pnpm";
|
|
51
|
-
if (markers.hasGoWork)
|
|
52
|
-
return "go";
|
|
53
|
-
if (markers.hasCargoToml) {
|
|
54
|
-
try {
|
|
55
|
-
const content = fs.readFileSync(path.join(cwd, "Cargo.toml"), "utf-8");
|
|
56
|
-
// The shared presence check (#2498) — see its own doc comment in
|
|
57
|
-
// cargo-manifest.ts for why a bare `.includes`/regex reimplementation
|
|
58
|
-
// of this test is wrong (comment/sentinel handling).
|
|
59
|
-
if (hasCargoWorkspaceTable(content)) {
|
|
60
|
-
return "cargo";
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
catch { }
|
|
64
|
-
}
|
|
65
|
-
if (markers.hasPackageJson) {
|
|
66
|
-
const pkgJson = readJsonSafe(path.join(cwd, "package.json"));
|
|
67
|
-
const workspaces = normalizeWorkspacePatterns(pkgJson?.workspaces);
|
|
68
|
-
if (workspaces.length > 0)
|
|
69
|
-
return "npm";
|
|
70
|
-
}
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
function stripQuotes(value) {
|
|
74
|
-
return value.trim().replace(/^['"]|['"]$/g, "");
|
|
75
|
-
}
|
|
76
|
-
function normalizeWorkspacePatterns(value) {
|
|
77
|
-
if (Array.isArray(value))
|
|
78
|
-
return value.map(stripQuotes).filter(Boolean);
|
|
79
|
-
if (value?.packages && Array.isArray(value.packages)) {
|
|
80
|
-
return value.packages.map(stripQuotes).filter(Boolean);
|
|
81
|
-
}
|
|
82
|
-
return [];
|
|
83
|
-
}
|
|
84
|
-
function expandWorkspacePattern(cwd, pattern) {
|
|
85
|
-
const normalized = stripQuotes(pattern.trim()).replace(/\\/g, "/");
|
|
86
|
-
if (!normalized || normalized.startsWith("!"))
|
|
87
|
-
return [];
|
|
88
|
-
const starIndex = normalized.indexOf("*");
|
|
89
|
-
if (starIndex === -1) {
|
|
90
|
-
const root = path.resolve(cwd, normalized);
|
|
91
|
-
return fs.existsSync(path.join(root, "package.json")) ||
|
|
92
|
-
fs.existsSync(path.join(root, "Cargo.toml")) ||
|
|
93
|
-
fs.existsSync(path.join(root, "go.mod"))
|
|
94
|
-
? [root]
|
|
95
|
-
: [];
|
|
96
|
-
}
|
|
97
|
-
// Support the common workspace forms: packages/* and apps/*.
|
|
98
|
-
const prefix = normalized.slice(0, starIndex).replace(/\/$/, "");
|
|
99
|
-
const baseDir = path.resolve(cwd, prefix || ".");
|
|
100
|
-
let entries = [];
|
|
101
|
-
try {
|
|
102
|
-
entries = fs.readdirSync(baseDir, { withFileTypes: true });
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
return [];
|
|
106
|
-
}
|
|
107
|
-
const ignoreMatcher = getProjectIgnoreMatcher(cwd);
|
|
108
|
-
return (entries
|
|
109
|
-
.filter((entry) => {
|
|
110
|
-
const fullPath = path.join(baseDir, entry.name);
|
|
111
|
-
return (entry.isDirectory() &&
|
|
112
|
-
!isExcludedDirName(entry.name) &&
|
|
113
|
-
!ignoreMatcher.isIgnored(fullPath, true));
|
|
114
|
-
})
|
|
115
|
-
// Bound the manifest-probe fan-out so a pathological single directory
|
|
116
|
-
// can't trigger an unbounded existsSync sweep (#262).
|
|
117
|
-
.slice(0, MAX_WORKSPACE_CANDIDATES)
|
|
118
|
-
.map((entry) => path.join(baseDir, entry.name))
|
|
119
|
-
.filter((root) => fs.existsSync(path.join(root, "package.json")) ||
|
|
120
|
-
fs.existsSync(path.join(root, "Cargo.toml")) ||
|
|
121
|
-
fs.existsSync(path.join(root, "go.mod"))));
|
|
122
|
-
}
|
|
123
|
-
function depsFromPackageJson(pkgJson) {
|
|
124
|
-
return Object.keys({
|
|
125
|
-
...pkgJson.dependencies,
|
|
126
|
-
...pkgJson.devDependencies,
|
|
127
|
-
...pkgJson.peerDependencies,
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
function extractYamlList(content, key) {
|
|
131
|
-
const values = [];
|
|
132
|
-
let inList = false;
|
|
133
|
-
for (const rawLine of content.split(/\r?\n/)) {
|
|
134
|
-
const trimmed = rawLine.trim();
|
|
135
|
-
if (!trimmed || trimmed.startsWith("#"))
|
|
136
|
-
continue;
|
|
137
|
-
if (!inList) {
|
|
138
|
-
if (trimmed === `${key}:`)
|
|
139
|
-
inList = true;
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
if (trimmed.startsWith("-")) {
|
|
143
|
-
const value = stripQuotes(trimmed.slice(1).trim()).replace(/\/$/, "");
|
|
144
|
-
if (value)
|
|
145
|
-
values.push(value);
|
|
146
|
-
continue;
|
|
147
|
-
}
|
|
148
|
-
// A new top-level key ends the list.
|
|
149
|
-
if (!rawLine.startsWith(" ") && !rawLine.startsWith("\t"))
|
|
150
|
-
break;
|
|
151
|
-
}
|
|
152
|
-
return values;
|
|
153
|
-
}
|
|
154
|
-
function moduleFromPackageJson(cwd, pkgRoot) {
|
|
155
|
-
const pkgJson = readJsonSafe(path.join(pkgRoot, "package.json"));
|
|
156
|
-
if (!pkgJson?.name)
|
|
157
|
-
return null;
|
|
158
|
-
return {
|
|
159
|
-
name: pkgJson.name,
|
|
160
|
-
root: normalizeMapKey(pkgRoot),
|
|
161
|
-
relativePath: path.relative(cwd, pkgRoot).replace(/\\/g, "/"),
|
|
162
|
-
entrypoints: pkgJson.main ? [pkgJson.main] : ["index.js"],
|
|
163
|
-
internalDeps: [],
|
|
164
|
-
externalDeps: depsFromPackageJson(pkgJson),
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
function scanPnpmModules(cwd) {
|
|
168
|
-
let patterns = [];
|
|
169
|
-
try {
|
|
170
|
-
const content = fs.readFileSync(path.join(cwd, "pnpm-workspace.yaml"), "utf-8");
|
|
171
|
-
patterns = extractYamlList(content, "packages");
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
return [];
|
|
175
|
-
}
|
|
176
|
-
return patterns
|
|
177
|
-
.flatMap((pattern) => expandWorkspacePattern(cwd, pattern))
|
|
178
|
-
.map((pkgRoot) => moduleFromPackageJson(cwd, pkgRoot))
|
|
179
|
-
.filter((mod) => mod !== null);
|
|
180
|
-
}
|
|
181
|
-
function scanNpmModules(cwd) {
|
|
182
|
-
const pkgJson = readJsonSafe(path.join(cwd, "package.json"));
|
|
183
|
-
const patterns = normalizeWorkspacePatterns(pkgJson?.workspaces);
|
|
184
|
-
return patterns
|
|
185
|
-
.flatMap((pattern) => expandWorkspacePattern(cwd, pattern))
|
|
186
|
-
.map((pkgRoot) => moduleFromPackageJson(cwd, pkgRoot))
|
|
187
|
-
.filter((mod) => mod !== null);
|
|
188
|
-
}
|
|
189
|
-
function scanCargoModules(cwd) {
|
|
190
|
-
let members = [];
|
|
191
|
-
try {
|
|
192
|
-
const content = fs.readFileSync(path.join(cwd, "Cargo.toml"), "utf-8");
|
|
193
|
-
members = readCargoWorkspaceMembers(content);
|
|
194
|
-
}
|
|
195
|
-
catch {
|
|
196
|
-
return [];
|
|
197
|
-
}
|
|
198
|
-
const modules = [];
|
|
199
|
-
for (const member of members) {
|
|
200
|
-
const pkgRoot = path.resolve(cwd, member);
|
|
201
|
-
const memberToml = path.join(pkgRoot, "Cargo.toml");
|
|
202
|
-
let name = "";
|
|
203
|
-
let deps = [];
|
|
204
|
-
try {
|
|
205
|
-
const content = fs.readFileSync(memberToml, "utf-8");
|
|
206
|
-
name = readCargoPackageName(content) ?? "";
|
|
207
|
-
deps = readCargoDependencyNames(content);
|
|
208
|
-
}
|
|
209
|
-
catch {
|
|
210
|
-
continue;
|
|
211
|
-
}
|
|
212
|
-
if (!name)
|
|
213
|
-
continue;
|
|
214
|
-
modules.push({
|
|
215
|
-
name,
|
|
216
|
-
root: normalizeMapKey(pkgRoot),
|
|
217
|
-
relativePath: path.relative(cwd, pkgRoot).replace(/\\/g, "/"),
|
|
218
|
-
entrypoints: ["src/lib.rs", "src/main.rs"],
|
|
219
|
-
internalDeps: [],
|
|
220
|
-
externalDeps: deps,
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
return modules;
|
|
224
|
-
}
|
|
225
|
-
function scanGoModules(cwd) {
|
|
226
|
-
let dirs = [];
|
|
227
|
-
try {
|
|
228
|
-
const content = fs.readFileSync(path.join(cwd, "go.work"), "utf-8");
|
|
229
|
-
dirs = [...content.matchAll(/(?:^|\s)(\.\/?[^\s)]+)/gm)].map((m) => m[1]);
|
|
230
|
-
}
|
|
231
|
-
catch {
|
|
232
|
-
return [];
|
|
233
|
-
}
|
|
234
|
-
const modules = [];
|
|
235
|
-
for (const dir of dirs) {
|
|
236
|
-
const pkgRoot = path.resolve(cwd, dir);
|
|
237
|
-
let name = "";
|
|
238
|
-
try {
|
|
239
|
-
const content = fs.readFileSync(path.join(pkgRoot, "go.mod"), "utf-8");
|
|
240
|
-
const match = content.match(/^module\s+(\S+)/m);
|
|
241
|
-
if (match)
|
|
242
|
-
name = match[1];
|
|
243
|
-
}
|
|
244
|
-
catch {
|
|
245
|
-
continue;
|
|
246
|
-
}
|
|
247
|
-
if (!name)
|
|
248
|
-
continue;
|
|
249
|
-
modules.push({
|
|
250
|
-
name,
|
|
251
|
-
root: normalizeMapKey(pkgRoot),
|
|
252
|
-
relativePath: path.relative(cwd, pkgRoot).replace(/\\/g, "/"),
|
|
253
|
-
entrypoints: ["."],
|
|
254
|
-
internalDeps: [],
|
|
255
|
-
externalDeps: [],
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
return modules;
|
|
259
|
-
}
|
|
260
|
-
function resolveInternalDeps(modules) {
|
|
261
|
-
const nameSet = new Set(modules.map((m) => m.name));
|
|
262
|
-
for (const mod of modules) {
|
|
263
|
-
const internal = [];
|
|
264
|
-
const external = [];
|
|
265
|
-
for (const dep of mod.externalDeps) {
|
|
266
|
-
if (nameSet.has(dep))
|
|
267
|
-
internal.push(dep);
|
|
268
|
-
else
|
|
269
|
-
external.push(dep);
|
|
270
|
-
}
|
|
271
|
-
mod.internalDeps = internal;
|
|
272
|
-
mod.externalDeps = external;
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
function buildDependents(modules) {
|
|
276
|
-
const dependents = new Map();
|
|
277
|
-
for (const mod of modules) {
|
|
278
|
-
for (const dep of mod.internalDeps) {
|
|
279
|
-
const list = dependents.get(dep) ?? [];
|
|
280
|
-
list.push(mod.name);
|
|
281
|
-
dependents.set(dep, list);
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
return dependents;
|
|
285
|
-
}
|
|
286
|
-
let _moduleGraphCache = null;
|
|
287
|
-
/**
|
|
288
|
-
* Build a module-level dependency graph for the workspace at cwd.
|
|
289
|
-
* Cached per session (cleared when cwd changes).
|
|
290
|
-
*/
|
|
291
|
-
export function buildModuleGraph(cwd) {
|
|
292
|
-
if (_moduleGraphCache && _moduleGraphCache.cwd === cwd) {
|
|
293
|
-
return _moduleGraphCache.graph;
|
|
294
|
-
}
|
|
295
|
-
const type = detectWorkspaceType(cwd);
|
|
296
|
-
if (!type)
|
|
297
|
-
return null;
|
|
298
|
-
let modules = [];
|
|
299
|
-
switch (type) {
|
|
300
|
-
case "pnpm":
|
|
301
|
-
modules = scanPnpmModules(cwd);
|
|
302
|
-
break;
|
|
303
|
-
case "npm":
|
|
304
|
-
modules = scanNpmModules(cwd);
|
|
305
|
-
break;
|
|
306
|
-
case "cargo":
|
|
307
|
-
modules = scanCargoModules(cwd);
|
|
308
|
-
break;
|
|
309
|
-
case "go":
|
|
310
|
-
modules = scanGoModules(cwd);
|
|
311
|
-
break;
|
|
312
|
-
}
|
|
313
|
-
if (modules.length === 0)
|
|
314
|
-
return null;
|
|
315
|
-
resolveInternalDeps(modules);
|
|
316
|
-
const graph = {
|
|
317
|
-
root: cwd,
|
|
318
|
-
modules: new Map(modules.map((m) => [m.name, m])),
|
|
319
|
-
dependents: buildDependents(modules),
|
|
320
|
-
};
|
|
321
|
-
_moduleGraphCache = { cwd, graph };
|
|
322
|
-
return graph;
|
|
323
|
-
}
|
|
324
|
-
export function clearModuleGraphCache() {
|
|
325
|
-
_moduleGraphCache = null;
|
|
326
|
-
_moduleSourceFilesMemo.clear();
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Find the module that owns a given file path.
|
|
330
|
-
*/
|
|
331
|
-
export function findModuleForPath(graph, filePath) {
|
|
332
|
-
const normalized = normalizeMapKey(filePath);
|
|
333
|
-
let best;
|
|
334
|
-
for (const mod of graph.modules.values()) {
|
|
335
|
-
if (normalized === mod.root || normalized.startsWith(`${mod.root}/`)) {
|
|
336
|
-
if (!best || mod.root.length > best.root.length)
|
|
337
|
-
best = mod;
|
|
338
|
-
}
|
|
339
|
-
}
|
|
340
|
-
return best;
|
|
341
|
-
}
|
|
342
|
-
/**
|
|
343
|
-
* Get all transitive downstream dependent module names for a given module.
|
|
344
|
-
*/
|
|
345
|
-
export function getDownstreamModules(graph, moduleName) {
|
|
346
|
-
const downstream = new Set();
|
|
347
|
-
const queue = [moduleName];
|
|
348
|
-
while (queue.length > 0) {
|
|
349
|
-
const current = queue.shift();
|
|
350
|
-
for (const dep of graph.dependents.get(current) ?? []) {
|
|
351
|
-
if (!downstream.has(dep)) {
|
|
352
|
-
downstream.add(dep);
|
|
353
|
-
queue.push(dep);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return [...downstream];
|
|
358
|
-
}
|
|
359
|
-
const _moduleSourceFilesMemo = new Map();
|
|
360
|
-
const MTIME_GRANULARITY_GUARD_MS = 2_000;
|
|
361
|
-
function isMemoEntryFresh(entry) {
|
|
362
|
-
const validatedAt = Date.now();
|
|
363
|
-
for (const { dir, mtimeMs, stampedAt } of entry.dirs) {
|
|
364
|
-
if (validatedAt - stampedAt < MTIME_GRANULARITY_GUARD_MS)
|
|
365
|
-
return false;
|
|
366
|
-
try {
|
|
367
|
-
if (fs.statSync(dir).mtimeMs !== mtimeMs)
|
|
368
|
-
return false;
|
|
369
|
-
}
|
|
370
|
-
catch {
|
|
371
|
-
return false;
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
return true;
|
|
375
|
-
}
|
|
376
|
-
/**
|
|
377
|
-
* Get representative source files in a module. Memoized per module root (see
|
|
378
|
-
* above) — the returned array is a copy; mutating it does not affect the memo.
|
|
379
|
-
*/
|
|
380
|
-
export function getModuleSourceFiles(moduleRoot, maxFiles = 20) {
|
|
381
|
-
const root = normalizeMapKey(moduleRoot);
|
|
382
|
-
const ignoreMatcher = getProjectIgnoreMatcher(root);
|
|
383
|
-
const cached = _moduleSourceFilesMemo.get(root);
|
|
384
|
-
if (cached &&
|
|
385
|
-
cached.maxFiles === maxFiles &&
|
|
386
|
-
cached.matcher === ignoreMatcher &&
|
|
387
|
-
isMemoEntryFresh(cached)) {
|
|
388
|
-
return [...cached.files];
|
|
389
|
-
}
|
|
390
|
-
const files = [];
|
|
391
|
-
const dirs = [];
|
|
392
|
-
let allDirsStamped = true;
|
|
393
|
-
const visit = (dir, depth) => {
|
|
394
|
-
if (files.length >= maxFiles || depth > 4)
|
|
395
|
-
return;
|
|
396
|
-
let entries = [];
|
|
397
|
-
try {
|
|
398
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
399
|
-
}
|
|
400
|
-
catch {
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
// Stamp AFTER the readdir: a change landing between readdir and stat
|
|
404
|
-
// records the newer mtime, so validation re-walks (fail-safe direction).
|
|
405
|
-
try {
|
|
406
|
-
dirs.push({
|
|
407
|
-
dir,
|
|
408
|
-
mtimeMs: fs.statSync(dir).mtimeMs,
|
|
409
|
-
stampedAt: Date.now(),
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
catch {
|
|
413
|
-
allDirsStamped = false;
|
|
414
|
-
}
|
|
415
|
-
entries.sort((a, b) => a.name.localeCompare(b.name));
|
|
416
|
-
for (const entry of entries) {
|
|
417
|
-
if (files.length >= maxFiles)
|
|
418
|
-
break;
|
|
419
|
-
const fullPath = path.join(dir, entry.name);
|
|
420
|
-
if (entry.isDirectory()) {
|
|
421
|
-
if (!isExcludedDirName(entry.name) &&
|
|
422
|
-
!ignoreMatcher.isIgnored(fullPath, true)) {
|
|
423
|
-
visit(fullPath, depth + 1);
|
|
424
|
-
}
|
|
425
|
-
continue;
|
|
426
|
-
}
|
|
427
|
-
if (!entry.isFile())
|
|
428
|
-
continue;
|
|
429
|
-
// #1974: extension gate before isIgnored — isIgnored recompiles
|
|
430
|
-
// minimatch patterns per ancestor dir per call, so it should only run
|
|
431
|
-
// for files the cheap extension check already flags as source.
|
|
432
|
-
if (!SOURCE_EXTS.has(path.extname(entry.name).toLowerCase()))
|
|
433
|
-
continue;
|
|
434
|
-
if (ignoreMatcher.isIgnored(fullPath, false))
|
|
435
|
-
continue;
|
|
436
|
-
files.push(normalizeMapKey(fullPath));
|
|
437
|
-
}
|
|
438
|
-
};
|
|
439
|
-
visit(root, 0);
|
|
440
|
-
if (allDirsStamped) {
|
|
441
|
-
_moduleSourceFilesMemo.set(root, {
|
|
442
|
-
files: [...files],
|
|
443
|
-
maxFiles,
|
|
444
|
-
dirs,
|
|
445
|
-
matcher: ignoreMatcher,
|
|
446
|
-
});
|
|
447
|
-
}
|
|
448
|
-
return files;
|
|
449
|
-
}
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
import * as path from "node:path";
|
|
2
|
-
import { isTestMode } from "./env-utils.js";
|
|
3
|
-
import { getGlobalPiLensLogDir } from "./probe-home-state.js";
|
|
4
|
-
import { getMaxLogSizeMB } from "./log-cleanup.js";
|
|
5
|
-
import { createNdjsonLogger } from "./ndjson-logger.js";
|
|
6
|
-
import { normalizeFilePath } from "./path-utils.js";
|
|
7
|
-
import { getTurnId } from "./turn-context.js";
|
|
8
|
-
const REVIEW_GRAPH_LOG_DIR = getGlobalPiLensLogDir();
|
|
9
|
-
const REVIEW_GRAPH_LOG_FILE = path.join(REVIEW_GRAPH_LOG_DIR, "review-graph.log");
|
|
10
|
-
// Bounded like every other global sink (#2505) — see sessionstart-logger.
|
|
11
|
-
const writer = createNdjsonLogger({
|
|
12
|
-
filePath: REVIEW_GRAPH_LOG_FILE,
|
|
13
|
-
maxBytes: getMaxLogSizeMB() * 1024 * 1024,
|
|
14
|
-
backupPath: `${REVIEW_GRAPH_LOG_FILE}.1`,
|
|
15
|
-
});
|
|
16
|
-
/**
|
|
17
|
-
* Build the one canonical graph metadata shape used by build and persist logs.
|
|
18
|
-
* Counts come from the graph instance; source-file count may use the exact
|
|
19
|
-
* signature-map count when the build has one, otherwise the graph file index.
|
|
20
|
-
*/
|
|
21
|
-
export function makeReviewGraphBuildMetadata(graph, options = {}) {
|
|
22
|
-
return {
|
|
23
|
-
...(options.buildId === undefined ? {} : { buildId: options.buildId }),
|
|
24
|
-
...(graph.buildGeneration === undefined
|
|
25
|
-
? {}
|
|
26
|
-
: { graphGeneration: graph.buildGeneration }),
|
|
27
|
-
builtAt: graph.builtAt,
|
|
28
|
-
...(options.projectSeq === undefined
|
|
29
|
-
? {}
|
|
30
|
-
: { projectSeq: options.projectSeq }),
|
|
31
|
-
...(options.seqHint === undefined ? {} : { seqHint: options.seqHint }),
|
|
32
|
-
...(options.mode === undefined ? {} : { mode: options.mode }),
|
|
33
|
-
sourceFiles: options.sourceFileCount ?? graph.fileNodes.size,
|
|
34
|
-
...(options.sourceFileCountTruncated ||
|
|
35
|
-
graph.persistCoverage?.sourceFilesTruncated
|
|
36
|
-
? { sourceFilesTruncated: true }
|
|
37
|
-
: {}),
|
|
38
|
-
...(options.pathNormalizeCalls === undefined
|
|
39
|
-
? {}
|
|
40
|
-
: { pathNormalizeCalls: options.pathNormalizeCalls }),
|
|
41
|
-
nodes: graph.nodes.size,
|
|
42
|
-
edges: graph.edges.length,
|
|
43
|
-
...(graph.persistCoverage
|
|
44
|
-
? { persistCoverage: graph.persistCoverage }
|
|
45
|
-
: {}),
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* #2141: call sites feed this a mix of raw `cwd` params and already-normalized
|
|
50
|
-
* cache keys (`normalizeMapKey(path.resolve(cwd))`), so the same project root
|
|
51
|
-
* showed up in the log as both `C:\...\pi-free` and `C:/.../pi-free`. Rather
|
|
52
|
-
* than auditing every call site, normalize once here — the single emit
|
|
53
|
-
* seam — matching the form `normalizeFilePath` already produces for every
|
|
54
|
-
* other structured log's `cwd` field (bus-publish, disposition-publish,
|
|
55
|
-
* diagnostics-publish, format-events-publish all normalize at their publish
|
|
56
|
-
* call sites; this pulls the same conversion in-house so no future call site
|
|
57
|
-
* can regress it).
|
|
58
|
-
*/
|
|
59
|
-
export function logReviewGraph(entry) {
|
|
60
|
-
if (isTestMode()) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
writer.log({
|
|
64
|
-
ts: new Date().toISOString(),
|
|
65
|
-
...entry,
|
|
66
|
-
cwd: normalizeFilePath(entry.cwd),
|
|
67
|
-
pid: process.pid,
|
|
68
|
-
turnId: getTurnId(),
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
export function getReviewGraphLogPath() {
|
|
72
|
-
return REVIEW_GRAPH_LOG_FILE;
|
|
73
|
-
}
|
|
74
|
-
/** Resolve once all enqueued review-graph writes are on disk (tests/shutdown). */
|
|
75
|
-
export function flushReviewGraphLog() {
|
|
76
|
-
return writer.flush();
|
|
77
|
-
}
|
|
78
|
-
/** Teardown-only: force queued entries to disk before the process exits. */
|
|
79
|
-
export function flushReviewGraphLogSync() {
|
|
80
|
-
writer.flushSync();
|
|
81
|
-
}
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ruff Client for pi-lens
|
|
3
|
-
*
|
|
4
|
-
* Fast Python linting and formatting via Ruff CLI.
|
|
5
|
-
* Replaces flake8, pylint, isort, black, pyupgrade.
|
|
6
|
-
*
|
|
7
|
-
* Requires: pip install ruff
|
|
8
|
-
* Docs: https://docs.astral.sh/ruff/
|
|
9
|
-
*/
|
|
10
|
-
import { createSubsystemLogger } from "./extension-log.js";
|
|
11
|
-
import * as fs from "node:fs";
|
|
12
|
-
import * as path from "node:path";
|
|
13
|
-
import { createAvailabilityChecker, resolveAvailableOrInstall, } from "./dispatch/runners/utils/runner-helpers.js";
|
|
14
|
-
import { isFileKind } from "./file-kinds.js";
|
|
15
|
-
import { safeSpawnAsync } from "./safe-spawn.js";
|
|
16
|
-
import { resolveToolCwd } from "./tool-cwd.js";
|
|
17
|
-
import { ruffConfigArgs } from "./tool-policy.js";
|
|
18
|
-
// --- Client ---
|
|
19
|
-
const ruffAvailability = createAvailabilityChecker("ruff", ".exe");
|
|
20
|
-
export class RuffClient {
|
|
21
|
-
ruffCommand = "ruff";
|
|
22
|
-
log;
|
|
23
|
-
constructor(verbose = false) {
|
|
24
|
-
this.log = verbose ? createSubsystemLogger("ruff") : () => { };
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Check if ruff CLI is available, auto-install if not.
|
|
28
|
-
*
|
|
29
|
-
* Re-entrancy safe: the shared availability seam deduplicates the complete
|
|
30
|
-
* probe/auto-install transaction per cwd and tool, so concurrent callers do
|
|
31
|
-
* not duplicate installation attempts.
|
|
32
|
-
*/
|
|
33
|
-
async ensureAvailable() {
|
|
34
|
-
const resolved = await resolveAvailableOrInstall(ruffAvailability, "ruff", process.cwd());
|
|
35
|
-
if (!resolved)
|
|
36
|
-
return false;
|
|
37
|
-
this.ruffCommand = resolved;
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Check if a file is a Python file
|
|
42
|
-
*/
|
|
43
|
-
isPythonFile(filePath) {
|
|
44
|
-
return isFileKind(filePath, "python");
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Async auto-fix variant for pipeline use (non-blocking spawn).
|
|
48
|
-
* `cwd` is the dispatch language root. It is the seam's starting point,
|
|
49
|
-
* not the answer: `resolveToolCwd` walks from the file to the nearest
|
|
50
|
-
* `pyproject.toml`/`ruff.toml`/`.ruff.toml` at or above it, capped inside
|
|
51
|
-
* `cwd` (and at `$HOME` when there is none), so a file in a nested package
|
|
52
|
-
* gets that package's config rather than the workspace-root one.
|
|
53
|
-
*/
|
|
54
|
-
async fixFileAsync(filePath, cwd) {
|
|
55
|
-
if (!(await this.ensureAvailable())) {
|
|
56
|
-
return {
|
|
57
|
-
success: false,
|
|
58
|
-
changed: false,
|
|
59
|
-
fixed: 0,
|
|
60
|
-
error: "Ruff not available",
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
const absolutePath = path.resolve(filePath);
|
|
64
|
-
if (!fs.existsSync(absolutePath)) {
|
|
65
|
-
return {
|
|
66
|
-
success: false,
|
|
67
|
-
changed: false,
|
|
68
|
-
fixed: 0,
|
|
69
|
-
error: "File not found",
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
try {
|
|
73
|
-
const before = await fs.promises.readFile(absolutePath, "utf-8");
|
|
74
|
-
// #2894: the root ruff resolves its config from now comes from the
|
|
75
|
-
// shared seam, not a local `cwd ?? path.dirname(file)`. `tool-policy.ts`
|
|
76
|
-
// requires the lint runner (`ruff.ts`, on `resolveRunnerCwd`) and this
|
|
77
|
-
// autofix path to consume the SAME policy; deriving the root two
|
|
78
|
-
// different ways is how they drift, and the hand-rolled form ignored a
|
|
79
|
-
// nested `pyproject.toml` whenever the caller passed a workspace root.
|
|
80
|
-
const ruffCwd = resolveToolCwd("runner", "ruff", absolutePath, {
|
|
81
|
-
...(cwd !== undefined && { cwd }),
|
|
82
|
-
}).cwd;
|
|
83
|
-
// Shared config-args seam (#1247): the lint runner consumes the same
|
|
84
|
-
// builder, so `check --fix` can never drift to ruff's default rule
|
|
85
|
-
// set when the project lacks its own config and the package-owned
|
|
86
|
-
// core.toml fallback applies.
|
|
87
|
-
const configArgs = ruffConfigArgs(ruffCwd);
|
|
88
|
-
const pre = await safeSpawnAsync(this.ruffCommand, [
|
|
89
|
-
"check",
|
|
90
|
-
"--output-format",
|
|
91
|
-
"json",
|
|
92
|
-
"--target-version",
|
|
93
|
-
"py310",
|
|
94
|
-
...configArgs,
|
|
95
|
-
absolutePath,
|
|
96
|
-
], { timeout: 10000, cwd: ruffCwd });
|
|
97
|
-
const beforeDiags = pre.stdout?.trim()
|
|
98
|
-
? this.parseOutput(pre.stdout, absolutePath)
|
|
99
|
-
: [];
|
|
100
|
-
const fixableCount = beforeDiags.filter((d) => d.fixable).length;
|
|
101
|
-
const fix = await safeSpawnAsync(this.ruffCommand, ["check", "--fix", ...configArgs, absolutePath], { timeout: 15000, cwd: ruffCwd });
|
|
102
|
-
if (fix.error) {
|
|
103
|
-
return {
|
|
104
|
-
success: false,
|
|
105
|
-
changed: false,
|
|
106
|
-
fixed: 0,
|
|
107
|
-
error: fix.error.message,
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
const after = await fs.promises.readFile(absolutePath, "utf-8");
|
|
111
|
-
const changed = before !== after;
|
|
112
|
-
if (changed) {
|
|
113
|
-
this.log(`Fixed ${fixableCount} issue(s) in ${path.basename(filePath)}`);
|
|
114
|
-
}
|
|
115
|
-
return { success: true, changed, fixed: fixableCount };
|
|
116
|
-
}
|
|
117
|
-
catch (err) {
|
|
118
|
-
return { success: false, changed: false, fixed: 0, error: err.message };
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
// --- Internal ---
|
|
122
|
-
parseOutput(output, filterFile) {
|
|
123
|
-
if (!output.trim())
|
|
124
|
-
return [];
|
|
125
|
-
try {
|
|
126
|
-
const items = JSON.parse(output);
|
|
127
|
-
const diagnostics = [];
|
|
128
|
-
for (const item of items) {
|
|
129
|
-
// Filter to single file if requested
|
|
130
|
-
if (filterFile && path.resolve(item.filename) !== filterFile)
|
|
131
|
-
continue;
|
|
132
|
-
diagnostics.push({
|
|
133
|
-
line: item.location.row - 1, // ruff is 1-indexed
|
|
134
|
-
column: item.location.column - 1,
|
|
135
|
-
endLine: item.end_location.row - 1,
|
|
136
|
-
endColumn: item.end_location.column - 1,
|
|
137
|
-
severity: item.code?.startsWith("E") ? "error" : "warning",
|
|
138
|
-
message: item.message,
|
|
139
|
-
rule: item.code || "unknown",
|
|
140
|
-
file: item.filename,
|
|
141
|
-
fixable: item.fix !== null,
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
return diagnostics;
|
|
145
|
-
}
|
|
146
|
-
catch (err) {
|
|
147
|
-
void err;
|
|
148
|
-
this.log("Failed to parse ruff JSON output");
|
|
149
|
-
return [];
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|