@herbertgao/pi-extensions 2026.8.6 → 2026.8.8
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/README.md +8 -6
- package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/README.md +2 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +19 -7
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +30 -9
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +320 -22
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +94 -77
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/message-display.ts +79 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +27 -0
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +66 -17
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +41 -2
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +75 -6
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +7 -3
- package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +64 -1
- package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
- package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
- package/node_modules/@herbertgao/pi-subagents/README.md +30 -22
- package/node_modules/@herbertgao/pi-subagents/examples/agent-tool-description.md +5 -5
- package/node_modules/@herbertgao/pi-subagents/package.json +7 -7
- package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +7 -1
- package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +48 -19
- package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +17 -13
- package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +26 -2
- package/node_modules/@herbertgao/pi-subagents/src/index.ts +219 -40
- package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +101 -3
- package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +18 -4
- package/node_modules/@herbertgao/pi-subagents/src/settings.ts +99 -0
- package/node_modules/@herbertgao/pi-subagents/src/types.ts +22 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +51 -3
- package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +20 -2
- package/node_modules/@herbertgao/pi-subagents/src/ui/fleet-list.ts +21 -6
- package/node_modules/@herbertgao/pi-subagents/src/usage.ts +129 -1
- package/node_modules/@herbertgao/pi-subagents/src/worktree.ts +20 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/README.md +5 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/ask-user-question.ts +174 -100
- package/node_modules/@juicesharp/rpiv-ask-user-question/config.ts +25 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/configuration.md +13 -4
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/hosts.md +5 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/keyboard.md +10 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/localization.md +10 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/docs/tool-schema.md +11 -5
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/en.json +5 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/locales/zh.json +2 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +3 -2
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/build-questionnaire.ts +10 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/key-router.ts +140 -97
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +63 -28
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/selectors/projections.ts +22 -15
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/state-reducer.ts +11 -1
- package/node_modules/@juicesharp/rpiv-ask-user-question/state/state.ts +14 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/tool/response-envelope.ts +11 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/tool/types.ts +11 -0
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/components/multi-select-view.ts +31 -17
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/components/preview/preview-block-renderer.ts +15 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/components/wrapping-select.ts +15 -6
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/dialog-builder.ts +86 -38
- package/node_modules/@juicesharp/rpiv-ask-user-question/view/tab-content-strategy.ts +76 -9
- package/node_modules/@narumitw/pi-btw/README.md +120 -111
- package/node_modules/@narumitw/pi-btw/dist/index.ts +2898 -0
- package/node_modules/@narumitw/pi-btw/dist/index.ts.map +7 -0
- package/node_modules/@narumitw/pi-btw/package.json +10 -6
- package/node_modules/@narumitw/pi-btw/src/btw.ts +36 -40
- package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +55 -10
- package/node_modules/@narumitw/pi-btw/src/main-tree-picker.ts +390 -0
- package/node_modules/@narumitw/pi-btw/src/menu.ts +45 -2
- package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +136 -45
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs +44 -1856
- package/node_modules/@pi-plugins/fast-mode/dist/index.mjs.map +1 -1
- package/node_modules/@pi-plugins/fast-mode/package.json +4 -6
- package/node_modules/pi-lens/CHANGELOG.md +999 -0
- package/node_modules/pi-lens/README.md +117 -3
- package/node_modules/pi-lens/config/ruff/core.toml +42 -0
- package/node_modules/pi-lens/dist/clients/actionable-warnings.js +130 -27
- package/node_modules/pi-lens/dist/clients/advisory-provenance.js +126 -13
- package/node_modules/pi-lens/dist/clients/agent-nudge.js +67 -11
- package/node_modules/pi-lens/dist/clients/ast-grep-client.js +9 -3
- package/node_modules/pi-lens/dist/clients/atomic-write.js +9 -3
- package/node_modules/pi-lens/dist/clients/bash-file-access.js +381 -13
- package/node_modules/pi-lens/dist/clients/biome-client.js +61 -30
- package/node_modules/pi-lens/dist/clients/blocker-freshness.js +428 -0
- package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +129 -0
- package/node_modules/pi-lens/dist/clients/bootstrap.js +12 -1
- package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +12 -3
- package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +206 -0
- package/node_modules/pi-lens/dist/clients/cache-observability.js +353 -76
- package/node_modules/pi-lens/dist/clients/cascade-budget.js +196 -0
- package/node_modules/pi-lens/dist/clients/cascade-format.js +20 -1
- package/node_modules/pi-lens/dist/clients/cascade-types.js +9 -1
- package/node_modules/pi-lens/dist/clients/child-unref.js +54 -6
- package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +76 -24
- package/node_modules/pi-lens/dist/clients/dead-code-client.js +123 -31
- package/node_modules/pi-lens/dist/clients/deadline-utils.js +8 -1
- package/node_modules/pi-lens/dist/clients/debug-handles.js +5 -0
- package/node_modules/pi-lens/dist/clients/degradation-ledger.js +84 -14
- package/node_modules/pi-lens/dist/clients/demoted-finding-render.js +155 -0
- package/node_modules/pi-lens/dist/clients/dependency-checker.js +25 -3
- package/node_modules/pi-lens/dist/clients/deps/pi-tui.js +8 -2
- package/node_modules/pi-lens/dist/clients/deps/typebox.js +8 -3
- package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +147 -33
- package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +298 -0
- package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +52 -2
- package/node_modules/pi-lens/dist/clients/dispatch/integration.js +256 -88
- package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +7 -4
- package/node_modules/pi-lens/dist/clients/dispatch/plan.js +5 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +234 -18
- package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +187 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +6 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +11 -9
- package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +398 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/detekt.js +9 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +11 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +12 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +18 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/hadolint.js +9 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +895 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/htmlhint.js +8 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +4 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +16 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +60 -53
- package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +16 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +25 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/oxlint.js +20 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/phpstan.js +44 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +331 -55
- package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +38 -5
- package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +97 -19
- package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +17 -8
- package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +32 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +47 -3
- package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +14 -4
- package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +127 -28
- package/node_modules/pi-lens/dist/clients/dispatch/runners/tflint.js +12 -7
- package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +73 -12
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +275 -13
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +21 -6
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +260 -27
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +734 -64
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +86 -11
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +188 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +9 -0
- package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +21 -10
- package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +18 -2
- package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +4 -2
- package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +28 -5
- package/node_modules/pi-lens/dist/clients/extension-log.js +22 -1
- package/node_modules/pi-lens/dist/clients/file-kinds.js +8 -2
- package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +316 -0
- package/node_modules/pi-lens/dist/clients/finding-identity.js +88 -0
- package/node_modules/pi-lens/dist/clients/formatters-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/formatters.js +500 -115
- package/node_modules/pi-lens/dist/clients/generation-guard.js +216 -0
- package/node_modules/pi-lens/dist/clients/git-guard.js +31 -0
- package/node_modules/pi-lens/dist/clients/gitleaks-client.js +181 -8
- package/node_modules/pi-lens/dist/clients/govulncheck-client.js +109 -9
- package/node_modules/pi-lens/dist/clients/grammar-source.js +333 -10
- package/node_modules/pi-lens/dist/clients/host-ports.js +8 -0
- package/node_modules/pi-lens/dist/clients/installer/index.js +1114 -100
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +58 -0
- package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +715 -0
- package/node_modules/pi-lens/dist/clients/instance-reaper.js +643 -97
- package/node_modules/pi-lens/dist/clients/instance-registry.js +87 -17
- package/node_modules/pi-lens/dist/clients/jscpd-client.js +87 -8
- package/node_modules/pi-lens/dist/clients/knip-client.js +310 -10
- package/node_modules/pi-lens/dist/clients/language-policy.js +8 -2
- package/node_modules/pi-lens/dist/clients/language-profile.js +9 -2
- package/node_modules/pi-lens/dist/clients/latency-logger.js +440 -11
- package/node_modules/pi-lens/dist/clients/lazy-import.js +21 -0
- package/node_modules/pi-lens/dist/clients/ledger-bounds.js +21 -0
- package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +8 -0
- package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +128 -8
- package/node_modules/pi-lens/dist/clients/lsp/client.js +1660 -164
- package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +83 -1
- package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +389 -0
- package/node_modules/pi-lens/dist/clients/lsp/index.js +2423 -151
- package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +215 -0
- package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +146 -14
- package/node_modules/pi-lens/dist/clients/lsp/language.js +48 -4
- package/node_modules/pi-lens/dist/clients/lsp/server.js +277 -16
- package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +22 -0
- package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +43 -0
- package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +79 -3
- package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +43 -0
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +422 -28
- package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +30 -0
- package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +175 -0
- package/node_modules/pi-lens/dist/clients/lsp-lazy.js +3 -2
- package/node_modules/pi-lens/dist/clients/mcp/session.js +10 -2
- package/node_modules/pi-lens/dist/clients/module-report.js +22 -1
- package/node_modules/pi-lens/dist/clients/ndjson-logger.js +114 -23
- package/node_modules/pi-lens/dist/clients/opengrep-client.js +15 -1
- package/node_modules/pi-lens/dist/clients/package-manager.js +170 -14
- package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +27 -0
- package/node_modules/pi-lens/dist/clients/path-utils.js +160 -0
- package/node_modules/pi-lens/dist/clients/pipeline.js +154 -33
- package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +37 -0
- package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +17 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +89 -22
- package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +84 -14
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +15 -3
- package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +50 -2
- package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +23 -9
- package/node_modules/pi-lens/dist/clients/project-lens-config.js +3 -0
- package/node_modules/pi-lens/dist/clients/project-report.js +62 -27
- package/node_modules/pi-lens/dist/clients/project-snapshot.js +299 -0
- package/node_modules/pi-lens/dist/clients/quiet-window-config.js +47 -0
- package/node_modules/pi-lens/dist/clients/quiet-window.js +11 -25
- package/node_modules/pi-lens/dist/clients/read-guard-logger.js +8 -3
- package/node_modules/pi-lens/dist/clients/read-guard.js +253 -10
- package/node_modules/pi-lens/dist/clients/resource-sampler.js +49 -17
- package/node_modules/pi-lens/dist/clients/reverse-deps.js +50 -11
- package/node_modules/pi-lens/dist/clients/review-graph/builder.js +194 -31
- package/node_modules/pi-lens/dist/clients/review-graph/query.js +52 -4
- package/node_modules/pi-lens/dist/clients/review-graph/revision-drift.js +21 -0
- package/node_modules/pi-lens/dist/clients/review-graph/workspace-modules.js +6 -3
- package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +96 -7
- package/node_modules/pi-lens/dist/clients/runtime-context.js +8 -1
- package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +352 -45
- package/node_modules/pi-lens/dist/clients/runtime-session.js +373 -9
- package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +217 -22
- package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +212 -79
- package/node_modules/pi-lens/dist/clients/runtime-turn.js +620 -67
- package/node_modules/pi-lens/dist/clients/safe-spawn.js +220 -7
- package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +161 -0
- package/node_modules/pi-lens/dist/clients/search-read-registration.js +34 -6
- package/node_modules/pi-lens/dist/clients/security-scan-client.js +157 -24
- package/node_modules/pi-lens/dist/clients/session-event-guard.js +184 -0
- package/node_modules/pi-lens/dist/clients/sg-runner.js +116 -22
- package/node_modules/pi-lens/dist/clients/single-flight.js +158 -0
- package/node_modules/pi-lens/dist/clients/source-filter.js +6 -2
- package/node_modules/pi-lens/dist/clients/stale-marker.js +17 -0
- package/node_modules/pi-lens/dist/clients/startup-scan.js +5 -2
- package/node_modules/pi-lens/dist/clients/startup-timing.js +19 -1
- package/node_modules/pi-lens/dist/clients/test-runner-client.js +151 -16
- package/node_modules/pi-lens/dist/clients/tool-event.js +56 -5
- package/node_modules/pi-lens/dist/clients/tool-policy.js +125 -20
- package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +75 -1
- package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +769 -64
- package/node_modules/pi-lens/dist/clients/tree-sitter-logger.js +1 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +11 -0
- package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +90 -0
- package/node_modules/pi-lens/dist/clients/trivy-client.js +19 -1
- package/node_modules/pi-lens/dist/clients/widget-state.js +336 -36
- package/node_modules/pi-lens/dist/clients/zizmor-config.js +214 -14
- package/node_modules/pi-lens/dist/index.js +61407 -48577
- package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +476 -57
- package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +132 -43
- package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -7
- package/node_modules/pi-lens/docs/agent-guide.md +6 -1
- package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +515 -506
- package/node_modules/pi-lens/docs/dispositions.md +21 -0
- package/node_modules/pi-lens/docs/features.md +19 -5
- package/node_modules/pi-lens/docs/globalconfig.md +3 -0
- package/node_modules/pi-lens/docs/language-coverage.md +71 -5
- package/node_modules/pi-lens/docs/mcp.md +2 -2
- package/node_modules/pi-lens/docs/servercapabilities.md +4 -1
- package/node_modules/pi-lens/docs/settings.md +19 -1
- package/node_modules/pi-lens/docs/usage.md +1 -0
- package/node_modules/pi-lens/package.json +27 -10
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-js-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/ts-void-zero-snapshot.yml +23 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-object-param-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-chained-type-assertions-test.yml +15 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-compile-call-test.yml +29 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-dupe-class-members-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-js-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-test.yml +7 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-known-value-widening-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-non-null-assertion-test.yml +216 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-js-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-test.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-js-test.yml +2 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-test.yml +2 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-runtime-typeof-test.yml +33 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml +9 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-shape-in-symbol-names-test.yml +13 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-js-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-test.yml +5 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-parameters-test.yml +12 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-returns-test.yml +16 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-any-test.yml +10 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-unknown-test.yml +8 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml +35 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/require-safety-comment-for-as-unknown-as-test.yml +177 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/ts-void-zero-test.yml +1 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member-js.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member.yml +13 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-object-param.yml +60 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-chained-type-assertions.yml +57 -12
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-compile-call.yml +63 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-dupe-class-members.yml +52 -8
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html-js.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html.yml +27 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-known-value-widening.yml +71 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-non-null-assertion.yml +316 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +7 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply-js.yml +22 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply.yml +23 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get-js.yml +33 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get.yml +34 -8
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-return-value-in-generator.yml +22 -5
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-runtime-typeof.yml +121 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-server-bind-wildcard.yml +23 -7
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-shape-in-symbol-names.yml +68 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code.yml +41 -2
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-laundering.yml +6 -1
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-parameters.yml +67 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-returns.yml +106 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-any.yml +50 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-unknown.yml +56 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +2 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/redundant-unsafe-function.yml +32 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/require-safety-comment-for-as-unknown-as.yml +184 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/rules/ts-void-zero.yml +5 -0
- package/node_modules/pi-lens/rules/ast-grep-rules/self-scan-baseline.json +5 -0
- package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +53 -1
- package/node_modules/pi-lens/scripts/download-grammars.js +25 -0
- package/node_modules/pi-lens/scripts/grammars.lock.json +9 -0
- package/node_modules/pi-lens/scripts/install-selftest.mjs +99 -11
- package/node_modules/pi-lens/scripts/lib/host-provided-deps.mjs +75 -0
- package/node_modules/pi-lens/scripts/lib/warm-loader-cache.mjs +285 -0
- package/node_modules/pi-lens/scripts/warm-loader-cache.mjs +233 -0
- package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +2 -0
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/SKILL.md +80 -3
- package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/reference.md +41 -0
- package/node_modules/pi-lens/vendor/grammars/tree-sitter-cue.wasm +0 -0
- package/node_modules/pi-mcp-adapter/CHANGELOG.md +36 -0
- package/node_modules/pi-mcp-adapter/README.md +47 -5
- package/node_modules/pi-mcp-adapter/cli.js +163 -1
- package/node_modules/pi-mcp-adapter/commands.ts +128 -22
- package/node_modules/pi-mcp-adapter/config.ts +25 -7
- package/node_modules/pi-mcp-adapter/direct-tools.ts +5 -4
- package/node_modules/pi-mcp-adapter/index.ts +219 -32
- package/node_modules/pi-mcp-adapter/init.ts +36 -4
- package/node_modules/pi-mcp-adapter/lifecycle.ts +315 -24
- package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +39 -6
- package/node_modules/pi-mcp-adapter/mcp-bearer-store.ts +387 -0
- package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +27 -3
- package/node_modules/pi-mcp-adapter/mcp-code.ts +4 -0
- package/node_modules/pi-mcp-adapter/mcp-panel.ts +42 -13
- package/node_modules/pi-mcp-adapter/metadata-cache.ts +32 -21
- package/node_modules/pi-mcp-adapter/package-mcp-loader.ts +168 -0
- package/node_modules/pi-mcp-adapter/package.json +3 -1
- package/node_modules/pi-mcp-adapter/proxy-modes.ts +5 -4
- package/node_modules/pi-mcp-adapter/request-headers-command.ts +31 -37
- package/node_modules/pi-mcp-adapter/search-ranking.ts +92 -22
- package/node_modules/pi-mcp-adapter/server-manager.ts +140 -2
- package/node_modules/pi-mcp-adapter/session-recovery.ts +7 -0
- package/node_modules/pi-mcp-adapter/tool-approval.ts +15 -2
- package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +44 -4
- package/node_modules/pi-mcp-adapter/types.ts +2 -0
- package/node_modules/pi-mcp-adapter/ui-server.ts +18 -16
- package/node_modules/pi-mcp-adapter/utils.ts +70 -0
- package/node_modules/pi-web-access/CHANGELOG.md +37 -0
- package/node_modules/pi-web-access/README.md +32 -13
- package/node_modules/pi-web-access/anysearch.ts +4 -2
- package/node_modules/pi-web-access/brave.ts +16 -4
- package/node_modules/pi-web-access/chrome-cookies.ts +86 -15
- package/node_modules/pi-web-access/curator-page.ts +6 -3
- package/node_modules/pi-web-access/curator-server.ts +4 -1
- package/node_modules/pi-web-access/data-uri-sanitize.ts +406 -0
- package/node_modules/pi-web-access/exa.ts +18 -7
- package/node_modules/pi-web-access/extract.ts +40 -5
- package/node_modules/pi-web-access/firecrawl.ts +18 -2
- package/node_modules/pi-web-access/gemini-search.ts +16 -4
- package/node_modules/pi-web-access/github-extract.ts +65 -36
- package/node_modules/pi-web-access/index.ts +60 -61
- package/node_modules/pi-web-access/openai-search.ts +17 -6
- package/node_modules/pi-web-access/package.json +1 -1
- package/node_modules/pi-web-access/page-query.ts +4 -2
- package/node_modules/pi-web-access/parallel-mcp.ts +249 -0
- package/node_modules/pi-web-access/parallel.ts +2 -2
- package/node_modules/pi-web-access/pdf-extract.ts +18 -5
- package/node_modules/pi-web-access/query-rewrite.ts +51 -0
- package/node_modules/pi-web-access/serper.ts +211 -0
- package/node_modules/pi-web-access/ssrf-protection.ts +12 -2
- package/node_modules/pi-web-access/summary-model-scope.ts +12 -4
- package/node_modules/pi-web-access/summary-review.ts +44 -22
- package/node_modules/pi-web-access/tavily.ts +16 -4
- package/node_modules/pi-web-access/utils.ts +87 -0
- package/node_modules/pi-web-access/valyu.ts +199 -0
- package/package.json +14 -14
|
@@ -2,7 +2,13 @@ id: no-inner-html
|
|
|
2
2
|
valid:
|
|
3
3
|
- 'el.textContent = "x"'
|
|
4
4
|
- 'el.insertAdjacentText("beforeend", "x")'
|
|
5
|
-
|
|
5
|
+
- "el.innerHTML = ''"
|
|
6
6
|
- 'el.innerHTML = "x"'
|
|
7
7
|
- 'el.outerHTML = "x"'
|
|
8
|
+
- 'el.innerHTML = `static markup`'
|
|
9
|
+
invalid:
|
|
8
10
|
- 'el.insertAdjacentHTML("beforeend", "x")'
|
|
11
|
+
- "el.innerHTML = html"
|
|
12
|
+
- "el.innerHTML = getHtml(entry, label)"
|
|
13
|
+
- 'el.innerHTML = `hi ${name}`'
|
|
14
|
+
- "el.outerHTML = html"
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
id: no-known-value-widening
|
|
2
|
+
valid:
|
|
3
|
+
- "const x = { a: 1 };"
|
|
4
|
+
- "const x: Record<string, number> = other;"
|
|
5
|
+
- "const x = other as Record<string, number>;"
|
|
6
|
+
- "const x: Record<string, number> = getDefaults();"
|
|
7
|
+
invalid:
|
|
8
|
+
- "const x: Record<string, number> = { a: 1 };"
|
|
9
|
+
- 'const x: Record<string, string> = { a: "b", c: "d" };'
|
|
@@ -3,8 +3,224 @@ valid:
|
|
|
3
3
|
- 'const x = foo'
|
|
4
4
|
- 'const x = foo?.bar'
|
|
5
5
|
- 'const x: number = foo()'
|
|
6
|
+
# #1777: get-after-has, same map, same key — suppressed.
|
|
7
|
+
- |
|
|
8
|
+
function f(m: Map<string, number>, k: string) {
|
|
9
|
+
if (m.has(k)) {
|
|
10
|
+
return m.get(k)!;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
# #1777: pop-after-length, same array, in a while loop.
|
|
14
|
+
- |
|
|
15
|
+
function f(stack: number[]) {
|
|
16
|
+
while (stack.length > 0) {
|
|
17
|
+
const x = stack.pop()!;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
# #1777: shift-after-length, same array, in an if branch.
|
|
21
|
+
- |
|
|
22
|
+
function f(queue: number[]) {
|
|
23
|
+
if (queue.length > 0) {
|
|
24
|
+
return queue.shift()!;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
# #1818 round 2: ternary-narrow. The consequence branch is only reached
|
|
28
|
+
# when the condition's own property access is truthy; the nested closure
|
|
29
|
+
# loses TS's narrowing across the function boundary, hence the `!`.
|
|
30
|
+
- |
|
|
31
|
+
function f(index: { forward?: Map<string, number> }, files: string[]) {
|
|
32
|
+
return index.forward
|
|
33
|
+
? files.map((file) => index.forward!.get(file))
|
|
34
|
+
: undefined;
|
|
35
|
+
}
|
|
36
|
+
# #1818 round 2: property re-asserted after a `.filter()` on the same
|
|
37
|
+
# property, immediately followed by `.map()` in the same chain.
|
|
38
|
+
- |
|
|
39
|
+
function f(reads: Array<{ enclosingSymbol?: { name: string } }>) {
|
|
40
|
+
return reads
|
|
41
|
+
.filter((r) => r.enclosingSymbol)
|
|
42
|
+
.map((r) => ({ name: r.enclosingSymbol!.name }));
|
|
43
|
+
}
|
|
6
44
|
invalid:
|
|
7
45
|
- 'const x = foo!'
|
|
8
46
|
- 'foo!.bar()'
|
|
9
47
|
- 'const x = (foo!)!.bar'
|
|
10
48
|
- 'foo!!'
|
|
49
|
+
# #1777 mutation guard: a get()! with NO has() check anywhere in the
|
|
50
|
+
# function must still flag — deleting the exclusion's pattern match
|
|
51
|
+
# (not just its metavariable binding) reds this.
|
|
52
|
+
- |
|
|
53
|
+
function f(m: Map<string, number>, k: string) {
|
|
54
|
+
return m.get(k)!;
|
|
55
|
+
}
|
|
56
|
+
# #1777 mutation guard: the has() check is for a DIFFERENT key —
|
|
57
|
+
# same-key binding discipline is the guard, not mere presence of
|
|
58
|
+
# any .has() call on the map.
|
|
59
|
+
- |
|
|
60
|
+
function f(m: Map<string, number>, k: string, other: string) {
|
|
61
|
+
if (m.has(other)) {
|
|
62
|
+
return m.get(k)!;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
# #1777 mutation guard: the has() check is on a DIFFERENT map —
|
|
66
|
+
# same-receiver binding discipline is the guard.
|
|
67
|
+
- |
|
|
68
|
+
function f(m: Map<string, number>, other: Map<string, number>, k: string) {
|
|
69
|
+
if (other.has(k)) {
|
|
70
|
+
return m.get(k)!;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
# #1777 mutation guard: pop()! with NO length check anywhere in the
|
|
74
|
+
# function must still flag.
|
|
75
|
+
- |
|
|
76
|
+
function f(arr: number[]) {
|
|
77
|
+
return arr.pop()!;
|
|
78
|
+
}
|
|
79
|
+
# #1777 mutation guard: the length check is on a DIFFERENT array —
|
|
80
|
+
# same-array binding discipline is the guard.
|
|
81
|
+
- |
|
|
82
|
+
function f(arr: number[], other: number[]) {
|
|
83
|
+
if (other.length > 0) {
|
|
84
|
+
return arr.pop()!;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
# #1777: a length check elsewhere in the SAME function that does not
|
|
88
|
+
# dominate this particular pop() (documented approximation — the
|
|
89
|
+
# rule only requires presence in the enclosing function, not proven
|
|
90
|
+
# dominance) still suppresses; this fixture exists to make that
|
|
91
|
+
# scoping visible rather than silently assumed. Left as `invalid`
|
|
92
|
+
# because this specific shape (length check AFTER the pop, in an
|
|
93
|
+
# unrelated later branch) is outside the two named idiom shapes: the
|
|
94
|
+
# pop here is not itself inside the while/for/if that carries the
|
|
95
|
+
# length check.
|
|
96
|
+
- |
|
|
97
|
+
function f(arr: number[]) {
|
|
98
|
+
const x = arr.pop()!;
|
|
99
|
+
if (arr.length > 0) {
|
|
100
|
+
return x;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
# #1777 F1 regression test: a `.has()` guard in an OUTER function must
|
|
104
|
+
# NOT suppress a `!` inside an INNER closure — the `stopBy` boundary
|
|
105
|
+
# has to stop the ancestor walk at the nearest enclosing function.
|
|
106
|
+
# Review round 1 proved the pre-fix rule got this wrong (a guard in
|
|
107
|
+
# the outer scope suppressed the closure's finding).
|
|
108
|
+
- |
|
|
109
|
+
function outer(m: Map<string, number>, k: string) {
|
|
110
|
+
if (m.has(k)) {
|
|
111
|
+
// guard lives here, in the OUTER function
|
|
112
|
+
}
|
|
113
|
+
return function inner() {
|
|
114
|
+
return m.get(k)!;
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
# #1777 F1 regression test, arrow-closure variant: same outer/inner
|
|
118
|
+
# split, `.length` guard in the outer function only.
|
|
119
|
+
- |
|
|
120
|
+
function outer(arr: number[]) {
|
|
121
|
+
if (arr.length > 0) {
|
|
122
|
+
// guard lives here, in the OUTER function
|
|
123
|
+
}
|
|
124
|
+
return () => arr.pop()!;
|
|
125
|
+
}
|
|
126
|
+
# #1777 F2 regression test: `if (!m.has(k))` guards the branch where
|
|
127
|
+
# the key is proven ABSENT, so `m.get(k)!` inside that branch is a
|
|
128
|
+
# real bug, not a narrowed-after-check idiom. ast-grep can't read
|
|
129
|
+
# branch polarity, so the fix is a blunt one — ANY negated `.has()`
|
|
130
|
+
# is refused as a guard — but it MUST catch this exact shape, the one
|
|
131
|
+
# review round 1 named as "the rule's most likely real bug shape."
|
|
132
|
+
- |
|
|
133
|
+
function f(m: Map<string, number>, k: string) {
|
|
134
|
+
if (!m.has(k)) {
|
|
135
|
+
return m.get(k)!;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
# #1777 F2 accepted regression: this is a genuinely SAFE early-return
|
|
139
|
+
# guard clause — by the time `m.get(k)!` runs, `!m.has(k)` has already
|
|
140
|
+
# returned. It was correctly suppressed before the F2 fix. It is NOT
|
|
141
|
+
# anymore, and that is accepted, not a bug: ast-grep matches this
|
|
142
|
+
# `if (!m.has(k)) return;` identically to the real-bug shape directly
|
|
143
|
+
# above (same syntax, opposite control flow), and there is no cheaper
|
|
144
|
+
# structural signal available to tell them apart. This fixture exists
|
|
145
|
+
# so the known blind spot has a name and a test, and can't be
|
|
146
|
+
# mistaken for coverage this rule doesn't have.
|
|
147
|
+
- |
|
|
148
|
+
function f(m: Map<string, number>, k: string) {
|
|
149
|
+
if (!m.has(k)) return;
|
|
150
|
+
return m.get(k)!;
|
|
151
|
+
}
|
|
152
|
+
# #1818 mutation guard: ternary-narrow, but the assertion sits in the
|
|
153
|
+
# ALTERNATIVE branch (the condition's property is falsy there) — a real
|
|
154
|
+
# bug, must still flag.
|
|
155
|
+
- |
|
|
156
|
+
function f(index: { forward?: Map<string, number> }, files: string[]) {
|
|
157
|
+
return index.forward
|
|
158
|
+
? undefined
|
|
159
|
+
: files.map((file) => index.forward!.get(file));
|
|
160
|
+
}
|
|
161
|
+
# #1818 mutation guard: ternary-narrow, but the assertion targets a
|
|
162
|
+
# DIFFERENT object than the condition checked — same-binding discipline
|
|
163
|
+
# is the guard, not mere presence of a truthy-ternary anywhere outside.
|
|
164
|
+
- |
|
|
165
|
+
function f(
|
|
166
|
+
index: { forward?: Map<string, number> },
|
|
167
|
+
other: { forward?: Map<string, number> },
|
|
168
|
+
files: string[],
|
|
169
|
+
) {
|
|
170
|
+
return index.forward
|
|
171
|
+
? files.map((file) => other.forward!.get(file))
|
|
172
|
+
: undefined;
|
|
173
|
+
}
|
|
174
|
+
# #1818 mutation guard: filter+map, but the filter checks a DIFFERENT
|
|
175
|
+
# property than the one asserted in map — must still flag.
|
|
176
|
+
- |
|
|
177
|
+
function f(reads: Array<{ enclosingSymbol?: { name: string }; other?: unknown }>) {
|
|
178
|
+
return reads
|
|
179
|
+
.filter((r) => r.other)
|
|
180
|
+
.map((r) => ({ name: r.enclosingSymbol!.name }));
|
|
181
|
+
}
|
|
182
|
+
# #1818 mutation guard: no preceding filter at all — must still flag.
|
|
183
|
+
- |
|
|
184
|
+
function f(reads: Array<{ enclosingSymbol?: { name: string } }>) {
|
|
185
|
+
return reads.map((r) => ({ name: r.enclosingSymbol!.name }));
|
|
186
|
+
}
|
|
187
|
+
# #1818 review round 1, N1: the SAME assertion repeated in BOTH the
|
|
188
|
+
# consequence AND alternative branches. The consequence instance is
|
|
189
|
+
# genuinely safe and suppressed; the alternative instance is a real
|
|
190
|
+
# bug (the condition's property is falsy on that branch) and must
|
|
191
|
+
# still flag. An `has: field: consequence` EXISTENCE check on the
|
|
192
|
+
# ternary cannot tell these two instances apart (the consequence
|
|
193
|
+
# branch's matching text satisfies the check for both); `field:
|
|
194
|
+
# consequence` as an IDENTITY check on the matched node can.
|
|
195
|
+
- |
|
|
196
|
+
function f(o: { y?: { length: number } }) {
|
|
197
|
+
return o.y ? o.y!.length : o.y!.length;
|
|
198
|
+
}
|
|
199
|
+
# #1818 review round 1, N2a: nested ternary. The assertion's NEAREST
|
|
200
|
+
# ternary is the INNER one, whose own condition (`flag`) does not
|
|
201
|
+
# match the asserted object/property — so it must still flag, even
|
|
202
|
+
# though an OUTER ternary's condition happens to match. Proves
|
|
203
|
+
# `stopBy: kind: ternary_expression` is a real boundary: weakening it
|
|
204
|
+
# to `end` lets the search escalate past the inner ternary (which
|
|
205
|
+
# correctly fails) to the outer one (which wrongly succeeds).
|
|
206
|
+
- |
|
|
207
|
+
function f(o: { y?: { length: number } }, flag: boolean) {
|
|
208
|
+
return o.y
|
|
209
|
+
? flag
|
|
210
|
+
? 1
|
|
211
|
+
: o.y!.length
|
|
212
|
+
: 0;
|
|
213
|
+
}
|
|
214
|
+
# #1818 review round 1, N2b: filter+map, but the asserted receiver is
|
|
215
|
+
# an UNRELATED variable, not the map callback's own parameter — must
|
|
216
|
+
# still flag. Proves the `$M` metavariable binding is load-bearing:
|
|
217
|
+
# decoupling it (e.g. to an unconstrained parameter name) would make
|
|
218
|
+
# ANY assertion inside ANY filter-then-map chain's callback body
|
|
219
|
+
# suppress, regardless of what is actually being asserted.
|
|
220
|
+
- |
|
|
221
|
+
function f(
|
|
222
|
+
rs: Array<{ sym?: { name: string } }>,
|
|
223
|
+
stray: { sym?: { name: string } },
|
|
224
|
+
) {
|
|
225
|
+
return rs.filter((r) => r.sym).map((m) => stray.sym!.name);
|
|
226
|
+
}
|
|
@@ -2,6 +2,8 @@ id: no-reflect-apply-js
|
|
|
2
2
|
valid:
|
|
3
3
|
- 'fn.apply(obj, args)'
|
|
4
4
|
- 'fn(...args)'
|
|
5
|
+
- 'const proxy = new Proxy(target, { apply(target, thisArg, args) { return Reflect.apply(target, thisArg, args); } });'
|
|
5
6
|
invalid:
|
|
6
7
|
- 'Reflect.apply(fn, obj, args)'
|
|
7
8
|
- 'const r = Reflect.apply(target[method], target, argumentsList);'
|
|
9
|
+
- 'const ordinary = { apply(target, thisArg, args) { return Reflect.apply(target, thisArg, args); } };'
|
|
@@ -2,6 +2,8 @@ id: no-reflect-apply
|
|
|
2
2
|
valid:
|
|
3
3
|
- 'fn.apply(obj, args)'
|
|
4
4
|
- 'fn(...args)'
|
|
5
|
+
- 'const proxy = new Proxy(target, { apply(target, thisArg, args) { return Reflect.apply(target, thisArg, args); } });'
|
|
5
6
|
invalid:
|
|
6
7
|
- 'Reflect.apply(fn, obj, args)'
|
|
7
8
|
- 'const r = Reflect.apply(target[method], target, argumentsList);'
|
|
9
|
+
- 'const ordinary = { apply(target, thisArg, args) { return Reflect.apply(target, thisArg, args); } };'
|
|
@@ -2,7 +2,8 @@ id: no-reflect-get-js
|
|
|
2
2
|
valid:
|
|
3
3
|
- 'obj.prop'
|
|
4
4
|
- 'obj[key]'
|
|
5
|
-
- 'Reflect.get(target, prop, receiver)'
|
|
5
|
+
- 'const proxy = new Proxy(api, { get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } });'
|
|
6
6
|
invalid:
|
|
7
7
|
- 'Reflect.get(obj, "key")'
|
|
8
8
|
- 'const v = Reflect.get(target, prop);'
|
|
9
|
+
- 'const ordinary = { get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } };'
|
|
@@ -2,7 +2,8 @@ id: no-reflect-get
|
|
|
2
2
|
valid:
|
|
3
3
|
- 'obj.prop'
|
|
4
4
|
- 'obj[key]'
|
|
5
|
-
- 'Reflect.get(target, prop, receiver)'
|
|
5
|
+
- 'const proxy = new Proxy(api, { get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } });'
|
|
6
6
|
invalid:
|
|
7
7
|
- 'Reflect.get(obj, "key")'
|
|
8
8
|
- 'const v = Reflect.get(target, prop);'
|
|
9
|
+
- 'const ordinary = { get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } };'
|
package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml
CHANGED
|
@@ -11,6 +11,12 @@ valid:
|
|
|
11
11
|
- |
|
|
12
12
|
def regular():
|
|
13
13
|
return 42
|
|
14
|
+
- |
|
|
15
|
+
@asynccontextmanager
|
|
16
|
+
async def lifespan(app):
|
|
17
|
+
def handler():
|
|
18
|
+
return 42
|
|
19
|
+
yield
|
|
14
20
|
invalid:
|
|
15
21
|
- |
|
|
16
22
|
def gen():
|
|
@@ -20,3 +26,9 @@ invalid:
|
|
|
20
26
|
def gen():
|
|
21
27
|
yield from iter([1, 2])
|
|
22
28
|
return result
|
|
29
|
+
- |
|
|
30
|
+
def outer():
|
|
31
|
+
def inner_gen():
|
|
32
|
+
yield 1
|
|
33
|
+
return 99
|
|
34
|
+
return inner_gen
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: no-runtime-typeof
|
|
2
|
+
valid:
|
|
3
|
+
- |
|
|
4
|
+
function isFoo(x: unknown): x is Foo {
|
|
5
|
+
return typeof x === "object";
|
|
6
|
+
}
|
|
7
|
+
- |
|
|
8
|
+
const isBar = (x: unknown): x is Bar => typeof x === "object";
|
|
9
|
+
- |
|
|
10
|
+
function parseThing(x: unknown) {
|
|
11
|
+
return typeof x === "string";
|
|
12
|
+
}
|
|
13
|
+
- |
|
|
14
|
+
const validateThing = (x: unknown) => typeof x === "string";
|
|
15
|
+
- |
|
|
16
|
+
class C {
|
|
17
|
+
isFoo(x: unknown): x is Foo {
|
|
18
|
+
return typeof x === "object";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
invalid:
|
|
22
|
+
- |
|
|
23
|
+
function plain(x: unknown) {
|
|
24
|
+
return typeof x === "string";
|
|
25
|
+
}
|
|
26
|
+
- |
|
|
27
|
+
const check = (x: unknown) => typeof x === "string";
|
|
28
|
+
- |
|
|
29
|
+
class C {
|
|
30
|
+
plain(x: unknown) {
|
|
31
|
+
return typeof x === "string";
|
|
32
|
+
}
|
|
33
|
+
}
|
package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml
CHANGED
|
@@ -4,7 +4,16 @@ valid:
|
|
|
4
4
|
- "app.run(host='localhost', port=8000)"
|
|
5
5
|
- "uvicorn.run(app, host='127.0.0.1', port=8000)"
|
|
6
6
|
- "uvicorn.run(app, host=HOST, port=PORT)" # env var is OK
|
|
7
|
+
- |
|
|
8
|
+
return Settings.model_construct(
|
|
9
|
+
gh_proxy_bind_host='0.0.0.0',
|
|
10
|
+
)
|
|
7
11
|
invalid:
|
|
8
12
|
- "app.run(host='0.0.0.0', port=8000)"
|
|
9
13
|
- "uvicorn.run(app, host='0.0.0.0', port=8000)"
|
|
10
14
|
- 'app.run(host="0.0.0.0", port=8000)'
|
|
15
|
+
- "server.listen(host='0.0.0.0', port=8000)"
|
|
16
|
+
- "app.serve(host='0.0.0.0', port=8000)"
|
|
17
|
+
- "run(host='0.0.0.0', port=8000)"
|
|
18
|
+
- "config = uvicorn.Config(app, host='0.0.0.0', port=8000)"
|
|
19
|
+
- "app.run_server(host='0.0.0.0', port=8000)"
|
package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-shape-in-symbol-names-test.yml
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
id: no-shape-in-symbol-names
|
|
2
|
+
valid:
|
|
3
|
+
- "const manifest = 1;"
|
|
4
|
+
- "interface I { name: string; }"
|
|
5
|
+
- "type Manifest = 1;"
|
|
6
|
+
invalid:
|
|
7
|
+
- "const shape = 1;"
|
|
8
|
+
- "const packageJsonShape = 1;"
|
|
9
|
+
- "class C { shapeField = 1; }"
|
|
10
|
+
- "class C { #shapeField = 1; }"
|
|
11
|
+
- "interface I { shapeProp: string; }"
|
|
12
|
+
- "type PackageJsonShape = 1;"
|
|
13
|
+
- "function reshape() {}"
|
|
@@ -3,8 +3,12 @@ valid:
|
|
|
3
3
|
- "db.find({ id })"
|
|
4
4
|
- "db.findOne({ where: { id } })"
|
|
5
5
|
- 'sql.unsafe("non-sql")'
|
|
6
|
-
invalid:
|
|
7
6
|
- 'db.query("SELECT * FROM users")'
|
|
8
7
|
- 'db.query("INSERT INTO x VALUES (1)")'
|
|
9
8
|
- 'db.query("UPDATE users SET x = 1")'
|
|
10
9
|
- 'db.query("SELECT * FROM users WHERE id = ?", [id])'
|
|
10
|
+
- 'db.query("SELECT * FROM " + "users")'
|
|
11
|
+
invalid:
|
|
12
|
+
- 'db.query("SELECT * FROM users WHERE id = " + id)'
|
|
13
|
+
- 'db.query("DELETE FROM sessions WHERE token = " + token, [])'
|
|
14
|
+
- 'db.query(`SELECT * FROM users WHERE id = ${id}`)'
|
|
@@ -3,8 +3,12 @@ valid:
|
|
|
3
3
|
- "db.find({ id })"
|
|
4
4
|
- "db.findOne({ where: { id } })"
|
|
5
5
|
- 'sql.unsafe("non-sql")'
|
|
6
|
-
invalid:
|
|
7
6
|
- 'db.query("SELECT * FROM users")'
|
|
8
7
|
- 'db.query("INSERT INTO x VALUES (1)")'
|
|
9
8
|
- 'db.query("UPDATE users SET x = 1")'
|
|
10
9
|
- 'db.query("SELECT * FROM users WHERE id = ?", [id])'
|
|
10
|
+
- 'db.query("SELECT * FROM " + "users")'
|
|
11
|
+
invalid:
|
|
12
|
+
- 'db.query("SELECT * FROM users WHERE id = " + id)'
|
|
13
|
+
- 'db.query("DELETE FROM sessions WHERE token = " + token, [])'
|
|
14
|
+
- 'db.query(`SELECT * FROM users WHERE id = ${id}`)'
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
id: no-unknown-parameters
|
|
2
|
+
valid:
|
|
3
|
+
- "function f(x: string) {}"
|
|
4
|
+
- "function f(cause: unknown) {}"
|
|
5
|
+
- "const g = (cause?: unknown) => {};"
|
|
6
|
+
- "class C { m(cause: unknown) {} }"
|
|
7
|
+
invalid:
|
|
8
|
+
- "function f(x: unknown) {}"
|
|
9
|
+
- "const g = (x: unknown) => {};"
|
|
10
|
+
- "class C { m(x: unknown) {} }"
|
|
11
|
+
- "interface I { m(x: unknown): void; }"
|
|
12
|
+
- "function f(x?: unknown) {}"
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
id: no-unknown-returns
|
|
2
|
+
valid:
|
|
3
|
+
- "function f(x: unknown): string { return String(x); }"
|
|
4
|
+
- "const g = (x: unknown): number => 1;"
|
|
5
|
+
- "class C { m(): void {} }"
|
|
6
|
+
# #1824: a function_type is a TYPE-POSITION annotation (a callback
|
|
7
|
+
# signature or type alias), not a value returning unknown — "the
|
|
8
|
+
# caller ignores my result" is a legitimate contract, so it must not
|
|
9
|
+
# flag. Covers both a standalone alias and a parameter position use.
|
|
10
|
+
- "type H = () => unknown;"
|
|
11
|
+
- "interface I { on(cb: () => unknown): void; }"
|
|
12
|
+
invalid:
|
|
13
|
+
- "function f(): unknown { return 1; }"
|
|
14
|
+
- "const g = (): unknown => 1;"
|
|
15
|
+
- "class C { m(): unknown { return 1; } }"
|
|
16
|
+
- "interface I { m(): unknown; }"
|
package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-any-test.yml
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
id: no-unsafe-dictionary-any
|
|
2
|
+
valid:
|
|
3
|
+
- "type T = Record<string, unknown>;"
|
|
4
|
+
- "function f(x: Record<string, string>) {}"
|
|
5
|
+
- "interface I { m: Record<string, number>; }"
|
|
6
|
+
invalid:
|
|
7
|
+
- "type T = Record<string, any>;"
|
|
8
|
+
- "function f(x: Record<string, any>) {}"
|
|
9
|
+
- "interface I { m: Record<string, any>; }"
|
|
10
|
+
- "const m: Record<number, any> = {};"
|
package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-unknown-test.yml
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
id: no-unsafe-dictionary-unknown
|
|
2
|
+
valid:
|
|
3
|
+
- "type T = Record<string, string>;"
|
|
4
|
+
- "function f(x: Record<string, any>) {}"
|
|
5
|
+
invalid:
|
|
6
|
+
- "type T = Record<string, unknown>;"
|
|
7
|
+
- "function f(x: Record<string, unknown>) {}"
|
|
8
|
+
- "interface I { m: Record<string, unknown>; }"
|
package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml
CHANGED
|
@@ -9,6 +9,16 @@ valid:
|
|
|
9
9
|
}
|
|
10
10
|
- |
|
|
11
11
|
fn f() -> i32 { 42 }
|
|
12
|
+
- |
|
|
13
|
+
/// Dereferences a raw pointer.
|
|
14
|
+
///
|
|
15
|
+
/// # Safety
|
|
16
|
+
///
|
|
17
|
+
/// Caller must ensure the pointer is valid and aligned.
|
|
18
|
+
unsafe fn ptr_deref(p: *const i32) -> i32 {
|
|
19
|
+
let x = 1;
|
|
20
|
+
x
|
|
21
|
+
}
|
|
12
22
|
invalid:
|
|
13
23
|
- |
|
|
14
24
|
unsafe fn f() {
|
|
@@ -23,3 +33,28 @@ invalid:
|
|
|
23
33
|
let ptr = 0x1234 as *const i32;
|
|
24
34
|
ptr
|
|
25
35
|
}
|
|
36
|
+
- |
|
|
37
|
+
/// Does something.
|
|
38
|
+
unsafe fn no_real_safety_doc() {
|
|
39
|
+
println!("nope");
|
|
40
|
+
}
|
|
41
|
+
- |
|
|
42
|
+
// # Safety
|
|
43
|
+
// This is a stray file-top comment, not attached to any function.
|
|
44
|
+
|
|
45
|
+
fn helper() {}
|
|
46
|
+
|
|
47
|
+
unsafe fn no_doc_at_all() {
|
|
48
|
+
println!("bad 1");
|
|
49
|
+
}
|
|
50
|
+
- |
|
|
51
|
+
/// # Safety
|
|
52
|
+
/// Caller must ensure the pointer is valid.
|
|
53
|
+
unsafe fn documented_fn(p: *const i32) -> i32 {
|
|
54
|
+
let x = 1;
|
|
55
|
+
x
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
unsafe fn undocumented_fn_b() {
|
|
59
|
+
println!("no doc for me");
|
|
60
|
+
}
|