Human in the loop: 나만 할 수 있는 작업을 놓치지 않게 하는 Claude Code 휴먼 인 더 루프 모드
Claude가 당신만 할 수 있는 일을 작업으로 배정하고, My tasks 창에 모아 두며 프롬프트 아래에 개수를 보여 줍니다.
권한
- 도구 호출 가로채기Claude가 하는 모든 도구 호출을 볼 수 있고(tool.call / tool.check), 이를 차단하거나 변경할 수 있습니다.
- 프롬프트 읽기입력한 내용과 대화 기록을 볼 수 있습니다(prompt.* / session.append / session.messages).
- UI 변경Claude Code 화면에 밴드, 패널, 상태 텍스트, 토스트를 그립니다(ui.render / $.ui.*).
- 명령어/도구 추가사용자나 Claude가 호출할 수 있는 새 슬래시 명령어나 도구를 등록합니다($.command.register / $.tool.register).
- 데이터 저장플러그인 전용 저장소에 세션 간 데이터를 보관합니다($.store.*).
- 테스트 버전
- v2.1.310
- 마지막 테스트
- 필요 버전
- Claude Code ≥ 2.1.287
- 표시 위치
- 패널, 상태 표시줄, 토스트, 대화 기록
Claude Code 안에서 설치:
/plugin install human-in-the-loop --marketplace tzafrir/human-in-the-loop이 모드는 무엇을 하나요?
Human in the loop은 Tzafrir Rehan(tzafrir)이 만든 커뮤니티 모드로, Claude Code 휴먼 인 더 루프를 구현합니다. 다루는 상황은 Claude가 당신만 할 수 있는 일, 예를 들어 .env에 키 넣기, 스테이징 승인, 당신 컴퓨터에서 명령 실행, 결정 같은 것을 필요로 할 때입니다. 보통은 답변 중간에 한마디 하고 지나가며, 그 요청은 곧 스크롤 위로 사라집니다. 이 모드가 있으면 Claude는 요청을 작업으로 배정합니다.
모드는 assign_task, list_tasks, withdraw_task 세 도구를 등록하고, 당신만 할 수 있는 일(작업 결과 검토 포함)에는 assign_task를 쓰라고 시스템 프롬프트에 몇 줄을 더합니다. 작업에는 제목, 한 문장 이유, 선택 사항인 "완료 조건", 종류가 있습니다. 종류는 do(직접 하고 완료 표시), answer(Claude가 당신의 말을 필요로 함), choose(2~4개 선택지 중 하나 고르기)입니다. 열린 작업은 My tasks 창에서 기다리고, 프롬프트 아래 상태 줄에 ☐ 1 task for you · /my-tasks처럼 개수가 표시됩니다. 완료, 선택지, 답변, 이유를 단 거절로 응답할 수 있습니다.
작업은 Claude를 멈추지 않습니다. Claude는 다른 일을 계속하고, 응답은 당신이 보낼 때 메시지로 도착합니다. 코드상 한도는 열린 작업 최대 5개, 같은 요청은 하나로 처리, 작업 배정은 메인 에이전트만 가능하다는 것입니다.
데모
녹화에서는 작은 데모 프로젝트에서 모드를 불러온 Claude Code를 시작하고, assign_task로 .env에 STRIPE_KEY를 넣는 작업을 하나 배정해 달라고 Claude에게 요청합니다. Claude가 도구를 호출하면 대화 기록에 노란색 ☐ Assigned you a task: Put your STRIPE_KEY in the .env file 줄이 나타나고, 이어서 작업이 #1이며 열린 작업이 5개 중 1개라는 도구 결과가 나옵니다. 프롬프트 아래 상태 줄에는 ☐ 1 task for you · /my-tasks가 표시되고, 푸터 오른쪽에는 토스트 human-in-the-loop: Claude assigned you a task: Put your STRIPE_KEY in the .env file. See /my-tasks가 나타납니다. 폭이 좁은 이 녹화에서는 창이 저절로 열리지 않았고(토스트가 그 때문에 있습니다), 창이나 작업에 답하는 장면은 영상에 없습니다.
설치
설치 블록의 어떤 방법을 써도 작성자 본인의 마켓플레이스에서 바로 설치됩니다. 설치 후에는 새 세션을 시작하거나 /reload-plugins를 실행하세요. /my-tasks로 창을 엽니다.
$ install human-in-the-loop
Claude Code 2.1.287 이상 필요
작성자의 마켓플레이스에서 설치: tzafrir/human-in-the-loop
1.Claude Code 안에서 한 줄로
/plugin install human-in-the-loop --marketplace tzafrir/human-in-the-loop실행 중인 세션(v2.1.275 이상)에 붙여 넣으세요. Claude Code가 먼저 마켓플레이스 추가 여부를 묻습니다.
2.셸에서 설치
claude plugin marketplace add tzafrir/human-in-the-loop claude plugin install human-in-the-loop@human-in-the-loop그런 다음 이미 열려 있는 세션에서 /reload-plugins를 실행하세요.
3.설치하지 않고 사용해 보기
git clone https://github.com/tzafrir/human-in-the-loop claude --plugin-dir ./human-in-the-loop한 세션에서만 모드를 불러옵니다. 설정에는 아무것도 추가되지 않습니다.
작동 방식
훅 모듈은 hooks/register.tsx 하나입니다. assign_task 핸들러는 인자를 검사하고, 중복과 여섯 번째 열린 작업을 거부하며, 작업을 저장하고 창을 엽니다. hooks/register.tsx에서:
on('tool.call', { tool: ASSIGN }, async ($, e) => {
if (e.agentId !== undefined) {
return { deny: 'Only the main agent assigns tasks to the user. Say what you need from the user in your result instead.' }
}
const ask = parseAsk(e as unknown as Record<string, unknown>)
if ('error' in ask) {
return { deny: ask.error }
}
// ...
return { result: assignedOf(task, active.length + 1) }
})작업은 $.state와, 프로젝트 폴더 아래 세션마다 하나씩 있는 $.store 키에 저장됩니다. 60초 간격 하트비트로 기록되어, 끝났거나 응답이 없는 세션의 작업을 다음 세션이 이어받을 수 있습니다. 응답은 Claude가 쉬고 있으면 $.prompt.submit으로, 일하는 중이면 $.session.append로 한 줄 추가되어 전달됩니다. prompt.compose 훅이 안내 문구를 더하고, prompt.context 훅이 대화 시작과 압축 뒤에 열린 작업을 나열합니다.
사용자 지정
옵션은 없습니다. 창의 버튼과 키로 조작합니다. d는 완료, 1~4는 선택지, r은 답변, x는 거절이며, 전송 시점은 Save for later와 Send now로 정합니다. 긴 답변은 자신의 프롬프트 입력창을 거치며, Long answer…가 ↳ Answer to #3:로 시작하게 해 줍니다. 한도를 바꾸려면 MAX_OPEN과 MAX_TITLE은 hooks/tasks.ts에, BATCH_MS는 hooks/register.tsx에 있습니다.
권한 및 안전
아무것도 실행하기 전에 플러그인이 불러오는 모든 파일을 읽었습니다. .claude-plugin/plugin.json, hooks/hooks.json, hooks/register.tsx, pane.ts, project.ts, tasks.ts, text.ts, 타입 선언, 테스트입니다. package.json, 설치 스크립트, 번들되거나 minify된 코드는 없고, PNG와 GIF 이미지 외의 바이너리도 없습니다. LICENSE 파일(MIT)이 있습니다.
- 네트워크, 프로세스, 파일, 환경 변수: 모두 없음. 훅에서
fetch,child_process,$.process,$.http,eval, 동적import()를 찾지 못했습니다. 저장소는$.store와$.state뿐이며 데이터 모델은docs/privacy.md에 설명되어 있습니다. 텔레메트리는 없고, 작성자의 개인정보 처리방침은 어떤 것도 컴퓨터 밖으로 나가지 않는다고 밝힙니다. - 데몬: 없음.
$.clock.every하트비트는 세션이 실행되는 동안에만 돕니다. - 모델에 미치는 영향: 눈여겨볼 부분입니다. 모드는 도구 3개, 시스템 프롬프트 끝의 3줄(
STEERING), 열린 작업을 나열하는humanInTheLoop컨텍스트 블록, 다음 프롬프트에 붙는 작업 업데이트 요약을 추가합니다. 또한 세 도구를 지연 로딩하지 않고 항상 보이게 합니다. 문구는 평범하고 README와 일치하며, 코드와 매니페스트에서 숨은 문자나 제로 폭 문자는 찾지 못했습니다(이모지 테스트 문자열에만 있음). - 게이팅 훅:
tool.call훅은 모드 자신의 세 도구에만 응답합니다.prompt.submit은 프롬프트를 읽어 긴 답변(↳ Answer to #N:)을 인식하고 아직 보내지 않은 응답을 붙입니다. 비밀 값처럼 보이는 답변은 전송되지 않고 알림이 표시됩니다. 다른 모든 도구 호출은 그대로 통과합니다.validate는 이 훅들에.catch가 없다고 알려 줍니다. - 제출하는 프롬프트: 당신의 말로 쓰인 작업 응답과 고정된 한 줄
I answered a task while you were finishing your reply; my answer is above.뿐입니다. - 요구 사항: Claude Code에서 function hooks가 켜져 있어야 합니다(README는 얼리 액세스라고 설명). 외부 바이너리나 계정은 필요 없습니다.
claude plugin validate는 오류와 경고 없이 통과했고, 작성자의 테스트도 Claude Code 2.1.310에서 모두 통과했습니다(192개 통과, 0개 실패).
- 도구 호출 가로채기
- Claude가 하는 모든 도구 호출을 볼 수 있고(tool.call / tool.check), 이를 차단하거나 변경할 수 있습니다.
- 프롬프트 읽기
- 입력한 내용과 대화 기록을 볼 수 있습니다(prompt.* / session.append / session.messages).
- UI 변경
- Claude Code 화면에 밴드, 패널, 상태 텍스트, 토스트를 그립니다(ui.render / $.ui.*).
- 명령어/도구 추가
- 사용자나 Claude가 호출할 수 있는 새 슬래시 명령어나 도구를 등록합니다($.command.register / $.tool.register).
- 데이터 저장
- 플러그인 전용 저장소에 세션 간 데이터를 보관합니다($.store.*).
호환성 및 문제 해결
macOS의 Claude Code 2.1.310에서 확인했습니다(validate, 테스트, 녹화). 아무 일도 일어나지 않는다면:
- function hooks가 켜져 있고
/plugin에서 플러그인이 불러와져 있는지 확인하세요. - 설치 후 새 세션을 시작했거나
/reload-plugins를 실행했는지 확인하세요. - Claude는 시스템 프롬프트에 안내 문구가 있을 때만 작업을 배정하며,
-p(print) 또는 bare 모드에서는 추가되지 않습니다. - 좁은 터미널에서는 창이 저절로 열리지 않습니다.
/my-tasks를 실행한 뒤 클릭하거나ctrl+x tab으로 키를 사용하세요. - 모바일 앱에는 답변 입력란이 없어 완료, 선택지, 즉시 거절만 쓸 수 있습니다.
자주 묻는 질문
- 작업은 AskUserQuestion과 무엇이 다른가요?
- AskUserQuestion은 답할 때까지 Claude를 멈춥니다. 작업은 멈추지 않습니다. 기다리는 동안에도 Claude는 계속 일하고, 당신의 응답은 보낼 때 메시지로 Claude에게 전달됩니다. 도구 설명은 세션 중 언젠가 필요한 일에 작업을 쓰라고 Claude에게 알려 줍니다.
- Claude는 언제 내 답을 받나요?
- Claude가 쉬고 있으면 바로 받습니다. 일하는 중이면 답이 저장되었다가 턴이 끝날 때 전달되며, 열린 작업이 남아 있으면 모두 처리된 뒤 다른 답과 함께 전달됩니다. Send now 버튼은 즉시 보내고, 다음에 입력하는 프롬프트에도 함께 실립니다.
- /clear, 새 세션, 압축 뒤에도 작업이 남나요?
- 남습니다. 열린 작업은 플러그인 자체 저장소에 프로젝트 폴더별로 보관되고, 그 폴더의 다음 세션이 이어받습니다. 대화를 시작할 때와 압축 뒤에 Claude는 이를 다시 안내받습니다.
- 답에 비밀 값을 넣으면 어떻게 되나요?
- 키, 토큰, 개인 키처럼 보이는 답은 경고와 함께 보류되며 Send anyway를 누르지 않으면 전송되지 않습니다. 도구 설명은 비밀 값을 붙여 넣지 말고 있어야 할 곳에 두고 Done을 누르게 하라고 Claude에게 요청합니다.
- 네트워크로 무언가를 보내나요?
- 아니요. 코드에서 네트워크, 프로세스, 파일 시스템 호출을 찾지 못했습니다. 작업은 $.store에 저장되고, 당신의 응답은 당신의 말 그대로 프롬프트로만 Claude에게 전달됩니다.
# 관련 모드
추천완료 토스트
긴 Claude 턴이 끝나면 "Done in 2m 14s" 토스트와 짧은 알림음을 내고, 데스크톱 알림도 선택적으로 보냅니다.
- 토스트
- 명령어 실행
- UI 변경
- 소리 재생
v2.1.310에서 테스트됨
추천Next Steps
각 턴이 끝나면 Claude Code 입력창 위에 다음에 보낼 만한 프롬프트 2~3개를 보여 줍니다. 1, 2, 3으로 초안을 넣습니다.
- 프롬프트 위
- 모델 호출 (사용량 소모)
- 프롬프트 읽기
- UI 변경
v2.1.291에서 테스트됨
더 보기: 타이머, 할 일, 스탠드업, Claude에 추가하는 도구.