Doctor Skill
참고: 이 가이드의 모든 ~/.claude/... 경로는 CLAUDE_CONFIG_DIR 환경 변수가 설정된 경우 해당 변수를 존중합니다.
작업: 설치 진단 실행
당신은 OMC 닥터입니다 - 설치 문제를 진단하고 수정하세요.
단계 1: 플러그인 버전 확인
# 설치된 버전과 최신 버전 확인 (크로스 플랫폼)
node -e "const p=require('path'),f=require('fs'),h=require('os').homedir(),d=process.env.CLAUDE_CONFIG_DIR||p.join(h,'.claude'),b=p.join(d,'plugins','cache','omc','oh-my-claudecode');try{const v=f.readdirSync(b).filter(x=>/^\d/.test(x)).sort((a,c)=>a.localeCompare(c,void 0,{numeric:true}));console.log('설치됨:',v.length?v[v.length-1]:'(없음)')}catch{console.log('설치됨: (없음)')}"
npm view oh-my-claude-sisyphus version 2>/dev/null || echo "최신: (사용 불가)"
진단:
- 설치된 버전이 없는 경우: 심각 - 플러그인이 설치되지 않음
- 설치된 버전 != 최신 버전: 경고 - 플러그인이 오래됨
- 여러 버전이 존재하는 경우: 경고 - 캐시가 오래됨
단계 2: settings.json에서 레거시 후크 확인
${CLAUDE_CONFIG_DIR:-~/.claude}/settings.json (프로필 수준)과 ./.claude/settings.json (프로젝트 수준)을 읽고 다음 항목이 포함된 "hooks" 키가 있는지 확인하세요:
bash ${CLAUDE_CONFIG_DIR:-$HOME/.claude}/hooks/keyword-detector.shbash ${CLAUDE_CONFIG_DIR:-$HOME/.claude}/hooks/persistent-mode.shbash ${CLAUDE_CONFIG_DIR:-$HOME/.claude}/hooks/session-start.sh
진단:
- 발견된 경우: 심각 - 레거시 후크가 중복을 유발함
단계 3: 레거시 Bash 후크 스크립트 확인
ls -la "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/hooks/*.sh 2>/dev/null
진단:
keyword-detector.sh,persistent-mode.sh,session-start.sh, 또는stop-continuation.sh가 존재하는 경우: 경고 - 레거시 스크립트 (혼란을 유발할 수 있음)
단계 4: CLAUDE.md 확인
# CLAUDE.md 존재 여부 확인
ls -la "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/CLAUDE.md 2>/dev/null
# OMC 마커 확인 (<!-- OMC:START -->가 표준 마커)
grep -q "<!-- OMC:START -->" "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/CLAUDE.md" 2>/dev/null && echo "OMC 설정 있음" || echo "CLAUDE.md에 OMC 설정 없음"
# CLAUDE.md (또는 결정론적 컴패니언) 버전 마커를 최신 설치 플러그인 캐시 버전과 비교
node -e "const p=require('path'),f=require('fs'),h=require('os').homedir(),d=process.env.CLAUDE_CONFIG_DIR||p.join(h,'.claude');const base=p.join(d,'CLAUDE.md');let baseContent='';try{baseContent=f.readFileSync(base,'utf8')}catch{};let candidates=[base];let referenced='';const importMatch=baseContent.match(/CLAUDE-[^ )]*\\.md/);if(importMatch){referenced=p.join(d,importMatch[0]);candidates.push(referenced)}else{const defaultCompanion=p.join(d,'CLAUDE-omc.md');if(f.existsSync(defaultCompanion))candidates.push(defaultCompanion);try{const others=f.readdirSync(d).filter(n=>/^CLAUDE-.*\\.md$/i.test(n)).sort().map(n=>p.join(d,n));for(const o of others){if(candidates.includes(o)===false)candidates.push(o)}}catch{}};let claudeV='(없음)';let claudeSource='(없음)';for(const file of candidates){try{const c=f.readFileSync(file,'utf8');const m=c.match(/<!--\\s*OMC:VERSION:([^\\s]+)\\s*-->/i);if(m){claudeV=m[1];claudeSource=file;break}}catch{}};if(claudeV==='(없음)'&&candidates.length>0){claudeV='(마커 없음)';claudeSource='스캔된 결정론적 CLAUDE 소스';};let pluginV='(없음)';try{const b=p.join(d,'plugins','cache','omc','oh-my-claudecode');const v=f.readdirSync(b).filter(x=>/^\\d/.test(x)).sort((a,c)=>a.localeCompare(c,void 0,{numeric:true}));pluginV=v.length?v[v.length-1]:'(없음)';}catch{};console.log('CLAUDE.md OMC 버전:',claudeV);console.log('OMC 버전 출처:',claudeSource);console.log('최신 캐시 플러그인 버전:',pluginV);if(claudeV==='(없음)'||claudeV==='(마커 없음)'||pluginV==='(없음)'){console.log('버전 확인 생략: CLAUDE 마커 또는 플러그인 캐시 없음')}else if(claudeV===pluginV){console.log('버전 일치: CLAUDE와 플러그인 캐시가 정렬됨')}else{console.log('버전 불일치: CLAUDE.md와 플러그인 버전이 다름')}"
# 파일 분할 패턴의 컴패니언 파일 확인 (예: CLAUDE-omc.md)
find "${CLAUDE_CONFIG_DIR:-$HOME/.claude}" -maxdepth 1 -type f -name 'CLAUDE-*.md' -print 2>/dev/null
while IFS= read -r f; do
grep -q "<!-- OMC:START -->" "$f" 2>/dev/null && echo "컴패니언 파일에 OMC 설정 있음: $f"
done < <(find "${CLAUDE_CONFIG_DIR:-$HOME/.claude}" -maxdepth 1 -type f -name 'CLAUDE-*.md' -print 2>/dev/null)
# CLAUDE.md가 컴패니언 파일을 참조하는지 확인
grep -o "CLAUDE-[^ )]*\.md" "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/CLAUDE.md" 2>/dev/null
진단:
- CLAUDE.md가 없는 경우: 심각 - CLAUDE.md가 구성되지 않음
<!-- OMC:START -->가 CLAUDE.md에서 발견된 경우: 정상<!-- OMC:START -->가 컴패니언 파일(예:CLAUDE-omc.md)에서 발견된 경우: 정상 - 파일 분할 패턴 감지됨- CLAUDE.md나 컴패니언 파일에 OMC 마커가 없는 경우: 경고 - 오래된 CLAUDE.md
- 결정론적 CLAUDE 소스 스캔(기본 + 참조된 컴패니언)에서
OMC:VERSION마커가 없는 경우: 경고 - CLAUDE.md 신선도 확인 불가 CLAUDE.md OMC 버전!=최신 캐시 플러그인 버전: 경고 - 버전 불일치 감지 (omc update또는omc setup실행)
단계 5: Ralph 런타임 필수 조건 확인
Ralph는 에이전트 기반 지속성 루프로, 컴파일된 프로그램이 아닙니다. 유일한 하드 런타임 필수 조건은 OMC의 후크 스크립트(persistent-mode.mjs, keyword-detector.mjs)를 실행하는 Node 런타임과 상태 파일(예: ralph-state.json)을 위한 .omc/state/ 디렉토리에 쓰기 가능한 설정 디렉토리입니다.
node --version || echo "Ralph용 Node: 없음"
mkdir -p "${CLAUDE_CONFIG_DIR:-$HOME/.claude}" 2>/dev/null
touch "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-write-probe" 2>/dev/null && rm -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/.omc-write-probe" && echo "설정 디렉토리 쓰기 가능" || echo "설정 디렉토리 쓰기 불가능"
진단:
- Node가 실행되고 버전을 출력하는 경우: 정상 - Ralph 런타임 필수 조건 충족
node가 없거나 실패하는 경우: 심각 - Node 없이 OMC 후크와 Ralph를 실행할 수 없음 (설치 프로그램은 https://nodejs.org 참조; nvm/fnm 사용자는 비대화형 셸의 PATH에 Node가 있어야 함)- 설정 디렉토리에 쓸 수 없는 경우: 경고 - 쓰기 가능해질 때까지 Ralph 상태 유지가 실패함
단계 6: 오래된 플러그인 캐시 확인
# 캐시의 버전 수 계산 (크로스 플랫폼)
node -e "const p=require('path'),f=require('fs'),h=require('os').homedir(),d=process.env.CLAUDE_CONFIG_DIR||p.join(h,'.claude'),b=p.join(d,'plugins','cache','omc','oh-my-claudecode');try{const v=f.readdirSync(b).filter(x=>/^\d/.test(x));console.log(v.length+' 버전:',v.join(', '))}catch{console.log('0 버전')}"
진단:
- 버전이 1개보다 많은 경우: 경고 - 여러 캐시 버전 (정리 권장)
단계 7: 레거시 Curl 설치 콘텐츠 확인
플러그인 시스템 이전에 curl로 설치된 레거시 에이전트, 명령어, 스킬을 확인합니다. 중요: 실제 플러그인 제공 이름과 일치하는 파일만 플래그합니다. OMC와 관련 없는 사용자 정의 에이전트/명령어/스킬을 플래그하지 마세요.
# 레거시 에이전트 디렉토리 확인
ls -la "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/agents/ 2>/dev/null
# 레거시 명령어 디렉토리 확인
ls -la "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/commands/ 2>/dev/null
# 레거시 스킬 디렉토리 확인
ls -la "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/skills/ 2>/dev/null
진단:
~/.claude/agents/가 플러그인 에이전트 이름과 일치하는 파일과 함께 존재하는 경우: 경고 - 레거시 에이전트 (현재 플러그인에서 제공)~/.claude/commands/가 플러그인 명령어 이름과 일치하는 파일과 함께 존재하는 경우: 경고 - 레거시 명령어 (현재 플러그인에서 제공)~/.claude/skills/가 플러그인 스킬 이름과 일치하는 파일과 함께 존재하는 경우: 경고 - 레거시 스킬 (현재 플러그인에서 제공)- 플러그인 이름과 일치하지 않는 사용자 정의 파일이 있는 경우: 정상 - 사용자 정의 콘텐츠이며 플래그하지 않음
알려진 플러그인 에이전트 이름 (agents/에서 확인):
architect.md, document-specialist.md, explore.md, executor.md, debugger.md, planner.md, analyst.md, critic.md, verifier.md, test-engineer.md, designer.md, writer.md, qa-tester.md, scientist.md, security-reviewer.md, code-reviewer.md, git-master.md, code-simplifier.md
알려진 플러그인 스킬 이름 (skills/에서 확인):
ai-slop-cleaner, ask, autopilot, cancel, configure-notifications, deep-interview, deepinit, external-context, hud, omc-doctor, omc-setup, plan, project-session-manager, ralph, ralplan, release, skill, team, visual-verdict, wiki
알려진 플러그인 명령어 이름 (commands/에서 확인):
deepsearch.md
보고서 형식
모든 검사를 실행한 후 다음 보고서를 출력하세요:
## OMC Doctor 보고서
### 요약
[정상 / 문제 발견]
### 검사 항목
| 검사 항목 | 상태 | 세부 사항 |
|-----------|------|----------|
| 플러그인 버전 | 정상/경고/심각 | ... |
| 레거시 후크 (settings.json) | 정상/심각 | ... |
| 레거시 스크립트 (~/.claude/hooks/) | 정상/경고 | ... |
| CLAUDE.md | 정상/경고/심각 | ... |
| Ralph 런타임 필수 조건 (Node, 설정 디렉토리) | 정상/심각 | ... |
| 플러그인 캐시 | 정상/경고 | ... |
| 레거시 에이전트 (~/.claude/agents/) | 정상/경고 | ... |
| 레거시 명령어 (~/.claude/commands/) | 정상/경고 | ... |
| 레거시 스킬 (~/.claude/skills/) | 정상/경고 | ... |
### 발견된 문제
1. [문제 설명]
2. [문제 설명]
### 권장 수정 사항
[문제 기반 수정 목록]
자동 수정 (사용자 확인 시)
문제가 발견된 경우 사용자에게 묻습니다: "이 문제들을 자동으로 수정할까요?"
예인 경우 수정을 적용합니다:
수정: settings.json의 레거시 후크
${CLAUDE_CONFIG_DIR:-~/.claude}/settings.json에서 "hooks" 섹션을 제거합니다 (다른 설정은 유지)
수정: 레거시 Bash 스크립트
rm -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/hooks/keyword-detector.sh
rm -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/hooks/persistent-mode.sh
rm -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/hooks/session-start.sh
rm -f "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/hooks/stop-continuation.sh
수정: 오래된 플러그인
# 플러그인 캐시 지우기 (크로스 플랫폼)
node -e "const p=require('path'),f=require('fs'),d=process.env.CLAUDE_CONFIG_DIR||p.join(require('os').homedir(),'.claude'),b=p.join(d,'plugins','cache','omc','oh-my-claudecode');try{f.rmSync(b,{recursive:true,force:true});console.log('플러그인 캐시가 지워졌습니다. Claude Code를 다시 시작하여 최신 버전을 가져오세요.')}catch{console.log('플러그인 캐시를 찾을 수 없음')}"
수정: 오래된 캐시 (여러 버전)
# 최신 버전만 유지 (크로스 플랫폼)
node -e "const p=require('path'),f=require('fs'),h=require('os').homedir(),d=process.env.CLAUDE_CONFIG_DIR||p.join(h,'.claude'),b=p.join(d,'plugins','cache','omc','oh-my-claudecode');try{const v=f.readdirSync(b).filter(x=>/^\d/.test(x)).sort((a,c)=>a.localeCompare(c,void 0,{numeric:true}));v.slice(0,-1).forEach(x=>f.rmSync(p.join(b,x),{recursive:true,force:true}));console.log('제거됨',v.length-1,'개의 이전 버전')}catch(e){console.log('정리할 캐시 없음')}"
수정: CLAUDE.md 없음/오래됨
GitHub에서 최신 버전을 가져와 ${CLAUDE_CONFIG_DIR:-~/.claude}/CLAUDE.md에 씁니다:
WebFetch(url: "https://raw.githubusercontent.com/Yeachan-Heo/oh-my-claudecode/main/docs/CLAUDE.md", prompt: "원시 마크다운 콘텐츠를 그대로 반환하세요")
수정: 레거시 Curl 설치 콘텐츠
레거시 에이전트, 명령어, 스킬 디렉토리를 제거합니다 (현재 플러그인에서 제공):
# 먼저 백업 (선택 사항 - 사용자에게 물어보기)
# mv "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/agents "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/agents.bak
# mv "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/commands "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/commands.bak
# mv "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/skills "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/skills.bak
# 또는 직접 제거
rm -rf "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/agents
rm -rf "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/commands
rm -rf "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/skills
참고: oh-my-claudecode 관련 파일이 포함된 경우에만 제거하세요. 사용자 정의 에이전트/명령어/스킬이 있는 경우 경고하고 제거 전에 물어보세요.
수정 후
수정을 적용한 후 사용자에게 알립니다:
수정이 적용되었습니다. 변경 사항을 적용하려면 Claude Code를 다시 시작하세요.