lsp-implementation
Use when implementing Language Server Protocol features - covers completions, hover, diagnostics, and navigation
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Use when implementing Language Server Protocol features - covers completions, hover, diagnostics, and navigation
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Use when configuring ESLint - covers flat config, TypeScript integration, and custom rules
Use when creating GitHub Actions workflows - covers CI/CD, matrix testing, and release automation
Use when writing Jest tests - covers testing patterns for interpreters, parsers, and async code
Use when designing language features - covers lexer, parser, AST, and interpreter patterns
Use when creating Mermaid diagrams - covers flowcharts, sequence diagrams, and AST visualization
Use when publishing npm packages - covers package.json configuration, versioning, and provenance
| name | lsp-implementation |
| description | Use when implementing Language Server Protocol features - covers completions, hover, diagnostics, and navigation |
import {
createConnection,
TextDocuments,
ProposedFeatures,
} from "vscode-languageserver/node";
import { TextDocument } from "vscode-languageserver-textdocument";
const connection = createConnection(ProposedFeatures.all);
const documents = new TextDocuments(TextDocument);
connection.onInitialize(() => ({
capabilities: {
textDocumentSync: TextDocumentSyncKind.Incremental,
completionProvider: { triggerCharacters: [".", "/"] },
hoverProvider: true,
definitionProvider: true,
}
}));
documents.listen(connection);
connection.listen();
connection.onCompletion((params): CompletionItem[] => {
const document = documents.get(params.textDocument.uri);
const position = params.position;
// Get context at cursor
const line = document?.getText({
start: { line: position.line, character: 0 },
end: position
});
// Return builtins
return [
{ label: "map", kind: CompletionItemKind.Function, detail: "(fn) -> List" },
{ label: "filter", kind: CompletionItemKind.Function, detail: "(fn) -> List" },
{ label: "reduce", kind: CompletionItemKind.Function, detail: "(init, fn) -> Value" },
];
});
connection.onHover((params): Hover | null => {
const document = documents.get(params.textDocument.uri);
const word = getWordAtPosition(document, params.position);
const builtin = BUILTINS[word];
if (builtin) {
return {
contents: {
kind: "markdown",
value: `**${word}**\n\n${builtin.description}\n\n\`\`\`lea\n${builtin.signature}\n\`\`\``
}
};
}
return null;
});
documents.onDidChangeContent((change) => {
const document = change.document;
const diagnostics: Diagnostic[] = [];
try {
parse(document.getText());
} catch (error) {
if (error instanceof ParseError) {
diagnostics.push({
severity: DiagnosticSeverity.Error,
range: error.range,
message: error.message,
source: "lea"
});
}
}
connection.sendDiagnostics({ uri: document.uri, diagnostics });
});
connection.onDefinition((params): Definition | null => {
const document = documents.get(params.textDocument.uri);
const word = getWordAtPosition(document, params.position);
// Find definition in AST
const definition = findDefinition(document.getText(), word);
if (definition) {
return {
uri: params.textDocument.uri,
range: definition.range
};
}
return null;
});
textDocument/completion - Code completionstextDocument/hover - Hover informationtextDocument/definition - Go to definitiontextDocument/references - Find all referencestextDocument/documentSymbol - Document outlinetextDocument/formatting - Code formatting