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