pi-lens 4.3.0 → 4.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1064 -0
- package/README.md +115 -25
- package/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/dist/chunk-22AVIGXS.js +560 -0
- package/dist/chunk-27BBHSZC.js +106 -0
- package/dist/chunk-2BEMIWEW.js +51 -0
- package/dist/chunk-2EECBNC5.js +89 -0
- package/dist/chunk-34U7PLGE.js +23 -0
- package/dist/chunk-3I5QFT3N.js +181 -0
- package/dist/chunk-3MED75HT.js +37 -0
- package/dist/chunk-47D2BO4S.js +87 -0
- package/dist/chunk-4RERDEXR.js +348 -0
- package/dist/chunk-4W2PLC4J.js +27 -0
- package/dist/chunk-52H5B5TC.js +202 -0
- package/dist/chunk-54B42YRX.js +27 -0
- package/dist/chunk-5RXBNSW2.js +266 -0
- package/dist/chunk-5THXD6X5.js +201 -0
- package/dist/chunk-5W3R6LFT.js +24 -0
- package/dist/chunk-5ZEJHV35.js +341 -0
- package/dist/chunk-6P62QVEA.js +118 -0
- package/dist/chunk-6QIUX4EP.js +459 -0
- package/dist/chunk-6VCD4VKZ.js +78 -0
- package/dist/chunk-7F72PXY2.js +326 -0
- package/dist/chunk-7FBF7NPR.js +998 -0
- package/dist/chunk-7U2IDNXN.js +37 -0
- package/dist/chunk-ABBOA7UD.js +157 -0
- package/dist/chunk-AHDW3GPE.js +50 -0
- package/dist/chunk-AJ3QXTRQ.js +756 -0
- package/dist/chunk-AJVLWNFN.js +1610 -0
- package/dist/chunk-AJXODZY6.js +112 -0
- package/dist/chunk-ARFCXG7S.js +84 -0
- package/dist/chunk-AS44CFQ4.js +708 -0
- package/dist/chunk-AWE5TMPO.js +38 -0
- package/dist/chunk-B3I2UUT4.js +4692 -0
- package/dist/chunk-BRJKOBZP.js +331 -0
- package/dist/chunk-BW5KFIQC.js +59 -0
- package/dist/chunk-C2AUYXQH.js +149 -0
- package/dist/chunk-CGGAIP7J.js +29 -0
- package/dist/chunk-D6QS3U6M.js +30 -0
- package/dist/chunk-DFVMIKMQ.js +349 -0
- package/dist/chunk-DIULIWKU.js +169 -0
- package/dist/chunk-DQ2NZ7C4.js +2317 -0
- package/dist/chunk-E2WFBRHM.js +213 -0
- package/dist/chunk-E4MAEDPM.js +50 -0
- package/dist/chunk-EOKRQ3SA.js +30 -0
- package/dist/chunk-F3AU2TMM.js +2626 -0
- package/dist/chunk-F3P7VQ7H.js +170 -0
- package/dist/chunk-FC4RP4I2.js +12 -0
- package/dist/chunk-FJNKANOS.js +32 -0
- package/dist/chunk-GUOGVTCQ.js +146 -0
- package/dist/chunk-GVXA6CCE.js +18 -0
- package/dist/chunk-HHYAELLJ.js +2334 -0
- package/dist/chunk-HMFXILPV.js +83 -0
- package/dist/chunk-HVUZXSWK.js +421 -0
- package/dist/chunk-HWBZIGMJ.js +62 -0
- package/dist/chunk-I3R7GKDR.js +17 -0
- package/dist/chunk-I7SPGOWI.js +55 -0
- package/dist/chunk-IIXOAGHR.js +38 -0
- package/dist/chunk-IVP5KAB7.js +2250 -0
- package/dist/chunk-IXEBJSUE.js +22 -0
- package/dist/chunk-JOLITGCC.js +27 -0
- package/dist/chunk-K6VYLB2U.js +145 -0
- package/dist/chunk-LJDODBBZ.js +78 -0
- package/dist/chunk-LNAKEO63.js +78 -0
- package/dist/chunk-LSMJ6KBE.js +4139 -0
- package/dist/chunk-LW6XKDZQ.js +5565 -0
- package/dist/chunk-N3YQJI6O.js +899 -0
- package/dist/chunk-NABLC7W3.js +148 -0
- package/dist/chunk-NKOUFPQF.js +659 -0
- package/dist/chunk-NL5GLMFI.js +211 -0
- package/dist/chunk-NMABWBZN.js +327 -0
- package/dist/chunk-NTHH2J74.js +27 -0
- package/dist/chunk-NTUJEGDZ.js +59 -0
- package/dist/chunk-NXL4FFQQ.js +47 -0
- package/dist/chunk-NXPS2L6U.js +466 -0
- package/dist/chunk-O5WILGMI.js +42 -0
- package/dist/chunk-O6TQT6RI.js +48 -0
- package/dist/chunk-OAXNDZJ7.js +323 -0
- package/dist/chunk-ODEEOXPH.js +44 -0
- package/dist/chunk-OQGFCZJ4.js +4533 -0
- package/dist/chunk-ORTMY4Q4.js +282 -0
- package/dist/chunk-OS32RNR2.js +442 -0
- package/dist/chunk-PAK6IDME.js +189 -0
- package/dist/chunk-PWFHBTSF.js +406 -0
- package/dist/chunk-Q5U6FMDI.js +2352 -0
- package/dist/chunk-QOZXJ4NA.js +3364 -0
- package/dist/chunk-QYF5S6P6.js +45 -0
- package/dist/chunk-RIISMHKN.js +36 -0
- package/dist/chunk-RPD4ZSB7.js +25 -0
- package/dist/chunk-RPD5K5NC.js +79 -0
- package/dist/chunk-RUOG5D2C.js +262 -0
- package/dist/chunk-T4ERT73Y.js +599 -0
- package/dist/chunk-T6D4Q4AQ.js +54 -0
- package/dist/chunk-TGPXLY2J.js +391 -0
- package/dist/chunk-TLGFBM3F.js +12116 -0
- package/dist/chunk-TO6WL3GM.js +88 -0
- package/dist/chunk-TT22N74J.js +517 -0
- package/dist/chunk-TVN5N6GY.js +21216 -0
- package/dist/chunk-U3VGR4VU.js +308 -0
- package/dist/chunk-UK3CMEAL.js +1250 -0
- package/dist/chunk-UOPVJQ4N.js +103 -0
- package/dist/chunk-UXVNL3D7.js +23 -0
- package/dist/chunk-UY752QSN.js +45 -0
- package/dist/chunk-V5PXFSZK.js +188 -0
- package/dist/chunk-V7R425XG.js +398 -0
- package/dist/chunk-VCSRSYLF.js +81 -0
- package/dist/chunk-VD4JQCQC.js +162 -0
- package/dist/chunk-VDBPVIKD.js +62 -0
- package/dist/chunk-VHQLPIRJ.js +114 -0
- package/dist/chunk-VN2AXLEX.js +5414 -0
- package/dist/chunk-VNMT7C64.js +478 -0
- package/dist/chunk-WONERJTP.js +309 -0
- package/dist/chunk-XECLWQZN.js +85 -0
- package/dist/chunk-XIMYZ3JA.js +27 -0
- package/dist/chunk-XK4CIILI.js +144 -0
- package/dist/chunk-Y4T27COV.js +562 -0
- package/dist/chunk-YGVYKNSN.js +1860 -0
- package/dist/chunk-YLF3PPT5.js +308 -0
- package/dist/chunk-YSNFMJKN.js +14 -0
- package/dist/chunk-Z3CCVDUB.js +76 -0
- package/dist/chunk-Z54ZSOBZ.js +61 -0
- package/dist/chunk-ZAWW3AF6.js +97 -0
- package/dist/chunk-ZMOL6RQC.js +167 -0
- package/dist/index.js +16456 -8335
- package/dist/mcp/analyze-cli.js +186 -232
- package/dist/mcp/cli.js +137 -98
- package/dist/mcp/server.js +22589 -1573
- package/dist/mcp/worker.js +97 -38
- package/dist/probes/installer.js +135 -0
- package/dist/workers/project-snapshot-persist-worker.js +22 -0
- package/dist/workers/review-graph-persist-worker.js +15 -0
- package/docs/agent-guide.md +13 -4
- package/docs/agent-tools.md +42 -0
- package/docs/ast-grep_rules_catalog.md +3 -2
- package/docs/configuration.md +20 -1
- package/docs/environment-variables.md +52 -2
- package/docs/features.md +8 -4
- package/docs/globalconfig.md +1 -0
- package/docs/io-bridge-v2-migration.md +94 -0
- package/docs/lsp-capability-matrix.md +36 -4
- package/docs/lsp-idle-eviction.md +124 -0
- package/docs/mcp.md +21 -5
- package/docs/merge-queue-rollout.md +77 -0
- package/docs/pi-lens-fixer.md +156 -88
- package/docs/pi-lens-investigator.md +74 -26
- package/docs/pi-lens-merge-policy.md +694 -0
- package/docs/pi-lens-monitor.md +73 -7
- package/docs/pi-lens-retro.md +6 -4
- package/docs/pi-lens-reviewer.md +188 -48
- package/docs/pi-lens-subagent.md +246 -45
- package/docs/pi-lens-warden.md +18 -7
- package/docs/public-api-stability.md +55 -0
- package/docs/release-qa-baseline.md +84 -17
- package/docs/rfcs/3654-unified-io-bridge-v2.md +316 -0
- package/docs/servercapabilities.md +53 -49
- package/docs/settings.md +1 -0
- package/docs/usage.md +5 -1
- package/grammars/tree-sitter-bash.wasm +0 -0
- package/grammars/tree-sitter-bash.wasm.json +3 -3
- package/package.json +19 -7
- package/rules/ast-grep-rules/rule-tests/advisory-registry-subset-test.yml +41 -0
- package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/scripts/analyze-pi-lens-logs.mjs +1275 -62
- package/scripts/download-grammars.js +5 -0
- package/scripts/grammars.lock.json +6 -1
- package/scripts/install-selftest.mjs +33 -34
- package/scripts/lib/host-provided-deps.mjs +13 -4
- package/scripts/lib/web-tree-sitter-dir.mjs +18 -0
- package/dist/clients/actionable-warnings-logger.js +0 -35
- package/dist/clients/actionable-warnings.js +0 -1610
- package/dist/clients/advisory-provenance.js +0 -593
- package/dist/clients/agent-behavior-client.js +0 -147
- package/dist/clients/agent-nudge.js +0 -325
- package/dist/clients/analysed-root.js +0 -1
- package/dist/clients/ast-grep-client.js +0 -731
- package/dist/clients/ast-grep-rule-manager.js +0 -146
- package/dist/clients/ast-grep-tool-logger.js +0 -118
- package/dist/clients/ast-grep-types.js +0 -10
- package/dist/clients/ast-grep-yaml-synth.js +0 -154
- package/dist/clients/atomic-write-staging.js +0 -75
- package/dist/clients/atomic-write.js +0 -189
- package/dist/clients/availability-probe-flight.js +0 -12
- package/dist/clients/bash-file-access.js +0 -1056
- package/dist/clients/biome-client.js +0 -357
- package/dist/clients/blocker-freshness.js +0 -837
- package/dist/clients/blocker-past-eof.js +0 -129
- package/dist/clients/bootstrap.js +0 -569
- package/dist/clients/bounded-cache.js +0 -190
- package/dist/clients/bounded-pid-file-lock.js +0 -202
- package/dist/clients/bounded-telemetry.js +0 -295
- package/dist/clients/build-identity.js +0 -95
- package/dist/clients/bundled-resource-health.js +0 -113
- package/dist/clients/bus-events-logger.js +0 -105
- package/dist/clients/bus-publish.js +0 -171
- package/dist/clients/cache/rule-cache.js +0 -190
- package/dist/clients/cache-manager.js +0 -524
- package/dist/clients/cache-observability.js +0 -1313
- package/dist/clients/call-graph.js +0 -852
- package/dist/clients/cargo-manifest.js +0 -422
- package/dist/clients/cascade-budget.js +0 -196
- package/dist/clients/cascade-format.js +0 -315
- package/dist/clients/cascade-logger.js +0 -31
- package/dist/clients/cascade-types.js +0 -9
- package/dist/clients/child-unref.js +0 -124
- package/dist/clients/code-quality-warnings.js +0 -286
- package/dist/clients/codebase-model.js +0 -173
- package/dist/clients/collateral-test-role.js +0 -40
- package/dist/clients/complexity-client.js +0 -462
- package/dist/clients/config-core/deny.js +0 -221
- package/dist/clients/config-core/index.js +0 -50
- package/dist/clients/config-core/merge.js +0 -357
- package/dist/clients/config-core/normalize.js +0 -340
- package/dist/clients/config-core/process-spec.js +0 -248
- package/dist/clients/config-core/provenance.js +0 -164
- package/dist/clients/config-core/records.js +0 -218
- package/dist/clients/config-core/resolve.js +0 -125
- package/dist/clients/config-core/safe-object.js +0 -78
- package/dist/clients/config-core/schema.js +0 -165
- package/dist/clients/config-diagnostic-codes.js +0 -285
- package/dist/clients/config-locations.js +0 -388
- package/dist/clients/config-resolve.js +0 -798
- package/dist/clients/config-schema.js +0 -251
- package/dist/clients/config-warn.js +0 -407
- package/dist/clients/console-guard-install.js +0 -26
- package/dist/clients/cooperative-budget.js +0 -42
- package/dist/clients/dead-code-client.js +0 -510
- package/dist/clients/dead-code-logger.js +0 -30
- package/dist/clients/deadline-utils.js +0 -280
- package/dist/clients/debug-handles.js +0 -211
- package/dist/clients/debug-heap.js +0 -174
- package/dist/clients/deferred-lsp-work.js +0 -106
- package/dist/clients/degradation-ledger.js +0 -426
- package/dist/clients/demoted-finding-render.js +0 -169
- package/dist/clients/dependency-checker.js +0 -885
- package/dist/clients/deps/ast-grep-napi.js +0 -22
- package/dist/clients/deps/js-yaml.js +0 -9
- package/dist/clients/deps/minimatch.js +0 -4
- package/dist/clients/deps/pi-tui.js +0 -14
- package/dist/clients/deps/typebox.js +0 -14
- package/dist/clients/deps/vscode-jsonrpc.js +0 -1
- package/dist/clients/deps/web-tree-sitter.js +0 -24
- package/dist/clients/diagnostic-dispositions.js +0 -630
- package/dist/clients/diagnostic-line-freshness.js +0 -305
- package/dist/clients/diagnostic-logger.js +0 -73
- package/dist/clients/diagnostic-tracker.js +0 -105
- package/dist/clients/diagnostics-publish.js +0 -230
- package/dist/clients/dispatch/ast-grep-catalog.js +0 -65
- package/dist/clients/dispatch/auxiliary-lsp.js +0 -343
- package/dist/clients/dispatch/collect-later-tier.js +0 -35
- package/dist/clients/dispatch/diagnostic-taxonomy.js +0 -66
- package/dist/clients/dispatch/dispatcher.js +0 -1269
- package/dist/clients/dispatch/fact-provider-types.js +0 -1
- package/dist/clients/dispatch/fact-rule-runner.js +0 -17
- package/dist/clients/dispatch/fact-runner.js +0 -30
- package/dist/clients/dispatch/fact-scheduler.js +0 -68
- package/dist/clients/dispatch/fact-store.js +0 -377
- package/dist/clients/dispatch/facts/comment-facts.js +0 -22
- package/dist/clients/dispatch/facts/file-content.js +0 -19
- package/dist/clients/dispatch/facts/function-facts.js +0 -348
- package/dist/clients/dispatch/facts/import-facts.js +0 -204
- package/dist/clients/dispatch/facts/tree-sitter-facts.js +0 -34
- package/dist/clients/dispatch/facts/try-catch-facts.js +0 -119
- package/dist/clients/dispatch/finding-policy.js +0 -339
- package/dist/clients/dispatch/indent-detect.js +0 -417
- package/dist/clients/dispatch/inline-suppressions.js +0 -89
- package/dist/clients/dispatch/integration.js +0 -2377
- package/dist/clients/dispatch/lazy.js +0 -11
- package/dist/clients/dispatch/pending-runner-findings.js +0 -87
- package/dist/clients/dispatch/plan.js +0 -278
- package/dist/clients/dispatch/priorities.js +0 -20
- package/dist/clients/dispatch/rule-id-normalize.js +0 -50
- package/dist/clients/dispatch/rule-ignores.js +0 -69
- package/dist/clients/dispatch/rule-policy.js +0 -135
- package/dist/clients/dispatch/rules/async-noise.js +0 -40
- package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +0 -27
- package/dist/clients/dispatch/rules/cors-wildcard.js +0 -54
- package/dist/clients/dispatch/rules/error-obscuring.js +0 -32
- package/dist/clients/dispatch/rules/error-swallowing.js +0 -31
- package/dist/clients/dispatch/rules/framework-call-noise.js +0 -67
- package/dist/clients/dispatch/rules/high-complexity.js +0 -72
- package/dist/clients/dispatch/rules/high-fan-out.js +0 -74
- package/dist/clients/dispatch/rules/high-import-coupling.js +0 -37
- package/dist/clients/dispatch/rules/missing-error-propagation.js +0 -62
- package/dist/clients/dispatch/rules/no-commented-credentials.js +0 -52
- package/dist/clients/dispatch/rules/pass-through-wrappers.js +0 -42
- package/dist/clients/dispatch/rules/placeholder-comments.js +0 -40
- package/dist/clients/dispatch/rules/unsafe-boundary.js +0 -126
- package/dist/clients/dispatch/runner-context.js +0 -52
- package/dist/clients/dispatch/runners/actionlint.js +0 -111
- package/dist/clients/dispatch/runners/ast-grep-napi.js +0 -1196
- package/dist/clients/dispatch/runners/biome-check.js +0 -296
- package/dist/clients/dispatch/runners/cpp-check.js +0 -219
- package/dist/clients/dispatch/runners/credo.js +0 -82
- package/dist/clients/dispatch/runners/cue-vet.js +0 -416
- package/dist/clients/dispatch/runners/dart-analyze.js +0 -183
- package/dist/clients/dispatch/runners/detekt.js +0 -176
- package/dist/clients/dispatch/runners/dotnet-build.js +0 -164
- package/dist/clients/dispatch/runners/elixir-check.js +0 -195
- package/dist/clients/dispatch/runners/eslint.js +0 -137
- package/dist/clients/dispatch/runners/fact-rules.js +0 -29
- package/dist/clients/dispatch/runners/fish-indent.js +0 -69
- package/dist/clients/dispatch/runners/gleam-check.js +0 -167
- package/dist/clients/dispatch/runners/go-vet.js +0 -104
- package/dist/clients/dispatch/runners/golangci-lint.js +0 -135
- package/dist/clients/dispatch/runners/hadolint.js +0 -91
- package/dist/clients/dispatch/runners/helm-lint.js +0 -171
- package/dist/clients/dispatch/runners/helm-render.js +0 -940
- package/dist/clients/dispatch/runners/htmlhint.js +0 -117
- package/dist/clients/dispatch/runners/index.js +0 -108
- package/dist/clients/dispatch/runners/javac.js +0 -99
- package/dist/clients/dispatch/runners/ktlint.js +0 -110
- package/dist/clients/dispatch/runners/lsp.js +0 -379
- package/dist/clients/dispatch/runners/markdownlint.js +0 -167
- package/dist/clients/dispatch/runners/mypy.js +0 -102
- package/dist/clients/dispatch/runners/oxlint.js +0 -414
- package/dist/clients/dispatch/runners/php-lint.js +0 -85
- package/dist/clients/dispatch/runners/phpstan.js +0 -120
- package/dist/clients/dispatch/runners/prisma-validate.js +0 -62
- package/dist/clients/dispatch/runners/psscriptanalyzer.js +0 -445
- package/dist/clients/dispatch/runners/pyright.js +0 -169
- package/dist/clients/dispatch/runners/rubocop.js +0 -99
- package/dist/clients/dispatch/runners/ruff.js +0 -88
- package/dist/clients/dispatch/runners/rust-clippy.js +0 -256
- package/dist/clients/dispatch/runners/shellcheck.js +0 -173
- package/dist/clients/dispatch/runners/shfmt.js +0 -102
- package/dist/clients/dispatch/runners/spellcheck.js +0 -128
- package/dist/clients/dispatch/runners/spotbugs.js +0 -259
- package/dist/clients/dispatch/runners/sqlfluff.js +0 -183
- package/dist/clients/dispatch/runners/stylelint.js +0 -166
- package/dist/clients/dispatch/runners/swiftlint.js +0 -163
- package/dist/clients/dispatch/runners/taplo.js +0 -174
- package/dist/clients/dispatch/runners/terragrunt.js +0 -168
- package/dist/clients/dispatch/runners/tflint.js +0 -125
- package/dist/clients/dispatch/runners/tree-sitter.js +0 -643
- package/dist/clients/dispatch/runners/trivy-config.js +0 -253
- package/dist/clients/dispatch/runners/utils/availability-policy.js +0 -496
- package/dist/clients/dispatch/runners/utils/candidate-probe.js +0 -90
- package/dist/clients/dispatch/runners/utils/diagnostic-parsers.js +0 -95
- package/dist/clients/dispatch/runners/utils/lazy-installer.js +0 -274
- package/dist/clients/dispatch/runners/utils/runner-helpers.js +0 -1701
- package/dist/clients/dispatch/runners/utils/spawn-outcome.js +0 -101
- package/dist/clients/dispatch/runners/utils/tool-failure.js +0 -235
- package/dist/clients/dispatch/runners/utils/toolchain-availability.js +0 -169
- package/dist/clients/dispatch/runners/utils.js +0 -15
- package/dist/clients/dispatch/runners/vale.js +0 -128
- package/dist/clients/dispatch/runners/yaml-rule-parser.js +0 -242
- package/dist/clients/dispatch/runners/yamllint.js +0 -95
- package/dist/clients/dispatch/runners/zig-check.js +0 -79
- package/dist/clients/dispatch/suppress-writer.js +0 -79
- package/dist/clients/dispatch/tool-profile.js +0 -30
- package/dist/clients/dispatch/types.js +0 -21
- package/dist/clients/dispatch/utils/format-utils.js +0 -45
- package/dist/clients/dispatch/utils/lsp-diagnostics.js +0 -35
- package/dist/clients/disposition-logger.js +0 -32
- package/dist/clients/disposition-publish.js +0 -124
- package/dist/clients/durable-store.js +0 -97
- package/dist/clients/effective-config.js +0 -415
- package/dist/clients/env-utils.js +0 -83
- package/dist/clients/error-class.js +0 -23
- package/dist/clients/eval-timestamp.js +0 -17
- package/dist/clients/event-loop-hold.js +0 -274
- package/dist/clients/event-loop-monitor.js +0 -250
- package/dist/clients/extension-log.js +0 -504
- package/dist/clients/extension-mode.js +0 -73
- package/dist/clients/feature-hints.js +0 -103
- package/dist/clients/file-kinds.js +0 -412
- package/dist/clients/file-role.js +0 -134
- package/dist/clients/file-time.js +0 -160
- package/dist/clients/file-utils.js +0 -1032
- package/dist/clients/finding-delivery-gate.js +0 -494
- package/dist/clients/finding-identity.js +0 -88
- package/dist/clients/fix-worklog.js +0 -103
- package/dist/clients/format-events-publish.js +0 -343
- package/dist/clients/format-service.js +0 -222
- package/dist/clients/formatters-lazy.js +0 -9
- package/dist/clients/formatters.js +0 -2032
- package/dist/clients/freshness-cadence.js +0 -17
- package/dist/clients/freshness.js +0 -38
- package/dist/clients/generated-artifacts.js +0 -394
- package/dist/clients/generation-guard.js +0 -215
- package/dist/clients/git-guard.js +0 -1136
- package/dist/clients/git-tracked-ignore.js +0 -243
- package/dist/clients/gitleaks-client.js +0 -509
- package/dist/clients/go-client.js +0 -104
- package/dist/clients/govulncheck-client.js +0 -605
- package/dist/clients/gradle-ktfmt-style.js +0 -348
- package/dist/clients/grammar-source.js +0 -465
- package/dist/clients/gzip-stage-write.js +0 -135
- package/dist/clients/hashline-anchor.js +0 -424
- package/dist/clients/hook-budgets.js +0 -76
- package/dist/clients/host-edit-normalize.js +0 -140
- package/dist/clients/host-ports.js +0 -39
- package/dist/clients/indent-retarget.js +0 -154
- package/dist/clients/inline-blocker-dispositions.js +0 -186
- package/dist/clients/install-diagnostics.js +0 -156
- package/dist/clients/installer/index.js +0 -5416
- package/dist/clients/installer/managed-tool-refresh-session.js +0 -58
- package/dist/clients/installer/managed-tool-refresh.js +0 -783
- package/dist/clients/instance-reaper-state.js +0 -7
- package/dist/clients/instance-reaper.js +0 -1137
- package/dist/clients/instance-registry-lock.js +0 -145
- package/dist/clients/instance-registry.js +0 -773
- package/dist/clients/jscpd-client.js +0 -378
- package/dist/clients/json-cache-read.js +0 -65
- package/dist/clients/knip-client.js +0 -788
- package/dist/clients/language-policy.js +0 -252
- package/dist/clients/language-profile.js +0 -361
- package/dist/clients/language-registry.js +0 -603
- package/dist/clients/latency-logger.js +0 -727
- package/dist/clients/lazy-import.js +0 -21
- package/dist/clients/ledger-bounds.js +0 -54
- package/dist/clients/lens-config.js +0 -404
- package/dist/clients/lens-engine.js +0 -358
- package/dist/clients/lens-events.js +0 -125
- package/dist/clients/lens-flag-registry.js +0 -467
- package/dist/clients/lens-map.js +0 -1156
- package/dist/clients/live-bus-emitter.js +0 -74
- package/dist/clients/log-cleanup.js +0 -222
- package/dist/clients/lsp/aggregation.js +0 -178
- package/dist/clients/lsp/cascade-tier.js +0 -421
- package/dist/clients/lsp/client.js +0 -4593
- package/dist/clients/lsp/config.js +0 -691
- package/dist/clients/lsp/content-limits.js +0 -41
- package/dist/clients/lsp/diagnostic-binding.js +0 -225
- package/dist/clients/lsp/document-drift.js +0 -467
- package/dist/clients/lsp/edits.js +0 -1219
- package/dist/clients/lsp/index.js +0 -8305
- package/dist/clients/lsp/inferred-project.js +0 -216
- package/dist/clients/lsp/jvm-runtime.js +0 -298
- package/dist/clients/lsp/language.js +0 -63
- package/dist/clients/lsp/launch.js +0 -746
- package/dist/clients/lsp/lombok.js +0 -158
- package/dist/clients/lsp/path-utils.js +0 -5
- package/dist/clients/lsp/pending-aux-coverage.js +0 -251
- package/dist/clients/lsp/position-encoding.js +0 -61
- package/dist/clients/lsp/ruby-drive-dirs.js +0 -83
- package/dist/clients/lsp/server.js +0 -3290
- package/dist/clients/lsp/session-roots.js +0 -192
- package/dist/clients/lsp/spawn-history.js +0 -17
- package/dist/clients/lsp/sync-kind.js +0 -56
- package/dist/clients/lsp/tsserver-sync.js +0 -332
- package/dist/clients/lsp/wait-policy/capability-snapshot.js +0 -1
- package/dist/clients/lsp/wait-policy/classification.js +0 -85
- package/dist/clients/lsp/wait-policy/index.js +0 -10
- package/dist/clients/lsp/wait-policy/strategies.js +0 -392
- package/dist/clients/lsp/watch-queue.js +0 -61
- package/dist/clients/lsp/workspace-diagnostics-cache.js +0 -639
- package/dist/clients/lsp/workspace-diagnostics-session.js +0 -30
- package/dist/clients/lsp/workspace-sweep-hold.js +0 -184
- package/dist/clients/lsp-budget.js +0 -186
- package/dist/clients/lsp-document-symbols.js +0 -110
- package/dist/clients/lsp-lazy.js +0 -9
- package/dist/clients/lsp-mutation.js +0 -396
- package/dist/clients/lsp-status.js +0 -59
- package/dist/clients/map-with-concurrency.js +0 -40
- package/dist/clients/mcp/analyze.js +0 -420
- package/dist/clients/mcp/host-shim.js +0 -31
- package/dist/clients/mcp/ipc.js +0 -523
- package/dist/clients/mcp/review.js +0 -197
- package/dist/clients/mcp/session.js +0 -412
- package/dist/clients/memory-sampler.js +0 -208
- package/dist/clients/message-end-attribution.js +0 -30
- package/dist/clients/metrics-client.js +0 -107
- package/dist/clients/metrics-history.js +0 -327
- package/dist/clients/middle-man-analysis.js +0 -263
- package/dist/clients/model-provider.js +0 -53
- package/dist/clients/module-report-lsp.js +0 -189
- package/dist/clients/module-report.js +0 -2150
- package/dist/clients/mutating-tool.js +0 -651
- package/dist/clients/mutation-attribution.js +0 -368
- package/dist/clients/mutation-bridge.js +0 -240
- package/dist/clients/ndjson-logger.js +0 -734
- package/dist/clients/observed-mutation-sources.js +0 -101
- package/dist/clients/observed-mutation.js +0 -1253
- package/dist/clients/oldtext-autopatch.js +0 -128
- package/dist/clients/opaque-mutation-scan.js +0 -496
- package/dist/clients/opengrep-client.js +0 -333
- package/dist/clients/opengrep-config.js +0 -76
- package/dist/clients/package-manager.js +0 -607
- package/dist/clients/package-root.js +0 -38
- package/dist/clients/partial-edit-apply.js +0 -439
- package/dist/clients/path-attribution-telemetry.js +0 -43
- package/dist/clients/path-keyed-map.js +0 -108
- package/dist/clients/path-utils.js +0 -1244
- package/dist/clients/performance-report.js +0 -331
- package/dist/clients/persist-debounce.js +0 -70
- package/dist/clients/persistent-reverify.js +0 -271
- package/dist/clients/php-cs-fixer-config.js +0 -119
- package/dist/clients/pipeline.js +0 -1480
- package/dist/clients/post-autofix-notice.js +0 -37
- package/dist/clients/print-mode.js +0 -21
- package/dist/clients/probe-home-state.js +0 -228
- package/dist/clients/process-bridge.js +0 -66
- package/dist/clients/process-singletons.js +0 -210
- package/dist/clients/process-snapshot.js +0 -68
- package/dist/clients/project-changes.js +0 -181
- package/dist/clients/project-conventions.js +0 -171
- package/dist/clients/project-diagnostics/cache.js +0 -137
- package/dist/clients/project-diagnostics/extractors.js +0 -109
- package/dist/clients/project-diagnostics/fresh-fetch.js +0 -668
- package/dist/clients/project-diagnostics/runner-adapters/call-graph-impact.js +0 -118
- package/dist/clients/project-diagnostics/runner-adapters/dead-code.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/govulncheck.js +0 -34
- package/dist/clients/project-diagnostics/runner-adapters/jscpd.js +0 -38
- package/dist/clients/project-diagnostics/runner-adapters/knip.js +0 -47
- package/dist/clients/project-diagnostics/runner-adapters/madge.js +0 -48
- package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +0 -40
- package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +0 -127
- package/dist/clients/project-diagnostics/runner-adapters/trivy.js +0 -81
- package/dist/clients/project-diagnostics/scanner.js +0 -520
- package/dist/clients/project-diagnostics/types.js +0 -1
- package/dist/clients/project-lens-config.js +0 -807
- package/dist/clients/project-report.js +0 -701
- package/dist/clients/project-scale.js +0 -237
- package/dist/clients/project-scan-policy.js +0 -11
- package/dist/clients/project-snapshot-fingerprint.js +0 -48
- package/dist/clients/project-snapshot-persist-worker.js +0 -20
- package/dist/clients/project-snapshot.js +0 -1653
- package/dist/clients/project-trust.js +0 -181
- package/dist/clients/python-environment.js +0 -217
- package/dist/clients/python-provenance.js +0 -639
- package/dist/clients/quiet-window-config.js +0 -47
- package/dist/clients/quiet-window.js +0 -236
- package/dist/clients/read-bridge.js +0 -139
- package/dist/clients/read-expansion.js +0 -266
- package/dist/clients/read-guard-logger.js +0 -251
- package/dist/clients/read-guard-tool-lines.js +0 -1306
- package/dist/clients/read-guard.js +0 -1561
- package/dist/clients/recent-touches.js +0 -240
- package/dist/clients/redact/secrets.js +0 -449
- package/dist/clients/resource-sampler.js +0 -628
- package/dist/clients/reverse-deps.js +0 -270
- package/dist/clients/review-graph/builder.js +0 -5126
- package/dist/clients/review-graph/format.js +0 -33
- package/dist/clients/review-graph/git-identity.js +0 -163
- package/dist/clients/review-graph/import-resolvers.js +0 -481
- package/dist/clients/review-graph/persist-worker.js +0 -10
- package/dist/clients/review-graph/query.js +0 -244
- package/dist/clients/review-graph/revision-drift.js +0 -21
- package/dist/clients/review-graph/service.js +0 -96
- package/dist/clients/review-graph/shared-extraction-ir.js +0 -82
- package/dist/clients/review-graph/symbol-id.js +0 -103
- package/dist/clients/review-graph/tsconfig-paths.js +0 -299
- package/dist/clients/review-graph/types.js +0 -1
- package/dist/clients/review-graph/workspace-modules.js +0 -449
- package/dist/clients/review-graph-logger.js +0 -81
- package/dist/clients/ruff-client.js +0 -179
- package/dist/clients/rules-scanner.js +0 -131
- package/dist/clients/run-duration.js +0 -55
- package/dist/clients/runtime-agent-end.js +0 -746
- package/dist/clients/runtime-config.js +0 -77
- package/dist/clients/runtime-context.js +0 -211
- package/dist/clients/runtime-coordinator.js +0 -1324
- package/dist/clients/runtime-session.js +0 -2485
- package/dist/clients/runtime-tool-call.js +0 -1295
- package/dist/clients/runtime-tool-result.js +0 -2049
- package/dist/clients/runtime-turn.js +0 -3767
- package/dist/clients/rust-client.js +0 -97
- package/dist/clients/safe-spawn.js +0 -2357
- package/dist/clients/sanitize.js +0 -286
- package/dist/clients/scan-utils.js +0 -25
- package/dist/clients/scratch-tree-policy.js +0 -165
- package/dist/clients/search-read-registration.js +0 -94
- package/dist/clients/secret-findings.js +0 -114
- package/dist/clients/security-scan-client.js +0 -352
- package/dist/clients/session-event-guard.js +0 -297
- package/dist/clients/session-lifecycle.js +0 -484
- package/dist/clients/session-start-observability.js +0 -94
- package/dist/clients/session-state-store.js +0 -101
- package/dist/clients/session-summary.js +0 -15
- package/dist/clients/sessionstart-logger.js +0 -27
- package/dist/clients/sg-runner.js +0 -876
- package/dist/clients/sgconfig.js +0 -347
- package/dist/clients/shared-checkout-guard.js +0 -338
- package/dist/clients/single-flight.js +0 -158
- package/dist/clients/situational-tool-telemetry.js +0 -108
- package/dist/clients/skills-resolver.js +0 -141
- package/dist/clients/slow-fs.js +0 -138
- package/dist/clients/smells-rollup.js +0 -231
- package/dist/clients/source-filter.js +0 -596
- package/dist/clients/source-walker.js +0 -211
- package/dist/clients/spawn-output-cap.js +0 -120
- package/dist/clients/spawn-timeout-cooldown.js +0 -110
- package/dist/clients/stale-marker.js +0 -17
- package/dist/clients/startup-scan.js +0 -400
- package/dist/clients/startup-timing.js +0 -130
- package/dist/clients/string-utils.js +0 -33
- package/dist/clients/subagent-mode.js +0 -111
- package/dist/clients/symbol-containment.js +0 -24
- package/dist/clients/symbol-types.js +0 -5
- package/dist/clients/test-runner-client.js +0 -2507
- package/dist/clients/test-runner-delivery.js +0 -287
- package/dist/clients/todo-scanner.js +0 -229
- package/dist/clients/tool-agreement.js +0 -423
- package/dist/clients/tool-config.js +0 -249
- package/dist/clients/tool-cwd.js +0 -270
- package/dist/clients/tool-definition.js +0 -47
- package/dist/clients/tool-event.js +0 -105
- package/dist/clients/tool-policy.js +0 -2755
- package/dist/clients/tool-probe.js +0 -53
- package/dist/clients/tool-render.js +0 -156
- package/dist/clients/tool-set-policy.js +0 -118
- package/dist/clients/tree-sitter-cache.js +0 -364
- package/dist/clients/tree-sitter-client.js +0 -4195
- package/dist/clients/tree-sitter-logger.js +0 -100
- package/dist/clients/tree-sitter-navigator.js +0 -269
- package/dist/clients/tree-sitter-query-loader.js +0 -569
- package/dist/clients/tree-sitter-shared.js +0 -158
- package/dist/clients/tree-sitter-symbol-extractor.js +0 -1265
- package/dist/clients/trivy-client.js +0 -467
- package/dist/clients/tui-fit.js +0 -50
- package/dist/clients/turn-context.js +0 -52
- package/dist/clients/turn-end/lane.js +0 -51
- package/dist/clients/turn-end/lanes/govulncheck.js +0 -112
- package/dist/clients/turn-end/lanes/secrets.js +0 -204
- package/dist/clients/turn-summary-render.js +0 -72
- package/dist/clients/turn-summary.js +0 -132
- package/dist/clients/typos-config.js +0 -29
- package/dist/clients/user-notify.js +0 -51
- package/dist/clients/vanished-instance-marker.js +0 -57
- package/dist/clients/warm-attach.js +0 -305
- package/dist/clients/widget-state.js +0 -1808
- package/dist/clients/word-index-logger.js +0 -49
- package/dist/clients/word-index-store.js +0 -459
- package/dist/clients/word-index.js +0 -2080
- package/dist/clients/workspace-topology.js +0 -443
- package/dist/clients/write-ordering-guard.js +0 -65
- package/dist/clients/zizmor-config.js +0 -340
- package/dist/i18n.js +0 -69
- package/dist/mcp/build-staleness.js +0 -124
- package/dist/scripts/lib/process-scan.mjs +0 -583
- package/dist/scripts/lib/skills-predicate.mjs +0 -129
- package/dist/scripts/lib/web-tree-sitter-dir.mjs +0 -123
- package/dist/tools/activate-tools.js +0 -87
- package/dist/tools/ast-grep-outline.js +0 -137
- package/dist/tools/ast-grep-replace.js +0 -244
- package/dist/tools/ast-grep-search.js +0 -762
- package/dist/tools/effective-config.js +0 -90
- package/dist/tools/lens-diagnostic-mark.js +0 -375
- package/dist/tools/lens-diagnostics.js +0 -2571
- package/dist/tools/lsp-diagnostics.js +0 -1745
- package/dist/tools/lsp-navigation.js +0 -1367
- package/dist/tools/lsp-structured-output.js +0 -294
- package/dist/tools/module-report.js +0 -382
- package/dist/tools/project-report.js +0 -86
- package/dist/tools/render-compact.js +0 -374
- package/dist/tools/scan-progress.js +0 -53
- package/dist/tools/shared.js +0 -29
- package/dist/tools/symbol-search.js +0 -155
|
@@ -1,333 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* opengrep CLI client for pi-lens — bulk/full-workspace project-diagnostics
|
|
3
|
-
* extractor (#584).
|
|
4
|
-
*
|
|
5
|
-
* opengrep already runs as an always-on LSP auxiliary (`clients/lsp/server.ts`
|
|
6
|
-
* `OpengrepServer`) for real-time per-edit feedback, and this client does NOT
|
|
7
|
-
* touch that path. It exists solely so `lens_diagnostics mode=full` /
|
|
8
|
-
* `lsp_diagnostics` full-workspace scans can read opengrep's findings from a
|
|
9
|
-
* single project-wide CLI scan instead of one LSP touch per file.
|
|
10
|
-
*
|
|
11
|
-
* Why: opengrep has no `workspace/diagnostic` pull support (push-only, per
|
|
12
|
-
* `docs/servercapabilities.md`), and `reopenOnResync: true`
|
|
13
|
-
* (`clients/lsp/wait-policy/strategies.ts`) means every LSP touch already forces a
|
|
14
|
-
* full re-scan of that one file — there's no incremental efficiency lost by
|
|
15
|
-
* moving bulk scans off the per-file touch loop. On a full sweep the old path
|
|
16
|
-
* instead paid opengrep's full per-file wait-tier budget serially, one file at
|
|
17
|
-
* a time within its server group (#387's deliberate single-flight-per-server
|
|
18
|
-
* serialization) — on a real 50-file sweep this produced 49/50 files reporting
|
|
19
|
-
* "unconfirmed (timed out)".
|
|
20
|
-
*
|
|
21
|
-
* Lifecycle mirrors gitleaks/trivy/knip:
|
|
22
|
-
* - session_start scan (via `runTask`/`runHeavyweightTask` in
|
|
23
|
-
* runtime-session.ts), cached via `cacheManager`
|
|
24
|
-
* - `lens_diagnostics mode=full` reads the cache through the extractor
|
|
25
|
-
* registry (`project-diagnostics/extractors.ts`) — never launches a scan
|
|
26
|
-
* - per-edit LSP path (real-time feedback) is untouched
|
|
27
|
-
*
|
|
28
|
-
* Enablement mirrors the LSP server (`opengrepInitialization` in server.ts):
|
|
29
|
-
* opengrep is structurally always-on — `resolveOpengrepConfig` only chooses
|
|
30
|
-
* WHICH rules run (a local `.opengrep.yml`/`.semgrep.yml` rule file if
|
|
31
|
-
* present, else the `auto` registry ruleset), not whether it runs at all.
|
|
32
|
-
*
|
|
33
|
-
* `// nosemgrep` / `# nosemgrep` suppression: unlike opengrep's LSP mode
|
|
34
|
-
* (which does NOT honor it natively — that gap is exactly why
|
|
35
|
-
* `isNosemgrepSuppressed`/`applyAuxiliarySuppressions` exist in
|
|
36
|
-
* `clients/dispatch/auxiliary-lsp.ts`, #441/#586/#587), the CLI `scan --json`
|
|
37
|
-
* path DOES suppress `nosemgrep`-annotated findings itself, before they ever
|
|
38
|
-
* reach `--json` output — verified empirically against the real installed
|
|
39
|
-
* opengrep 1.25.0 binary (see the captured raw JSON in
|
|
40
|
-
* `tests/clients/opengrep-client.test.ts`: an annotated line's finding is
|
|
41
|
-
* absent from `results` while an identical unannotated twin still appears).
|
|
42
|
-
* So `opengrepResultToProjectDiagnostics` deliberately applies NO suppression
|
|
43
|
-
* filtering of its own — doing so would be redundant at best.
|
|
44
|
-
*
|
|
45
|
-
* Scope note (#1562 class fix): the CLI scan is handed `--exclude` per shared
|
|
46
|
-
* scratch/cache tree (`scratch-tree-policy.ts`) so a directory that isn't
|
|
47
|
-
* gitignored (opengrep's own default exclusion) still doesn't reach the
|
|
48
|
-
* agent as a finding — same `EXCLUDED_DIRS`-derived list gitleaks/trivy use.
|
|
49
|
-
*
|
|
50
|
-
* Refs: #584, #111 (opengrep adoption), #387 (workspace-sweep serialization), #1562
|
|
51
|
-
*/
|
|
52
|
-
import * as fs from "node:fs";
|
|
53
|
-
import * as os from "node:os";
|
|
54
|
-
import * as path from "node:path";
|
|
55
|
-
import { mkdtempSync } from "node:fs";
|
|
56
|
-
import { resolveOpengrepConfig } from "./opengrep-config.js";
|
|
57
|
-
import { recordDegradationOnce } from "./degradation-ledger.js";
|
|
58
|
-
import { getScratchTreeDirNames } from "./scratch-tree-policy.js";
|
|
59
|
-
import { realpathOrResolve } from "./path-utils.js";
|
|
60
|
-
import { safeSpawnAsync } from "./safe-spawn.js";
|
|
61
|
-
import { SecurityScanClient } from "./security-scan-client.js";
|
|
62
|
-
const EMPTY_RESULT = {
|
|
63
|
-
success: false,
|
|
64
|
-
findings: [],
|
|
65
|
-
};
|
|
66
|
-
// opengrep loads/compiles a full rule pack (1000+ rules for `auto`) before
|
|
67
|
-
// scanning; generous budget for a large tree, matching trivy's CVE-DB-fetch
|
|
68
|
-
// allowance rather than the lighter jscpd/gitleaks scans.
|
|
69
|
-
const SCAN_TIMEOUT_MS = 180_000;
|
|
70
|
-
// --- Client ---
|
|
71
|
-
export class OpengrepClient extends SecurityScanClient {
|
|
72
|
-
constructor(verbose = false) {
|
|
73
|
-
super("opengrep", verbose);
|
|
74
|
-
}
|
|
75
|
-
/**
|
|
76
|
-
* Structurally always-on (mirrors `opengrepInitialization` in
|
|
77
|
-
* `clients/lsp/server.ts`) — `resolveOpengrepConfig(cwd, { enabled: true })`
|
|
78
|
-
* only resolves WHICH rules to run, not whether opengrep runs at all.
|
|
79
|
-
* Exported as a static so callers can gate/log without constructing.
|
|
80
|
-
*/
|
|
81
|
-
static resolveConfig(cwd) {
|
|
82
|
-
return resolveOpengrepConfig(cwd, { enabled: true });
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* opengrep's top-level `--version` (no `scan` subcommand) — matches the
|
|
86
|
-
* installer's `checkArgs: ["--version"]` entry (`installer/index.ts`).
|
|
87
|
-
*/
|
|
88
|
-
doEnsureAvailable() {
|
|
89
|
-
return this.ensureViaInstaller(["--version"]);
|
|
90
|
-
}
|
|
91
|
-
/**
|
|
92
|
-
* Scan a directory tree with opengrep's rule set (local config or `auto`).
|
|
93
|
-
* Re-entrancy safe: concurrent calls against the same root share a single
|
|
94
|
-
* opengrep process (mirrors `GitleaksClient`/`JscpdClient`).
|
|
95
|
-
*/
|
|
96
|
-
async scan(cwd) {
|
|
97
|
-
const targetDir = realpathOrResolve(cwd);
|
|
98
|
-
const scannedAt = new Date().toISOString();
|
|
99
|
-
if (!(await this.ensureAvailable())) {
|
|
100
|
-
return {
|
|
101
|
-
...EMPTY_RESULT,
|
|
102
|
-
scannedAt,
|
|
103
|
-
reason: "not-installed",
|
|
104
|
-
summary: "opengrep not installed",
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
return this.dedupeScan(targetDir, () => this.runScan(targetDir));
|
|
108
|
-
}
|
|
109
|
-
async runScan(cwd) {
|
|
110
|
-
const scannedAt = new Date().toISOString();
|
|
111
|
-
const bin = this.binaryPath ?? "opengrep";
|
|
112
|
-
const resolved = OpengrepClient.resolveConfig(cwd);
|
|
113
|
-
const outDir = mkdtempSync(path.join(os.tmpdir(), "pi-lens-opengrep-"));
|
|
114
|
-
const reportPath = path.join(outDir, "opengrep-report.json");
|
|
115
|
-
try {
|
|
116
|
-
const result = await safeSpawnAsync(bin, [
|
|
117
|
-
"scan",
|
|
118
|
-
"--config",
|
|
119
|
-
resolved.configArg ?? "auto",
|
|
120
|
-
"--json",
|
|
121
|
-
"--json-output",
|
|
122
|
-
reportPath,
|
|
123
|
-
// Never fail the scan on findings — this is a read, not a gate
|
|
124
|
-
// (matches gitleaks's `--exit-code 0` intent).
|
|
125
|
-
"--no-error",
|
|
126
|
-
"--quiet",
|
|
127
|
-
"--disable-version-check",
|
|
128
|
-
// #1562 class fix: opengrep's own `.gitignore` respect covers the
|
|
129
|
-
// common case (scratch trees are usually gitignored), but not a
|
|
130
|
-
// scratch/cache tree that ISN'T (e.g. an un-gitignored worktree
|
|
131
|
-
// cache) — `--exclude` is semgrep-compatible, so a slash-free
|
|
132
|
-
// pattern matches that directory name anywhere in the tree,
|
|
133
|
-
// independent of gitignore. Same `EXCLUDED_DIRS`-derived list
|
|
134
|
-
// gitleaks/trivy use, so the three scanners can't drift apart.
|
|
135
|
-
...getScratchTreeDirNames().flatMap((name) => ["--exclude", name]),
|
|
136
|
-
cwd,
|
|
137
|
-
], { cwd, timeout: SCAN_TIMEOUT_MS });
|
|
138
|
-
if (result.error) {
|
|
139
|
-
this.log(`Scan error: ${result.error.message}`);
|
|
140
|
-
const reason = `${result.failure ?? "spawn-failed"}: ${result.error.message}`;
|
|
141
|
-
this.recordRefusal(cwd, reason, result.status);
|
|
142
|
-
return {
|
|
143
|
-
...EMPTY_RESULT,
|
|
144
|
-
scannedAt,
|
|
145
|
-
reason: "spawn-failed",
|
|
146
|
-
summary: reason.slice(0, 200),
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
if (!fs.existsSync(reportPath)) {
|
|
150
|
-
const reason = (result.stderr ?? "").trim().split("\n")[0] || "no report produced";
|
|
151
|
-
this.recordRefusal(cwd, reason, result.status);
|
|
152
|
-
return {
|
|
153
|
-
...EMPTY_RESULT,
|
|
154
|
-
scannedAt,
|
|
155
|
-
reason: "no-report",
|
|
156
|
-
summary: reason,
|
|
157
|
-
};
|
|
158
|
-
}
|
|
159
|
-
const raw = fs.readFileSync(reportPath, "utf-8");
|
|
160
|
-
const report = readOpengrepReport(raw);
|
|
161
|
-
if (report.verdict === "refused" || result.status !== 0) {
|
|
162
|
-
const reason = report.verdict === "refused"
|
|
163
|
-
? report.reason
|
|
164
|
-
: `opengrep exited with status ${result.status}`;
|
|
165
|
-
this.recordRefusal(cwd, reason, result.status);
|
|
166
|
-
return {
|
|
167
|
-
...EMPTY_RESULT,
|
|
168
|
-
scannedAt,
|
|
169
|
-
reason: "refused",
|
|
170
|
-
summary: reason.slice(0, 200),
|
|
171
|
-
};
|
|
172
|
-
}
|
|
173
|
-
if (report.partial) {
|
|
174
|
-
recordDegradationOnce({
|
|
175
|
-
kind: "opengrep-partial-scan",
|
|
176
|
-
subject: cwd,
|
|
177
|
-
reason: report.partial.reason,
|
|
178
|
-
metadata: { status: result.status },
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
// #2154: the one opengrep site that parsed a scan of this root.
|
|
182
|
-
return {
|
|
183
|
-
success: true,
|
|
184
|
-
// A warning-level partial report with no scanned paths proves that
|
|
185
|
-
// the producer went cold. A complete empty report still proves a
|
|
186
|
-
// genuine scan, so it is still "analysed" for the render layer's
|
|
187
|
-
// analysed-and-found-nothing state (#2970) — but it carries no
|
|
188
|
-
// FILE-level authority, which `analyzedFiles: []` below is what
|
|
189
|
-
// says.
|
|
190
|
-
analyzed: !report.partial || report.scanned.length > 0,
|
|
191
|
-
// #2962: the set is ALWAYS carried, empty included. "This producer
|
|
192
|
-
// declared its coverage and it was zero files" and "this producer
|
|
193
|
-
// declares no coverage at all" are different facts; dropping the
|
|
194
|
-
// empty array collapses them into the second, and the second is
|
|
195
|
-
// what hands a zero-file scan whole-root retirement authority
|
|
196
|
-
// downstream (`runnerRetirementDecision`, tools/lens-diagnostics.ts).
|
|
197
|
-
analyzedFiles: report.scanned.map((file) => realpathOrResolve(path.resolve(cwd, file))),
|
|
198
|
-
...(report.partial ? { partial: true } : {}),
|
|
199
|
-
...(report.partial ? { summary: report.partial.reason } : {}),
|
|
200
|
-
...(report.partial && report.scanned.length === 0
|
|
201
|
-
? { reason: "partial-no-paths" }
|
|
202
|
-
: {}),
|
|
203
|
-
findings: report.findings,
|
|
204
|
-
scannedAt,
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
catch (err) {
|
|
208
|
-
const reason = err instanceof Error ? err.message : String(err);
|
|
209
|
-
this.recordRefusal(cwd, reason, undefined);
|
|
210
|
-
return {
|
|
211
|
-
...EMPTY_RESULT,
|
|
212
|
-
scannedAt,
|
|
213
|
-
reason: "crashed",
|
|
214
|
-
summary: reason.slice(0, 200),
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
|
-
finally {
|
|
218
|
-
try {
|
|
219
|
-
fs.rmSync(outDir, { recursive: true, force: true });
|
|
220
|
-
}
|
|
221
|
-
catch {
|
|
222
|
-
// non-fatal
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
recordRefusal(cwd, reason, status) {
|
|
227
|
-
recordDegradationOnce({
|
|
228
|
-
kind: "opengrep-scan-refused",
|
|
229
|
-
subject: cwd,
|
|
230
|
-
reason,
|
|
231
|
-
metadata: { status },
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
function readOpengrepReport(raw) {
|
|
236
|
-
let parsed;
|
|
237
|
-
try {
|
|
238
|
-
parsed = JSON.parse(raw);
|
|
239
|
-
}
|
|
240
|
-
catch {
|
|
241
|
-
return { verdict: "refused", reason: "unparseable opengrep report" };
|
|
242
|
-
}
|
|
243
|
-
if (!parsed || typeof parsed !== "object")
|
|
244
|
-
return { verdict: "refused", reason: "unparseable opengrep report" };
|
|
245
|
-
const report = parsed;
|
|
246
|
-
if (!Array.isArray(report.results) && !Array.isArray(report.errors))
|
|
247
|
-
return { verdict: "refused", reason: "unparseable opengrep report" };
|
|
248
|
-
const errors = (Array.isArray(report.errors) ? report.errors : []).map((error) => {
|
|
249
|
-
if (typeof error === "string")
|
|
250
|
-
return { message: error };
|
|
251
|
-
if (!error || typeof error !== "object")
|
|
252
|
-
return { message: "unrecognised opengrep error entry" };
|
|
253
|
-
const entry = error;
|
|
254
|
-
const level = typeof entry.level === "string" ? entry.level : undefined;
|
|
255
|
-
const message = typeof entry.message === "string" ? entry.message : undefined;
|
|
256
|
-
return {
|
|
257
|
-
...(level ? { level } : {}),
|
|
258
|
-
message: message ?? level ?? "unrecognised opengrep error entry",
|
|
259
|
-
};
|
|
260
|
-
});
|
|
261
|
-
const refusal = errors.find((error) => error.level !== "warn");
|
|
262
|
-
if (refusal)
|
|
263
|
-
return { verdict: "refused", reason: refusal.message };
|
|
264
|
-
const scanned = Array.isArray(report.paths?.scanned)
|
|
265
|
-
? report.paths.scanned.filter((file) => typeof file === "string")
|
|
266
|
-
: [];
|
|
267
|
-
return {
|
|
268
|
-
verdict: "usable",
|
|
269
|
-
...(errors[0] ? { partial: { reason: errors[0].message } } : {}),
|
|
270
|
-
findings: parseOpengrepReport(parsed),
|
|
271
|
-
scanned,
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
// --- Parser ---
|
|
275
|
-
/**
|
|
276
|
-
* Map opengrep's `--json` report (semgrep-compatible schema: top-level
|
|
277
|
-
* `results: [{ check_id, path, start:{line,col}, end:{line,col}, extra:{
|
|
278
|
-
* message, severity, metadata:{cwe} } }]`) to our structured
|
|
279
|
-
* `OpengrepFinding[]` shape. Exported for unit tests.
|
|
280
|
-
*
|
|
281
|
-
* Verified against the real installed opengrep 1.25.0 binary's own `--json`
|
|
282
|
-
* output (not assumed from upstream semgrep docs — opengrep is a fork and its
|
|
283
|
-
* CLI surface has drifted in places, e.g. `--files-with-matches` requires
|
|
284
|
-
* `--experimental` where semgrep's doesn't).
|
|
285
|
-
*/
|
|
286
|
-
export function parseOpengrepReport(rawOrParsed) {
|
|
287
|
-
if (typeof rawOrParsed === "string" && !rawOrParsed.trim())
|
|
288
|
-
return [];
|
|
289
|
-
let parsed = rawOrParsed;
|
|
290
|
-
if (typeof rawOrParsed === "string") {
|
|
291
|
-
try {
|
|
292
|
-
parsed = JSON.parse(rawOrParsed);
|
|
293
|
-
}
|
|
294
|
-
catch {
|
|
295
|
-
return [];
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
if (!parsed || typeof parsed !== "object")
|
|
299
|
-
return [];
|
|
300
|
-
const results = parsed.results;
|
|
301
|
-
if (!Array.isArray(results))
|
|
302
|
-
return [];
|
|
303
|
-
const findings = [];
|
|
304
|
-
for (const entry of results) {
|
|
305
|
-
if (!entry || typeof entry !== "object")
|
|
306
|
-
continue;
|
|
307
|
-
const e = entry;
|
|
308
|
-
const checkId = typeof e.check_id === "string" ? e.check_id : undefined;
|
|
309
|
-
const filePath = typeof e.path === "string" ? e.path : undefined;
|
|
310
|
-
const start = e.start;
|
|
311
|
-
const end = e.end;
|
|
312
|
-
const startLine = typeof start?.line === "number" ? start.line : undefined;
|
|
313
|
-
if (!checkId || !filePath || !Number.isFinite(startLine))
|
|
314
|
-
continue;
|
|
315
|
-
const extra = e.extra ?? {};
|
|
316
|
-
const metadata = extra.metadata ?? {};
|
|
317
|
-
const cwe = Array.isArray(metadata.cwe)
|
|
318
|
-
? metadata.cwe.filter((c) => typeof c === "string")
|
|
319
|
-
: undefined;
|
|
320
|
-
findings.push({
|
|
321
|
-
checkId,
|
|
322
|
-
path: filePath,
|
|
323
|
-
startLine: startLine,
|
|
324
|
-
startCol: typeof start?.col === "number" ? start.col : 1,
|
|
325
|
-
endLine: typeof end?.line === "number" ? end.line : startLine,
|
|
326
|
-
endCol: typeof end?.col === "number" ? end.col : 1,
|
|
327
|
-
message: typeof extra.message === "string" ? extra.message : "opengrep finding",
|
|
328
|
-
severity: typeof extra.severity === "string" ? extra.severity : "WARNING",
|
|
329
|
-
cwe,
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
return findings;
|
|
333
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
import * as path from "node:path";
|
|
2
|
-
import { findLocalToolConfig } from "./path-utils.js";
|
|
3
|
-
// Opengrep is a fork of Semgrep and natively consumes the same rule format, so
|
|
4
|
-
// we discover both `.opengrep.*` (preferred) and the de-facto `.semgrep.*` rule
|
|
5
|
-
// files an existing repo may already carry.
|
|
6
|
-
const LOCAL_OPENGREP_CONFIG_NAMES = [
|
|
7
|
-
".opengrep.yml",
|
|
8
|
-
".opengrep.yaml",
|
|
9
|
-
"opengrep.yml",
|
|
10
|
-
"opengrep.yaml",
|
|
11
|
-
".semgrep.yml",
|
|
12
|
-
".semgrep.yaml",
|
|
13
|
-
"semgrep.yml",
|
|
14
|
-
"semgrep.yaml",
|
|
15
|
-
];
|
|
16
|
-
// Deliberately UNCEILINGED at $HOME (refs #2472 review round 3, F1):
|
|
17
|
-
// opengrep/semgrep's own resolver reads a rule file wherever it sits, and a
|
|
18
|
-
// user-level `~/.opengrep.yml` is a legitimate global config, not an
|
|
19
|
-
// escaped-workspace accident.
|
|
20
|
-
export function findLocalOpengrepConfig(startDir) {
|
|
21
|
-
return findLocalToolConfig(startDir, LOCAL_OPENGREP_CONFIG_NAMES);
|
|
22
|
-
}
|
|
23
|
-
function isRegistryOrAutoConfig(config) {
|
|
24
|
-
return (config === "auto" || config.startsWith("p/") || config.startsWith("r/"));
|
|
25
|
-
}
|
|
26
|
-
export function normalizeOpengrepConfigArg(config, cwd) {
|
|
27
|
-
if (!config)
|
|
28
|
-
return undefined;
|
|
29
|
-
const trimmed = config.trim();
|
|
30
|
-
if (!trimmed)
|
|
31
|
-
return undefined;
|
|
32
|
-
if (isRegistryOrAutoConfig(trimmed))
|
|
33
|
-
return trimmed;
|
|
34
|
-
return path.isAbsolute(trimmed) ? trimmed : path.resolve(cwd, trimmed);
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Decide whether Opengrep dispatch runs, and with which `--config`. The surface
|
|
38
|
-
* is intentionally seamless — there is no persisted `.pi-lens/opengrep.json` and
|
|
39
|
-
* no management command. Opengrep is enabled when EITHER:
|
|
40
|
-
*
|
|
41
|
-
* - the repo carries a rule file (`.opengrep.yml`/`.semgrep.yml`, …) — the
|
|
42
|
-
* rule file IS the opt-in signal; or
|
|
43
|
-
* - `--lens-opengrep` is set — self-sufficient: with no local/explicit config
|
|
44
|
-
* it defaults to `--config auto` (Opengrep's login-free Community ruleset).
|
|
45
|
-
*
|
|
46
|
-
* `--lens-opengrep-config <auto|p/pack|path>` overrides the chosen config.
|
|
47
|
-
*/
|
|
48
|
-
export function resolveOpengrepConfig(cwd, flags) {
|
|
49
|
-
const localConfig = findLocalOpengrepConfig(cwd);
|
|
50
|
-
const flagConfig = typeof flags?.config === "string" && flags.config.trim()
|
|
51
|
-
? flags.config.trim()
|
|
52
|
-
: undefined;
|
|
53
|
-
// A non-empty --lens-opengrep-config implies --lens-opengrep (passing a
|
|
54
|
-
// config is an unambiguous opt-in).
|
|
55
|
-
if (flags?.enabled || flagConfig) {
|
|
56
|
-
// Self-sufficient flag: explicit config → local rule file → `auto`.
|
|
57
|
-
const explicit = normalizeOpengrepConfigArg(flagConfig ?? localConfig, cwd);
|
|
58
|
-
return {
|
|
59
|
-
enabled: true,
|
|
60
|
-
configArg: explicit ?? "auto",
|
|
61
|
-
source: explicit && localConfig && !flagConfig ? "local" : "flag",
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
if (localConfig) {
|
|
65
|
-
return {
|
|
66
|
-
enabled: true,
|
|
67
|
-
configArg: localConfig,
|
|
68
|
-
source: "local",
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
return {
|
|
72
|
-
enabled: false,
|
|
73
|
-
source: "disabled",
|
|
74
|
-
reason: "no local opengrep config (.opengrep.yml) and --lens-opengrep not set",
|
|
75
|
-
};
|
|
76
|
-
}
|