@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
|
@@ -67,6 +67,27 @@ const x = risky();
|
|
|
67
67
|
This is the same convention every runner/profile honors, so a suppression is
|
|
68
68
|
portable, git-tracked, and visible in review — not private pi-lens metadata.
|
|
69
69
|
|
|
70
|
+
## Dual-scanner secrets need two marks
|
|
71
|
+
|
|
72
|
+
gitleaks and trivy scan for secrets independently. When both flag the same
|
|
73
|
+
credential on the same line, each finding gets its own anchor (`tool` +
|
|
74
|
+
`rule` differ: `gitleaks:<ruleId>` vs `trivy-secret:<ruleId>`), so one
|
|
75
|
+
`lens_diagnostic_mark` call clears only one of the two copies. The 🔴 STOP
|
|
76
|
+
blocker stays up, citing the still-unmarked copy, until both are marked
|
|
77
|
+
false-positive.
|
|
78
|
+
|
|
79
|
+
This is deliberate defense-in-depth, not a bug: a real credential that one
|
|
80
|
+
scanner misses still blocks. It is also strictly better than before #1691,
|
|
81
|
+
when the trivy copy of a corroborated finding had no anchor at all and could
|
|
82
|
+
never be cleared. Expect to call `lens_diagnostic_mark` twice — once per
|
|
83
|
+
`tool` — when `lens_diagnostics` shows the same line flagged under both
|
|
84
|
+
`gitleaks` and `trivy`.
|
|
85
|
+
|
|
86
|
+
The 🔴 STOP line's own bracket names which scanners still hold the finding —
|
|
87
|
+
`[gitleaks + trivy]` before either mark, narrowing to `[trivy]` after the
|
|
88
|
+
gitleaks copy clears — so a shrinking bracket, not a vanished blocker, is the
|
|
89
|
+
signal that one copy remains.
|
|
90
|
+
|
|
70
91
|
## Telemetry
|
|
71
92
|
|
|
72
93
|
Every mark (including in-memory `defer`) is appended as NDJSON to
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
### LSP Support
|
|
4
4
|
|
|
5
|
-
pi-lens includes **
|
|
5
|
+
pi-lens includes **45 language server definitions** (including four cross-cutting *auxiliary* scanners that attach alongside the file's language server — Opengrep, ast-grep, zizmor, and typos — see below). LSP is **enabled by default**; use `--no-lsp` to disable it for a session. Servers are auto-discovered from PATH, project `node_modules`, and managed installs. When a server is not installed, pi-lens offers an interactive install prompt.
|
|
6
6
|
|
|
7
7
|
**LSP Idle Management:** LSP servers shut down after 240 seconds of inactivity (no files modified) to free resources. The timer resets when you resume editing, preventing cold-start penalties during active development.
|
|
8
8
|
|
|
@@ -19,13 +19,13 @@ pi-lens includes **42 language server definitions** (including four cross-cuttin
|
|
|
19
19
|
- **`capabilities`** — shows which operations are supported by the active LSP server(s) for a file, read directly from the cached `initialize` response (no round-trip).
|
|
20
20
|
- **Symbol column resolution** — passing `symbol: "myFunc"` instead of an exact `character` position resolves the correct column automatically. Use `symbol: "foo#2"` for the second occurrence of `foo` on the line.
|
|
21
21
|
|
|
22
|
-
LSP servers for: TypeScript, Deno, Python (pyright/basedpyright + jedi), Go, Rust, Ruby (ruby-lsp + solargraph), PHP, C# (omnisharp), F#, Java (JDT LS, with Lombok javaagent support when a Lombok jar is available), Kotlin, Swift, Dart, Lua, C/C++, Zig, Haskell, Elixir, Gleam, OCaml, Clojure, Terraform, Nix, Bash, Docker, YAML, JSON, HTML, TOML, Prisma, Vue, Svelte, CSS.
|
|
22
|
+
LSP servers for: TypeScript, Deno, Python (pyright/basedpyright + jedi), Go, Rust, Ruby (ruby-lsp + solargraph), PHP, C# (omnisharp), F#, Java (JDT LS, with Lombok javaagent support when a Lombok jar is available), Kotlin, Swift, Dart, Lua, C/C++, Zig, Haskell, Elixir, Gleam, OCaml, Clojure, CUE (syntax and parse diagnostics; evaluation errors via the cue-vet auxiliary runner), Terraform, Nix, Bash, Docker, YAML, JSON, HTML, TOML, Prisma, Vue, Svelte, CSS.
|
|
23
23
|
|
|
24
24
|
### Formatters
|
|
25
25
|
|
|
26
|
-
pi-lens auto-detects and runs **
|
|
26
|
+
pi-lens auto-detects and runs **34 formatters** based on project config:
|
|
27
27
|
|
|
28
|
-
biome, prettier, oxfmt, ruff, black, sqlfluff, gofmt, rustfmt, zig fmt, dart format, shfmt, nixfmt, mix format, ocamlformat, clang-format, ktlint, rubocop, standardrb, gleam format, terraform fmt, php-cs-fixer, csharpier, fantomas, swiftformat, stylua, ormolu, taplo, fish_indent, google-java-format, cljfmt, cmake-format, psscriptanalyzer-format
|
|
28
|
+
biome, prettier, oxfmt, ruff, black, sqlfluff, gofmt, rustfmt, zig fmt, dart format, shfmt, nixfmt, mix format, ocamlformat, clang-format, ktlint, rubocop, standardrb, gleam format, terraform fmt, php-cs-fixer, csharpier, fantomas, swiftformat, stylua, ormolu, taplo, fish_indent, google-java-format, cljfmt, cmake-format, cue fmt, psscriptanalyzer-format
|
|
29
29
|
|
|
30
30
|
Detection rules:
|
|
31
31
|
|
|
@@ -332,7 +332,21 @@ Trivy requires an **explicit** opt-in (rather than just a manifest being present
|
|
|
332
332
|
}
|
|
333
333
|
```
|
|
334
334
|
|
|
335
|
-
**IaC misconfiguration (per-edit, not a session scan).** When `trivy.enabled` is set, pi-lens also runs `trivy config` as an on-write dispatch runner (alongside hadolint/tflint) over **Dockerfiles** and **Kubernetes manifests** (YAML with an `apiVersion:` + `kind:` signature) — Trivy's security-policy engine (runs-as-root, no `HEALTHCHECK`, `privileged: true`, missing resource limits, …), a different class from hadolint's lint. On Dockerfiles, trivy-config findings that hadolint already reports at the same line are suppressed, so it only adds the security checks hadolint lacks.
|
|
335
|
+
**IaC misconfiguration (per-edit, not a session scan).** When `trivy.enabled` is set, pi-lens also runs `trivy config` as an on-write dispatch runner (alongside hadolint/tflint) over **Dockerfiles** and **Kubernetes manifests** (YAML with an `apiVersion:` + `kind:` signature) — Trivy's security-policy engine (runs-as-root, no `HEALTHCHECK`, `privileged: true`, missing resource limits, …), a different class from hadolint's lint. On Dockerfiles, trivy-config findings that hadolint already reports at the same line are suppressed, so it only adds the security checks hadolint lacks. Compose/CloudFormation are tracked as follow-ups; Terraform is covered by the same runner, and Helm charts are covered by rendered-manifest validation below.
|
|
336
|
+
|
|
337
|
+
**Rendered-manifest validation for Helm charts (opt-in).** `helm lint` checks a chart's source; it cannot see what the chart produces. When a project sets
|
|
338
|
+
|
|
339
|
+
```json
|
|
340
|
+
{ "helm": { "renderValidation": { "enabled": true } } }
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
pi-lens also renders the nearest chart with `helm template` into a scratch directory under the system temp dir and validates the output:
|
|
344
|
+
|
|
345
|
+
- a **failed render** (a missing values key, a nil pointer in a template expression, a dependency declared in `Chart.yaml` but absent from `charts/`) is reported as a blocking finding on the template that failed — charts that pass `helm lint` and still cannot be installed;
|
|
346
|
+
- every rendered document must declare `apiVersion` and `kind`, so a conditional that renders a headless fragment is flagged instead of installing as a silent no-op;
|
|
347
|
+
- when `trivy.enabled` is also set, `trivy config` runs over the rendered manifests, which is the only way Trivy's Kubernetes policy checks can see a chart's real output.
|
|
348
|
+
|
|
349
|
+
It is **off by default** because rendering executes chart-authored template code, and the switch alone is not enough: the render also requires **host project trust**, since `.pi-lens.json` is a tracked file a cloned repository could ship pre-enabled. The switch is read from the chart's own project root, not the current directory. In untrusted mode the refusal is reported rather than silently skipped. Nothing is written to the chart directory, `--dependency-update` is never passed, and the scratch directory is removed on every exit path. Findings map back to the source template through helm's own `# Source:` annotations; rendered line numbers travel in the message, since they do not correspond to template lines. Full OpenAPI schema validation (kubeconform) is not included.
|
|
336
350
|
|
|
337
351
|
### MCP Server (Experimental)
|
|
338
352
|
|
|
@@ -26,6 +26,7 @@ Each runtime toggle is settable from the CLI *and* from `config.json`. The two a
|
|
|
26
26
|
| `--lens-actionable-warning-all` | `actionableWarnings.deltaOnly` (`false`) | `true` |
|
|
27
27
|
| `--lens-compact-tool-line` | `ui.compactToolLine` | `false` |
|
|
28
28
|
| `--no-lazy-tools` | `tools.lazy` | `true` |
|
|
29
|
+
| `--lens-turn-end-madge` | `turnEnd.madge.enabled` | `false` |
|
|
29
30
|
|
|
30
31
|
By default pi-lens registers six situational tools (the `ast_grep_*` family,
|
|
31
32
|
`lsp_navigation`, `lens_diagnostic_mark`) inactive and exposes a small loader,
|
|
@@ -90,6 +91,8 @@ Hide the diagnostics widget by default, run formatting immediately after write/e
|
|
|
90
91
|
|
|
91
92
|
`actionableWarnings.enabled` gates the turn_end report. `includeLspCodeActions` fetches LSP code actions for each warning (requires an active language server). `deltaOnly` (default `true`) limits the report to lines touched in the current turn. `autoFix.enabled` applies conservative LSP quickfixes at `agent_end`; `autoFix.maxFixes` caps the number applied per turn (default `5`, must be a non-negative whole number). `maxFixes: 0` keeps the report and applies nothing, which is a useful halfway step before enabling `autoFix` for real. Unlike the toggles in the table above there is no CLI counterpart, since it takes a number rather than being on or off.
|
|
92
93
|
|
|
94
|
+
`turnEnd.madge.enabled` (default `false`) runs the per-turn-end madge circular-dependency check on import-changed files. It is off by default because that pass only writes debug output — user-facing madge diagnostics come from the session-start scan cache and the `lens_diagnostics` extractor — and its subprocess spawns dominated the turn-end latency tail (#766). Enable it with `--lens-turn-end-madge` or `turnEnd.madge.enabled: true` if you want the per-edit circular-dependency note.
|
|
95
|
+
|
|
93
96
|
`ignore` is an array of gitignore-style glob patterns excluded from pi-lens scans across **every** project — the global counterpart to the per-project `.pi-lens.json` `ignore` below. Precedence is lowest: a project `.gitignore` or `.pi-lens.json` (including a `!negation`) overrides it, so you can globally hide e.g. `scratch/**` and still re-include it in one repo.
|
|
94
97
|
|
|
95
98
|
Turn subsystems off globally instead of retyping flags every session:
|
|
@@ -9,7 +9,7 @@ Dispatch is diagnostics-oriented: automatic formatting and safe autofix happen i
|
|
|
9
9
|
| Language | LSP | Dispatch Runners | Formatter |
|
|
10
10
|
| --------------------- | --- | -------------------------------------------------------------------------------------------------------------- | ----------------------- |
|
|
11
11
|
| JavaScript/TypeScript | ✓ | lsp, ts-lsp, biome-check-json, tree-sitter, ast-grep-napi, type-safety, similarity, fact-rules, eslint, oxlint | biome, prettier |
|
|
12
|
-
| Python | ✓ | lsp, pyright, ruff-lint, tree-sitter
|
|
12
|
+
| Python | ✓ | lsp, pyright, mypy (config-first), ruff-lint, tree-sitter | ruff, black |
|
|
13
13
|
| Go | ✓ | lsp, go-vet, golangci-lint, tree-sitter | gofmt |
|
|
14
14
|
| Rust | ✓ | lsp, rust-clippy, tree-sitter | rustfmt |
|
|
15
15
|
| Ruby | ✓ | lsp, rubocop, tree-sitter | rubocop, standardrb |
|
|
@@ -18,13 +18,13 @@ Dispatch is diagnostics-oriented: automatic formatting and safe autofix happen i
|
|
|
18
18
|
| Fish | ✓ (fish-lsp) | lsp, fish-indent | fish_indent |
|
|
19
19
|
| CSS/SCSS/Less | ✓ | lsp, stylelint | biome, prettier |
|
|
20
20
|
| HTML | ✓ | lsp, htmlhint | prettier |
|
|
21
|
-
| YAML | ✓ | lsp, yamllint, actionlint (GitHub workflows)
|
|
22
|
-
| JSON | ✓ | lsp
|
|
21
|
+
| YAML | ✓ | lsp, yamllint, actionlint (GitHub workflows), trivy-config (opt-in; Kubernetes manifests, CloudFormation) | prettier |
|
|
22
|
+
| JSON | ✓ | lsp, trivy-config (opt-in; CloudFormation templates only) | biome, prettier |
|
|
23
23
|
| Svelte | ✓ | lsp | oxfmt (needs `svelte` pkg installed + config `svelte: true`) |
|
|
24
24
|
| Vue | ✓ | lsp | prettier, oxfmt |
|
|
25
25
|
| SQL | — | sqlfluff | sqlfluff |
|
|
26
26
|
| Markdown | — | spellcheck, markdownlint, vale | prettier |
|
|
27
|
-
| Docker | ✓ | lsp, hadolint
|
|
27
|
+
| Docker | ✓ | lsp, hadolint, trivy-config (opt-in) | — |
|
|
28
28
|
| PHP | ✓ | lsp, php-lint, phpstan | php-cs-fixer |
|
|
29
29
|
| PowerShell | ✓ | lsp, psscriptanalyzer | psscriptanalyzer-format |
|
|
30
30
|
| Prisma | ✓ | lsp, prisma-validate | — |
|
|
@@ -46,4 +46,70 @@ Dispatch is diagnostics-oriented: automatic formatting and safe autofix happen i
|
|
|
46
46
|
| Terragrunt | — | terragrunt | terragrunt hcl fmt |
|
|
47
47
|
| Nix | ✓ | lsp | nixfmt |
|
|
48
48
|
| TOML | ✓ | lsp, taplo | taplo |
|
|
49
|
-
| CMake | ✓ (cmake-language-server) | lsp
|
|
49
|
+
| CMake | ✓ (cmake-language-server) | lsp | cmake-format |
|
|
50
|
+
| CUE | ✓ (syntax via cue lsp, evaluation via cue vet) | lsp, cue-vet | cue fmt |
|
|
51
|
+
|
|
52
|
+
`cue lsp` reports load and parse errors as you type but leaves conflicting
|
|
53
|
+
values and failed constraints to `cue vet` — the `cue-vet` auxiliary runner
|
|
54
|
+
(#1522) covers that gap, so together they give full coverage: syntax/parse
|
|
55
|
+
diagnostics, hover, definition, completion, code actions, and formatting from
|
|
56
|
+
the language server, plus evaluation-error validation from `cue vet` on every
|
|
57
|
+
edit (vetted at the PACKAGE level — the touched file's directory — with the
|
|
58
|
+
result filtered back to that file, since CUE packages are directory-scoped).
|
|
59
|
+
`.cue` files parse under tree-sitter with symbol (`#Definition`s, fields,
|
|
60
|
+
`let` bindings) and import queries (#1522), giving CUE the same structural
|
|
61
|
+
symbol search and import extraction as any other language, with two known
|
|
62
|
+
rough edges inherited from the young `tree-sitter-cue` grammar itself (not
|
|
63
|
+
this repo's queries):
|
|
64
|
+
|
|
65
|
+
- **Multi-hash raw strings** (`` ##"..."## ``, two or more `#` delimiters)
|
|
66
|
+
mis-parse regardless of content — the field's value becomes a bare
|
|
67
|
+
`identifier` node instead of a `string`, and the parser emits stray
|
|
68
|
+
top-level nodes outside the field entirely. Because the broken value node
|
|
69
|
+
can carry `#`-prefixed text, this can surface as a spurious symbol
|
|
70
|
+
reference in the extracted refs. Single-hash raw strings (`` #"..."# ``)
|
|
71
|
+
are unaffected.
|
|
72
|
+
- **Aliased field labels** (`X=name: value`) emit the alias identifier (`X`)
|
|
73
|
+
as its own spurious `property` symbol alongside the real field's correct
|
|
74
|
+
symbol, because the grammar exposes both identifiers as untagged siblings
|
|
75
|
+
under the same `label` node with no way to tell them apart structurally.
|
|
76
|
+
|
|
77
|
+
Both are upstream grammar limitations (tracked among
|
|
78
|
+
[eonpatapon/tree-sitter-cue](https://github.com/eonpatapon/tree-sitter-cue)'s
|
|
79
|
+
open issues), not something a query change here can fix.
|
|
80
|
+
|
|
81
|
+
## Considered and skipped (2026-08-20 survey, closed out by #1757)
|
|
82
|
+
|
|
83
|
+
Recorded so these are not re-litigated. The 2026-08-20 survey's first pass
|
|
84
|
+
rejected `bandit` and `checkov` as duplicates of existing lanes; #1752's
|
|
85
|
+
review disproved both "already covered" claims against the actual code, and
|
|
86
|
+
#1757 closed the resulting gaps:
|
|
87
|
+
|
|
88
|
+
- **bandit** (Python SAST) — RESOLVED. ruff's `S` ruleset implements Bandit's
|
|
89
|
+
checks; `config/ruff/core.toml` now selects `S`, with `S101` (assert),
|
|
90
|
+
`S311` (non-cryptographic random), `S603`/`S607` (subprocess without
|
|
91
|
+
`shell=True` / partial executable path) excluded as over-firing on real
|
|
92
|
+
code (measured against the `requests` and `pip` packages — see the config
|
|
93
|
+
file's comments for the exclusion reasoning and hit counts). `C90`
|
|
94
|
+
(mccabe complexity) was evaluated and NOT enabled: it is a maintainability
|
|
95
|
+
metric, not a Bandit-equivalent security check, and its hit volume on a
|
|
96
|
+
large pre-existing codebase (379 in `pandas`) would drown the security
|
|
97
|
+
signal `S` adds. As always, a project-local ruff config overrides the
|
|
98
|
+
bundled one outright.
|
|
99
|
+
- **checkov** (IaC security) — the `trivy config` lane pi-lens's own dispatch
|
|
100
|
+
registry already carries (`clients/dispatch/runners/trivy-config.ts`,
|
|
101
|
+
opt-in via `trivy.enabled`) makes checkov a duplicate, not a gap: no
|
|
102
|
+
second full-scan tool is needed. That lane covers Kubernetes manifests,
|
|
103
|
+
Dockerfiles, and Terraform; #1757 added CloudFormation (yaml and json
|
|
104
|
+
templates, detected via `AWSTemplateFormatVersion` / SAM `Transform` /
|
|
105
|
+
`Type: AWS::*` heuristics) and fixed a real bug found while verifying
|
|
106
|
+
against the installed binary: the runner passed `--no-progress` to `trivy
|
|
107
|
+
config`, a flag that subcommand rejects (only `trivy fs` accepts it) —
|
|
108
|
+
every real invocation exited 1 and, because trivy prints its usage text to
|
|
109
|
+
stdout on a rejected flag, was misreported as a clean `succeeded` scan
|
|
110
|
+
rather than an errored one. Dropping the flag was the fix.
|
|
111
|
+
- **radon / lizard** (complexity) — still not enabled; see the C90 note
|
|
112
|
+
above. Unchanged conclusion, now backed by measurement rather than
|
|
113
|
+
assumption.
|
|
114
|
+
|
|
115
|
+
Known coverage holes with no tool currently clearing the adoption bar: Rust and Java dead-code detection, Ruby type checking (sorbet judged too heavy and idiosyncratic for a default lane).
|
|
@@ -243,8 +243,8 @@ Initial assumption ("knip/jscpd are booboo-only") was **wrong**. Verified:
|
|
|
243
243
|
| layer | handler | runs |
|
|
244
244
|
|-------|---------|------|
|
|
245
245
|
| per-edit | `dispatchLintWithResult` | LSP, tree-sitter, ast-grep, fact-rules, biome/ruff/eslint/oxlint |
|
|
246
|
-
| per-turn | `handleTurnEnd` (`runtime-turn.ts`) | **knip
|
|
247
|
-
| per-session | `handleSessionStart` (`runtime-session.ts`) | **jscpd full scan
|
|
246
|
+
| per-turn | `handleTurnEnd` (`runtime-turn.ts`) | **knip**, **jscpd** (incremental, `getFilesForJscpd`), **madge/dep circular** (opt-in via `--lens-turn-end-madge`), **cascade merge**, **tests**, actionable/code-quality warnings aggregation, project-diagnostics delta |
|
|
247
|
+
| per-session | `handleSessionStart` (`runtime-session.ts`) | **jscpd full scan**, knip, type-coverage, dep, govulncheck, gitleaks, todo, complexity baselines, dominant-language **LSP warm** (#203). The production path does not currently populate the error-debt baseline. |
|
|
248
248
|
|
|
249
249
|
The initial MCP implementation invoked **none** of the lifecycle handlers —
|
|
250
250
|
only the per-edit layer. The shipped server now exposes `pilens_session_start`
|
|
@@ -6,7 +6,7 @@ server's `initialize` handshake. Generated by `node scripts/server-capabilities.
|
|
|
6
6
|
absent on the generating host are listed under *Unavailable* — run in a
|
|
7
7
|
provisioned environment (the nightly) to capture those rows.
|
|
8
8
|
|
|
9
|
-
_Last generated: 2026-08-
|
|
9
|
+
_Last generated: 2026-08-20 on linux; 30 servers captured, 14 unavailable._
|
|
10
10
|
|
|
11
11
|
## Diagnostic mode + navigation/edit operations
|
|
12
12
|
|
|
@@ -19,6 +19,7 @@ Legend: ✓ advertised, · not. **mode** = document diagnostics (`pull` = `textD
|
|
|
19
19
|
| clojure | push-only | · | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 62 |
|
|
20
20
|
| csharp | pull | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0 |
|
|
21
21
|
| css | pull | · | ✓ | · | · | ✓ | ✓ | · | ✓ | · | ✓ | ✓ | · | · | 0 |
|
|
22
|
+
| cue | push-only | · | ✓ | · | · | ✓ | ✓ | · | ✓ | · | ✓ | ✓ | · | · | 1 |
|
|
22
23
|
| dart | push-only | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 18 |
|
|
23
24
|
| deno | pull | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 2 |
|
|
24
25
|
| docker | push-only | · | ✓ | · | · | · | ✓ | ✓ | ✓ | · | · | ✓ | · | · | 0 |
|
|
@@ -54,6 +55,7 @@ Legend: ✓ advertised, · not. **mode** = document diagnostics (`pull` = `textD
|
|
|
54
55
|
- **clojure**: callHierarchyProvider, codeActionProvider, codeLensProvider, completionProvider, declarationProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentRangeFormattingProvider, documentSymbolProvider, executeCommandProvider, experimental, foldingRangeProvider, hoverProvider, implementationProvider, linkedEditingRangeProvider, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, workspace, workspaceSymbolProvider
|
|
55
56
|
- **csharp**: callHierarchyProvider, codeActionProvider, codeLensProvider, completionProvider, definitionProvider, diagnosticProvider, documentFormattingProvider, documentHighlightProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, referencesProvider, renameProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, typeHierarchyProvider, workspace, workspaceSymbolProvider
|
|
56
57
|
- **css**: codeActionProvider, colorProvider, definitionProvider, diagnosticProvider, documentFormattingProvider, documentHighlightProvider, documentLinkProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, referencesProvider, renameProvider, selectionRangeProvider, textDocumentSync
|
|
58
|
+
- **cue**: codeActionProvider, codeLensProvider, completionProvider, definitionProvider, documentFormattingProvider, documentSymbolProvider, executeCommandProvider, hoverProvider, referencesProvider, renameProvider, textDocumentSync, workspace
|
|
57
59
|
- **dart**: callHierarchyProvider, codeActionProvider, codeLensProvider, colorProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentLinkProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, executeCommandProvider, experimental, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, inlineValueProvider, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, typeHierarchyProvider, workspace, workspaceSymbolProvider
|
|
58
60
|
- **deno**: callHierarchyProvider, codeActionProvider, codeLensProvider, completionProvider, definitionProvider, diagnosticProvider, documentFormattingProvider, documentHighlightProvider, documentSymbolProvider, executeCommandProvider, experimental, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, notebookDocumentSync, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, workspace, workspaceSymbolProvider
|
|
59
61
|
- **docker**: codeActionProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentLinkProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, renameProvider, signatureHelpProvider, textDocumentSync
|
|
@@ -89,6 +91,7 @@ surface, including providers pi-lens does not yet consume.
|
|
|
89
91
|
|
|
90
92
|
- **ast-grep** (1): ast-grep.applyAllFixes
|
|
91
93
|
- **clojure** (62): add-import-to-namespace, add-missing-import, add-missing-libspec, add-require-suggestion, as-to-refer, backward, backward-barf, backward-select, backward-slurp, change-coll, clean-ns, cond->if-refactor, create-function, create-test, cursor-info, cycle-coll, cycle-keyword-auto-resolve, cycle-privacy, demote-fn, destructure-keys, drag-backward, drag-forward, drag-param-backward, drag-param-forward, expand-let, extract-function, extract-to-def, forward, forward-barf, forward-select, forward-slurp, get-in-all, get-in-less, get-in-more, get-in-none, if->cond-refactor, inline-function, inline-symbol, introduce-let, kill-sexp, …
|
|
94
|
+
- **cue** (1): cuelsp.externalvalidate
|
|
92
95
|
- **dart** (18): dart.edit.codeAction.apply, dart.edit.sortMembers, dart.edit.organizeImports, dart.edit.fixAll, dart.edit.fixAllInWorkspace.preview, dart.edit.fixAllInWorkspace, dart.edit.sendWorkspaceEdit, refactor.perform, refactor.validate, dart.logAction, dart.refactor.add_constructor_name, dart.refactor_add.import_prefix, dart.refactor.convert_all_formal_parameters_to_named, dart.refactor.convert_selected_formal_parameters_to_named, dart.refactor.move_selected_formal_parameters_left, dart.refactor.move_top_level_to_file, dart.refactor.remove_constructor_name, dart.refactor.remove_import_prefix
|
|
93
96
|
- **deno** (2): deno.cache, deno.reloadImportRegistries
|
|
94
97
|
- **expert** (2): Reindex, connectionDetails
|
|
@@ -71,6 +71,7 @@ column is the effective behavior when nothing is set.
|
|
|
71
71
|
| `--lens-actionable-warning-all` | `actionableWarnings.deltaOnly` (`false`) | global | `deltaOnly` **on** (report this turn only) |
|
|
72
72
|
| `--lens-compact-tool-line` | `ui.compactToolLine` | global | **off** (two-row tool rendering) |
|
|
73
73
|
| `--no-lazy-tools` | `tools.lazy` | global | lazy tools **on** (six situational tools start inactive) |
|
|
74
|
+
| `--lens-turn-end-madge` | `turnEnd.madge.enabled` | global | **off** (madge runs at session start, not per turn) |
|
|
74
75
|
|
|
75
76
|
`--no-lazy-tools` keeps every pi-lens tool active for the whole session, so the
|
|
76
77
|
advertised tool list never changes. The `pi_lens_activate_tools` loader stays
|
|
@@ -106,6 +107,7 @@ field docs.
|
|
|
106
107
|
| `maxProjectFiles` | project | `2000` | Base scale knob; derives five subsystem size budgets |
|
|
107
108
|
| `reviewGraph.maxFiles` | project | derived (clamped `100`–`20000`) | Explicit review-graph file budget |
|
|
108
109
|
| `trivy.enabled` / `trivy.minSeverity` | project | off | Opt-in Trivy vulnerability scanning |
|
|
110
|
+
| `helm.renderValidation.enabled` | project | off | Opt-in `helm template` rendering plus rendered-manifest validation. Rendering executes chart templates, so it **also requires host project trust** and is read from the chart's own project root — see below |
|
|
109
111
|
|
|
110
112
|
## Global vs project config
|
|
111
113
|
|
|
@@ -141,7 +143,23 @@ A project file honors **only**:
|
|
|
141
143
|
|
|
142
144
|
- the three mutation controls — `format.enabled`, `autofix.enabled`,
|
|
143
145
|
`actionableWarnings.autoFix.enabled`;
|
|
144
|
-
- `ignore`, `rules`, `maxProjectFiles`, `reviewGraph`, and `
|
|
146
|
+
- `ignore`, `rules`, `maxProjectFiles`, `reviewGraph`, `trivy`, and `helm`.
|
|
147
|
+
|
|
148
|
+
### `helm.renderValidation.enabled` needs trust as well as consent
|
|
149
|
+
|
|
150
|
+
Rendering a Helm chart runs the chart's own Go templates, so this switch is not
|
|
151
|
+
sufficient on its own. Two independent conditions must both hold:
|
|
152
|
+
|
|
153
|
+
1. **The project consents.** `helm.renderValidation.enabled` must be `true`,
|
|
154
|
+
read from the `.pi-lens.json` that governs the **chart's own project root** —
|
|
155
|
+
not the current working directory. An opt-in in an unrelated directory does
|
|
156
|
+
not authorize rendering another project's chart.
|
|
157
|
+
2. **The host trusts the project.** `.pi-lens.json` is a tracked file, so a
|
|
158
|
+
cloned repository can arrive with the switch already on and would otherwise
|
|
159
|
+
authorize execution of its own templates. In untrusted mode pi-lens refuses
|
|
160
|
+
to render and reports the refusal, naming trust as the reason, rather than
|
|
161
|
+
skipping silently. This is the same trust gate that governs LSP server spawns
|
|
162
|
+
and tool auto-installs.
|
|
145
163
|
|
|
146
164
|
Most toggles are **global-only**. Putting a global-only key such as
|
|
147
165
|
`"lsp": { "enabled": false }` in a `.pi-lens.json` is **not** honored at project
|
|
@@ -110,6 +110,7 @@ pi --no-read-guard # Disable the read-before-edit behavior monitor
|
|
|
110
110
|
pi --lens-turn-summary # Persist a per-turn summary of diagnostics, autofixes, and autoformats
|
|
111
111
|
pi --lens-compact-tool-line # Render tool results as one compact, theme-aware line (closes #1327)
|
|
112
112
|
pi --no-lazy-tools # Keep every pi-lens tool active instead of activating the situational ones on demand
|
|
113
|
+
pi --lens-turn-end-madge # Run the madge circular-dependency check at every turn end, not just at session start
|
|
113
114
|
|
|
114
115
|
# Actionable warnings (all default off)
|
|
115
116
|
pi --lens-actionable-warnings # Report fixable warnings at turn end
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pi-lens",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo",
|
|
6
6
|
"repository": {
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"build": "tsc --project tsconfig.build.json",
|
|
18
18
|
"build:dist": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && npx --yes -p typescript@7.0.2 tsc --project tsconfig.dist.json --noCheck && npm run bundle:dist",
|
|
19
19
|
"bundle:dist": "node scripts/bundle-dist.mjs",
|
|
20
|
-
"prepare": "npm run build:dist && node scripts/download-grammars.js --core --dest grammars",
|
|
20
|
+
"prepare": "npm run build:dist && node scripts/download-grammars.js --core --dest grammars && node scripts/setup-git-hooks.mjs && node scripts/warm-loader-cache.mjs",
|
|
21
21
|
"lint": "tsc --project tsconfig.json",
|
|
22
22
|
"watch": "tsc --watch",
|
|
23
23
|
"test": "node scripts/with-test-lock.mjs -- vitest run",
|
|
@@ -32,7 +32,10 @@
|
|
|
32
32
|
"audit:tree-sitter": "node scripts/audit-tree-sitter-rules.mjs",
|
|
33
33
|
"audit:rule-catalog": "node scripts/validate-rule-catalog.mjs",
|
|
34
34
|
"audit:astgrep-rule-pairs": "node scripts/audit-astgrep-rule-pairs.mjs",
|
|
35
|
+
"astgrep:self-scan": "node scripts/run-astgrep-pi-lens.mjs",
|
|
36
|
+
"astgrep:self-scan:update-baseline": "node scripts/run-astgrep-pi-lens.mjs --update-baseline",
|
|
35
37
|
"audit:playground": "node scripts/playground-verify-rule.mjs",
|
|
38
|
+
"bench:cascade-budget": "node scripts/bench-cascade-budget.mjs",
|
|
36
39
|
"logs:smells": "node scripts/analyze-pi-lens-logs.mjs",
|
|
37
40
|
"changelog:check": "node scripts/rollup-changelog.mjs --check",
|
|
38
41
|
"changelog:release": "node scripts/changelog-release.mjs",
|
|
@@ -42,11 +45,11 @@
|
|
|
42
45
|
"docs:rule-catalogs": "node scripts/gen-rule-catalogs.mjs",
|
|
43
46
|
"banner": "npx -y sharp-cli --input banner.svg --output banner.png resize 2200 620",
|
|
44
47
|
"download-grammars": "node scripts/download-grammars.js",
|
|
45
|
-
"harness:poc": "node scripts/run-harness.mjs cases/ts/pipeline-dispatch-poc
|
|
46
|
-
"harness:python-poc": "node scripts/run-harness.mjs cases/python/pipeline-dispatch-poc
|
|
47
|
-
"harness:ts-format-poc": "node scripts/run-harness.mjs cases/ts/format-default-poc
|
|
48
|
-
"harness:python-autofix-poc": "node scripts/run-harness.mjs cases/python/autofix-default-poc
|
|
49
|
-
"harness:go-poc": "node scripts/run-harness.mjs cases/go/pipeline-dispatch-poc
|
|
48
|
+
"harness:poc": "node scripts/run-harness.mjs cases/ts/pipeline-dispatch-poc",
|
|
49
|
+
"harness:python-poc": "node scripts/run-harness.mjs cases/python/pipeline-dispatch-poc",
|
|
50
|
+
"harness:ts-format-poc": "node scripts/run-harness.mjs cases/ts/format-default-poc",
|
|
51
|
+
"harness:python-autofix-poc": "node scripts/run-harness.mjs cases/python/autofix-default-poc",
|
|
52
|
+
"harness:go-poc": "node scripts/run-harness.mjs cases/go/pipeline-dispatch-poc"
|
|
50
53
|
},
|
|
51
54
|
"keywords": [
|
|
52
55
|
"pi",
|
|
@@ -69,6 +72,7 @@
|
|
|
69
72
|
"dist/",
|
|
70
73
|
"docs/",
|
|
71
74
|
"grammars/",
|
|
75
|
+
"vendor/grammars/",
|
|
72
76
|
"config/",
|
|
73
77
|
"rules/",
|
|
74
78
|
"skills/",
|
|
@@ -76,6 +80,9 @@
|
|
|
76
80
|
"scripts/grammars.lock.json",
|
|
77
81
|
"scripts/analyze-pi-lens-logs.mjs",
|
|
78
82
|
"scripts/install-selftest.mjs",
|
|
83
|
+
"scripts/lib/host-provided-deps.mjs",
|
|
84
|
+
"scripts/lib/warm-loader-cache.mjs",
|
|
85
|
+
"scripts/warm-loader-cache.mjs",
|
|
79
86
|
"scripts/rpc-load-check.mjs",
|
|
80
87
|
"README.md",
|
|
81
88
|
"CHANGELOG.md",
|
|
@@ -85,30 +92,40 @@
|
|
|
85
92
|
"dependencies": {
|
|
86
93
|
"@ast-grep/cli": "^0.45.0",
|
|
87
94
|
"@ast-grep/napi": "^0.45.0",
|
|
88
|
-
"@earendil-works/pi-tui": "^0.84.1",
|
|
89
95
|
"js-yaml": "^5.2.2",
|
|
90
96
|
"minimatch": "^10.2.6",
|
|
91
97
|
"pidusage": "^4.0.1",
|
|
92
|
-
"typebox": "^1.0.0",
|
|
93
98
|
"vscode-jsonrpc": "^9.0.0"
|
|
94
99
|
},
|
|
95
100
|
"peerDependencies": {
|
|
96
|
-
"@earendil-works/pi-coding-agent": "*"
|
|
101
|
+
"@earendil-works/pi-coding-agent": "*",
|
|
102
|
+
"@earendil-works/pi-tui": "^0.84.1",
|
|
103
|
+
"typebox": "^1.0.0"
|
|
97
104
|
},
|
|
98
105
|
"peerDependenciesMeta": {
|
|
99
106
|
"@earendil-works/pi-coding-agent": {
|
|
100
107
|
"optional": true
|
|
108
|
+
},
|
|
109
|
+
"@earendil-works/pi-tui": {
|
|
110
|
+
"optional": true
|
|
111
|
+
},
|
|
112
|
+
"typebox": {
|
|
113
|
+
"optional": true
|
|
101
114
|
}
|
|
102
115
|
},
|
|
103
116
|
"optionalDependencies": {
|
|
117
|
+
"jiti": "^2.7.0",
|
|
104
118
|
"web-tree-sitter": "0.25.10"
|
|
105
119
|
},
|
|
106
120
|
"devDependencies": {
|
|
107
121
|
"@biomejs/biome": "^2.4.10",
|
|
108
122
|
"@earendil-works/pi-coding-agent": "^0.84.1",
|
|
123
|
+
"@earendil-works/pi-tui": "^0.84.1",
|
|
109
124
|
"@types/node": "^26.0.0",
|
|
110
125
|
"@types/pidusage": "^2.0.5",
|
|
111
126
|
"@vitest/coverage-v8": "^4.1.5",
|
|
127
|
+
"husky": "^9.1.7",
|
|
128
|
+
"typebox": "^1.0.0",
|
|
112
129
|
"typescript": "^7.0.2",
|
|
113
130
|
"typescript-language-server": "^5.1.3",
|
|
114
131
|
"vitest": "^4.1.1"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
id: no-reflect-get-js
|
|
2
|
+
snapshots:
|
|
3
|
+
Reflect.get(obj, "key"):
|
|
4
|
+
fixed: obj["key"]
|
|
5
|
+
labels:
|
|
6
|
+
- source: Reflect.get(obj, "key")
|
|
7
|
+
style: primary
|
|
8
|
+
start: 0
|
|
9
|
+
end: 23
|
|
10
|
+
const ordinary = { get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } };:
|
|
11
|
+
fixed: const ordinary = { get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } };
|
|
12
|
+
labels:
|
|
13
|
+
- source: Reflect.get(target, prop, receiver)
|
|
14
|
+
style: primary
|
|
15
|
+
start: 56
|
|
16
|
+
end: 91
|
|
17
|
+
const v = Reflect.get(target, prop);:
|
|
18
|
+
fixed: const v = target[prop];
|
|
19
|
+
labels:
|
|
20
|
+
- source: Reflect.get(target, prop)
|
|
21
|
+
style: primary
|
|
22
|
+
start: 10
|
|
23
|
+
end: 35
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
id: no-reflect-get
|
|
2
|
+
snapshots:
|
|
3
|
+
Reflect.get(obj, "key"):
|
|
4
|
+
fixed: obj["key"]
|
|
5
|
+
labels:
|
|
6
|
+
- source: Reflect.get(obj, "key")
|
|
7
|
+
style: primary
|
|
8
|
+
start: 0
|
|
9
|
+
end: 23
|
|
10
|
+
const ordinary = { get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } };:
|
|
11
|
+
fixed: const ordinary = { get(target, prop, receiver) { return Reflect.get(target, prop, receiver); } };
|
|
12
|
+
labels:
|
|
13
|
+
- source: Reflect.get(target, prop, receiver)
|
|
14
|
+
style: primary
|
|
15
|
+
start: 56
|
|
16
|
+
end: 91
|
|
17
|
+
const v = Reflect.get(target, prop);:
|
|
18
|
+
fixed: const v = target[prop];
|
|
19
|
+
labels:
|
|
20
|
+
- source: Reflect.get(target, prop)
|
|
21
|
+
style: primary
|
|
22
|
+
start: 10
|
|
23
|
+
end: 35
|
package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/ts-void-zero-snapshot.yml
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
id: ts-void-zero
|
|
2
|
+
snapshots:
|
|
3
|
+
const x = void 0:
|
|
4
|
+
fixed: const x = undefined
|
|
5
|
+
labels:
|
|
6
|
+
- source: void 0
|
|
7
|
+
style: primary
|
|
8
|
+
start: 10
|
|
9
|
+
end: 16
|
|
10
|
+
return void 0:
|
|
11
|
+
fixed: return undefined
|
|
12
|
+
labels:
|
|
13
|
+
- source: void 0
|
|
14
|
+
style: primary
|
|
15
|
+
start: 7
|
|
16
|
+
end: 13
|
|
17
|
+
void 0:
|
|
18
|
+
fixed: undefined
|
|
19
|
+
labels:
|
|
20
|
+
- source: void 0
|
|
21
|
+
style: primary
|
|
22
|
+
start: 0
|
|
23
|
+
end: 6
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
id: no-bare-object-param
|
|
2
|
+
valid:
|
|
3
|
+
- "function f(x: string) {}"
|
|
4
|
+
- "function f(x: Record<string, unknown>) {}"
|
|
5
|
+
- "function f(x: { a: string }) {}"
|
|
6
|
+
- "function f(x: Object) {}"
|
|
7
|
+
- "function f(x: object | null) {}"
|
|
8
|
+
- "function f(...rest: object[]) {}"
|
|
9
|
+
- "type H = (entry: Record<string, unknown>) => void;"
|
|
10
|
+
invalid:
|
|
11
|
+
- "function f(x: object) {}"
|
|
12
|
+
- "const g = (x: object) => {};"
|
|
13
|
+
- "class C { m(x: object) {} }"
|
|
14
|
+
- "interface I { m(x: object): void; }"
|
|
15
|
+
- "type H = (entry: object) => void;"
|
|
16
|
+
- "function f(x?: object) {}"
|
package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-chained-type-assertions-test.yml
CHANGED
|
@@ -2,7 +2,21 @@ id: no-chained-type-assertions
|
|
|
2
2
|
valid:
|
|
3
3
|
- 'const v = x as A'
|
|
4
4
|
- 'const w = x as A as const'
|
|
5
|
-
-
|
|
5
|
+
# 2026-08-20 (#1727/#1777): the `as unknown as` shape is delegated wholly to
|
|
6
|
+
# require-safety-comment-for-as-unknown-as.yml. This rule owns the concrete
|
|
7
|
+
# chain only, so BOTH the commented and the uncommented `unknown` forms are
|
|
8
|
+
# valid here. Deleting the `not: { pattern: $X as unknown as $B }` guard reds
|
|
9
|
+
# all three.
|
|
10
|
+
- |
|
|
11
|
+
// SAFETY: checked above
|
|
12
|
+
const u = x as unknown as Foo;
|
|
13
|
+
- 'const u = /* SAFETY: inline */ x as unknown as Foo;'
|
|
14
|
+
- 'const u = x as unknown as Foo;'
|
|
6
15
|
invalid:
|
|
7
16
|
- 'const v = x as A as B'
|
|
8
17
|
- 'const v = foo.bar() as A as B;'
|
|
18
|
+
# A concrete chain has no escape valve: a SAFETY comment does NOT excuse it.
|
|
19
|
+
# Re-adding a comment-based exemption to this rule reds this case.
|
|
20
|
+
- |
|
|
21
|
+
// SAFETY: I promise
|
|
22
|
+
const v = x as A as B;
|
|
@@ -2,9 +2,37 @@ id: no-compile-call
|
|
|
2
2
|
valid:
|
|
3
3
|
- "tree = ast.parse(static_source)"
|
|
4
4
|
- "import ast; ast.literal_eval(data)"
|
|
5
|
+
- "code = compile('print(1)', '<static>', 'exec')"
|
|
6
|
+
- "code = compile(ast.parse(source), '<cell>', 'exec')"
|
|
7
|
+
- |
|
|
8
|
+
def f(source):
|
|
9
|
+
module = ast.parse(source, "<cell>", "exec")
|
|
10
|
+
return compile(module, "<cell>", "exec")
|
|
11
|
+
- |
|
|
12
|
+
def f(source):
|
|
13
|
+
module = ast.parse(source, "<cell>", "exec")
|
|
14
|
+
body_module = ast.Module(body=module.body[:-1], type_ignores=[])
|
|
15
|
+
return compile(body_module, "<cell>", "exec")
|
|
16
|
+
- |
|
|
17
|
+
# Known, accepted miss (review round, refs #1806): the trust check
|
|
18
|
+
# is same-scope/same-name, ANY ORDER — it can't see that `module`
|
|
19
|
+
# is reassigned to untrusted input AFTER the ast.parse() line.
|
|
20
|
+
# ast-grep's relational rules can't express statement ordering, only
|
|
21
|
+
# ancestor/descendant/sibling existence, so this is a documented
|
|
22
|
+
# false negative rather than a silent one.
|
|
23
|
+
def f(source):
|
|
24
|
+
module = ast.parse(source, "<cell>", "exec")
|
|
25
|
+
module = user_input
|
|
26
|
+
return compile(module, "<cell>", "exec")
|
|
5
27
|
invalid:
|
|
6
28
|
- "code = compile(user_input, '<user>', 'exec')"
|
|
7
29
|
- "obj = compile(request.body, '<user>', 'exec')"
|
|
8
30
|
- "code = compile(data + suffix, '<user>', 'exec')"
|
|
9
31
|
- "code = compile(get_source(), '<user>', 'exec')"
|
|
10
|
-
- "code = compile(
|
|
32
|
+
- "code = compile(user_input)"
|
|
33
|
+
- |
|
|
34
|
+
def outer():
|
|
35
|
+
module = ast.parse(source, "<cell>", "exec")
|
|
36
|
+
def inner(module):
|
|
37
|
+
return compile(module, "<cell>", "exec")
|
|
38
|
+
return inner
|
|
@@ -4,8 +4,41 @@ valid:
|
|
|
4
4
|
class A { foo() {} bar() {} }
|
|
5
5
|
- |
|
|
6
6
|
class A { get x() {} set x(v) {} }
|
|
7
|
+
- |
|
|
8
|
+
class A {
|
|
9
|
+
static async create() {
|
|
10
|
+
return new A();
|
|
11
|
+
}
|
|
12
|
+
create() {
|
|
13
|
+
return 1;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
- |
|
|
17
|
+
class A {
|
|
18
|
+
static async open(id: string) {
|
|
19
|
+
return new A();
|
|
20
|
+
}
|
|
21
|
+
async open(id: string) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
7
25
|
invalid:
|
|
8
26
|
- |
|
|
9
27
|
class A { foo() {} foo() {} }
|
|
10
28
|
- |
|
|
11
29
|
class A { foo = 1; foo = 2; }
|
|
30
|
+
- |
|
|
31
|
+
class A {
|
|
32
|
+
static async build() {}
|
|
33
|
+
build() {}
|
|
34
|
+
build() {}
|
|
35
|
+
}
|
|
36
|
+
- |
|
|
37
|
+
class A { async foo() {} async foo() {} }
|
|
38
|
+
- |
|
|
39
|
+
class A { static foo() {} static foo() {} }
|
|
40
|
+
- |
|
|
41
|
+
class A {
|
|
42
|
+
static async build() {}
|
|
43
|
+
static async build() {}
|
|
44
|
+
}
|
|
@@ -2,7 +2,13 @@ id: no-inner-html-js
|
|
|
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"
|