UNPKG

claude-data-academy

Version:

Claude Code용 데이터 학습 선생님 에이전트 NPX 설치 도구

137 lines (120 loc) 3.81 kB
const fs = require('fs-extra'); const path = require('path'); const chalk = require('chalk'); /** * Claude Code 프로젝트 검증 * @param {string} projectPath - 검증할 프로젝트 경로 * @returns {Promise<Object>} 검증 결과 */ async function validateClaudeProject(projectPath) { const agentsPath = path.join(projectPath, '.claude', 'agents'); try { // .claude/agents 디렉토리 존재 확인 const agentsExists = await fs.pathExists(agentsPath); if (!agentsExists) { // 디렉토리가 없으면 자동으로 생성 console.log(chalk.yellow('📁 .claude/agents 디렉토리가 없습니다.')); console.log(chalk.cyan('🔧 Claude Code 환경을 자동으로 설정합니다...')); try { await fs.ensureDir(agentsPath); console.log(chalk.green('✅ .claude/agents 디렉토리를 생성했습니다!')); console.log(chalk.gray(` 위치: ${agentsPath}`)); } catch (createError) { return { isValid: false, reason: `디렉토리 생성 실패: ${createError.message}`, agentsPath: null }; } } // 디렉토리 읽기 권한 확인 try { await fs.readdir(agentsPath); } catch (error) { return { isValid: false, reason: '.claude/agents 디렉토리에 대한 읽기 권한이 없습니다.', agentsPath: null }; } // 설치된 선생님들 확인 const installedTeachers = await getInstalledTeachers(agentsPath); return { isValid: true, agentsPath, installedTeachers, projectPath }; } catch (error) { return { isValid: false, reason: `프로젝트 검증 중 오류 발생: ${error.message}`, agentsPath: null }; } } /** * 설치된 선생님 목록 조회 * @param {string} agentsPath - agents 디렉토리 경로 * @returns {Promise<Array>} 설치된 선생님 목록 */ async function getInstalledTeachers(agentsPath) { try { const files = await fs.readdir(agentsPath); const teacherFiles = files.filter(file => file.endsWith('-teacher.md') && (file.startsWith('data-') || file.startsWith('ai-')) ); return teacherFiles.map(file => { const teacherName = file.replace('-teacher.md', ''); return { name: teacherName, fileName: file, fullPath: path.join(agentsPath, file) }; }); } catch (error) { console.warn(chalk.yellow(`⚠️ 설치된 선생님 확인 중 오류: ${error.message}`)); return []; } } /** * 설치 전 사전 검증 * @param {string} agentsPath - agents 디렉토리 경로 * @param {Array} teachersToInstall - 설치할 선생님 목록 * @returns {Promise<Object>} 검증 결과 */ async function validateInstallation(agentsPath, teachersToInstall) { const results = { canInstall: true, warnings: [], conflicts: [] }; // 쓰기 권한 확인 try { await fs.access(agentsPath, fs.constants.W_OK); } catch (error) { results.canInstall = false; results.warnings.push('agents 디렉토리에 대한 쓰기 권한이 없습니다.'); return results; } // 기존 파일 충돌 확인 for (const teacher of teachersToInstall) { const teacherFilePath = path.join(agentsPath, `${teacher}-teacher.md`); const exists = await fs.pathExists(teacherFilePath); if (exists) { results.conflicts.push({ teacher, filePath: teacherFilePath }); } } if (results.conflicts.length > 0) { results.warnings.push(`${results.conflicts.length}개의 선생님이 이미 설치되어 있습니다.`); } return results; } module.exports = { validateClaudeProject, getInstalledTeachers, validateInstallation };