pi-lens 3.8.69 → 3.8.71

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 (147) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/README.md +31 -13
  3. package/dist/clients/bootstrap.js +3 -1
  4. package/dist/clients/bus-events-logger.js +53 -0
  5. package/dist/clients/bus-publish.js +45 -2
  6. package/dist/clients/cache/rule-cache.js +9 -5
  7. package/dist/clients/cache-manager.js +19 -13
  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-dispositions.js +298 -0
  11. package/dist/clients/diagnostics-publish.js +38 -2
  12. package/dist/clients/dispatch/auxiliary-lsp.js +144 -6
  13. package/dist/clients/dispatch/dispatcher.js +6 -1
  14. package/dist/clients/dispatch/facts/function-facts.js +83 -0
  15. package/dist/clients/dispatch/integration.js +19 -4
  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 +75 -18
  31. package/dist/clients/dispatch/runners/lsp.js +23 -34
  32. package/dist/clients/dispatch/runners/oxlint.js +1 -1
  33. package/dist/clients/dispatch/suppress-writer.js +68 -0
  34. package/dist/clients/dispatch/utils/lsp-diagnostics.js +4 -1
  35. package/dist/clients/disposition-logger.js +39 -0
  36. package/dist/clients/disposition-publish.js +109 -0
  37. package/dist/clients/file-utils.js +94 -33
  38. package/dist/clients/format-events-publish.js +299 -0
  39. package/dist/clients/git-tracked-ignore.js +208 -0
  40. package/dist/clients/gitleaks-client.js +40 -5
  41. package/dist/clients/installer/index.js +123 -6
  42. package/dist/clients/instance-reaper.js +229 -2
  43. package/dist/clients/instance-registry.js +141 -2
  44. package/dist/clients/json-cache-read.js +65 -0
  45. package/dist/clients/knip-client.js +35 -38
  46. package/dist/clients/language-profile.js +11 -11
  47. package/dist/clients/lens-engine.js +12 -0
  48. package/dist/clients/lens-map.js +1079 -0
  49. package/dist/clients/log-cleanup.js +61 -19
  50. package/dist/clients/lsp/aggregation.js +69 -2
  51. package/dist/clients/lsp/cascade-tier.js +31 -19
  52. package/dist/clients/lsp/client.js +124 -14
  53. package/dist/clients/lsp/config.js +27 -1
  54. package/dist/clients/lsp/index.js +1028 -68
  55. package/dist/clients/lsp/server-strategies.js +17 -8
  56. package/dist/clients/lsp/server.js +80 -28
  57. package/dist/clients/lsp/tsserver-sync.js +145 -0
  58. package/dist/clients/lsp/workspace-diagnostics-cache.js +172 -0
  59. package/dist/clients/lsp-budget.js +148 -0
  60. package/dist/clients/mcp/session.js +9 -0
  61. package/dist/clients/middle-man-analysis.js +260 -0
  62. package/dist/clients/module-report.js +173 -11
  63. package/dist/clients/ndjson-logger.js +24 -0
  64. package/dist/clients/opengrep-client.js +217 -0
  65. package/dist/clients/opengrep-config.js +2 -10
  66. package/dist/clients/path-utils.js +66 -0
  67. package/dist/clients/pipeline.js +5 -1
  68. package/dist/clients/project-diagnostics/cache.js +5 -12
  69. package/dist/clients/project-diagnostics/extractors.js +21 -1
  70. package/dist/clients/project-diagnostics/fresh-fetch.js +275 -0
  71. package/dist/clients/project-diagnostics/runner-adapters/opengrep.js +40 -0
  72. package/dist/clients/project-diagnostics/runner-adapters/runner-findings.js +46 -0
  73. package/dist/clients/project-snapshot.js +3 -6
  74. package/dist/clients/quiet-window.js +57 -2
  75. package/dist/clients/read-expansion.js +2 -3
  76. package/dist/clients/read-guard-tool-lines.js +10 -0
  77. package/dist/clients/read-guard.js +1 -1
  78. package/dist/clients/resource-sampler.js +254 -0
  79. package/dist/clients/review-graph/builder.js +322 -42
  80. package/dist/clients/review-graph/import-resolvers.js +53 -19
  81. package/dist/clients/review-graph/symbol-id.js +57 -0
  82. package/dist/clients/runtime-agent-end.js +26 -0
  83. package/dist/clients/runtime-coordinator.js +9 -1
  84. package/dist/clients/runtime-session.js +93 -17
  85. package/dist/clients/runtime-tool-call.js +789 -0
  86. package/dist/clients/runtime-tool-result.js +15 -2
  87. package/dist/clients/runtime-turn.js +62 -13
  88. package/dist/clients/safe-spawn.js +48 -2
  89. package/dist/clients/session-state-store.js +6 -9
  90. package/dist/clients/sgconfig.js +2 -9
  91. package/dist/clients/source-filter.js +17 -25
  92. package/dist/clients/source-walker.js +66 -0
  93. package/dist/clients/startup-scan.js +105 -43
  94. package/dist/clients/symbol-containment.js +24 -0
  95. package/dist/clients/test-runner-client.js +544 -29
  96. package/dist/clients/tree-sitter-symbol-extractor.js +12 -5
  97. package/dist/clients/typos-config.js +2 -11
  98. package/dist/clients/widget-state.js +83 -1
  99. package/dist/clients/write-ordering-guard.js +58 -0
  100. package/dist/clients/zizmor-config.js +29 -10
  101. package/dist/index.js +25511 -19414
  102. package/dist/mcp/server.js +95 -19
  103. package/dist/tools/activate-tools.js +72 -0
  104. package/dist/tools/ast-dump.js +2 -8
  105. package/dist/tools/lens-diagnostic-mark.js +158 -0
  106. package/dist/tools/lens-diagnostics.js +327 -33
  107. package/dist/tools/lsp-diagnostics.js +525 -105
  108. package/dist/tools/module-report.js +18 -5
  109. package/docs/agent-tools.md +136 -0
  110. package/docs/ast-grep_rules_catalog.md +564 -0
  111. package/docs/astplayground.md +178 -0
  112. package/docs/audit1.md +177 -0
  113. package/docs/custom-rules.md +231 -0
  114. package/docs/dependencies.md +54 -0
  115. package/docs/dispositions.md +85 -0
  116. package/docs/env_variables.md +10 -0
  117. package/docs/environment-variables.md +83 -0
  118. package/docs/fable.md +140 -0
  119. package/docs/features.md +338 -0
  120. package/docs/globalconfig.md +79 -0
  121. package/docs/language-coverage.md +48 -0
  122. package/docs/lsp-capability-matrix.md +157 -0
  123. package/docs/lsp-latency-benchmark.md +169 -0
  124. package/docs/mcp.md +438 -0
  125. package/docs/module-report-read-symbol.md +258 -0
  126. package/docs/servercapabilities.md +118 -0
  127. package/docs/subagent-compat.md +281 -0
  128. package/docs/tools.md +16 -0
  129. package/docs/tools_improvement2.md +345 -0
  130. package/docs/tree-sitter_rules_catalog.md +296 -0
  131. package/docs/usage.md +129 -0
  132. package/docs/word-index.md +150 -0
  133. package/package.json +10 -1
  134. package/rules/ast-grep-rules/rule-tests/find-import-file-without-extension-test.yml +4 -0
  135. package/rules/ast-grep-rules/rule-tests/no-javascript-url-js-test.yml +5 -0
  136. package/rules/ast-grep-rules/rule-tests/no-javascript-url-test.yml +9 -0
  137. package/rules/ast-grep-rules/rules/array-callback-return-js.yml +1 -1
  138. package/rules/ast-grep-rules/rules/find-import-file-without-extension.yml +3 -1
  139. package/rules/ast-grep-rules/rules/jwt-no-verify-js.yml +1 -1
  140. package/rules/ast-grep-rules/rules/no-extra-boolean-cast-js.yml +1 -1
  141. package/rules/ast-grep-rules/rules/no-implied-eval-js.yml +1 -1
  142. package/rules/ast-grep-rules/rules/no-javascript-url-js.yml +13 -1
  143. package/rules/ast-grep-rules/rules/no-javascript-url.yml +12 -0
  144. package/rules/ast-grep-rules/rules/no-sql-in-code-js.yml +1 -1
  145. package/rules/ast-grep-rules/rules/weak-rsa-key-js.yml +1 -1
  146. package/skills/pi-lens-ast-grep/SKILL.md +3 -1
  147. package/dist/clients/production-readiness.js +0 -493
@@ -0,0 +1,258 @@
1
+ # Feature — `module_report` + `read_symbol` (read-substitute pair)
2
+
3
+ These two pi agent tools (also mirrored as MCP tools `pilens_module_report` /
4
+ `pilens_read_symbol`) replace the "read the whole file" pattern with a
5
+ structured, navigable flow that the model can target precisely.
6
+
7
+ ## Problem
8
+
9
+ When an agent encounters an unfamiliar file, the cheapest single tool call
10
+ that gives it *some* understanding is `read`. But for any non-trivial file,
11
+ the agent doesn't actually want the whole body — it wants:
12
+
13
+ 1. **Shape** — what symbols exist, their kinds, signatures, where they start.
14
+ 2. **Where it fits** — what's exported, what calls it, what it imports.
15
+ 3. **The body of one specific symbol** — the part it actually needs to read
16
+ in full to make an edit, follow a call, or explain a behaviour.
17
+
18
+ A `read` on a 1000-line file dumps all three layers into the context. On a
19
+ 2 k-file repo, an agent that fans out a "skim every file" pattern can
20
+ balloon the context to tens of thousands of tokens before doing any real
21
+ work.
22
+
23
+ ## The pair
24
+
25
+ ### `module_report(filePath, maxRefsPerSymbol?)`
26
+
27
+ Returns a structured outline of one module as JSON. The shape:
28
+
29
+ ```json
30
+ {
31
+ "available": true,
32
+ "staleness": "fresh",
33
+ "path": "clients/lens-engine.ts",
34
+ "language": "jsts",
35
+ "lineCount": 131,
36
+ "summary": { "imports": 13, "exports": 10, "symbols": 10 },
37
+ "imports": {
38
+ "external": ["node:path"],
39
+ "internal": ["clients/dispatch/integration.js", "..."]
40
+ },
41
+ "api": [ /* exported ModuleSymbolEntry[] */ ],
42
+ "internal": [ /* non-exported ModuleSymbolEntry[] */ ],
43
+ "recommendedReads": [ /* top-3 ranked by fanout / complexity / export */ ],
44
+ "semantic": { "source": "review-graph", "references": true, "implementations": false }
45
+ }
46
+ ```
47
+
48
+ Each `ModuleSymbolEntry`:
49
+
50
+ ```json
51
+ {
52
+ "name": "recentLatency",
53
+ "kind": "function",
54
+ "startLine": 77, "endLine": 89,
55
+ "exported": true,
56
+ "signature": "( limit = 5, fileFilter?: string, )",
57
+ "doc": "Recent dispatch latency reports, newest first.",
58
+ "fanout": 7, "complexity": 2,
59
+ "flags": ["high fanout"],
60
+ "usedBy": [
61
+ { "file": "mcp/server.ts", "symbol": "callTool", "line": 551, "relation": "calls" }
62
+ ]
63
+ }
64
+ ```
65
+
66
+ No per-symbol `read` block (#512) — `offset`/`limit` are pure derivations of
67
+ `startLine`/`endLine` (`offset = startLine`, `limit = endLine - startLine + 1`)
68
+ and the path is the report's own top-level `path` field; repeating all three
69
+ per symbol cost real tokens for zero new information. **To read a symbol:**
70
+ call `read`/`read_symbol` with `offset=startLine, limit=endLine-startLine+1`
71
+ on THIS report's `path`. Cross-file sections keep their own path — `usedBy[].file`
72
+ (the caller's file) and `blastRadius.files[].read` (the dependent file) — since
73
+ those legitimately point elsewhere. `exported` stays a boolean only; it is NOT
74
+ also repeated inside `flags` — `flags` carries non-derivable signals only
75
+ (`async`, `high fanout`, `high complexity`, `boundary wrapper`). `doc` is the
76
+ first sentence (or line) of an attached doc comment, whitespace-collapsed and
77
+ capped ~120 chars — the highest-value token for deciding which symbol to read;
78
+ omitted when no comment is directly attached. `recommendedReads` pre-ranks the
79
+ top three by `(usedBy × 2) + complexity + (exported ? 2 : 0)
80
+ + (high-complexity ? 3 : 0)` so the agent doesn't have to scan the whole
81
+ outline to decide where to look next; each entry carries `{reason, symbol,
82
+ startLine, endLine}` (no path — always the same file as the report).
83
+
84
+ `view: "compact"` renders the same data as a line-oriented TEXT view instead
85
+ of JSON — one line per symbol/callback, roughly a quarter of the token cost:
86
+
87
+ ```text
88
+ clients/agent-nudge.ts jsts 266L — 8 symbols, 5 exported | imports: bus-publish, latency-logger
89
+ API:
90
+ 77-81 fn _resetAgentNudgeForTests() — Test-only: clear accumulator state.
91
+ INTERNAL:
92
+ 95-104 fn isValidPayload(data: unknown)
93
+ CALLBACKS:
94
+ 164-172 event_handler events.on@164 [lifecycle] (in wireAgentNudgeSubscriber)
95
+ ```
96
+
97
+ Default view stays JSON; `compact` is opt-in.
98
+
99
+ ### `read_symbol(filePath, symbol, kind?)`
100
+
101
+ Returns the verbatim body of one named symbol plus a one-line header
102
+ (`<kind> <name> <basename>:<startLine>-<endLine>`). The body is the
103
+ actual source lines the file contains — no synthesized version, no
104
+ ellipsis.
105
+
106
+ **Doc-comment inclusion (#523).** When a doc comment is directly attached to
107
+ the declaration (same position-based, blank-line-gap-aware attachment
108
+ `module_report`'s `doc` field already uses), the returned range starts at the
109
+ comment block, not the declaration line — an agent reading a symbol to edit
110
+ it needs the contract above it, not just the body. The read-guard coverage
111
+ recorded for the read is extended to match, so editing only the doc comment
112
+ on an otherwise-read symbol is not blocked as a zero-read. A symbol with no
113
+ attached comment (or one separated from the declaration by a blank line — not
114
+ "attached") behaves exactly as before.
115
+
116
+ **`Class.method` qualification (#523).** `symbol` accepts a dotted name
117
+ (`"Foo.bar"`) to resolve a specific member: the lookup searches within the
118
+ named parent's members (by line-range containment, same shape as
119
+ `module_report`'s member nesting) before falling back to a plain top-level
120
+ lookup. `read_symbol("bar", ...)` still works standalone; `read_symbol("Foo.bar",
121
+ ...)` disambiguates when a member name collides across containers or isn't a
122
+ top-level export. An unresolved qualifier (unknown parent, or no matching
123
+ member) falls through to the did-you-mean miss path below rather than
124
+ erroring.
125
+
126
+ **Did-you-mean on miss (#523).** A miss (`found: false`) embeds the ~3 nearest
127
+ symbol/callback names in the file — by Levenshtein (character-edit-distance)
128
+ similarity over the name, threshold 0.45 on a 0–1 normalized score — so a
129
+ typo or near-miss self-corrects in one turn instead of a `module_report`
130
+ round-trip. Wildly-wrong names get no suggestions (nothing clears the
131
+ threshold) rather than a misleading list. (Chosen over reusing the
132
+ read-guard's `findSimilarLines`/`tokenSimilarity` — that does Jaccard
133
+ similarity over whitespace-tokenized *line content*, built for relocated-block
134
+ suggestions; a single identifier is one token to it, so a one-character typo
135
+ on a long name scores 0. Symbol names need character-level distance instead.)
136
+
137
+ **Duplicate-name disambiguation (#523).** When more than one same-file symbol
138
+ shares the requested name (overloads, an interface and a function sharing a
139
+ name), the response returns the first match (source order — unchanged
140
+ default behavior) but sets `ambiguous: { count, kinds }` and the tool/MCP
141
+ text notes it ("N matches — returned the `<kind>`; pass `kind` to
142
+ disambiguate"). Pass the optional `kind` parameter (e.g. `"function"`,
143
+ `"interface"`) to pick a specific one; a single unambiguous match never sets
144
+ `ambiguous`.
145
+
146
+ ```text
147
+ function createReadSymbolTool tools/module-report.ts:73-150
148
+
149
+ export function createReadSymbolTool(
150
+ getProjectRoot: () => string,
151
+ recordSymbolRead: (
152
+ filePath: string,
153
+ symbol: { name: string; kind: string; startLine: number; endLine: number },
154
+ ) => void,
155
+ ) {
156
+ return {
157
+ name: "read_symbol" as const,
158
+ ...
159
+ };
160
+ }
161
+ ```
162
+
163
+ Crucially, `read_symbol` **records the read against the read-guard** so a
164
+ follow-up edit on any line inside the symbol's range passes the
165
+ read-before-edit check. `module_report` does **not** — an outline is shape,
166
+ not body, and shouldn't be treated as coverage for editing.
167
+
168
+ ## Why a pair, not one tool
169
+
170
+ `module_report` is the **navigator**: cheap, structured, lets the agent pick
171
+ a target. `read_symbol` is the **fetch**: delivers the actual lines for one
172
+ chosen target.
173
+
174
+ The pair mirrors how a developer navigates an unfamiliar file with an IDE:
175
+
176
+ | IDE action | pi-lens tool | Notes |
177
+ |---|---|---|
178
+ | Open file outline | `module_report` | Symbols, signatures, cross-refs, ranked picks |
179
+ | Ctrl-click a symbol | `read_symbol` | The actual body, ready for edit |
180
+ | Jump to definition | `lsp_navigation({operation: "definition"})` | LSP-precise; for cross-file navigation |
181
+ | Grep + read | `grep` + `read` (lines) | For text patterns; the read-guard tie-in for ranges |
182
+
183
+ ## How it works
184
+
185
+ ### `module_report` (read-only by contract — #256)
186
+
187
+ 1. **Tree-sitter extract** — always; one file. Produces name/kind/line range/signature for every symbol across the 18 SYMBOL_QUERIES languages plus jsts (shared query, so a TS interface and a Python class have the same fields).
188
+ 2. **Review graph lookup** — `getCachedReviewGraph()` (in-memory → persisted snapshot → none). Provides `usedBy`, `imports`, `fanout`, `complexity`, `exported`. **Never builds the graph on this path** — a synchronous full build re-runs every fact provider (TS-compiler ASTs for jsts) and two racing builds OOM'd pi.
189
+ 3. **Degrade tiers** — outline only on a cold graph; no LSP on this path. The honest `semantic.source` reports what backed the data so a regression is attributable per call.
190
+
191
+ ### `read_symbol`
192
+
193
+ Pure tree-sitter on one file: extract → match by name → slice lines
194
+ `startLine-1 .. endLine-1`. No graph, no LSP. One log event per outcome
195
+ for correlation with `module_report` frequency/timing.
196
+
197
+ ## Token-efficiency results
198
+
199
+ Measured against `read` on a representative pi-lens file set
200
+ (`tools/lsp-navigation.ts`, `clients/lens-engine.ts`,
201
+ `clients/runtime-session.ts`, `mcp/server.ts`, `index.ts`,
202
+ `tools/shared.ts`, `tools/ast-grep-search.ts`):
203
+
204
+ | Workflow | Tokens (sum) | vs `read` |
205
+ |---|---:|---:|
206
+ | `read` each file | 55,356 | — |
207
+ | `module_report` each file | 13,907 | **−75%** (4.0× cheaper) |
208
+
209
+ The pair's per-file ratio depends on file shape:
210
+
211
+ | File shape | `module_report` vs `read` | When to skip `module_report` |
212
+ |---|---:|---|
213
+ | Many small symbols (e.g. `index.ts`, 30 fns) | **6.4×** | — |
214
+ | One giant function in a long file | 0.5–1.0× | Just `read` a slice |
215
+ | Trivial utility file (≤ ~10 lines, 0 symbols) | 1.1× | Break-even — `read` is fine |
216
+
217
+ `module_report` + `read_symbol` (small target) lands at ~−60% vs `read`
218
+ for the common case. `read_symbol` (whole file is one giant symbol) is
219
+ a wash — use `read` with a line range instead.
220
+
221
+ **#512 slimming (2026-07-11):** on `clients/agent-nudge.ts` (266 lines, 8
222
+ symbols), the default JSON view dropped from measuring ~1,900 tokens
223
+ (per-symbol `read` blocks + `flags: ["exported", ...]` duplicating the
224
+ `exported` boolean + `recommendedReads` repeating `{path, offset, limit}`)
225
+ to a schema with no repeated `read`/path noise; `view: "compact"` renders the
226
+ same report as text at roughly half the byte size of the JSON view for that
227
+ file.
228
+
229
+ ## When *not* to use these
230
+
231
+ - **Looking for a textual pattern across files** — use `grep` (tool in pi). `module_report` is per-file shape, not cross-file content.
232
+ - **Need exact LSP resolution** (cross-file definitions, type info) — use `lsp_navigation({operation: "definition"})`. `module_report`'s `usedBy` is AST-graph-derived; it's "this symbol calls/is-called-by" not "go to definition".
233
+ - **Tiny file (≤ ~10 lines)** — `read` is cheaper; `module_report`'s metadata overhead exceeds the file.
234
+ - **Want to edit, not read** — call `read_symbol` first (records the read), then `edit`. Don't rely on `module_report`'s outline for read-guard coverage.
235
+
236
+ ## MCP mirror
237
+
238
+ Both tools are also exposed via the pi-lens MCP server:
239
+
240
+ - `pilens_module_report({file, cwd?, maxRefsPerSymbol?, focus?, view?, blastRadius?, blastRadiusDepth?})`
241
+ - `pilens_read_symbol({file, symbol, kind?, cwd?})`
242
+
243
+ The MCP wrappers return the same JSON shape plus a one-line human summary, so
244
+ an agent in Claude Code (or any MCP client) gets the same navigable flow
245
+ without needing to install the pi extension. Both surfaces are compact
246
+ (unindented) JSON by default (#512) — the payload is parsed by an agent, not
247
+ read formatted; `view: "compact"` on `pilens_module_report` returns the
248
+ line-oriented text rendering instead. `pilens_read_symbol`'s response no
249
+ longer restates its own header line in a trailing JSON block — the header
250
+ line already carries name/kind/path/range, so only `signature` (genuinely
251
+ new) is folded into it.
252
+
253
+ ## See also
254
+
255
+ - `clients/module-report.ts` — implementation, single-mode rationale, per-tier degradation
256
+ - `tests/tools/module-report.test.ts` + `tests/clients/module-report.test.ts` — unit tests
257
+ - `tests/mcp/module-report.smoke.test.ts` — MCP smoke (init + real server round-trip)
258
+ - `docs/implementationplan.md` — historical context for the read-only contract (#256)
@@ -0,0 +1,118 @@
1
+ # LSP server capability inventory
2
+
3
+ Advertised capabilities of every LSP server pi-lens supports, read from each
4
+ server's `initialize` handshake. Generated by `node scripts/server-capabilities.mjs
5
+ [--install]` (requires `npm run build:dist`). Servers whose toolchain/binary is
6
+ absent on the generating host are listed under *Unavailable* — run in a
7
+ provisioned environment (the nightly) to capture those rows.
8
+
9
+ _Last generated: 2026-07-20 on linux; 30 servers captured, 11 unavailable._
10
+
11
+ ## Diagnostic mode + navigation/edit operations
12
+
13
+ Legend: ✓ advertised, · not. **mode** = document diagnostics (`pull` = `textDocument/diagnostic`, else push-only); **ws-pull** = advertises `workspace/diagnostic` (one project-wide pull — the #387 Item 2 fast path). **def**=definition, **tDef**=typeDefinition, **decl**=declaration, **ref**=references, **hov**=hover, **sig**=signatureHelp, **dSym**=documentSymbol, **wSym**=workspaceSymbol, **cAct**=codeAction, **rnm**=rename, **impl**=implementation, **cHir**=callHierarchy; **cmds** = executeCommand allowlist size.
14
+
15
+ | server | mode | ws-pull | def | tDef | decl | ref | hov | sig | dSym | wSym | cAct | rnm | impl | cHir | cmds |
16
+ |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
17
+ | ast-grep | push-only | · | · | · | · | · | ✓ | · | · | · | ✓ | · | · | · | 1 |
18
+ | bash | push-only | · | ✓ | · | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | · | · | 0 |
19
+ | clojure | push-only | · | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 62 |
20
+ | csharp | pull | ✓ | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0 |
21
+ | css | pull | · | ✓ | · | · | ✓ | ✓ | · | ✓ | · | ✓ | ✓ | · | · | 0 |
22
+ | dart | push-only | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 16 |
23
+ | deno | pull | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 2 |
24
+ | docker | push-only | · | ✓ | · | · | · | ✓ | ✓ | ✓ | · | · | ✓ | · | · | 0 |
25
+ | expert | push-only | · | ✓ | · | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | · | · | · | 2 |
26
+ | fsharp | push-only | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0 |
27
+ | gleam | push-only | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | · | ✓ | ✓ | · | · | 0 |
28
+ | go | push-only | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 47 |
29
+ | html | pull | · | ✓ | · | · | ✓ | ✓ | ✓ | ✓ | · | · | ✓ | · | · | 0 |
30
+ | json | pull | · | · | · | · | · | ✓ | · | ✓ | · | ✓ | · | · | · | 0 |
31
+ | lua | push-only | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | 6 |
32
+ | marksman | push-only | · | ✓ | · | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | · | · | 0 |
33
+ | opengrep | push-only | · | · | · | · | · | ✓ | · | · | · | ✓ | · | · | · | 2 |
34
+ | php | push-only | · | ✓ | · | · | ✓ | ✓ | ✓ | ✓ | ✓ | · | · | · | · | 0 |
35
+ | prisma | push-only | · | ✓ | · | · | ✓ | ✓ | · | ✓ | · | · | ✓ | · | · | 0 |
36
+ | python | push-only | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | ✓ | 0 |
37
+ | python-jedi | push-only | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | · | 0 |
38
+ | ruby | pull | · | ✓ | · | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | · | 0 |
39
+ | rust | pull | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0 |
40
+ | svelte | pull | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | 0 |
41
+ | terraform | push-only | · | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | · | · | 7 |
42
+ | toml | push-only | · | · | · | · | · | ✓ | · | ✓ | · | · | ✓ | · | · | 0 |
43
+ | typescript | push-only | · | ✓ | ✓ | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | 8 |
44
+ | typos | push-only | · | · | · | · | · | · | · | · | · | ✓ | · | · | · | 1 |
45
+ | vue | push-only | · | ✓ | · | · | ✓ | ✓ | · | ✓ | · | ✓ | ✓ | · | · | 0 |
46
+ | yaml | push-only | · | ✓ | · | · | · | ✓ | · | ✓ | · | ✓ | ✓ | · | · | 1 |
47
+ | zig | push-only | · | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | · | · | 0 |
48
+ | zizmor | push-only | · | · | · | · | · | · | · | · | · | · | · | · | · | 0 |
49
+
50
+ ## Raw advertised capability keys
51
+
52
+ - **ast-grep**: codeActionProvider, executeCommandProvider, hoverProvider, textDocumentSync
53
+ - **bash**: codeActionProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentSymbolProvider, hoverProvider, referencesProvider, renameProvider, textDocumentSync, workspaceSymbolProvider
54
+ - **clojure**: callHierarchyProvider, codeActionProvider, codeLensProvider, completionProvider, declarationProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentRangeFormattingProvider, documentSymbolProvider, executeCommandProvider, experimental, foldingRangeProvider, hoverProvider, implementationProvider, linkedEditingRangeProvider, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, workspace, workspaceSymbolProvider
55
+ - **csharp**: callHierarchyProvider, codeActionProvider, codeLensProvider, completionProvider, definitionProvider, diagnosticProvider, documentFormattingProvider, documentHighlightProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, referencesProvider, renameProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, typeHierarchyProvider, workspace, workspaceSymbolProvider
56
+ - **css**: codeActionProvider, colorProvider, definitionProvider, diagnosticProvider, documentFormattingProvider, documentHighlightProvider, documentLinkProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, referencesProvider, renameProvider, selectionRangeProvider, textDocumentSync
57
+ - **dart**: callHierarchyProvider, codeActionProvider, codeLensProvider, colorProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentLinkProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, executeCommandProvider, experimental, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, inlineValueProvider, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, typeHierarchyProvider, workspace, workspaceSymbolProvider
58
+ - **deno**: callHierarchyProvider, codeActionProvider, codeLensProvider, completionProvider, definitionProvider, diagnosticProvider, documentFormattingProvider, documentHighlightProvider, documentSymbolProvider, executeCommandProvider, experimental, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, notebookDocumentSync, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, workspace, workspaceSymbolProvider
59
+ - **docker**: codeActionProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentLinkProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, renameProvider, signatureHelpProvider, textDocumentSync
60
+ - **expert**: codeActionProvider, codeLensProvider, completionProvider, definitionProvider, documentFormattingProvider, documentSymbolProvider, executeCommandProvider, experimental, hoverProvider, referencesProvider, textDocumentSync, workspace, workspaceSymbolProvider
61
+ - **fsharp**: callHierarchyProvider, codeActionProvider, codeLensProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, inlineValueProvider, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, workspaceSymbolProvider
62
+ - **gleam**: codeActionProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, referencesProvider, renameProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider
63
+ - **go**: callHierarchyProvider, codeActionProvider, codeLensProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentLinkProvider, documentSymbolProvider, executeCommandProvider, experimental, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, typeHierarchyProvider, workspace, workspaceSymbolProvider
64
+ - **html**: colorProvider, definitionProvider, diagnosticProvider, documentFormattingProvider, documentHighlightProvider, documentLinkProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, linkedEditingRangeProvider, referencesProvider, renameProvider, selectionRangeProvider, signatureHelpProvider, textDocumentSync
65
+ - **json**: codeActionProvider, colorProvider, diagnosticProvider, documentFormattingProvider, documentLinkProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, selectionRangeProvider, textDocumentSync
66
+ - **lua**: codeActionProvider, codeLensProvider, colorProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, executeCommandProvider, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, offsetEncoding, referencesProvider, renameProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, workspace, workspaceSymbolProvider
67
+ - **marksman**: codeActionProvider, codeLensProvider, completionProvider, definitionProvider, documentSymbolProvider, executeCommandProvider, hoverProvider, referencesProvider, renameProvider, semanticTokensProvider, textDocumentSync, workspace, workspaceSymbolProvider
68
+ - **opengrep**: codeActionProvider, executeCommandProvider, hoverProvider, textDocumentSync, workspace
69
+ - **php**: codeActionProvider, completionProvider, declarationProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, implementationProvider, inlineValueProvider, referencesProvider, renameProvider, selectionRangeProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, typeHierarchyProvider, workspace, workspaceSymbolProvider
70
+ - **prisma**: completionProvider, definitionProvider, documentFormattingProvider, documentSymbolProvider, hoverProvider, referencesProvider, renameProvider, textDocumentSync
71
+ - **python**: callHierarchyProvider, codeActionProvider, completionProvider, declarationProvider, definitionProvider, documentHighlightProvider, documentSymbolProvider, executeCommandProvider, hoverProvider, referencesProvider, renameProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, workspace, workspaceSymbolProvider
72
+ - **python-jedi**: codeActionProvider, completionProvider, declarationProvider, definitionProvider, documentHighlightProvider, documentSymbolProvider, executeCommandProvider, hoverProvider, positionEncoding, referencesProvider, renameProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, workspace, workspaceSymbolProvider
73
+ - **ruby**: codeActionProvider, codeLensProvider, completionProvider, definitionProvider, diagnosticProvider, documentHighlightProvider, documentLinkProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, experimental, foldingRangeProvider, hoverProvider, inlayHintProvider, positionEncoding, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeHierarchyProvider, workspaceSymbolProvider
74
+ - **rust**: callHierarchyProvider, codeActionProvider, codeLensProvider, completionProvider, declarationProvider, definitionProvider, diagnosticProvider, documentFormattingProvider, documentHighlightProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, experimental, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, positionEncoding, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, workspace, workspaceSymbolProvider
75
+ - **svelte**: callHierarchyProvider, codeActionProvider, codeLensProvider, colorProvider, completionProvider, definitionProvider, diagnosticProvider, documentFormattingProvider, documentHighlightProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, linkedEditingRangeProvider, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, workspaceSymbolProvider
76
+ - **terraform**: codeActionProvider, codeLensProvider, completionProvider, declarationProvider, definitionProvider, documentFormattingProvider, documentLinkProvider, documentSymbolProvider, executeCommandProvider, experimental, hoverProvider, referencesProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, workspace, workspaceSymbolProvider
77
+ - **toml**: completionProvider, documentFormattingProvider, documentLinkProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, renameProvider, semanticTokensProvider, textDocumentSync, workspace
78
+ - **typescript**: codeActionProvider, codeLensProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentRangeFormattingProvider, documentSymbolProvider, executeCommandProvider, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, linkedEditingRangeProvider, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, workspace, workspaceSymbolProvider
79
+ - **typos**: codeActionProvider, executeCommandProvider, positionEncoding, textDocumentSync, workspace
80
+ - **vue**: codeActionProvider, colorProvider, completionProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentLinkProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, experimental, foldingRangeProvider, hoverProvider, inlayHintProvider, linkedEditingRangeProvider, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, textDocumentSync, workspace
81
+ - **yaml**: codeActionProvider, codeLensProvider, completionProvider, definitionProvider, documentFormattingProvider, documentLinkProvider, documentOnTypeFormattingProvider, documentRangeFormattingProvider, documentSymbolProvider, executeCommandProvider, foldingRangeProvider, hoverProvider, renameProvider, selectionRangeProvider, textDocumentSync, workspace
82
+ - **zig**: codeActionProvider, colorProvider, completionProvider, declarationProvider, definitionProvider, documentFormattingProvider, documentHighlightProvider, documentRangeFormattingProvider, documentSymbolProvider, foldingRangeProvider, hoverProvider, implementationProvider, inlayHintProvider, positionEncoding, referencesProvider, renameProvider, selectionRangeProvider, semanticTokensProvider, signatureHelpProvider, textDocumentSync, typeDefinitionProvider, workspace, workspaceSymbolProvider
83
+ - **zizmor**: textDocumentSync
84
+ Top-level keys of each server's `ServerCapabilities` — the full advertised
85
+ surface, including providers pi-lens does not yet consume.
86
+
87
+
88
+ ## Advertised executeCommand allowlists
89
+
90
+ - **ast-grep** (1): ast-grep.applyAllFixes
91
+ - **clojure** (62): add-import-to-namespace, add-missing-import, add-missing-libspec, add-require-suggestion, as-to-refer, backward, backward-barf, backward-select, backward-slurp, change-coll, clean-ns, cond->if-refactor, create-function, create-test, cursor-info, cycle-coll, cycle-keyword-auto-resolve, cycle-privacy, demote-fn, destructure-keys, drag-backward, drag-forward, drag-param-backward, drag-param-forward, expand-let, extract-function, extract-to-def, forward, forward-barf, forward-select, forward-slurp, get-in-all, get-in-less, get-in-more, get-in-none, if->cond-refactor, inline-function, inline-symbol, introduce-let, kill-sexp, …
92
+ - **dart** (16): dart.edit.codeAction.apply, dart.edit.sortMembers, dart.edit.organizeImports, dart.edit.fixAll, dart.edit.fixAllInWorkspace.preview, dart.edit.fixAllInWorkspace, dart.edit.sendWorkspaceEdit, refactor.perform, refactor.validate, dart.logAction, dart.refactor.add_constructor_name, dart.refactor.convert_all_formal_parameters_to_named, dart.refactor.convert_selected_formal_parameters_to_named, dart.refactor.move_selected_formal_parameters_left, dart.refactor.move_top_level_to_file, dart.refactor.remove_constructor_name
93
+ - **deno** (2): deno.cache, deno.reloadImportRegistries
94
+ - **expert** (2): Reindex, connectionDetails
95
+ - **go** (47): gopls.add_dependency, gopls.add_import, gopls.add_telemetry_counters, gopls.add_test, gopls.apply_fix, gopls.assembly, gopls.change_signature, gopls.check_upgrades, gopls.client_open_url, gopls.diagnose_files, gopls.doc, gopls.edit_go_directive, gopls.extract_to_new_file, gopls.fetch_vulncheck_result, gopls.free_symbols, gopls.gc_details, gopls.generate, gopls.go_get_package, gopls.implement_interface, gopls.list_imports, gopls.list_known_packages, gopls.lsp, gopls.maybe_prompt_for_telemetry, gopls.mem_stats, gopls.modify_tags, gopls.modules, gopls.move_type, gopls.package_symbols, gopls.packages, gopls.regenerate_cgo, gopls.remove_dependency, gopls.reset_go_mod_diagnostics, gopls.run_go_work_command, gopls.run_govulncheck, gopls.run_tests, gopls.scan_imports, gopls.split_package, gopls.start_debugging, gopls.start_profile, gopls.stop_profile, …
96
+ - **lua** (6): lua.removeSpace, lua.solve, lua.jsonToLua, lua.setConfig, lua.getConfig, lua.autoRequire
97
+ - **opengrep** (2): semgrep/ignore, semgrep/autofix
98
+ - **terraform** (7): terraform-ls.module.callers, terraform-ls.module.calls, terraform-ls.module.providers, terraform-ls.module.terraform, terraform-ls.rootmodules, terraform-ls.terraform.init, terraform-ls.terraform.validate
99
+ - **typescript** (8): _typescript.applyRefactoring, _typescript.configurePlugin, _typescript.organizeImports, _typescript.applyRenameFile, _typescript.goToSourceDefinition, _typescript.applyCodeActionCommand, _typescript.applyFixAllCodeAction, typescript.tsserverRequest
100
+ - **typos** (1): ignore-in-project
101
+ - **yaml** (1): jumpToSchema
102
+
103
+ ## Unavailable on the generating host
104
+
105
+ Toolchain/binary not installed here, so capabilities weren't captured
106
+ (many are the toolchain-gated family tracked in #241):
107
+
108
+ - PowerShell Editor Services (pwsh Start-EditorServices.ps1 -Stdio)
109
+ - clangd
110
+ - haskell-language-server
111
+ - intelephense
112
+ - jdtls
113
+ - jdtls + lombok javaagent
114
+ - kotlin-language-server
115
+ - nixd
116
+ - ocamllsp
117
+ - rust-analyzer
118
+ - sourcekit-lsp