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 e editável por você/pelo modelo em qualquer modo:
- Nome, role, nível de expertise, empresa, localização
- Idioma preferido e estilo de comunicação
- Listas com ciclo de vida: certificações, skills, objetivos, interesses e diretivas (reafirmar um item supera o antigo em vez de duplicar; sufixos
_replace/_done/_removereescrevem) - Diretivas com severidade (regras duras vs preferências) e escopo por projeto (
[scope:<projeto>] regrasó é injetada quando aquele workspace está ativo) - Posições (
stance) — opiniões técnicas gravadas com o porquê ("posição :: razão") - Marcos (
milestone) — linha do tempo datada do que aconteceu - Ambiente estruturado (
env_os,env_shell, …) — migrado automaticamente das preferences legadas - Proveniência e frescor por campo: cada atributo sabe se veio de você ou da extração e quando foi confirmado; campos sem reconfirmação há 120+ dias são sinalizados como possivelmente desatualizados no prompt
- Camada de privacidade: chaves de finanças/saúde/família/documentos são auto-marcadas
[sensitive]— personalizam respostas, mas nunca entram em código, exemplos ou artefatos gerados (sensitive_mark/sensitive_unmarkpara controle manual) - Comandos mais usados (top 10) e preferencias gerais
/memory profile. Perfis antigos poluídos por versões append-only se auto-curam no próximo load (fragmentos, duplicatas de progresso e objetivos concluídos saem sozinhos).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 > Trajetória (digests) > Padrões de uso
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 com ciclo de vida: Atualizações de
PROFILE_UPDATEsão mescladas com o perfil existente. Campos de lista fazem upsert (reafirmar um item supera o antigo em vez de duplicar), e a extração pode emitir operações de reescrita:goals_done=/goals_remove=removem objetivos concluídos (movendo-os paramilestone=/certifications=),goals_replace=substitui a lista inteira — os mesmos sufixos valem para certificações, skills, interesses e diretivas. Instruções suas sobre o perfil (“remove X dos objetivos”) são aplicadas, nunca gravadas como se fossem fatos
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.Digests Semanais e Mensais (Trajetória)
Notas diárias expiram em ~30 dias — os rollups preservam a narrativa de longo prazo antes disso:- Ao fim de cada semana ISO, as notas diárias daquela semana consolidam em
weekly/2026-W27.md(resumo via LLM com fallback determinístico — nunca depende do provider estar de pé). - Ao fim de cada mês, os digests semanais consolidam em
monthly/2026-06.md. - Retenção: semanais guardam ~26 semanas; mensais ficam para sempre (custo mínimo).
- Uma seção Trajectory limitada entra no contexto de memória com o último mensal + semanais recentes — é assim que “o que você andou fazendo nos últimos meses” sobrevive à limpeza das notas diárias.
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. Além de nome/role/expertise/empresa/localização, o perfil cobre certificações, skills, objetivos, interesses, diretivas, posições (stance), marcos (milestone) e ambiente (env_*). Campos de lista têm ciclo de vida, não são append-only: novos itens entram, um item reafirmado (mesmo texto fora do status/parêntese) supera o antigo no lugar, e sufixos de operação reescrevem —_replace substitui a lista inteira (valor vazio limpa), _done/_remove removem itens que casem. Vírgulas dentro de parênteses são seguras ("Quiz X (Provider, 60 questões)" fica inteiro).
forget atua só em fatos; para remover itens do perfil use os sufixos (goals_remove=...). Diretivas com [scope:<projeto>] só são injetadas quando aquele workspace está ativo; sem a tag, valem globalmente.Tool @memory (agent, coder e chat)
Dentro do /agent e /coder, o modelo pode persistir e explorar memória sozinho via a tool @memory (cmds remember, profile, forget, recall, neighbors, map):
/memory manualmente. O subcomando profile aceita todas as operações de ciclo de vida (goals_done, goals_replace, stance, milestone, env_*, sensitive_mark, …).
No chat também: atualização de memória/perfil é a quarta exceção sancionada do chat tool-less (junto de ask_user, knowledge read-only e @graphview). Quando você revela ou corrige um fato durável sobre si, o modelo persiste no mesmo turno — nada de “vou considerar daqui pra frente” sem gravar. Controlada por CHATCLI_CHAT_MEMORY (ligada por padrão) e alternável com /config chat memory on|off.
Grafo de conhecimento (@memory neighbors / map)
O que o ChatCLI sabe sobre você não é uma lista plana: facts, tópicos, projetos, skills e tags formam um grafo derivado on-demand (estilo Obsidian, no core) a partir das relações que os stores já guardam (tópico↔fato, fato→projeto, tags, triggers de skill) mais [[wikilinks]] no texto. Acesso pelo próprio @memory:
recall→ busca por conteúdo (“quais fatos casam com estas palavras?”).neighbors <assunto>→ grafo local: backlinks + notas conectadas de um assunto (“o que está ligado a isto?”).map→ visão geral (contagens por tipo + hubs).
/graph (renderiza o grafo em imagem via go-graphviz embarcado).
Qualidade dos fatos (confiança, proveniência, reconciliação)
Cada fato carrega confiança e proveniência: o que você afirma diretamente vale mais que um palpite da extração de fundo, e um fato re-observado sobe de confiança — a confiança pondera o score (ranking e sobrevivência ao decay/poda). Ao gravar, o ChatCLI reconcilia: uma reformulação reforça o fato existente em vez de duplicar, e uma atualização do mesmo assunto com confiança igual ou maior substitui o fato obsoleto (conservador — um palpite fraco nunca apaga um fato forte). Tópicos ganham um resumo rolante do que foi discutido, virando nós de conhecimento de verdade. Índices de memória legados são enriquecidos uma vez no startup, sem perder nada.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.