Sobre el proyecto

ohmyboring es un sistema de memoria personal autoalojado para agentes de codificación. Captura cómo resolviste problemas en sesiones de Claude Code, Kimi Code y Codex elegibles, destila cada sesión en una nota Markdown curada almacenada en un vault local, y trae esas notas de vuelta cuando preguntas "¿cómo hice esto la última vez?". Todo se ejecuta localmente: la incrustación y síntesis pasan por un servidor LLM local (Ollama, LM Studio u otro endpoint compatible con OpenAI), sin APIs externas ni tokens. Cómo entra la memoria: - Automático al final de la sesión: un hook SessionEnd destila la transcripción y la almacena; un hook UserPromptSubmit emparejado inyecta hasta tres fragmentos relevantes de sesiones pasadas en nuevos prompts, cada uno con afirmaciones establecidas. - Worker de Codex: dado que Codex no tiene hook SessionEnd, un worker del host escanea ~/.codex/sessions cada 20 minutos e ingiere transcripciones elegibles. - Backfill: `make collect` siembra un vault vacío desde el historial pasado de Claude Code (más reciente primero, idempotente, N por ejecución); `make collect-kimi` hace lo mismo para Kimi Code. - A mitad de sesión: `make distill-now` re-destila la transcripción actual, y `make remember M="..."` guarda una nota explícita. La memoria es Markdown-primero: notas simples, legibles por humanos y difereciables con git en vault/wiki, que pueden abrirse directamente como un vault de Obsidian para vista de grafo, backlinks, etiquetas y búsqueda de texto completo. Un acelerador opcional pgvector (BORING_VECTOR=on) añade búsqueda por similitud y GraphRAG cuando la escala lo requiere. La arquitectura separa una puerta de lectura rápida sin LLM (`make ask`, recall.py, MCP recall) de una puerta de escritura controlada (distill-session.py llama al LLM local y escribe a través de una herramienta MCP remember determinista). Una puerta de duplicados omite notas duplicadas pero permite que una nota más rica reescriba el mismo archivo wiki. Un contrato de grafo de flujo de trabajo tipado en Rust en drudge/src/workflow.rs define el vocabulario de nodos/aristas para descubrimiento de sesiones, destilación, verificación, reparación, remember, actualización de marcadores, registro de eventos y proyección de preparación, mientras que los hooks y workers de Python aún realizan E/S del host. La configuración vive en boring.json (desde boring.example.json): idioma de notas, proveedor LLM/base_url/modelo/modelo de incrustación y dimensión, reglas de origen de repositorio y adaptadores de transcripción de agentes. Cambiar de backend es un bloque de configuración; `make up` despacha a scripts de arranque específicos del proveedor. Cambiar el modelo de incrustación cambia la dimensión del vector, por lo que llm.embed_dim debe actualizarse y ejecutarse `make reset`. Un archivo .env guarda secretos y anulaciones de tiempo de ejecución como BORING_VECTOR, anulaciones de LLM, límites de destilación, conteos de afirmaciones de recall y medición de relevancia, configuración de sumidero/cola de eventos, ventanas de preparación y un token de propietario para llamadas de escritura. Las herramientas operativas incluyen `make verify-llm` (proveedor, IDs de modelo, dimensión de incrustación), `make doctor` (stack, hooks, worker/cola de Codex, última ingesta), `make readiness` (puerta estricta previa al briefing), `make peek` (página local de solo lectura que muestra qué notas inyectó el recall y hasta dónde llegó el recuperador) y `make usage` (uso de tokens y modelos derivado de transcripciones locales). Una puerta de datos PII/sensibles en vault/rules/pii.yaml admite acciones de bloqueo, redacción y marcado con marcadores de exención por línea. Las integraciones opcionales incluyen un asistente de Slack y workers cron de Hermes para briefings matutinos. Los requisitos son Docker, Python 3, jq, curl, git, make y un servidor LLM local. Un clon nuevo comienza con un vault vacío, por lo que el recall del primer día no encuentra nada hasta que se rellena el historial. El proyecto tiene licencia MIT y documenta guías de emparejamiento de modelos locales según RAM de la máquina, comandos de benchmark y comportamiento medido de destilación/incrustación.