omc-doctor について
Claude Code 環境の OMC インストール問題を診断・修正するスキルです。プラグインのバージョン、設定、旧式フック、スクリプトを調べ、出所と内容を照合して安全に整理できるか判断します。
主な機能
- 01インストール済み・最新バージョンの確認
- 02設定内の旧式フックの検索
- 03スクリプトの出所と指紋の検証
- 04旧式 Bash フックスクリプトの確認
- 05CLAUDE.md 管理設定の確認
活用シーン
- 01プラグイン未導入や旧版の調査
- 02重複の可能性がある旧式フックの特定
- 03スクリプトの手動確認が必要かの判断
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ yeachan-heo/ oh-my-claudecode --skill omc-doctorインストール後、Claude Code で/omc-doctorを入力して読み込まれたか確認します。
同梱ファイルnode-hook-fingerprints.json
詳細
Doctor スキル
注:このガイド内のすべての ~/.claude/... パスは、環境変数 CLAUDE_CONFIG_DIR が設定されている場合、その値に従います。
タスク:インストールの診断を実行する
あなたは OMC Doctor です。インストールの問題を診断して修正します。
ステップ 1:プラグインのバージョンを確認する
# Get installed and latest versions (cross-platform)
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('Installed:',v.length?v[v.length-1]:'(none)')}catch{console.log('Installed: (none)')}"
npm view oh-my-claude-sisyphus version 2>/dev/null || echo "Latest: (unavailable)"
診断:
- バージョンがインストールされていない場合:重大 — プラグインがインストールされていません
- INSTALLED != LATEST の場合:警告 — プラグインが古くなっています
- 複数のバージョンが存在する場合:警告 — 古いキャッシュがあります
ステップ 2:設定ファイル内のレガシーフックを確認する
プロファイルレベルの ${CLAUDE_CONFIG_DIR:-~/.claude}/settings.json と、主要な作業ディレクトリの .claude/settings.json を読み取り、フックを確認する前に Claude Code が読み取る可能性のあるプロジェクトローカルの設定ファイルをすべて特定します。通常のチェックアウトでは、リポジトリのルートにある .claude/settings.local.json を確認します。リンクされた Git ワークツリーでは、リンク先のワークツリーのファイルだけでなく、メインのチェックアウトルートにある .claude/settings.local.json を確認します。git worktree list --porcelain を使ってメインのチェックアウトを特定してください。Windows の場合、および Claude Code がローカルファイルを共有 .claude/settings.json の隣に保持している場合は、ワークツリー内も含め、その共有設定ファイルの隣にある .claude/settings.local.json を確認します。また、Claude Code のバージョン 2.1.211 より前に残された、起動ディレクトリの .claude/settings.local.json も確認します。Claude Code はルートのファイルと併せてこのファイルも読み取ることがあります。パスが重複する場合は、重複を除いてください。メインのチェックアウトルートまたは該当するローカル設定ファイルを特定または読み取りできない場合は、設定とスクリプトへの参照を判断不能として扱い、フックやスクリプトを削除しないでください。該当するファイルに "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.shbash ${CLAUDE_CONFIG_DIR:-$HOME/.claude}/hooks/stop-continuation.shbash ${CLAUDE_CONFIG_DIR:-$HOME/.claude}/hooks/silent-auto-update.sh
アクティブな設定ディレクトリの hooks/ フォルダーにある、単独で登録された Node フックも認識してください。対象は .mjs ファイルで、ファイル名は keyword-detector、persistent-mode、session-start、session-end、pre-tool-use、post-tool-use、post-tool-use-failure、code-simplifier、または stop-continuation です。過去に使用されていた keyword-detector、persistent-mode、session-start、stop-continuation というベース名については、.cjs および .js 形式もレガシーとして扱います。たとえば、node "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/hooks/keyword-detector.mjs" はレガシー登録です。Windows では、node "%USERPROFILE%\.claude\hooks\keyword-detector.mjs" や %CLAUDE_CONFIG_DIR%\hooks\<filename> のようなパス(または展開後の絶対パス)も、バックスラッシュ区切りで同じアクティブな設定ディレクトリを指すものとして認識してください。リストにある正確なファイル名を、そのディレクトリから node で実行する場合のみ一致とし、プラグインルートのコマンドや、別のディレクトリにある似た名前のスクリプトには一致させないでください。
コマンドが自動修正の候補となるのは、リストにあるファイルを1つだけ直接実行する単純な形式の場合に限られます。具体的には、bash <exact .sh path>、node <exact Node path>、または実行権限のある対象についての実行可能スクリプトパス単独(たとえば $HOME/.claude/hooks/keyword-detector.sh)です。どの形式でも、追加の引数、シェル演算子、または他のコマンドを含めることはできません。コマンドがパスに言及しているだけの場合、独自の処理が追加されている場合(たとえば bash legacy.sh && run-my-check)、または曖昧さなく解析できない場合は、手動での削除が必要であることを報告し、フックオブジェクトは変更しないでください。
スタンドアロン登録を重複と診断する前に、ランタイムの優先順位に従ってプラグインの有効化状態を解決してください。まず管理設定とコマンドライン設定(読み取り専用)、次に該当するすべてのプロジェクトローカル設定ファイル(上記の手順で解決したもの)、次にプライマリ作業ディレクトリの ./.claude/settings.json、最後に ${CLAUDE_CONFIG_DIR:-~/.claude}/settings.json の順です。該当する場合は、メインのチェックアウト、Windows のサイドバイサイド配置、従来の開始ディレクトリにあるローカルパスも含めてください。ルートのローカルファイルと pre-2.1.211 の開始ディレクトリファイルでキーが重複する場合は、ルートのローカル値が優先されます。有効なローカルファイルにある false を無視したり、プロジェクトやプロファイルの true にフォールバックしたりしないでください。最初に対応する OMC ID を明示したスコープが決定要因となります。明示されていないスコープは透過的に扱います。対応するマーケットプレイス ID は oh-my-claudecode、oh-my-claudecode@omc、oh-my-claudecode@oh-my-claudecode です。現在のセッションで --plugin-dir、--plugin-url、CLAUDE_CODE_PLUGIN_DIRS などのインラインソースから OMC を読み込む場合は、アクティブなルートの .claude-plugin/plugin.json に "name": "oh-my-claudecode" が設定され、かつセッションソースでそのルートが読み込まれていることを確認した後に限り、oh-my-claudecode@inline も考慮してください。そのインラインプラグインは、マニフェストで "defaultEnabled": false が設定されている場合、または該当する設定ソースで無効化されている場合を除き、セッション中は有効として扱います。該当する設定で明示的に true が指定されている場合は、マニフェストのデフォルトより優先されます。CLAUDE_PLUGIN_ROOT は場所を特定するためのものであり、プラグインが有効である証拠ではありません。有効な設定で明示的に false が指定されている場合は、常に自動削除を阻止します。各スコープ内では enabledPlugins が正規の設定であり、enabledPlugins に対応する OMC ID が一つも記載されていない場合に限り、従来の plugins を参照します。そのため、正規設定の false は古い true より優先され、優先順位の高い false は優先順位の低い true より優先されます。該当するローカルソースの設定が競合して有効値を特定できない場合、優先されるフィールド内の対応 ID が競合する場合、関連ファイルを読み取れないか形式が不正な場合、または有効な有効化状態を確定できない場合は、プラグインの有効状態を判定不能として扱い、自動削除しないでください。アクティブなルートにあるすべてのフックソースを読み取り専用で調べてください。任意の .claude-plugin/plugin.json の hooks フィールドには、パス、インラインのフックオブジェクト、またはパスとインラインオブジェクトを混在させた配列を指定できます。宣言されたファイルパスはプラグインルートを基準に解決し、存在する場合は hooks/hooks.json も含めてください。宣言されたソースの形式が不正、読み取り不能、または解決不能な場合は、イベントの所有元を判定不能として扱います。キャッシュされたプラグインバージョンだけでは不十分です。また、スタンドアロンスクリプトファイルを解決し、そのバイト列または SHA-256 を同じファイル名に対応する同梱 OMC ペイロードと比較してください。過去の .sh ファイルには、以下のバージョン別フィンガープリントを使用してください。名前やパスが一致するだけでは、所有元の証拠にはなりません。プラグインが無効、該当イベントを提供していない、ペイロードまたはフィンガープリントが存在しない、対象を読み取れない、または内容が異なる場合は、そのエントリーをユーザー所有の可能性があるものとして扱い、削除を推奨しないでください。
既知のスタンドアロンペイロードについては、ペイロードの同一性に加えて、想定されるプラグインイベントも確認してください。既知の OMC ファイル名とイベントの対応関係は次のとおりです。
| スタンドアロンペイロードのベース名 | 正規のプラグインイベント |
|---|---|
keyword-detector | UserPromptSubmit |
session-start | SessionStart |
session-end | SessionEnd |
pre-tool-use | PreToolUse |
post-tool-use | PostToolUse |
post-tool-use-failure | PostToolUseFailure |
persistent-mode、stop-continuation、code-simplifier | Stop |
履歴上のペイロードについては、そのバージョンの信頼できるマニフェストまたはインストーラーのソースからイベントマッピングを検証してください。入手できない場合は、手動レビューに回してください。アクティブなプラグインは、登録されたイベントの下で正規の、または特定の検証済みの同等ハンドラーを提供している必要があり、そのハンドラーがペイロードの動作を置き換えなければなりません。そのイベントに対するプラグインのハンドラーが存在するだけでは不十分です。例えば、Stop に登録された session-start スクリプトは、アクティブなプラグインが無関係な Stop ハンドラーを定義していても、重複とはみなされません。イベントまたは動作の同等性が不確かな場合は、フックとスクリプトを保持してください。 |
追跡対象の履歴 OMC Bash フックペイロードのフィンガープリント(SHA-256)は次のとおりです。
keyword-detector.sh:abe4dd5e4b16231060166264d271a51e781f08a31c6aa402b26976f9c40d424e(96266316)、748463911b2a8b7fffed51137c9731c962b656d490a1e4b27ef7ab10dbbbaff5(3a02feb1)、1eaced21774916c31bec5b149a87009d014ffd8027ecf8e9d6ae6a36bdd79a40(bef486f1)persistent-mode.sh:c131c6846573f0f69b6e39aed1e6db8f05279131a8976f604c1511a46f564ce5(96266316)、219e50bf42b7a7a0e52fb142844dce21faca7c327d9acf346fa70f074ac982ac(3a02feb1)、02f4d0d63a9ce092fe5be02ce6e79f275710b773d4b8d75ff33f272540451eff(bef486f1)session-start.sh:d87571c326c43cc43b6948aca661a9616faa6943cfe1d1131f482bd30f638134(96266316)、a9607c64a14d9f8e9fa990b9f38879ef095d85652f548b1232e28d14641214eb(3a02feb1)、cf7aa2b008829784c8942766c3f00d348ef33a1aab66dd3f96536e95560fd56b(bef486f1)stop-continuation.sh:f74deb67479c7861b0966bc959ffd3917152b8872ac83d9243a03c7cb707b51f(96266316)
silent-auto-update.sh および履歴上の .js/.cjs バリアントについては、追跡対象の OMC ペイロードのフィンガープリントはありません。これらのファイルは所有権が確認できないものとして扱い、フックの登録やファイルを自動的に削除しないでください。
Node フックについては、アクティブなプラグインのペイロード、${CLAUDE_CONFIG_DIR:-~/.claude}/plugins/cache/omc/oh-my-claudecode/<version>/ 配下の検証済みの保持パッケージ、および隣接する node-hook-fingerprints.json インデックスと比較してください。このインデックスには、templates/hooks/**/*.mjs 配下で出荷されるすべての Node モジュール(フックヘルパーを含む)について、正確な安定リリースタグの由来情報を伴う SHA-256 フィンガープリントが記録されています。ペイロードのパスで検索し、該当するブロックのみを確認してください。インデックス全体を読み込まないでください。インデックスが存在しない、不正な形式である、または一致するフィンガープリントがない場合は、そのエントリを手動レビューに回してください。リリースタグに必ずしも対応しないコミットに由来する、信頼できる履歴上の keyword-detector.mjs の追加フィンガープリントとして、22d612620f54f360797e42fe608bf7f98155b92a3b0bba187fd89e216395d65a(fb125b37)、180fc09840baa8ada1661bcc5a13821c9ca802f43ac52cb4e517ca2cba75838a(387956a4)、71a01806c1b0e29d8e553797de3900b7172654091980ae644d74e5e9291b8af2(0b46a595)を保持してください。
診断:
- 直接のコマンドが OMC 所有であることが検証され、かつアクティブなプラグインが登録されたイベントの下でペイロードの正規の、または特定の検証済みの同等ハンドラーを提供している場合: CRITICAL - 重複したレガシーフック
- 複合的または曖昧なコマンドがレガシーパスに言及している場合: WARN - 手動でのクリーンアップが必要。自動的に削除しないこと
- プラグインが無効である、そのイベントを提供していない、または所有権を検証できない場合: WARN - スタンドアロンのフックが有効である可能性があるか、ユーザー所有のものです。削除を推奨しないこと
Step 3: レガシー Bash フックスクリプトの確認
ls -la "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/hooks/*.sh 2>/dev/null
診断:
- 列挙されたスクリプトが存在する場合、それを重複とみなすのは、アクティブなプラグインが登録されたイベントの下でペイロードの正規の、または特定の検証済みの同等ハンドラーを提供しており、かつそのファイルが出荷されたペイロードまたは履歴上のフィンガープリントと一致する場合に限ります。それ以外の場合は、所有権を不明とマークするか、アクティブなスタンドアロンフックとして扱ってください。
ステップ 4:CLAUDE.md を確認する
まず、CLAUDE.md の管理が無効になっているか確認します。${CLAUDE_CONFIG_DIR:-~/.claude}/.omc-config.json を読み込みます。明示的に "claudeMdEnabled": false が指定されている場合に限り、管理は無効になります(ファイルがない場合、キーがない場合、またはその他の値の場合は有効です)。
# Check if the user opted out of global CLAUDE.md management (cross-platform; expands ~ in CLAUDE_CONFIG_DIR like getClaudeConfigDir)
node -e "const p=require('path'),f=require('fs'),h=require('os').homedir(),c=(process.env.CLAUDE_CONFIG_DIR||'').trim(),d=!c?p.join(h,'.claude'):c==='~'?h:/^~[/\x5c]/.test(c)?p.join(h,c.slice(2)):c;let off=false;try{off=JSON.parse(f.readFileSync(p.join(d,'.omc-config.json'),'utf8')).claudeMdEnabled===false}catch{};console.log(off?'CLAUDE.md management disabled by claudeMdEnabled: false':'CLAUDE.md management enabled')"
プローブの出力が正確に CLAUDE.md management enabled の場合にのみ、以下の CLAUDE.md の確認を続行します。
CLAUDE.md management disabled by claudeMdEnabled: falseと出力された場合は、その行を INFO として報告し、このステップの残りと「修正:CLAUDE.md の欠落/古さ」の修正をスキップします。また、CLAUDE.mdまたはCLAUDE-omc.mdを作成または上書きしないでください。- どちらの行も出力されない場合、またはコマンドが失敗した場合(例:
nodeがPATHにない場合。これはステップ 5 で診断します)は、WARN -claudeMdEnabledのオプトアウトを確認できませんでした、と報告し、このステップの残りと「修正:CLAUDE.md の欠落/古さ」の修正をスキップします。また、CLAUDE.mdまたはCLAUDE-omc.mdを作成または上書きしないでください。
# Check if CLAUDE.md exists
ls -la "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/CLAUDE.md 2>/dev/null
# Check for OMC markers ( is the canonical marker)
grep -q "" "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/CLAUDE.md" 2>/dev/null && echo "Has OMC config" || echo "Missing OMC config in CLAUDE.md"
# Check CLAUDE.md (or deterministic companion) version marker and compare with latest installed plugin cache version
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='(missing)';let claudeSource='(none)';for(const file of candidates){try{const c=f.readFileSync(file,'utf8');const m=c.match(//i);if(m){claudeV=m[1];claudeSource=file;break}}catch{}};if(claudeV==='(missing)'&&candidates.length>0){claudeV='(missing marker)';claudeSource='scanned deterministic CLAUDE sources';};let pluginV='(none)';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]:'(none)';}catch{};console.log('CLAUDE.md OMC version:',claudeV);console.log('OMC version source:',claudeSource);console.log('Latest cached plugin version:',pluginV);if(claudeV==='(missing)'||claudeV==='(missing marker)'||pluginV==='(none)'){console.log('VERSION CHECK SKIPPED: missing CLAUDE marker or plugin cache')}else if(claudeV===pluginV){console.log('VERSION MATCH: CLAUDE and plugin cache are aligned')}else{console.log('VERSION DRIFT: CLAUDE.md and plugin versions differ')}"
# Check companion files for file-split pattern (e.g. 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 "" "$f" 2>/dev/null && echo "Has OMC config in companion: $f"
done < <(find "${CLAUDE_CONFIG_DIR:-$HOME/.claude}" -maxdepth 1 -type f -name 'CLAUDE-*.md' -print 2>/dev/null)
# Check if CLAUDE.md references a companion file
grep -o "CLAUDE-[^ )]*\.md" "${CLAUDE_CONFIG_DIR:-$HOME/.claude}/CLAUDE.md" 2>/dev/null
診断:
- CLAUDE.md がない場合:CRITICAL - CLAUDE.md が設定されていません
- `` が CLAUDE.md に見つかった場合:OK
- `` が補助ファイル(例:
CLAUDE-omc.md)に見つかった場合:OK - ファイル分割パターンを検出しました - CLAUDE.md またはいずれかの補助ファイルに OMC マーカーがない場合:WARN - CLAUDE.md が古くなっています
- 決定論的な CLAUDE ソーススキャン(ベースファイル+参照先の補助ファイル)で
OMC:VERSIONマーカーが見つからない場合:WARN - CLAUDE.md の最新性を確認できません CLAUDE.md OMC version!=Latest cached plugin versionの場合:WARN - バージョンの不一致を検出しました(omc updateまたはomc setupを実行してください)
ステップ 5:Ralph ランタイムの前提条件を確認する
Ralph はエージェント駆動型の永続化ループであり、コンパイル済みプログラムではありません。必須のランタイム前提条件は、OMC のフックスクリプト(persistent-mode.mjs、keyword-detector.mjs)を実行する Node ランタイムと、ralph-state.json などの .omc/state/ 状態ファイルを書き込める設定ディレクトリのみです。
node --version || echo "Node for Ralph: MISSING"
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 "Config dir writable" || echo "Config dir NOT writable"
診断:
- Node が実行され、バージョンが出力される場合:OK - Ralph のランタイム前提条件が満たされています
nodeがない場合、または実行に失敗する場合:CRITICAL - Node がないと OMC のフックと Ralph を実行できません(インストーラーについては https://nodejs.org を参照してください。nvm/fnm のユーザーは、非対話型シェルのPATHに Node が必要です)- 設定ディレクトリに書き込み権限がない場合:WARN - 書き込み可能になるまで Ralph の状態を永続化できません
ステップ 6:古いプラグインキャッシュを確認する
# Count versions in cache (cross-platform)
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+' version(s):',v.join(', '))}catch{console.log('0 versions')}"
診断:
- バージョンが 1 つを超える場合:WARN - キャッシュされたバージョンが複数あります(クリーンアップを推奨)
ステップ 7:curl でインストールされた古いコンテンツを確認する
プラグインシステム導入前に curl でインストールされた古いエージェント、コマンド、スキルを確認します。 重要:実際にプラグインが提供する名前と一致するファイルのみを指摘してください。OMC と無関係なユーザー独自のエージェント/コマンド/スキルは指摘しないでください。
# Check for legacy agents directory
ls -la "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/agents/ 2>/dev/null
# Check for legacy commands directory
ls -la "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/commands/ 2>/dev/null
# Check for legacy skills directory
ls -la "${CLAUDE_CONFIG_DIR:-$HOME/.claude}"/skills/ 2>/dev/null
診断:
~/.claude/agents/が存在し、プラグインのエージェント名と一致するファイルがある場合:WARN - 古いエージェント(現在はプラグインで提供されています)~/.claude/commands/が存在し、プラグインのコマンド名と一致するファイルがある場合:WARN - 古いコマンド(現在はプラグインで提供されています)~/.claude/skills/が存在し、プラグインのスキル名と一致するファイルがある場合:WARN - 古いスキル(現在はプラグインで提供されています)- プラグイン名と一致しない独自ファイルがある場合:OK - これらはユーザー独自のコンテンツなので、指摘しないでください
既知のプラグインエージェント名(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 Report
### Summary
[HEALTHY / ISSUES FOUND]
### Checks
| Check | Status | Details |
|-------|--------|---------|
| Plugin Version | OK/WARN/CRITICAL | ... |
| Legacy Hooks (settings.json) | OK/WARN/CRITICAL | ... |
| Legacy Scripts (~/.claude/hooks/) | OK/WARN | ... |
| CLAUDE.md | OK/INFO/WARN/CRITICAL | ... |
| Ralph Runtime Prerequisites (Node, config dir) | OK/CRITICAL | ... |
| Plugin Cache | OK/WARN | ... |
| Legacy Agents (~/.claude/agents/) | OK/WARN | ... |
| Legacy Commands (~/.claude/commands/) | OK/WARN | ... |
| Legacy Skills (~/.claude/skills/) | OK/WARN | ... |
### Issues Found
1. [Issue description]
2. [Issue description]
### Recommended Fixes
[List fixes based on issues]
自動修正(ユーザーが確認した場合)
問題が見つかった場合は、ユーザーに「これらの問題を自動的に修正しますか?」と尋ねます。
はいの場合は、修正を適用します。影響を受けるプロファイルレベル、プロジェクトレベル、またはプロジェクトローカルの設定ファイルごとに、この一般的な質問への承認だけではフックの削除を許可したことにはなりません。該当するフックオブジェクトと、残る非OMCのエントリ/グループを正確に提示してから、その範囲に限定した変更について明示的な確認を求めます。存在する場合は、メインチェックアウト、Windowsのサイドバイサイド、従来の開始ディレクトリの各ファイルなど、該当するすべてのプロジェクトローカルファイルを提案に含めます。メインチェックアウトのローカルファイルへの変更は、リンクされたワークツリーにも影響します。書き込む前に、対象が通常の非シンボリックリンクファイルであることを確認します。既存のパスを上書きせず、排他的かつシンボリックリンクをたどらない方法(たとえば、wxを指定したopen)で、元のファイルと同じディレクトリにタイムスタンプ付きのバックアップを作成します。バックアップの権限は元のファイルより広くしてはいけません(たとえば、元のファイルが0600なら0600を使用し、より厳しいモードやACLは維持します)。プロセスのumaskやデフォルトのファイルモードに依存してはいけません。同じディレクトリ内に排他的かつシンボリックリンクをたどらない一時ファイルを作成し、元のモードと制限的なACLを維持するか、さらに厳しい保護を適用して、置換をアトミックに行います。Windowsでは、プラットフォームに適した操作で元のACLを維持します。バックアップまたは置換後のファイルの権限を元のファイル以下に保てない場合は、設定ファイルを変更せず、クリーンアップも適用しません。管理対象の設定やMDM/サーバーポリシーは決して編集しません。該当する従来のエントリがない場合は、ファイルを変更しません。
修正:settings.json内の従来のフック
影響を受けるプロファイルレベル、プロジェクトレベル、またはプロジェクトローカルの設定ファイルごとに、次の手順を実行します。
- Step 2のすべてのチェックに合格した場合に限り、フックを削除します。コマンドは単純な直接呼び出しである必要があります(実行権限がある場合に限り、実行ファイルパスを直接指定する形式も含みます)。有効なプラグインが登録されたイベントの下で、ペイロードの標準ハンドラーまたは個別に検証済みの同等ハンドラーを提供しており、対象ファイルが同梱または信頼できるバージョン管理済みOMCペイロードと一致する必要があります。同じイベントのハンドラーでも、無関係な動作を実装している場合は該当しません。
hooks/ディレクトリ内にあるという理由だけで他のスクリプトを一致と見なしたり、プラグインルートのコマンドや別ディレクトリにある似た名前のスクリプトを一致と見なしたりしてはいけません。 hooks.<event>[].hooks[]配列から、該当するオブジェクトのみを削除します。一致しないフックオブジェクトと、フックが残っているすべてのマッチャーグループ(ユーザーおよびサードパーティのフックを含む)を保持します。コマンドが複合的または曖昧な場合は変更せず、手動クリーンアップが必要なものとして報告します。一致するオブジェクトを削除した結果、フックがなくなったマッチャーグループは削除します。グループが残らなくなったイベントキーと、イベントが残らなくなったトップレベルの"hooks"キーも削除します。それ以外の設定はすべて変更せずに保持します。
修正:従来のスクリプトファイル
スクリプトを削除する前に、スキルやサブエージェントのフロントマター、有効なプラグインマニフェスト、設定ソースにある、アクティブなセッションスコープのフック参照を調べます。スキルのフロントマターにあるフックは、呼び出し後もセッションが終了するまでアクティブです。サブエージェントのフロントマターにあるフックは、そのサブエージェントの実行中はアクティブです。アクティブなスキルおよび実行中のサブエージェントすべてのソースフロントマターを調べ、候補のスクリプトを参照するコマンドがないか確認します。アクティブなフックがそのスクリプトを参照している場合は、そのスキルまたはサブエージェントが非アクティブになってから保持し、参照チェックを再度実施します。アクティブなスキルやサブエージェントのソースを漏れなく列挙できない場合、または読み取れない場合は、スクリプトをそのまま残します。
--plugin-dir、--plugin-url、または CLAUDE_CODE_PLUGIN_DIRS を通じて指定されたマーケットプレイスプラグインやローカル/インラインプラグインを含め、有効化または読み込み済みのすべてのプラグインルートも列挙します。有効なプラグインレジストリ(たとえば ${CLAUDE_CONFIG_DIR:-~/.claude}/plugins/installed_plugins.json と、そこに記録されたインストール先パス)を使ってマーケットプレイスからのインストールを解決し、ユーザーまたはプロジェクトの .claude/skills/ にある有効な @skills-dir プラグインルートも含めます。各プラグインの .claude-plugin/plugin.json と hooks/hooks.json を読み取り専用で読み込みます。マニフェストの省略可能な hooks フィールドは、.json パス、インラインの hooks オブジェクト、またはパスとインラインオブジェクトを混在させた配列として解析します。宣言されたすべてのファイルパスをそのプラグインルートからの相対パスとして解決し、宣言されたすべてのソースとデフォルトの hooks/hooks.json にあるコマンドハンドラーを調べ、候補スクリプトへの参照を確認します。その際、設定/ホーム環境変数とプラットフォームごとのパス区切り文字を解決します。有効化または読み込み済みのプラグインルート、マニフェスト、宣言されたフックソースのいずれかを確実に列挙、解決、または読み取れない場合、あるいはいずれかのソースがスクリプトを参照している場合は、スクリプトをそのまま残します。
Claude Code は、設定ファイルが編集された後も、現在のセッションのフックスナップショットを保持します。このセッションで一致するフック登録を削除した場合は、ユーザーが Claude Code を再起動するまでスクリプトをそのまま残します。同じセッション内で、設定フックを削除した対象を削除してはいけません。後続のセッションでは、スクリプトを削除する前に、参照の完全なスキャンと以下の最終確認を再度実施します。
Step 2 の正規イベントと同等ハンドラーの要件も、スクリプト削除の条件となります。同じイベントに属する無関係なプラグインハンドラーは、単独のペイロードを削除する根拠にはなりません。
設定のスキャンだけでは、参照が残っていないことを確認できません。対象を削除する前に、上記の有効なスキル/サブエージェントと有効化済みプラグインのマニフェストのスキャンも完了し、参照がないことを確認する必要があります。プラグインのマニフェストにある参照は、コマンドが別のイベントに登録されていても削除を阻止します。
関連するすべてのユーザー/プロジェクト設定ファイルを処理した後、${CLAUDE_CONFIG_DIR:-~/.claude}/settings.json、プライマリ作業ディレクトリの .claude/settings.json、および上記で解決した該当するすべてのプロジェクトローカルな .claude/settings.local.json パス(該当する場合はメインチェックアウト、Windows のサイドバイサイド、従来の開始ディレクトリの各パス)を再確認し、複合コマンドや曖昧なコマンド内の参照を含め、各レガシースクリプトへの参照がないか確認します。管理対象のフックソースも読み取り専用で調べます。Linux/WSL では /etc/claude-code/managed-settings.json、macOS では /Library/Application Support/ClaudeCode/managed-settings.json、Windows では C:\Program Files\ClaudeCode\managed-settings.json を確認し、該当する MDM、サーバー管理、またはコマンドラインの --settings ソースも調べます(Claude Code managed-settings locations を参照)。これらのソースは編集しないでください。いずれのソースにも設定済みフックからの参照がなく、有効なプラグインが同じイベントを提供し、コンテンツが Step 2 で確認済みの同梱 OMC ペイロードと一致する場合に限り、スクリプトを削除します。該当するプロジェクトローカルパス、メインチェックアウトのルート、管理対象ソース、またはコマンドラインソースを解決または調査できない場合、いずれかのソースがスクリプトを参照している場合、ユーザーが該当する設定変更に同意しなかった場合、ファイルを更新できなかった場合、同梱ペイロードがない場合、または検証が決定的でない場合は、該当するスクリプトをそのまま残します。ベース名だけを根拠に、無条件で rm -f を実行してはいけません。
修正:古いプラグイン
# Clear plugin cache (cross-platform)
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('Plugin cache cleared. Restart Claude Code to fetch latest version.')}catch{console.log('No plugin cache found')}"
修正:古いキャッシュ(複数バージョン)
# Keep only latest version (cross-platform)
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('Removed',v.length-1,'old version(s)')}catch(e){console.log('No cache to clean')}"
修正:CLAUDE.md がない、または古い
Step 4 で CLAUDE.md management enabled と表示された場合を除き、この修正はスキップしてください。Step 4 で CLAUDE.md management disabled by claudeMdEnabled: false と報告された場合、またはオプトアウトを確認できなかった場合はスキップします。
GitHub から最新の内容を取得し、${CLAUDE_CONFIG_DIR:-~/.claude}/CLAUDE.md に書き込みます。
WebFetch(url: "https://raw.githubusercontent.com/Yeachan-Heo/oh-my-claudecode/main/docs/CLAUDE.md", prompt: "Return the complete raw markdown content exactly as-is")
修正:Curl でインストールされた古いコンテンツ
古い agents、commands、skills ディレクトリを削除します(現在はプラグインによって提供されています)。
# Backup first (optional - ask user)
# 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
# Or remove directly
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 関連のファイルが含まれている場合にのみ削除してください。ユーザー独自の agents、commands、skills がある場合は、警告して削除する前に確認してください。
修正後
修正を適用したら、ユーザーに次のように伝えてください。
修正を適用しました。変更を反映するには、Claude Code を再起動してください。