Communitygithub.com

omc-doctor

Oh My ClaudeCode 설치 문제를 진단하고 수정합니다.

omc-doctor란 무엇인가요?

omc-doctor는 oh-my-claudecode (OMC) 설치 및 구성을 종합적으로 진단하고 자동으로 수정하는 AI 에이전트 스킬입니다. 플러그인 버전, 레거시 후크, CLAUDE.md 설정 상태, Ralph 런타임 필수 조건, 플러그인 캐시, 레거시 curl 설치 콘텐츠 등 총 7가지 항목을 체크하여 문제를 식별합니다. Claude Code 환경에서 동작하며, 설치된 플러그인 버전과 최신 버전 비교, settings.json 내 중복 후크 감지, CLAUDE.md의 OMC 마커 및 버전 드리프트 검사, Node.js 가용성과 설정 디렉토리 쓰기 가능 여부 확인 등을 수행합니다. 진단 후에는 사용자 확인을 거쳐 레거시 스크립트 제거, 캐시 정리, CLAUDE.md 업데이트 등의 자동 수정을 적용할 수 있어 OMC 환경을 최신 상태로 유지하는 데 유용합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Yeachan-Heo/oh-my-claudecode/tree/main/skills/omc-doctor

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

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.sh
  • bash ${CLAUDE_CONFIG_DIR:-$HOME/.claude}/hooks/persistent-mode.sh
  • bash ${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를 다시 시작하세요.

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

agent-doc-discipline

Writing-time discipline for documents agents consume (the five surfaces, specs, tickets, .omc/skills/) — every rule checkable and carrying a why, steps before reference, one meaning in one home, no restating what the environment already says. Mandatory at drydock seed generation and the launch C5 sediment pass; opt-in for any other agent-facing doc edit. The companion of minimal-code-discipline: that one disciplines code, this one disciplines papers.

ai-slop-cleaner

Clean AI-generated code slop with a regression-safe, deletion-first workflow and optional reviewer-only mode

ask

Process-first advisor routing for Claude, Codex, Gemini, Antigravity, Grok, or Cursor via `omc ask`, with artifact capture and no raw CLI assembly

ask-navigator

Shipyard

autopilot

Full autonomous execution from idea to working code

autoresearch

Stateful single-mission improvement loop with strict evaluator contract, markdown decision logs, and max-runtime stop behavior

cancel

Cancel any active OMC mode (autopilot, ralph, ultragoal, swarm, ultrapilot, pipeline, team) and clean up retired legacy state

configure-notifications

Configure notification integrations (Telegram, Discord, Slack) via natural language

debug

Diagnose the current OMC session or repo state using logs, traces, state, and focused reproduction

deepinit

Deep codebase initialization with hierarchical AGENTS.md documentation

deep-interview

Socratic deep interview with mathematical ambiguity gating before explicit execution approval

drydock

Lay the keel of the shipyard harness in any repo — the 4-pillar shared environment (Context, Rules, Tools, Standards) across 5 surfaces (CLAUDE.md, skills, design-system, mcp/cli, shared context) so that every human and agent inherits the same design language and anyone can ship. Run once per repo; re-run with --check to audit drift.

execute

Carry an approved task through to working, verified code

external-context

Invoke parallel document-specialist agents for external web searches and documentation lookup

graph

Deterministic orchestration graph runtime - declarative DAG pipelines with journal-based crash recovery

harbor

Harbor intake for external work — the captain only handles unresolved decisions. Sweeps incoming issues and PRs, verifies every claim before disposition, reuses every decision already made, and hands the maintainer a docket whose pending items each carry one question with options, recommendation, impact and evidence. Agent-autonomous for facts and for actions covered by standing authorization; signed for every new judgment. Never merges.

hud

Configure HUD display options (layout, presets, display elements)

launch

Shipyard

loft

Loft the shape before cutting steel — answer a design question that prose cannot settle by building a throwaway artifact: a pure logic module in a clickable shell, or structurally different UI variants behind one route. The captain reacts to the artifact; the answer folds into the decision; the artifact never docks. Use when a design question stalls in words, when a navigator map carries a loft ticket, or when a spec discussion reaches

minimal-code-discipline

YAGNI-ladder coding discipline for writing changes — existence-first, reuse before writing, dependency ladder, shortest correct diff, with non-negotiables that must never be minimized away

관련 스킬