lsp-fix-all — Claude Code skill: bulk quick-fixes via LSP
Walks every diagnostic in a file and applies the quick-fixes your language server offers. Handy when errors and warnings have piled up before you start new work.
npx skills add blackwell-systems/agent-lsp --skill lsp-fix-all -a claude-codeWhat lsp-fix-all does
The skill loads the file into the language server, pulls the diagnostic list, and asks for code actions at each position. Only quickfix and source.organizeImports get through. Refactors and structural changes are rejected on purpose.
One edit per pass is the whole point. Line numbers move after every apply_edit, so diagnostics are collected again before the next fix. The loop ends when nothing is left, when no diagnostic has a usable action, or when the counter hits 50 — a guard for the case where a fix creates a fresh fixable error. Should apply_edit fail, the loop halts right there and the remaining work is left undone.
You need the agent-lsp MCP server running and an active LSP for the workspace. The codeActionProvider capability is required; document formatting is optional. A file with no diagnostics gets a clean report and nothing else. If you just edited something and want the new errors gone, that is a different skill — /lsp-safe-edit.
What it helps with
- clear accumulated errors and warnings in a file without touching each one by hand
- tidy a file up before starting a new task
- run every quick-fix the language server can offer in one go
- sort imports through
source.organizeImports - get a report of what was fixed and what has no auto-fix
Example prompts for the agent
- Run
lsp-fix-allonsrc/server/handler.goand show me what is left - Clean up
internal/api/routes.ts— apply every quick-fix the language server can give - Use
/lsp-fix-allonpkg/store/cache.pyand format the file when it is done
How to install lsp-fix-all
1Skills CLI (Vercel)
npx skills add blackwell-systems/agent-lsp --skill lsp-fix-all -a claude-code2Manually: put the files in place
~/.claude/skills/lsp-fix-all/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/lsp-fix-all/
1Skills CLI (Vercel)
npx skills add blackwell-systems/agent-lsp --skill lsp-fix-all -a codex2Manually: put the files in place
.agents/skills/lsp-fix-all/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add blackwell-systems/agent-lsp --skill lsp-fix-all -a cursor2Manually: put the files in place
.cursor/skills/lsp-fix-all/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install blackwell-systems/agent-lsp lsp-fix-all2Manually: put the files in place
.github/skills/lsp-fix-all/SKILL.md1Skills CLI (Vercel)
npx skills add blackwell-systems/agent-lsp --skill lsp-fix-all -a gemini-cli2Platform CLI
gemini skills install https://github.com/blackwell-systems/agent-lsp --path skills/lsp-fix-allManually: put the files in place
.devin/skills/lsp-fix-all/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add blackwell-systems/agent-lsp --skill lsp-fix-all -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about lsp-fix-all
How do I install lsp-fix-all in Claude Code?
Run npx skills add blackwell-systems/agent-lsp --skill lsp-fix-all -a claude-code. The skill lands in ~/.claude/skills/lsp-fix-all/SKILL.md.
What does lsp-fix-all do?
It collects a file's diagnostics and applies the quick-fixes the language server offers, one edit at a time, re-reading diagnostics between edits because line numbers shift.
How is lsp-fix-all different from /lsp-safe-edit?
This skill handles errors that were already in the file before you started. /lsp-safe-edit deals, at step 7, with errors caused by the specific edit you just made.
Source text
SKILL.md · MIT
---
name: lsp-fix-all
description: Apply available quick-fix code actions for all current diagnostics in a file, one at a time with re-collection between each fix. Use to bulk-resolve errors and warnings the language server can fix automatically.
argument-hint: "[file-path]"
user-invocable: true
allowed-tools: mcp__lsp__get_diagnostics mcp__lsp__suggest_fixes mcp__lsp__apply_edit mcp__lsp__open_document mcp__lsp__format_document
license: MIT
compatibility: Requires the agent-lsp MCP server (github.com/blackwell-systems/agent-lsp)
metadata:
required-capabilities: codeActionProvider
optional-capabilities: documentFormattingProvider
---
> Requires the agent-lsp MCP server.
# lsp-fix-all
Apply available quick-fix code actions for all current diagnostics in a file,
one at a time, re-collecting diagnostics between each fix because line numbers
shift after each application.
**Important distinction from `/lsp-safe-edit`:** This skill fixes **pre-existing**
diagnostics in a file — errors and warnings that already exist before any edit
session begins. `/lsp-safe-edit` has a code-action step (Step 7) for fixing errors
**introduced by a specific edit you just made**. Use this skill for systematic
bulk-fixing of existing issues, independent of any edit session.
## When to use / not use
**Use this skill when:**
- A file has accumulated errors or warnings you want to resolve automatically
- You want to clean up a file before starting new work
- You want to apply all available language-server quick-fixes in bulk
**Do NOT use this skill when:**
- You just made an edit and want to fix newly introduced errors — use `/lsp-safe-edit`
- You want to apply structural refactors — this skill applies quick-fixes only (see filtering below)
- The file has zero diagnostics (the skill will report clean and stop)
## Input
- **file_path:** Absolute path to the file to fix.
---
## Workflow
### Step 1 — Open and collect initial diagnostics
Call `mcp__lsp__open_document` with the target file path to ensure it is loaded
in the language server. Then call `mcp__lsp__get_diagnostics` to retrieve all
current diagnostics.
If zero diagnostics are returned: report "No diagnostics found — file is clean."
and stop. No further steps are needed.
Record the initial count of errors and warnings for the summary output.
### Step 2 — Classify and filter code actions
For EACH diagnostic (process one at a time, not in batch):
1. Call `mcp__lsp__suggest_fixes` at the diagnostic's position/range.
2. Filter the returned actions to quick-fix kind only.
3. Skip any diagnostic for which no applicable quick-fix exists — note it in the summary.
**Decision gate — which code actions to apply:**
| Action kind | Apply? |
|---|---|
| `quickfix` | YES |
| `quickfix.*` | YES |
| `refactor` | NO — structural change |
| `refactor.extract` | NO — structural change |
| `refactor.inline` | NO — structural change |
| `source.organizeImports` | YES — safe formatting |
| `source.*` (others) | NO — skip unless organizeImports |
| (no kind / empty) | NO — unknown, skip |
A code action qualifies if: `kind == "quickfix"`, OR `kind` starts with `"quickfix."`,
OR `kind == "source.organizeImports"`.
Reject actions whose kind is `"refactor"`, starts with `"refactor."`, or has no
kind field at all.
### Step 3 — Apply one fix and re-collect (the core loop)
This is the critical correctness constraint: **never apply more than one fix per
iteration.** After each `apply_edit` call, line numbers in the file shift. Always
re-call `get_diagnostics` before processing the next diagnostic.
**Loop:**
```
iteration = 0
max_iterations = 50
while iteration < max_iterations:
diagnostics = mcp__lsp__get_diagnostics(file_path)
if diagnostics is empty: break
for each diagnostic in diagnostics:
actions = mcp__lsp__suggest_fixes(diagnostic.range)
applicable = filter to quickfix / source.organizeImports kinds (see Step 2)
if applicable is not empty:
apply the first applicable action via mcp__lsp__apply_edit
record: (line, message, action title) in "Fixed" list
iteration += 1
break # restart the outer loop — line numbers have shifted
if no diagnostic in this pass had an applicable quick-fix:
break # no progress possible — exit loop
```
Exit the loop when:
- The diagnostics list is empty, OR
- No remaining diagnostic has an applicable quick-fix action, OR
- The iteration counter reaches 50 (safety guard against edge cases where a
fix introduces a new fixable diagnostic, preventing infinite loops)
If `apply_edit` returns an error: stop the loop immediately and report the
failure in the summary. Do not attempt further fixes.
### Step 4 — Verify and format
After the loop exits:
1. Call `mcp__lsp__get_diagnostics` one final time to capture the post-fix state.
2. For any remaining diagnostics that had no applicable quick-fix, list them in
the "Skipped" section with explanation.
3. Call `mcp__lsp__format_document` to clean up any indentation drift introduced
by the applied edits.
### Output format
```
## lsp-fix-all Summary
File: /path/to/file.go
Initial diagnostics: N errors, M warnings
Fixes applied: K
Remaining (no auto-fix available): J
### Fixed
- line X: <message> → applied: <action title>
### Skipped (no quick-fix available)
- line Y: <message>
```
If `apply_edit` failed mid-loop, append:
```
### Loop stopped
- apply_edit returned error on line Z: <error message>
- Fixes applied before failure: K
```
---
## Safety rules
- Never apply more than one code action per loop iteration
- Always re-collect diagnostics after each `apply_edit` before the next fix
- Never apply refactor or structural code actions — quick-fix and source.organizeImports only
- If `apply_edit` returns an error, stop the loop and report the failure; do not continue
- Maximum iterations: 50 (safety guard against infinite loops in edge cases where a fix introduces a new fixable diagnostic)
- Do not use `execute_command` — `apply_edit` is sufficient for all quick-fixes
---
## Prerequisites
LSP must be running for the target workspace. If not yet initialized, call
`mcp__lsp__start_lsp` with the workspace root before proceeding.
Auto-init note: agent-lsp supports workspace auto-inference from file paths.
Explicit `start_lsp` is only needed when switching workspace roots.
© blackwell-systems · MIT · blackwell-systems/agent-lsp