O sistema de bootstrap e memória está totalmente conectado ao fluxo de system prompt. Os arquivos são carregados automaticamente e injetados em todas as interações — tanto no modo chat quanto nos modos
/agent e /coder.Arquivos Bootstrap
Os arquivos bootstrap são documentos Markdown carregados automaticamente no system prompt do agente. Eles definem quem o assistente e, como ele se comporta e quais regras deve seguir.Arquivos Suportados
O ChatCLI carrega exatamente 5 arquivos bootstrap, nesta ordem. Todos são opcionais — se não existirem, são simplesmente ignorados:| Arquivo | Proposito | Quando usar |
|---|---|---|
AGENTS.md | Definicoes de sub-agentes e seus papeis | Quando você quer instruir o orquestrador sobre quais agents existem e como usa-los |
SOUL.md | Personalidade, tom e estilo do assistente | Para definir “quem” e o assistente — como ele fala, pensa e se comporta |
USER.md | Preferencias e contexto do usuário/projeto | Para informar o stack, convencoes, ferramentas preferidas e contexto do projeto |
IDENTITY.md | Identidade e capacidades do agente | Para definir “o que” o assistente e — nome, capacidades, limitações |
RULES.md | Regras e restrições explicitas | Para guardrails rígidos — o que ele DEVE e NÃO DEVE fazer |
Prioridade de Carregamento
Os arquivos são buscados em dois níveis, com o workspace tendo prioridade:Workspace (raiz do projeto)
Configurações específicas do projeto. Tem prioridade sobre o global. A raiz do projeto e detectada automaticamente (veja abaixo).
Detecção Automática do Workspace
O ChatCLI usadetectProjectDir() para encontrar a raiz real do projeto. Em vez de usar simplesmente o diretório atual (CWD), ele sobe na árvore de diretorios procurando marcadores de projeto:
- Verifica se o diretório atual contem
.git/ou.agent/ - Se não encontrar, sobe para o diretório pai e repete
- Continua até encontrar um marcador ou chegar na raiz do filesystem
- Se nenhum marcador for encontrado, usa o CWD como fallback
Marcadores reconhecidos:
.git (repositório Git) e .agent (marcador explicito do ChatCLI). Basta um deles existir para definir a raiz do workspace.Cenarios de Exemplo
| CWD ao iniciar | Marcador encontrado | Workspace detectado | Arquivos carregados |
|---|---|---|---|
~/project/ | ~/project/.git | ~/project/ | ~/project/SOUL.md, etc. |
~/project/src/pkg/ | ~/project/.git | ~/project/ | ~/project/SOUL.md (sobe 2 níveis) |
~/project/src/pkg/ | nenhum | ~/project/src/pkg/ | Apenas globais (~/.chatcli/) |
~/monorepo/services/api/ | ~/monorepo/.git | ~/monorepo/ | ~/monorepo/SOUL.md, etc. |
~/tmp/ | nenhum | ~/tmp/ | Apenas globais (~/.chatcli/) |
Exemplos Detalhados
- SOUL.md
- USER.md
- IDENTITY.md
- RULES.md
- AGENTS.md
Define personalidade e tom. Coloque em
~/.chatcli/SOUL.md (global) ou ./SOUL.md (projeto):Onde Colocar os Arquivos
“Raiz do projeto” significa o diretório que contem.git/ ou .agent/ — detectado automaticamente pelo detectProjectDir(), não necessariamente o CWD.
Cache Inteligente
Os arquivos bootstrap usam cache baseado em mtime (modification time):- Na primeira leitura, o conteúdo e cacheado em memória
- Leituras subsequentes verificam se o mtime mudou
- Se o arquivo foi modificado, o cache e invalidado automaticamente
IsStale()verifica se algum arquivo mudou desde o ultimo carregamento
Memória Persistente
O sistema de memória mantem contexto entre sessões do ChatCLI usando armazenamento estruturado com múltiplos componentes que aprendem sobre você e seu trabalho ao longo do tempo.Arquitetura do Sistema
Extração resiliente — nada se perde em silêncio
A extração depende de uma chamada de LLM em background — e um provider fora do ar não pode custar a memória da conversa. Três defesas em camadas:- Cadeia de fallback: a extração tenta o client ativo da sessão e, em falha, percorre
CHATCLI_MEMORY_FALLBACK_PROVIDERS(ouCHATCLI_FALLBACK_PROVIDERS), com timeout próprio por tentativa. - Fila durável em disco: um segmento que falhar em todos os providers é gravado em
~/.chatcli/memory/pending/(escrita atômica) e reprocessado nas próximas execuções, do mais antigo para o mais novo — sobrevive a restart. A fila tem teto (100 segmentos) e arquivos corrompidos são descartados sem travar o restante. - Aviso visível: duas falhas consecutivas mostram uma linha no terminal (
memória: extração falhando…) — perda silenciosa de fatos por dias não acontece mais.
O gateway também consulta esta memória: a persona do daemon chama
@memory recall antes de responder “não sei” a perguntas pessoais. Veja Chat Gateway.Estrutura de Armazenamento
Toda a memória fica em~/.chatcli/memory/:
Componentes
FactIndex -- Memória de Longo Prazo
FactIndex -- Memória de Longo Prazo
Substitui o antigo MEMORY.md append-only. Cada fato tem:
- ID unico por hash SHA-256 do conteúdo (deduplicação automatica)
- Categoria: architecture, pattern, preference, gotcha, project, personal
- Score temporal:
(1 + log(accessCount)) * exp(-days * ln2 / halfLife) - Tags para busca por keywords
UserProfile -- Perfil do Usuário
UserProfile -- Perfil do Usuário
Detectado automaticamente pela IA durante a extracao:
- Nome, role, nível de expertise
- Idioma preferido e estilo de comunicação
- Comandos mais usados (top 10)
- Preferencias gerais
/memory profile.TopicTracker -- Topicos Recorrentes
TopicTracker -- Topicos Recorrentes
Rastreia topicos tecnicos discutidos:
- Frequência de mencoes
- Recencia (topicos recentes pesam mais)
- Links com fatos relacionados
/memory topics.ProjectTracker -- Projetos
ProjectTracker -- Projetos
Rastreia projetos em que você trabalha:
- Nome, path, descrição
- Tecnologias usadas
- Status (active, paused, completed)
- Ultima atividade
/memory projects.PatternDetector -- Padroes de Uso
PatternDetector -- Padroes de Uso
Analisa como você usa o ChatCLI:
- Sessões totais e duracao media
- Horas de pico de atividade
- Features preferidas (chat, agent, coder)
- Erros comuns e resolucoes
/memory stats.Smart Retrieval
Em vez de injetar toda a memória no system prompt, o ChatCLI usa retrieval inteligente:- Extrai keywords das ultimas mensagens da conversa
- Busca fatos relevantes no FactIndex por keyword match + score temporal
- Respeita um budget configurável (padrão: 4000 caracteres)
- Prioriza: Perfil > Projetos > Topicos > Fatos relevantes > Notas recentes
Fatos acessados pelo retriever tem seu score incrementado automaticamente, criando um ciclo virtuoso: quanto mais um fato e util, mais ele aparece.
Modo de injeção: push vs pull
Como a memória chega ao modelo nos modos/agent e /coder é controlado por CHATCLI_MEMORY_MODE:
| Modo | Comportamento |
|---|---|
index (default) | Injeta apenas um índice compacto e estável (perfil resumido + nomes dos top topics/projects + contagem de fatos por categoria) e deixa o agente puxar o detalhe sob demanda via @memory recall. Custo por turno limitado e cacheável. |
full | Injeta o Smart Retrieval completo (acima) a cada turno — o comportamento clássico de “push”. |
off | Não injeta memória; os arquivos bootstrap continuam valendo. |
pull (index) reduz o bloco de memória por turno em ~88% num store de 500 fatos sem perder acesso ao detalhe — veja Eficiência de Tokens › Memória pull-first para a medição completa. O chat é tool-less e não puxa sob demanda: lá index cai em full. A ferramenta @memory recall usa HyDE + busca vetorial, então o detalhe puxado tem a mesma qualidade do push. Veja o estado atual em /config memory.
Configuração da Memória
O sistema de memória possui parâmetros configuraveis via variáveis de ambiente:| Variável | Padrão | Descrição |
|---|---|---|
CHATCLI_MEMORY_MODE | index | Modo de injeção em agent/coder: index (pull), full (push) ou off |
CHATCLI_MEMORY_MAX_SIZE | 32768 (32KB) | Tamanho máximo do MEMORY.md renderizado |
CHATCLI_MEMORY_RETENTION_DAYS | 30 | Dias de retencao de notas diarias antes da limpeza |
CHATCLI_MEMORY_MAX_FACTS | 500 | Número máximo de fatos no FactIndex |
CHATCLI_MEMORY_RETRIEVAL_BUDGET | 4000 | Máximo de caracteres de memória injetados no system prompt (modo full) |
Config interno define valores padrão adicionais:
| Parâmetro | Valor Padrão | Descrição |
|---|---|---|
CompactionInterval | 24 horas | Intervalo mínimo entre compactações completas |
DecayHalfLifeDays | 30.0 | Meia-vida do decay temporal dos scores de fatos |
| Intervalo de verificação | 6 horas | Frequência com que o sistema checa se precisa compactar |
Como as Memorias são Criadas
O worker em background agora extrai 5 tipos de informação (antes eram apenas 2):- DAILY — O que foi feito (arquivos, comandos, erros, tarefas)
- LONGTERM — Fatos novos para lembrar permanentemente
- PROFILE_UPDATE — Informações sobre o usuário (nome, role, expertise)
- TOPICS — Topicos tecnicos discutidos
- PROJECTS — Projetos em que se trabalhou
Processo de Extracao
O Memory Worker segue este fluxo interno:- EnhancedExtractionPrompt: Envia o histórico recente da conversa para o LLM com um prompt estruturado solicitando extracao de informações
- Resposta esperada: O LLM retorna texto com headers de seção bem definidos:
## DAILY— Resumo do que foi feito na sessão## LONGTERM— Fatos novos para memória de longo prazo## PROFILE_UPDATE— Atualizações de perfil do usuário## TOPICS— Topicos tecnicos identificados## PROJECTS— Projetos mencionados ou trabalhados
- ParseEnhancedResponse(): Faz o parse da resposta e extrai cada seção individualmente
- Deduplicação: Cada fato recebe um ID único via hash SHA-256 do conteúdo. Fatos com hash identico a um já existente são descartados automaticamente
- Merge de perfil: Atualizações de
PROFILE_UPDATEsão mescladas (merged) com o perfil existente, nunca substituidas por completo
Compactação Automatica
O sistema executa compactação periodica para evitar crescimento descontrolado:Verificação (a cada 6 horas)
Checa se o número de fatos ultrapassa 80% do limite ou se passaram 24h desde a ultima compactação.
Compactação LLM (preferida)
Envia todos os fatos para a IA com instruções para: merge duplicatas, remover obsoletos, consolidar relacionados.
Fallback Score-based
Se a chamada LLM falhar, arquiva fatos com score abaixo de 0.1 em
memory_archive.json.Migração Automatica
Ao iniciar pela primeira vez com o novo sistema, o ChatCLI detecta se existe umMEMORY.md legado (sem memory_index.json) e migra automaticamente:
- Cada linha/bullet e convertida em um fato individual
- Categorias são detectadas pelos headers do markdown
- Tags são extraidas por keywords tecnicas
- O arquivo original e salvo como
MEMORY.md.bak
Comando /memory
| Subcomando | Descrição |
|---|---|
/memory ou /memory today | Mostra as notas de hoje |
/memory yesterday | Mostra as notas de ontem |
/memory 2026-03-04 | Mostra notas de uma data específica |
/memory week | Mostra notas dos ultimos 7 dias |
/memory longterm | Mostra o conteúdo do MEMORY.md |
/memory list | Lista todos os arquivos de memória (inclui JSONs estruturados) |
/memory load <data> | Carrega notas de um dia no contexto da conversa |
/memory profile | Mostra o perfil do usuário detectado |
/memory profile set <campo>=<valor> | Define/atualiza um campo do perfil manualmente |
/memory remember <fato> | Adiciona um fato de longo prazo explicitamente (aceita prefixo [categoria]) |
/memory forget <trecho> | Remove fatos de longo prazo que contenham o trecho |
/memory topics | Mostra topicos rastreados com frequência |
/memory projects | Mostra projetos rastreados com status |
/memory stats | Estatisticas completas (sessões, horas de pico, erros, features) |
/memory facts [categoria] | Lista fatos com scores (filtro por categoria) |
/memory compact | Forca compactação imediata (LLM + cleanup de notas) |
Edição manual e perfil estendido
A detecção automática nem sempre captura tudo, então você pode editar a memória explicitamente. O perfil do usuário agora cobre, além de nome/role/expertise: empresa, localização, skills, certificações e metas. Campos de lista (skills, certificações, metas) acumulam e deduplicam.Tool @memory (no modo agente)
Dentro do /agent e /coder, o modelo pode persistir memória sozinho via a tool @memory (cmds remember, profile, forget, recall):
/memory manualmente.
O que vai em cada componente?
O que vai em cada componente?
- FactIndex: Fatos estaveis e duradouros — decisoes, padroes, gotchas, preferencias
- UserProfile: Quem você e — nome, role, expertise, idioma
- TopicTracker: Sobre o que você fala — Go, Docker, K8s, etc.
- ProjectTracker: Em que você trabalha — chatcli, meu-app, etc.
- PatternDetector: Como você trabalha — horarios, features, erros comuns
- Notas diarias: O que aconteceu hoje — temporal e específico
Posso editar as memorias manualmente?
Posso editar as memorias manualmente?
Sim! Todos os arquivos são JSON ou Markdown puro:Alterações em JSONs são carregadas na proxima inicializacao. O MEMORY.md e regenerado e não deve ser editado diretamente.
Como funciona o scoring de fatos?
Como funciona o scoring de fatos?
Cada fato tem um score calculado por:
- accessCount: Quantas vezes o fato foi usado pelo retriever
- daysSinceAccess: Dias desde o ultimo acesso
- halfLifeDays: Meia-vida do decay (padrão: 30 dias)
O que e Injetado no Prompt
O ContextBuilder monta o seguinte bloco e injeta como prefixo do system prompt:Contexto Dinamico (CWD + Desambiguacao)
O ChatCLI injeta automaticamente no system prompt:- Data e hora atuais
- Diretório de trabalho atual (CWD do processo)
- Instrução de desambiguacao: o modelo e instruido a SEMPRE resolver “aqui”, “este projeto”, paths relativos contra o CWD atual — nunca contra paths da memória de longo prazo
Isso resolve o problema comum onde a memória de longo prazo contem paths de projetos anteriores e o modelo confunde “o projeto atual” com um projeto que estava na memória. Fatos de outros projetos são anotados com
(from: /outro/projeto) para deixar claro de onde vieram.Path-Specific Rules
Alem doRULES.md global, você pode criar regras condicionais por path em .chatcli/rules/:
paths: que define para quais arquivos a regra se aplica:
paths: se aplicam globalmente. Regras do workspace (.chatcli/rules/) tem prioridade sobre regras globais (~/.chatcli/rules/) com o mesmo nome.
Configuração
- Variáveis de Ambiente
- Via Helm Chart
| Variável | Padrão | Descrição |
|---|---|---|
CHATCLI_BOOTSTRAP_ENABLED | true | Ativa/desativa o carregamento dos arquivos bootstrap |
CHATCLI_BOOTSTRAP_DIR | ~/.chatcli/ | Diretório alternativo para os arquivos bootstrap globais. Use quando quiser manter seus arquivos (SOUL.md, RULES.md, etc.) em outro local, por exemplo um repositório versionado ou diretório compartilhado entre máquinas |
CHATCLI_MEMORY_ENABLED | true | Ativa/desativa o sistema de memória persistente |
CHATCLI_BOOTSTRAP_DIR substitui apenas o diretório global (~/.chatcli/). Arquivos na raiz do projeto (detectada via .git ou .agent) continuam tendo prioridade sobre os globais.Boas Praticas
SOUL.md global, USER.md por projeto
Mantenha sua personalidade preferida globalmente e contexto tecnico por projeto.
MEMORY.md conciso
Mantenha apenas fatos estaveis e confirmados — não sessão-específicos.
Notas diarias para journaling
Use para registrar decisoes, problemas resolvidos e contexto temporal.
Não duplique CLAUDE.md
Se você já usa CLAUDE.md ou instruções do projeto, evite duplicar no bootstrap.
Otimização de Contexto (Cache de Prompt)
O ChatCLI otimiza o custo de tokens quando contextos estão attached usando tres estrategias complementares:System Prompt Unificado com Cache
Contextos attached via/context attach são injetados como system prompt, não como mensagens de usuário. Isso permite que providers apliquem cache automático:
| Provider | Mecanismo | Desconto |
|---|---|---|
| Anthropic | cache_control: ephemeral | ~90% |
| OpenAI | Prompt caching automático | ~50% |
| Context caching API | Variável |
- Bootstrap (SOUL.md, USER.md, etc.)
- Memory (MEMORY.md + notas diarias)
- Contextos Attached (novo — antes era user message)
- K8s Watcher (se ativo)
Compactação Inteligente
Mensagens de contexto injetado (/memory load, contextos summarizados) são automaticamente truncadas durante a compactação (Level 1 — trimming). Isso evita que contexto referencial antigo consuma budget precioso.
Visibilidade de Tokens
O comando/context attached agora mostra:
- Estimativa de tokens por contexto
- Total de tokens por turno
- Dicas de cache por provider
- Alertas para contextos muito grandes
/context attach, o feedback inclui a estimativa de custo por turno.
Próximos Passos
Controle de Conversa
Use /compact e /rewind para gerenciar o tamanho e estado da conversa.
Sessões
Salve e reutilize conversas entre projetos.