@herbertgao/pi-extensions 2026.8.6 → 2026.8.7

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.
Files changed (343) hide show
  1. package/README.md +5 -5
  2. package/node_modules/@herbertgao/pi-cc-extensions/README.en.md +1 -1
  3. package/node_modules/@herbertgao/pi-cc-extensions/README.md +1 -1
  4. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/config.ts +19 -7
  5. package/node_modules/@herbertgao/pi-cc-extensions/extensions/config/panel.ts +30 -9
  6. package/node_modules/@herbertgao/pi-cc-extensions/extensions/feature/compact-thinking.ts +272 -22
  7. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/compact-mode.ts +94 -77
  8. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/message-display.ts +1 -1
  9. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/hover.ts +14 -0
  10. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/interaction.ts +55 -17
  11. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/mouse/layout.ts +41 -2
  12. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/diff-renderer.ts +75 -6
  13. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/diff/types.ts +7 -3
  14. package/node_modules/@herbertgao/pi-cc-extensions/extensions/renderer/tool/grouping.ts +64 -1
  15. package/node_modules/@herbertgao/pi-cc-extensions/package.json +3 -3
  16. package/node_modules/@herbertgao/pi-subagents/CHANGELOG.md +6 -0
  17. package/node_modules/@herbertgao/pi-subagents/README.md +30 -22
  18. package/node_modules/@herbertgao/pi-subagents/examples/agent-tool-description.md +5 -5
  19. package/node_modules/@herbertgao/pi-subagents/package.json +7 -7
  20. package/node_modules/@herbertgao/pi-subagents/src/agent-file-toggle.ts +7 -1
  21. package/node_modules/@herbertgao/pi-subagents/src/agent-manager.ts +48 -19
  22. package/node_modules/@herbertgao/pi-subagents/src/agent-runner.ts +17 -13
  23. package/node_modules/@herbertgao/pi-subagents/src/custom-agents.ts +26 -2
  24. package/node_modules/@herbertgao/pi-subagents/src/index.ts +219 -40
  25. package/node_modules/@herbertgao/pi-subagents/src/invocation-config.ts +101 -3
  26. package/node_modules/@herbertgao/pi-subagents/src/nested-tools.ts +18 -4
  27. package/node_modules/@herbertgao/pi-subagents/src/settings.ts +99 -0
  28. package/node_modules/@herbertgao/pi-subagents/src/types.ts +22 -3
  29. package/node_modules/@herbertgao/pi-subagents/src/ui/agent-widget.ts +51 -3
  30. package/node_modules/@herbertgao/pi-subagents/src/ui/conversation-viewer.ts +20 -2
  31. package/node_modules/@herbertgao/pi-subagents/src/ui/fleet-list.ts +21 -6
  32. package/node_modules/@herbertgao/pi-subagents/src/usage.ts +129 -1
  33. package/node_modules/@herbertgao/pi-subagents/src/worktree.ts +20 -0
  34. package/node_modules/@juicesharp/rpiv-ask-user-question/README.md +1 -0
  35. package/node_modules/@juicesharp/rpiv-ask-user-question/ask-user-question.ts +26 -10
  36. package/node_modules/@juicesharp/rpiv-ask-user-question/config.ts +25 -0
  37. package/node_modules/@juicesharp/rpiv-ask-user-question/docs/configuration.md +13 -4
  38. package/node_modules/@juicesharp/rpiv-ask-user-question/docs/hosts.md +2 -1
  39. package/node_modules/@juicesharp/rpiv-ask-user-question/docs/localization.md +3 -1
  40. package/node_modules/@juicesharp/rpiv-ask-user-question/locales/en.json +2 -2
  41. package/node_modules/@juicesharp/rpiv-ask-user-question/locales/zh.json +2 -2
  42. package/node_modules/@juicesharp/rpiv-ask-user-question/package.json +3 -2
  43. package/node_modules/@juicesharp/rpiv-ask-user-question/state/build-questionnaire.ts +10 -0
  44. package/node_modules/@juicesharp/rpiv-ask-user-question/state/key-router.ts +3 -1
  45. package/node_modules/@juicesharp/rpiv-ask-user-question/state/questionnaire-session.ts +30 -7
  46. package/node_modules/@juicesharp/rpiv-ask-user-question/state/state.ts +14 -6
  47. package/node_modules/@juicesharp/rpiv-ask-user-question/view/dialog-builder.ts +30 -4
  48. package/node_modules/@juicesharp/rpiv-ask-user-question/view/tab-content-strategy.ts +26 -5
  49. package/node_modules/@narumitw/pi-btw/README.md +120 -111
  50. package/node_modules/@narumitw/pi-btw/dist/index.ts +2898 -0
  51. package/node_modules/@narumitw/pi-btw/dist/index.ts.map +7 -0
  52. package/node_modules/@narumitw/pi-btw/package.json +10 -6
  53. package/node_modules/@narumitw/pi-btw/src/btw.ts +36 -40
  54. package/node_modules/@narumitw/pi-btw/src/fullscreen-ui.ts +55 -10
  55. package/node_modules/@narumitw/pi-btw/src/main-tree-picker.ts +390 -0
  56. package/node_modules/@narumitw/pi-btw/src/menu.ts +45 -2
  57. package/node_modules/@narumitw/pi-btw/src/transcript-pager.ts +136 -45
  58. package/node_modules/pi-lens/CHANGELOG.md +909 -0
  59. package/node_modules/pi-lens/README.md +11 -3
  60. package/node_modules/pi-lens/config/ruff/core.toml +42 -0
  61. package/node_modules/pi-lens/dist/clients/actionable-warnings.js +130 -27
  62. package/node_modules/pi-lens/dist/clients/advisory-provenance.js +126 -13
  63. package/node_modules/pi-lens/dist/clients/agent-nudge.js +67 -11
  64. package/node_modules/pi-lens/dist/clients/ast-grep-client.js +9 -3
  65. package/node_modules/pi-lens/dist/clients/atomic-write.js +9 -3
  66. package/node_modules/pi-lens/dist/clients/bash-file-access.js +285 -8
  67. package/node_modules/pi-lens/dist/clients/biome-client.js +61 -30
  68. package/node_modules/pi-lens/dist/clients/blocker-freshness.js +428 -0
  69. package/node_modules/pi-lens/dist/clients/blocker-past-eof.js +119 -0
  70. package/node_modules/pi-lens/dist/clients/bootstrap.js +12 -1
  71. package/node_modules/pi-lens/dist/clients/bounded-pid-file-lock.js +12 -3
  72. package/node_modules/pi-lens/dist/clients/bounded-telemetry.js +192 -0
  73. package/node_modules/pi-lens/dist/clients/cascade-budget.js +196 -0
  74. package/node_modules/pi-lens/dist/clients/cascade-format.js +20 -1
  75. package/node_modules/pi-lens/dist/clients/cascade-types.js +9 -1
  76. package/node_modules/pi-lens/dist/clients/child-unref.js +54 -6
  77. package/node_modules/pi-lens/dist/clients/code-quality-warnings.js +76 -24
  78. package/node_modules/pi-lens/dist/clients/dead-code-client.js +123 -31
  79. package/node_modules/pi-lens/dist/clients/deadline-utils.js +8 -1
  80. package/node_modules/pi-lens/dist/clients/debug-handles.js +5 -0
  81. package/node_modules/pi-lens/dist/clients/degradation-ledger.js +62 -13
  82. package/node_modules/pi-lens/dist/clients/dependency-checker.js +25 -3
  83. package/node_modules/pi-lens/dist/clients/diagnostic-dispositions.js +147 -33
  84. package/node_modules/pi-lens/dist/clients/diagnostic-line-freshness.js +298 -0
  85. package/node_modules/pi-lens/dist/clients/dispatch/dispatcher.js +52 -2
  86. package/node_modules/pi-lens/dist/clients/dispatch/integration.js +256 -88
  87. package/node_modules/pi-lens/dist/clients/dispatch/lazy.js +7 -4
  88. package/node_modules/pi-lens/dist/clients/dispatch/plan.js +5 -0
  89. package/node_modules/pi-lens/dist/clients/dispatch/runners/ast-grep-napi.js +234 -18
  90. package/node_modules/pi-lens/dist/clients/dispatch/runners/biome-check.js +187 -19
  91. package/node_modules/pi-lens/dist/clients/dispatch/runners/cpp-check.js +6 -3
  92. package/node_modules/pi-lens/dist/clients/dispatch/runners/credo.js +11 -9
  93. package/node_modules/pi-lens/dist/clients/dispatch/runners/cue-vet.js +398 -0
  94. package/node_modules/pi-lens/dist/clients/dispatch/runners/elixir-check.js +11 -3
  95. package/node_modules/pi-lens/dist/clients/dispatch/runners/eslint.js +12 -7
  96. package/node_modules/pi-lens/dist/clients/dispatch/runners/go-vet.js +18 -0
  97. package/node_modules/pi-lens/dist/clients/dispatch/runners/helm-render.js +895 -0
  98. package/node_modules/pi-lens/dist/clients/dispatch/runners/index.js +4 -0
  99. package/node_modules/pi-lens/dist/clients/dispatch/runners/javac.js +16 -3
  100. package/node_modules/pi-lens/dist/clients/dispatch/runners/lsp.js +60 -53
  101. package/node_modules/pi-lens/dist/clients/dispatch/runners/markdownlint.js +16 -0
  102. package/node_modules/pi-lens/dist/clients/dispatch/runners/mypy.js +23 -0
  103. package/node_modules/pi-lens/dist/clients/dispatch/runners/psscriptanalyzer.js +331 -55
  104. package/node_modules/pi-lens/dist/clients/dispatch/runners/pyright.js +38 -5
  105. package/node_modules/pi-lens/dist/clients/dispatch/runners/rust-clippy.js +97 -19
  106. package/node_modules/pi-lens/dist/clients/dispatch/runners/spellcheck.js +14 -0
  107. package/node_modules/pi-lens/dist/clients/dispatch/runners/sqlfluff.js +20 -0
  108. package/node_modules/pi-lens/dist/clients/dispatch/runners/stylelint.js +22 -0
  109. package/node_modules/pi-lens/dist/clients/dispatch/runners/swiftlint.js +10 -0
  110. package/node_modules/pi-lens/dist/clients/dispatch/runners/taplo.js +18 -6
  111. package/node_modules/pi-lens/dist/clients/dispatch/runners/trivy-config.js +73 -12
  112. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/availability-policy.js +275 -13
  113. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/candidate-probe.js +21 -6
  114. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/lazy-installer.js +260 -27
  115. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/runner-helpers.js +734 -64
  116. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/spawn-outcome.js +86 -11
  117. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/tool-failure.js +72 -0
  118. package/node_modules/pi-lens/dist/clients/dispatch/runners/utils/toolchain-availability.js +9 -0
  119. package/node_modules/pi-lens/dist/clients/dispatch/runners/vale.js +9 -0
  120. package/node_modules/pi-lens/dist/clients/dispatch/runners/yamllint.js +18 -1
  121. package/node_modules/pi-lens/dist/clients/dispatch/runners/zig-check.js +4 -2
  122. package/node_modules/pi-lens/dist/clients/event-loop-monitor.js +28 -5
  123. package/node_modules/pi-lens/dist/clients/extension-log.js +22 -1
  124. package/node_modules/pi-lens/dist/clients/file-kinds.js +8 -2
  125. package/node_modules/pi-lens/dist/clients/finding-delivery-gate.js +294 -0
  126. package/node_modules/pi-lens/dist/clients/finding-identity.js +88 -0
  127. package/node_modules/pi-lens/dist/clients/formatters-lazy.js +3 -2
  128. package/node_modules/pi-lens/dist/clients/formatters.js +500 -115
  129. package/node_modules/pi-lens/dist/clients/generation-guard.js +216 -0
  130. package/node_modules/pi-lens/dist/clients/git-guard.js +31 -0
  131. package/node_modules/pi-lens/dist/clients/gitleaks-client.js +181 -8
  132. package/node_modules/pi-lens/dist/clients/govulncheck-client.js +109 -9
  133. package/node_modules/pi-lens/dist/clients/grammar-source.js +333 -10
  134. package/node_modules/pi-lens/dist/clients/host-ports.js +8 -0
  135. package/node_modules/pi-lens/dist/clients/installer/index.js +1114 -100
  136. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh-session.js +58 -0
  137. package/node_modules/pi-lens/dist/clients/installer/managed-tool-refresh.js +715 -0
  138. package/node_modules/pi-lens/dist/clients/instance-reaper.js +643 -97
  139. package/node_modules/pi-lens/dist/clients/instance-registry.js +87 -17
  140. package/node_modules/pi-lens/dist/clients/jscpd-client.js +82 -6
  141. package/node_modules/pi-lens/dist/clients/knip-client.js +310 -10
  142. package/node_modules/pi-lens/dist/clients/language-policy.js +8 -2
  143. package/node_modules/pi-lens/dist/clients/language-profile.js +2 -0
  144. package/node_modules/pi-lens/dist/clients/latency-logger.js +440 -11
  145. package/node_modules/pi-lens/dist/clients/lazy-import.js +21 -0
  146. package/node_modules/pi-lens/dist/clients/ledger-bounds.js +21 -0
  147. package/node_modules/pi-lens/dist/clients/lens-flag-registry.js +8 -0
  148. package/node_modules/pi-lens/dist/clients/lsp/cascade-tier.js +102 -7
  149. package/node_modules/pi-lens/dist/clients/lsp/client.js +1516 -159
  150. package/node_modules/pi-lens/dist/clients/lsp/diagnostic-binding.js +83 -1
  151. package/node_modules/pi-lens/dist/clients/lsp/document-drift.js +389 -0
  152. package/node_modules/pi-lens/dist/clients/lsp/index.js +2274 -147
  153. package/node_modules/pi-lens/dist/clients/lsp/inferred-project.js +215 -0
  154. package/node_modules/pi-lens/dist/clients/lsp/jvm-runtime.js +146 -14
  155. package/node_modules/pi-lens/dist/clients/lsp/language.js +48 -4
  156. package/node_modules/pi-lens/dist/clients/lsp/server.js +277 -16
  157. package/node_modules/pi-lens/dist/clients/lsp/spawn-history.js +22 -0
  158. package/node_modules/pi-lens/dist/clients/lsp/sync-kind.js +43 -0
  159. package/node_modules/pi-lens/dist/clients/lsp/tsserver-sync.js +79 -3
  160. package/node_modules/pi-lens/dist/clients/lsp/wait-policy/strategies.js +43 -0
  161. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-cache.js +422 -28
  162. package/node_modules/pi-lens/dist/clients/lsp/workspace-diagnostics-session.js +30 -0
  163. package/node_modules/pi-lens/dist/clients/lsp/workspace-sweep-hold.js +175 -0
  164. package/node_modules/pi-lens/dist/clients/lsp-lazy.js +3 -2
  165. package/node_modules/pi-lens/dist/clients/mcp/session.js +10 -2
  166. package/node_modules/pi-lens/dist/clients/module-report.js +8 -0
  167. package/node_modules/pi-lens/dist/clients/opengrep-client.js +15 -1
  168. package/node_modules/pi-lens/dist/clients/package-manager.js +170 -14
  169. package/node_modules/pi-lens/dist/clients/path-attribution-telemetry.js +27 -0
  170. package/node_modules/pi-lens/dist/clients/path-utils.js +160 -0
  171. package/node_modules/pi-lens/dist/clients/pipeline.js +154 -33
  172. package/node_modules/pi-lens/dist/clients/post-autofix-notice.js +37 -0
  173. package/node_modules/pi-lens/dist/clients/project-diagnostics/cache.js +17 -3
  174. package/node_modules/pi-lens/dist/clients/project-diagnostics/extractors.js +89 -22
  175. package/node_modules/pi-lens/dist/clients/project-diagnostics/fresh-fetch.js +84 -14
  176. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/gitleaks.js +15 -3
  177. package/node_modules/pi-lens/dist/clients/project-diagnostics/runner-adapters/trivy.js +50 -2
  178. package/node_modules/pi-lens/dist/clients/project-diagnostics/scanner.js +5 -0
  179. package/node_modules/pi-lens/dist/clients/project-lens-config.js +3 -0
  180. package/node_modules/pi-lens/dist/clients/project-snapshot.js +299 -0
  181. package/node_modules/pi-lens/dist/clients/quiet-window-config.js +47 -0
  182. package/node_modules/pi-lens/dist/clients/quiet-window.js +11 -25
  183. package/node_modules/pi-lens/dist/clients/read-guard-logger.js +1 -1
  184. package/node_modules/pi-lens/dist/clients/read-guard.js +184 -10
  185. package/node_modules/pi-lens/dist/clients/resource-sampler.js +49 -17
  186. package/node_modules/pi-lens/dist/clients/reverse-deps.js +50 -11
  187. package/node_modules/pi-lens/dist/clients/review-graph/query.js +52 -4
  188. package/node_modules/pi-lens/dist/clients/runtime-agent-end.js +96 -7
  189. package/node_modules/pi-lens/dist/clients/runtime-context.js +8 -1
  190. package/node_modules/pi-lens/dist/clients/runtime-coordinator.js +308 -45
  191. package/node_modules/pi-lens/dist/clients/runtime-session.js +332 -9
  192. package/node_modules/pi-lens/dist/clients/runtime-tool-call.js +217 -22
  193. package/node_modules/pi-lens/dist/clients/runtime-tool-result.js +212 -79
  194. package/node_modules/pi-lens/dist/clients/runtime-turn.js +575 -67
  195. package/node_modules/pi-lens/dist/clients/safe-spawn.js +220 -7
  196. package/node_modules/pi-lens/dist/clients/scratch-tree-policy.js +161 -0
  197. package/node_modules/pi-lens/dist/clients/search-read-registration.js +34 -6
  198. package/node_modules/pi-lens/dist/clients/security-scan-client.js +157 -24
  199. package/node_modules/pi-lens/dist/clients/sg-runner.js +116 -22
  200. package/node_modules/pi-lens/dist/clients/single-flight.js +158 -0
  201. package/node_modules/pi-lens/dist/clients/stale-marker.js +17 -0
  202. package/node_modules/pi-lens/dist/clients/startup-timing.js +19 -1
  203. package/node_modules/pi-lens/dist/clients/test-runner-client.js +151 -16
  204. package/node_modules/pi-lens/dist/clients/tool-event.js +56 -5
  205. package/node_modules/pi-lens/dist/clients/tool-policy.js +125 -20
  206. package/node_modules/pi-lens/dist/clients/tree-sitter-cache.js +75 -1
  207. package/node_modules/pi-lens/dist/clients/tree-sitter-client.js +769 -64
  208. package/node_modules/pi-lens/dist/clients/tree-sitter-shared.js +11 -0
  209. package/node_modules/pi-lens/dist/clients/tree-sitter-symbol-extractor.js +90 -0
  210. package/node_modules/pi-lens/dist/clients/trivy-client.js +19 -1
  211. package/node_modules/pi-lens/dist/clients/widget-state.js +336 -36
  212. package/node_modules/pi-lens/dist/clients/zizmor-config.js +214 -14
  213. package/node_modules/pi-lens/dist/index.js +67738 -55739
  214. package/node_modules/pi-lens/dist/tools/lens-diagnostics.js +466 -54
  215. package/node_modules/pi-lens/dist/tools/lsp-diagnostics.js +132 -43
  216. package/node_modules/pi-lens/dist/tools/lsp-navigation.js +46 -7
  217. package/node_modules/pi-lens/docs/agent-guide.md +6 -1
  218. package/node_modules/pi-lens/docs/ast-grep_rules_catalog.md +515 -506
  219. package/node_modules/pi-lens/docs/dispositions.md +21 -0
  220. package/node_modules/pi-lens/docs/features.md +19 -5
  221. package/node_modules/pi-lens/docs/globalconfig.md +3 -0
  222. package/node_modules/pi-lens/docs/language-coverage.md +71 -5
  223. package/node_modules/pi-lens/docs/mcp.md +2 -2
  224. package/node_modules/pi-lens/docs/servercapabilities.md +4 -1
  225. package/node_modules/pi-lens/docs/settings.md +19 -1
  226. package/node_modules/pi-lens/docs/usage.md +1 -0
  227. package/node_modules/pi-lens/package.json +10 -6
  228. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-js-snapshot.yml +23 -0
  229. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/no-reflect-get-snapshot.yml +23 -0
  230. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/__snapshots__/ts-void-zero-snapshot.yml +23 -0
  231. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-bare-object-param-test.yml +16 -0
  232. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-chained-type-assertions-test.yml +15 -1
  233. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-compile-call-test.yml +29 -1
  234. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-dupe-class-members-test.yml +33 -0
  235. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-js-test.yml +7 -1
  236. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-inner-html-test.yml +7 -1
  237. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-known-value-widening-test.yml +9 -0
  238. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-non-null-assertion-test.yml +216 -0
  239. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-js-test.yml +2 -0
  240. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-apply-test.yml +2 -0
  241. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-js-test.yml +2 -1
  242. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-reflect-get-test.yml +2 -1
  243. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml +12 -0
  244. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-runtime-typeof-test.yml +33 -0
  245. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml +9 -0
  246. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-shape-in-symbol-names-test.yml +13 -0
  247. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-js-test.yml +5 -1
  248. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-sql-in-code-test.yml +5 -1
  249. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-parameters-test.yml +12 -0
  250. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unknown-returns-test.yml +16 -0
  251. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-any-test.yml +10 -0
  252. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/no-unsafe-dictionary-unknown-test.yml +8 -0
  253. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml +35 -0
  254. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/require-safety-comment-for-as-unknown-as-test.yml +177 -0
  255. package/node_modules/pi-lens/rules/ast-grep-rules/rule-tests/ts-void-zero-test.yml +1 -0
  256. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member-js.yml +13 -2
  257. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-await-expression-member.yml +13 -2
  258. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-host-path-in-win32-branch.yml +2 -0
  259. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-bare-object-param.yml +60 -0
  260. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-chained-type-assertions.yml +57 -12
  261. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-compile-call.yml +63 -5
  262. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-dupe-class-members.yml +52 -8
  263. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html-js.yml +27 -2
  264. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-inner-html.yml +27 -2
  265. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-known-value-widening.yml +71 -0
  266. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-non-null-assertion.yml +316 -0
  267. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-raw-json-store-write.yml +7 -0
  268. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply-js.yml +22 -2
  269. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-apply.yml +23 -2
  270. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get-js.yml +33 -5
  271. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-reflect-get.yml +34 -8
  272. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-return-value-in-generator.yml +22 -5
  273. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-runtime-typeof.yml +121 -0
  274. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-server-bind-wildcard.yml +23 -7
  275. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-shape-in-symbol-names.yml +68 -0
  276. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +41 -2
  277. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-sql-in-code.yml +41 -2
  278. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-laundering.yml +6 -1
  279. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-parameters.yml +67 -0
  280. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unknown-returns.yml +106 -0
  281. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-any.yml +50 -0
  282. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-unsafe-dictionary-unknown.yml +56 -0
  283. package/node_modules/pi-lens/rules/ast-grep-rules/rules/no-win32-isabsolute-for-qualification.yml +2 -0
  284. package/node_modules/pi-lens/rules/ast-grep-rules/rules/redundant-unsafe-function.yml +32 -0
  285. package/node_modules/pi-lens/rules/ast-grep-rules/rules/require-safety-comment-for-as-unknown-as.yml +184 -0
  286. package/node_modules/pi-lens/rules/ast-grep-rules/rules/ts-void-zero.yml +5 -0
  287. package/node_modules/pi-lens/rules/ast-grep-rules/self-scan-baseline.json +5 -0
  288. package/node_modules/pi-lens/scripts/analyze-pi-lens-logs.mjs +53 -1
  289. package/node_modules/pi-lens/scripts/download-grammars.js +25 -0
  290. package/node_modules/pi-lens/scripts/grammars.lock.json +9 -0
  291. package/node_modules/pi-lens/skills/pi-lens-ast-grep/SKILL.md +2 -0
  292. package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/SKILL.md +80 -3
  293. package/node_modules/pi-lens/skills/pi-lens-write-ast-grep-rule/reference.md +41 -0
  294. package/node_modules/pi-lens/vendor/grammars/tree-sitter-cue.wasm +0 -0
  295. package/node_modules/pi-mcp-adapter/CHANGELOG.md +36 -0
  296. package/node_modules/pi-mcp-adapter/README.md +47 -5
  297. package/node_modules/pi-mcp-adapter/cli.js +163 -1
  298. package/node_modules/pi-mcp-adapter/commands.ts +128 -22
  299. package/node_modules/pi-mcp-adapter/config.ts +25 -7
  300. package/node_modules/pi-mcp-adapter/direct-tools.ts +5 -4
  301. package/node_modules/pi-mcp-adapter/index.ts +219 -32
  302. package/node_modules/pi-mcp-adapter/init.ts +36 -4
  303. package/node_modules/pi-mcp-adapter/lifecycle.ts +315 -24
  304. package/node_modules/pi-mcp-adapter/mcp-auth-flow.ts +39 -6
  305. package/node_modules/pi-mcp-adapter/mcp-bearer-store.ts +387 -0
  306. package/node_modules/pi-mcp-adapter/mcp-callback-server.ts +27 -3
  307. package/node_modules/pi-mcp-adapter/mcp-code.ts +4 -0
  308. package/node_modules/pi-mcp-adapter/mcp-panel.ts +42 -13
  309. package/node_modules/pi-mcp-adapter/metadata-cache.ts +32 -21
  310. package/node_modules/pi-mcp-adapter/package-mcp-loader.ts +168 -0
  311. package/node_modules/pi-mcp-adapter/package.json +3 -1
  312. package/node_modules/pi-mcp-adapter/proxy-modes.ts +5 -4
  313. package/node_modules/pi-mcp-adapter/request-headers-command.ts +31 -37
  314. package/node_modules/pi-mcp-adapter/search-ranking.ts +92 -22
  315. package/node_modules/pi-mcp-adapter/server-manager.ts +140 -2
  316. package/node_modules/pi-mcp-adapter/session-recovery.ts +7 -0
  317. package/node_modules/pi-mcp-adapter/tool-approval.ts +15 -2
  318. package/node_modules/pi-mcp-adapter/tool-result-renderer.ts +44 -4
  319. package/node_modules/pi-mcp-adapter/types.ts +2 -0
  320. package/node_modules/pi-mcp-adapter/ui-server.ts +18 -16
  321. package/node_modules/pi-mcp-adapter/utils.ts +70 -0
  322. package/node_modules/pi-web-access/CHANGELOG.md +23 -0
  323. package/node_modules/pi-web-access/README.md +27 -9
  324. package/node_modules/pi-web-access/anysearch.ts +4 -2
  325. package/node_modules/pi-web-access/brave.ts +16 -4
  326. package/node_modules/pi-web-access/curator-page.ts +6 -3
  327. package/node_modules/pi-web-access/curator-server.ts +4 -1
  328. package/node_modules/pi-web-access/exa.ts +18 -7
  329. package/node_modules/pi-web-access/extract.ts +28 -3
  330. package/node_modules/pi-web-access/gemini-search.ts +16 -4
  331. package/node_modules/pi-web-access/index.ts +41 -57
  332. package/node_modules/pi-web-access/package.json +1 -1
  333. package/node_modules/pi-web-access/page-query.ts +4 -2
  334. package/node_modules/pi-web-access/parallel-mcp.ts +249 -0
  335. package/node_modules/pi-web-access/parallel.ts +2 -2
  336. package/node_modules/pi-web-access/query-rewrite.ts +51 -0
  337. package/node_modules/pi-web-access/serper.ts +211 -0
  338. package/node_modules/pi-web-access/summary-model-scope.ts +12 -4
  339. package/node_modules/pi-web-access/summary-review.ts +44 -22
  340. package/node_modules/pi-web-access/tavily.ts +16 -4
  341. package/node_modules/pi-web-access/utils.ts +87 -0
  342. package/node_modules/pi-web-access/valyu.ts +199 -0
  343. package/package.json +13 -13
@@ -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 **42 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.
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 **32 formatters** based on project config:
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. Terraform/Helm/Compose/CloudFormation are tracked as follow-ups.
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 | ruff, black |
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) | prettier |
22
- | JSON | ✓ | lsp | biome, prettier |
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 | cmake-format |
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** (`:298`), **jscpd** (incremental, `getFilesForJscpd`), **madge/dep circular** (`:426`), **cascade merge** (`:175`), **tests** (`:461`), actionable/code-quality warnings aggregation, project-diagnostics delta |
247
- | per-session | `handleSessionStart` (`runtime-session.ts`) | **jscpd full scan** (`:505`), 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. |
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-15 on linux; 29 servers captured, 14 unavailable._
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 `trivy`.
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.0.1",
3
+ "version": "4.1.0",
4
4
  "type": "module",
5
5
  "description": "Real-time code feedback for pi — LSP, linters, formatters, type-checking, structural analysis & booboo",
6
6
  "repository": {
@@ -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 --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
46
- "harness:python-poc": "node scripts/run-harness.mjs cases/python/pipeline-dispatch-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
47
- "harness:ts-format-poc": "node scripts/run-harness.mjs cases/ts/format-default-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
48
- "harness:python-autofix-poc": "node scripts/run-harness.mjs cases/python/autofix-default-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\"",
49
- "harness:go-poc": "node scripts/run-harness.mjs cases/go/pipeline-dispatch-poc --pi-bin \"C:\\Users\\R3LiC\\AppData\\Roaming\\npm\\pi.cmd\""
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/",
@@ -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
@@ -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) {}"
@@ -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
- - 'const u = x as unknown as Foo'
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('print(1)', '<static>', 'exec')"
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
- invalid:
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"
@@ -2,7 +2,13 @@ id: no-inner-html
2
2
  valid:
3
3
  - 'el.textContent = "x"'
4
4
  - 'el.insertAdjacentText("beforeend", "x")'
5
- invalid:
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" };'