pi-lens 4.3.0 → 4.4.1
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 +1159 -0
- package/README.md +116 -25
- package/config/dependency-cruiser-eager-allowlist.json +6 -2
- package/dist/chunk-2BEMIWEW.js +51 -0
- package/dist/chunk-2EECBNC5.js +89 -0
- package/dist/chunk-2FQ62SPM.js +83 -0
- package/dist/chunk-2UMYMRI3.js +118 -0
- package/dist/chunk-34OCDWOS.js +48 -0
- package/dist/chunk-3FERWMCH.js +144 -0
- package/dist/chunk-3JL6IFD7.js +97 -0
- package/dist/chunk-3JSEWUWI.js +327 -0
- package/dist/chunk-3MED75HT.js +37 -0
- package/dist/chunk-3MRXIJ6I.js +79 -0
- package/dist/chunk-3P4PF2BX.js +2250 -0
- package/dist/chunk-3PNFWVHT.js +201 -0
- package/dist/chunk-3TTPKMEF.js +162 -0
- package/dist/chunk-5JHXUETW.js +326 -0
- package/dist/chunk-5W3R6LFT.js +24 -0
- package/dist/chunk-64LU2OVH.js +341 -0
- package/dist/chunk-6B5I6ICN.js +44 -0
- package/dist/chunk-6P54TMWL.js +274 -0
- package/dist/chunk-6UYA642J.js +145 -0
- package/dist/chunk-6XX5HCLK.js +398 -0
- package/dist/chunk-7AXO3ZDF.js +30 -0
- package/dist/chunk-7BX5DWSA.js +1907 -0
- package/dist/chunk-7ELY2CSM.js +902 -0
- package/dist/chunk-7M4T5N3V.js +38 -0
- package/dist/chunk-7U2IDNXN.js +37 -0
- package/dist/chunk-ABBOA7UD.js +157 -0
- package/dist/chunk-AFZYMAIV.js +756 -0
- package/dist/chunk-ALQRYH6O.js +112 -0
- package/dist/chunk-AXKPQ6ZI.js +1610 -0
- package/dist/chunk-BHWHXMQ2.js +62 -0
- package/dist/chunk-BJF25SUG.js +22 -0
- package/dist/chunk-BNKLYOOO.js +18 -0
- package/dist/chunk-BW5KFIQC.js +59 -0
- package/dist/chunk-CBD2B5CP.js +599 -0
- package/dist/chunk-CFYISHUW.js +42 -0
- package/dist/chunk-CMU4RMJB.js +30 -0
- package/dist/chunk-CULQYFLU.js +14 -0
- package/dist/chunk-D65GOCJB.js +289 -0
- package/dist/chunk-D6YF5HKX.js +59 -0
- package/dist/chunk-DMS52BEP.js +342 -0
- package/dist/chunk-ELVWJYRV.js +211 -0
- package/dist/chunk-EUT3B22Y.js +27 -0
- package/dist/chunk-F5VLZHUW.js +146 -0
- package/dist/chunk-FC4RP4I2.js +12 -0
- package/dist/chunk-FGALODG3.js +55 -0
- package/dist/chunk-G3RLJYA2.js +2358 -0
- package/dist/chunk-GAYGGICG.js +32 -0
- package/dist/chunk-H2W2AXD3.js +419 -0
- package/dist/chunk-H5EV3VMF.js +114 -0
- package/dist/chunk-HREZQCT3.js +106 -0
- package/dist/chunk-HSIRMK2D.js +517 -0
- package/dist/chunk-IMSQR4WO.js +184 -0
- package/dist/chunk-IQZXOZ7S.js +4816 -0
- package/dist/chunk-IR6XFA5P.js +37 -0
- package/dist/chunk-IUKPRZER.js +78 -0
- package/dist/chunk-IUR76K6A.js +262 -0
- package/dist/chunk-J3FZR3YY.js +98 -0
- package/dist/chunk-J6DFZDFA.js +562 -0
- package/dist/chunk-J7WJZ6W7.js +50 -0
- package/dist/chunk-JONGANYH.js +202 -0
- package/dist/chunk-KJCWXUUS.js +425 -0
- package/dist/chunk-KJN4IOEJ.js +17 -0
- package/dist/chunk-KMGPUKFD.js +25 -0
- package/dist/chunk-LD7WFTRX.js +4533 -0
- package/dist/chunk-LJDODBBZ.js +78 -0
- package/dist/chunk-LNOMA3MP.js +169 -0
- package/dist/chunk-MGIWSROG.js +2334 -0
- package/dist/chunk-MQA2YBAH.js +308 -0
- package/dist/chunk-MTDRLSI7.js +21720 -0
- package/dist/chunk-N2IRDBZI.js +2355 -0
- package/dist/chunk-N77WFUL7.js +50 -0
- package/dist/chunk-N7YNJE5R.js +466 -0
- package/dist/chunk-NABLC7W3.js +148 -0
- package/dist/chunk-NFXP47RV.js +999 -0
- package/dist/chunk-NJF2X5XF.js +45 -0
- package/dist/chunk-NXL4FFQQ.js +47 -0
- package/dist/chunk-O7HZX7CA.js +309 -0
- package/dist/chunk-OC7LYAU5.js +708 -0
- package/dist/chunk-OEX24ECI.js +348 -0
- package/dist/chunk-OYOB3ZFG.js +78 -0
- package/dist/chunk-OYTMZXRF.js +41 -0
- package/dist/chunk-OZJINN4O.js +84 -0
- package/dist/chunk-PCHDGUKT.js +23 -0
- package/dist/chunk-QOZXJ4NA.js +3364 -0
- package/dist/chunk-QYF5S6P6.js +45 -0
- package/dist/chunk-RJFED73B.js +79 -0
- package/dist/chunk-RTQNRM5X.js +27 -0
- package/dist/chunk-S6AMWKPC.js +189 -0
- package/dist/chunk-T4QZ6FEH.js +308 -0
- package/dist/chunk-T54VJRAD.js +5456 -0
- package/dist/chunk-TA5L5KWQ.js +167 -0
- package/dist/chunk-TQFBZVCG.js +27 -0
- package/dist/chunk-U52SAGRM.js +62 -0
- package/dist/chunk-UEAHAMEI.js +5814 -0
- package/dist/chunk-UGSMCQ4D.js +327 -0
- package/dist/chunk-UOPVJQ4N.js +103 -0
- package/dist/chunk-USHG4DLH.js +459 -0
- package/dist/chunk-UXVNL3D7.js +23 -0
- package/dist/chunk-V5MEBST3.js +4139 -0
- package/dist/chunk-VGEVL5EQ.js +29 -0
- package/dist/chunk-VPWKF3GN.js +87 -0
- package/dist/chunk-VSMJK3ZJ.js +1250 -0
- package/dist/chunk-VYKKMYVT.js +560 -0
- package/dist/chunk-VZHJS6DR.js +442 -0
- package/dist/chunk-WATC3IQR.js +213 -0
- package/dist/chunk-WPE5FPGR.js +54 -0
- package/dist/chunk-WSEWKCXU.js +188 -0
- package/dist/chunk-WW5BLB74.js +659 -0
- package/dist/chunk-XGUL4SLQ.js +406 -0
- package/dist/chunk-XHSCVSOL.js +170 -0
- package/dist/chunk-XIMYZ3JA.js +27 -0
- package/dist/chunk-YLN4K6WD.js +385 -0
- package/dist/chunk-Z3CCVDUB.js +76 -0
- package/dist/chunk-Z54ZSOBZ.js +61 -0
- package/dist/chunk-Z6BB4JLQ.js +478 -0
- package/dist/chunk-Z7QQA2KT.js +27 -0
- package/dist/chunk-ZETYB3XG.js +2626 -0
- package/dist/chunk-ZMOMPX2Z.js +87 -0
- package/dist/chunk-ZOEYVXSV.js +149 -0
- package/dist/chunk-ZZUFZUQZ.js +12120 -0
- package/dist/index.js +39712 -29876
- package/dist/mcp/analyze-cli.js +186 -232
- package/dist/mcp/cli.js +137 -98
- package/dist/mcp/server.js +22688 -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 +5 -4
- package/docs/configuration.md +28 -2
- package/docs/custom-rules.md +25 -2
- package/docs/environment-variables.md +86 -8
- package/docs/features.md +45 -5
- package/docs/globalconfig.md +2 -1
- package/docs/io-bridge-v2-migration.md +94 -0
- package/docs/lsp-capability-matrix.md +37 -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 +160 -88
- package/docs/pi-lens-investigator.md +74 -26
- package/docs/pi-lens-merge-policy.md +736 -0
- package/docs/pi-lens-monitor.md +75 -7
- package/docs/pi-lens-retro.md +6 -4
- package/docs/pi-lens-reviewer.md +189 -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/schema/pi-lens-config-v1.json +530 -0
- package/docs/servercapabilities.md +56 -49
- package/docs/settings.md +1 -0
- package/docs/usage.md +5 -1
- package/docs/word-index.md +6 -0
- 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/rule-tests/no-identity-operator-on-literals-test.yml +12 -2
- package/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +2 -0
- package/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +2 -0
- package/rules/ast-grep-rules/rules/advisory-registry-subset.yml +50 -0
- package/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +20 -12
- package/rules/ast-grep-rules/rules/throw-new-error-js.yml +2 -2
- package/rules/ast-grep-rules/rules/throw-new-error.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 +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,40 +0,0 @@
|
|
|
1
|
-
import { isTestFile } from "../../file-utils.js";
|
|
2
|
-
export const asyncNoiseRule = {
|
|
3
|
-
id: "async-noise",
|
|
4
|
-
requires: ["file.functionSummaries"],
|
|
5
|
-
appliesTo(ctx) {
|
|
6
|
-
return /\.tsx?$/.test(ctx.filePath) && !isTestFile(ctx.filePath);
|
|
7
|
-
},
|
|
8
|
-
evaluate(ctx, store) {
|
|
9
|
-
const summaries = store.getFileFact(ctx.filePath, "file.functionSummaries");
|
|
10
|
-
if (!summaries)
|
|
11
|
-
return [];
|
|
12
|
-
const diagnostics = [];
|
|
13
|
-
// Function name patterns that legitimately declare async for interface compliance
|
|
14
|
-
// or future-proofing (lifecycle hooks, event handlers, middleware, abstract stubs)
|
|
15
|
-
const ASYNC_INTERFACE_PATTERN = /^(on[A-Z]|handle[A-Z]|before[A-Z]|after[A-Z]|setup|teardown|init|dispose|connect|disconnect|open|close|start|stop|run|execute|invoke|dispatch|middleware)/;
|
|
16
|
-
for (const fn of summaries) {
|
|
17
|
-
if (fn.isAsync &&
|
|
18
|
-
!fn.hasAwait &&
|
|
19
|
-
!fn.hasReturnAwaitCall &&
|
|
20
|
-
!fn.isPassThroughWrapper &&
|
|
21
|
-
!fn.hasExplicitPromiseReturnType &&
|
|
22
|
-
!ASYNC_INTERFACE_PATTERN.test(fn.name) &&
|
|
23
|
-
// Skip single-statement functions — likely interface stubs or thin wrappers
|
|
24
|
-
fn.statementCount > 1) {
|
|
25
|
-
diagnostics.push({
|
|
26
|
-
id: `async-noise:${ctx.filePath}:${fn.line}:${fn.column}`,
|
|
27
|
-
tool: "fact-rules",
|
|
28
|
-
filePath: ctx.filePath,
|
|
29
|
-
line: fn.line,
|
|
30
|
-
column: fn.column,
|
|
31
|
-
severity: "warning",
|
|
32
|
-
semantic: "warning",
|
|
33
|
-
message: `Async function '${fn.name}' has no await and appears to add async noise`,
|
|
34
|
-
rule: "async-noise",
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return diagnostics;
|
|
39
|
-
},
|
|
40
|
-
};
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
export const asyncUnnecessaryWrapperRule = {
|
|
2
|
-
id: "async-unnecessary-wrapper",
|
|
3
|
-
requires: ["file.functionSummaries"],
|
|
4
|
-
appliesTo(ctx) {
|
|
5
|
-
return /\.tsx?$/.test(ctx.filePath);
|
|
6
|
-
},
|
|
7
|
-
evaluate(ctx, store) {
|
|
8
|
-
const fns = store.getFileFact(ctx.filePath, "file.functionSummaries") ?? [];
|
|
9
|
-
const diagnostics = [];
|
|
10
|
-
for (const f of fns) {
|
|
11
|
-
if (!f.isAsync || !f.isPassThroughWrapper || f.hasAwait)
|
|
12
|
-
continue;
|
|
13
|
-
diagnostics.push({
|
|
14
|
-
id: `async-unnecessary-wrapper:${ctx.filePath}:${f.line}`,
|
|
15
|
-
tool: "fact-rules",
|
|
16
|
-
rule: "async-unnecessary-wrapper",
|
|
17
|
-
filePath: ctx.filePath,
|
|
18
|
-
line: f.line,
|
|
19
|
-
column: f.column,
|
|
20
|
-
severity: "warning",
|
|
21
|
-
semantic: "warning",
|
|
22
|
-
message: `'${f.name}' is async but has no await and just forwards to '${f.passThroughTarget}' — the async keyword is unnecessary and wraps the return in an extra Promise`,
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
return diagnostics;
|
|
26
|
-
},
|
|
27
|
-
};
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* cors-wildcard — Access-Control-Allow-Origin: * (TS/JS/Python/Go). Regex/line-based
|
|
3
|
-
* (no compiler); formerly SN-004 in the SonarJS-inspired batch (#402).
|
|
4
|
-
*/
|
|
5
|
-
export const corsWildcardRule = {
|
|
6
|
-
id: "cors-wildcard",
|
|
7
|
-
requires: ["file.content"],
|
|
8
|
-
appliesTo(ctx) {
|
|
9
|
-
return /\.(tsx?|py|go)$/.test(ctx.filePath);
|
|
10
|
-
},
|
|
11
|
-
evaluate(ctx, store) {
|
|
12
|
-
const content = store.getFileFact(ctx.filePath, "file.content");
|
|
13
|
-
if (!content)
|
|
14
|
-
return [];
|
|
15
|
-
const diagnostics = [];
|
|
16
|
-
const lines = content.split("\n");
|
|
17
|
-
for (let i = 0; i < lines.length; i++) {
|
|
18
|
-
const line = lines[i];
|
|
19
|
-
if (/^\s*(?:\/\/|\*|#|\/)/.test(line))
|
|
20
|
-
continue;
|
|
21
|
-
const isWildcard =
|
|
22
|
-
// TS/JS: header assignment or cors() call
|
|
23
|
-
(/["']Access-Control-Allow-Origin["']/.test(line) &&
|
|
24
|
-
/["']\*["']/.test(line)) ||
|
|
25
|
-
/origin\s*:\s*["']\*["']/.test(line) ||
|
|
26
|
-
(/cors\s*\(/.test(line) && /\*/.test(line)) ||
|
|
27
|
-
// Python (FastAPI CORSMiddleware / Flask-CORS):
|
|
28
|
-
// wildcard allow_origins/origins assignment
|
|
29
|
-
/(?:allow_origins|origins)\s*=\s*["']\*["']/.test(line) ||
|
|
30
|
-
// wildcard allow_origins/origins array assignment
|
|
31
|
-
/(?:allow_origins|origins)\s*=\s*[[(]["']\*["']/.test(line) ||
|
|
32
|
-
// Go (gin-cors, chi-cors, gorilla):
|
|
33
|
-
// AllowAllOrigins enabled
|
|
34
|
-
/AllowAllOrigins\s*:\s*true/.test(line) ||
|
|
35
|
-
// wildcard AllowOrigins/AllowedOrigins slice
|
|
36
|
-
// Use [^*\n]{0,60} instead of .* to prevent super-linear backtracking
|
|
37
|
-
/Allow(?:ed)?Origins[^*\n]{0,60}\*/.test(line);
|
|
38
|
-
if (isWildcard) {
|
|
39
|
-
diagnostics.push({
|
|
40
|
-
id: `cors-wildcard:${ctx.filePath}:${i + 1}`,
|
|
41
|
-
tool: "fact-rules",
|
|
42
|
-
rule: "cors-wildcard",
|
|
43
|
-
filePath: ctx.filePath,
|
|
44
|
-
line: i + 1,
|
|
45
|
-
column: 1,
|
|
46
|
-
severity: "error",
|
|
47
|
-
semantic: "blocking",
|
|
48
|
-
message: "CORS wildcard origin (*) allows any website to make credentialed requests — restrict to known origins",
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return diagnostics;
|
|
53
|
-
},
|
|
54
|
-
};
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
export const errorObscuringRule = {
|
|
2
|
-
id: "error-obscuring",
|
|
3
|
-
requires: ["file.tryCatchSummaries"],
|
|
4
|
-
appliesTo(ctx) {
|
|
5
|
-
return /\.tsx?$/.test(ctx.filePath);
|
|
6
|
-
},
|
|
7
|
-
evaluate(ctx, store) {
|
|
8
|
-
const summaries = store.getFileFact(ctx.filePath, "file.tryCatchSummaries");
|
|
9
|
-
if (!summaries)
|
|
10
|
-
return [];
|
|
11
|
-
const diagnostics = [];
|
|
12
|
-
for (const s of summaries) {
|
|
13
|
-
if (!s.isEmpty &&
|
|
14
|
-
!s.hasRethrow &&
|
|
15
|
-
s.catchParam !== null &&
|
|
16
|
-
!s.bodyText.includes(s.catchParam)) {
|
|
17
|
-
diagnostics.push({
|
|
18
|
-
id: `error-obscuring:${ctx.filePath}:${s.line}:${s.column}`,
|
|
19
|
-
tool: "fact-rules",
|
|
20
|
-
rule: "error-obscuring",
|
|
21
|
-
filePath: ctx.filePath,
|
|
22
|
-
line: s.line,
|
|
23
|
-
column: s.column,
|
|
24
|
-
severity: "warning",
|
|
25
|
-
semantic: "warning",
|
|
26
|
-
message: `Catch block catches '${s.catchParam}' but never references it — the error is obscured`,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return diagnostics;
|
|
31
|
-
},
|
|
32
|
-
};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export const errorSwallowingRule = {
|
|
2
|
-
id: "error-swallowing",
|
|
3
|
-
requires: ["file.tryCatchSummaries"],
|
|
4
|
-
appliesTo(ctx) {
|
|
5
|
-
return /\.tsx?$/.test(ctx.filePath);
|
|
6
|
-
},
|
|
7
|
-
evaluate(ctx, store) {
|
|
8
|
-
const summaries = store.getFileFact(ctx.filePath, "file.tryCatchSummaries");
|
|
9
|
-
if (!summaries)
|
|
10
|
-
return [];
|
|
11
|
-
const diagnostics = [];
|
|
12
|
-
for (const s of summaries) {
|
|
13
|
-
if (s.isEmpty &&
|
|
14
|
-
!s.isDocumentedLocalFallback &&
|
|
15
|
-
s.boundaryCategory !== "fs") {
|
|
16
|
-
diagnostics.push({
|
|
17
|
-
id: `error-swallowing:${ctx.filePath}:${s.line}:${s.column}`,
|
|
18
|
-
tool: "fact-rules",
|
|
19
|
-
rule: "error-swallowing",
|
|
20
|
-
filePath: ctx.filePath,
|
|
21
|
-
line: s.line,
|
|
22
|
-
column: s.column,
|
|
23
|
-
severity: "error",
|
|
24
|
-
semantic: "blocking",
|
|
25
|
-
message: `Empty catch block silently swallows errors`,
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
return diagnostics;
|
|
30
|
-
},
|
|
31
|
-
};
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared test-framework-call recognition for `high-fan-out` and `high-complexity`
|
|
3
|
-
* (#577). A normal `it()`/`describe()` body naturally invokes many assertion/mock
|
|
4
|
-
* helpers — that's test structure, not a coordination smell or genuine complexity.
|
|
5
|
-
*
|
|
6
|
-
* Two complementary heuristics, both call-name-based (no `ctx.fileRole` gating —
|
|
7
|
-
* these calls only exist in test-framework code, so the signal is safe to apply
|
|
8
|
-
* unconditionally):
|
|
9
|
-
*
|
|
10
|
-
* 1. `isTestFrameworkNoiseCall` — filters individual "meaningful calls" the same
|
|
11
|
-
* way `console.*`/`Math.*`/etc. are already excluded in high-fan-out. Handles
|
|
12
|
-
* assertion-heavy `it()` bodies directly.
|
|
13
|
-
* 2. `isTestSuiteOrganizer` — a `describe()`/`it()`/`test()` wrapper's own
|
|
14
|
-
* FunctionSummary aggregates every call and branch from ALL of its nested test
|
|
15
|
-
* bodies (the shared tree-sitter walk in function-facts.ts does not stop at
|
|
16
|
-
* nested-function boundaries, since each nested callback also gets its own,
|
|
17
|
-
* correctly-scoped, FunctionSummary). That aggregation is not real fan-out or
|
|
18
|
-
* complexity — it's the sum of independent nested tests. A function is an
|
|
19
|
-
* "organizer" if it directly invokes `it`/`test`/`describe` (or their
|
|
20
|
-
* `.only`/`.skip`/`.each` variants) — i.e. it exists to group other tests, not
|
|
21
|
-
* to implement logic itself. This does NOT exempt genuinely complex/tangled
|
|
22
|
-
* test HELPER functions, since those don't call `it`/`describe`/`test`
|
|
23
|
-
* themselves.
|
|
24
|
-
*/
|
|
25
|
-
const EXPECT_CHAIN_PREFIX = "expect(";
|
|
26
|
-
const TEST_LIFECYCLE_NAMES = new Set([
|
|
27
|
-
"it",
|
|
28
|
-
"test",
|
|
29
|
-
"describe",
|
|
30
|
-
"beforeeach",
|
|
31
|
-
"aftereach",
|
|
32
|
-
"beforeall",
|
|
33
|
-
"afterall",
|
|
34
|
-
]);
|
|
35
|
-
const TEST_LIFECYCLE_PREFIXES = ["it.", "test.", "describe."];
|
|
36
|
-
const MOCK_LIBRARY_PREFIXES = ["vi.", "jest."];
|
|
37
|
-
/**
|
|
38
|
-
* True if `call` (a raw callee string from `FunctionSummary.outgoingCalls`) is
|
|
39
|
-
* test-framework noise: an `expect(...)` assertion chain, a test lifecycle call
|
|
40
|
-
* (`it`/`describe`/`test`/`beforeEach`/etc., including `.only`/`.skip`/`.each`
|
|
41
|
-
* variants), or a mock-library call (`vi.*`/`jest.*`).
|
|
42
|
-
*/
|
|
43
|
-
export function isTestFrameworkNoiseCall(call) {
|
|
44
|
-
const lower = call.toLowerCase();
|
|
45
|
-
if (lower === "expect" || lower.startsWith(EXPECT_CHAIN_PREFIX))
|
|
46
|
-
return true;
|
|
47
|
-
if (TEST_LIFECYCLE_NAMES.has(lower))
|
|
48
|
-
return true;
|
|
49
|
-
if (TEST_LIFECYCLE_PREFIXES.some((p) => lower.startsWith(p)))
|
|
50
|
-
return true;
|
|
51
|
-
if (MOCK_LIBRARY_PREFIXES.some((p) => lower.startsWith(p)))
|
|
52
|
-
return true;
|
|
53
|
-
return false;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* True if this function's (unfiltered) outgoing calls include a direct call to
|
|
57
|
-
* `it`/`test`/`describe` — i.e. it groups nested test bodies rather than
|
|
58
|
-
* implementing logic itself. Its aggregated fan-out/complexity reflects the sum
|
|
59
|
-
* of independent nested tests, not one function's real signal.
|
|
60
|
-
*/
|
|
61
|
-
export function isTestSuiteOrganizer(calls) {
|
|
62
|
-
return calls.some((call) => {
|
|
63
|
-
const lower = call.toLowerCase();
|
|
64
|
-
const base = lower.split("(")[0].split(".")[0];
|
|
65
|
-
return base === "it" || base === "test" || base === "describe";
|
|
66
|
-
});
|
|
67
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import { isTestSuiteOrganizer } from "./framework-call-noise.js";
|
|
2
|
-
// Defaults match the historical hardcoded values so behavior is unchanged for
|
|
3
|
-
// projects without a config. Project-specific overrides are read from the
|
|
4
|
-
// per-dispatch context; these mutable fallbacks exist for tests/legacy direct
|
|
5
|
-
// rule evaluation only.
|
|
6
|
-
const DEFAULT_HIGH_COMPLEXITY_THRESHOLD = 15;
|
|
7
|
-
const DEFAULT_HIGH_COMPLEXITY_DEPTH_THRESHOLD = 6;
|
|
8
|
-
let ccThreshold = DEFAULT_HIGH_COMPLEXITY_THRESHOLD;
|
|
9
|
-
let depthThreshold = DEFAULT_HIGH_COMPLEXITY_DEPTH_THRESHOLD;
|
|
10
|
-
function isPositiveFiniteThreshold(value) {
|
|
11
|
-
return Number.isFinite(value) && value > 0;
|
|
12
|
-
}
|
|
13
|
-
/** Override fallback thresholds for tests/legacy direct rule evaluation. */
|
|
14
|
-
export function setHighComplexityThresholds(cc, depth) {
|
|
15
|
-
// Non-positive thresholds make every function violate the rule; treat them as
|
|
16
|
-
// invalid config/test input rather than turning the rule into noise.
|
|
17
|
-
if (isPositiveFiniteThreshold(cc))
|
|
18
|
-
ccThreshold = cc;
|
|
19
|
-
if (isPositiveFiniteThreshold(depth))
|
|
20
|
-
depthThreshold = depth;
|
|
21
|
-
}
|
|
22
|
-
/** Test helper: restore compile-time defaults. */
|
|
23
|
-
export function resetHighComplexityThresholds() {
|
|
24
|
-
ccThreshold = DEFAULT_HIGH_COMPLEXITY_THRESHOLD;
|
|
25
|
-
depthThreshold = DEFAULT_HIGH_COMPLEXITY_DEPTH_THRESHOLD;
|
|
26
|
-
}
|
|
27
|
-
export const highComplexityRule = {
|
|
28
|
-
id: "high-complexity",
|
|
29
|
-
requires: ["file.functionSummaries"],
|
|
30
|
-
appliesTo(ctx) {
|
|
31
|
-
return /\.tsx?$/.test(ctx.filePath);
|
|
32
|
-
},
|
|
33
|
-
evaluate(ctx, store) {
|
|
34
|
-
const fns = store.getFileFact(ctx.filePath, "file.functionSummaries") ?? [];
|
|
35
|
-
const diagnostics = [];
|
|
36
|
-
const configuredCcThreshold = ctx.projectConfig?.rules["high-complexity"]?.threshold;
|
|
37
|
-
const activeCcThreshold = configuredCcThreshold ?? ccThreshold;
|
|
38
|
-
for (const f of fns) {
|
|
39
|
-
// A describe()/it()/test() wrapper's own complexity/nesting-depth
|
|
40
|
-
// aggregates branches from ALL of its nested test bodies (#577) — e.g. a
|
|
41
|
-
// `for` loop inside each of several `it()`s sums into the enclosing
|
|
42
|
-
// `describe()`'s cyclomatic complexity, even though no single test is
|
|
43
|
-
// complex. Unlike high-fan-out's call-name filter, there's no per-call
|
|
44
|
-
// signal to exclude for branch counting, so the equivalent fix here is to
|
|
45
|
-
// skip the organizer function itself. Genuinely complex test HELPER
|
|
46
|
-
// functions don't call it/describe/test themselves, so they're unaffected.
|
|
47
|
-
if (isTestSuiteOrganizer(f.outgoingCalls))
|
|
48
|
-
continue;
|
|
49
|
-
const ccBreached = f.cyclomaticComplexity >= activeCcThreshold;
|
|
50
|
-
const depthBreached = f.maxNestingDepth >= depthThreshold;
|
|
51
|
-
if (!ccBreached && !depthBreached)
|
|
52
|
-
continue;
|
|
53
|
-
const parts = [];
|
|
54
|
-
if (ccBreached)
|
|
55
|
-
parts.push(`cyclomatic complexity ${f.cyclomaticComplexity}`);
|
|
56
|
-
if (depthBreached)
|
|
57
|
-
parts.push(`nesting depth ${f.maxNestingDepth}`);
|
|
58
|
-
diagnostics.push({
|
|
59
|
-
id: `high-complexity:${ctx.filePath}:${f.line}`,
|
|
60
|
-
tool: "fact-rules",
|
|
61
|
-
rule: "high-complexity",
|
|
62
|
-
filePath: ctx.filePath,
|
|
63
|
-
line: f.line,
|
|
64
|
-
column: f.column,
|
|
65
|
-
severity: "warning",
|
|
66
|
-
semantic: "warning",
|
|
67
|
-
message: `'${f.name}' has ${parts.join(" and ")} — consider breaking it up`,
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
return diagnostics;
|
|
71
|
-
},
|
|
72
|
-
};
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { isTestFrameworkNoiseCall, isTestSuiteOrganizer, } from "./framework-call-noise.js";
|
|
2
|
-
// Default matches the historical hardcoded value so behavior is unchanged for
|
|
3
|
-
// projects without a config. Project-specific overrides are read from the
|
|
4
|
-
// per-dispatch context; this mutable fallback exists for tests/legacy direct
|
|
5
|
-
// rule evaluation only.
|
|
6
|
-
const DEFAULT_HIGH_FAN_OUT_THRESHOLD = 20;
|
|
7
|
-
let fanOutThreshold = DEFAULT_HIGH_FAN_OUT_THRESHOLD;
|
|
8
|
-
/** Override fallback threshold for tests/legacy direct rule evaluation. */
|
|
9
|
-
export function setHighFanOutThreshold(n) {
|
|
10
|
-
// Non-positive thresholds make every function violate the rule; treat them as
|
|
11
|
-
// invalid config/test input rather than turning the rule into noise.
|
|
12
|
-
if (Number.isFinite(n) && n > 0)
|
|
13
|
-
fanOutThreshold = n;
|
|
14
|
-
}
|
|
15
|
-
/** Test helper: restore compile-time default. */
|
|
16
|
-
export function resetHighFanOutThreshold() {
|
|
17
|
-
fanOutThreshold = DEFAULT_HIGH_FAN_OUT_THRESHOLD;
|
|
18
|
-
}
|
|
19
|
-
export const highFanOutRule = {
|
|
20
|
-
id: "high-fan-out",
|
|
21
|
-
requires: ["file.functionSummaries"],
|
|
22
|
-
appliesTo(ctx) {
|
|
23
|
-
return /\.tsx?$/.test(ctx.filePath);
|
|
24
|
-
},
|
|
25
|
-
evaluate(ctx, store) {
|
|
26
|
-
const fns = store.getFileFact(ctx.filePath, "file.functionSummaries") ?? [];
|
|
27
|
-
const diagnostics = [];
|
|
28
|
-
const configuredFanOutThreshold = ctx.projectConfig?.rules["high-fan-out"]?.threshold;
|
|
29
|
-
const activeFanOutThreshold = configuredFanOutThreshold ?? fanOutThreshold;
|
|
30
|
-
for (const f of fns) {
|
|
31
|
-
// A describe()/it()/test() wrapper's own call list aggregates every call
|
|
32
|
-
// from ALL of its nested test bodies (#577) — not real fan-out. Genuinely
|
|
33
|
-
// complex test HELPER functions don't call it/describe/test themselves, so
|
|
34
|
-
// they're unaffected.
|
|
35
|
-
if (isTestSuiteOrganizer(f.outgoingCalls))
|
|
36
|
-
continue;
|
|
37
|
-
// Filter out noise: utility calls, logging, type assertions, and
|
|
38
|
-
// test-framework calls (expect/it/describe/vi.*/jest.*, #577) — assertion-
|
|
39
|
-
// and mock-heavy test bodies naturally call many of these; that's test
|
|
40
|
-
// structure, not a coordination smell.
|
|
41
|
-
const meaningful = f.outgoingCalls.filter((c) => {
|
|
42
|
-
const lower = c.toLowerCase();
|
|
43
|
-
return (!lower.startsWith("console.") &&
|
|
44
|
-
!lower.startsWith("math.") &&
|
|
45
|
-
!lower.startsWith("json.") &&
|
|
46
|
-
!lower.startsWith("object.") &&
|
|
47
|
-
!lower.startsWith("array.") &&
|
|
48
|
-
!lower.startsWith("string(") &&
|
|
49
|
-
!lower.startsWith("number(") &&
|
|
50
|
-
!lower.startsWith("boolean(") &&
|
|
51
|
-
!lower.startsWith("error(") &&
|
|
52
|
-
c !== "resolve" &&
|
|
53
|
-
c !== "reject" &&
|
|
54
|
-
c !== "next" &&
|
|
55
|
-
c !== "done" &&
|
|
56
|
-
!isTestFrameworkNoiseCall(c));
|
|
57
|
-
});
|
|
58
|
-
if (meaningful.length < activeFanOutThreshold)
|
|
59
|
-
continue;
|
|
60
|
-
diagnostics.push({
|
|
61
|
-
id: `high-fan-out:${ctx.filePath}:${f.line}`,
|
|
62
|
-
tool: "fact-rules",
|
|
63
|
-
rule: "high-fan-out",
|
|
64
|
-
filePath: ctx.filePath,
|
|
65
|
-
line: f.line,
|
|
66
|
-
column: f.column,
|
|
67
|
-
severity: "warning",
|
|
68
|
-
semantic: "warning",
|
|
69
|
-
message: `'${f.name}' calls ${meaningful.length} distinct functions — coordination smell, consider splitting responsibilities`,
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
return diagnostics;
|
|
73
|
-
},
|
|
74
|
-
};
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* high-import-coupling — a file importing from > 15 distinct modules. Fact-based
|
|
3
|
-
* (reads `file.imports` from the tree-sitter import provider, no compiler);
|
|
4
|
-
* formerly QR-003 (#402).
|
|
5
|
-
*/
|
|
6
|
-
const IMPORT_COUPLING_THRESHOLD = 15;
|
|
7
|
-
// Registry/hub files are intentionally wide — they import everything by design
|
|
8
|
-
const IMPORT_COUPLING_EXEMPT = /[/\\](index|integration)\.[cm]?tsx?$/;
|
|
9
|
-
export const highImportCouplingRule = {
|
|
10
|
-
id: "high-import-coupling",
|
|
11
|
-
requires: ["file.imports"],
|
|
12
|
-
appliesTo(ctx) {
|
|
13
|
-
return /\.tsx?$/.test(ctx.filePath);
|
|
14
|
-
},
|
|
15
|
-
evaluate(ctx, store) {
|
|
16
|
-
if (IMPORT_COUPLING_EXEMPT.test(ctx.filePath))
|
|
17
|
-
return [];
|
|
18
|
-
const imports = store.getFileFact(ctx.filePath, "file.imports") ?? [];
|
|
19
|
-
const sources = new Set(imports.map((i) => i.source));
|
|
20
|
-
const count = sources.size;
|
|
21
|
-
if (count <= IMPORT_COUPLING_THRESHOLD)
|
|
22
|
-
return [];
|
|
23
|
-
return [
|
|
24
|
-
{
|
|
25
|
-
id: `high-import-coupling:${ctx.filePath}:1:1`,
|
|
26
|
-
tool: "fact-rules",
|
|
27
|
-
rule: "high-import-coupling",
|
|
28
|
-
filePath: ctx.filePath,
|
|
29
|
-
line: 1,
|
|
30
|
-
column: 1,
|
|
31
|
-
severity: "warning",
|
|
32
|
-
semantic: "warning",
|
|
33
|
-
message: `File imports from ${count} distinct modules (threshold: ${IMPORT_COUPLING_THRESHOLD}) — split responsibilities`,
|
|
34
|
-
},
|
|
35
|
-
];
|
|
36
|
-
},
|
|
37
|
-
};
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Flags async functions where a catch block logs the error but doesn't
|
|
3
|
-
* rethrow — the caller receives undefined and assumes success.
|
|
4
|
-
*
|
|
5
|
-
* Distinct from error-obscuring (catch param never referenced) and
|
|
6
|
-
* error-swallowing (empty catch). This catches the "looks handled" pattern:
|
|
7
|
-
* } catch (err) {
|
|
8
|
-
* console.error(err); ← appears handled
|
|
9
|
-
* } ← but caller gets undefined, not the error
|
|
10
|
-
*/
|
|
11
|
-
export const missingErrorPropagationRule = {
|
|
12
|
-
id: "missing-error-propagation",
|
|
13
|
-
requires: ["file.functionSummaries", "file.tryCatchSummaries"],
|
|
14
|
-
appliesTo(ctx) {
|
|
15
|
-
return /\.tsx?$/.test(ctx.filePath);
|
|
16
|
-
},
|
|
17
|
-
evaluate(ctx, store) {
|
|
18
|
-
const fns = store.getFileFact(ctx.filePath, "file.functionSummaries") ?? [];
|
|
19
|
-
const catches = store.getFileFact(ctx.filePath, "file.tryCatchSummaries") ?? [];
|
|
20
|
-
const diagnostics = [];
|
|
21
|
-
// Only consider async functions
|
|
22
|
-
const asyncFns = fns.filter((f) => f.isAsync && !f.isPassThroughWrapper);
|
|
23
|
-
for (const f of asyncFns) {
|
|
24
|
-
// Find catch blocks within this function's body
|
|
25
|
-
// (catch line >= function line, and within reasonable range)
|
|
26
|
-
const nextFnLine = fns
|
|
27
|
-
.filter((g) => g.line > f.line)
|
|
28
|
-
.reduce((min, g) => Math.min(min, g.line), Infinity);
|
|
29
|
-
const relevantCatches = catches.filter((c) => c.line >= f.line && c.line < nextFnLine);
|
|
30
|
-
for (const c of relevantCatches) {
|
|
31
|
-
if (c.isEmpty || c.hasRethrow)
|
|
32
|
-
continue;
|
|
33
|
-
if (!c.hasLogging)
|
|
34
|
-
continue;
|
|
35
|
-
// Structured return or documented fallback = intentional error handling
|
|
36
|
-
if (c.catchReturnsDefault)
|
|
37
|
-
continue;
|
|
38
|
-
if (c.catchReturnsStructuredError)
|
|
39
|
-
continue;
|
|
40
|
-
if (c.isDocumentedLocalFallback)
|
|
41
|
-
continue;
|
|
42
|
-
if (c.isFilesystemExistenceProbe)
|
|
43
|
-
continue;
|
|
44
|
-
// Catch body that sets an error-flag variable = intentional state management
|
|
45
|
-
if (/\b(serverFailed|failed|error)\s*=/.test(c.bodyText))
|
|
46
|
-
continue;
|
|
47
|
-
diagnostics.push({
|
|
48
|
-
id: `missing-error-propagation:${ctx.filePath}:${c.line}`,
|
|
49
|
-
tool: "fact-rules",
|
|
50
|
-
rule: "missing-error-propagation",
|
|
51
|
-
filePath: ctx.filePath,
|
|
52
|
-
line: c.line,
|
|
53
|
-
column: c.column,
|
|
54
|
-
severity: "warning",
|
|
55
|
-
semantic: "warning",
|
|
56
|
-
message: `Catch block in async '${f.name}' logs the error but doesn't rethrow — callers receive undefined and assume success`,
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
return diagnostics;
|
|
61
|
-
},
|
|
62
|
-
};
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* no-commented-credentials — password/token/secret in comments (TS/JS/Python/Go/
|
|
3
|
-
* Ruby/YAML/JSON/env). Regex/line-based (no compiler); formerly SN-007 (#402).
|
|
4
|
-
*/
|
|
5
|
-
const CREDENTIAL_PATTERNS = [
|
|
6
|
-
/password\s*[:=]\s*["'][^"']{3,}/i,
|
|
7
|
-
/(?:api[_-]?key|secret|token)\s*[:=]\s*["'][^"']{6,}/i,
|
|
8
|
-
/(?:aws|gcp|azure)[_-]?(?:key|secret|token)\s*[:=]\s*["'][^"']{6,}/i,
|
|
9
|
-
];
|
|
10
|
-
// Files that define credential patterns as code (scanners, test fixtures, etc.) —
|
|
11
|
-
// their own regex literals would otherwise self-trigger this rule.
|
|
12
|
-
const CREDENTIALS_EXEMPT = /[/\\](secrets?[-_]?(scanner|detect|check)|scanner|fixture|mock)[^/\\]*\.(tsx?|ya?ml|json|env)$/i;
|
|
13
|
-
function isCommentLine(line) {
|
|
14
|
-
return line.startsWith("//") || line.startsWith("#") || line.startsWith("*");
|
|
15
|
-
}
|
|
16
|
-
export const commentedCredentialsRule = {
|
|
17
|
-
id: "no-commented-credentials",
|
|
18
|
-
requires: ["file.content"],
|
|
19
|
-
appliesTo(ctx) {
|
|
20
|
-
return (/\.(tsx?|py|go|rb|ya?ml|json|env)$/.test(ctx.filePath) &&
|
|
21
|
-
!CREDENTIALS_EXEMPT.test(ctx.filePath));
|
|
22
|
-
},
|
|
23
|
-
evaluate(ctx, store) {
|
|
24
|
-
const content = store.getFileFact(ctx.filePath, "file.content");
|
|
25
|
-
if (!content)
|
|
26
|
-
return [];
|
|
27
|
-
const diagnostics = [];
|
|
28
|
-
const lines = content.split("\n");
|
|
29
|
-
for (let i = 0; i < lines.length; i++) {
|
|
30
|
-
const line = lines[i].trimStart();
|
|
31
|
-
if (!isCommentLine(line))
|
|
32
|
-
continue;
|
|
33
|
-
for (const p of CREDENTIAL_PATTERNS) {
|
|
34
|
-
if (p.test(line)) {
|
|
35
|
-
diagnostics.push({
|
|
36
|
-
id: `no-commented-credentials:${ctx.filePath}:${i + 1}`,
|
|
37
|
-
tool: "fact-rules",
|
|
38
|
-
rule: "no-commented-credentials",
|
|
39
|
-
filePath: ctx.filePath,
|
|
40
|
-
line: i + 1,
|
|
41
|
-
column: 1,
|
|
42
|
-
severity: "error",
|
|
43
|
-
semantic: "blocking",
|
|
44
|
-
message: "Possible credential in commented-out code — remove it and rotate the secret",
|
|
45
|
-
});
|
|
46
|
-
break;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return diagnostics;
|
|
51
|
-
},
|
|
52
|
-
};
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { isTestFile } from "../../file-utils.js";
|
|
2
|
-
const ALIAS_COMMENT_RE = /\b(alias|backward\s*compat|backwards\s*compat|compatibility|shim|adapter)\b/i;
|
|
3
|
-
function hasAliasCommentNear(line, comments) {
|
|
4
|
-
return comments.some((comment) => comment.line >= line - 2 &&
|
|
5
|
-
comment.line <= line &&
|
|
6
|
-
ALIAS_COMMENT_RE.test(comment.text));
|
|
7
|
-
}
|
|
8
|
-
export const passThroughWrappersRule = {
|
|
9
|
-
id: "pass-through-wrappers",
|
|
10
|
-
requires: ["file.functionSummaries", "file.comments"],
|
|
11
|
-
appliesTo(ctx) {
|
|
12
|
-
return /\.tsx?$/.test(ctx.filePath) && !isTestFile(ctx.filePath);
|
|
13
|
-
},
|
|
14
|
-
evaluate(ctx, store) {
|
|
15
|
-
const summaries = store.getFileFact(ctx.filePath, "file.functionSummaries");
|
|
16
|
-
const comments = store.getFileFact(ctx.filePath, "file.comments");
|
|
17
|
-
if (!summaries || !comments)
|
|
18
|
-
return [];
|
|
19
|
-
const diagnostics = [];
|
|
20
|
-
for (const fn of summaries) {
|
|
21
|
-
if (!fn.isPassThroughWrapper ||
|
|
22
|
-
fn.statementCount !== 1 ||
|
|
23
|
-
fn.isBoundaryWrapper) {
|
|
24
|
-
continue;
|
|
25
|
-
}
|
|
26
|
-
if (hasAliasCommentNear(fn.line, comments))
|
|
27
|
-
continue;
|
|
28
|
-
diagnostics.push({
|
|
29
|
-
id: `pass-through-wrapper:${ctx.filePath}:${fn.line}:${fn.column}`,
|
|
30
|
-
tool: "fact-rules",
|
|
31
|
-
filePath: ctx.filePath,
|
|
32
|
-
line: fn.line,
|
|
33
|
-
column: fn.column,
|
|
34
|
-
severity: "warning",
|
|
35
|
-
semantic: "warning",
|
|
36
|
-
rule: "pass-through-wrappers",
|
|
37
|
-
message: `Function '${fn.name}' is a trivial pass-through wrapper`,
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
return diagnostics;
|
|
41
|
-
},
|
|
42
|
-
};
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
import { isTestFile } from "../../file-utils.js";
|
|
2
|
-
const PLACEHOLDER_PATTERNS = [
|
|
3
|
-
/add\s+more\s+validation/i,
|
|
4
|
-
/handle\s+(additional|more)\s+cases?/i,
|
|
5
|
-
/can\s+be\s+extended\s+in\s+the\s+future/i,
|
|
6
|
-
/extend\s+this\s+(logic|function|method|handler|module)/i,
|
|
7
|
-
/customize\s+this\s+(logic|behavior|function|method|handler)/i,
|
|
8
|
-
/future\s+enhancement/i,
|
|
9
|
-
/implement\s+.+\s+here/i,
|
|
10
|
-
];
|
|
11
|
-
export const placeholderCommentsRule = {
|
|
12
|
-
id: "placeholder-comments",
|
|
13
|
-
requires: ["file.comments"],
|
|
14
|
-
appliesTo(ctx) {
|
|
15
|
-
return /\.tsx?$/.test(ctx.filePath) && !isTestFile(ctx.filePath);
|
|
16
|
-
},
|
|
17
|
-
evaluate(ctx, store) {
|
|
18
|
-
const comments = store.getFileFact(ctx.filePath, "file.comments");
|
|
19
|
-
if (!comments)
|
|
20
|
-
return [];
|
|
21
|
-
const diagnostics = [];
|
|
22
|
-
for (const comment of comments) {
|
|
23
|
-
const matched = PLACEHOLDER_PATTERNS.some((pattern) => pattern.test(comment.text));
|
|
24
|
-
if (!matched)
|
|
25
|
-
continue;
|
|
26
|
-
diagnostics.push({
|
|
27
|
-
id: `placeholder-comments:${ctx.filePath}:${comment.line}:1`,
|
|
28
|
-
tool: "fact-rules",
|
|
29
|
-
filePath: ctx.filePath,
|
|
30
|
-
line: comment.line,
|
|
31
|
-
column: 1,
|
|
32
|
-
severity: "warning",
|
|
33
|
-
semantic: "warning",
|
|
34
|
-
rule: "placeholder-comments",
|
|
35
|
-
message: "Placeholder comment detected. Prefer comments that describe current behavior over future intent.",
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
return diagnostics;
|
|
39
|
-
},
|
|
40
|
-
};
|