lsp-intelligence 0.1.0

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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +250 -0
  3. package/dist/engine/DocumentManager.d.ts +20 -0
  4. package/dist/engine/DocumentManager.js +73 -0
  5. package/dist/engine/DocumentManager.js.map +1 -0
  6. package/dist/engine/LspEngine.d.ts +50 -0
  7. package/dist/engine/LspEngine.js +339 -0
  8. package/dist/engine/LspEngine.js.map +1 -0
  9. package/dist/engine/positions.d.ts +31 -0
  10. package/dist/engine/positions.js +55 -0
  11. package/dist/engine/positions.js.map +1 -0
  12. package/dist/engine/types.d.ts +61 -0
  13. package/dist/engine/types.js +33 -0
  14. package/dist/engine/types.js.map +1 -0
  15. package/dist/format/markdown.d.ts +5 -0
  16. package/dist/format/markdown.js +90 -0
  17. package/dist/format/markdown.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.js +87 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/tools/composites/batchQuery.d.ts +1 -0
  22. package/dist/tools/composites/batchQuery.js +40 -0
  23. package/dist/tools/composites/batchQuery.js.map +1 -0
  24. package/dist/tools/composites/explainError.d.ts +1 -0
  25. package/dist/tools/composites/explainError.js +56 -0
  26. package/dist/tools/composites/explainError.js.map +1 -0
  27. package/dist/tools/composites/findTestFiles.d.ts +1 -0
  28. package/dist/tools/composites/findTestFiles.js +57 -0
  29. package/dist/tools/composites/findTestFiles.js.map +1 -0
  30. package/dist/tools/composites/impactTrace.d.ts +1 -0
  31. package/dist/tools/composites/impactTrace.js +149 -0
  32. package/dist/tools/composites/impactTrace.js.map +1 -0
  33. package/dist/tools/composites/inspectSymbol.d.ts +1 -0
  34. package/dist/tools/composites/inspectSymbol.js +60 -0
  35. package/dist/tools/composites/inspectSymbol.js.map +1 -0
  36. package/dist/tools/composites/semanticDiff.d.ts +1 -0
  37. package/dist/tools/composites/semanticDiff.js +135 -0
  38. package/dist/tools/composites/semanticDiff.js.map +1 -0
  39. package/dist/tools/context/gatherContext.d.ts +1 -0
  40. package/dist/tools/context/gatherContext.js +153 -0
  41. package/dist/tools/context/gatherContext.js.map +1 -0
  42. package/dist/tools/context/outline.d.ts +1 -0
  43. package/dist/tools/context/outline.js +56 -0
  44. package/dist/tools/context/outline.js.map +1 -0
  45. package/dist/tools/live/autoImport.d.ts +1 -0
  46. package/dist/tools/live/autoImport.js +123 -0
  47. package/dist/tools/live/autoImport.js.map +1 -0
  48. package/dist/tools/live/findUnusedExports.d.ts +1 -0
  49. package/dist/tools/live/findUnusedExports.js +69 -0
  50. package/dist/tools/live/findUnusedExports.js.map +1 -0
  51. package/dist/tools/live/liveDiagnostics.d.ts +1 -0
  52. package/dist/tools/live/liveDiagnostics.js +38 -0
  53. package/dist/tools/live/liveDiagnostics.js.map +1 -0
  54. package/dist/tools/primitives/callHierarchy.d.ts +1 -0
  55. package/dist/tools/primitives/callHierarchy.js +61 -0
  56. package/dist/tools/primitives/callHierarchy.js.map +1 -0
  57. package/dist/tools/primitives/completions.d.ts +1 -0
  58. package/dist/tools/primitives/completions.js +31 -0
  59. package/dist/tools/primitives/completions.js.map +1 -0
  60. package/dist/tools/primitives/diagnostics.d.ts +1 -0
  61. package/dist/tools/primitives/diagnostics.js +32 -0
  62. package/dist/tools/primitives/diagnostics.js.map +1 -0
  63. package/dist/tools/primitives/documentSymbols.d.ts +1 -0
  64. package/dist/tools/primitives/documentSymbols.js +42 -0
  65. package/dist/tools/primitives/documentSymbols.js.map +1 -0
  66. package/dist/tools/primitives/fileExports.d.ts +1 -0
  67. package/dist/tools/primitives/fileExports.js +69 -0
  68. package/dist/tools/primitives/fileExports.js.map +1 -0
  69. package/dist/tools/primitives/fileImports.d.ts +1 -0
  70. package/dist/tools/primitives/fileImports.js +58 -0
  71. package/dist/tools/primitives/fileImports.js.map +1 -0
  72. package/dist/tools/primitives/findImplementations.d.ts +1 -0
  73. package/dist/tools/primitives/findImplementations.js +36 -0
  74. package/dist/tools/primitives/findImplementations.js.map +1 -0
  75. package/dist/tools/primitives/findReferences.d.ts +1 -0
  76. package/dist/tools/primitives/findReferences.js +42 -0
  77. package/dist/tools/primitives/findReferences.js.map +1 -0
  78. package/dist/tools/primitives/gotoDefinition.d.ts +1 -0
  79. package/dist/tools/primitives/gotoDefinition.js +37 -0
  80. package/dist/tools/primitives/gotoDefinition.js.map +1 -0
  81. package/dist/tools/primitives/gotoTypeDefinition.d.ts +1 -0
  82. package/dist/tools/primitives/gotoTypeDefinition.js +35 -0
  83. package/dist/tools/primitives/gotoTypeDefinition.js.map +1 -0
  84. package/dist/tools/primitives/hover.d.ts +1 -0
  85. package/dist/tools/primitives/hover.js +37 -0
  86. package/dist/tools/primitives/hover.js.map +1 -0
  87. package/dist/tools/primitives/rename.d.ts +1 -0
  88. package/dist/tools/primitives/rename.js +56 -0
  89. package/dist/tools/primitives/rename.js.map +1 -0
  90. package/dist/tools/primitives/typeHierarchy.d.ts +1 -0
  91. package/dist/tools/primitives/typeHierarchy.js +49 -0
  92. package/dist/tools/primitives/typeHierarchy.js.map +1 -0
  93. package/dist/tools/primitives/workspaceSymbols.d.ts +1 -0
  94. package/dist/tools/primitives/workspaceSymbols.js +32 -0
  95. package/dist/tools/primitives/workspaceSymbols.js.map +1 -0
  96. package/dist/tools/registry.d.ts +19 -0
  97. package/dist/tools/registry.js +19 -0
  98. package/dist/tools/registry.js.map +1 -0
  99. package/package.json +39 -0
@@ -0,0 +1,37 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { toPosition } from '../../engine/positions.js';
4
+ import { formatHover } from '../../format/markdown.js';
5
+ export const hover = defineTool({
6
+ name: 'hover',
7
+ description: 'Get the full type signature and documentation for a symbol. Accepts symbol name OR file position. Returns the same info you see when hovering in VS Code.',
8
+ schema: z.object({
9
+ symbol: z.string().optional().describe('Symbol name, e.g. "IssuesSDK". Use this OR file_path+line+column.'),
10
+ file_path: z.string().optional().describe('Absolute file path. Required with line+column.'),
11
+ line: z.number().optional().describe('1-indexed line number'),
12
+ column: z.number().optional().describe('1-indexed column number'),
13
+ }),
14
+ async handler(params, engine) {
15
+ let uri;
16
+ let position;
17
+ if (params.symbol) {
18
+ const resolved = await engine.resolveSymbol(params.symbol, params.file_path);
19
+ uri = resolved.uri;
20
+ position = resolved.position;
21
+ }
22
+ else if (params.file_path && params.line && params.column) {
23
+ const prepared = await engine.prepareFile(params.file_path);
24
+ uri = prepared.uri;
25
+ position = toPosition(params.line, params.column);
26
+ }
27
+ else {
28
+ return 'Error: Provide either symbol name or file_path + line + column.';
29
+ }
30
+ const result = await engine.request('textDocument/hover', {
31
+ textDocument: { uri },
32
+ position,
33
+ });
34
+ return formatHover(result);
35
+ },
36
+ });
37
+ //# sourceMappingURL=hover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hover.js","sourceRoot":"","sources":["../../../src/tools/primitives/hover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC;IAC9B,IAAI,EAAE,OAAO;IACb,WAAW,EACT,2JAA2J;IAC7J,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mEAAmE,CAAC;QAC3G,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;QAC3F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC7D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;KAClE,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,IAAI,GAAW,CAAC;QAChB,IAAI,QAA6C,CAAC;QAElD,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7E,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YACnB,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;QAC/B,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAC5D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC5D,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YACnB,QAAQ,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,iEAAiE,CAAC;QAC3E,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAAe,oBAAoB,EAAE;YACtE,YAAY,EAAE,EAAE,GAAG,EAAE;YACrB,QAAQ;SACT,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export declare const rename: import("../registry.js").ToolDef;
@@ -0,0 +1,56 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { toPosition, fromPosition, relativePath, uriToPath } from '../../engine/positions.js';
4
+ export const rename = defineTool({
5
+ name: 'rename',
6
+ description: 'Preview or execute a semantic rename across the codebase. Use dry_run=true (default) to see what would change before committing.',
7
+ schema: z.object({
8
+ symbol: z.string().optional().describe('Symbol name. Use this OR file_path+line+column.'),
9
+ file_path: z.string().optional().describe('Absolute file path'),
10
+ line: z.number().optional().describe('1-indexed line number'),
11
+ column: z.number().optional().describe('1-indexed column number'),
12
+ new_name: z.string().describe('New name for the symbol'),
13
+ dry_run: z.boolean().default(true).describe('If true, only preview changes without applying'),
14
+ }),
15
+ annotations: { readOnlyHint: false },
16
+ async handler(params, engine) {
17
+ let uri, position;
18
+ if (params.symbol) {
19
+ const resolved = await engine.resolveSymbol(params.symbol, params.file_path);
20
+ uri = resolved.uri;
21
+ position = resolved.position;
22
+ }
23
+ else if (params.file_path && params.line && params.column) {
24
+ const prepared = await engine.prepareFile(params.file_path);
25
+ uri = prepared.uri;
26
+ position = toPosition(params.line, params.column);
27
+ }
28
+ else {
29
+ return 'Error: Provide either symbol name or file_path + line + column.';
30
+ }
31
+ const result = await engine.request('textDocument/rename', {
32
+ textDocument: { uri }, position, newName: params.new_name,
33
+ });
34
+ if (!result || !result.changes)
35
+ return 'Rename not available for this symbol.';
36
+ const lines = [`# Rename Preview: → ${params.new_name}\n`];
37
+ let totalEdits = 0;
38
+ for (const [fileUri, edits] of Object.entries(result.changes)) {
39
+ const rel = relativePath(uriToPath(fileUri), engine.workspaceRoot);
40
+ lines.push(`## ${rel} (${edits.length} changes)`);
41
+ for (const edit of edits) {
42
+ const pos = fromPosition(edit.range.start);
43
+ lines.push(`- L${pos.line}: \`${edit.newText}\``);
44
+ totalEdits++;
45
+ }
46
+ lines.push('');
47
+ }
48
+ const fileCount = Object.keys(result.changes).length;
49
+ lines.unshift(`${totalEdits} changes across ${fileCount} files${params.dry_run ? ' (dry run)' : ''}\n`);
50
+ if (params.dry_run) {
51
+ lines.push('*This is a dry run. Set dry_run=false to apply.*');
52
+ }
53
+ return lines.join('\n');
54
+ },
55
+ });
56
+ //# sourceMappingURL=rename.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rename.js","sourceRoot":"","sources":["../../../src/tools/primitives/rename.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const typeHierarchy: import("../registry.js").ToolDef;
@@ -0,0 +1,49 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { toPosition, fromPosition, relativePath, uriToPath } from '../../engine/positions.js';
4
+ export const typeHierarchy = defineTool({
5
+ name: 'type_hierarchy',
6
+ description: 'Explore inheritance relationships — supertypes and subtypes. Use to understand class/interface hierarchies.',
7
+ schema: z.object({
8
+ symbol: z.string().optional().describe('Symbol name. Use this OR file_path+line+column.'),
9
+ file_path: z.string().optional().describe('Absolute file path'),
10
+ line: z.number().optional().describe('1-indexed line number'),
11
+ column: z.number().optional().describe('1-indexed column number'),
12
+ direction: z.enum(['supertypes', 'subtypes']).default('supertypes'),
13
+ }),
14
+ async handler(params, engine) {
15
+ let uri, position;
16
+ if (params.symbol) {
17
+ const resolved = await engine.resolveSymbol(params.symbol, params.file_path);
18
+ uri = resolved.uri;
19
+ position = resolved.position;
20
+ }
21
+ else if (params.file_path && params.line && params.column) {
22
+ const prepared = await engine.prepareFile(params.file_path);
23
+ uri = prepared.uri;
24
+ position = toPosition(params.line, params.column);
25
+ }
26
+ else {
27
+ return 'Error: Provide either symbol name or file_path + line + column.';
28
+ }
29
+ const items = await engine.request('textDocument/prepareTypeHierarchy', { textDocument: { uri }, position });
30
+ if (!items || items.length === 0)
31
+ return 'No type hierarchy available for this symbol.';
32
+ const item = items[0];
33
+ const method = params.direction === 'supertypes'
34
+ ? 'typeHierarchy/supertypes' : 'typeHierarchy/subtypes';
35
+ const related = await engine.request(method, { item });
36
+ if (!related || related.length === 0) {
37
+ return `No ${params.direction} found for ${item.name}.`;
38
+ }
39
+ const label = params.direction === 'supertypes' ? 'Supertypes' : 'Subtypes';
40
+ const lines = [`# ${label} of ${item.name}\n\n${related.length} types\n`];
41
+ for (const t of related) {
42
+ const rel = relativePath(uriToPath(t.uri), engine.workspaceRoot);
43
+ const pos = fromPosition(t.selectionRange.start);
44
+ lines.push(`- **${t.name}** — ${rel}:${pos.line}`);
45
+ }
46
+ return lines.join('\n');
47
+ },
48
+ });
49
+ //# sourceMappingURL=typeHierarchy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typeHierarchy.js","sourceRoot":"","sources":["../../../src/tools/primitives/typeHierarchy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const workspaceSymbols: import("../registry.js").ToolDef;
@@ -0,0 +1,32 @@
1
+ import { z } from 'zod';
2
+ import { defineTool } from '../registry.js';
3
+ import { fromPosition, relativePath, uriToPath } from '../../engine/positions.js';
4
+ const SYMBOL_KINDS = {
5
+ 1: 'File', 2: 'Module', 5: 'Class', 6: 'Method', 7: 'Property',
6
+ 10: 'Enum', 11: 'Interface', 12: 'Function', 13: 'Variable', 14: 'Constant',
7
+ };
8
+ export const workspaceSymbols = defineTool({
9
+ name: 'workspace_symbols',
10
+ description: 'Search for symbols by name across the entire workspace. Use when you know a name but not its location.',
11
+ schema: z.object({
12
+ query: z.string().describe('Search query — symbol name or partial match'),
13
+ limit: z.number().default(20).describe('Max results'),
14
+ }),
15
+ async handler(params, engine) {
16
+ const result = await engine.request('workspace/symbol', {
17
+ query: params.query,
18
+ });
19
+ if (!result || result.length === 0)
20
+ return `No symbols found matching "${params.query}".`;
21
+ const limited = result.slice(0, params.limit);
22
+ const lines = [`# Workspace Symbols: "${params.query}"\n\n${limited.length} results\n`];
23
+ for (const sym of limited) {
24
+ const kind = SYMBOL_KINDS[sym.kind] ?? 'Unknown';
25
+ const pos = fromPosition(sym.location.range.start);
26
+ const rel = relativePath(uriToPath(sym.location.uri), engine.workspaceRoot);
27
+ lines.push(`- **${sym.name}** (${kind}) — ${rel}:${pos.line}`);
28
+ }
29
+ return lines.join('\n');
30
+ },
31
+ });
32
+ //# sourceMappingURL=workspaceSymbols.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspaceSymbols.js","sourceRoot":"","sources":["../../../src/tools/primitives/workspaceSymbols.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGlF,MAAM,YAAY,GAA2B;IAC3C,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU;IAC9D,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU;CAC5E,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;IACzC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EAAE,wGAAwG;IACrH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QACzE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;KACtD,CAAC;IACF,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM;QAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,OAAO,CAA6B,kBAAkB,EAAE;YAClF,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,8BAA8B,MAAM,CAAC,KAAK,IAAI,CAAC;QAE1F,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,CAAC,yBAAyB,MAAM,CAAC,KAAK,QAAQ,OAAO,CAAC,MAAM,YAAY,CAAC,CAAC;QACxF,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC;YACjD,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnD,MAAM,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;YAC5E,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { ZodRawShape } from 'zod';
3
+ import { z } from 'zod';
4
+ import type { LspEngine } from '../engine/LspEngine.js';
5
+ export interface ToolDef {
6
+ name: string;
7
+ description: string;
8
+ schema: z.ZodObject<any>;
9
+ annotations?: Record<string, boolean>;
10
+ handler: (params: any, engine: LspEngine) => Promise<string>;
11
+ }
12
+ export declare function defineTool<S extends ZodRawShape>(def: {
13
+ name: string;
14
+ description: string;
15
+ schema: z.ZodObject<S>;
16
+ annotations?: Record<string, boolean>;
17
+ handler: (params: z.infer<z.ZodObject<S>>, engine: LspEngine) => Promise<string>;
18
+ }): ToolDef;
19
+ export declare function registerAll(server: McpServer, engine: LspEngine, tools: ToolDef[]): void;
@@ -0,0 +1,19 @@
1
+ export function defineTool(def) {
2
+ return def;
3
+ }
4
+ export function registerAll(server, engine, tools) {
5
+ for (const tool of tools) {
6
+ server.tool(tool.name, tool.description, tool.schema.shape, async (params) => {
7
+ try {
8
+ const parsed = tool.schema.parse(params);
9
+ const text = await tool.handler(parsed, engine);
10
+ return { content: [{ type: 'text', text }] };
11
+ }
12
+ catch (err) {
13
+ const msg = err instanceof Error ? err.message : String(err);
14
+ return { content: [{ type: 'text', text: `Error: ${msg}` }], isError: true };
15
+ }
16
+ });
17
+ }
18
+ }
19
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,UAAU,CAAwB,GAMjD;IACC,OAAO,GAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAiB,EAAE,MAAiB,EAAE,KAAgB;IAChF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,CAAC,IAAI,CACT,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,MAAM,CAAC,KAAK,EACjB,KAAK,EAAE,MAA+B,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACzC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAChD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;YACxD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;YACxF,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;AACH,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "lsp-intelligence",
3
+ "version": "0.1.0",
4
+ "description": "LSP-powered code intelligence MCP server for AI coding agents",
5
+ "type": "module",
6
+ "bin": {
7
+ "lsp-intelligence": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "prepublishOnly": "tsc",
17
+ "start": "tsx src/index.ts",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "typecheck": "tsc --noEmit"
21
+ },
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.0.0",
24
+ "vscode-jsonrpc": "^8.2.0",
25
+ "vscode-languageserver-protocol": "^3.17.5",
26
+ "typescript-language-server": "^4.0.0",
27
+ "zod": "^3.25.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^20.0.0",
31
+ "tsx": "^4.0.0",
32
+ "typescript": "^5.4.0",
33
+ "vitest": "^4.1.1"
34
+ },
35
+ "engines": {
36
+ "node": ">=20.0.0"
37
+ },
38
+ "packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610"
39
+ }