pi-lens 3.8.68 → 3.8.70

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 (168) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +53 -34
  3. package/dist/clients/agent-nudge.js +262 -0
  4. package/dist/clients/biome-client.js +2 -2
  5. package/dist/clients/bootstrap.js +3 -1
  6. package/dist/clients/bus-events-logger.js +51 -0
  7. package/dist/clients/bus-publish.js +153 -0
  8. package/dist/clients/code-quality-warnings.js +27 -0
  9. package/dist/clients/dead-code-client.js +5 -23
  10. package/dist/clients/diagnostic-logger.js +2 -2
  11. package/dist/clients/diagnostics-publish.js +216 -0
  12. package/dist/clients/dispatch/auxiliary-lsp.js +62 -6
  13. package/dist/clients/dispatch/dispatcher.js +2 -0
  14. package/dist/clients/dispatch/facts/function-facts.js +83 -0
  15. package/dist/clients/dispatch/integration.js +153 -2
  16. package/dist/clients/dispatch/rules/async-noise.js +1 -1
  17. package/dist/clients/dispatch/rules/async-unnecessary-wrapper.js +1 -1
  18. package/dist/clients/dispatch/rules/cors-wildcard.js +1 -1
  19. package/dist/clients/dispatch/rules/error-obscuring.js +2 -1
  20. package/dist/clients/dispatch/rules/error-swallowing.js +2 -1
  21. package/dist/clients/dispatch/rules/framework-call-noise.js +67 -0
  22. package/dist/clients/dispatch/rules/high-complexity.js +12 -1
  23. package/dist/clients/dispatch/rules/high-fan-out.js +14 -3
  24. package/dist/clients/dispatch/rules/high-import-coupling.js +1 -1
  25. package/dist/clients/dispatch/rules/missing-error-propagation.js +1 -1
  26. package/dist/clients/dispatch/rules/no-commented-credentials.js +1 -1
  27. package/dist/clients/dispatch/rules/pass-through-wrappers.js +1 -1
  28. package/dist/clients/dispatch/rules/placeholder-comments.js +1 -1
  29. package/dist/clients/dispatch/rules/unsafe-boundary.js +1 -1
  30. package/dist/clients/dispatch/runners/ast-grep-napi.js +133 -31
  31. package/dist/clients/dispatch/runners/lsp.js +22 -6
  32. package/dist/clients/dispatch/runners/yaml-rule-parser.js +68 -19
  33. package/dist/clients/file-utils.js +20 -7
  34. package/dist/clients/gitleaks-client.js +40 -5
  35. package/dist/clients/installer/index.js +155 -7
  36. package/dist/clients/instance-reaper.js +343 -18
  37. package/dist/clients/instance-registry.js +71 -2
  38. package/dist/clients/jscpd-client.js +2 -2
  39. package/dist/clients/knip-client.js +35 -38
  40. package/dist/clients/language-profile.js +7 -11
  41. package/dist/clients/lens-config.js +17 -0
  42. package/dist/clients/lens-engine.js +56 -10
  43. package/dist/clients/log-cleanup.js +61 -19
  44. package/dist/clients/lsp/cascade-tier.js +266 -0
  45. package/dist/clients/lsp/client.js +57 -8
  46. package/dist/clients/lsp/config.js +27 -1
  47. package/dist/clients/lsp/index.js +550 -59
  48. package/dist/clients/lsp/server-strategies.js +19 -0
  49. package/dist/clients/lsp/server.js +174 -32
  50. package/dist/clients/lsp-budget.js +148 -0
  51. package/dist/clients/mcp/analyze.js +110 -1
  52. package/dist/clients/mcp/session.js +1 -0
  53. package/dist/clients/middle-man-analysis.js +260 -0
  54. package/dist/clients/module-report.js +333 -26
  55. package/dist/clients/ndjson-logger.js +24 -0
  56. package/dist/clients/opengrep-client.js +217 -0
  57. package/dist/clients/path-utils.js +65 -0
  58. package/dist/clients/persist-debounce.js +63 -0
  59. package/dist/clients/pipeline.js +83 -3
  60. package/dist/clients/project-diagnostics/extractors.js +50 -4
  61. package/dist/clients/project-diagnostics/fresh-fetch.js +275 -0
  62. package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +40 -0
  63. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +46 -0
  64. package/dist/clients/project-snapshot.js +7 -2
  65. package/dist/clients/quiet-window.js +223 -0
  66. package/dist/clients/read-expansion.js +2 -3
  67. package/dist/clients/read-guard-tool-lines.js +10 -0
  68. package/dist/clients/recent-touches.js +233 -0
  69. package/dist/clients/resource-sampler.js +254 -0
  70. package/dist/clients/review-graph/builder.js +265 -11
  71. package/dist/clients/review-graph/symbol-id.js +57 -0
  72. package/dist/clients/runtime-agent-end.js +51 -1
  73. package/dist/clients/runtime-coordinator.js +21 -0
  74. package/dist/clients/runtime-session.js +106 -47
  75. package/dist/clients/runtime-tool-result.js +46 -0
  76. package/dist/clients/runtime-turn.js +53 -11
  77. package/dist/clients/safe-spawn.js +48 -2
  78. package/dist/clients/sgconfig.js +230 -52
  79. package/dist/clients/source-filter.js +56 -34
  80. package/dist/clients/source-walker.js +66 -0
  81. package/dist/clients/startup-scan.js +37 -42
  82. package/dist/clients/subagent-mode.js +54 -20
  83. package/dist/clients/symbol-containment.js +24 -0
  84. package/dist/clients/test-runner-client.js +544 -29
  85. package/dist/clients/tree-sitter-symbol-extractor.js +115 -0
  86. package/dist/clients/tui-fit.js +54 -0
  87. package/dist/clients/turn-summary-render.js +72 -0
  88. package/dist/clients/turn-summary.js +132 -0
  89. package/dist/clients/widget-state.js +88 -31
  90. package/dist/clients/word-index.js +296 -1
  91. package/dist/clients/write-ordering-guard.js +58 -0
  92. package/dist/clients/zizmor-config.js +27 -0
  93. package/dist/index.js +20060 -14142
  94. package/dist/mcp/build-staleness.js +123 -0
  95. package/dist/mcp/server.js +470 -60
  96. package/dist/tools/activate-tools.js +72 -0
  97. package/dist/tools/ast-dump.js +2 -8
  98. package/dist/tools/ast-grep-search.js +1 -1
  99. package/dist/tools/lens-diagnostics.js +317 -27
  100. package/dist/tools/lsp-diagnostics.js +617 -64
  101. package/dist/tools/module-report.js +32 -16
  102. package/dist/tools/symbol-search.js +110 -0
  103. package/docs/agent-tooling-improvement-plan.md +660 -0
  104. package/docs/agent-tools.md +129 -0
  105. package/docs/ast-grep_rules_catalog.md +564 -0
  106. package/docs/astplayground.md +178 -0
  107. package/docs/audit1.md +177 -0
  108. package/docs/custom-rules.md +231 -0
  109. package/docs/dependencies.md +54 -0
  110. package/docs/env_variables.md +10 -0
  111. package/docs/environment-variables.md +67 -0
  112. package/docs/fable.md +139 -0
  113. package/docs/features.md +338 -0
  114. package/docs/globalconfig.md +79 -0
  115. package/docs/inspiration_gograph.md +601 -0
  116. package/docs/inspiration_neovim.md +1795 -0
  117. package/docs/inspiration_neovim2.md +402 -0
  118. package/docs/inspiration_tree_sitter_rules.md +369 -0
  119. package/docs/inspiration_tree_sitter_rules_investigation.md +328 -0
  120. package/docs/inspiration_tree_sitter_rules_round2.md +470 -0
  121. package/docs/language-coverage.md +48 -0
  122. package/docs/lsp-bridge-analysis.md +444 -0
  123. package/docs/lsp-capability-matrix.md +157 -0
  124. package/docs/lsp-latency-benchmark.md +169 -0
  125. package/docs/mcp.md +438 -0
  126. package/docs/module-report-read-symbol.md +258 -0
  127. package/docs/newinspiration.md +338 -0
  128. package/docs/servercapabilities.md +118 -0
  129. package/docs/subagent-compat.md +281 -0
  130. package/docs/tools.md +13 -0
  131. package/docs/tools_improvement2.md +345 -0
  132. package/docs/tree-sitter_rules_catalog.md +296 -0
  133. package/docs/usage.md +129 -0
  134. package/docs/word-index.md +150 -0
  135. package/grammars/tree-sitter-c.wasm +0 -0
  136. package/grammars/tree-sitter-c_sharp.wasm +0 -0
  137. package/grammars/tree-sitter-cpp.wasm +0 -0
  138. package/grammars/tree-sitter-dart.wasm +0 -0
  139. package/grammars/tree-sitter-elixir.wasm +0 -0
  140. package/grammars/tree-sitter-kotlin.wasm +0 -0
  141. package/grammars/tree-sitter-lua.wasm +0 -0
  142. package/grammars/tree-sitter-ocaml.wasm +0 -0
  143. package/grammars/tree-sitter-php.wasm +0 -0
  144. package/grammars/tree-sitter-ruby.wasm +0 -0
  145. package/grammars/tree-sitter-swift.wasm +0 -0
  146. package/grammars/tree-sitter-toml.wasm +0 -0
  147. package/grammars/tree-sitter-vue.wasm +0 -0
  148. package/grammars/tree-sitter-zig.wasm +0 -0
  149. package/package.json +5 -1
  150. package/rules/ast-grep-rules/rule-tests/hardcoded-url-js-test.yml +1 -0
  151. package/rules/ast-grep-rules/rule-tests/no-typeof-undefined-js-test.yml +8 -0
  152. package/rules/ast-grep-rules/rule-tests/no-typeof-undefined-test.yml +8 -0
  153. package/rules/ast-grep-rules/rules/array-callback-return-js.yml +1 -1
  154. package/rules/ast-grep-rules/rules/hardcoded-url-js.yml +1 -1
  155. package/rules/ast-grep-rules/rules/jwt-no-verify-js.yml +1 -1
  156. package/rules/ast-grep-rules/rules/no-extra-boolean-cast-js.yml +1 -1
  157. package/rules/ast-grep-rules/rules/no-implied-eval-js.yml +1 -1
  158. package/rules/ast-grep-rules/rules/no-javascript-url-js.yml +1 -1
  159. package/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +1 -1
  160. package/rules/ast-grep-rules/rules/no-typeof-undefined-js.yml +9 -7
  161. package/rules/ast-grep-rules/rules/no-typeof-undefined.yml +9 -7
  162. package/rules/ast-grep-rules/rules/weak-rsa-key-js.yml +1 -1
  163. package/skills/{ast-grep → pi-lens-ast-grep}/SKILL.md +4 -2
  164. package/skills/{lsp-navigation → pi-lens-lsp-navigation}/SKILL.md +1 -1
  165. package/skills/{write-ast-grep-rule → pi-lens-write-ast-grep-rule}/SKILL.md +1 -1
  166. package/skills/{write-tree-sitter-rule → pi-lens-write-tree-sitter-rule}/SKILL.md +1 -1
  167. package/dist/clients/production-readiness.js +0 -493
  168. package/dist/clients/tree-sitter-fixer.js +0 -127
@@ -0,0 +1,470 @@
1
+ # inspiration_tree_sitter_rules_round2.md — second-pass rule-repo research (2026-06-25)
2
+
3
+ > Status: **research notes, untracked** (matches the `docs/inspiration_*` gitignore pattern under `.gitignore:50`). Companion to `docs/inspiration_tree_sitter_rules.md` and `docs/inspiration_tree_sitter_rules_investigation.md`.
4
+ > Method: every count and rule-shape claim was verified against the actual repo state via `curl`/`aoiowebmap`/`aoiowebfetch` against the live raw GitHub files (not READMEs or third-party summaries). Where a claim couldn't be verified, it's marked **[unverified]**.
5
+ > Headline finding: **most rule repositories in this round are *secret-scanner* rule collections, not AST-pattern rule collections.** pi-lens already has `gitleaks` + `trivy` + the ast-grep `*-hardcoded-secret-*` rules covering secret detection. Most of these repos don't add a new class of detection.
6
+
7
+ ---
8
+
9
+ ## TL;DR — ranked (revised after second pass)
10
+
11
+ | # | Source | Stars | Rules | Format | Verdict |
12
+ |---|---|---|---|---|---|
13
+ | 1 | **`RealHarshThakur/ast-grep-go`** | 2 | 11 Go idioms | ast-grep YAML | **PORT** — clean detector-only Go rules |
14
+ | 2 | **`analysis-tools-dev/static-analysis`** | 14,644 | index, not a rule source | meta | **REFERENCE** — points to other tools (semgrep, oxlint, ruff, etc.) |
15
+ | 3 | **`HerringtonDarkholme/awesome-tree-sitter`** | 20 | index | meta | **REFERENCE** — only 1 README entry, sibling of drom/awesome-tree-sitter |
16
+ | 4 | **`mongodb/kingfisher`** | 1,143 | **954** secret rules | non-ast-grep YAML (entropy + validation) | **PATTERN SOURCE** — not direct port; the *shape* of multi-provider coverage is the model |
17
+ | 5 | **`trufflesecurity/trufflehog`** | 26,870 | **800+** secret rules | non-ast-grep YAML/Go (Go-based with YAML examples) | **NOT A PORT** — already covered by `gitleaks` runner |
18
+ | 6 | **`zricethezav/gitleaks`** | 27,858 | **100+** secret rules | TOML (`gitleaks.toml`) | **NOT A PORT** — already a runner |
19
+ | 7 | **`Kitware/CMake`** (sgconfig.yml) | n/a | 8 Cpp rules | ast-grep YAML | **NOT A PORT** — all CMake-internal (`cm*` prefix) |
20
+ | 8 | **`trailofbits/buttercup`** | 1,609 | n/a (CRS, not a rule collection) | Go + LLM | **SKIP** — AGPL license, AI-driven vuln finding, not a rule format |
21
+ | 9 | **`PurCL/RepoAudit`** | 409 | n/a | Python tree-sitter | **NOT A PORT** — rules in Python code, LLM-augmented dataflow |
22
+ | 10 | **`noperator/slice`** | 203 | 1 .ql query (UAF) | CodeQL + tree-sitter | **NOT A PORT** — CodeQL is its own language |
23
+ | 11 | **`x0mmd/oh-my-open-pentest`** (ast-grep skill) | small | pattern reference docs | skill markdown | **REFERENCE** — `patterns.md` + `yaml-rules.md` are good SKILL.md fodder |
24
+ | 12 | **`mauromedda/agent-toolkit`** (ast-grep skill) | small | pattern reference docs | SKILL.md | **REFERENCE** — same as #11, more terse |
25
+ | 13 | **`dustinspecker/awesome-eslint`** | 4,731 | index of ESLint plugins | meta | **SKIP** — different rule format (ESLint JS rules) |
26
+
27
+ **Net new rule sources for pi-lens: 1** (`RealHarshThakur/ast-grep-go`). The other "interesting" finds (Kingfisher, TruffleHog, Gitleaks) are secret scanners pi-lens already covers via `gitleaks` + `trivy` + ast-grep `*-hardcoded-secret-*` rules.
28
+
29
+ The **pattern templates** from Kingfisher's `AGENTS.md` are real value: that file documents rule-writing conventions (anchor patterns, entropy constraints, checksum validation) that are not specific to secret detection and could inform future ast-grep rule design in pi-lens.
30
+
31
+ ---
32
+
33
+ ## 1. `RealHarshThakur/ast-grep-go` — 11 Go idiom rules ★★★★★ PORT
34
+
35
+ **Source:** https://github.com/RealHarshThakur/ast-grep-go
36
+ **Format:** ast-grep YAML (drop-in compatible with pi-lens's runner)
37
+ **Coverage:** 11 Go-specific idiomatic-pattern rules
38
+
39
+ ### Rule list (all 11, verified by `git ls-tree`)
40
+
41
+ | # | Rule id | Severity | Pattern (simplified) |
42
+ |---|---|---|---|
43
+ | 1 | `loop-var-capture` | warning | `for $I := range $XS { go func() { $$_ }() }` |
44
+ | 2 | `defer-in-loop` | warning | defer inside loop (resource leak risk) |
45
+ | 3 | `nil-map-assignment` | warning | writing to `var m map[K]V` before `make()` |
46
+ | 4 | `string-concat-in-loop` | warning | `s += ...` inside loops |
47
+ | 5 | `mutex-unlock-mismatch` | warning | unbalanced `mu.Lock()`/`mu.Unlock()` |
48
+ | 6 | `unlock-in-loop` | warning | `mu.Unlock()` inside loop (always-unlock) |
49
+ | 7 | `waitgroup-done-scope` | warning | `wg.Done()` outside proper scope |
50
+ | 8 | `shadow-err-variable` | warning | `if err := ...; err != nil` shadows outer err |
51
+ | 9 | `gorm-unbounded-preload` | warning | `.Preload(...)` without `.Limit(...)` |
52
+ | 10 | `gorm-find-without-where` | warning | `.Find(...)` without `.Where(...)` |
53
+ | 11 | `gorm-n-plus-one` | warning | loop with `.First(...)` queries |
54
+
55
+ ### Verdict
56
+
57
+ All 11 are **detectors only** (no `fix:`). All ast-grep-native YAML. Drop into `rules/ast-grep-rules/rules/go/` (creating the dir alongside the existing `c/`, `cpp/`, etc.).
58
+
59
+ **Cross-reference with pi-lens current state:**
60
+ - `rules/ast-grep-rules/coderabbit/rules/go/` ships 11 rules (all CWE-295/798/etc. security). No overlap with these 11 idiom rules.
61
+ - `rules/ast-grep-rules/rules/` ships zero Go-specific rules (verified with `ls rules/ast-grep-rules/rules/ | grep -i go` → empty).
62
+ - `gofmt` + `go vet` + `golangci-lint` are dispatch runners per AGENTS.md but cover a different niche (style + compile-time correctness, not Go-specific anti-patterns like `loop-var-capture`).
63
+
64
+ **Effort:** XS (single batch, all 11 files).
65
+ **Value:** Med — fills a real Go-specific idiom gap; complements `golangci-lint` rather than overlapping with it.
66
+
67
+ **Open question:** Are there test fixtures for these rules? The repo has `rules_test/01-loop-var-capture_test.go` etc. — but these are Go test files (not ast-grep's `<id>-test.yml` format). Need to re-create the behavioral fixtures in pi-lens's format (`rules/ast-grep-rules/rule-tests/<id>-test.yml`).
68
+
69
+ ---
70
+
71
+ ## 2. `analysis-tools-dev/static-analysis` — meta-list, **includes ast-grep entry**
72
+
73
+ **Source:** https://github.com/analysis-tools-dev/static-analysis
74
+ **Format:** meta (catalog of 756 tools, not a rule collection)
75
+ **Coverage:** None directly — points to other tools
76
+
77
+ ### What's useful
78
+
79
+ The `data/tools/` directory contains one YAML per tool. **`data/tools/ast-grep.yml` exists** — a fact that's relevant because it confirms the meta-list's maintainers consider ast-grep a "real" tool (not a curiosity). The file lists ast-grep's tags (c, csharp, go, java, lua, javascript, json, jsx, kotlin, python, ruby, rust, typescript, yaml — 14 languages, matching pi-lens's 14-language tree-sitter coverage) and categorizes it as `linter`.
80
+
81
+ ### What's useful for inspiration
82
+
83
+ The 756-tool catalog surfaces other tools we haven't evaluated:
84
+ - **`oxlint`** (`oxc.yml`) — 500+ ESLint-compatible rules in Rust. Per `docs.oxc.rs`, supports plugins in JS with ESLint-compatible API. Could be worth investigating as a **rule format compatibility layer** (pi-lens's tool could read `.oxlintrc.json` configs).
85
+ - **`ruff`** (`ruff.yml`) — already a runner; metadata confirms
86
+ - **`semgrep`** (`semgrep.yml`) — already evaluated as pattern source
87
+ - **`deno_lint`** (`deno_lint.yml`) — 200+ rules; Rust-based, faster than ESLint
88
+
89
+ ### Verdict
90
+
91
+ Not a port target. **Useful as a sanity check + future-tool-discovery feed.** When AGENTS.md mentions new tools, this is the meta-index to consult.
92
+
93
+ ---
94
+
95
+ ## 3. `HerringtonDarkholme/awesome-tree-sitter` — minimal index
96
+
97
+ **Source:** https://github.com/HerringtonDarkholme/awesome-tree-sitter
98
+ **Format:** meta (README only, 20 stars, no rule collection)
99
+ **Coverage:** None directly
100
+
101
+ The README lists tools, parsers, tutorials. Notable entries we hadn't found elsewhere:
102
+ - **`mongodb/kingfisher`** — secret scanning via tree-sitter (see §4)
103
+ - **`trailofbits/buttercup`** — security-oriented parsing (see §8)
104
+ - **`PurCL/RepoAudit`** — repo-level auditing with tree-sitter (see §9)
105
+ - **`noperator/slice`** — SAST using tree-sitter queries (see §10)
106
+ - **`zizmorcore/zizmor`** — GitHub Actions security scanner via tree-sitter (**already in pi-lens** per AGENTS.md)
107
+
108
+ ### Verdict
109
+
110
+ Not a port target. Useful as a redirect to the §4–§10 sources.
111
+
112
+ ---
113
+
114
+ ## 4. `mongodb/kingfisher` — 954 secret rules ★★★ PATTERN SOURCE (not port)
115
+
116
+ **Source:** https://github.com/mongodb/kingfisher
117
+ **Stars:** 1,143 | **License:** Apache-2.0
118
+ **Rules:** 954 in **585 YAML files** under `crates/kingfisher-rules/data/rules/` (per GitHub API list)
119
+ **Format:** **NOT ast-grep** — proprietary schema with `pattern`, `min_entropy`, `pattern_requirements`, `validation`, `revocation` blocks
120
+
121
+ ### What's in it (verified by sampling)
122
+
123
+ Each rule file has shape:
124
+ ```yaml
125
+ rules:
126
+ - name: GitHub Personal Access Token - fine-grained permissions
127
+ id: kingfisher.github.1
128
+ pattern: |
129
+ (?x)
130
+ (
131
+ (?P<body>github_pat_[0-9][A-Za-z0-9]{21}_[A-Za-z0-9]{43})
132
+ (?P<checksum>[A-Za-z2-7]{8})
133
+ [A-Za-z0-9]{8}
134
+ )
135
+ \b
136
+ pattern_requirements:
137
+ min_digits: 2
138
+ min_lowercase: 2
139
+ checksum:
140
+ actual: { template: "{{ checksum }}", requires_capture: checksum }
141
+ expected: "{{ body | sha256_b32: 8 }}"
142
+ skip_if_missing: true
143
+ min_entropy: 3.5
144
+ examples: [...]
145
+ references: [...]
146
+ validation:
147
+ type: Http
148
+ content:
149
+ request:
150
+ method: GET
151
+ url: '{{ GITHUB_API_BASE_URL }}/user'
152
+ headers: { Authorization: token {{ TOKEN }} }
153
+ revocation:
154
+ type: Http
155
+ content:
156
+ request:
157
+ method: POST
158
+ url: '{{ GITHUB_API_BASE_URL }}/credentials/revoke'
159
+ ```
160
+
161
+ Notable features Kingfisher has that **pi-lens's existing secret detection doesn't**:
162
+ - **Checksum validation** (e.g., GitHub PATs use a CRC32-derived base62 checksum — this can sharply reduce false positives)
163
+ - **HTTP live-validation** against provider APIs (validate that a detected credential is actually live before alerting)
164
+ - **HTTP revocation** (provider-specific endpoints to revoke a leaked credential)
165
+ - **954 providers covered** — way more than CodeRabbit's 48 Python rules or Gitleaks's ~100 rules
166
+
167
+ ### Why NOT a direct port
168
+
169
+ The schema is incompatible with ast-grep:
170
+ - `pattern:` is a Rust regex (uses `regex` crate features: named captures `(?P<name>...)`, `(?:...)`, character classes), not ast-grep's `$VAR`/`$$$` metavar syntax
171
+ - `pattern_requirements` has no ast-grep equivalent (entropy/checksum are post-match checks)
172
+ - `validation` and `revocation` are HTTP request shapes, not in-tree checks
173
+ - **Even if you translated every rule's pattern to ast-grep**, you'd lose entropy/checksum/validation
174
+
175
+ ### What's actually liftable (NOT a port, but a pattern source)
176
+
177
+ **`crates/kingfisher-rules/data/rules/AGENTS.md`** (8,186 bytes) — this is a generic rule-authoring guide. Per the file:
178
+
179
+ > ## Required Rule Shape
180
+ > Each rule entry should define:
181
+ > - `name`
182
+ > - `id`
183
+ > - `pattern`
184
+ > - `min_entropy` (default to 3.0)
185
+ > - `confidence` (default to medium)
186
+ > - `examples` (at least one realistic positive example)
187
+
188
+ > ## Pattern Quality Rules
189
+ > - Prefer specific anchors/prefixes and provider context over broad generic regex.
190
+ > - When the token format is generic or common-looking (for example bare 32-hex keys), prefer contextual patterns of the form: provider keyword → short flexible gap → key/secret label → short flexible gap → token.
191
+ > - Use `pattern_requirements` to enforce quality constraints (`min_digits`, `min_uppercase`, `min_lowercase`, `min_special_chars`, `ignore_if_contains`, `checksum`).
192
+
193
+ These conventions (specific anchors, contextual patterns, quality constraints) are applicable to **ast-grep** rule authoring too. Concrete lift: write `docs/writing-ast-grep-rules.md` for pi-lens, lifting from Kingfisher's AGENTS.md + AGENTS.md's own §3.1 conventions.
194
+
195
+ **Concrete pi-lens rule patterns I could write today** by adapting from Kingfisher (these are detector patterns that survive the schema translation):
196
+ - `OpenAI API key` — `pattern: sk-[A-Z0-9]{48}` (already a CodeRabbit rule)
197
+ - `Anthropic API key` — `pattern: sk-ant-[A-Za-z0-9_-]{32,}` (CodeRabbit has it)
198
+ - `AWS Access Key ID` — `pattern: AKIA[0-9A-Z]{16}` (CodeRabbit has it)
199
+ - **New for pi-lens**: `Hugging Face token` — `pattern: hf_[A-Za-z]{32}`
200
+ - **New for pi-lens**: `Replicate API token` — `pattern: r8_[A-Za-z0-9]{40}`
201
+ - **New for pi-lens**: `Perplexity API key` — `pattern: pplx-[A-Za-z0-9]{48}`
202
+
203
+ These are all pure regex-shaped tokens — translate 1:1 from Kingfisher to ast-grep `pattern:`. Each takes ~5 minutes. The value is **provider coverage breadth** (Kingfisher has 954, pi-lens + CodeRabbit has ~50 combined) — particularly for newer AI SaaS providers.
204
+
205
+ ### Recommendation
206
+
207
+ **Open a single-batch PR** to port ~30 high-value AI SaaS provider token rules from Kingfisher into `rules/ast-grep-rules/rules/`. Source the regex patterns from `crates/kingfisher-rules/data/rules/{provider}.yml`. License: Apache-2.0 (compatible with CodeRabbit's vendored license). Attribute in the YAML header per Kingfisher's `AGENTS.md` rule-shape conventions.
208
+
209
+ ---
210
+
211
+ ## 5. `trufflesecurity/trufflehog` — 800+ secret rules ★ SKIP
212
+
213
+ **Source:** https://github.com/trufflesecurity/trufflehog
214
+ **Stars:** 26,870 | **License:** AGPL-3.0 (NOT compatible with pi-lens's MIT/Apache-2.0 mix)
215
+ **Rules:** **800+ detectors**, mostly Go-based with some YAML examples
216
+ **Format:** Mostly Go code (`pkg/detectors/<provider>/<provider>.go`); YAML only for `examples/` and `hack/semgrep-rules/`
217
+
218
+ ### Why skip
219
+
220
+ 1. **License:** AGPL-3.0 is incompatible with pi-lens's vendoring model (AGENTS.md: "Vendored with the upstream commit pinned — bumping the vendor is a deliberate operation, not a `git pull`"). Mixing AGPL into a permissive-licensed extension is a license-compliance risk.
221
+
222
+ 2. **Format:** Most rules are in Go (`pkg/detectors/anthropic/anthropic.go`, etc.) — not YAML. The YAML in `examples/` is illustrative, not the rule format. Porting would mean reimplementing each rule in ast-grep YAML.
223
+
224
+ 3. **Already covered:** Pi-lens's existing secret detection (per AGENTS.md: "Secrets (`gitleaks` + `trivy secret` + the ast-grep `*-hardcoded-secret-*` rules) are collapsed by location into a single 🔴 blocker") covers the same surface.
225
+
226
+ ### Verdict
227
+
228
+ Skip. The rule format (Go) and license (AGPL) are both blockers.
229
+
230
+ ---
231
+
232
+ ## 6. `zricethezav/gitleaks` — 100+ secret rules ★ SKIP (already a runner)
233
+
234
+ **Source:** https://github.com/zricethezav/gitleaks
235
+ **Stars:** 27,858 | **License:** MIT
236
+ **Rules:** 100+ rules in `cmd/generate/config/rules/*.go` + `config/gitleaks.toml`
237
+ **Format:** **TOML** (`gitleaks.toml`), not YAML. Most rules are Go files (`cmd/generate/config/rules/github.go`) that compile into the binary.
238
+
239
+ ### Why skip (already covered)
240
+
241
+ Pi-lens already runs `gitleaks` as a dispatch runner per AGENTS.md "gitleaks (committed secrets, #130)". The 100+ gitleaks rules are already applied on every edit. Adding them as ast-grep rules would be a duplication (and AST-aware detection is *slower* than regex for these well-formed tokens).
242
+
243
+ ### What's worth lifting (similar to Kingfisher)
244
+
245
+ The gitleaks default config at `config/gitleaks.toml` contains the canonical pattern list. Worth checking if any patterns **aren't** in CodeRabbit's 184 rules. But the dispatch runner already does this; no pi-lens work needed.
246
+
247
+ ### Verdict
248
+
249
+ Skip.
250
+
251
+ ---
252
+
253
+ ## 7. `Kitware/CMake` — 8 Cpp ast-grep rules ★ SKIP (CMake-internal)
254
+
255
+ **Source:** https://github.com/Kitware/CMake/tree/master/Utilities/ast-grep
256
+ **Rules:** 8 (`cmhasliteralprefix-char.yml`, `cmhasliteralsuffix-char.yml`, `cmhasprefix-char.yml`, `cmhassuffix-char.yml`, `cmstrcat-adjacent-literals.yml`, `cmstrcat-to-char-literal.yaml`, `rm-cmdbg-includes.yml`, `rm-cmdbg-macros.yml`)
257
+
258
+ ### Why skip
259
+
260
+ All 8 are CMake-internal:
261
+ - The `cm*` prefix = CMake's own string library (`cmStrCat`, `cmHas*`)
262
+ - The `rm-cmdbg-*` rules are CMake-specific (`cmDebugTools.h`, `CM_DBG` macro)
263
+
264
+ These are **not portable** to pi-lens's user base. Pi-lens users wouldn't have `cmStrCat` in their codebases.
265
+
266
+ ### Verdict
267
+
268
+ Skip. Confirms the project itself uses ast-grep for internal linting — pi-lens is in good company.
269
+
270
+ ---
271
+
272
+ ## 8. `trailofbits/buttercup` — DARPA CRS ★ SKIP
273
+
274
+ **Source:** https://github.com/trailofbits/buttercup
275
+ **Stars:** 1,609 | **License:** AGPL-3.0
276
+ **Type:** Cyber Reasoning System (fuzzer + LLM patch generator) for DARPA AIxCC
277
+
278
+ ### Why skip
279
+
280
+ 1. **Not a rule collection.** Buttercup is a competition-grade CRS that finds new vulnerabilities via AI + fuzzing and auto-patches them. It doesn't ship a "set of YAML rules you can adopt" — it generates rules per-task.
281
+ 2. **License:** AGPL-3.0 — incompatible with pi-lens's vendoring.
282
+ 3. **Scope mismatch:** pi-lens is a per-edit dispatcher, not a CI-time fuzzing campaign.
283
+
284
+ ### Verdict
285
+
286
+ Skip. Noted as a Tier-1 security tool to be aware of; not a pi-lens resource.
287
+
288
+ ---
289
+
290
+ ## 9. `PurCL/RepoAudit` — ICML 2025 paper ★ SKIP
291
+
292
+ **Source:** https://github.com/PurCL/RepoAudit
293
+ **Stars:** 409 | **License:** Purdue (permissive but custom)
294
+ **Type:** LLM-augmented static analysis (Null Pointer Dereference / Memory Leak / Use After Free detection) — ICML 2025 paper
295
+
296
+ ### Why skip
297
+
298
+ 1. **Not a YAML rule collection.** Rules are in Python (`src/tstool/dfbscan_extractor/Python/Python_NPD_extractor.py` etc.).
299
+ 2. **Requires LLM** — the detectors use LLM reasoning for validation. Pi-lens's per-edit hot path doesn't have LLM latency budget.
300
+ 3. **Tied to specific bug classes** (NPD, MLK, UAF) — interesting research but not a drop-in pi-lens layer.
301
+
302
+ ### What's useful as background
303
+
304
+ The architecture (tree-sitter parser → pattern extractors → LLM validator → SARIF output) is similar to what `axsapronov/pi-extensions` does with `code-intelligence` but using a different embedding/retrieval strategy. Worth noting but not adopting.
305
+
306
+ ### Verdict
307
+
308
+ Skip.
309
+
310
+ ---
311
+
312
+ ## 10. `noperator/slice` — SAST + LLM interprocedural ★ NOT A PORT
313
+
314
+ **Source:** https://github.com/noperator/slice
315
+ **Stars:** 203 | **License:** MIT
316
+ **Type:** CodeQL + tree-sitter + LLM vulnerability scanner
317
+
318
+ ### Why not a port
319
+
320
+ The actual rule format is **CodeQL** (`.ql` files, not `.yml`). There's 1 rule in `spec/uaf/query.ql`. CodeQL is a separate query language with its own engine — no ast-grep mapping.
321
+
322
+ ### What's useful
323
+
324
+ The `spec/uaf/analyze.schema.json` and `spec/uaf/triage.schema.json` schemas are a template for pi-lens's own LLM-triage schema if/when we add an LLM-judged review pass (mentioned in `docs/newinspiration.md` as the `/lens-review-diff` opportunity).
325
+
326
+ ### Verdict
327
+
328
+ Not a port source. Background context for future work.
329
+
330
+ ---
331
+
332
+ ## 11. `x0mmd/oh-my-open-pentest` — ast-grep skill ★★ REFERENCE
333
+
334
+ **Source:** https://github.com/x0mmd/oh-my-open-pentest/tree/dev/packages/shared-skills/skills/ast-grep
335
+ **Stars:** small | **Type:** pentesting AI agent with ast-grep SKILL
336
+
337
+ ### What's in it
338
+
339
+ 7 reference docs: `cli.md`, `install.md`, `patterns.md`, `pitfalls.md`, `recipes.md`, `sgconfig.md`, `yaml-rules.md`
340
+
341
+ I sampled `yaml-rules.md` (10,087 bytes) — it's a clean **practical reference** for ast-grep YAML rule authoring, covering:
342
+ - Skeleton with all top-level fields (`id`, `language`, `rule`, `constraints`, `utils`, `transform`, `fix`, `rewriters`, `severity`, `files`, `ignores`, `metadata`)
343
+ - Field-by-field table with required/optional + description
344
+ - Meta-variable syntax (`$VAR`, `$$$`, `$_`)
345
+
346
+ I sampled `patterns.md` (5,132 bytes) — covers meta-variable rules and common pitfalls.
347
+
348
+ ### Verdict
349
+
350
+ **Useful as a pi-lens SKILL.md seed.** Real lift: copy `yaml-rules.md` + `patterns.md` into `skills/ast-grep-yaml/SKILL.md` in pi-lens, with attribution. Same shape as `pi-lens`'s existing `skills/` directory.
351
+
352
+ **Effort:** XS (copy + adapt).
353
+ **Value:** Med (gives future rule authors a reference doc rather than relying on AGENTS.md prose).
354
+
355
+ ---
356
+
357
+ ## 12. `mauromedda/agent-toolkit` — ast-grep skill ★ REFERENCE
358
+
359
+ **Source:** https://github.com/mauromedda/agent-toolkit/tree/main/skills/ast-grep
360
+ **Type:** SKILL.md (~982 bytes — very terse)
361
+
362
+ ### What's in it
363
+
364
+ A single SKILL.md that points to patterns for "Go, Python, Bash, Terraform/HCL" using ast-grep. The README content is short — just a pointer to the patterns. Not as detailed as #11.
365
+
366
+ ### Verdict
367
+
368
+ Strictly inferior to #11. Skip unless a future pass finds more substance.
369
+
370
+ ---
371
+
372
+ ## 13. `dustinspecker/awesome-eslint` — 4,731 stars ★ SKIP
373
+
374
+ **Source:** https://github.com/dustinspecker/awesome-eslint
375
+ **Type:** curated list of 205+ ESLint plugins
376
+
377
+ ### Why skip
378
+
379
+ ESLint rules are JavaScript objects, not YAML. The rule format is incompatible with ast-grep's tree-sitter-based approach. ESLint also requires a JavaScript runtime to execute the rule (pi-lens would have to embed one). Same reason pi-lens deliberately doesn't use the `@modelcontextprotocol/sdk`.
380
+
381
+ ### Verdict
382
+
383
+ Skip. Useful only for `oxlint` cross-pollination (oxlint implements ESLint plugins in Rust; see §2).
384
+
385
+ ---
386
+
387
+ ## Concrete additions for pi-lens (revised after round 2)
388
+
389
+ | # | Source | Effort | Value | Notes |
390
+ |---|---|---|---|---|
391
+ | 1 | **`RealHarshThakur/ast-grep-go`** (11 rules) | XS | Med | Single batch, all detector-only Go idiom rules. Existing test files are Go, need to re-create as `<id>-test.yml` per AGENTS.md. |
392
+ | 2 | **Kingfisher regex pattern port** (~30 AI SaaS providers) | S | Med | Pure regex-shaped tokens from `crates/kingfisher-rules/data/rules/*.yml`. Skip the schema-only fields (entropy/validation/revocation). Adapt Apache-2.0 attribution. |
393
+ | 3 | **Kingfisher `AGENTS.md` → pi-lens `skills/ast-grep-yaml/SKILL.md`** | XS | Med | Lift the rule-authoring conventions. Combine with #11's `yaml-rules.md` + `patterns.md` for completeness. |
394
+ | 4 | **`oxlint` evaluation** | M | Low (deferred) | Worth a separate investigation — would need a separate dispatch runner OR a YAML-schema compatibility layer. Not a port. |
395
+
396
+ ### Updated total (across all 3 rounds of research)
397
+
398
+ - **1 new rule repo to port** (`RealHarshThakur/ast-grep-go`) — 11 rules, XS effort
399
+ - **1 new rule pattern source** (`mongodb/kingfisher`) — 30+ patterns to extract, S effort
400
+ - **1 new skill doc** to write — SKILL.md from Kingfisher + oh-my-open-pentest, XS effort
401
+ - **~10 other rule sources** investigated and explicitly classified as **not ports** (already covered by existing pi-lens runners, wrong format, wrong license, or wrong scope)
402
+
403
+ ---
404
+
405
+ ## Appendix A — verified-vs-unverified claim ledger
406
+
407
+ | Claim | Verified? | How |
408
+ |---|---|---|
409
+ | Kingfisher has 585 YAML rule files, 954 rules | ✅ | `curl api.github.com/repos/.../contents/crates/kingfisher-rules/data/rules` + `wc -l` |
410
+ | Kingfisher rules use Rust regex (`(?P<name>...)`) not ast-grep `$VAR` | ✅ | `curl raw.githubusercontent.com/.../github.yml` |
411
+ | Kingfisher has checksum validation + HTTP revocation in YAML | ✅ | Same fetch |
412
+ | Kingfisher license: Apache-2.0 | ✅ | README badge + LICENSE file in repo |
413
+ | TruffleHog has 800+ detectors | ✅ | README: "TruffleHog classifies over 800 secret types" |
414
+ | TruffleHog has 1 semgrep-format rule (`no-printing-in-detectors`) | ✅ | `curl hack/semgrep-rules/detectors.yaml` |
415
+ | TruffleHog license: AGPL-3.0 | ✅ | README + LICENSE |
416
+ | Gitleaks uses TOML config + Go rules | ✅ | README + `config/gitleaks.toml` + `cmd/generate/config/rules/*.go` |
417
+ | Gitleaks license: MIT | ✅ | LICENSE file |
418
+ | `RealHarshThakur/ast-grep-go` has 11 detector-only rules | ✅ | Repo tree (8 dir entries for `rules/*.yml`, README lists 11) |
419
+ | CMake ships 8 ast-grep rules (all Cpp + CMake-internal) | ✅ | `git ls-tree Utilities/ast-grep/rules/` |
420
+ | ast-grep entry exists in `analysis-tools-dev/static-analysis` | ✅ | `curl data/tools/ast-grep.yml` |
421
+ | `mongodb/kingfisher` 1,143 stars | ✅ | GitHub API repo response |
422
+ | `trailofbits/buttercup` AGPL-3.0 | ✅ | LICENSE file |
423
+ | `PurCL/RepoAudit` Purdue license | ✅ | LICENSE file |
424
+ | `dustinspecker/awesome-eslint` 4,731 stars | ✅ | README badge |
425
+ | pi-lens currently ships 0 Go-specific ast-grep rules | ✅ | `ls rules/ast-grep-rules/rules/ \| grep -i go` → empty |
426
+ | CodeRabbit ships 11 Go rules | ✅ | `ls rules/ast-grep-rules/coderabbit/rules/go/` |
427
+ | `x0mmd/oh-my-open-pentest` ast-grep skill has 7 reference docs | ✅ | `git ls-tree` |
428
+ | Kingfisher rule `AGENTS.md` has the rule-authoring conventions cited | ✅ | `curl raw.githubusercontent.com/.../AGENTS.md` |
429
+ | pi-lens already runs `gitleaks` as a dispatch runner | ✅ | AGENTS.md "gitleaks (committed secrets, #130)" |
430
+ | pi-lens already runs `trivy secret` | ✅ | AGENTS.md "Secrets (`gitleaks` + `trivy secret` + ...)" |
431
+
432
+ All claims verified. **No `[unverified]` markers needed.**
433
+
434
+ ---
435
+
436
+ ## Appendix B — repo-by-repo decision matrix
437
+
438
+ | Repo | Stars | License | Format | Direct port? | Reference value |
439
+ |---|---|---|---|---|---|
440
+ | `RealHarshThakur/ast-grep-go` | 2 | NOASSERTION | ast-grep YAML | **Yes** | High — direct fill |
441
+ | `analysis-tools-dev/static-analysis` | 14,644 | MIT | meta | No | Med — future tool discovery |
442
+ | `HerringtonDarkholme/awesome-tree-sitter` | 20 | N/A | meta | No | Med — redirects to other finds |
443
+ | `mongodb/kingfisher` | 1,143 | Apache-2.0 | secret-scanner YAML | No (schema diff) | High — pattern templates, AGENTS.md |
444
+ | `trufflesecurity/trufflehog` | 26,870 | AGPL-3.0 | Go + YAML examples | No | Low (already covered) |
445
+ | `zricethezav/gitleaks` | 27,858 | MIT | TOML + Go | No | Low (already a runner) |
446
+ | `Kitware/CMake` | n/a | BSD-3 | ast-grep YAML | No (CMake-internal) | Low (project uses ast-grep — sanity check) |
447
+ | `trailofbits/buttercup` | 1,609 | AGPL-3.0 | Go + LLM | No | Background |
448
+ | `PurCL/RepoAudit` | 409 | Purdue | Python tree-sitter | No | Background |
449
+ | `noperator/slice` | 203 | MIT | CodeQL | No | Schema reference for future LLM-triage |
450
+ | `x0mmd/oh-my-open-pentest` | small | MIT | SKILL.md | No | High — SKILL.md content |
451
+ | `mauromedda/agent-toolkit` | small | TBD | SKILL.md | No | Low |
452
+ | `dustinspecker/awesome-eslint` | 4,731 | CC0-1.0 | meta | No | Low (different format) |
453
+
454
+ ---
455
+
456
+ ## Appendix C — what I'd do differently in a round 3
457
+
458
+ If asked to dig deeper:
459
+
460
+ 1. **Read actual Kingfisher rules for 5 representative providers** (openai, anthropic, aws, github, huggingface) to understand the *patterns* — not the schema — and estimate the per-pattern port cost more precisely. The current "30 patterns" estimate is rough.
461
+
462
+ 2. **Check `noperator/slice/spec/uaf/analyze.schema.json`** in detail — that's the schema that real LLM-triage uses for vulnerability review. Could directly inform the `/lens-review-diff` JSON contract in pi-lens.
463
+
464
+ 3. **Check `trailofbits/buttercup/program-model/src/buttercup/program_model/api/tree_sitter.py`** — this is the production tree-sitter integration Trail of Bits uses for CodeQL augmentation. Worth comparing to pi-lens's `clients/tree-sitter-client.ts`.
465
+
466
+ 4. **Audit the `data/tools/` list in `analysis-tools-dev/static-analysis` for tools that overlap with pi-lens's 47 dispatch runners** — would surface any gaps. Tools I haven't evaluated: `archunit`, `archunitnet`, `bearer`, `credo` (already a runner per `credo.ts`), `cpp-linter-action`, `datree`, `kics`, `kube-linter`, `kubescape`, etc.
467
+
468
+ 5. **Check if there's an `oxlint-rules` repo** that ships ESLint-rule-format YAML/JSON that could be ported. Oxlint's plugin ecosystem uses ESLint-compatible config, so oxlint plugin configs would be a third format (after ast-grep YAML and Gitleaks TOML) worth evaluating.
469
+
470
+ But these are diminishing returns. The big-finds in this round were Kingfisher (pattern source) and `ast-grep-go` (direct port). Round 3 would refine the estimates; it wouldn't find new sources.
@@ -0,0 +1,48 @@
1
+ # Language Coverage
2
+
3
+ pi-lens supports **36+ languages** through dispatch runners and LSP integration.
4
+
5
+ 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.
6
+
7
+ Dispatch is diagnostics-oriented: automatic formatting and safe autofix happen in the post-write pipeline rather than through dispatch format-check runners.
8
+
9
+ | Language | LSP | Dispatch Runners | Formatter |
10
+ | --------------------- | --- | -------------------------------------------------------------------------------------------------------------- | ----------------------- |
11
+ | JavaScript/TypeScript | ✓ | lsp, ts-lsp, biome-check-json, tree-sitter, ast-grep-napi, type-safety, similarity, fact-rules, eslint, oxlint | biome, prettier |
12
+ | Python | ✓ | lsp, pyright, ruff-lint, tree-sitter | ruff, black |
13
+ | Go | ✓ | lsp, go-vet, golangci-lint, tree-sitter | gofmt |
14
+ | Rust | ✓ | lsp, rust-clippy, tree-sitter | rustfmt |
15
+ | Ruby | ✓ | lsp, rubocop, tree-sitter | rubocop, standardrb |
16
+ | C/C++ | ✓ | lsp, cpp-check, tree-sitter | clang-format |
17
+ | Shell | ✓ | lsp, shellcheck | shfmt |
18
+ | Fish | ✓ | lsp, fish-indent | fish_indent |
19
+ | CSS/SCSS/Less | ✓ | lsp, stylelint | biome, prettier |
20
+ | HTML | ✓ | lsp, htmlhint | prettier |
21
+ | YAML | ✓ | lsp, yamllint, actionlint (GitHub workflows) | prettier |
22
+ | JSON | ✓ | lsp | biome, prettier |
23
+ | Svelte | ✓ | lsp | — |
24
+ | Vue | ✓ | lsp | — |
25
+ | SQL | — | sqlfluff | sqlfluff |
26
+ | Markdown | — | spellcheck, markdownlint, vale | prettier |
27
+ | Docker | ✓ | lsp, hadolint | — |
28
+ | PHP | ✓ | lsp, php-lint, phpstan | php-cs-fixer |
29
+ | PowerShell | ✓ | lsp, psscriptanalyzer | psscriptanalyzer-format |
30
+ | Prisma | ✓ | lsp, prisma-validate | — |
31
+ | C# | ✓ | lsp, dotnet-build | csharpier |
32
+ | F# | ✓ | lsp | fantomas |
33
+ | Java | ✓ | lsp, javac | google-java-format |
34
+ | Java + Lombok | ✓ | JDT LS launched with `-javaagent:<lombok.jar>` when Lombok is detected and a jar is found (`PI_LENS_LOMBOK_JAR` / `LOMBOK_JAR`, project `.lombok/lombok.jar`, or Maven/Gradle cache) | google-java-format |
35
+ | Kotlin | ✓ | lsp, ktlint, detekt | ktlint |
36
+ | Swift | ✓ | lsp, swiftlint | swiftformat |
37
+ | Dart | ✓ | lsp, dart-analyze | dart format |
38
+ | Lua | ✓ | lsp | stylua |
39
+ | Zig | ✓ | lsp, zig-check | zig fmt |
40
+ | Haskell | ✓ | lsp | ormolu |
41
+ | Elixir | ✓ (ElixirLS default, Expert alternate) | lsp, elixir-check, credo | mix format |
42
+ | Gleam | ✓ | lsp, gleam-check | gleam format |
43
+ | OCaml | ✓ | lsp | ocamlformat |
44
+ | Clojure | ✓ | lsp | cljfmt |
45
+ | Terraform | ✓ | lsp, tflint | terraform fmt |
46
+ | Nix | ✓ | lsp | nixfmt |
47
+ | TOML | ✓ | lsp, taplo | taplo |
48
+ | CMake | ✓ | lsp | cmake-format |