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