Show HN: Skill-language-server – A language server for agent skills A new open-source language server, skill-language-server, provides IDE-grade tooling for agent skill references in markdown files, offering completion, rename refactoring, and go-to-definition for `/skill-name` and `$skill-name` patterns across VS Code, Zed, Neovim, and Helix. Created by CyrusNuevoDia, the server indexes skills from `**/skills//SKILL.md` and references in `.md` files under `.claude/`, `.agents/`, `.codex/`, or `skills/`, with built-in near-miss detection and silent handling of non-skill paths like `/usr/bin`. A language server for agent skills — /skill-name and $skill-name become real symbols in VS Code, Zed, Neovim, and Helix. ▸ completion w/ descriptions on / and $ ▸ "did you mean" on typos ▸ go to definition, find references ▸ F2 rename w/ editor undo — folder, frontmatter name: , and every reference update as one edit ▸ clickable links + semantic highlighting on resolved references Your skill library now has tooling. Skills, CLAUDE.md / AGENTS.md , and agent files reference each other by name — a dependency graph with all the refactoring hazards of code and none of the tooling. Rename a skill by hand and stale references look like ordinary prose: nothing errors, the agent silently stops loading the skill. Quiet by design — a false reference in prose costs more than a missed one: - Fenced code blocks are never parsed; inline code spans are that's how people write skill names in prose /usr/bin , $PATH , docs/ — never references, never popups- Near miss of a real skill edit distance ≤ 2 → did you mean warning; other unresolved /name → info hint; unresolved $name → silent - Built-in commands /help , /compact , … and your own .claude/commands / .codex/prompts are commands, not skills — never flagged It's a language server, not a linter — pair with skill-lint or agnix for structural/security linting. npm install -g skill-language-server Then wire up your editor below. To see it work: cursor on any /skill-name , hit F2 , type a new name — folder, frontmatter, and every reference update as one undo step. languages.toml language-server.skill-language-server command = "skill-language-server" args = "--stdio" language name = "markdown" language-servers = "skill-language-server" add e.g. "marksman" here if you use it Create ~/.config/nvim/lsp/skill-language-server.lua : return { cmd = { "skill-language-server", "--stdio" }, filetypes = { "markdown" }, root markers = { ".claude", ".git" }, } Add vim.lsp.enable "skill-language-server" to init.lua. Or from a clone: { dir = "/path/to/skill-language-server/ext/nvim" } in lazy.nvim. Command palette → zed: install dev extension → select ext/zed/ from a clone. After server updates: editor: restart language server . git clone https://github.com/CyrusNuevoDia/skill-language-server cd skill-language-server mise trust && mise install && bun install just build-vscode code --install-extension dist/skill-language-server.vsix Marketplace listing pending — the .vsix bundles the server. mise trust && mise install bun, just rust only for the Zed wasm bun install just bin → ~/.local/bin/skill-language-server The server's world is the folder your editor opened — it never reads outside it. A rename touches exactly the tree you have open, never another checkout or your home directory. Open ~/.claude itself as a workspace to refactor your global library. Skills = any /skills/