SpyBara
Go Premium

plugins/mods/troubleshoot.md 2026-10-01 23:59 UTC to 2026-10-02 22:00 UTC

This page contains 102 additions and 100 deletions.

2026
Thu 1 23:59 Fri 2 22:59

mod 문제 해결

Claude Code mod가 아무 동작도 하지 않는 이유를 찾습니다. 증상이나 메시지를 원인과 대조하고, 거부 메시지를 조회하고, 디버그 로그를 확인합니다.

mod의 모듈이나 훅 중 하나가 실패하면 Claude Code는 이를 건너뛰고 세션을 계속 진행하므로, 손상된 mod가 아무 동작도 하지 않는 mod처럼 보일 수 있습니다. 먼저 Claude Code가 mod에서 무엇을 읽었는지, 어디에서 문제를 보고하는지 확인한 다음, 해당하는 증상이나 메시지를 찾습니다.

mod가 아무 동작도 하지 않는 이유 찾기

mod가 아무 동작도 하지 않으면 Claude Code가 mod의 파일에서 무엇을 읽는지, 그리고 무언가를 건너뛸 때 기록하는 줄을 확인합니다. 첫 번째의 경우, 셸에서 claude plugin validate ./first-mod처럼 mod의 디렉터리를 지정하여 claude plugin validate를 실행합니다. 이 명령은 세션을 시작하지 않고도 철자가 틀린 이벤트, 잘못된 매니페스트, Claude Code가 읽을 수 없는 모듈을 찾아냅니다.

모듈이 로드되지 않거나, 훅을 건너뛰거나, 다른 mod가 사용자의 mod를 거부하면 Claude Code는 해당 mod의 이름이 포함된 한 줄을 기록합니다. 이 줄을 확인하는 위치는 세션에 따라 다릅니다.

  • 플러그인 디렉터리를 핫 리로드하는 세션: 트랜스크립트에 흐리게 표시되는 줄입니다. --plugin-dir로 시작한 대화형 세션이나, Claude가 작성한 mod에 대해 핫 리로드를 활성화한 세션이 이에 해당합니다.
  • 그 외의 대화형 세션(예: 마켓플레이스에서 설치한 mod를 실행하는 세션): 디버그 로그에만 기록됩니다. 디버그 로그를 얻으려면 claude --debug로 세션을 시작합니다.
  • --plugin-dir을 사용한 claude -p 실행: 기본 텍스트 출력 형식에서 stderr로 출력됩니다. 다른 mod에 의한 거부는 디버그 로그에만 기록됩니다.

mod를 로드할 수 있는지 확인하기

mod를 설치하지 않고도 현재 설정에서 mod를 로드할 수 있는지 확인하려면, mod가 없는 디렉터리에서 셸에 claude plugin test를 실행합니다. 세션은 필요하지 않습니다. 출력되는 메시지를 통해 상태를 알 수 있습니다.

메시지에 포함된 내용 의미
no hooks module to load mod를 로드할 수 있습니다. 이 명령이 현재 디렉터리에서 테스트할 mod를 찾지 못했습니다.
hooks modules are turned off here 설정이 mod를 차단하고 있습니다. 사용자 설정의 disableAllHooks 또는 조직의 정책이 원인입니다
hooks modules are turned off in this process Anthropic이 설치된 mod를 원격으로 껐습니다. 사용자 컴퓨터의 어떤 설정으로도 다시 켤 수 없습니다.

조직은 allowManagedModsOnly를 설정하여 조직 자체의 mod만 허용할 수도 있으며, 이 명령은 이를 보고하지 않습니다. 이 경우 사용자가 설치한 mod는 로드되지 않으며, 그 이유를 알려 주는 메시지가 표시됩니다.

mod가 로드되지 않음

mod가 추가하는 항목이 전혀 나타나지 않습니다. 명령도, 그리기도, 동작의 변화도 없습니다.

버전이 2.1.287보다 오래됨

claude --version이 2.1.287보다 오래된 버전을 출력합니다. 해당 버전은 mod가 기본적으로 켜지기 이전 버전입니다.

Claude Code를 업데이트하세요.

`mods active` 줄에 mod 이름이 없음

mod가 추가하는 항목이 전혀 나타나지 않고, /plugin의 mods active 줄에도 mod 이름이 표시되지 않습니다. 훅 모듈이 로드되지 않은 것입니다. Claude Code가 훅 모듈을 거부한 경우, 디버그 로그에 hooks module, mod 이름, not loaded:로 시작하는 줄이 있습니다. 예를 들어 --plugin-dir로 로드한 mod의 경우 hooks module first-mod@inline not loaded: disableAllHooks in managed settings와 같이 표시됩니다.

콜론 뒤의 이유를 확인합니다. 거부 메시지 섹션에 각 메시지가 나와 있습니다. 로그에 이러한 줄이 없다면 이 그룹의 다른 항목을 차례로 확인합니다.

일부 설정은 mod를 중지시키지만 해당 플러그인의 나머지 부분은 계속 작동하게 둡니다. mod 켜기 또는 끄기에 해당 설정이 나와 있습니다.

`claude -p` 실행 시 `hooks module not loaded`가 출력됨

이 줄은 mod 이름으로 시작하며 stderr로 출력됩니다. 훅 모듈이 거부된 것입니다. 비대화형 실행에는 트랜스크립트가 없으므로 메시지가 stderr로 출력됩니다.

콜론 뒤의 이유를 확인합니다. 거부 메시지 섹션에 각 메시지가 나와 있습니다.

거부 메시지

디버그 로그에서 다음 각 메시지는 hooks module, mod 이름, not loaded: 뒤에 나옵니다.

메시지 시작 부분 의미
hooks modules are turned off for installed plugins in this process Anthropic이 설치된 mod를 원격으로 껐습니다. 사용자 컴퓨터의 어떤 설정으로도 다시 켤 수 없습니다.
disableAllHooks in managed settings 조직에서 설치된 플러그인의 훅을 껐습니다
only managed plugins and built-in plugins run allowManagedHooksOnly가 설정되어 있거나, 관리형 설정이 아닌 설정 파일에 disableAllHooks가 설정되어 있습니다
installed plugins that are not managed load no hooks module in this mode (--bare) Claude Code를 --bare로 시작했습니다
another plugin of that name loads first 두 플러그인의 이름이 같습니다. 관리되는 플러그인 또는 먼저 로드된 플러그인이 사용됩니다.

기본 제공 가드의 메시지

관리형 설정이 있는 컴퓨터에서, 또는 Team이나 Enterprise 플랜으로 로그인한 사용자의 경우, 기본 제공 가드가 mod 또는 mod의 응답 중 하나를 거부할 수 있습니다. 각 메시지에는 조직의 관리자가 규칙을 변경하기 위해 설정하는 옵션이 명시되어 있습니다.

메시지 포함 내용 의미 표시 위치
mods are limited to your organization's by policy (allowManagedModsOnly) 조직에서 조직 자체의 mod만 허용하므로 사용자의 mod가 로드되지 않았습니다 디버그 로그, 그리고 플러그인 디렉터리를 핫 리로드하는 세션의 트랜스크립트
tried to lift a deny rule in your settings mod의 tool.check 훅이 deny 규칙에서 거부하는 호출을 승인했습니다. 해당 호출은 계속 거부됩니다. 트랜스크립트와 디버그 로그, 세션에서 mod마다 한 번씩. claude -p 실행에서는 디버그 로그에만 표시됩니다.
the deny rules in your settings could not be checked for this call, so it is refused mod가 승인한 호출을 확인하는 중에 가드가 실패하여 해당 호출을 거부했습니다 거부된 호출에 대해 Claude가 읽는 이유

`validate`는 통과하지만 `hooks` 줄이 나열되지 않음

hooks/hooks.json에 modules 키가 없거나 키의 철자가 잘못되었습니다.

"modules": ["./register.js"]를 추가합니다.

`hooks module did not load`

이 줄은 mod 이름으로 시작하고, 그 뒤에 hooks module did not load:와 이유가 나옵니다. 문제가 코드에 있는 경우 이유에 파일과 줄이 표시됩니다. Claude Code가 모듈을 로드할 수 없었습니다. 예를 들어 모듈의 최상위 코드에서 예외가 발생한 경우입니다.

이유에 명시된 오류를 수정합니다.

`options do not fit plugin.json userConfig`

이 줄은 mod 이름으로 시작하고, 그 뒤에 hooks module did not load: options do not fit plugin.json userConfig:와 이유가 나옵니다. 옵션이 해당 userConfig 필드에 대한 검증에 실패했습니다. 예를 들어 숫자가 필드의 max를 초과하거나, 필수 필드에 값이 없는 경우입니다.

값을 설정하거나 변경합니다. 줄 끝에 settings.json의 해당 pluginConfigs 항목이 명시되어 있습니다.

처음 연 디렉터리에서 mod가 로드되지 않음

해당 디렉터리의 신뢰 프롬프트에 응답하지 않았습니다.

해당 디렉터리에서 claude로 대화형 세션을 시작하고, 세션 시작 시 표시되는 신뢰 프롬프트를 수락합니다.

설치된 플러그인이 전혀 로드되지 않음

Claude Code를 --safe-mode로 시작했습니다.

이 플래그 없이 시작합니다.

훅이 건너뛰어지거나 mod가 언로드되는 경우

mod가 로드된 후 Claude Code가 해당 mod의 훅 중 하나를 건너뛰었거나 mod를 언로드했습니다.

`hook skipped`

이 줄은 mod와 이벤트의 이름을 표시한 다음 hook skipped:와 이유를 표시합니다. 예를 들면 first-mod: tool.call hook skipped: threw Error: boom과 같습니다. 훅이 예외를 발생시켰거나, 시간 제한을 초과했거나, 잘못된 형태의 결과를 반환한 경우입니다. 이 줄은 mod가 다시 로드될 때까지 이벤트와 실패 유형마다 한 번씩 표시됩니다.

오류를 수정하십시오. 디버그 로그에는 발생할 때마다 한 줄씩 기록됩니다.

`no command.run hook answered it`

mod가 추가한 명령을 실행하면, 응답에 mod와 명령의 이름이 표시되고(예: first-mod registered /tally but no command.run hook answered it) 훅을 추가하라는 안내가 이어집니다. Claude Code는 명령이 응답 없이 체인의 끝에 도달하면 이 응답을 출력하며, 이는 다음 두 가지 경우에 발생합니다.

  • 명령에 응답한 훅이 없는 경우: 모듈에 command.run 훅이 없거나, 훅의 필터가 다른 명령을 지정하거나, 훅이 next(e)를 반환한 경우입니다
  • Claude Code가 훅을 건너뛴 경우: hook skipped에 그 이유가 나열되어 있습니다. $.ui.open에 focus: false를 전달하는 것도 이러한 상황이 발생하는 한 가지 방법입니다.

모듈에 응답에서 설명하는 훅이 이미 있다면, command.run을 지정하는 hook skipped 줄을 찾아 이유를 확인하십시오. 해당 명령을 실행하는 테스트도 같은 이유로 실패합니다.

`it crashed the hooks worker`

이 줄은 mod의 이름으로 시작합니다. 예를 들면 first-mod was unloaded: it crashed the hooks worker와 같습니다. 설치된 mod는 하나의 워커 스레드를 공유합니다. 워커가 응답을 멈추거나 충돌했고, Claude Code가 그 원인을 이 mod로 추적하여 언로드한 것입니다. 한 번도 await하지 않는 루프처럼 스레드를 차단하는 훅이 한 가지 원인입니다.

훅을 수정하십시오.

`mods that run in the hooks worker are off for this session`

이 줄은 hooks: mods that run in the hooks worker are off for this session: it crashed 3 times로 표시됩니다. 워커가 세 번 중단되었고 Claude Code가 그 원인을 하나의 mod로 추적할 수 없었기 때문에, 조직에서 설치한 mod를 포함하여 내장되지 않은 모든 mod를 언로드한 것입니다. 이 줄은 모든 대화형 세션의 트랜스크립트에 표시됩니다.

/reload-plugins를 실행하여 다시 로드하십시오.

도구 호출이 거부되는 경우

mod가 로드되고 해당 훅이 실행되었지만, 그 mod가 관여한 도구 호출이 거부됩니다.

`a hook changed this call's input after the model wrote it`

자동 모드에서 도구 호출이 거부되면 이 사유가 표시됩니다. 서버 측 분류기가 도구 호출의 입력을 검토한 후에 훅이 그 입력을 변경했으므로, 해당 검토는 실제로 실행될 내용을 다루지 않습니다. 이 훅은 mod의 tool.call 또는 turn.step 훅이거나, PreToolUse 설정 훅일 수 있습니다. 메시지에는 어느 쪽인지 표시되지 않습니다.

이 메시지는 Claude에게 기록된 그대로 호출을 한 번 더 실행하도록 지시합니다. 그 호출도 거부된다면 훅이 매번 입력을 변경하고 있는 것이므로, 해당 mod나 훅을 끄거나 자동 모드를 종료하고 호출을 직접 승인해야 합니다.

설정의 거부 규칙에 관한 메시지

tried to lift a deny rule in your settings와 the deny rules in your settings could not be checked for this call, so it is refused는 모두 기본 제공 가드에서 발생하는 메시지입니다.

기본 제공 가드의 메시지에서 확인하십시오.

그림이 나타나지 않거나 반응하지 않음

mod는 로드되었지만 해당 pane, band 또는 컨트롤이 예상대로 동작하지 않습니다.

pane 또는 band가 비어 있거나 Claude Code의 일반 콘텐츠를 표시함

훅이 반환한 트리가 유효성 검사를 통과하지 못했습니다. --plugin-dir을 사용하면 트랜스크립트에 ui.render (Pane) refused:와 함께 이유가 표시됩니다. 예를 들면 first-mod: ui.render (Pane) refused: Box prop "flexDirection" must be one of row, column, row-reverse, column-reverse; the engine drew its own과 같습니다. 디버그 로그에는 같은 이유와 함께 a hook returned a tree that does not validate가 기록됩니다.

해당 줄에 표시된 이유를 확인합니다. 흔한 원인은 해당 요소가 받지 않는 prop을 사용했거나 앱에 없는 요소를 사용한 경우입니다.

`$.ui.open`이 실행되지만 pane이 나타나지 않음

호출이 사용자의 동작에서 비롯되지 않았고, 터미널 너비가 해당 pane에 필요한 너비보다 좁습니다.

명령이나 버튼에서 pane을 열거나, 호출의 isPlaced 결과를 확인합니다. 적절한 시점에 pane 열기를 참조하세요.

단축키가 작동하지 않음

pane에 키보드 포커스가 없습니다.

Ctrl+X를 누른 다음 Tab을 누르거나 pane을 클릭합니다. 명령에서 focus: true로 pane을 엽니다.

그림이 터미널에서는 작동하지만 Desktop 앱에서는 작동하지 않음

해당 지점 또는 요소를 Desktop 앱에서 사용할 수 없습니다.

렌더링 지점 및 요소 표를 확인하세요.

편집 내용이나 값이 사라짐

mod가 실행되지만, 사용자가 적용한 변경 사항이나 mod가 유지하던 값이 없습니다.

편집 내용이 적용되지 않음

설치한 플러그인을 편집하고 있는 경우입니다. Claude Code는 설치된 버전의 캐시된 사본을 실행합니다.

claude --plugin-dir ./first-mod와 같이 --plugin-dir을 작업 사본으로 지정하여 개발하면, 저장할 때마다 다시 로드됩니다.

모듈이 다시 로드될 때 값이 초기화됨

모듈 수준 변수는 다시 로드될 때마다 다시 초기화됩니다.

값을 $.state 또는 $.store에 보관합니다.

`/clear`, `/resume` 또는 `/branch` 이후 값이 초기화됨

값이 초기화되거나, 저장된 값이 기본값으로 대체됩니다. 이러한 명령은 각각 $.state를 기본값으로 재설정하며, session.start는 다시 발생하지 않습니다.

classic.SessionStart 훅에서 저장된 값을 다시 로드합니다.

디버그 로그 읽기

디버그 로그에는 Claude Code가 로드하거나 거부하는 모든 모듈, 실패하는 모든 훅, 거부하는 모든 결과에 대한 줄이 기록되므로, 트랜스크립트에 아무것도 표시되지 않을 때 확인할 곳입니다. 로그를 작성하려면 셸에서 --debug로 Claude Code를 시작하거나, 저장 위치를 지정하려면 --debug-file <path>로 시작합니다:

claude --debug-file ./mod-debug.log --plugin-dir ./first-mod

다른 터미널에서 파일을 따라가며 mod 이름으로 필터링합니다:

tail -f ./mod-debug.log | grep first-mod

로드된 mod에는 해당 mod의 이름을 표시하고 처리하는 이벤트를 나열하는 줄이 있습니다. --plugin-dir로 로드된 mod는 이름 뒤에 @inline이 붙어 표시됩니다:

hooks module first-mod@inline loaded (worker, environment 2, tier user); events: session.start,tool.call,command.run,ui.render

유효성 검사를 통과하지 못한 드로잉도 거부된 결과로 간주되어 줄이 기록됩니다. 로그에 직접 줄을 작성하려면 $.ui.log('message', { to: 'debug' })처럼 두 번째 인수와 함께 $.ui.log를 호출합니다. 두 번째 인수가 없으면 $.ui.log는 트랜스크립트에 흐린 줄을 추가합니다.

--plugin-dir로 로드된 mod를 편집하는 동안, 트랜스크립트에는 다시 로드할 때마다 mod의 이름을 표시하고 해당 훅을 나열하는 줄이 나타납니다. 저장으로 인해 모듈이 손상되면 해당 줄에 이유와 함께 reload failed, the previous version stays loaded:가 표시되며, 마지막으로 정상 작동한 버전이 계속 실행됩니다.

다음 단계