Liga a sua pasta de Markdown a um bot de Telegram, a um site via API local, a bancos e planilhas, ao n8n e à voz. Node.js, zero dependências.

O cérebro criado pelo astra-2cerebro funciona muito bem no terminal. Mas a pergunta chega pelo Telegram, o site precisa do catálogo que está na wiki, o banco gera registros toda noite. O cerebro-integra é a camada que traduz cada canal para leituras e escritas seguras nos arquivos do cérebro.
API HTTP local, bot de Telegram, importadores (JSON, CSV, pasta, exportar wiki), fluxo n8n e ponte de voz. Todos falam com um núcleo só, lib/cerebro.mjs.
API só em 127.0.0.1, token opcional, escrita desligada até você ligar, chats do Telegram em lista fechada, bloqueio de path traversal, token nunca impresso.
Só node:http, fetch e fs. Sem npm install. Clona, copia o .env, roda. 73 testes com node --test.
Nenhum adaptador toca em arquivo diretamente. O núcleo sabe onde cada coisa vive no cérebro (fontes/, decisoes/registro.md, rotinas/registro.md, wiki/) e só escreve anexando: nada é sobrescrito.
GET /buscar, /contexto, /prioridades, /pagina, /projetos, /conexoes. Busca sem acento, todos os termos obrigatórios, bônus para título.
POST /decisao, /fonte, /rotina/execucao e os comandos /decisao, /fonte, /rotina do bot. Só com CEREBRO_ESCRITA=1.
Uma nota por item em fontes/AAAA-MM-DD-slug.md. Nome determinístico: rodar toda noite não duplica. Data vem do item ou do arquivo, nunca de "hoje".
O bot precisa de um token do BotFather; a voz precisa dos comandos de STT/TTS que você escolher. Nada é instalado por você além do Node.
Se você usa Claude Code ou Codex, já tem.
node --version # v20 ou superior
Pasta com AGENTS.md/CLAUDE.md, contexto/ e fontes/, criada pelo astra-2cerebro. Para experimentar, test/fixture/ é um cérebro mínimo.
ls ~/meu-cerebro # AGENTS.md contexto/ fontes/ wiki/ ...
No Telegram, @BotFather → /newbot. Guarde o token no .env. Descubra o ID do seu chat com getUpdates.
# .env TELEGRAM_TOKEN=123456:ABC... TELEGRAM_CHATS=123456789
Todos os comandos são reais e estão no repositório. A documentação completa (API rota a rota, Telegram, importadores, n8n, voz, segurança e três receitas) está em docs/.
Sem npm install. O .env é lido da pasta atual, sem sobrescrever variáveis já definidas.
git clone https://github.com/inematds/cerebro-integra.git cd cerebro-integra cp .env.exemplo .env # edite CEREBRO_DIR=/caminho/para/meu-cerebro npm test # 73 testes, usa uma cópia de test/fixture/, não toca no seu cérebro
Escuta só em 127.0.0.1:4650. Com CEREBRO_TOKEN, toda rota (menos /saude) exige Authorization: Bearer.
npm run api # [api] cérebro: /home/usuario/meu-cerebro # [api] escutando em http://127.0.0.1:4650 # [api] token: exigido · escrita: desligada · cors: desligado curl 'http://127.0.0.1:4650/buscar?q=catalogo&limite=3' -H "Authorization: Bearer $CEREBRO_TOKEN" curl http://127.0.0.1:4650/prioridades -H "Authorization: Bearer $CEREBRO_TOKEN"
Por padrão a API e o bot só leem. Escrita é sempre anexar: fonte existente não é sobrescrita, registros só ganham linhas.
CEREBRO_ESCRITA=1 npm run api curl -X POST http://127.0.0.1:4650/decisao -H "Authorization: Bearer $CEREBRO_TOKEN" \ -H 'Content-Type: application/json' \ -d '{"titulo":"Usar a API no site","decisao":"O site consulta /buscar.","porque":"Uma fonte só."}' # → anexa "## 2026-09-07: Usar a API no site" em decisoes/registro.md
Long polling: sem porta aberta, sem HTTPS. Só responde aos chats em TELEGRAM_CHATS; sem a lista, não sobe.
npm run bot # [bot] @meu_cerebro_bot · cérebro: /home/usuario/meu-cerebro # [bot] chats permitidos: 1 · escrita: desligada · responder: busca # no chat: /buscar catálogo prazo /prioridades /decisao Usar API | O site consulta a API | Uma fonte só /rotina importar-catalogo ok 12 notas # encaminhar qualquer mensagem ao bot grava uma nota em fontes/
Com RESPONDER_CMD, o bot e a voz rodam o comando na pasta do cérebro com a pergunta na entrada padrão. Sem ele, texto livre devolve a busca.
# .env RESPONDER_CMD=claude -p # roda em CEREBRO_DIR, lê o CLAUDE.md automaticamente
Mapa de campos em JSON. --simular lista o que seria criado. Rodar de novo pula o que já existe.
# mapas/catalogo.json { "titulo": "nome", "data": "criado_em", "id": "sku", "prefixo": "catalogo", "corpo": ["descricao"], "tags": "categorias", "extras": ["preco"] } node importadores/importar-json.mjs catalogo.json --config mapas/catalogo.json --simular node importadores/importar-json.mjs catalogo.json --config mapas/catalogo.json # criados: 340 · pulados (já existiam): 0 node importadores/importar-csv.mjs produtos.csv --config mapas/catalogo.json node importadores/importar-pasta.mjs ~/Documentos/notas --prefixo notas
Um JSON com páginas, frontmatter, links [[slug]], links quebrados e páginas órfãs. Serve busca externa, site estático ou painel.
node importadores/exportar-wiki.mjs --saida wiki.json # exportado: 4 páginas, 8 links → wiki.json
Importe n8n/fluxo-exemplo.json (webhook → /buscar → resposta; token via $env). A voz é uma ponte por variáveis de ambiente, com modo --texto para testar sem microfone.
TTS_CMD='espeak-ng -v pt-br --stdin' voz/voz.sh --texto "o que sabemos sobre o catálogo" # [voz] pergunta: o que sabemos sobre o catálogo # Encontrei 3 resultados. 1. Reunião de kickoff da fase 2. ... GRAVAR_CMD='arecord -d 6 -f cd -q' STT_CMD='whisper-cli -nt -f' voz/voz.sh
Cron → importador → POST /rotina/execucao. A linha entra no topo de "Registro de execuções" em rotinas/registro.md: é o que o /auditar do kit procura. Receita completa em docs/receitas.md.
# crontab 0 23 * * * /home/usuario/cerebro-integra/rotinas/importar-catalogo.sh >> ~/logs/importar.log 2>&1 # no fim do script: curl -X POST http://127.0.0.1:4650/rotina/execucao -H "Authorization: Bearer $CEREBRO_TOKEN" \ -H 'Content-Type: application/json' -d '{"id":"importar-catalogo","resultado":"ok","saida":"12 notas novas"}'
Saídas reais, geradas a partir do cérebro de exemplo em test/fixture/.
{
"consulta": "catalogo",
"total": 2,
"resultados": [
{ "caminho": "contexto/sobre-o-trabalho.md",
"titulo": "Sobre o trabalho", "pontos": 4,
"trecho": "...um catálogo de produtos artesanais..." },
{ "caminho": "fontes/2026-08-18-reuniao-kickoff-fase-2.md",
"titulo": "Reunião de kickoff da fase 2", "pontos": 4,
"trecho": "...cobre o catálogo de produtos..." }
]
}você: /prioridades bot: Prioridades: 1. Entregar a fase 2 do [[projeto-alfa]] até o fim do trimestre. 2. Organizar o catálogo de produtos da [[empresa-x]] em uma base consultável. 3. Reduzir o tempo de resposta a clientes para menos de um dia útil. você: /rotina importar-catalogo ok 12 notas novas bot: Execução registrada: importar-catalogo · ok · 2026-09-07 23:00 você: /decisao a | b bot: Escrita desligada. Suba o bot com CEREBRO_ESCRITA=1 para registrar.
| Rota | Faz | Exige |
|---|---|---|
GET /saude | versão, cérebro, flags, lista de rotas | nada (aberta para monitoramento) |
GET /contexto · /prioridades | sobre-mim, trabalho, prioridades, mapa de rotas | token, se configurado |
GET /buscar?q=&limite=&pasta= | busca em todos os .md/.txt | token |
GET /pagina?caminho= | um arquivo, com frontmatter; bloqueia traversal | token |
GET /projetos · /conexoes · /rotinas | tabelas do kit como JSON | token |
POST /decisao · /fonte · /rotina/execucao | anexa em decisoes/, fontes/, rotinas/ | token + CEREBRO_ESCRITA=1 |
A versão 1.0.0 cobre os cinco canais. As próximas ideias são pequenas e só entram quando alguém precisar de verdade.