Pular para o conteúdo
claudemods

Human in the loop: o mod Claude Code human in the loop para tarefas que só você pode fazer

O Claude atribui a você as tarefas que só você pode fazer. Elas esperam em My tasks, contadas sob o prompt.

Permissões

  • Intercepta chamadas de ferramentasVê cada chamada de ferramenta que o Claude faz (tool.call / tool.check) e pode bloqueá-la ou alterá-la.
  • Lê seus promptsPode ver o que você digita e a transcrição da conversa (prompt.* / session.append / session.messages).
  • Altera a interfaceDesenha na interface do Claude Code: faixas, painéis, texto de status, notificações (ui.render / $.ui.*).
  • Adiciona comandos/ferramentasRegistra novos comandos de barra ou ferramentas que você ou o Claude podem acionar ($.command.register / $.tool.register).
  • Armazena dadosGuarda dados entre sessões no armazenamento privado do plugin ($.store.*).
testado com
v2.1.310
último teste
requer
Claude Code ≥ 2.1.287
superfícies
painel, status, notificação, transcrição

Instale dentro do Claude Code:

/plugin install human-in-the-loop --marketplace tzafrir/human-in-the-loop
Todas as opções de instalação ↓

O que este mod faz?

Human in the loop é um mod da comunidade de Tzafrir Rehan (tzafrir), um mod Claude Code human in the loop para uma situação específica: o Claude precisa de algo que só você pode fazer, como colocar uma chave no .env, uma aprovação em staging, um comando na sua própria máquina ou uma decisão. Normalmente ele diz isso no meio de uma resposta, e o pedido se perde ao rolar a tela. Com este mod, o Claude atribui o pedido como uma tarefa.

O mod registra três ferramentas, assign_task, list_tasks e withdraw_task, e acrescenta algumas linhas ao prompt do sistema que dizem ao Claude para usar assign_task em tudo o que só você pode fazer, inclusive revisões do trabalho dele. Uma tarefa tem um título, um motivo de uma frase, um "done when" opcional e um tipo: do (você faz e marca como concluída), answer (o Claude precisa das suas palavras) ou choose (escolher uma de 2 a 4 opções). As tarefas abertas esperam em um painel My tasks e são contadas na linha de status sob o prompt, como ☐ 1 task for you · /my-tasks. Você pode responder com Done, uma opção, uma resposta ou uma recusa com motivo.

As tarefas não bloqueiam o Claude. Ele segue com outro trabalho, e sua resposta chega como mensagem quando você a dá. Limites segundo o código: no máximo 5 tarefas abertas, o mesmo pedido duas vezes é uma só tarefa e só o agente principal pode atribuí-las.

Demonstração

A gravação inicia o Claude Code com o mod carregado no pequeno projeto de demonstração e pede ao Claude que use assign_task para nos dar uma tarefa: colocar STRIPE_KEY no .env. O Claude chama a ferramenta, e a transcrição mostra uma linha amarela ☐ Assigned you a task: Put your STRIPE_KEY in the .env file, seguida do resultado da ferramenta, que informa que é a tarefa #1 e que há 1 de 5 tarefas abertas. Sob o prompt, a linha de status mostra ☐ 1 task for you · /my-tasks, e à direita do rodapé aparece um toast: human-in-the-loop: Claude assigned you a task: Put your STRIPE_KEY in the .env file. See /my-tasks. Nesta gravação estreita o painel não abriu sozinho, e é para isso que o toast serve; por isso o vídeo não mostra o painel nem a resposta a uma tarefa.

Instalação

Use qualquer um dos métodos do bloco de instalação; eles instalam direto do marketplace do próprio autor. Após instalar, inicie uma nova sessão ou execute /reload-plugins. /my-tasks abre o painel.

$ install human-in-the-loop

Requer Claude Code ≥ 2.1.287

Instala a partir do marketplace do autor: tzafrir/human-in-the-loop

  1. 1.Uma linha, dentro do Claude Code

    /plugin install human-in-the-loop --marketplace tzafrir/human-in-the-loop

    Cole em uma sessão em andamento (v2.1.275+). O Claude Code pede primeiro para adicionar o marketplace.

  2. 2.Pelo seu shell

    claude plugin marketplace add tzafrir/human-in-the-loop
    claude plugin install human-in-the-loop@human-in-the-loop

    Depois execute /reload-plugins em qualquer sessão que já esteja aberta.

  3. 3.Experimente sem instalar

    git clone https://github.com/tzafrir/human-in-the-loop
    claude --plugin-dir ./human-in-the-loop

    Carrega o mod só para uma sessão. Nada é adicionado às suas configurações.

Como funciona

hooks/register.tsx é o único módulo de hooks. O tratador de assign_task valida os argumentos, recusa duplicatas e uma sexta tarefa aberta, guarda a tarefa e abre o painel. De 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) }
})

As tarefas ficam em $.state e em uma chave de $.store por sessão, sob a pasta do projeto, escrita por um batimento de 60 segundos, para que a próxima sessão possa assumir as tarefas de uma sessão encerrada ou inativa. Suas respostas saem com $.prompt.submit quando o Claude está ocioso, ou são anexadas como linha com $.session.append enquanto ele trabalha. Um hook prompt.compose adiciona o texto de orientação, e um hook prompt.context lista as tarefas abertas no início e após uma compactação.

Personalize

Não há opções. Você controla o mod com os botões e teclas do painel: d para Done, 1 a 4 para opções, r para responder, x para recusar, e Save for later ou Send now para o momento do envio. Respostas longas passam pela sua própria caixa de prompt: Long answer… a começa com ↳ Answer to #3:. Para mudar os limites, as constantes MAX_OPEN e MAX_TITLE estão em hooks/tasks.ts e BATCH_MS em hooks/register.tsx.

Permissões e segurança

Lemos todos os arquivos que o plugin carrega antes de executar qualquer coisa: .claude-plugin/plugin.json, hooks/hooks.json, hooks/register.tsx, pane.ts, project.ts, tasks.ts, text.ts, as declarações de tipos e os testes. Não há package.json, script de instalação, código empacotado ou minificado, nem binário além de imagens PNG e GIF. Há um arquivo LICENSE (MIT).

  • Rede, processos, arquivos, ambiente: nenhum. Uma busca nos hooks não encontrou fetch, child_process, $.process, $.http, eval nem import() dinâmico. O único armazenamento é $.store e $.state, com o modelo de dados descrito em docs/privacy.md. Sem telemetria; a política de privacidade do autor diz que nada sai da sua máquina.
  • Daemons: nenhum; o batimento de $.clock.every só roda enquanto a sessão dura.
  • Influência sobre o modelo: esta é a parte notável. O mod adiciona três ferramentas, uma seção de três linhas no fim do prompt do sistema (STEERING), um bloco de contexto humanInTheLoop com as tarefas abertas e um resumo de atualizações de tarefas que acompanha seu próximo prompt. Ele também deixa as três ferramentas sempre visíveis em vez de adiadas. O texto é simples e confere com o README; não encontramos caracteres ocultos nem de largura zero no código ou no manifesto (apenas em strings de teste com emojis).
  • Hooks de controle: os hooks tool.call respondem apenas às três ferramentas do próprio mod, e prompt.submit lê seu prompt para reconhecer uma resposta longa (↳ Answer to #N:) e anexar as respostas ainda não enviadas. Uma resposta que parece um segredo é descartada com um aviso em vez de enviada. Qualquer outra chamada de ferramenta passa sem alteração. O validate observa que esses hooks não têm .catch.
  • Prompts que ele envia: suas respostas às tarefas com suas palavras e uma linha fixa: I answered a task while you were finishing your reply; my answer is above.
  • Requisitos: os function hooks precisam estar ativados no Claude Code (o README os chama de acesso antecipado). Sem binário externo nem conta.

O claude plugin validate passou sem erros e sem avisos, e os testes do autor passaram no Claude Code 2.1.310: 192 aprovados, 0 reprovados.

Intercepta chamadas de ferramentas
Vê cada chamada de ferramenta que o Claude faz (tool.call / tool.check) e pode bloqueá-la ou alterá-la.
Lê seus prompts
Pode ver o que você digita e a transcrição da conversa (prompt.* / session.append / session.messages).
Altera a interface
Desenha na interface do Claude Code: faixas, painéis, texto de status, notificações (ui.render / $.ui.*).
Adiciona comandos/ferramentas
Registra novos comandos de barra ou ferramentas que você ou o Claude podem acionar ($.command.register / $.tool.register).
Armazena dados
Guarda dados entre sessões no armazenamento privado do plugin ($.store.*).

Compatibilidade e solução de problemas

Verificado com o Claude Code 2.1.310 no macOS (validate, testes e gravação). Se nada acontecer:

  • Os function hooks estão ativados e o plugin aparece carregado em /plugin.
  • Você iniciou uma nova sessão ou executou /reload-plugins após instalar.
  • O Claude só atribui uma tarefa quando o prompt do sistema traz o texto de orientação; ele não é adicionado no modo -p (print) nem no modo bare.
  • Em um terminal estreito o painel não abre sem ser pedido. Execute /my-tasks e clique ou pressione ctrl+x tab para usar as teclas.
  • O app móvel não desenha campo de resposta, então lá só há Done, opções e um Reject imediato.

Perguntas frequentes

Como uma tarefa difere do AskUserQuestion?
O AskUserQuestion bloqueia o Claude até você responder. Uma tarefa não: o Claude continua trabalhando enquanto ela espera, e sua resposta chega a ele como uma mensagem quando você a dá. A descrição da ferramenta diz ao Claude para usar tarefas no que ele precisar em algum momento da sessão.
Quando o Claude recebe minha resposta?
Na hora, se o Claude estiver ocioso. Se estiver trabalhando, a resposta é salva e sai quando o turno termina; se ainda houver tarefa aberta, sai junto com suas outras respostas quando não restar nenhuma. O botão Send now envia na hora, e seu próximo prompt também a leva.
As tarefas sobrevivem a /clear, a uma nova sessão ou a uma compactação?
Sim. As tarefas abertas ficam no armazenamento próprio do plugin, por pasta de projeto, e a próxima sessão nessa pasta as assume. O Claude é avisado delas de novo no início de uma conversa e após uma compactação.
E se eu responder com um segredo?
Uma resposta que parece uma chave, um token ou uma chave privada é retida com um aviso e só é enviada se você pressionar Send anyway. A descrição da ferramenta pede ao Claude que faça você colocar o segredo onde ele deve ficar e pressionar Done, em vez de colá-lo.
Ele envia algo pela rede?
Não. Não encontramos chamadas de rede, de processos nem do sistema de arquivos no código. Ele guarda as tarefas com $.store e envia suas respostas ao Claude apenas como prompts, com suas próprias palavras.
Aviso de conclusão em execução no Claude CodeDestaque

Aviso de conclusão

Um toast "Done in 2m 14s" e um som curto quando um turno longo do Claude termina, com notificação opcional no desktop.

  • notificação
  • Executa comandos
  • Altera a interface
  • Reproduz som

testado com v2.1.310

Next Steps em execução no Claude CodeDestaque

Next Steps

Dois ou três prompts prováveis acima da entrada depois de cada turno. Pressione 1, 2 ou 3 para criar um rascunho.

  • acima do prompt
  • Chama o modelo (usa sua cota)
  • Lê seus prompts
  • Altera a interface

testado com v2.1.291

Mais em Timers, tarefas e standups, Ferramentas que você adiciona ao Claude.