@treedy/lsp-mcp 0.1.9 → 0.2.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.
- package/dist/index.js +77 -28
- package/dist/index.js.map +6 -6
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -19891,7 +19891,7 @@ function loadConfig() {
|
|
|
19891
19891
|
}
|
|
19892
19892
|
};
|
|
19893
19893
|
for (const [lang, cfg] of Object.entries(merged.languages)) {
|
|
19894
|
-
if (!cfg.extensions && DEFAULT_EXTENSIONS[lang]) {
|
|
19894
|
+
if (cfg && !cfg.extensions && DEFAULT_EXTENSIONS[lang]) {
|
|
19895
19895
|
cfg.extensions = DEFAULT_EXTENSIONS[lang];
|
|
19896
19896
|
}
|
|
19897
19897
|
}
|
|
@@ -19958,9 +19958,36 @@ function getEnvString(name, defaultValue) {
|
|
|
19958
19958
|
return process.env[name] ?? defaultValue;
|
|
19959
19959
|
}
|
|
19960
19960
|
function inferLanguageFromPath(filePath, config2) {
|
|
19961
|
+
if (fs.existsSync(filePath)) {
|
|
19962
|
+
try {
|
|
19963
|
+
const stat = fs.statSync(filePath);
|
|
19964
|
+
if (stat.isDirectory()) {
|
|
19965
|
+
if (config2.languages.typescript?.enabled && (fs.existsSync(path.join(filePath, "tsconfig.json")) || fs.existsSync(path.join(filePath, "package.json")))) {
|
|
19966
|
+
return "typescript";
|
|
19967
|
+
}
|
|
19968
|
+
if (config2.languages.python?.enabled && (fs.existsSync(path.join(filePath, "pyproject.toml")) || fs.existsSync(path.join(filePath, "requirements.txt")) || fs.existsSync(path.join(filePath, "setup.py")) || fs.existsSync(path.join(filePath, "venv")) || fs.existsSync(path.join(filePath, ".venv")))) {
|
|
19969
|
+
return "python";
|
|
19970
|
+
}
|
|
19971
|
+
if (config2.languages.vue?.enabled && (fs.existsSync(path.join(filePath, "vite.config.ts")) || fs.existsSync(path.join(filePath, "vue.config.js")))) {
|
|
19972
|
+
return "vue";
|
|
19973
|
+
}
|
|
19974
|
+
try {
|
|
19975
|
+
const entries = fs.readdirSync(filePath);
|
|
19976
|
+
for (const entry of entries) {
|
|
19977
|
+
if (entry.endsWith(".ts") && config2.languages.typescript?.enabled)
|
|
19978
|
+
return "typescript";
|
|
19979
|
+
if (entry.endsWith(".py") && config2.languages.python?.enabled)
|
|
19980
|
+
return "python";
|
|
19981
|
+
if (entry.endsWith(".vue") && config2.languages.vue?.enabled)
|
|
19982
|
+
return "vue";
|
|
19983
|
+
}
|
|
19984
|
+
} catch {}
|
|
19985
|
+
}
|
|
19986
|
+
} catch (e) {}
|
|
19987
|
+
}
|
|
19961
19988
|
const ext = filePath.substring(filePath.lastIndexOf("."));
|
|
19962
19989
|
for (const [lang, langConfig] of Object.entries(config2.languages)) {
|
|
19963
|
-
if (langConfig
|
|
19990
|
+
if (langConfig?.enabled && langConfig.extensions.includes(ext)) {
|
|
19964
19991
|
return lang;
|
|
19965
19992
|
}
|
|
19966
19993
|
}
|
|
@@ -20944,7 +20971,7 @@ class BackendManager {
|
|
|
20944
20971
|
}
|
|
20945
20972
|
async getAllTools() {
|
|
20946
20973
|
const result = new Map;
|
|
20947
|
-
const languages = Object.keys(this.config.languages).filter((lang) => this.config.languages[lang]
|
|
20974
|
+
const languages = Object.keys(this.config.languages).filter((lang) => this.config.languages[lang]?.enabled);
|
|
20948
20975
|
await Promise.all(languages.map(async (lang) => {
|
|
20949
20976
|
try {
|
|
20950
20977
|
const tools = await this.getTools(lang);
|
|
@@ -20983,7 +21010,7 @@ class BackendManager {
|
|
|
20983
21010
|
};
|
|
20984
21011
|
}
|
|
20985
21012
|
for (const [lang, config2] of Object.entries(this.config.languages)) {
|
|
20986
|
-
if (config2.enabled && !this.backends.has(lang)) {
|
|
21013
|
+
if (config2 && config2.enabled && !this.backends.has(lang)) {
|
|
20987
21014
|
status[lang] = { status: "not_started", tools: 0, restartCount: 0 };
|
|
20988
21015
|
}
|
|
20989
21016
|
}
|
|
@@ -20991,7 +21018,7 @@ class BackendManager {
|
|
|
20991
21018
|
}
|
|
20992
21019
|
getVersions() {
|
|
20993
21020
|
const versions2 = [];
|
|
20994
|
-
const languages = Object.keys(this.config.languages).filter((lang) => this.config.languages[lang]
|
|
21021
|
+
const languages = Object.keys(this.config.languages).filter((lang) => this.config.languages[lang]?.enabled);
|
|
20995
21022
|
for (const lang of languages) {
|
|
20996
21023
|
const backendConfig = getBackendCommand(lang, this.config);
|
|
20997
21024
|
const state = this.backends.get(lang);
|
|
@@ -21066,14 +21093,14 @@ async function status(backendManager, config2) {
|
|
|
21066
21093
|
description: "Unified MCP server for multi-language code intelligence",
|
|
21067
21094
|
config: {
|
|
21068
21095
|
python: {
|
|
21069
|
-
enabled: config2.python
|
|
21070
|
-
provider: config2.python
|
|
21096
|
+
enabled: config2.languages.python?.enabled ?? false,
|
|
21097
|
+
provider: config2.python?.provider
|
|
21071
21098
|
},
|
|
21072
21099
|
typescript: {
|
|
21073
|
-
enabled: config2.typescript
|
|
21100
|
+
enabled: config2.languages.typescript?.enabled ?? false
|
|
21074
21101
|
},
|
|
21075
21102
|
vue: {
|
|
21076
|
-
enabled: config2.vue
|
|
21103
|
+
enabled: config2.languages.vue?.enabled ?? false
|
|
21077
21104
|
},
|
|
21078
21105
|
autoUpdate: config2.autoUpdate
|
|
21079
21106
|
},
|
|
@@ -21167,8 +21194,8 @@ async function listBackends(backendManager, config2) {
|
|
|
21167
21194
|
const backends = [
|
|
21168
21195
|
{
|
|
21169
21196
|
name: "python",
|
|
21170
|
-
enabled: config2.python
|
|
21171
|
-
provider: config2.python
|
|
21197
|
+
enabled: config2.languages.python?.enabled ?? false,
|
|
21198
|
+
provider: config2.python?.provider,
|
|
21172
21199
|
status: backendStatus.python?.status || "not_started",
|
|
21173
21200
|
tools: backendStatus.python?.tools || 0,
|
|
21174
21201
|
description: "Python code intelligence (hover, definition, references, refactoring)",
|
|
@@ -21176,7 +21203,7 @@ async function listBackends(backendManager, config2) {
|
|
|
21176
21203
|
},
|
|
21177
21204
|
{
|
|
21178
21205
|
name: "typescript",
|
|
21179
|
-
enabled: config2.typescript
|
|
21206
|
+
enabled: config2.languages.typescript?.enabled ?? false,
|
|
21180
21207
|
status: backendStatus.typescript?.status || "not_started",
|
|
21181
21208
|
tools: backendStatus.typescript?.tools || 0,
|
|
21182
21209
|
description: "TypeScript/JavaScript code intelligence",
|
|
@@ -21184,7 +21211,7 @@ async function listBackends(backendManager, config2) {
|
|
|
21184
21211
|
},
|
|
21185
21212
|
{
|
|
21186
21213
|
name: "vue",
|
|
21187
|
-
enabled: config2.vue
|
|
21214
|
+
enabled: config2.languages.vue?.enabled ?? false,
|
|
21188
21215
|
status: backendStatus.vue?.status || "not_started",
|
|
21189
21216
|
tools: backendStatus.vue?.tools || 0,
|
|
21190
21217
|
description: "Vue Single File Component (.vue) code intelligence via Volar",
|
|
@@ -21206,7 +21233,7 @@ var startBackendSchema = {
|
|
|
21206
21233
|
language: exports_external.enum(["python", "typescript", "vue"]).describe("The backend to start")
|
|
21207
21234
|
};
|
|
21208
21235
|
async function startBackend(language, backendManager, config2, registerToolsCallback) {
|
|
21209
|
-
if (language === "python" && !config2.python
|
|
21236
|
+
if (language === "python" && !config2.languages.python?.enabled) {
|
|
21210
21237
|
return {
|
|
21211
21238
|
content: [{
|
|
21212
21239
|
type: "text",
|
|
@@ -21218,7 +21245,7 @@ async function startBackend(language, backendManager, config2, registerToolsCall
|
|
|
21218
21245
|
}]
|
|
21219
21246
|
};
|
|
21220
21247
|
}
|
|
21221
|
-
if (language === "typescript" && !config2.typescript
|
|
21248
|
+
if (language === "typescript" && !config2.languages.typescript?.enabled) {
|
|
21222
21249
|
return {
|
|
21223
21250
|
content: [{
|
|
21224
21251
|
type: "text",
|
|
@@ -21230,7 +21257,7 @@ async function startBackend(language, backendManager, config2, registerToolsCall
|
|
|
21230
21257
|
}]
|
|
21231
21258
|
};
|
|
21232
21259
|
}
|
|
21233
|
-
if (language === "vue" && !config2.vue
|
|
21260
|
+
if (language === "vue" && !config2.languages.vue?.enabled) {
|
|
21234
21261
|
return {
|
|
21235
21262
|
content: [{
|
|
21236
21263
|
type: "text",
|
|
@@ -21279,7 +21306,7 @@ var updateBackendSchema = {
|
|
|
21279
21306
|
language: exports_external.enum(["python", "typescript", "vue"]).describe("The backend to update")
|
|
21280
21307
|
};
|
|
21281
21308
|
async function updateBackend(language, backendManager, config2, updateCallback) {
|
|
21282
|
-
if (language === "python" && !config2.python
|
|
21309
|
+
if (language === "python" && !config2.languages.python?.enabled) {
|
|
21283
21310
|
return {
|
|
21284
21311
|
content: [{
|
|
21285
21312
|
type: "text",
|
|
@@ -21291,7 +21318,7 @@ async function updateBackend(language, backendManager, config2, updateCallback)
|
|
|
21291
21318
|
}]
|
|
21292
21319
|
};
|
|
21293
21320
|
}
|
|
21294
|
-
if (language === "typescript" && !config2.typescript
|
|
21321
|
+
if (language === "typescript" && !config2.languages.typescript?.enabled) {
|
|
21295
21322
|
return {
|
|
21296
21323
|
content: [{
|
|
21297
21324
|
type: "text",
|
|
@@ -21303,7 +21330,7 @@ async function updateBackend(language, backendManager, config2, updateCallback)
|
|
|
21303
21330
|
}]
|
|
21304
21331
|
};
|
|
21305
21332
|
}
|
|
21306
|
-
if (language === "vue" && !config2.vue
|
|
21333
|
+
if (language === "vue" && !config2.languages.vue?.enabled) {
|
|
21307
21334
|
return {
|
|
21308
21335
|
content: [{
|
|
21309
21336
|
type: "text",
|
|
@@ -22067,7 +22094,15 @@ function preRegisterTools() {
|
|
|
22067
22094
|
content: [{ type: "text", text: JSON.stringify({ error: "Missing 'file' or 'path' argument required for unified routing" }) }]
|
|
22068
22095
|
};
|
|
22069
22096
|
}
|
|
22070
|
-
|
|
22097
|
+
let absPath = filePath;
|
|
22098
|
+
if (!path2.isAbsolute(filePath)) {
|
|
22099
|
+
if (activeWorkspacePath) {
|
|
22100
|
+
absPath = path2.join(activeWorkspacePath, filePath);
|
|
22101
|
+
} else {
|
|
22102
|
+
absPath = path2.resolve(filePath);
|
|
22103
|
+
}
|
|
22104
|
+
}
|
|
22105
|
+
const language = inferLanguageFromPath(absPath, config2);
|
|
22071
22106
|
if (!language) {
|
|
22072
22107
|
return {
|
|
22073
22108
|
content: [
|
|
@@ -22095,8 +22130,22 @@ function preRegisterTools() {
|
|
|
22095
22130
|
}
|
|
22096
22131
|
}
|
|
22097
22132
|
} catch (error2) {
|
|
22133
|
+
const msg = String(error2);
|
|
22134
|
+
let hint = "";
|
|
22135
|
+
if (msg.includes("ENOENT")) {
|
|
22136
|
+
if (language === "python")
|
|
22137
|
+
hint = "Make sure 'uv' (recommended) or 'python' is installed and in your PATH.";
|
|
22138
|
+
else
|
|
22139
|
+
hint = "Make sure 'node' and 'npm' are installed and in your PATH.";
|
|
22140
|
+
} else {
|
|
22141
|
+
hint = "Check server logs for details. You may need to install the backend manually.";
|
|
22142
|
+
}
|
|
22098
22143
|
return {
|
|
22099
|
-
content: [{ type: "text", text: JSON.stringify({
|
|
22144
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
22145
|
+
error: `Failed to start ${language} backend`,
|
|
22146
|
+
details: msg,
|
|
22147
|
+
hint
|
|
22148
|
+
}, null, 2) }]
|
|
22100
22149
|
};
|
|
22101
22150
|
}
|
|
22102
22151
|
}
|
|
@@ -22143,14 +22192,14 @@ ${summary || "(No symbols found)"}`
|
|
|
22143
22192
|
}
|
|
22144
22193
|
if (tool.name === "read_file_with_hints") {
|
|
22145
22194
|
try {
|
|
22146
|
-
let
|
|
22195
|
+
let absPath2 = filePath;
|
|
22147
22196
|
if (!path2.isAbsolute(filePath) && activeWorkspacePath) {
|
|
22148
|
-
|
|
22197
|
+
absPath2 = path2.join(activeWorkspacePath, filePath);
|
|
22149
22198
|
}
|
|
22150
|
-
if (!fs2.existsSync(
|
|
22151
|
-
return { content: [{ type: "text", text: JSON.stringify({ error: `File not found: ${
|
|
22199
|
+
if (!fs2.existsSync(absPath2)) {
|
|
22200
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: `File not found: ${absPath2}` }) }] };
|
|
22152
22201
|
}
|
|
22153
|
-
const content = fs2.readFileSync(
|
|
22202
|
+
const content = fs2.readFileSync(absPath2, "utf-8");
|
|
22154
22203
|
const result = await backendManager.callTool(language, "inlay_hints", args);
|
|
22155
22204
|
const parsed = JSON.parse(result.content[0].text);
|
|
22156
22205
|
if (parsed.error) {
|
|
@@ -22183,7 +22232,7 @@ ${summary || "(No symbols found)"}`
|
|
|
22183
22232
|
registeredTools.add(tool.name);
|
|
22184
22233
|
}
|
|
22185
22234
|
for (const [language, langConfig] of Object.entries(config2.languages)) {
|
|
22186
|
-
if (!langConfig
|
|
22235
|
+
if (!langConfig?.enabled)
|
|
22187
22236
|
continue;
|
|
22188
22237
|
const tools = LANGUAGE_SPECIFIC_TOOLS[language];
|
|
22189
22238
|
if (!tools)
|
|
@@ -22261,4 +22310,4 @@ main().catch((error2) => {
|
|
|
22261
22310
|
process.exit(1);
|
|
22262
22311
|
});
|
|
22263
22312
|
|
|
22264
|
-
//# debugId=
|
|
22313
|
+
//# debugId=B5844EF744B1563264756E2164756E21
|