Conceito Fundamental
A ideia central é a composição de prompts:- Agentes definem “quem” a IA é (personalidade, especialização, tom).
- Skills definem “o que” ela deve saber/obedecer (regras, knowledge, compliance).
Benefícios
Reutilização
Versionamento
.md podem ser versionados no Git.Colaboração
Consistência
Especialização
Despacho como Worker
agent_call pelo LLM orquestrador.Auto-ativação de Skills
triggers: ou paths: no frontmatter são injetadas automaticamente no system prompt quando detectadas na mensagem do usuário.Modelo e Effort por Agente
model: e effort: ideais — o dispatcher faz o roteamento correto sem mudar a escolha do usuário.Estrutura de Diretórios
Os arquivos ficam no diretório~/.chatcli/:
Formato do Arquivo de Agente
Os agentes são arquivos Markdown com frontmatter YAML:Campo tools — Integração com Multi-Agent
O campo tools no frontmatter YAML é a chave para a integração com o sistema de orquestração multi-agent. Ele define quais comandos o agent pode usar quando despachado como worker pelo LLM orquestrador.
bash funciona), aliases comuns são aceitos (Shell → Bash, Patch → Edit) e especificadores de argumento no estilo Claude Code são ignorados (Bash(go build:*) conta como Bash). Tokens que mesmo assim não casam geram um warning no registro do agent em vez de degradá-lo silenciosamente.
Exemplo sem o campo tools
read, search, tree).Frontmatter Avançado de Agentes
Desde a versão recente, agentes suportam os mesmos campos de preferência de LLM que as skills. Eles são opcionais e retrocompatíveis — agents sem esses campos continuam funcionando exatamente como antes.Como o Dispatcher Aplica Model/Effort
Quando o LLM orquestrador despacha um agent via<agent_call>, o dispatcher:
Lê `agent.Model()` e `agent.Effort()`
BuiltinAgentMeta (defaults + env var override).Se `Model()` não é vazio, roda pelo Model Router
claude-*, gpt-*, gemini-*, etc.) → fallback otimista no provider do usuário. Se o provider-alvo não estiver configurado (sem API key), cai de volta no client do usuário e loga um aviso claro.Se `Effort()` não é vazio, anexa ao `ctx` do worker
client.EffortFromContext(ctx) dentro do SendPrompt e injeta thinking.budget_tokens (Anthropic) ou reasoning.effort / reasoning_effort (OpenAI) no request body — apenas em modelos que suportam.`cli.Client`, `cli.Provider` e `cli.Model` **não são mutados**
Exemplo: Custom Agent com Modelo Ideal
Formato do Arquivo de Skill
As skills contem conhecimento puro ou regras de compliance:Skills V2 — Pacotes com Subskills e Scripts
Além das skills V1 (arquivo único.md), o ChatCLI suporta Skills V2: diretórios contendo múltiplos documentos e scripts executáveis.
Estrutura de uma Skill V2
Subskills
Arquivos.md dentro do diretório da skill (exceto SKILL.md) são registrados como subskills. Quando o agent é despachado como worker, os caminhos dos subskills aparecem no system prompt do worker, que pode lê-los com o comando read conforme necessário.
Scripts
Arquivos emscripts/ são registrados como skills executáveis no worker. O sistema infere automaticamente o comando de execução com base na extensão:
exec do @coder e seus resultados retornam ao worker para processamento.
Skill Frontmatter Avançado
Além dos campos básicos (name, description, allowed-tools), skills suportam frontmatter avançado para controle fino de comportamento. Todos os campos avançados são opcionais e retrocompatíveis — skills existentes continuam funcionando normalmente.
Ativação Automática: triggers
Keywords que ativam a skill automaticamente quando detectadas na mensagem do usuário. Case-insensitive, com dois níveis:
- Substring contígua (fast path) — o trigger inteiro aparece como está:
servicenow logindispara em “faz o ServiceNow login”. - Todas as palavras, qualquer ordem — triggers multi-palavra também disparam quando toda palavra aparece como token inteiro no texto, em qualquer ordem:
servicenow logintambém dispara em “preciso fazer o login no servicenow”. Só tokens inteiros — palavras curtas nunca casam dentro de outras palavras (message menão dispara em “user message”), e pontuação tokeniza dos dois lados (unit-tests≈unit tests).
pkg/persona/manager.go#FindTriggeredSkills. A detecção roda em todo turno no chat mode e, no agent/coder mode, no início da execução e novamente a cada turno do loop ReAct (veja Re-ativação durante a tarefa).
Ativação Automática: paths
Globs de arquivos que ativam a skill quando os arquivos correspondentes estão sendo discutidos. Suporta *, ** (doublestar recursivo) e ?.
@file path/..., @path/to/file.go, ou tokens bare como pkg/foo/bar_test.go e main.go) e casa cada um contra os padrões paths: de todas as skills instaladas.
Exemplos que disparam *_test.go:
"rode os testes em pkg/foo/bar_test.go""@file pkg/foo/bar_test.go""@pkg/foo/bar_test.go"
pkg/persona/types.go#MatchesPath (com matcher doublestar próprio, sem dependência externa) e pkg/persona/manager.go#FindPathMatchedSkills. A extração de paths do input está em cli/skill_activation.go#extractFilePaths.
Re-ativação durante a tarefa (agent/coder)
No agent/coder mode, a ativação não fica limitada à query inicial. A cada turno do loop ReAct, o ChatCLI re-escaneia por skills que ainda não dispararam, casando contra:- o próprio raciocínio do modelo e os paths de arquivo dentro dos args das
tool_call— se o agente decide no meio da tarefa “escrever um Helm chart pra isso”, ou começa a tocar arquivos que casam com os globs depaths:de uma skill, ela ativa a tempo de moldar a próxima ação; - instruções de follow-up digitadas no meio da sessão (a fila de type-ahead ou o prompt de continuação do coder).
[SKILL AUTO-ACTIVATION — MID-TASK] no próximo limite de turno, então o prefixo cacheado do system prompt nunca é invalidado no meio da execução — com drip de no máximo 3 skills novas por injeção (matches excedentes re-candidatam no próximo boundary). Cada skill dispara no máximo uma vez enquanto seu bloco está vivo: após CHATCLI_SKILL_AGE_TURNS turnos o bloco envelhece para um stub compacto (recuperável via @recall) e a skill pode re-ativar após um cooldown se voltar a ser relevante. O set de dedup sobrevive a @park/resume. Hints de model:/effort: de skills mid-task só valem quando nenhuma skill do startup já os reivindicou. Veja Skill Registry › Ciclo de vida.
Desative com CHATCLI_AGENT_SKILL_RESCAN=false (ligado por default; listado no /config na seção de skills).
Propagação de model e effort
Quando uma skill é auto-ativada (via triggers ou paths), fixada (/skill pin) ou invocada manualmente, seus campos model: e effort: são propagados para o turno atual:
model:— o dispatcher/resolver troca o client da LLM para este turno. Funciona dentro do mesmo provider (ex.:sonnet→opusno Claude) ou cross-provider (ex.: usuário em Claude, skill quergpt-5em OpenAI). Se o provider-alvo não estiver configurado, cai de volta no client do usuário com aviso visível.effort:— mapeado parathinking.budget_tokens(Anthropic, modelos Opus 4.x / Sonnet 4.x / 3.7) oureasoning_effort/reasoning.effort(OpenAI, modelos o1/o3/o4/gpt-5). Modelos sem suporte ignoram silenciosamente.
model: não-vazio na ordem acima ganha; conflitos subsequentes são logados como warning mas não forçam swap adicional.
Invocação Manual via /<skill-name>
Skills com user-invocable: true ficam disponíveis como comandos slash diretos:
/<skill-name> antes do router padrão, valida que a skill existe e tem user-invocable: true, carrega o conteúdo, mostra o argument-hint (se os args estiverem vazios) e dispara o turno injetando a skill como bloco ”# Manually Invoked Skill” no system prompt — com precedência sobre skills auto-ativadas.
A lista de comandos protegidos (/agent, /coder, /run, /switch, /help, /skill, etc.) nunca pode ser shadowed por uma skill — mesmo que exista uma skill chamada agent, o comando built-in sempre vence.
O autocomplete do /<...> também inclui todas as skills user-invocable: true, mostrando o description e o argument-hint lado a lado.
Controle de Invocação
disable-model-invocation: true e user-invocable: true juntos = a skill só roda quando o usuário digitar /skill-name, nunca por detecção automática. Útil para skills destrutivas ou específicas demais para auto-ativar.Fixar uma Skill na Sessão (/skill pin)
Quando você precisa que uma skill se aplique a todos os turnos da sessão — não só os que casam com triggers:/paths: — fixe ela:
# Pinned Skills separado no system prompt, cacheável via cache_control: ephemeral. Em conflito de hints, pinned ganha de auto-activation mas perde para /<skill-name> manual.
Skills com disable-model-invocation: true não podem ser fixadas — o flag existe pra proibir injeção automática. Use /<skill-name> manual nesses casos.
Detalhes completos, exemplos e a tabela de precedência: Pin Skills no Skill Registry.
Comando /agent sem Contexto
Antes: digitar /agent sozinho entrava em modo agente imediatamente e enviava uma mensagem vazia à LLM.
Agora: digitar /agent (ou /run) sem um task inline imprime o help do persona handler mais um hint de uso e não inicia o ReAct loop. O mesmo vale para /coder. Isso evita burns de tokens em mensagens vazias e torna a UX mais previsível.
Skills de Registries Remotos
Além de criar skills manualmente, você pode buscar e instalar skills de registries remotos com o comando/skill:
~/.chatcli/skills/<name>/SKILL.md como pacotes V2 e ficam imediatamente disponíveis para uso com agentes. O ChatCLI suporta múltiplos registries simultaneamente (ChatCLI.dev, ClawHub, registries corporativos) com busca paralela fan-out. Veja Skill Registry para detalhes completos.Despacho como Worker (Multi-Agent)
Ao iniciar o/coder ou /agent, todos os agents customizados são automaticamente registrados no sistema de orquestração multi-agent. O LLM orquestrador pode então despachá-los via <agent_call>:
O que o worker recebe
Quando despachado, o CustomAgent executa com:System prompt personalizado
Mini ReAct loop
Comandos permitidos
tools do frontmatter.Client resolvido por turno
model:, o dispatcher chama ResolveModelRouting para obter o client correto antes de cada turno do mini-ReAct.Effort aplicado ao ctx
effort:, o ctx do worker recebe WithEffortHint, que o provider lê dentro do SendPrompt.Leitura paralela
File locks
Recuperação de erros
tool_call direto para diagnosticar e corrigir falhas.Exemplo End-to-End
Comandos de Gerenciamento
Todos os comandos de gerenciamento estão integrados ao/agent:
Ordem de Montagem do Prompt
Quando um agente é carregado, o system prompt é montado na seguinte ordem:[ROLE]
[PERSONALITY]
[SKILLS]
[AUTO-LOADED SKILLS]
triggers: ou paths: da mensagem atual[MANUAL SKILL]
/<skill-name>[PLUGINS]
[LEMBRETE]
Exemplo Prático Completo
1. Criar um agente
Crie o arquivo~/.chatcli/agents/python-data.md:
2. Usar o agente
Precedência de Agents e Skills (Projeto > Global)
Tanto agents quanto skills suportam diretórios por projeto com precedência sobre os globais. O ChatCLI detecta a raiz do projeto automaticamente buscando um diretório.agent/ ou .git/ a partir do diretório atual.
Ordem de Busca
Estrutura do Projeto
Integração com /coder
Quando um agente está carregado:
/agent <tarefa>— Usa a persona do agente./coder <tarefa>— Combina a persona do agente com o prompt do coder.
@coder para editar arquivos, executar testes etc. As preferências model: e effort: do agente são honradas em ambos os modos.
Dicas
Comece Simples
Versione no Git
Compartilhe com a Equipe
Use Descrições Claras
Teste o Prompt
/agent show para ver como o prompt ficou montado.Atribua `effort` com Cuidado
effort: high custa mais tokens. Reserve para agentes que realmente precisam de raciocínio profundo (revisores, planners, diagnostics).Exemplos de Skills Úteis
- clean-code — Princípios de código limpo
- error-handling — Padrões de tratamento de erros
- testing-patterns — Padrões de testes automatizados
- docker-master — Best practices para Dockerfiles
- clean-scripts — Padrões para scripts Bash seguros
- aws-security — Regras de segurança para AWS
- team-conventions — Convenções específicas da equipe
Agents e Skills Remotos
Quando conectado a um servidor ChatCLI viachatcli connect, o client descobre automaticamente os agents e skills disponíveis no servidor. Eles são transferidos ao client e compostos localmente, permitindo merge com resources locais.
Desde a atualização recente, o wire gRPC (pb.AgentInfo) carrega todos os campos avançados — model, effort, category, version, author, tags — então agents remotos têm exatamente o mesmo comportamento de roteamento que os locais.
Provisionamento via Kubernetes
- Helm
- Operator
/home/chatcli/.chatcli/agents/ e /home/chatcli/.chatcli/skills/, e ficam disponíveis para descoberta remota automaticamente. Campos avançados de frontmatter (model, effort, category, etc.) são lidos pelo chatcli dentro do pod — o CRD e o operator não precisam ser alterados para suportá-los.Próximos passos
Multi-Agent Orchestration
<agent_call>.