Skip to main content
O ChatCLI permite que você crie Agentes Customizáveis (também chamados de Personas) que definem comportamentos específicos para a IA. Este sistema transforma o ChatCLI de uma ferramenta com um “System Prompt” estático para uma plataforma polimórfica.

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).
Um Agente pode importar múltiplas Skills, criando um “Super System Prompt” composto automaticamente. Tanto Skills quanto Agentes suportam preferências de modelo e effort per-turno, honradas automaticamente pelo dispatcher quando são ativados.

Benefícios

Reutilização

Skills podem ser compartilhadas entre múltiplos agentes.

Versionamento

Arquivos .md podem ser versionados no Git.

Colaboração

Equipes podem compartilhar agentes e skills.

Consistência

Regras de coding style aplicadas automaticamente.

Especialização

Crie agentes para Go, Python, DevOps, etc.

Despacho como Worker

Agents customizados são automaticamente registrados no sistema multi-agent e podem ser despachados via agent_call pelo LLM orquestrador.

Auto-ativação de Skills

Skills com triggers: ou paths: no frontmatter são injetadas automaticamente no system prompt quando detectadas na mensagem do usuário.

Modelo e Effort por Agente

Cada skill e cada agente podem declarar 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. O matching é tolerante: nomes são case-insensitive (bash funciona), aliases comuns são aceitos (ShellBash, PatchEdit) 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.
Agents sem o campo tools recebem automaticamente read, search, tree e são marcados como read-only. Agents com Write, Edit, MultiEdit ou Bash tem acesso de escrita/execuçãoMemory, Session e Knowledge são superfícies read-only e nunca concedem escrita. Os 12 nomes de agents embarcados (file, coder, shell, git, search, planner, reviewer, tester, refactor, diagnostics, formatter, deps) são protegidos e não podem ser sobrescritos.

Exemplo sem o campo tools

Este agent será registrado como read-only no sistema multi-agent (apenas 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:
1

Lê `agent.Model()` e `agent.Effort()`

Para custom agents, vem do frontmatter. Para built-ins, vem de BuiltinAgentMeta (defaults + env var override).
2

Se `Model()` não é vazio, roda pelo Model Router

O resolver tenta, em ordem: API cache do provider ativo → catálogo estático → heurística de família (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.
3

Se `Effort()` não é vazio, anexa ao `ctx` do worker

O provider lê o hint via 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.
4

`cli.Client`, `cli.Provider` e `cli.Model` **não são mutados**

O swap é escopo de turno do worker. Quando o worker termina, o próximo agent dispatch ou turno do chat usa a escolha original do usuário.

Exemplo: Custom Agent com Modelo Ideal

Se o usuário estiver com CLAUDEAI configurado mas em claude-sonnet-4-6, este agent vai rodar em claude-opus-4-6 automaticamente. Se o usuário estiver em OPENAI com gpt-5 e não tiver ANTHROPIC_API_KEY, o dispatcher cai graciosamente no modelo do usuário e imprime um aviso claro explicando por quê.

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 em scripts/ são registrados como skills executáveis no worker. O sistema infere automaticamente o comando de execução com base na extensão: Os scripts são executados via o comando 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:
  1. Substring contígua (fast path) — o trigger inteiro aparece como está: servicenow login dispara em “faz o ServiceNow login”.
  2. Todas as palavras, qualquer ordem — triggers multi-palavra também disparam quando toda palavra aparece como token inteiro no texto, em qualquer ordem: servicenow login também dispara em “preciso fazer o login no servicenow”. Só tokens inteiros — palavras curtas nunca casam dentro de outras palavras (message me não dispara em “user message”), e pontuação tokeniza dos dois lados (unit-testsunit tests).
Se o usuário digitar “como escrever testes para este handler?”, a skill é injetada automaticamente no system prompt do turno — junto com o descritivo e o conteúdo completo da skill. O LLM passa a seguir as instruções automaticamente. Implementado em 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 ?.
O ChatCLI extrai tokens que parecem caminhos de arquivo do input do usuário (@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"
Implementado em 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.
Quando uma mesma skill casa tanto por triggers quanto por paths, ela é injetada uma única vez (dedup por nome).

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 de paths: 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).
Skills recém-casadas são injetadas como mensagem append-only [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.: sonnetopus no Claude) ou cross-provider (ex.: usuário em Claude, skill quer gpt-5 em OpenAI). Se o provider-alvo não estiver configurado, cai de volta no client do usuário com aviso visível.
  • effort: — mapeado para thinking.budget_tokens (Anthropic, modelos Opus 4.x / Sonnet 4.x / 3.7) ou reasoning_effort / reasoning.effort (OpenAI, modelos o1/o3/o4/gpt-5). Modelos sem suporte ignoram silenciosamente.
Precedência quando múltiplos modos disparam no mesmo turno:
O primeiro 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:
O ChatCLI intercepta o /<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 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:
Pin é uma intenção de sessão (não persiste entre execuções) e fica num bloco # 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.
Para entrar em modo agente com contexto, passe o task inline:

Skills de Registries Remotos

Além de criar skills manualmente, você pode buscar e instalar skills de registries remotos com o comando /skill:
Skills instaladas via registry são salvas em ~/.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:
1

System prompt personalizado

Inclui o conteúdo do agent (markdown body), skills carregadas, caminhos de subskills, comandos de scripts e instruções de tool_call.
2

Mini ReAct loop

O mesmo loop ReAct dos agents embarcados, com raciocínio, ação e observação.
3

Comandos permitidos

Baseados no campo tools do frontmatter.
4

Client resolvido por turno

Se o agent declarar model:, o dispatcher chama ResolveModelRouting para obter o client correto antes de cada turno do mini-ReAct.
5

Effort aplicado ao ctx

Se o agent declarar effort:, o ctx do worker recebe WithEffortHint, que o provider lê dentro do SendPrompt.
6

Leitura paralela

Tool calls read-only executam em goroutines paralelas.
7

File locks

Escrita com mutex per-filepath para segurança anti-race.
8

Recuperação de erros

O orquestrador pode usar 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:
1

[ROLE]

Identidade do agente (nome, descrição)
2

[PERSONALITY]

Conteúdo base do agente (markdown body)
3

[SKILLS]

Conhecimento das skills importadas (numeradas)
4

[AUTO-LOADED SKILLS]

Skills ativadas automaticamente por triggers: ou paths: da mensagem atual
5

[MANUAL SKILL]

Bloco adicional quando a mensagem foi invocada via /<skill-name>
6

[PLUGINS]

Hints de plugins habilitados
7

[LEMBRETE]

Anchor com instruções de aplicação
Essa ordem garante que a IA receba o contexto de forma estruturada, com intenção explícita do usuário (manual) tendo precedência sobre auto-ativação.

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

Se um agent ou skill com o mesmo nome existir em ambos os diretórios, a versão do projeto prevalece.

Estrutura do Projeto

Se seu projeto já tem .git/, o ChatCLI usa esse diretório como raiz do projeto automaticamente. O .agent/ é opcional — use-o quando quiser agents/skills por projeto sem depender do Git.

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.
Isso permite que você tenha um agente especialista em Go usando as ferramentas do @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

Crie agentes com poucas skills e vá adicionando conforme necessário.

Versione no Git

Mantenha seus agentes e skills em um repositório.

Compartilhe com a Equipe

Skills de coding style garantem consistência.

Use Descrições Claras

Ajuda a entender o propósito de cada agente/skill.

Teste o Prompt

Use /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 via chatcli 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

Os ConfigMaps são montados em /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

Como múltiplos agents customizados rodam em paralelo via <agent_call>.

Skill Registry

Publique e descubra skills compartilhadas entre equipes.

Subagent Delegation

Delegação focada para análises concentradas em um payload grande.

Modo Servidor

Distribua agents via ConfigMap para toda a equipe.