Conecta tu carpeta de Markdown a un bot de Telegram, a un sitio mediante API local, a bases de datos y hojas de cálculo, a n8n y a la voz. Node.js, cero dependencias.

El cerebro creado por astra-2cerebro funciona muy bien en la terminal. Pero la pregunta llega por Telegram, el sitio necesita el catálogo que está en la wiki y la base de datos genera registros todas las noches. cerebro-integra es la capa que traduce cada canal en lecturas y escrituras seguras en los archivos del cerebro.
API HTTP local, bot de Telegram, importadores (JSON, CSV, carpeta, exportar wiki), flujo de n8n y puente de voz. Todos se comunican con un solo núcleo, lib/cerebro.mjs.
API solo en 127.0.0.1, token opcional, escritura desactivada hasta que la actives, chats de Telegram en una lista cerrada, bloqueo de path traversal, token nunca impreso.
Solo node:http, fetch e fs. Sin npm install. Clona, copia el .env, funciona. 73 pruebas con node --test.
Ningún adaptador accede directamente a los archivos. El núcleo sabe dónde vive cada cosa en el cerebro (fontes/, decisoes/registro.md, rotinas/registro.md, wiki/) y solo escribe añadiendo: nada se sobrescribe.
GET /buscar, /contexto, /prioridades, /pagina, /projetos, /conexoes. Búsqueda sin acentos, todos los términos obligatorios, bonificación para el título.
POST /decisao, /fonte, /rotina/execucao y los comandos /decisao, /fonte, /rotina del bot. Solo con CEREBRO_ESCRITA=1.
Una nota por elemento en fontes/AAAA-MM-DD-slug.md. Nombre determinista: ejecutarlo cada noche no duplica. La fecha proviene del elemento o del archivo, nunca de "hoy".
El bot necesita un token de BotFather; la voz necesita los comandos de STT/TTS que elijas. No necesitas instalar nada aparte de Node.
Si usas Claude Code o Codex, ya lo tienes.
node --version # v20 o superior
Carpeta con AGENTS.md/CLAUDE.md, contexto/ e fontes/, creada por el astra-2cerebro. Para probar, test/fixture/ es un cerebro mínimo.
ls ~/meu-cerebro # AGENTS.md contexto/ fuentes/ wiki/ ...
En Telegram, @BotFather → /newbot. Guarda el token en el .env. Descubre el ID de tu chat con getUpdates.
# .env TELEGRAM_TOKEN=123456:ABC... TELEGRAM_CHATS=123456789
Todos los comandos son reales y están en el repositorio. La documentación completa (API ruta por ruta, Telegram, importadores, n8n, voz, seguridad y tres recetas) está en docs/.
Sin npm install. O .env se lee de la carpeta actual, sin sobrescribir las variables ya 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 pruebas, usa una copia de test/fixture/, no toca tu cerebro
Escucha solo en 127.0.0.1:4650. Con CEREBRO_TOKEN, todas las rutas (menos /saude) exige Authorization: Bearer.
npm run api # [api] cerebro: /home/usuario/meu-cerebro # [api] escuchando en http://127.0.0.1:4650 # [api] token: obligatorio · escritura: desactivada · cors: desactivado 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 defecto, la API y el bot solo leen. La escritura siempre es por anexado: las fuentes existentes no se sobrescriben, los registros solo reciben nuevas líneas.
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ó."}' # → añade "## 2026-09-07: Usar la API no site" en decisoes/registro.md
Long polling: sin puerto abierto, sin HTTPS. Solo responde a los chats en TELEGRAM_CHATS; sin la lista, no se inicia.
npm run bot # [bot] @meu_cerebro_bot · cerebro: /home/usuario/meu-cerebro # [bot] chats permitidos: 1 · escritura: desactivada · responder: búsqueda # en el chat: /buscar catálogo prazo /prioridades /decisao Usar API | O site consulta a API | Uma fonte só /rotina importar-catalogo ok 12 notas # reenviar cualquier mensaje al bot guarda una nota en fontes/
Con RESPONDER_CMD, el bot y la voz ejecutan el comando en la carpeta del cerebro con la pregunta en la entrada estándar. Sin él, el texto libre devuelve la búsqueda.
# .env RESPONDER_CMD=claude -p # se ejecuta en CEREBRO_DIR, lee el CLAUDE.md automáticamente
Mapa de campos en JSON. --simular enumera lo que se crearía. Si lo ejecutas de nuevo, omite lo que ya 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 # creados: 340 · omitidos (ya existían): 0 node importadores/importar-csv.mjs produtos.csv --config mapas/catalogo.json node importadores/importar-pasta.mjs ~/Documentos/notas --prefixo notas
Un JSON con páginas, frontmatter, enlaces [[slug]], enlaces rotos y páginas huérfanas. Sirve para búsqueda externa, sitio estático o panel.
node importadores/exportar-wiki.mjs --saida wiki.json # exportadas: 4 páginas, 8 enlaces → wiki.json
Importa n8n/fluxo-exemplo.json (webhook → /buscar → respuesta; token vía $env). La voz es un puente mediante variables de entorno, con modo --texto para probar sin micrófono.
TTS_CMD='espeak-ng -v pt-br --stdin' voz/voz.sh --texto "o que sabemos sobre o catálogo" # [voz] pregunta: qué sabemos sobre el catálogo # Encontré 3 resultados. 1. Reunión de kickoff de la fase 2. ... GRAVAR_CMD='arecord -d 6 -f cd -q' STT_CMD='whisper-cli -nt -f' voz/voz.sh
Cron → importador → POST /rotina/execucao. La línea se agrega al principio de "Registro de ejecuciones" en rotinas/registro.md: es lo que el /auditar del kit busca. Receta completa en docs/receitas.md.
# crontab 0 23 * * * /home/usuario/cerebro-integra/rotinas/importar-catalogo.sh >> ~/logs/importar.log 2>&1 # al final del 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"}'
Resultados reales, generados a partir del cerebro de ejemplo en 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..." }
]
}tú: /prioridades bot: Prioridades: 1. Entregar la fase 2 de [[projeto-alfa]] para el final del trimestre. 2. Organizar el catálogo de productos de [[empresa-x]] en una base consultable. 3. Reducir el tiempo de respuesta a clientes a menos de un día hábil. tú: /rotina importar-catalogo ok 12 notas novas bot: Ejecución registrada: importar-catalogo · ok · 2026-09-07 23:00 tú: /decisao a | b bot: Escritura desactivada. Inicia el bot con CEREBRO_ESCRITA=1 para registrar.
| Ruta | Haz | Requiere |
|---|---|---|
GET /saude | versión, cerebro, flags, lista de rutas | nada (abierta para monitoreo) |
GET /contexto · /prioridades | sobre-mim, trabajo, prioridades, mapa de rutas | token, si está configurado |
GET /buscar?q=&limite=&pasta= | busca en todos los .md/.txt | token |
GET /pagina?caminho= | un archivo, con frontmatter; bloquea traversal | token |
GET /projetos · /conexoes · /rotinas | tablas del kit como JSON | token |
POST /decisao · /fonte · /rotina/execucao | adjunta en decisoes/, fontes/, rotinas/ | token + CEREBRO_ESCRITA=1 |
La versión 1.0.0 cubre los cinco canales. Las próximas ideas son pequeñas y solo se incorporan cuando alguien realmente las necesite.