pi-lens 3.8.53 β†’ 3.8.62

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 (700) hide show
  1. package/CHANGELOG.md +124 -8
  2. package/LICENSE +21 -0
  3. package/README.md +138 -386
  4. package/banner.png +0 -0
  5. package/banner.svg +54 -46
  6. package/dist/clients/ast-grep-client.js +160 -3
  7. package/dist/clients/ast-grep-tool-logger.js +1 -1
  8. package/dist/clients/ast-grep-yaml-synth.js +30 -6
  9. package/dist/clients/bootstrap.js +99 -31
  10. package/dist/clients/complexity-client.js +1 -1
  11. package/dist/clients/dead-code-client.js +304 -0
  12. package/dist/clients/dead-code-logger.js +46 -0
  13. package/dist/clients/dependency-checker.js +55 -16
  14. package/dist/clients/deps/ast-grep-napi.js +3 -0
  15. package/dist/clients/deps/js-yaml.js +9 -0
  16. package/dist/clients/deps/minimatch.js +4 -0
  17. package/dist/clients/deps/pi-tui.js +5 -0
  18. package/dist/clients/deps/typebox.js +6 -0
  19. package/dist/clients/deps/typescript.js +15 -0
  20. package/dist/clients/deps/vscode-jsonrpc.js +1 -0
  21. package/dist/clients/deps/web-tree-sitter.js +3 -0
  22. package/dist/clients/dispatch/auxiliary-lsp.js +106 -0
  23. package/dist/clients/dispatch/dispatcher.js +27 -2
  24. package/dist/clients/dispatch/fact-runner.js +59 -0
  25. package/dist/clients/dispatch/facts/comment-facts.js +1 -1
  26. package/dist/clients/dispatch/facts/function-facts.js +1 -1
  27. package/dist/clients/dispatch/facts/import-facts.js +1 -1
  28. package/dist/clients/dispatch/facts/try-catch-facts.js +1 -1
  29. package/dist/clients/dispatch/integration.js +103 -62
  30. package/dist/clients/dispatch/rules/high-complexity.js +29 -4
  31. package/dist/clients/dispatch/rules/high-fan-out.js +24 -4
  32. package/dist/clients/dispatch/rules/quality-rules.js +1 -1
  33. package/dist/clients/dispatch/rules/sonar-rules.js +1 -1
  34. package/dist/clients/dispatch/runners/ast-grep-napi.js +136 -109
  35. package/dist/clients/dispatch/runners/credo.js +10 -3
  36. package/dist/clients/dispatch/runners/go-vet.js +41 -18
  37. package/dist/clients/dispatch/runners/index.js +4 -2
  38. package/dist/clients/dispatch/runners/lsp.js +31 -1
  39. package/dist/clients/dispatch/runners/mypy.js +15 -3
  40. package/dist/clients/dispatch/runners/phpstan.js +13 -3
  41. package/dist/clients/dispatch/runners/pyright.js +4 -1
  42. package/dist/clients/dispatch/runners/rust-clippy.js +27 -7
  43. package/dist/clients/dispatch/runners/shellcheck.js +11 -1
  44. package/dist/clients/dispatch/runners/spotbugs.js +258 -0
  45. package/dist/clients/dispatch/runners/taplo.js +8 -1
  46. package/dist/clients/dispatch/runners/trivy-config.js +180 -0
  47. package/dist/clients/dispatch/runners/utils/runner-helpers.js +21 -0
  48. package/dist/clients/dispatch/runners/yaml-rule-parser.js +13 -2
  49. package/dist/clients/dispatch/tool-profile.js +2 -1
  50. package/dist/clients/event-loop-monitor.js +18 -3
  51. package/dist/clients/file-utils.js +49 -4
  52. package/dist/clients/gitleaks-client.js +9 -61
  53. package/dist/clients/govulncheck-client.js +8 -43
  54. package/dist/clients/grammar-source.js +71 -0
  55. package/dist/clients/host-edit-normalize.js +139 -0
  56. package/dist/clients/install-diagnostics.js +141 -0
  57. package/dist/clients/installer/index.js +685 -37
  58. package/dist/clients/knip-client.js +73 -53
  59. package/dist/clients/language-policy.js +7 -5
  60. package/dist/clients/language-profile.js +10 -1
  61. package/dist/clients/lens-config.js +7 -0
  62. package/dist/clients/lens-engine.js +5 -14
  63. package/dist/clients/lsp/client.js +314 -46
  64. package/dist/clients/lsp/index.js +183 -35
  65. package/dist/clients/lsp/interactive-install.js +26 -24
  66. package/dist/clients/lsp/jvm-runtime.js +158 -0
  67. package/dist/clients/lsp/launch.js +25 -14
  68. package/dist/clients/lsp/lombok.js +158 -0
  69. package/dist/clients/lsp/position-encoding.js +61 -0
  70. package/dist/clients/lsp/server-strategies.js +88 -1
  71. package/dist/clients/lsp/server.js +591 -175
  72. package/dist/clients/lsp/watch-queue.js +61 -0
  73. package/dist/clients/lsp-status.js +59 -0
  74. package/dist/clients/mcp/session.js +4 -1
  75. package/dist/clients/module-report-lsp.js +193 -0
  76. package/dist/clients/module-report.js +1654 -0
  77. package/dist/clients/oldtext-autopatch.js +8 -7
  78. package/dist/clients/opengrep-config.js +80 -0
  79. package/dist/clients/partial-edit-apply.js +10 -8
  80. package/dist/clients/path-utils.js +22 -0
  81. package/dist/clients/pipeline.js +5 -58
  82. package/dist/clients/production-readiness.js +45 -69
  83. package/dist/clients/project-diagnostics/cache.js +44 -1
  84. package/dist/clients/project-diagnostics/runner-adapters/knip.js +3 -0
  85. package/dist/clients/project-diagnostics/scanner.js +85 -6
  86. package/dist/clients/project-lens-config.js +159 -0
  87. package/dist/clients/read-expansion.js +8 -0
  88. package/dist/clients/read-guard-tool-lines.js +24 -6
  89. package/dist/clients/read-guard.js +34 -0
  90. package/dist/clients/review-graph/builder.js +433 -114
  91. package/dist/clients/review-graph/import-resolvers.js +291 -0
  92. package/dist/clients/review-graph/workspace-modules.js +5 -0
  93. package/dist/clients/runtime-session.js +128 -18
  94. package/dist/clients/runtime-turn.js +170 -26
  95. package/dist/clients/secret-findings.js +114 -0
  96. package/dist/clients/security-scan-client.js +103 -0
  97. package/dist/clients/sgconfig.js +68 -0
  98. package/dist/clients/source-filter.js +12 -1
  99. package/dist/clients/startup-scan.js +13 -4
  100. package/dist/clients/tool-policy.js +43 -0
  101. package/dist/clients/tree-sitter-client.js +408 -41
  102. package/dist/clients/tree-sitter-query-loader.js +18 -1
  103. package/dist/clients/tree-sitter-symbol-extractor.js +333 -73
  104. package/dist/clients/trivy-client.js +441 -0
  105. package/dist/clients/ts-service.js +1 -1
  106. package/dist/clients/typescript-client.js +1 -1
  107. package/dist/clients/typos-config.js +33 -0
  108. package/dist/clients/widget-state.js +48 -2
  109. package/dist/clients/zizmor-config.js +77 -0
  110. package/dist/index.js +85 -108
  111. package/dist/mcp/server.js +87 -42
  112. package/dist/tools/ast-dump.js +77 -30
  113. package/dist/tools/ast-grep-outline.js +148 -0
  114. package/dist/tools/ast-grep-replace.js +14 -2
  115. package/dist/tools/ast-grep-search.js +406 -113
  116. package/dist/tools/lens-diagnostics.js +134 -34
  117. package/dist/tools/lsp-diagnostics.js +48 -24
  118. package/dist/tools/lsp-navigation.js +159 -59
  119. package/dist/tools/lsp-structured-output.js +294 -0
  120. package/dist/tools/module-report.js +361 -0
  121. package/dist/tools/render-compact.js +95 -0
  122. package/package.json +16 -6
  123. package/rules/ast-grep-rules/.sgconfig.yml +9 -0
  124. package/rules/ast-grep-rules/coderabbit/LICENSE +201 -0
  125. package/rules/ast-grep-rules/coderabbit/README.md +9 -0
  126. package/rules/ast-grep-rules/coderabbit/rules/c/security/dont-call-system-c.yml +57 -0
  127. package/rules/ast-grep-rules/coderabbit/rules/c/security/file-access-before-action-c.yml +182 -0
  128. package/rules/ast-grep-rules/coderabbit/rules/c/security/file-stat-before-action-c.yml +331 -0
  129. package/rules/ast-grep-rules/coderabbit/rules/c/security/insecure-hash-c.yml +286 -0
  130. package/rules/ast-grep-rules/coderabbit/rules/c/security/libxml2-audit-parser-c.yml +258 -0
  131. package/rules/ast-grep-rules/coderabbit/rules/c/security/null-library-function-c.yml +254 -0
  132. package/rules/ast-grep-rules/coderabbit/rules/c/security/sizeof-this-c.yml +121 -0
  133. package/rules/ast-grep-rules/coderabbit/rules/c/security/small-key-size-c.yml +40 -0
  134. package/rules/ast-grep-rules/coderabbit/rules/c/security/world-writable-file-c.yml +317 -0
  135. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/dont-call-system-cpp.yml +57 -0
  136. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/file-access-before-action-cpp.yml +271 -0
  137. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/file-stat-before-action-cpp.yml +494 -0
  138. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/fix-format-security-error-cpp.yml +18 -0
  139. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/insecure-hash-cpp.yml +122 -0
  140. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/libxml2-audit-parser-cpp.yml +258 -0
  141. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/missing-nul-cpp-string-memcpy-cpp.yml +393 -0
  142. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/null-library-function-cpp.yml +254 -0
  143. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/return-c-str-cpp.yml +124 -0
  144. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/sizeof-this-cpp.yml +41 -0
  145. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/small-key-size-cpp.yml +40 -0
  146. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/std-return-data-cpp.yml +93 -0
  147. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/std-vector-invalidation-cpp.yml +147 -0
  148. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/string-view-temporary-string-cpp.yml +924 -0
  149. package/rules/ast-grep-rules/coderabbit/rules/cpp/security/world-writable-file-cpp.yml +317 -0
  150. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/httponly-false-csharp.yml +42 -0
  151. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/insecure-binaryformatter-deserialization-csharp.yml +38 -0
  152. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/jwt-decode-without-verify-csharp.yml +700 -0
  153. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/jwt-hardcoded-secret-csharp.yml +672 -0
  154. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/jwt-tokenvalidationparameters-no-expiry-validation-csharp.yml +136 -0
  155. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/networkcredential-hardcoded-secret-python.yml +394 -0
  156. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/npgsqlconnectionstringbuilder-hardcoded-secret-csharp.yml +339 -0
  157. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/oracleconnectionstringbuilder-hardcoded-secret-csharp.yml +339 -0
  158. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/sqlconnectionstringbuilder-hardcoded-secret-csharp.yml +339 -0
  159. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/stacktrace-disclosure-csharp.yml +48 -0
  160. package/rules/ast-grep-rules/coderabbit/rules/csharp/security/use-ecb-mode-csharp.yml +177 -0
  161. package/rules/ast-grep-rules/coderabbit/rules/go/security/avoid-bind-to-all-interfaces-go.yml +27 -0
  162. package/rules/ast-grep-rules/coderabbit/rules/go/security/gorilla-cookie-store-hardcoded-session-key-go.yml +90 -0
  163. package/rules/ast-grep-rules/coderabbit/rules/go/security/gorilla-csrf-hardcoded-auth-key-go.yml +79 -0
  164. package/rules/ast-grep-rules/coderabbit/rules/go/security/grpc-client-insecure-connection-go.yml +60 -0
  165. package/rules/ast-grep-rules/coderabbit/rules/go/security/jwt-go-none-algorithm-go.yml +35 -0
  166. package/rules/ast-grep-rules/coderabbit/rules/go/security/missing-ssl-minversion-go.yml +42 -0
  167. package/rules/ast-grep-rules/coderabbit/rules/go/security/openai-empty-secret-go.yml +199 -0
  168. package/rules/ast-grep-rules/coderabbit/rules/go/security/openai-hardcoded-secret-go.yml +208 -0
  169. package/rules/ast-grep-rules/coderabbit/rules/go/security/ssl-v3-is-insecure-go.yml +40 -0
  170. package/rules/ast-grep-rules/coderabbit/rules/go/security/tls-with-insecure-cipher-go.yml +65 -0
  171. package/rules/ast-grep-rules/coderabbit/rules/go/security/use-of-weak-rsa-key-go.yml +253 -0
  172. package/rules/ast-grep-rules/coderabbit/rules/html/security/plaintext-http-link-html.yml +76 -0
  173. package/rules/ast-grep-rules/coderabbit/rules/java/security/cbc-padding-oracle-java.yml +17 -0
  174. package/rules/ast-grep-rules/coderabbit/rules/java/security/cookie-httponly-false-java.yml +9 -0
  175. package/rules/ast-grep-rules/coderabbit/rules/java/security/cookie-missing-httponly-java.yml +21 -0
  176. package/rules/ast-grep-rules/coderabbit/rules/java/security/cookie-missing-samesite-java.yml +64 -0
  177. package/rules/ast-grep-rules/coderabbit/rules/java/security/cookie-missing-secure-flag-java.yml +51 -0
  178. package/rules/ast-grep-rules/coderabbit/rules/java/security/cookie-secure-flag-false-java.yml +13 -0
  179. package/rules/ast-grep-rules/coderabbit/rules/java/security/datanucleus-hardcoded-connection-password-java.yml +575 -0
  180. package/rules/ast-grep-rules/coderabbit/rules/java/security/des-is-deprecated-java.yml +15 -0
  181. package/rules/ast-grep-rules/coderabbit/rules/java/security/desede-is-deprecated-java.yml +92 -0
  182. package/rules/ast-grep-rules/coderabbit/rules/java/security/documentbuilderfactory-disallow-doctype-decl-false-java.yml +45 -0
  183. package/rules/ast-grep-rules/coderabbit/rules/java/security/documentbuilderfactory-external-general-entities-true-java.yml +279 -0
  184. package/rules/ast-grep-rules/coderabbit/rules/java/security/documentbuilderfactory-external-parameter-entities-true-java.yml +279 -0
  185. package/rules/ast-grep-rules/coderabbit/rules/java/security/drivermanager-hardcoded-secret-java.yml +142 -0
  186. package/rules/ast-grep-rules/coderabbit/rules/java/security/ecb-cipher-java.yml +47 -0
  187. package/rules/ast-grep-rules/coderabbit/rules/java/security/hardcoded-connection-password-java.yml +341 -0
  188. package/rules/ast-grep-rules/coderabbit/rules/java/security/hardcoded-secret-in-credentials-java.yml +281 -0
  189. package/rules/ast-grep-rules/coderabbit/rules/java/security/java-jwt-hardcoded-secret-java.yml +124 -0
  190. package/rules/ast-grep-rules/coderabbit/rules/java/security/jedis-jedisclientconfig-hardcoded-password-java.yml +804 -0
  191. package/rules/ast-grep-rules/coderabbit/rules/java/security/jedis-jedisfactory-hardcoded-password-java.yml +930 -0
  192. package/rules/ast-grep-rules/coderabbit/rules/java/security/missing-httponly-java.yml +583 -0
  193. package/rules/ast-grep-rules/coderabbit/rules/java/security/missing-secure-java.yml +584 -0
  194. package/rules/ast-grep-rules/coderabbit/rules/java/security/no-null-cipher-java.yml +38 -0
  195. package/rules/ast-grep-rules/coderabbit/rules/java/security/passwordauthentication-hardcoded-password-java.yml +651 -0
  196. package/rules/ast-grep-rules/coderabbit/rules/java/security/rsa-no-padding-java.yml +13 -0
  197. package/rules/ast-grep-rules/coderabbit/rules/java/security/simple-command-injection-direct-input-java.yml +55 -0
  198. package/rules/ast-grep-rules/coderabbit/rules/java/security/system-setproperty-hardcoded-secret-java.yml +312 -0
  199. package/rules/ast-grep-rules/coderabbit/rules/java/security/unencrypted-socket-java.yml +20 -0
  200. package/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-aes-ecb-java.yml +68 -0
  201. package/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-blowfish-java.yml +45 -0
  202. package/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-default-aes-java.yml +318 -0
  203. package/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-md5-digest-utils-java.yml +38 -0
  204. package/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-md5-java.yml +104 -0
  205. package/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-rc2-java.yml +84 -0
  206. package/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-rc4-java.yml +38 -0
  207. package/rules/ast-grep-rules/coderabbit/rules/java/security/use-of-sha1-java.yml +165 -0
  208. package/rules/ast-grep-rules/coderabbit/rules/java/security/weak-ssl-context-java.yml +56 -0
  209. package/rules/ast-grep-rules/coderabbit/rules/javascript/security/detect-angular-sce-disabled-javascript.yml +14 -0
  210. package/rules/ast-grep-rules/coderabbit/rules/javascript/security/express-jwt-hardcoded-secret-javascript.yml +289 -0
  211. package/rules/ast-grep-rules/coderabbit/rules/javascript/security/express-session-hardcoded-secret-javascript.yml +101 -0
  212. package/rules/ast-grep-rules/coderabbit/rules/javascript/security/jwt-simple-noverify-javascript.yml +43 -0
  213. package/rules/ast-grep-rules/coderabbit/rules/javascript/security/node-rsa-weak-key-javascript.yml +577 -0
  214. package/rules/ast-grep-rules/coderabbit/rules/javascript/security/node-sequelize-empty-password-argument-javascript.yml +191 -0
  215. package/rules/ast-grep-rules/coderabbit/rules/javascript/security/node-sequelize-hardcoded-secret-argument-javascript.yml +94 -0
  216. package/rules/ast-grep-rules/coderabbit/rules/kotlin/security/des-is-deprecated-kotlin.yml +15 -0
  217. package/rules/ast-grep-rules/coderabbit/rules/kotlin/security/desede-is-deprecated-kotlin.yml +462 -0
  218. package/rules/ast-grep-rules/coderabbit/rules/kotlin/security/jwt-hardcode-kotlin.yml +567 -0
  219. package/rules/ast-grep-rules/coderabbit/rules/kotlin/security/rsa-no-padding-kotlin.yml +13 -0
  220. package/rules/ast-grep-rules/coderabbit/rules/kotlin/security/system-setproperty-hardcoded-secret-kotlin.yml +51 -0
  221. package/rules/ast-grep-rules/coderabbit/rules/php/security/openssl-cbc-static-iv-php.yml +641 -0
  222. package/rules/ast-grep-rules/coderabbit/rules/php/security/search-active-debug-php.yml +153 -0
  223. package/rules/ast-grep-rules/coderabbit/rules/python/security/avoid-mktemp-python.yml +71 -0
  224. package/rules/ast-grep-rules/coderabbit/rules/python/security/avoid_app_run_with_bad_host-python.yml +69 -0
  225. package/rules/ast-grep-rules/coderabbit/rules/python/security/debug-enabled-python.yml +91 -0
  226. package/rules/ast-grep-rules/coderabbit/rules/python/security/hashids-with-django-secret-python.yml +273 -0
  227. package/rules/ast-grep-rules/coderabbit/rules/python/security/hashids-with-flask-secret-python.yml +190 -0
  228. package/rules/ast-grep-rules/coderabbit/rules/python/security/insecure-cipher-algorithm-rc4-python.yml +75 -0
  229. package/rules/ast-grep-rules/coderabbit/rules/python/security/jwt-python-hardcoded-secret-python.yml +116 -0
  230. package/rules/ast-grep-rules/coderabbit/rules/python/security/openai-hardcoded-secret-python.yml +21 -0
  231. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-cassandra-empty-password-python.yml +227 -0
  232. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-cassandra-hardcoded-secret-python.yml +396 -0
  233. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-couchbase-empty-password-python.yml +72 -0
  234. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-couchbase-hardcoded-secret-python.yml +183 -0
  235. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-elasticsearch-hardcoded-bearer-auth-python.yml +64 -0
  236. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-ldap3-empty-password-python.yml +92 -0
  237. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-ldap3-hardcoded-secret-python.yml +145 -0
  238. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-mariadb-empty-password-python.yml +194 -0
  239. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-mariadb-hardcoded-secret-python.yml +193 -0
  240. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-mysql-empty-password-python.yml +192 -0
  241. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-mysql-hardcoded-secret-python.yml +195 -0
  242. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-mysqlclient-empty-password-python.yml +189 -0
  243. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-mysqlclient-hardcoded-secret-python.yml +191 -0
  244. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-neo4j-empty-password-python.yml +203 -0
  245. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-neo4j-hardcoded-secret-python.yml +205 -0
  246. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-peewee-mysql-empty-password-python.yml +50 -0
  247. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-peewee-mysql-hardcoded-secret-python.yml +48 -0
  248. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-peewee-pg-empty-password-python.yml +51 -0
  249. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-peewee-pg-hardcoded-secret-python.yml +49 -0
  250. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-pg8000-empty-password-python.yml +43 -0
  251. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-pg8000-hardcoded-secret-python.yml +67 -0
  252. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-psycopg2-empty-password-python.yml +65 -0
  253. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-psycopg2-hardcoded-secret-python.yml +64 -0
  254. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-pyjwt-hardcoded-secret-python.yml +38 -0
  255. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymongo-empty-password-python.yml +50 -0
  256. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymongo-hardcoded-secret-python.yml +48 -0
  257. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymssql-empty-password-python.yml +50 -0
  258. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymssql-hardcoded-secret-python.yml +48 -0
  259. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymysql-empty-password-python.yml +49 -0
  260. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-pymysql-hardcoded-secret-python.yml +47 -0
  261. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-redis-empty-password-python.yml +66 -0
  262. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-redis-hardcoded-secret-python.yml +65 -0
  263. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-requests-empty-password-python.yml +42 -0
  264. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-requests-hardcoded-secret-python.yml +146 -0
  265. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-requests-oauth-hardcoded-secret-python.yml +278 -0
  266. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-tormysql-empty-password-python.yml +301 -0
  267. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-tormysql-hardcoded-secret-python.yml +292 -0
  268. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-urllib3-hardcoded-secret-python.yml +52 -0
  269. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-webrepl-empty-password-python.yml +49 -0
  270. package/rules/ast-grep-rules/coderabbit/rules/python/security/python-webrepl-hardcoded-secret-python.yml +47 -0
  271. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/force-ssl-false-ruby.yml +23 -0
  272. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/hardcoded-http-auth-in-controller-ruby.yml +55 -0
  273. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/hardcoded-secret-rsa-passphrase-ruby.yml +218 -0
  274. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/insufficient-rsa-key-size-ruby.yml +84 -0
  275. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-aws-sdk-hardcoded-secret-ruby.yml +140 -0
  276. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-cassandra-empty-password-ruby.yml +141 -0
  277. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-cassandra-hardcoded-secret-ruby.yml +138 -0
  278. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-excon-hardcoded-secret-ruby.yml +226 -0
  279. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-faraday-hardcoded-secret-ruby.yml +490 -0
  280. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-mongo-empty-password-ruby.yml +356 -0
  281. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-mongo-hardcoded-secret-ruby.yml +400 -0
  282. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-mysql2-empty-password-ruby.yml +227 -0
  283. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-mysql2-hardcoded-secret-ruby.yml +248 -0
  284. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-octokit-hardcoded-secret-ruby.yml +125 -0
  285. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-pg-empty-password-ruby.yml +150 -0
  286. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-pg-hardcoded-secret-ruby.yml +189 -0
  287. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-redis-empty-password-ruby.yml +72 -0
  288. package/rules/ast-grep-rules/coderabbit/rules/ruby/security/ruby-redis-hardcoded-secret-ruby.yml +70 -0
  289. package/rules/ast-grep-rules/coderabbit/rules/rust/security/empty-password-rust.yml +1039 -0
  290. package/rules/ast-grep-rules/coderabbit/rules/rust/security/hardcoded-password-rust.yml +1016 -0
  291. package/rules/ast-grep-rules/coderabbit/rules/rust/security/postgres-empty-password-rust.yml +283 -0
  292. package/rules/ast-grep-rules/coderabbit/rules/rust/security/reqwest-accept-invalid-rust.yml +21 -0
  293. package/rules/ast-grep-rules/coderabbit/rules/rust/security/secrets-reqwest-hardcoded-auth-rust.yml +290 -0
  294. package/rules/ast-grep-rules/coderabbit/rules/rust/security/ssl-verify-none-rust.yml +100 -0
  295. package/rules/ast-grep-rules/coderabbit/rules/rust/security/tokio-postgres-empty-password-rust.yml +235 -0
  296. package/rules/ast-grep-rules/coderabbit/rules/rust/security/tokio-postgres-hardcoded-password-rust.yml +229 -0
  297. package/rules/ast-grep-rules/coderabbit/rules/scala/security/jwt-scala-hardcode-scala.yml +109 -0
  298. package/rules/ast-grep-rules/coderabbit/rules/scala/security/scala-jwt-hardcoded-secret-scala.yml +176 -0
  299. package/rules/ast-grep-rules/coderabbit/rules/swift/security/aes-hardcoded-secret-swift.yml +345 -0
  300. package/rules/ast-grep-rules/coderabbit/rules/swift/security/blowfish-hardcoded-secret-swift.yml +345 -0
  301. package/rules/ast-grep-rules/coderabbit/rules/swift/security/chacha20-hardcoded-secret-swift.yml +345 -0
  302. package/rules/ast-grep-rules/coderabbit/rules/swift/security/insecure-biometrics-swift.yml +43 -0
  303. package/rules/ast-grep-rules/coderabbit/rules/swift/security/rabbit-hardcoded-secret-swift.yml +345 -0
  304. package/rules/ast-grep-rules/coderabbit/rules/typescript/security/detect-angular-sce-disabled-typescript.yml +36 -0
  305. package/rules/ast-grep-rules/coderabbit/rules/typescript/security/express-session-hardcoded-secret-typescript.yml +203 -0
  306. package/rules/ast-grep-rules/coderabbit/rules/typescript/security/jwt-simple-noverify-typescript.yml +112 -0
  307. package/rules/ast-grep-rules/coderabbit/rules/typescript/security/node-rsa-weak-key-typescript.yml +1483 -0
  308. package/rules/ast-grep-rules/coderabbit/rules/typescript/security/node-sequelize-empty-password-argument-typescript.yml +169 -0
  309. package/rules/ast-grep-rules/coderabbit/rules/typescript/security/node-sequelize-hardcoded-secret-argument-typescript.yml +154 -0
  310. package/rules/ast-grep-rules/rule-schema.json +7 -7
  311. package/rules/ast-grep-rules/rule-tests/array-callback-return-js-test.yml +10 -0
  312. package/rules/ast-grep-rules/rule-tests/array-callback-return-test.yml +10 -0
  313. package/rules/ast-grep-rules/rule-tests/avoid-duplicate-export-test.yml +14 -0
  314. package/rules/ast-grep-rules/rule-tests/consistent-existence-index-check-js-test.yml +10 -0
  315. package/rules/ast-grep-rules/rule-tests/consistent-existence-index-check-test.yml +10 -0
  316. package/rules/ast-grep-rules/rule-tests/defer-in-loop-test.yml +20 -0
  317. package/rules/ast-grep-rules/rule-tests/enforce-node-protocol-js-test.yml +8 -0
  318. package/rules/ast-grep-rules/rule-tests/enforce-node-protocol-test.yml +8 -0
  319. package/rules/ast-grep-rules/rule-tests/find-import-file-without-extension-test.yml +8 -0
  320. package/rules/ast-grep-rules/rule-tests/go-defer-func-call-antipattern-test.yml +8 -0
  321. package/rules/ast-grep-rules/rule-tests/go-test-functions-test.yml +9 -0
  322. package/rules/ast-grep-rules/rule-tests/gorm-find-without-where-test.yml +15 -0
  323. package/rules/ast-grep-rules/rule-tests/gorm-n-plus-one-test.yml +20 -0
  324. package/rules/ast-grep-rules/rule-tests/hardcoded-url-js-test.yml +7 -0
  325. package/rules/ast-grep-rules/rule-tests/hardcoded-url-test.yml +7 -0
  326. package/rules/ast-grep-rules/rule-tests/inline-styles-test.yml +8 -0
  327. package/rules/ast-grep-rules/rule-tests/jsx-boolean-short-circuit-test.yml +8 -0
  328. package/rules/ast-grep-rules/rule-tests/jwt-no-verify-js-test.yml +9 -0
  329. package/rules/ast-grep-rules/rule-tests/jwt-no-verify-test.yml +9 -0
  330. package/rules/ast-grep-rules/rule-tests/large-class-test.yml +15 -0
  331. package/rules/ast-grep-rules/rule-tests/long-parameter-list-test.yml +8 -0
  332. package/rules/ast-grep-rules/rule-tests/loop-var-capture-test.yml +25 -0
  333. package/rules/ast-grep-rules/rule-tests/missing-component-decorator-test.yml +7 -0
  334. package/rules/ast-grep-rules/rule-tests/mutex-unlock-mismatch-test.yml +29 -0
  335. package/rules/ast-grep-rules/rule-tests/nested-ternary-js-test.yml +8 -0
  336. package/rules/ast-grep-rules/rule-tests/nested-ternary-test.yml +8 -0
  337. package/rules/ast-grep-rules/rule-tests/nil-map-assignment-test.yml +50 -0
  338. package/rules/ast-grep-rules/rule-tests/no-absolute-path-import-js-test.yml +8 -0
  339. package/rules/ast-grep-rules/rule-tests/no-absolute-path-import-test.yml +8 -0
  340. package/rules/ast-grep-rules/rule-tests/no-accumulating-spread-js-test.yml +8 -0
  341. package/rules/ast-grep-rules/rule-tests/no-alert-js-test.yml +7 -0
  342. package/rules/ast-grep-rules/rule-tests/no-alert-test.yml +7 -0
  343. package/rules/ast-grep-rules/rule-tests/no-any-type-test.yml +9 -0
  344. package/rules/ast-grep-rules/rule-tests/no-array-constructor-js-test.yml +9 -0
  345. package/rules/ast-grep-rules/rule-tests/no-array-constructor-test.yml +9 -0
  346. package/rules/ast-grep-rules/rule-tests/no-array-reverse-mutation-js-test.yml +9 -0
  347. package/rules/ast-grep-rules/rule-tests/no-array-reverse-mutation-test.yml +9 -0
  348. package/rules/ast-grep-rules/rule-tests/no-as-any-test.yml +8 -0
  349. package/rules/ast-grep-rules/rule-tests/no-assert-tuple-test.yml +13 -0
  350. package/rules/ast-grep-rules/rule-tests/no-async-promise-executor-js-test.yml +8 -0
  351. package/rules/ast-grep-rules/rule-tests/no-async-promise-executor-test.yml +8 -0
  352. package/rules/ast-grep-rules/rule-tests/no-await-expression-member-js-test.yml +8 -0
  353. package/rules/ast-grep-rules/rule-tests/no-await-expression-member-test.yml +8 -0
  354. package/rules/ast-grep-rules/rule-tests/no-await-in-promise-all-js-test.yml +7 -0
  355. package/rules/ast-grep-rules/rule-tests/no-await-in-promise-all-test.yml +7 -0
  356. package/rules/ast-grep-rules/rule-tests/no-await-in-promise-methods-js-test.yml +10 -0
  357. package/rules/ast-grep-rules/rule-tests/no-await-in-promise-methods-test.yml +10 -0
  358. package/rules/ast-grep-rules/rule-tests/no-aws-access-key-literal-test.yml +8 -0
  359. package/rules/ast-grep-rules/rule-tests/no-aws-apigateway-no-auth-test.yml +12 -0
  360. package/rules/ast-grep-rules/rule-tests/no-aws-s3-public-access-test.yml +9 -0
  361. package/rules/ast-grep-rules/rule-tests/no-bare-except-test.yml +28 -0
  362. package/rules/ast-grep-rules/rule-tests/no-blank-target-js-test.yml +8 -0
  363. package/rules/ast-grep-rules/rule-tests/no-boolean-in-except-test.yml +28 -0
  364. package/rules/ast-grep-rules/rule-tests/no-case-declarations-js-test.yml +24 -0
  365. package/rules/ast-grep-rules/rule-tests/no-case-declarations-test.yml +24 -0
  366. package/rules/ast-grep-rules/rule-tests/no-compare-neg-zero-js-test.yml +9 -0
  367. package/rules/ast-grep-rules/rule-tests/no-compare-neg-zero-test.yml +9 -0
  368. package/rules/ast-grep-rules/rule-tests/no-comparison-to-none-test.yml +11 -0
  369. package/rules/ast-grep-rules/rule-tests/no-comparison-to-true-false-test.yml +13 -0
  370. package/rules/ast-grep-rules/rule-tests/no-compile-call-test.yml +10 -0
  371. package/rules/ast-grep-rules/rule-tests/no-cond-assign-js-test.yml +9 -0
  372. package/rules/ast-grep-rules/rule-tests/no-cond-assign-test.yml +9 -0
  373. package/rules/ast-grep-rules/rule-tests/no-console-except-error-js-test.yml +13 -0
  374. package/rules/ast-grep-rules/rule-tests/no-console-except-error-test.yml +13 -0
  375. package/rules/ast-grep-rules/rule-tests/no-constant-condition-js-test.yml +10 -0
  376. package/rules/ast-grep-rules/rule-tests/no-constant-condition-test.yml +10 -0
  377. package/rules/ast-grep-rules/rule-tests/no-db-string-literal-password-test.yml +8 -0
  378. package/rules/ast-grep-rules/rule-tests/no-demeter-message-chain-test.yml +16 -0
  379. package/rules/ast-grep-rules/rule-tests/no-discarded-error-js-test.yml +9 -0
  380. package/rules/ast-grep-rules/rule-tests/no-discarded-error-test.yml +9 -0
  381. package/rules/ast-grep-rules/rule-tests/no-dunder-exit-wrong-arity-test.yml +27 -0
  382. package/rules/ast-grep-rules/rule-tests/no-dupe-class-members-test.yml +11 -0
  383. package/rules/ast-grep-rules/rule-tests/no-dupe-keys-js-test.yml +9 -0
  384. package/rules/ast-grep-rules/rule-tests/no-dupe-keys-test.yml +9 -0
  385. package/rules/ast-grep-rules/rule-tests/no-duplicate-kwarg-test.yml +8 -0
  386. package/rules/ast-grep-rules/rule-tests/no-ellipsis-body-test.yml +20 -0
  387. package/rules/ast-grep-rules/rule-tests/no-except-non-exception-test.yml +23 -0
  388. package/rules/ast-grep-rules/rule-tests/no-extra-boolean-cast-js-test.yml +9 -0
  389. package/rules/ast-grep-rules/rule-tests/no-extra-boolean-cast-test.yml +9 -0
  390. package/rules/ast-grep-rules/rule-tests/no-fastapi-router-prefix-outside-init-test.yml +8 -0
  391. package/rules/ast-grep-rules/rule-tests/no-flag-argument-js-test.yml +37 -0
  392. package/rules/ast-grep-rules/rule-tests/no-flag-argument-test.yml +37 -0
  393. package/rules/ast-grep-rules/rule-tests/no-flask-preprocess-request-ignored-test.yml +16 -0
  394. package/rules/ast-grep-rules/rule-tests/no-flask-secret-key-literal-test.yml +11 -0
  395. package/rules/ast-grep-rules/rule-tests/no-flask-sendfile-without-mimetype-test.yml +8 -0
  396. package/rules/ast-grep-rules/rule-tests/no-global-eval-js-test.yml +17 -0
  397. package/rules/ast-grep-rules/rule-tests/no-hardcoded-password-test.yml +10 -0
  398. package/rules/ast-grep-rules/rule-tests/no-html-autoescape-off-test.yml +13 -0
  399. package/rules/ast-grep-rules/rule-tests/no-http-headers-bracket-access-test.yml +7 -0
  400. package/rules/ast-grep-rules/rule-tests/no-identity-operator-on-literals-test.yml +14 -0
  401. package/rules/ast-grep-rules/rule-tests/no-implied-eval-js-test.yml +12 -0
  402. package/rules/ast-grep-rules/rule-tests/no-implied-eval-test.yml +12 -0
  403. package/rules/ast-grep-rules/rule-tests/no-init-return-test.yml +26 -0
  404. package/rules/ast-grep-rules/rule-tests/no-inner-html-js-test.yml +8 -0
  405. package/rules/ast-grep-rules/rule-tests/no-inner-html-test.yml +8 -0
  406. package/rules/ast-grep-rules/rule-tests/no-insecure-randomness-js-test.yml +13 -0
  407. package/rules/ast-grep-rules/rule-tests/no-insecure-randomness-test.yml +13 -0
  408. package/rules/ast-grep-rules/rule-tests/no-instanceof-array-js-test.yml +8 -0
  409. package/rules/ast-grep-rules/rule-tests/no-instanceof-array-test.yml +8 -0
  410. package/rules/ast-grep-rules/rule-tests/no-instanceof-builtins-js-test.yml +11 -0
  411. package/rules/ast-grep-rules/rule-tests/no-instanceof-builtins-test.yml +11 -0
  412. package/rules/ast-grep-rules/rule-tests/no-javascript-url-js-test.yml +9 -0
  413. package/rules/ast-grep-rules/rule-tests/no-javascript-url-test.yml +9 -0
  414. package/rules/ast-grep-rules/rule-tests/no-jinja2-autoescape-off-test.yml +13 -0
  415. package/rules/ast-grep-rules/rule-tests/no-marshal-load-test.yml +10 -0
  416. package/rules/ast-grep-rules/rule-tests/no-mutable-contextvar-default-test.yml +9 -0
  417. package/rules/ast-grep-rules/rule-tests/no-mutable-default-test.yml +12 -0
  418. package/rules/ast-grep-rules/rule-tests/no-mutable-export-test.yml +10 -0
  419. package/rules/ast-grep-rules/rule-tests/no-nan-comparison-js-test.yml +11 -0
  420. package/rules/ast-grep-rules/rule-tests/no-nan-comparison-test.yml +11 -0
  421. package/rules/ast-grep-rules/rule-tests/no-negation-in-equality-check-js-test.yml +10 -0
  422. package/rules/ast-grep-rules/rule-tests/no-negation-in-equality-check-test.yml +10 -0
  423. package/rules/ast-grep-rules/rule-tests/no-nested-links-test.yml +8 -0
  424. package/rules/ast-grep-rules/rule-tests/no-new-symbol-js-test.yml +8 -0
  425. package/rules/ast-grep-rules/rule-tests/no-new-symbol-test.yml +8 -0
  426. package/rules/ast-grep-rules/rule-tests/no-new-wrappers-js-test.yml +9 -0
  427. package/rules/ast-grep-rules/rule-tests/no-new-wrappers-test.yml +9 -0
  428. package/rules/ast-grep-rules/rule-tests/no-non-null-assertion-test.yml +10 -0
  429. package/rules/ast-grep-rules/rule-tests/no-notimplemented-in-bool-test.yml +20 -0
  430. package/rules/ast-grep-rules/rule-tests/no-numpy-nan-equality-test.yml +22 -0
  431. package/rules/ast-grep-rules/rule-tests/no-octal-literal-test.yml +8 -0
  432. package/rules/ast-grep-rules/rule-tests/no-only-defined-names-in-dunder-all-test.yml +17 -0
  433. package/rules/ast-grep-rules/rule-tests/no-open-redirect-js-test.yml +12 -0
  434. package/rules/ast-grep-rules/rule-tests/no-open-redirect-test.yml +12 -0
  435. package/rules/ast-grep-rules/rule-tests/no-prototype-builtins-js-test.yml +9 -0
  436. package/rules/ast-grep-rules/rule-tests/no-prototype-builtins-native-test.yml +9 -0
  437. package/rules/ast-grep-rules/rule-tests/no-prototype-builtins-test.yml +9 -0
  438. package/rules/ast-grep-rules/rule-tests/no-python-sql-string-concat-test.yml +10 -0
  439. package/rules/ast-grep-rules/rule-tests/no-raise-not-implemented-test.yml +21 -0
  440. package/rules/ast-grep-rules/rule-tests/no-raise-stopiteration-in-generator-test.yml +22 -0
  441. package/rules/ast-grep-rules/rule-tests/no-relative-cross-package-import-test.yml +9 -0
  442. package/rules/ast-grep-rules/rule-tests/no-requests-verify-false-test.yml +11 -0
  443. package/rules/ast-grep-rules/rule-tests/no-requests-without-timeout-test.yml +10 -0
  444. package/rules/ast-grep-rules/rule-tests/no-return-await-test.yml +12 -0
  445. package/rules/ast-grep-rules/rule-tests/no-return-value-in-generator-test.yml +22 -0
  446. package/rules/ast-grep-rules/rule-tests/no-secret-in-env-var-name-test.yml +11 -0
  447. package/rules/ast-grep-rules/rule-tests/no-server-bind-wildcard-test.yml +10 -0
  448. package/rules/ast-grep-rules/rule-tests/no-single-promise-in-promise-methods-js-test.yml +10 -0
  449. package/rules/ast-grep-rules/rule-tests/no-single-promise-in-promise-methods-test.yml +10 -0
  450. package/rules/ast-grep-rules/rule-tests/no-singledispatch-on-method-test.yml +25 -0
  451. package/rules/ast-grep-rules/rule-tests/no-sort-without-comparator-test.yml +8 -0
  452. package/rules/ast-grep-rules/rule-tests/no-sql-in-code-js-test.yml +10 -0
  453. package/rules/ast-grep-rules/rule-tests/no-sql-in-code-test.yml +10 -0
  454. package/rules/ast-grep-rules/rule-tests/no-star-imports-test.yml +9 -0
  455. package/rules/ast-grep-rules/rule-tests/no-string-ref-test.yml +8 -0
  456. package/rules/ast-grep-rules/rule-tests/no-template-string-concat-test.yml +14 -0
  457. package/rules/ast-grep-rules/rule-tests/no-testclient-text-without-content-test.yml +10 -0
  458. package/rules/ast-grep-rules/rule-tests/no-throw-string-js-test.yml +10 -0
  459. package/rules/ast-grep-rules/rule-tests/no-throw-string-test.yml +10 -0
  460. package/rules/ast-grep-rules/rule-tests/no-typeof-undefined-js-test.yml +11 -0
  461. package/rules/ast-grep-rules/rule-tests/no-typeof-undefined-test.yml +11 -0
  462. package/rules/ast-grep-rules/rule-tests/no-unimplemented-stub-js-test.yml +10 -0
  463. package/rules/ast-grep-rules/rule-tests/no-unimplemented-stub-test.yml +10 -0
  464. package/rules/ast-grep-rules/rule-tests/no-unnecessary-array-flat-depth-js-test.yml +8 -0
  465. package/rules/ast-grep-rules/rule-tests/no-unnecessary-array-flat-depth-test.yml +8 -0
  466. package/rules/ast-grep-rules/rule-tests/no-unnecessary-state-initializer-test.yml +7 -0
  467. package/rules/ast-grep-rules/rule-tests/no-useless-length-check-js-test.yml +9 -0
  468. package/rules/ast-grep-rules/rule-tests/no-useless-length-check-test.yml +9 -0
  469. package/rules/ast-grep-rules/rule-tests/no-useless-promise-resolve-reject-js-test.yml +8 -0
  470. package/rules/ast-grep-rules/rule-tests/no-useless-promise-resolve-reject-test.yml +8 -0
  471. package/rules/ast-grep-rules/rule-tests/no-useless-rest-spread-js-test.yml +8 -0
  472. package/rules/ast-grep-rules/rule-tests/no-useless-rest-spread-test.yml +8 -0
  473. package/rules/ast-grep-rules/rule-tests/no-uvicorn-non-import-string-test.yml +10 -0
  474. package/rules/ast-grep-rules/rule-tests/no-xxe-vulnerable-xml-parser-test.yml +19 -0
  475. package/rules/ast-grep-rules/rule-tests/no-yield-from-non-iterable-test.yml +11 -0
  476. package/rules/ast-grep-rules/rule-tests/no-yield-return-outside-function-test.yml +19 -0
  477. package/rules/ast-grep-rules/rule-tests/only-strings-in-dunder-all-test.yml +18 -0
  478. package/rules/ast-grep-rules/rule-tests/prefer-array-find-js-test.yml +8 -0
  479. package/rules/ast-grep-rules/rule-tests/prefer-array-find-test.yml +8 -0
  480. package/rules/ast-grep-rules/rule-tests/prefer-array-flat-map-js-test.yml +8 -0
  481. package/rules/ast-grep-rules/rule-tests/prefer-array-flat-map-test.yml +8 -0
  482. package/rules/ast-grep-rules/rule-tests/prefer-array-some-js-test.yml +9 -0
  483. package/rules/ast-grep-rules/rule-tests/prefer-array-some-test.yml +9 -0
  484. package/rules/ast-grep-rules/rule-tests/prefer-at-js-test.yml +8 -0
  485. package/rules/ast-grep-rules/rule-tests/prefer-at-test.yml +8 -0
  486. package/rules/ast-grep-rules/rule-tests/prefer-date-now-js-test.yml +8 -0
  487. package/rules/ast-grep-rules/rule-tests/prefer-date-now-test.yml +8 -0
  488. package/rules/ast-grep-rules/rule-tests/prefer-dom-node-append-js-test.yml +8 -0
  489. package/rules/ast-grep-rules/rule-tests/prefer-dom-node-append-test.yml +8 -0
  490. package/rules/ast-grep-rules/rule-tests/prefer-dom-node-text-content-js-test.yml +9 -0
  491. package/rules/ast-grep-rules/rule-tests/prefer-dom-node-text-content-test.yml +9 -0
  492. package/rules/ast-grep-rules/rule-tests/prefer-keyboard-event-key-js-test.yml +11 -0
  493. package/rules/ast-grep-rules/rule-tests/prefer-keyboard-event-key-test.yml +11 -0
  494. package/rules/ast-grep-rules/rule-tests/prefer-math-min-max-js-test.yml +10 -0
  495. package/rules/ast-grep-rules/rule-tests/prefer-math-min-max-test.yml +10 -0
  496. package/rules/ast-grep-rules/rule-tests/prefer-number-properties-js-test.yml +9 -0
  497. package/rules/ast-grep-rules/rule-tests/prefer-number-properties-test.yml +9 -0
  498. package/rules/ast-grep-rules/rule-tests/prefer-optional-chain-test.yml +9 -0
  499. package/rules/ast-grep-rules/rule-tests/prefer-prototype-methods-js-test.yml +8 -0
  500. package/rules/ast-grep-rules/rule-tests/prefer-prototype-methods-test.yml +8 -0
  501. package/rules/ast-grep-rules/rule-tests/prefer-query-selector-js-test.yml +9 -0
  502. package/rules/ast-grep-rules/rule-tests/prefer-query-selector-test.yml +9 -0
  503. package/rules/ast-grep-rules/rule-tests/prefer-string-slice-js-test.yml +9 -0
  504. package/rules/ast-grep-rules/rule-tests/prefer-string-slice-test.yml +9 -0
  505. package/rules/ast-grep-rules/rule-tests/prefer-string-starts-ends-with-js-test.yml +9 -0
  506. package/rules/ast-grep-rules/rule-tests/prefer-string-starts-ends-with-test.yml +9 -0
  507. package/rules/ast-grep-rules/rule-tests/prefer-string-trim-start-end-js-test.yml +9 -0
  508. package/rules/ast-grep-rules/rule-tests/prefer-string-trim-start-end-test.yml +9 -0
  509. package/rules/ast-grep-rules/rule-tests/prefer-structured-clone-js-test.yml +8 -0
  510. package/rules/ast-grep-rules/rule-tests/prefer-structured-clone-test.yml +8 -0
  511. package/rules/ast-grep-rules/rule-tests/redos-nested-quantifier-test.yml +14 -0
  512. package/rules/ast-grep-rules/rule-tests/redundant-state-test.yml +8 -0
  513. package/rules/ast-grep-rules/rule-tests/redundant-unsafe-function-test.yml +25 -0
  514. package/rules/ast-grep-rules/rule-tests/redundant-usestate-type-test.yml +10 -0
  515. package/rules/ast-grep-rules/rule-tests/require-await-test.yml +9 -0
  516. package/rules/ast-grep-rules/rule-tests/ruby-detect-path-traversal-test.yml +9 -0
  517. package/rules/ast-grep-rules/rule-tests/rust-2024-let-chain-candidate-test.yml +27 -0
  518. package/rules/ast-grep-rules/rule-tests/strict-equality-js-test.yml +9 -0
  519. package/rules/ast-grep-rules/rule-tests/strict-equality-test.yml +9 -0
  520. package/rules/ast-grep-rules/rule-tests/strict-inequality-js-test.yml +9 -0
  521. package/rules/ast-grep-rules/rule-tests/strict-inequality-test.yml +9 -0
  522. package/rules/ast-grep-rules/rule-tests/string-concat-in-loop-test.yml +20 -0
  523. package/rules/ast-grep-rules/rule-tests/switch-without-default-test.yml +16 -0
  524. package/rules/ast-grep-rules/rule-tests/throw-new-error-js-test.yml +10 -0
  525. package/rules/ast-grep-rules/rule-tests/throw-new-error-test.yml +10 -0
  526. package/rules/ast-grep-rules/rule-tests/ts-array-concat-spread-test.yml +9 -0
  527. package/rules/ast-grep-rules/rule-tests/ts-array-every-some-test.yml +8 -0
  528. package/rules/ast-grep-rules/rule-tests/ts-boolean-return-if-else-test.yml +13 -0
  529. package/rules/ast-grep-rules/rule-tests/ts-defensive-null-guard-test.yml +14 -0
  530. package/rules/ast-grep-rules/rule-tests/ts-delete-property-test.yml +8 -0
  531. package/rules/ast-grep-rules/rule-tests/ts-double-negation-test.yml +9 -0
  532. package/rules/ast-grep-rules/rule-tests/ts-function-constructor-test.yml +8 -0
  533. package/rules/ast-grep-rules/rule-tests/ts-in-operator-loop-test.yml +13 -0
  534. package/rules/ast-grep-rules/rule-tests/ts-isnan-check-test.yml +9 -0
  535. package/rules/ast-grep-rules/rule-tests/ts-json-stringify-parse-test.yml +8 -0
  536. package/rules/ast-grep-rules/rule-tests/ts-manual-array-contains-test.yml +13 -0
  537. package/rules/ast-grep-rules/rule-tests/ts-nullish-coalescing-opportunity-test.yml +8 -0
  538. package/rules/ast-grep-rules/rule-tests/ts-object-hasown-check-test.yml +8 -0
  539. package/rules/ast-grep-rules/rule-tests/ts-optional-chaining-default-test.yml +8 -0
  540. package/rules/ast-grep-rules/rule-tests/ts-parseint-no-radix-test.yml +9 -0
  541. package/rules/ast-grep-rules/rule-tests/ts-pointless-bool-cast-test.yml +13 -0
  542. package/rules/ast-grep-rules/rule-tests/ts-redundant-filter-map-test.yml +8 -0
  543. package/rules/ast-grep-rules/rule-tests/ts-slice-copy-test.yml +8 -0
  544. package/rules/ast-grep-rules/rule-tests/ts-string-split-index-test.yml +9 -0
  545. package/rules/ast-grep-rules/rule-tests/ts-unnecessary-array-concat-test.yml +8 -0
  546. package/rules/ast-grep-rules/rule-tests/ts-unnecessary-array-from-test.yml +8 -0
  547. package/rules/ast-grep-rules/rule-tests/ts-unnecessary-bind-test.yml +9 -0
  548. package/rules/ast-grep-rules/rule-tests/ts-unnecessary-else-return-test.yml +13 -0
  549. package/rules/ast-grep-rules/rule-tests/ts-void-zero-test.yml +9 -0
  550. package/rules/ast-grep-rules/rule-tests/ts-while-index-length-test.yml +8 -0
  551. package/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-js-test.yml +13 -0
  552. package/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-python-test.yml +23 -0
  553. package/rules/ast-grep-rules/rule-tests/unchecked-throwing-call-test.yml +13 -0
  554. package/rules/ast-grep-rules/rule-tests/unlock-in-loop-test.yml +19 -0
  555. package/rules/ast-grep-rules/rule-tests/unmarshal-tag-is-dash-test.yml +23 -0
  556. package/rules/ast-grep-rules/rule-tests/unnecessary-react-hook-test.yml +8 -0
  557. package/rules/ast-grep-rules/rule-tests/waitgroup-done-scope-test.yml +20 -0
  558. package/rules/ast-grep-rules/rule-tests/weak-rsa-key-js-test.yml +9 -0
  559. package/rules/ast-grep-rules/rule-tests/weak-rsa-key-test.yml +9 -0
  560. package/rules/ast-grep-rules/rule-tests-disabled/no-method-field-name-collision-test.yml +23 -0
  561. package/rules/ast-grep-rules/rules/array-callback-return-js.yml +17 -10
  562. package/rules/ast-grep-rules/rules/array-callback-return.yml +16 -9
  563. package/rules/ast-grep-rules/rules/avoid-duplicate-export.yml +19 -0
  564. package/rules/ast-grep-rules/rules/defer-in-loop.yml +10 -0
  565. package/rules/ast-grep-rules/rules/find-import-file-without-extension.yml +22 -0
  566. package/rules/ast-grep-rules/rules/go-defer-func-call-antipattern.yml +34 -0
  567. package/rules/ast-grep-rules/rules/go-test-functions.yml +32 -0
  568. package/rules/ast-grep-rules/rules/gorm-find-without-where.yml +26 -0
  569. package/rules/ast-grep-rules/rules/gorm-n-plus-one.yml +16 -0
  570. package/rules/ast-grep-rules/rules/hardcoded-url-js.yml +10 -5
  571. package/rules/ast-grep-rules/rules/hardcoded-url.yml +9 -4
  572. package/rules/ast-grep-rules/rules/jsx-boolean-short-circuit.yml +33 -13
  573. package/rules/ast-grep-rules/rules/jwt-no-verify-js.yml +16 -3
  574. package/rules/ast-grep-rules/rules/jwt-no-verify.yml +15 -2
  575. package/rules/ast-grep-rules/rules/loop-var-capture.yml +42 -0
  576. package/rules/ast-grep-rules/rules/missing-component-decorator.yml +21 -0
  577. package/rules/ast-grep-rules/rules/mutex-unlock-mismatch.yml +14 -0
  578. package/rules/ast-grep-rules/rules/nil-map-assignment.yml +43 -0
  579. package/rules/ast-grep-rules/rules/no-any-type.yml +13 -4
  580. package/rules/ast-grep-rules/rules/no-assert-tuple.yml +24 -0
  581. package/rules/ast-grep-rules/rules/no-aws-access-key-literal.yml +30 -0
  582. package/rules/ast-grep-rules/rules/no-aws-apigateway-no-auth.yml +29 -0
  583. package/rules/ast-grep-rules/rules/no-aws-s3-public-access.yml +28 -0
  584. package/rules/ast-grep-rules/rules/no-bare-except.yml +21 -3
  585. package/rules/ast-grep-rules/rules/no-blank-target-js.yml +17 -6
  586. package/rules/ast-grep-rules/rules/no-boolean-in-except.yml +23 -0
  587. package/rules/ast-grep-rules/rules/no-comparison-to-none.yml +5 -0
  588. package/rules/ast-grep-rules/rules/no-comparison-to-true-false.yml +25 -0
  589. package/rules/ast-grep-rules/rules/no-compile-call.yml +29 -0
  590. package/rules/ast-grep-rules/rules/no-console-except-error-js.yml +20 -0
  591. package/rules/ast-grep-rules/rules/no-console-except-error.yml +20 -0
  592. package/rules/ast-grep-rules/rules/no-db-string-literal-password.yml +44 -0
  593. package/rules/ast-grep-rules/rules/no-demeter-message-chain.yml +25 -0
  594. package/rules/ast-grep-rules/rules/no-dunder-exit-wrong-arity.yml +25 -0
  595. package/rules/ast-grep-rules/rules/no-duplicate-kwarg.yml +26 -0
  596. package/rules/ast-grep-rules/rules/no-except-non-exception.yml +47 -0
  597. package/rules/ast-grep-rules/rules/no-extra-boolean-cast-js.yml +26 -21
  598. package/rules/ast-grep-rules/rules/no-extra-boolean-cast.yml +25 -20
  599. package/rules/ast-grep-rules/rules/no-fastapi-router-prefix-outside-init.yml +29 -0
  600. package/rules/ast-grep-rules/rules/no-flag-argument-js.yml +37 -0
  601. package/rules/ast-grep-rules/rules/no-flag-argument.yml +36 -0
  602. package/rules/ast-grep-rules/rules/no-flask-preprocess-request-ignored.yml +26 -0
  603. package/rules/ast-grep-rules/rules/no-flask-secret-key-literal.yml +36 -0
  604. package/rules/ast-grep-rules/rules/no-flask-sendfile-without-mimetype.yml +42 -0
  605. package/rules/ast-grep-rules/rules/no-global-eval-js.yml +5 -0
  606. package/rules/ast-grep-rules/rules/no-hardcoded-password.yml +42 -0
  607. package/rules/ast-grep-rules/rules/no-html-autoescape-off.yml +25 -0
  608. package/rules/ast-grep-rules/rules/no-http-headers-bracket-access.yml +22 -0
  609. package/rules/ast-grep-rules/rules/no-identity-operator-on-literals.yml +69 -0
  610. package/rules/ast-grep-rules/rules/no-implied-eval-js.yml +8 -5
  611. package/rules/ast-grep-rules/rules/no-implied-eval.yml +7 -4
  612. package/rules/ast-grep-rules/rules/no-init-return.yml +27 -0
  613. package/rules/ast-grep-rules/rules/no-inline-styles.yml +13 -6
  614. package/rules/ast-grep-rules/rules/no-javascript-url-js.yml +8 -4
  615. package/rules/ast-grep-rules/rules/no-javascript-url.yml +7 -3
  616. package/rules/ast-grep-rules/rules/no-jinja2-autoescape-off.yml +24 -0
  617. package/rules/ast-grep-rules/rules/no-marshal-load.yml +24 -0
  618. package/rules/ast-grep-rules/rules/no-mutable-contextvar-default.yml +38 -0
  619. package/rules/ast-grep-rules/rules/no-mutable-default.yml +8 -2
  620. package/rules/ast-grep-rules/rules/no-notimplemented-in-bool.yml +21 -0
  621. package/rules/ast-grep-rules/rules/no-numpy-nan-equality.yml +31 -0
  622. package/rules/ast-grep-rules/rules/no-only-defined-names-in-dunder-all.yml +36 -0
  623. package/rules/ast-grep-rules/rules/no-python-sql-string-concat.yml +37 -0
  624. package/rules/ast-grep-rules/rules/no-raise-stopiteration-in-generator.yml +28 -0
  625. package/rules/ast-grep-rules/rules/no-relative-imports.yml +13 -14
  626. package/rules/ast-grep-rules/rules/no-requests-verify-false.yml +27 -0
  627. package/rules/ast-grep-rules/rules/no-requests-without-timeout.yml +113 -0
  628. package/rules/ast-grep-rules/rules/no-return-value-in-generator.yml +31 -0
  629. package/rules/ast-grep-rules/rules/no-secret-in-env-var-name.yml +37 -0
  630. package/rules/ast-grep-rules/rules/no-server-bind-wildcard.yml +28 -0
  631. package/rules/ast-grep-rules/rules/no-singledispatch-on-method.yml +27 -0
  632. package/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +15 -4
  633. package/rules/ast-grep-rules/rules/no-sql-in-code.yml +14 -3
  634. package/rules/ast-grep-rules/rules/no-string-ref.yml +13 -6
  635. package/rules/ast-grep-rules/rules/no-template-string-concat.yml +21 -0
  636. package/rules/ast-grep-rules/rules/no-testclient-text-without-content.yml +39 -0
  637. package/rules/ast-grep-rules/rules/no-uvicorn-non-import-string.yml +46 -0
  638. package/rules/ast-grep-rules/rules/no-xxe-vulnerable-xml-parser.yml +32 -0
  639. package/rules/ast-grep-rules/rules/no-yield-from-non-iterable.yml +33 -0
  640. package/rules/ast-grep-rules/rules/no-yield-return-outside-function.yml +31 -0
  641. package/rules/ast-grep-rules/rules/only-strings-in-dunder-all.yml +32 -0
  642. package/rules/ast-grep-rules/rules/redundant-unsafe-function.yml +21 -0
  643. package/rules/ast-grep-rules/rules/redundant-usestate-type.yml +15 -0
  644. package/rules/ast-grep-rules/rules/ruby-detect-path-traversal.yml +33 -0
  645. package/rules/ast-grep-rules/rules/rust-2024-let-chain-candidate.yml +56 -0
  646. package/rules/ast-grep-rules/rules/string-concat-in-loop.yml +31 -0
  647. package/rules/ast-grep-rules/rules/ts-array-concat-spread.yml +10 -0
  648. package/rules/ast-grep-rules/rules/ts-array-every-some.yml +22 -0
  649. package/rules/ast-grep-rules/rules/ts-boolean-return-if-else.yml +12 -0
  650. package/rules/ast-grep-rules/rules/ts-defensive-null-guard.yml +12 -0
  651. package/rules/ast-grep-rules/rules/ts-delete-property.yml +10 -0
  652. package/rules/ast-grep-rules/rules/ts-double-negation.yml +10 -0
  653. package/rules/ast-grep-rules/rules/ts-function-constructor.yml +12 -0
  654. package/rules/ast-grep-rules/rules/ts-in-operator-loop.yml +22 -0
  655. package/rules/ast-grep-rules/rules/ts-isnan-check.yml +10 -0
  656. package/rules/ast-grep-rules/rules/ts-json-stringify-parse.yml +17 -0
  657. package/rules/ast-grep-rules/rules/ts-manual-array-contains.yml +25 -0
  658. package/rules/ast-grep-rules/rules/ts-nullish-coalescing-opportunity.yml +20 -0
  659. package/rules/ast-grep-rules/rules/ts-object-hasown-check.yml +9 -0
  660. package/rules/ast-grep-rules/rules/ts-optional-chaining-default.yml +21 -0
  661. package/rules/ast-grep-rules/rules/ts-parseint-no-radix.yml +18 -0
  662. package/rules/ast-grep-rules/rules/ts-pointless-bool-cast.yml +10 -0
  663. package/rules/ast-grep-rules/rules/ts-redundant-filter-map.yml +10 -0
  664. package/rules/ast-grep-rules/rules/ts-slice-copy.yml +11 -0
  665. package/rules/ast-grep-rules/rules/ts-string-split-index.yml +12 -0
  666. package/rules/ast-grep-rules/rules/ts-unnecessary-array-concat.yml +9 -0
  667. package/rules/ast-grep-rules/rules/ts-unnecessary-array-from.yml +9 -0
  668. package/rules/ast-grep-rules/rules/ts-unnecessary-bind.yml +10 -0
  669. package/rules/ast-grep-rules/rules/ts-unnecessary-else-return.yml +19 -0
  670. package/rules/ast-grep-rules/rules/ts-void-zero.yml +10 -0
  671. package/rules/ast-grep-rules/rules/ts-while-index-length.yml +10 -0
  672. package/rules/ast-grep-rules/rules/unlock-in-loop.yml +22 -0
  673. package/rules/ast-grep-rules/rules/unmarshal-tag-is-dash.yml +20 -0
  674. package/rules/ast-grep-rules/rules/unnecessary-react-hook.yml +27 -0
  675. package/rules/ast-grep-rules/rules/waitgroup-done-scope.yml +11 -0
  676. package/rules/ast-grep-rules/rules/weak-rsa-key-js.yml +16 -3
  677. package/rules/ast-grep-rules/rules/weak-rsa-key.yml +15 -2
  678. package/rules/ast-grep-rules/rules-disabled/gorm-unbounded-preload.yml +41 -0
  679. package/rules/ast-grep-rules/rules-disabled/no-method-field-name-collision.yml +42 -0
  680. package/rules/ast-grep-rules/rules-disabled/shadow-err-variable.yml +38 -0
  681. package/rules/rule-catalog.json +1721 -133
  682. package/rules/tree-sitter-queries/python/aws-public-access-policy.yml +68 -0
  683. package/rules/tree-sitter-queries/python/endpoint-204-with-body.yml +62 -0
  684. package/rules/tree-sitter-queries/python/open-invalid-mode.yml +58 -0
  685. package/rules/tree-sitter-queries/python/python-special-method-arity.yml +67 -0
  686. package/rules/tree-sitter-queries/python/python-sql-injection.yml +12 -3
  687. package/rules/tree-sitter-queries/python/python-thread-global-write.yml +6 -0
  688. package/rules/tree-sitter-queries/python/python-unsafe-regex.yml +20 -19
  689. package/rules/tree-sitter-queries/python/slots-assignment-mismatch.yml +73 -0
  690. package/rules/tree-sitter-queries/python/string-format-arity-mismatch.yml +52 -0
  691. package/rules/tree-sitter-queries/{python β†’ python-disabled}/python-print-statement.yml +14 -0
  692. package/scripts/install-selftest.mjs +173 -0
  693. package/scripts/rpc-load-check.mjs +80 -0
  694. package/skills/ast-grep/SKILL.md +26 -6
  695. package/skills/lsp-navigation/SKILL.md +4 -0
  696. package/skills/write-ast-grep-rule/SKILL.md +74 -4
  697. package/dist/clients/dispatch/runners/semgrep.js +0 -197
  698. package/dist/clients/secrets-scanner.js +0 -181
  699. package/dist/clients/semgrep-config.js +0 -157
  700. package/rules/ast-grep-rules/slop-patterns.yml +0 -469
package/README.md CHANGED
@@ -4,63 +4,20 @@
4
4
 
5
5
  # pi-lens
6
6
 
7
- pi-lens focuses on real-time inline code feedback for AI agents.
7
+ pi-lens gives AI coding agents fast, language-aware feedback while they write/edit.
8
8
 
9
9
  ## What It Does
10
10
 
11
- ### At Session Start
12
-
13
- At `session_start`, pi-lens:
14
-
15
- - resets runtime state and diagnostic telemetry
16
- - detects project root, language profile, and active tools
17
- - applies language-aware startup defaults for tool preinstall
18
- - warms caches and optional indexes (with overlap/session guardrails)
19
- - emits missing-tool install hints for detected languages when relevant
20
- - prepends session guidance before the user's prompt so provider bridges keep the real prompt active
21
- - opens `warmFiles` (if configured in `.pi-lens/lsp.json`) to seed lazy-indexing language servers like clangd before the first symbol query
22
-
23
- Startup scan context and language profile are cached in the project snapshot and reused on subsequent `/new` invocations when the project has not changed, avoiding repeated full filesystem walks (~2.5 s saved on medium-to-large projects). Background startup scans are deferred past the interactive session-start path so they do not inflate visible `/new` latency.
24
-
25
- For one-shot print sessions (for example `pi --print ...`), pi-lens auto-uses a quick startup path that skips heavy bootstrap work to reduce startup latency. Override with `PI_LENS_STARTUP_MODE=full|minimal|quick`.
26
-
27
- ### On Write/Edit
28
-
29
- On every `write` and `edit`, pi-lens runs a fast, language-aware pipeline (checks depend on file language, project config, and installed tools):
30
-
31
- 1. **Secrets scan** β€” blocking; aborts the write if credentials are detected
32
- 2. **Auto-format** β€” deferred to `agent_end` by default; queued files are formatted once after all agent tool calls complete. Use `--immediate-format` or global config `format.mode: "immediate"` for per-edit formatting
33
- 3. **Auto-fix** β€” safe autofixes from 6 tools (Biome `check --write`, Ruff `check --fix`, ESLint `--fix`, stylelint `--fix`, sqlfluff `fix`, RuboCop `-a`) applied before analysis
34
- 4. **Edit autopatch** β€” before an `edit` tool call lands, pi-lens silently corrects two classes of `oldText` mismatch: leading tab/space indentation (when the corrected text matches exactly one location) and trailing whitespace stripped by formatters. Both corrections also retarget `newText` so the replacement matches the file's whitespace style
35
- 5. **LSP file sync** β€” opens/updates the file in active language servers
36
- 5. **Dispatch lint** β€” parallel runner groups: LSP diagnostics, tree-sitter structural rules, ast-grep security/correctness rules, fact rules, language-specific linters, experimental Semgrep security scans, similarity detection
37
- 6. **Cascade diagnostics** β€” review-graph impact cascade showing which other files were affected and how diagnostics propagated
38
-
39
- Results are inline and actionable:
40
-
41
- - **Blocking issues** β€” stop progress until fixed
42
- - **Warnings** β€” summarized inline, detail in `/lens-booboo`
43
- - **Health/telemetry** β€” available in `/lens-health`
44
-
45
- ### Agent End
46
-
47
- At `agent_end` (once per user prompt, after all agent tool calls complete):
48
-
49
- - **Deferred formatting** β€” any files queued during the turn are formatted once, synced to LSP, and tracked for read-guard coverage
50
- - **Conservative LSP warning autofix** β€” when `actionableWarnings.autoFix.enabled` is set, applies up to 5 preferred LSP quickfixes for warnings flagged in the turn's actionable warnings report. Each fix is re-validated against the live LSP server at apply time, checked for ambiguity (skipped if multiple eligible actions exist), and gated by a safety check before any write occurs. Changed files are registered with the read-guard and cache manager
51
- - **Summary notification** β€” concise status: how many files were formatted, which changed, and whether any formatter failed
52
-
53
- ### Turn End
54
-
55
- At `turn_end`, pi-lens:
56
-
57
- - summarizes deferred findings (for example duplicates/circulars)
58
- - persists turn findings for next context injection
59
- - updates debt/diagnostic tracking and cleans transient state
60
- - renders a review-graph impact cascade showing affected files and diagnostic propagation
61
- - fires test runs for all modified files (non-blocking); failures are injected into the next turn's context when ready
62
- - manages LSP server lifecycle with a 240s idle timeout (resets when editing resumes)
63
- - **Actionable warnings report** β€” writes `.pi-lens/cache/actionable-warnings.json` with fixable warnings introduced by the current turn (delta-only by default). Merges pipeline `fixable` diagnostics with optional LSP code-action warnings. Uses stable `aw:<hash>` IDs so warnings can be tracked and suppressed across turns. When warnings are present, injects a concise advisory into the agent context instead of blocker language
11
+ - LSP diagnostics and navigation across supported languages
12
+ - Impact cascade diagnostics that show which related files were affected and run LSP diagnostics on them
13
+ - Language-specific linters, type-checkers, and scanners on every write/edit
14
+ - Safe formatting/autofix where tools are configured or confidently detected
15
+ - ast-grep and tree-sitter structural rules for correctness/security smells
16
+ - Agent-facing tools for LSP navigation/diagnostics, AST search/replace,
17
+ diagnostics state, and project intelligence
18
+ - Review-graph intelligence for supported languages via bundled tree-sitter WASMs
19
+ - Read-guard and edit-autopatch support to reduce bad edits
20
+ - Background security/dependency scans for opted-in projects
64
21
 
65
22
  ## Install
66
23
 
@@ -74,335 +31,130 @@ Or from git:
74
31
  pi install git:github.com/apmantza/pi-lens
75
32
  ```
76
33
 
77
- ## Features
78
-
79
- ### LSP Support
80
-
81
- pi-lens includes **37 language server definitions**. LSP is **enabled by default** (`--lsp` or no flag). 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.
82
-
83
- **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.
84
-
85
- **Warm files:** For language servers that index lazily (e.g. clangd), configure `warmFiles` in `.pi-lens/lsp.json` to open entry-point files at session start so the server has AST/index context before the first symbol query:
86
-
87
- ```json
88
- { "warmFiles": ["src/main.cpp", "src/lib.cpp"] }
89
- ```
90
-
91
- **Agent LSP tools:** `lsp_diagnostics` can check one file, a directory, or an explicit `filePaths` batch with bounded concurrency. `lsp_navigation` provides definitions, references, hover, workspace symbols, call hierarchy, rename edits, and `findSymbol` for filtered document-symbol lookup. Key operations:
92
-
93
- - **`rename`** β€” renames a symbol across all references; `apply: true` writes workspace edits to disk with per-file LSP re-sync.
94
- - **`rename_file`** β€” LSP-aware file rename: sends `workspace/willRenameFiles` to collect import-path rewrites, applies them, renames the file on disk, and notifies servers via `workspace/didRenameFiles`. `apply: false` previews the workspace edits without touching the filesystem.
95
- - **`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).
96
- - **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.
97
-
98
- LSP servers for: TypeScript, Deno, Python (pyright/basedpyright + jedi), Go, Rust, Ruby (ruby-lsp + solargraph), PHP, C# (omnisharp), F#, Java, Kotlin, Swift, Dart, Lua, C/C++, Zig, Haskell, Elixir, Gleam, OCaml, Clojure, Terraform, Nix, Bash, Docker, YAML, JSON, HTML, TOML, Prisma, Vue, Svelte, ESLint, CSS.
99
-
100
- ### Formatters
101
-
102
- pi-lens auto-detects and runs **32 formatters** based on project config:
103
-
104
- 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
105
-
106
- Detection rules:
107
-
108
- - **Config-gated**: only runs when project config indicates usage (e.g. `biome.json`, `.prettierrc`, `ruff.toml`)
109
- - **Nearest-wins**: when multiple formatter configs exist at different directory levels, the one closest to the edited file wins
110
- - **Biome-default**: for JS/TS files without Prettier or Biome config, Biome is used as the default formatter
111
- - **Ruff-default**: for Python files without Black config, Ruff format is used when available
112
-
113
- ### Review Graph - Cascade Diagnostics
114
-
115
- pi-lens builds a review graph (`file β†’ symbol β†’ dependency`) during session and uses it at turn end to render an impact cascade: which files were affected by a change and how diagnostics propagated through the dependency graph. Nodes track kind, language, and export status; edges track contains/imports/calls/references.
116
-
117
- ### Read-Before-Edit Guard
118
-
119
- pi-lens enforces a **read-before-edit** policy on all file writes and edits. Before allowing a `write` or `edit` tool call on an existing file, it verifies that the agent has previously read sufficient context:
120
-
121
- - **Zero-read block** β€” blocks any edit to a file not read in the current session. Agent-created files are exempt: when a `write` tool creates a new file, pi-lens registers the written content as a synthetic read, so an immediate follow-up `edit` is not blocked
122
- - **File-modified block** β€” blocks if the file changed on disk since the last read (auto-format, external tool, or a previous edit that was then reformatted)
123
- - **Out-of-range block** β€” blocks if the edit target lines fall outside the ranges previously read, ensuring the agent cannot modify code it hasn't seen
124
- - **Snapshot validation** β€” covered edit ranges are hash-checked against the lines the agent actually saw at read time; stale-range edits are rejected even when range coverage exists. Hash capture covers reads up to 3 000 lines
125
-
126
- Coverage is tracked across multiple reads: two reads of lines 1–100 and 101–200 together satisfy a full-file write. Symbol-expanded reads (small reads silently widened to the enclosing symbol via tree-sitter) count toward coverage at the symbol level. Markdown files generate a warning instead of blocking (edits outside the section-expanded read range are warned, not silently passed). Plain-text (`.txt`) and log (`.log`) files remain fully exempt.
127
-
128
- Override for a single edit: `/lens-allow-edit <path>`
129
-
130
- Configure behavior with `--no-read-guard` to disable entirely, or set mode to `warn` instead of `block`.
131
-
132
- ### Actionable Warnings
133
-
134
- At `turn_end`, pi-lens writes `.pi-lens/cache/actionable-warnings.json` summarizing fixable warnings introduced by the current turn. This powers the optional conservative autofix at `agent_end`.
135
-
136
- **Report contents:**
137
- - Warnings are delta-only by default: only diagnostics in lines touched during the current turn are included. Pass `--lens-actionable-warning-all` to report all warnings regardless of location
138
- - Each warning carries a stable `aw:<hash>` ID derived from file, rule, and message, so suppression state persists across turns in `.pi-lens/cache/actionable-warning-state.json`
139
- - Sources: pipeline `fixable` diagnostics (always included) and LSP code-action warnings when `--lens-actionable-warning-actions` is set
140
- - When warnings are present, a concise advisory is injected into the agent context (no blocker language)
141
-
142
- **Conservative autofix (`agent_end`):**
143
-
144
- When `actionableWarnings.autoFix.enabled` is set in global config (or `--lens-actionable-warning-autofix`), pi-lens applies LSP quickfixes from the report at `agent_end`. Safety gates:
145
- - Re-fetches code actions from the live LSP server at fix time (stale actions are skipped)
146
- - Skips any warning with zero or multiple eligible actions (ambiguity is not resolved)
147
- - Applies only `edit`-kind actions (no command-only or create/delete operations)
148
- - Hard cap of 5 fixes per `agent_end`
149
- - Suppressed warnings are never autofixed
150
-
151
- **Flags:**
152
- - `--lens-actionable-warnings` β€” enable the turn_end report
153
- - `--lens-actionable-warning-actions` β€” include LSP code-action warnings in the report
154
- - `--lens-actionable-warning-autofix` β€” apply conservative fixes at agent_end
155
- - `--lens-actionable-warning-all` β€” report all warnings, not just delta
156
-
157
- ### Opportunistic Read Expansion
158
-
159
- When the agent reads a small slice of a file (≀ 60 lines), pi-lens transparently expands the read to the full enclosing symbol (function, method, or class) using the tree-sitter AST. The agent receives the full symbol as context, and the read guard records symbol-level coverage so edits anywhere within that symbol pass without requiring the agent to have read every line individually. Expansion runs within a 200 ms budget and falls back silently on unsupported file types or parse failures.
160
-
161
- Supported: TypeScript, TSX, JavaScript, JSX, Python, Go, Rust, Ruby, Java, Kotlin, Dart, Elixir, C, C++, C#, PHP, Swift, Lua, OCaml, Zig, Bash.
162
-
163
- ### Fact Rules Pipeline
164
-
165
- Covers JavaScript/TypeScript, Python, Go, Rust, Ruby, Shell, and CMake. A TypeScript AST-based fact-rule engine extracts function-level metrics and evaluates quality and security rules inline. Blocking rules surface immediately at write time; advisory rules are available via `/lens-booboo`.
166
-
167
- ### AST Search and Replace
168
-
169
- `ast_grep_search` and `ast_grep_replace` provide AST-aware pattern matching across 40+ languages via the `sg` CLI. Key capabilities:
170
-
171
- - **Metavariable captures** β€” named captures (`$VAR`, `$$$ARGS`) appear below each match: `$VAR=x $$$ARGS=a,b,c`.
172
- - **Strictness modes** β€” `strictness: "relaxed"` ignores optional punctuation (trailing commas, semicolons) that causes zero matches in `smart` mode. Also supports `ast`, `cst`, `signature`, `template`.
173
- - **Pagination** β€” `skip: N` offsets into large result sets; truncated results include a next-page hint.
174
- - **Stale-preview detection** β€” `ast_grep_replace` re-validates the pattern before writing; returns a clear error if files changed since the preview instead of applying against wrong content.
175
- - **`ast_dump`** β€” dumps the full tree-sitter AST for a source snippet. Use this when a pattern returns zero matches and the correct node kind or field name is unknown.
176
-
177
- ### Tree-sitter Rules
178
-
179
- Structural rules organized by language in `rules/tree-sitter-queries/<language>/`. Rules marked **πŸ”΄** block the agent inline at write time (only for lines in the current edit); others are advisory.
180
-
181
- **Suppressing a finding:** add `// pi-lens-ignore: rule-id` on the flagged line or the line above (JS/TS), or `# pi-lens-ignore: rule-id` for Python/Ruby/Shell. This suppresses that specific rule at that location only.
182
-
183
- **Bring your own rules:** drop YAML query files into `rules/tree-sitter-queries/<language>/` in your project β€” pi-lens merges them with the built-ins on session start. The schema, predicates (`eq`, `match`, `any-of`), and `inline_tier` (`blocking` | `warning` | `review`) are documented in [`docs/custom-rules.md`](docs/custom-rules.md). A `rules/tree-sitter-queries/rule-schema.json` JSON Schema is bundled for editor autocomplete via `.vscode/settings.json`.
184
-
185
- ### Ast-Grep Rules
186
-
187
- Pattern-based structural rules in `rules/ast-grep-rules/` across JS, TS, and Python β€” covers security (eval, hardcoded secrets, insecure randomness, dangerous DOM sinks), correctness (strict equality, constant conditions, duplicate keys), code smells (nested ternaries, long parameter lists, redundant state), and agent stubs (unimplemented bodies, raise NotImplementedError).
188
-
189
- **Bring your own rules:** drop YAML rule files into `rules/ast-grep-rules/rules/<id>.yml` in your project β€” pi-lens merges them with the built-ins; same `id` as a built-in overrides it. The supported subset of ast-grep's rule schema (the NAPI runner does not support `inside` / `follows` / `precedes` / `stopBy` / `field` / `nthChild` / `constraints` β€” use a tree-sitter rule when you need relational context) is documented in [`docs/custom-rules.md`](docs/custom-rules.md), with a `rules/ast-grep-rules/rule-schema.json` JSON Schema for editor autocomplete.
190
-
191
- ### Semgrep CLI Integration (Experimental)
192
-
193
- pi-lens can run the locally installed `semgrep` CLI as an optional dispatch runner for security-focused findings. Semgrep diagnostics are normalized into the same pi-lens `Diagnostic` model as LSP, tree-sitter, ast-grep, and linters: high-signal security findings can become blocking, while other findings remain warnings for `/lens-booboo`/history.
194
-
195
- Activation is intentionally gated:
196
-
197
- - pi-lens **does not auto-install Semgrep**.
198
- - A local `.semgrep.yml`, `.semgrep.yaml`, `semgrep.yml`, or `semgrep.yaml` enables the runner when the `semgrep` CLI is available.
199
- - Without a local config, Semgrep stays skipped unless explicitly configured with `--lens-semgrep --lens-semgrep-config <auto|p/pack|path>` or `/lens-semgrep enable --config <auto|p/pack|path>`.
200
- - Local `.semgrep.yml` scans do not require a Semgrep token. Semgrep AppSec/Pro/managed configurations may require `semgrep login` or `SEMGREP_APP_TOKEN`.
201
- - pi-lens passes `--metrics=off` for dispatch scans.
202
-
203
- Commands:
204
-
205
- - `/lens-semgrep status` β€” show CLI availability, discovered local config, persisted pi-lens config, and effective dispatch state
206
- - `/lens-semgrep init` β€” create a starter `.semgrep.yml` with a blocking `eval(...)` rule and enable Semgrep dispatch
207
- - `/lens-semgrep enable [--config <auto|p/pack|path>]` β€” persist Semgrep dispatch activation in `.pi-lens/semgrep.json`
208
- - `/lens-semgrep disable` β€” persistently disable Semgrep dispatch for this project
209
- - `/lens-semgrep clear` β€” remove `.pi-lens/semgrep.json` and return to local-config auto-discovery
210
-
211
- Local rules can opt into pi-lens blocking semantics with metadata:
212
-
213
- ```yaml
214
- metadata:
215
- pi-lens:
216
- semantic: blocking
217
- defect_class: injection
218
- confidence: high
219
- ```
220
-
221
- ## Run
222
-
223
- ```bash
224
- # Standard mode (LSP enabled by default)
225
- pi
226
-
227
- # Optional switches
228
- pi --no-lens # Start pi-lens disabled for this session; /lens-toggle can re-enable
229
- pi --no-lens-context # Disable automatic context injection only (tools/LSP/read-guard/format stay on); /lens-context-toggle
230
- pi --no-lsp # Disable unified LSP diagnostics
231
- pi --no-autoformat # Skip auto-formatting entirely
232
- pi --immediate-format # Format immediately after each edit instead of deferring to agent_end
233
- pi --no-autofix # Skip auto-fix (Biome, Ruff, ESLint, stylelint, sqlfluff, RuboCop)
234
- pi --no-tests # Skip test runner
235
- pi --no-delta # Disable delta mode (show all diagnostics, not just new ones)
236
- pi --lens-guard # Block git commit/push when unresolved blockers exist (experimental)
237
- pi --lens-semgrep # Enable Semgrep dispatch when a local/configured Semgrep config exists
238
- pi --lens-semgrep-config p/ci # Explicit Semgrep config for dispatch (requires --lens-semgrep)
239
- ```
240
-
241
- ## Global Config
242
-
243
- pi-lens reads optional user preferences from `~/.pi-lens/config.json` (`%USERPROFILE%\\.pi-lens\\config.json` on Windows). Unknown keys are ignored, and missing or invalid config falls back to defaults.
244
-
245
- Hide the diagnostics widget by default, run formatting immediately after write/edit tool calls instead of at `agent_end`, and enable actionable warnings with conservative autofix:
246
-
247
- ```json
248
- {
249
- "widget": {
250
- "visible": false
251
- },
252
- "format": {
253
- "enabled": true,
254
- "mode": "immediate"
255
- },
256
- "actionableWarnings": {
257
- "enabled": true,
258
- "includeLspCodeActions": true,
259
- "deltaOnly": true,
260
- "autoFix": {
261
- "enabled": false,
262
- "maxFixes": 5
263
- }
264
- },
265
- "contextInjection": {
266
- "enabled": false
267
- }
268
- }
269
- ```
270
-
271
- `format.mode` can be `"deferred"` (default) or `"immediate"`. Set `format.enabled` to `false` to match `--no-autoformat`. `/lens-widget-toggle` still works as a session-only override.
272
-
273
- `contextInjection.enabled` (default `true`) controls whether pi-lens prepends automatic findings β€” session-start guidance, turn-end findings, and test findings β€” into the next model turn. Set it to `false` (or use `--no-lens-context` / `PI_LENS_NO_CONTEXT_INJECTION=1` / `/lens-context-toggle`) to keep tools, LSP, read-guard, and formatting running while avoiding the prompt-cache invalidation that injected messages cause in long, cache-sensitive sessions. Findings are still cached, so `lens_diagnostics` and `/lens-health` keep working.
274
-
275
- `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`).
276
-
277
- ## Environment Variables
278
-
279
- - `PILENS_DATA_DIR` β€” redirect per-project state (scanner caches,
280
- turn-state.json) to a base directory outside the project. By default
281
- pi-lens writes to `~/.pi-lens/projects/<sanitized-cwd-slug>/`. The one
282
- exception is a legacy `<cwd>/.pi-lens/` directory: if that already exists
283
- in the project, pi-lens continues to use it. Set `PILENS_DATA_DIR` to
284
- permanently override both cases and write to
285
- `<PILENS_DATA_DIR>/<sanitized-cwd-slug>/` instead. Particularly useful
286
- when running pi with a local model server (llama.cpp, Ollama, etc.) that
287
- monitors the project directory β€” cache-file churn inside the workspace can
288
- disrupt the model's context scoring. Tool binaries always live in
289
- `~/.pi-lens/bin/` regardless.
290
- - `PI_LENS_STARTUP_MODE` β€” `full` | `minimal` | `quick`. Override the
291
- auto-selected startup path. One-shot `pi --print` sessions auto-use `quick`
292
- to reduce latency.
293
- - `PI_LENS_NO_CONTEXT_INJECTION` β€” set to `1` to disable automatic context
294
- injection (equivalent to `--no-lens-context` / `contextInjection.enabled:
295
- false`). Tools, LSP, read-guard, and formatting stay active; findings are
296
- still cached for `lens_diagnostics` and `/lens-health`.
297
-
298
- ## Key Commands
299
-
300
- - `/lens-toggle` β€” toggle pi-lens on/off for the current session without restarting
301
- - `/lens-context-toggle` β€” toggle automatic context injection on/off for the session (tools/LSP/read-guard/formatting stay active)
302
- - `/lens-widget-toggle` β€” show/hide the pi-lens diagnostics widget below the editor
303
- - `/lens-booboo` β€” full quality report for current project state
304
- - `/lens-health` β€” runtime health, latency, and diagnostic telemetry
305
- - `/lens-allow-edit <path>` β€” override the read-before-edit guard for a single edit
306
- - `/lens-tools` β€” tool installation status: globally installed, auto-installed, or npx fallback
307
- - `/lens-tdi` β€” Technical Debt Index (TDI) and project health trend
308
- - `/lens-semgrep` β€” manage experimental Semgrep dispatch (`status`, `init`, `enable`, `disable`, `clear`)
309
-
310
- ## Language Coverage
311
-
312
- pi-lens supports **36+ languages** through dispatch runners and LSP integration.
313
-
314
- Formatting uses a single selected formatter per file: explicit project config wins, otherwise pi-lens uses a smart default where supported, and config-first ecosystems do not autoformat without config.
315
-
316
- Dispatch is diagnostics-oriented: automatic formatting and safe autofix happen in the post-write pipeline rather than through dispatch format-check runners.
317
-
318
- | Language | LSP | Dispatch Runners | Formatter |
319
- | --------------------- | --- | -------------------------------------------------------------------------------------------------------------- | ----------------------- |
320
- | JavaScript/TypeScript | βœ“ | lsp, ts-lsp, biome-check-json, tree-sitter, ast-grep-napi, type-safety, similarity, fact-rules, eslint, oxlint | biome, prettier |
321
- | Python | βœ“ | lsp, pyright, ruff-lint, tree-sitter, python-slop | ruff, black |
322
- | Go | βœ“ | lsp, go-vet, golangci-lint, tree-sitter | gofmt |
323
- | Rust | βœ“ | lsp, rust-clippy, tree-sitter | rustfmt |
324
- | Ruby | βœ“ | lsp, rubocop, tree-sitter | rubocop, standardrb |
325
- | C/C++ | βœ“ | lsp, cpp-check, tree-sitter | clang-format |
326
- | Shell | βœ“ | lsp, shellcheck | shfmt |
327
- | Fish | βœ“ | lsp, fish-indent | fish_indent |
328
- | CSS/SCSS/Less | βœ“ | lsp, stylelint | biome, prettier |
329
- | HTML | βœ“ | lsp, htmlhint | prettier |
330
- | YAML | βœ“ | lsp, yamllint, actionlint (GitHub workflows) | prettier |
331
- | JSON | βœ“ | lsp | biome, prettier |
332
- | Svelte | βœ“ | lsp | β€” |
333
- | Vue | βœ“ | lsp | β€” |
334
- | SQL | β€” | sqlfluff | sqlfluff |
335
- | Markdown | β€” | spellcheck, markdownlint, vale | prettier |
336
- | Docker | βœ“ | lsp, hadolint | β€” |
337
- | PHP | βœ“ | lsp, php-lint, phpstan | php-cs-fixer |
338
- | PowerShell | βœ“ | lsp, psscriptanalyzer | psscriptanalyzer-format |
339
- | Prisma | βœ“ | lsp, prisma-validate | β€” |
340
- | C# | βœ“ | lsp, dotnet-build | csharpier |
341
- | F# | βœ“ | lsp | fantomas |
342
- | Java | βœ“ | lsp, javac | google-java-format |
343
- | Kotlin | βœ“ | lsp, ktlint, detekt | ktlint |
344
- | Swift | βœ“ | lsp, swiftlint | swiftformat |
345
- | Dart | βœ“ | lsp, dart-analyze | dart format |
346
- | Lua | βœ“ | lsp | stylua |
347
- | Zig | βœ“ | lsp, zig-check | zig fmt |
348
- | Haskell | βœ“ | lsp | ormolu |
349
- | Elixir | βœ“ | lsp, elixir-check, credo | mix format |
350
- | Gleam | βœ“ | lsp, gleam-check | gleam format |
351
- | OCaml | βœ“ | lsp | ocamlformat |
352
- | Clojure | βœ“ | lsp | cljfmt |
353
- | Terraform | βœ“ | lsp, tflint | terraform fmt |
354
- | Nix | βœ“ | lsp | nixfmt |
355
- | TOML | βœ“ | lsp, taplo | taplo |
356
- | CMake | βœ“ | lsp | cmake-format |
357
-
358
- ## Dependencies
359
-
360
- Auto-install behavior depends on gate type:
361
-
362
- - **Config-gated**: installs only when project config/deps indicate usage
363
- - **Flow/language-gated**: installs when the runtime path needs it for the current file/session flow
364
- - **Operational prewarm**: installs during session warm scans / turn-end analysis paths
365
- - **GitHub release**: platform-specific binary downloaded from GitHub releases to `~/.pi-lens/bin/`
366
-
367
- | Tool | Purpose | Auto-installed | Gate |
368
- | ----------------------------------- | -------------------------------- | -------------- | ---------------------------------- |
369
- | `@biomejs/biome` | JS/TS lint/format/autofix | Yes | Config-gated |
370
- | `prettier` | Formatting fallback | Yes | Config-gated |
371
- | `yamllint` | YAML linting | Yes | Config-gated |
372
- | `actionlint` | GitHub Actions workflow linting | Yes | GitHub release |
373
- | `sqlfluff` | SQL linting/formatting | Yes | Config-gated |
374
- | `ruff` | Python lint/format/autofix | Yes | Language-default + flow-gated |
375
- | `typescript-language-server` | Unified LSP diagnostics | Yes | Language-default |
376
- | `typescript` | TypeScript compiler | Yes | Language-default |
377
- | `pyright` | Python type diagnostics fallback | Yes | Flow/language-gated |
378
- | `@ast-grep/cli` (sg) | AST scans/search/replace | Yes | Operational prewarm |
379
- | `knip` | Dead code analysis | Yes | Operational prewarm + config-gated |
380
- | `jscpd` | Duplicate code detection | Yes | Operational prewarm + config-gated |
381
- | `madge` | Circular dependency analysis | Yes | Turn-end analysis flow |
382
- | `mypy` | Python type checking | Yes | Flow-gated |
383
- | `stylelint` | CSS/SCSS/Less linting | Yes | Config-gated |
384
- | `markdownlint-cli2` | Markdown linting | Yes | Config-gated |
385
- | `shellcheck` | Shell script linting | Yes | GitHub release |
386
- | `shfmt` | Shell script formatting | Yes | GitHub release |
387
- | `rust-analyzer` | Rust LSP | Yes | GitHub release |
388
- | `golangci-lint` | Go linting | Yes | GitHub release |
389
- | `hadolint` | Dockerfile linting | Yes | GitHub release |
390
- | `ktlint` | Kotlin linting | Yes | GitHub release |
391
- | `tflint` | Terraform linting | Yes | GitHub release |
392
- | `taplo` | TOML linting/formatting | Yes | GitHub release |
393
- | `terraform-ls` | Terraform LSP | Yes | GitHub release |
394
- | `htmlhint` | HTML linting | Yes | Config-gated |
395
- | `@prisma/language-server` | Prisma LSP | Yes | Flow-gated |
396
- | `dockerfile-language-server-nodejs` | Dockerfile LSP | Yes | Flow-gated |
397
- | `intelephense` | PHP LSP | Yes | Flow-gated |
398
- | `bash-language-server` | Bash LSP | Yes | Language-default |
399
- | `yaml-language-server` | YAML LSP | Yes | Language-default |
400
- | `vscode-langservers-extracted` | JSON/ESLint/CSS/HTML LSP | Yes | Language-default |
401
- | `vscode-css-languageserver` | CSS LSP | Yes | Language-default |
402
- | `vscode-html-languageserver-bin` | HTML LSP | Yes | Language-default |
403
- | `svelte-language-server` | Svelte LSP | Yes | Flow-gated |
404
- | `@vue/language-server` | Vue LSP | Yes | Flow-gated |
405
- | `semgrep` | Experimental security dispatch | Manual | Local config / explicit opt-in |
406
- | `psscriptanalyzer` | PowerShell linting | Manual | β€” |
407
-
408
- Additional language servers (gopls, ruby-lsp, solargraph, etc.) are auto-detected from PATH or installed via native package managers (`go install`, `gem install`) when their language is detected.
34
+ ## Documentation
35
+
36
+ - [Agent tools](docs/agent-tools.md) β€” pi tool names, scopes, and arguments
37
+ - [Usage guide](docs/usage.md) β€” lifecycle, tool behavior, MCP notes, and
38
+ troubleshooting
39
+ - [Features](docs/features.md) β€” detailed feature reference
40
+ - [Tools and commands](docs/tools.md) β€” runtime flags and slash commands
41
+ - [Configuration](docs/globalconfig.md) β€” global and project config files
42
+ - [Environment variables](docs/env_variables.md) β€” common env vars and full
43
+ reference link
44
+ - [Language coverage](docs/language-coverage.md) β€” supported languages, runners,
45
+ and formatters
46
+ - [Dependencies](docs/dependencies.md) β€” auto-install policy and external tools
47
+ - [Custom rules](docs/custom-rules.md) β€” project ast-grep and tree-sitter rules
48
+
49
+ ## Contributing
50
+
51
+ See [`CONTRIBUTING.md`](CONTRIBUTING.md) for the development workflow, runner,
52
+ LSP, formatter, and rule checklists, and issue/PR conventions.
53
+
54
+ Security issues should be reported privately; see [`SECURITY.md`](SECURITY.md).
55
+ pi-lens is released under the [MIT License](LICENSE).
56
+
57
+ ## Contributors
58
+
59
+ Thanks goes to these wonderful people:
60
+
61
+ <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
62
+ <!-- prettier-ignore-start -->
63
+ <!-- markdownlint-disable -->
64
+ <table>
65
+ <tbody>
66
+ <tr>
67
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/wastedC"><img src="https://avatars.githubusercontent.com/u/917574?v=4" width="100px;" alt=""/><br /><sub><b>wastedC</b></sub></a><br /><a href="#code-wastedC" title="Code">πŸ’»</a> <a href="#ideas-wastedC" title="Ideas & Planning">πŸ€”</a> <a href="#maintenance-wastedC" title="Maintenance">🚧</a> <a href="#review-wastedC" title="Reviewed Pull Requests">πŸ‘€</a></td>
68
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/apmantza"><img src="https://avatars.githubusercontent.com/u/247365598?v=4" width="100px;" alt=""/><br /><sub><b>Apostolos Mantzaris</b></sub></a><br /><a href="#code-apmantza" title="Code">πŸ’»</a> <a href="#doc-apmantza" title="Documentation">πŸ“–</a> <a href="#ideas-apmantza" title="Ideas & Planning">πŸ€”</a> <a href="#maintenance-apmantza" title="Maintenance">🚧</a> <a href="#review-apmantza" title="Reviewed Pull Requests">πŸ‘€</a></td>
69
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/apps/dependabot"><img src="https://avatars.githubusercontent.com/in/29110?v=4" width="100px;" alt=""/><br /><sub><b>Dependabot</b></sub></a><br /><a href="#maintenance-dependabot[bot]" title="Maintenance">🚧</a></td>
70
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/silvanshade"><img src="https://avatars.githubusercontent.com/u/11022302?v=4" width="100px;" alt=""/><br /><sub><b>silvanshade</b></sub></a><br /><a href="#code-silvanshade" title="Code">πŸ’»</a></td>
71
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/anh-chu"><img src="https://avatars.githubusercontent.com/u/34973633?v=4" width="100px;" alt=""/><br /><sub><b>Anh Chu</b></sub></a><br /><a href="#code-anh-chu" title="Code">πŸ’»</a></td>
72
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/Istar-Eldritch"><img src="https://avatars.githubusercontent.com/u/3746468?v=4" width="100px;" alt=""/><br /><sub><b>Ruben Paz</b></sub></a><br /><a href="#code-Istar-Eldritch" title="Code">πŸ’»</a> <a href="#bug-Istar-Eldritch" title="Bug reports">πŸ›</a></td>
73
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/tifandotme"><img src="https://avatars.githubusercontent.com/u/33323177?v=4" width="100px;" alt=""/><br /><sub><b>Tifan Dwi Avianto</b></sub></a><br /><a href="#code-tifandotme" title="Code">πŸ’»</a></td>
74
+ </tr>
75
+ <tr>
76
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/ricardoraposo"><img src="https://avatars.githubusercontent.com/u/50217712?v=4" width="100px;" alt=""/><br /><sub><b>Ricardo Raposo</b></sub></a><br /><a href="#code-ricardoraposo" title="Code">πŸ’»</a></td>
77
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/cjunxiang"><img src="https://avatars.githubusercontent.com/u/26619858?v=4" width="100px;" alt=""/><br /><sub><b>C.Junxiang</b></sub></a><br /><a href="#code-cjunxiang" title="Code">πŸ’»</a> <a href="#bug-cjunxiang" title="Bug reports">πŸ›</a></td>
78
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/chenxin-yan"><img src="https://avatars.githubusercontent.com/u/71162231?v=4" width="100px;" alt=""/><br /><sub><b>Chenxin Yan</b></sub></a><br /><a href="#code-chenxin-yan" title="Code">πŸ’»</a> <a href="#doc-chenxin-yan" title="Documentation">πŸ“–</a> <a href="#bug-chenxin-yan" title="Bug reports">πŸ›</a></td>
79
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/feoh"><img src="https://avatars.githubusercontent.com/u/330070?v=4" width="100px;" alt=""/><br /><sub><b>Chris Patti</b></sub></a><br /><a href="#code-feoh" title="Code">πŸ’»</a> <a href="#bug-feoh" title="Bug reports">πŸ›</a></td>
80
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/fractiunate"><img src="https://avatars.githubusercontent.com/u/78024279?v=4" width="100px;" alt=""/><br /><sub><b>Fractiunate // David RahΓ€user</b></sub></a><br /><a href="#code-fractiunate" title="Code">πŸ’»</a></td>
81
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/bloodf"><img src="https://avatars.githubusercontent.com/u/1626923?v=4" width="100px;" alt=""/><br /><sub><b>Heitor Ramon Ribeiro</b></sub></a><br /><a href="#code-bloodf" title="Code">πŸ’»</a></td>
82
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/JayceFreeman"><img src="https://avatars.githubusercontent.com/u/92962110?v=4" width="100px;" alt=""/><br /><sub><b>JayceFreeman</b></sub></a><br /><a href="#code-JayceFreeman" title="Code">πŸ’»</a></td>
83
+ </tr>
84
+ <tr>
85
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/shaDmx"><img src="https://avatars.githubusercontent.com/u/91132641?v=4" width="100px;" alt=""/><br /><sub><b>Max L.</b></sub></a><br /><a href="#code-shaDmx" title="Code">πŸ’»</a></td>
86
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/Roman-Galeev"><img src="https://avatars.githubusercontent.com/u/40388226?v=4" width="100px;" alt=""/><br /><sub><b>Roman Galeev</b></sub></a><br /><a href="#code-Roman-Galeev" title="Code">πŸ’»</a></td>
87
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/StartupBros"><img src="https://avatars.githubusercontent.com/u/16693591?v=4" width="100px;" alt=""/><br /><sub><b>Will Mitchell</b></sub></a><br /><a href="#code-StartupBros" title="Code">πŸ’»</a></td>
88
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/amit-gshe"><img src="https://avatars.githubusercontent.com/u/7383028?v=4" width="100px;" alt=""/><br /><sub><b>Amit</b></sub></a><br /><a href="#code-amit-gshe" title="Code">πŸ’»</a> <a href="#bug-amit-gshe" title="Bug reports">πŸ›</a></td>
89
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/flowing-abyss"><img src="https://avatars.githubusercontent.com/u/98622217?v=4" width="100px;" alt=""/><br /><sub><b>flowing-abyss</b></sub></a><br /><a href="#code-flowing-abyss" title="Code">πŸ’»</a></td>
90
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/jerryfan"><img src="https://avatars.githubusercontent.com/u/2540814?v=4" width="100px;" alt=""/><br /><sub><b>jerryfan</b></sub></a><br /><a href="#code-jerryfan" title="Code">πŸ’»</a></td>
91
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/loss-and-quick"><img src="https://avatars.githubusercontent.com/u/39405619?v=4" width="100px;" alt=""/><br /><sub><b>minicx</b></sub></a><br /><a href="#code-loss-and-quick" title="Code">πŸ’»</a></td>
92
+ </tr>
93
+ <tr>
94
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/spyrosbazios"><img src="https://avatars.githubusercontent.com/u/37960233?v=4" width="100px;" alt=""/><br /><sub><b>spyrosbazios</b></sub></a><br /><a href="#code-spyrosbazios" title="Code">πŸ’»</a></td>
95
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/trvon"><img src="https://avatars.githubusercontent.com/u/6031322?v=4" width="100px;" alt=""/><br /><sub><b>Trevon</b></sub></a><br /><a href="#code-trvon" title="Code">πŸ’»</a></td>
96
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/carolitascl"><img src="https://avatars.githubusercontent.com/u/26188349?v=4" width="100px;" alt=""/><br /><sub><b>Carolina</b></sub></a><br /><a href="#bug-carolitascl" title="Bug reports">πŸ›</a></td>
97
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/leakedby"><img src="https://avatars.githubusercontent.com/u/4213260?v=4" width="100px;" alt=""/><br /><sub><b>LeakedBy</b></sub></a><br /><a href="#bug-leakedby" title="Bug reports">πŸ›</a></td>
98
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/mdbooth"><img src="https://avatars.githubusercontent.com/u/1318691?v=4" width="100px;" alt=""/><br /><sub><b>Matthew Booth</b></sub></a><br /><a href="#bug-mdbooth" title="Bug reports">πŸ›</a></td>
99
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/Wiedzmin89"><img src="https://avatars.githubusercontent.com/u/61706855?v=4" width="100px;" alt=""/><br /><sub><b>Wiedzmin89</b></sub></a><br /><a href="#ideas-Wiedzmin89" title="Ideas & Planning">πŸ€”</a></td>
100
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/grodingo"><img src="https://avatars.githubusercontent.com/u/244184972?v=4" width="100px;" alt=""/><br /><sub><b>Virgile</b></sub></a><br /><a href="#bug-grodingo" title="Bug reports">πŸ›</a></td>
101
+ </tr>
102
+ <tr>
103
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/finnvyrn"><img src="https://avatars.githubusercontent.com/u/90801772?v=4" width="100px;" alt=""/><br /><sub><b>Finn</b></sub></a><br /><a href="#ideas-finnvyrn" title="Ideas & Planning">πŸ€”</a></td>
104
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/ywh555hhh"><img src="https://avatars.githubusercontent.com/u/121592812?v=4" width="100px;" alt=""/><br /><sub><b>Wayne E</b></sub></a><br /><a href="#bug-ywh555hhh" title="Bug reports">πŸ›</a></td>
105
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/RimuruW"><img src="https://avatars.githubusercontent.com/u/59136309?v=4" width="100px;" alt=""/><br /><sub><b>RimuruW</b></sub></a><br /><a href="#ideas-RimuruW" title="Ideas & Planning">πŸ€”</a></td>
106
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/Bjynt"><img src="https://avatars.githubusercontent.com/u/22177300?v=4" width="100px;" alt=""/><br /><sub><b>Bjynt</b></sub></a><br /><a href="#bug-Bjynt" title="Bug reports">πŸ›</a> <a href="#ideas-Bjynt" title="Ideas & Planning">πŸ€”</a></td>
107
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/pvtri96"><img src="https://avatars.githubusercontent.com/u/28696888?v=4" width="100px;" alt=""/><br /><sub><b>Tri Van Pham</b></sub></a><br /><a href="#bug-pvtri96" title="Bug reports">πŸ›</a></td>
108
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/BingWuJ"><img src="https://avatars.githubusercontent.com/u/117666511?v=4" width="100px;" alt=""/><br /><sub><b>BingWuJ</b></sub></a><br /><a href="#bug-BingWuJ" title="Bug reports">πŸ›</a></td>
109
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/tackleberrybey"><img src="https://avatars.githubusercontent.com/u/156954032?v=4" width="100px;" alt=""/><br /><sub><b>tackleberrybey</b></sub></a><br /><a href="#bug-tackleberrybey" title="Bug reports">πŸ›</a></td>
110
+ </tr>
111
+ <tr>
112
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/TaterDoge"><img src="https://avatars.githubusercontent.com/u/121467933?v=4" width="100px;" alt=""/><br /><sub><b>Mariann Abshire</b></sub></a><br /><a href="#bug-TaterDoge" title="Bug reports">πŸ›</a></td>
113
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/ProbabilityEngineer"><img src="https://avatars.githubusercontent.com/u/38498804?v=4" width="100px;" alt=""/><br /><sub><b>ProbabilityEngineer</b></sub></a><br /><a href="#ideas-ProbabilityEngineer" title="Ideas & Planning">πŸ€”</a></td>
114
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/LeonardoRick"><img src="https://avatars.githubusercontent.com/u/17517057?v=4" width="100px;" alt=""/><br /><sub><b>Leonardo Rick</b></sub></a><br /><a href="#bug-LeonardoRick" title="Bug reports">πŸ›</a> <a href="#ideas-LeonardoRick" title="Ideas & Planning">πŸ€”</a></td>
115
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/kenbanks-peng"><img src="https://avatars.githubusercontent.com/u/26904200?v=4" width="100px;" alt=""/><br /><sub><b>Ken Banks</b></sub></a><br /><a href="#bug-kenbanks-peng" title="Bug reports">πŸ›</a></td>
116
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/rstacruz"><img src="https://avatars.githubusercontent.com/u/74385?v=4" width="100px;" alt=""/><br /><sub><b>Rico Sta. Cruz</b></sub></a><br /><a href="#ideas-rstacruz" title="Ideas & Planning">πŸ€”</a></td>
117
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/acidnik"><img src="https://avatars.githubusercontent.com/u/1227955?v=4" width="100px;" alt=""/><br /><sub><b>Nikita Bilous</b></sub></a><br /><a href="#bug-acidnik" title="Bug reports">πŸ›</a></td>
118
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/av1155"><img src="https://avatars.githubusercontent.com/u/117413846?v=4" width="100px;" alt=""/><br /><sub><b>Andrea Arturo Venti Fuentes</b></sub></a><br /><a href="#bug-av1155" title="Bug reports">πŸ›</a></td>
119
+ </tr>
120
+ <tr>
121
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/dacec354"><img src="https://avatars.githubusercontent.com/u/90093629?v=4" width="100px;" alt=""/><br /><sub><b>dacec354</b></sub></a><br /><a href="#bug-dacec354" title="Bug reports">πŸ›</a></td>
122
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/xuli500177"><img src="https://avatars.githubusercontent.com/u/62830942?v=4" width="100px;" alt=""/><br /><sub><b>Xu Yili</b></sub></a><br /><a href="#bug-xuli500177" title="Bug reports">πŸ›</a></td>
123
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/nodnarbnitram"><img src="https://avatars.githubusercontent.com/u/44812862?v=4" width="100px;" alt=""/><br /><sub><b>Brandon Martin</b></sub></a><br /><a href="#bug-nodnarbnitram" title="Bug reports">πŸ›</a></td>
124
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/alpertarhan"><img src="https://avatars.githubusercontent.com/u/50966980?v=4" width="100px;" alt=""/><br /><sub><b>Alper Tarhan</b></sub></a><br /><a href="#bug-alpertarhan" title="Bug reports">πŸ›</a></td>
125
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/asolopovas"><img src="https://avatars.githubusercontent.com/u/6893216?v=4" width="100px;" alt=""/><br /><sub><b>Andrius Solopovas</b></sub></a><br /><a href="#bug-asolopovas" title="Bug reports">πŸ›</a></td>
126
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/GrahamJenkins"><img src="https://avatars.githubusercontent.com/u/6607975?v=4" width="100px;" alt=""/><br /><sub><b>Graham Jenkins</b></sub></a><br /><a href="#bug-GrahamJenkins" title="Bug reports">πŸ›</a></td>
127
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/wings1848"><img src="https://avatars.githubusercontent.com/u/120104016?v=4" width="100px;" alt=""/><br /><sub><b>Wings Butterfly</b></sub></a><br /><a href="#bug-wings1848" title="Bug reports">πŸ›</a></td>
128
+ </tr>
129
+ <tr>
130
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/JohannesKlauss"><img src="https://avatars.githubusercontent.com/u/6214415?v=4" width="100px;" alt=""/><br /><sub><b>Johannes Klauss</b></sub></a><br /><a href="#ideas-JohannesKlauss" title="Ideas & Planning">πŸ€”</a></td>
131
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/tan-yong-sheng"><img src="https://avatars.githubusercontent.com/u/64836390?v=4" width="100px;" alt=""/><br /><sub><b>Tan Yong Sheng</b></sub></a><br /><a href="#ideas-tan-yong-sheng" title="Ideas & Planning">πŸ€”</a></td>
132
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/fmatray"><img src="https://avatars.githubusercontent.com/u/8267716?v=4" width="100px;" alt=""/><br /><sub><b>FrΓ©dΓ©ric</b></sub></a><br /><a href="#bug-fmatray" title="Bug reports">πŸ›</a></td>
133
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/fuentesjr"><img src="https://avatars.githubusercontent.com/u/9240?v=4" width="100px;" alt=""/><br /><sub><b>Salvador Fuentes Jr</b></sub></a><br /><a href="#bug-fuentesjr" title="Bug reports">πŸ›</a></td>
134
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/Viterkim"><img src="https://avatars.githubusercontent.com/u/17838985?v=4" width="100px;" alt=""/><br /><sub><b>Viktor</b></sub></a><br /><a href="#bug-Viterkim" title="Bug reports">πŸ›</a></td>
135
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/ortonomy"><img src="https://avatars.githubusercontent.com/u/6688676?v=4" width="100px;" alt=""/><br /><sub><b>Gregory Orton</b></sub></a><br /><a href="#bug-ortonomy" title="Bug reports">πŸ›</a></td>
136
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/jimallen"><img src="https://avatars.githubusercontent.com/u/868773?v=4" width="100px;" alt=""/><br /><sub><b>Jim Allen</b></sub></a><br /><a href="#bug-jimallen" title="Bug reports">πŸ›</a></td>
137
+ </tr>
138
+ <tr>
139
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/quantfiction"><img src="https://avatars.githubusercontent.com/u/49965454?v=4" width="100px;" alt=""/><br /><sub><b>quantfiction</b></sub></a><br /><a href="#bug-quantfiction" title="Bug reports">πŸ›</a></td>
140
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/Artawower"><img src="https://avatars.githubusercontent.com/u/16963833?v=4" width="100px;" alt=""/><br /><sub><b>Art</b></sub></a><br /><a href="#bug-Artawower" title="Bug reports">πŸ›</a></td>
141
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/chozandrias76"><img src="https://avatars.githubusercontent.com/u/2087677?v=4" width="100px;" alt=""/><br /><sub><b>Colin Swenson-Healey</b></sub></a><br /><a href="#bug-chozandrias76" title="Bug reports">πŸ›</a></td>
142
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/JustlyAI"><img src="https://avatars.githubusercontent.com/u/12634140?v=4" width="100px;" alt=""/><br /><sub><b>Laurent Wiesel</b></sub></a><br /><a href="#bug-JustlyAI" title="Bug reports">πŸ›</a></td>
143
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/stark-bit"><img src="https://avatars.githubusercontent.com/u/44064758?v=4" width="100px;" alt=""/><br /><sub><b>Rei Starks</b></sub></a><br /><a href="#bug-stark-bit" title="Bug reports">πŸ›</a></td>
144
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/robertoecf"><img src="https://avatars.githubusercontent.com/u/54923863?v=4" width="100px;" alt=""/><br /><sub><b>Roberto Freitas</b></sub></a><br /><a href="#bug-robertoecf" title="Bug reports">πŸ›</a></td>
145
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/tmttodd"><img src="https://avatars.githubusercontent.com/u/160077416?v=4" width="100px;" alt=""/><br /><sub><b>tmttodd</b></sub></a><br /><a href="#bug-tmttodd" title="Bug reports">πŸ›</a></td>
146
+ </tr>
147
+ <tr>
148
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/smaharnav"><img src="https://avatars.githubusercontent.com/u/263328627?v=4" width="100px;" alt=""/><br /><sub><b>smaharnav</b></sub></a><br /><a href="#bug-smaharnav" title="Bug reports">πŸ›</a></td>
149
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/MzaGuille"><img src="https://avatars.githubusercontent.com/u/151482698?v=4" width="100px;" alt=""/><br /><sub><b>Mza.Guille</b></sub></a><br /><a href="#bug-MzaGuille" title="Bug reports">πŸ›</a></td>
150
+ </tr>
151
+ </tbody>
152
+ </table>
153
+
154
+
155
+ <!-- markdownlint-restore -->
156
+ <!-- prettier-ignore-end -->
157
+
158
+ <!-- ALL-CONTRIBUTORS-LIST:END -->
159
+
160
+ If you land a pull request or report an issue that gets fixed, we'll add you here.