@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 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.enabled && langConfig.extensions.includes(ext)) {
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].enabled);
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].enabled);
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.enabled,
21070
- provider: config2.python.provider
21096
+ enabled: config2.languages.python?.enabled ?? false,
21097
+ provider: config2.python?.provider
21071
21098
  },
21072
21099
  typescript: {
21073
- enabled: config2.typescript.enabled
21100
+ enabled: config2.languages.typescript?.enabled ?? false
21074
21101
  },
21075
21102
  vue: {
21076
- enabled: config2.vue.enabled
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.enabled,
21171
- provider: config2.python.provider,
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.enabled,
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.enabled,
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.enabled) {
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.enabled) {
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.enabled) {
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.enabled) {
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.enabled) {
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.enabled) {
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
- const language = inferLanguageFromPath(filePath, config2);
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({ error: `Failed to start ${language} backend: ${error2}` }) }]
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 absPath = filePath;
22195
+ let absPath2 = filePath;
22147
22196
  if (!path2.isAbsolute(filePath) && activeWorkspacePath) {
22148
- absPath = path2.join(activeWorkspacePath, filePath);
22197
+ absPath2 = path2.join(activeWorkspacePath, filePath);
22149
22198
  }
22150
- if (!fs2.existsSync(absPath)) {
22151
- return { content: [{ type: "text", text: JSON.stringify({ error: `File not found: ${absPath}` }) }] };
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(absPath, "utf-8");
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.enabled)
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=52D8C4766CA64C6B64756E2164756E21
22313
+ //# debugId=B5844EF744B1563264756E2164756E21