@@ -160,87 +160,107 @@ export class McpConfigAnalyzer {
160160 const workspacePath = this . workspaceFolder . uri . fsPath
161161
162162 // Check for package.json (Node.js projects)
163- const packageJsonPath = path . join ( workspacePath , "package.json" )
164- if ( await fileExistsAtPath ( packageJsonPath ) ) {
165- try {
166- const content = await fs . readFile ( packageJsonPath , "utf-8" )
167- const packageData = JSON . parse ( content )
168-
169- // Add npm dependencies
170- const allDeps = {
171- ...packageData . dependencies ,
172- ...packageData . devDependencies ,
173- }
163+ try {
164+ const packageJsonPath = path . join ( workspacePath , "package.json" )
165+ if ( await fileExistsAtPath ( packageJsonPath ) ) {
166+ try {
167+ const content = await fs . readFile ( packageJsonPath , "utf-8" )
168+ const packageData = JSON . parse ( content )
169+
170+ // Add npm dependencies
171+ const allDeps = {
172+ ...packageData . dependencies ,
173+ ...packageData . devDependencies ,
174+ }
174175
175- for ( const [ name , version ] of Object . entries ( allDeps ) ) {
176- dependencies . push ( {
177- name,
178- type : "npm" ,
179- version : version as string ,
180- } )
176+ for ( const [ name , version ] of Object . entries ( allDeps ) ) {
177+ dependencies . push ( {
178+ name,
179+ type : "npm" ,
180+ version : version as string ,
181+ } )
182+ }
183+ } catch ( error ) {
184+ console . error ( "Error parsing package.json:" , error )
181185 }
182- } catch ( error ) {
183- console . error ( "Error parsing package.json:" , error )
184186 }
187+ } catch ( error ) {
188+ console . error ( "Error checking for package.json:" , error )
185189 }
186190
187191 // Check for requirements.txt (Python projects)
188- const requirementsPath = path . join ( workspacePath , "requirements.txt" )
189- if ( await fileExistsAtPath ( requirementsPath ) ) {
190- try {
191- const content = await fs . readFile ( requirementsPath , "utf-8" )
192- const lines = content . split ( "\n" ) . filter ( ( line ) => line . trim ( ) && ! line . startsWith ( "#" ) )
193-
194- for ( const line of lines ) {
195- const match = line . match ( / ^ ( [ ^ = < > ! ] + ) / )
196- if ( match ) {
197- dependencies . push ( {
198- name : match [ 1 ] . trim ( ) ,
199- type : "python" ,
200- } )
192+ try {
193+ const requirementsPath = path . join ( workspacePath , "requirements.txt" )
194+ if ( await fileExistsAtPath ( requirementsPath ) ) {
195+ try {
196+ const content = await fs . readFile ( requirementsPath , "utf-8" )
197+ const lines = content . split ( "\n" ) . filter ( ( line ) => line . trim ( ) && ! line . startsWith ( "#" ) )
198+
199+ for ( const line of lines ) {
200+ const match = line . match ( / ^ ( [ ^ = < > ! ] + ) / )
201+ if ( match ) {
202+ dependencies . push ( {
203+ name : match [ 1 ] . trim ( ) ,
204+ type : "python" ,
205+ } )
206+ }
201207 }
208+ } catch ( error ) {
209+ console . error ( "Error parsing requirements.txt:" , error )
202210 }
203- } catch ( error ) {
204- console . error ( "Error parsing requirements.txt:" , error )
205211 }
212+ } catch ( error ) {
213+ console . error ( "Error checking for requirements.txt:" , error )
206214 }
207215
208216 // Check for docker-compose.yml
209- const dockerComposePath = path . join ( workspacePath , "docker-compose.yml" )
210- const dockerComposeAltPath = path . join ( workspacePath , "docker-compose.yaml" )
211-
212- for ( const composePath of [ dockerComposePath , dockerComposeAltPath ] ) {
213- if ( await fileExistsAtPath ( composePath ) ) {
214- try {
215- const content = await fs . readFile ( composePath , "utf-8" )
216-
217- // Simple pattern matching for common services
218- if ( content . includes ( "neo4j" ) ) {
219- dependencies . push ( { name : "neo4j" , type : "docker" } )
220- }
221- if ( content . includes ( "postgres" ) || content . includes ( "postgresql" ) ) {
222- dependencies . push ( { name : "postgresql" , type : "docker" } )
223- }
224- if ( content . includes ( "redis" ) ) {
225- dependencies . push ( { name : "redis" , type : "docker" } )
217+ try {
218+ const dockerComposePath = path . join ( workspacePath , "docker-compose.yml" )
219+ const dockerComposeAltPath = path . join ( workspacePath , "docker-compose.yaml" )
220+
221+ for ( const composePath of [ dockerComposePath , dockerComposeAltPath ] ) {
222+ if ( await fileExistsAtPath ( composePath ) ) {
223+ try {
224+ const content = await fs . readFile ( composePath , "utf-8" )
225+
226+ // Simple pattern matching for common services
227+ if ( content . includes ( "neo4j" ) ) {
228+ dependencies . push ( { name : "neo4j" , type : "docker" } )
229+ }
230+ if ( content . includes ( "postgres" ) || content . includes ( "postgresql" ) ) {
231+ dependencies . push ( { name : "postgresql" , type : "docker" } )
232+ }
233+ if ( content . includes ( "redis" ) ) {
234+ dependencies . push ( { name : "redis" , type : "docker" } )
235+ }
236+ } catch ( error ) {
237+ console . error ( "Error parsing docker-compose file:" , error )
226238 }
227- } catch ( error ) {
228- console . error ( "Error parsing docker-compose file:" , error )
239+ break
229240 }
230- break
231241 }
242+ } catch ( error ) {
243+ console . error ( "Error checking for docker-compose files:" , error )
232244 }
233245
234246 // Check for .git directory
235- const gitPath = path . join ( workspacePath , ".git" )
236- if ( await fileExistsAtPath ( gitPath ) ) {
237- dependencies . push ( { name : ".git" , type : "config" } )
247+ try {
248+ const gitPath = path . join ( workspacePath , ".git" )
249+ if ( await fileExistsAtPath ( gitPath ) ) {
250+ dependencies . push ( { name : ".git" , type : "config" } )
251+ }
252+ } catch ( error ) {
253+ console . error ( "Error checking for .git directory:" , error )
238254 }
239255
240256 // Check for .github directory
241- const githubPath = path . join ( workspacePath , ".github" )
242- if ( await fileExistsAtPath ( githubPath ) ) {
243- dependencies . push ( { name : ".github" , type : "config" } )
257+ try {
258+ const githubPath = path . join ( workspacePath , ".github" )
259+ if ( await fileExistsAtPath ( githubPath ) ) {
260+ dependencies . push ( { name : ".github" , type : "config" } )
261+ }
262+ } catch ( error ) {
263+ console . error ( "Error checking for .github directory:" , error )
244264 }
245265
246266 return dependencies
@@ -289,43 +309,69 @@ export class McpConfigAnalyzer {
289309 const workspacePath = this . workspaceFolder . uri . fsPath
290310
291311 // Check for various project indicators
292- if ( await fileExistsAtPath ( path . join ( workspacePath , "package.json" ) ) ) {
293- const content = await fs . readFile ( path . join ( workspacePath , "package.json" ) , "utf-8" )
294- const data = JSON . parse ( content )
312+ try {
313+ if ( await fileExistsAtPath ( path . join ( workspacePath , "package.json" ) ) ) {
314+ try {
315+ const content = await fs . readFile ( path . join ( workspacePath , "package.json" ) , "utf-8" )
316+ const data = JSON . parse ( content )
295317
296- if ( data . dependencies ?. react || data . dependencies ?. [ "react-dom" ] ) {
297- return "react"
298- }
299- if ( data . dependencies ?. vue ) {
300- return "vue"
301- }
302- if ( data . dependencies ?. express || data . dependencies ?. fastify ) {
303- return "node-backend"
318+ if ( data . dependencies ?. react || data . dependencies ?. [ "react-dom" ] ) {
319+ return "react"
320+ }
321+ if ( data . dependencies ?. vue ) {
322+ return "vue"
323+ }
324+ if ( data . dependencies ?. express || data . dependencies ?. fastify ) {
325+ return "node-backend"
326+ }
327+ return "node"
328+ } catch ( error ) {
329+ // If we can't parse the package.json, still consider it a node project
330+ return "node"
331+ }
304332 }
305- return "node"
333+ } catch ( error ) {
334+ console . error ( "Error checking for package.json:" , error )
306335 }
307336
308- if ( await fileExistsAtPath ( path . join ( workspacePath , "requirements.txt" ) ) ) {
309- const content = await fs . readFile ( path . join ( workspacePath , "requirements.txt" ) , "utf-8" )
337+ try {
338+ if ( await fileExistsAtPath ( path . join ( workspacePath , "requirements.txt" ) ) ) {
339+ try {
340+ const content = await fs . readFile ( path . join ( workspacePath , "requirements.txt" ) , "utf-8" )
310341
311- if ( content . includes ( "django" ) ) {
312- return "django"
313- }
314- if ( content . includes ( "flask" ) ) {
315- return "flask"
316- }
317- if ( content . includes ( "fastapi" ) ) {
318- return "fastapi"
342+ if ( content . includes ( "django" ) ) {
343+ return "django"
344+ }
345+ if ( content . includes ( "flask" ) ) {
346+ return "flask"
347+ }
348+ if ( content . includes ( "fastapi" ) ) {
349+ return "fastapi"
350+ }
351+ return "python"
352+ } catch ( error ) {
353+ // If we can't read requirements.txt, still consider it a python project
354+ return "python"
355+ }
319356 }
320- return "python"
357+ } catch ( error ) {
358+ console . error ( "Error checking for requirements.txt:" , error )
321359 }
322360
323- if ( await fileExistsAtPath ( path . join ( workspacePath , "go.mod" ) ) ) {
324- return "go"
361+ try {
362+ if ( await fileExistsAtPath ( path . join ( workspacePath , "go.mod" ) ) ) {
363+ return "go"
364+ }
365+ } catch ( error ) {
366+ console . error ( "Error checking for go.mod:" , error )
325367 }
326368
327- if ( await fileExistsAtPath ( path . join ( workspacePath , "Cargo.toml" ) ) ) {
328- return "rust"
369+ try {
370+ if ( await fileExistsAtPath ( path . join ( workspacePath , "Cargo.toml" ) ) ) {
371+ return "rust"
372+ }
373+ } catch ( error ) {
374+ console . error ( "Error checking for Cargo.toml:" , error )
329375 }
330376
331377 return undefined
0 commit comments