UNPKG

unity-mcp

Version:

Model Context Protocol server for Unity.

54 lines (53 loc) 2.56 kB
import fs from 'fs/promises'; import { homedir } from 'os'; import { join, resolve } from 'path'; export class ProjectService { async listFilesInProject(projectTitle) { const projectList = await this.listProjects(); const project = projectList.find((p) => p.title === projectTitle); if (!project) { throw new Error(`Project with title ${projectTitle} not found`); } const files = await this.listFilesInDirectoryRecursively(project.path); return files; } async listProjects() { const projectListFilePath = this.getUnityProjectsFilePath(); const json = await fs.readFile(projectListFilePath, 'utf-8'); const projectList = JSON.parse(json); return Object.values(projectList.data).filter((project) => project.title && project.path); } getUnityProjectsFilePath() { const unityHubDirectoryPath = this.getUnityHubDirectoryPath(); return join(unityHubDirectoryPath, 'projects-v1.json'); } getUnityHubDirectoryPath() { if (process.platform === 'win32') { return resolve(homedir(), 'AppData', 'Roaming', 'UnityHub'); } if (process.platform === 'darwin') { return resolve(homedir(), 'Library', 'Application Support', 'Unity', 'Hub'); } return resolve(homedir(), '.config', 'UnityHub'); } async listFilesInDirectoryRecursively(directoryPath) { const files = await fs.readdir(directoryPath); const filesWithStats = await Promise.all(files.map(async (file) => { const fullPath = join(directoryPath, file); const stats = await fs.stat(fullPath); return { fileName: file, fullPath, stats }; })); const filesInDirectory = filesWithStats.filter((file) => file.stats.isFile() && !file.fileName.startsWith('.') && !file.fileName.endsWith('.meta') && !file.fileName.startsWith('Lightmap')); const directories = filesWithStats.filter((file) => file.stats.isDirectory()); const ignoredDirectories = ['Library', 'Temp', 'obj', 'bin', '.git']; const filteredDirectories = directories.filter((directory) => !ignoredDirectories.includes(directory.fileName)); const filesInSubdirectories = await Promise.all(filteredDirectories.map((directory) => this.listFilesInDirectoryRecursively(directory.fullPath))); return [ ...filesInDirectory.map((file) => file.fullPath), ...filesInSubdirectories.flat() ]; } }