Checking Files With LSP
Overview
When you need to validate, check, or understand a file's structure or code quality, use language servers and linters to do it systematically. This skill provides a reliable workflow: detect the file type, search mise for available LSP/linter tools, intelligently choose one, and run the check.
Core principle: Let the appropriate tool for the language do the validation work, not manual inspection. Automate tool discovery and selection.
When to Use
Use this skill when:
- •Checking code files for syntax errors, type issues, or style problems
- •Validating configuration files (YAML, TOML, JSON, KDL, etc.)
- •Understanding code structure or quality of unfamiliar files
- •Verifying Markdown files for formatting/link issues
- •Need to quickly understand what problems exist in a file
Don't use when:
- •Just reading a file to understand its contents (no validation needed)
- •Running full test suites (that's testing, not validation)
- •Analyzing code behavior (that's debugging, not validation)
The Workflow
Step 1: Detect File Type
Determine the language/type from file extension:
.lua → lua .ts/.tsx → typescript .py → python .go → go .rs → rust .md → markdown .json → json .yaml → yaml .toml → toml .kdl → kdl
If extension is unclear or missing, inspect file shebang or content patterns.
Step 2: Search Mise for LSP/Linters
Run: mise search <filetype>
This returns all available language servers, linters, and formatters for that language.
Example outputs:
mise search lua lua-language-server (most popular) stylua (formatter) mise search python pyright pylance python-language-server black ruff
Step 3: Make Smart Selection
Prioritize by tool type: Language Server (LSP) > Linter > Formatter
LSPs provide the most comprehensive validation. Linters catch style/quality issues. Formatters are secondary for validation purposes.
If ONE obvious choice exists:
- •Auto-select it (e.g., only lua-language-server for Lua)
- •Verify installation:
mise list | grep <tool>(if not listed, install it) - •Install:
mise install lua-language-server - •Run it on the file
If MULTIPLE choices exist:
- •Filter by priority: Show LSPs first, linters second, skip formatters
- •Rank by popularity: Most-used tools first (measured by GitHub stars, then npm/PyPI downloads as tiebreaker)
- •Show ranked list to user (with tool type and brief descriptions)
- •Let user pick by number/letter
- •Verify and install selected tool
- •Run it on the file
If NO tools found:
- •Inform user explicitly: "No LSP/linter available in mise for [filetype]"
- •Suggest alternatives in order:
- •Check online package managers (npm, PyPI, cargo, etc.) if not in mise
- •Look for generic validators (jq for JSON, yamllint for YAML, etc.)
- •Basic syntax checking (built-in language checkers)
- •Manual validation with structured guidance
- •Offer: "Would you like me to help install from another source?"
Step 4: Run Validation
Execute the selected tool against the file and return results: errors, warnings, style issues, and suggestions.
Quick Reference
| Task | Action |
|---|---|
| Detect file type | Use file extension as primary signal |
| Find tools | mise search <filetype> |
| Install obvious choice | mise install <tool> (auto-selected) |
| Show options | Present ranked list for user choice |
| Run validation | Execute tool with file path |
Common Mistakes
Mistake: Skip file type detection
- •Wrong: "It's a code file, any language server works"
- •Right: File type determines which LSP applies. Wrong LSP = wrong errors
Mistake: Pick random LSP when multiple exist
- •Wrong: "I'll just try the first one" or "They're all the same"
- •Right: Different LSPs check different aspects. Use ranking: most popular > less common. Filter by type: LSP > Linter > Formatter
- •No exceptions: You must present options to user when multiple exist, not guess
Mistake: Assume LSP is installed
- •Wrong: "Let me just run lua-language-server..."
- •Right: Always verify with
mise searchfirst. Checkmise listbefore installing. Install if needed
Mistake: Don't check system requirements
- •Wrong: "Install the LSP and it'll work"
- •Right: Some LSPs need runtime dependencies (Python, Node, etc.). Test LSP runs before reporting results
Mistake: When LSP unavailable, give up
- •Wrong: "No tool for this language, can't validate"
- •Right: Explore alternatives in order: online package managers → generic validators → syntax checking → manual guidance
Mistake: Mixing tool categories
- •Wrong: Showing formatters and linters equally for validation
- •Right: Prioritize LSP > Linter > Formatter. Use tool type as first filter
Fallback Validation Options
When LSP/linter not available in mise:
- •Check online package managers (npm, PyPI, cargo, etc.) if not in mise
- •Look for generic validators - JSON validators, YAML checkers work across projects
- •Basic syntax checking - Some languages have built-in syntax checkers
- •Manual validation - Provide structured review guidance
- •Suggest installation - "Would you like me to help install from another source?"
Implementation Steps
When helping a user check a file:
- •Ask or determine: "What file are we checking?"
- •Detect the file type from extension
- •Run:
mise search <filetype> - •Decide: obvious choice or show ranked options?
- •Verify installation:
mise list | grep <tool>(check if already installed) - •Install if needed:
mise install <selected-tool> - •Test tool runs: Verify LSP/linter executes without errors
- •Run: Execute tool against file with appropriate flags
- •Report: Show user the validation results
- •Offer next steps: "Fix these issues?" or "Run checks again?"
Troubleshooting
Tool installs but won't run:
- •Some LSPs need runtime dependencies (Python for some tools, Node for others)
- •Check LSP documentation for runtime requirements
- •Example:
python-language-serverneeds Python installed - •Verify with:
mise exec <tool> -- <tool> --version
Mise search returns no results:
- •Language might not be in mise database
- •Try alternative package managers: npm (JavaScript), PyPI (Python), cargo (Rust)
- •Or use generic validators: jq (JSON), yamllint (YAML)
LSP finds errors but tool isn't right for the job:
- •Wrong tool selected (formatter instead of LSP)
- •Go back to Step 3, filter by type priority (LSP > Linter)
- •Ask user to pick a different option from the list
File has unusual extension:
- •Use file content inspection (shebang, headers) as fallback
- •Example: Executable shell scripts often lack
.shextension - •Check content to confirm type before searching mise
Real-World Impact
- •Fast validation: No manual code review for common issues
- •Consistent checking: Same tool, same criteria, every time
- •Discovery: Find issues you'd miss with manual inspection
- •Automation: Can be integrated into workflows, CI/CD, pre-commit hooks
- •Language agnostic: Same pattern works for any language with an LSP available