Files
variet_llm/.agent/scripts/translate_skills.js
2026-04-05 00:43:39 +09:00

54 lines
4.3 KiB
JavaScript

const fs = require('fs');
const path = require('path');
const skillsDir = path.join(__dirname, '../skills');
// Translation Dictionary (Folder Name -> Korean Description)
const translations = {
'brainstorming': '창의적인 작업(기능 추가, 컴포넌트 설계) 시작 전 필수 사용. 구현 전 의도와 요구사항을 파악하고 기획합니다.',
'defuddle': 'URL 링크를 통해 웹페이지 문서의 군더더기를 제거하고 깔끔한 마크다운 정보만 추출하여 분석합니다.',
'dispatching-parallel-agents': '상태 공유나 순차적 의존성이 없는 2개 이상의 독립적인 작업을 병렬로 처리할 때 사용합니다.',
'executing-plans': '작성된 구현 계획서(PLAN)를 바탕으로 단계별 코드 작성을 실행하고 리뷰 체크포인트를 수행합니다.',
'finishing-a-development-branch': '구현 및 테스트가 100% 완료된 후, 브랜치 병합(Merge/PR)을 결정하거나 정리하는 마무리 스킬입니다.',
'json-canvas': 'JSON Canvas 형식의 시각적 마인드맵, 노드, 다이어그램, 플로우차트 파일(.canvas)을 생성하고 편집합니다.',
'obsidian-bases': '옵시디언의 데이터베이스 뷰, 필터, 수식, 요약 기능 등을 포함하는 Base 파일(.base)을 통제합니다.',
'obsidian-cli': '옵시디언 CLI 환경을 제어해 노트를 검색/생성하고, 플러그인을 디버깅하거나 에러를 캡처합니다.',
'obsidian-markdown': '위키링크([[ ]]), 콜아웃, 프로퍼티(YAML) 등 옵시디언에 특화된 마크다운 문법(.md)을 완벽하게 작성합니다.',
'receiving-code-review': '코드 리뷰 피드백을 수신했을 때, 무지성으로 반영하기 전 기술적인 타당성과 엣지 케이스를 검증합니다.',
'requesting-code-review': '주요 기능 구현이 끝났을 때, 코드를 메인(Main)에 병합하기 전 엄격한 품질 검증(코드 리뷰)을 스스로 요청합니다.',
'subagent-driven-development': '구현 계획서 내의 독립적인 작업(Task)들을 여러 하위 에이전트(Subagent)에게 병렬로 위임하여 개발을 가속합니다.',
'systematic-debugging': '버그, 테스트 실패, 예기치 않은 동작 발생 시, 해결책을 던지기 전 체계적인 디버깅 루프를 가동합니다.',
'test-driven-development': '실제 운영 코드를 작성하기 전, 무조건 먼저 실패하는 테스트 코드(TDD)를 작성하여 기능 명세를 강제합니다.',
'using-git-worktrees': '대규모 리팩토링이나 새로운 기능을 시작할 때 메인 환경을 오염시키지 않도록 격리된 Git Worktree를 생성합니다.',
'using-superpowers': '대화 시작 시 1회 필수 가동 스킬. 에이전트가 어떤 스킬과 자원을 보유하고 있는지 파악하고 환경을 준비합니다.',
'verification-before-completion': '작업을 최종 완료 처리하기 전, 테스트와 검증 명령어 라인을 강제로 실행하여 완벽한 성공 여부를 증명합니다.',
'writing-plans': '본격적인 코드 작성에 돌입하기 전, 복잡한 요구사항에 대한 아키텍처 스펙과 다단계 구현 계획서를 수립합니다.',
'writing-skills': '현재 CLI 시스템에 새로운 스킬 룰을 구축하거나, 기존 스킬 문서를 수정 및 디버깅할 때 사용합니다.'
};
let translatedCount = 0;
if (fs.existsSync(skillsDir)) {
const folders = fs.readdirSync(skillsDir);
folders.forEach(folder => {
const skillPath = path.join(skillsDir, folder, 'SKILL.md');
if (translations[folder] && fs.existsSync(skillPath)) {
let content = fs.readFileSync(skillPath, 'utf8');
// Regex to match existing description in YAML frontmatter (with or without quotes)
// It matches 'description:' followed by anything until the end of the line
const newContent = content.replace(/^description:\s*(?:".*?"|.*)$/m, `description: ${translations[folder]}`);
if (content !== newContent) {
fs.writeFileSync(skillPath, newContent, 'utf8');
console.log(`[Translated] ${folder}`);
translatedCount++;
}
}
});
}
console.log(`\n🎉 번역 완료: 총 ${translatedCount}개의 스킬 설명이 로컬라이징 되었습니다.`);