Sandcorp샌드코프 · 웹·AI 제품 개발

새 프로젝트 받는 중 · 갱신 2026.11sandcorp.co.krGitHub

← 팁

디버깅

Claude Code 훅에서 「--agent로 띄운 본 세션」만 골라내려면 agent_type과 agent_id를 함께 본다

--agent로 뜬 본 세션은 훅 입력에 agent_type만, 그 안의 서브에이전트 도구 호출은 agent_type과 agent_id가 함께, 에이전트 없는 세션은 둘 다 없이 옵니다. 환경변수 없이도 특정 에이전트 세션에서만 훅을 켤 수 있습니다.

문제

특정 에이전트로 띄운 세션에서만 동작하는 훅을 만들고 싶었습니다. 처음에는 세션을 띄울 때 환경변수를 넣고 훅이 그 값을 보게 했습니다. 그런데 이 방식은 띄우는 쪽이 환경변수를 한 번만 빼먹어도 훅이 조용히 꺼집니다. 꺼졌다는 표시도 없어서, 훅이 지켜야 할 세션에서 아무것도 지켜지지 않았습니다.

원인과 단서

훅이 받는 입력 JSON에 이미 어떤 에이전트에서 왔는지가 들어 있습니다. 다만 같은 agent_type이 두 경우에 다 들어와서, 이것만 보면 본 세션과 그 안에서 부른 서브에이전트를 가를 수 없습니다. Claude Code 2.1.318에서 확인한 입력은 이렇습니다.

세션 agent_type agent_id
claude --agent X로 뜬 본 세션 X 없음
그 안의 서브에이전트가 부른 도구 서브에이전트 이름 있음
에이전트 없이 뜬 세션 없음 없음

해법

「agent_type이 있고 agent_id가 없다」로 본 세션을 고르고, 이름이 대상 목록에 있을 때만 켭니다. 플러그인 안의 에이전트는 이름이 플러그인:에이전트 꼴로 올 수 있으므로 끝 이름도 맞춰 봅니다. 환경변수는 「덮어쓰기」로만 남겨 두면, 아무것도 넣지 않아도 기본으로 켜지고 따로 시험할 때만 바꿀 수 있습니다.

const TARGETS = ['issue-worker'];

function isTargetMainSession(input) {
  const agent = input.agent_type;
  if (!agent || input.agent_id) return false; // 에이전트 없음, 또는 서브에이전트 호출
  const bare = String(agent).split(':').pop(); // 'plugin:issue-worker' 꼴 대비
  return TARGETS.includes(agent) || TARGETS.includes(bare);
}

이 필드는 하네스 버전에 따라 바뀔 수 있으니, 버전을 올린 뒤에는 실제 훅 입력을 한 번 파일로 남겨 세 경우가 그대로인지 확인합니다.

문의 →