À propos du projet

ohmyboring est un système de mémoire personnelle auto-hébergé pour les agents de codage. Il capture la façon dont vous avez résolu les choses dans Claude Code, Kimi Code et les sessions Codex éligibles, distille chaque session en une note markdown organisée stockée dans un coffre local, et ramène ces notes lorsque vous demandez « comment ai-je fait cela la dernière fois ? ». Tout s'exécute localement : l'embedding et la synthèse passent par un serveur LLM local (Ollama, LM Studio, ou un autre point de terminaison compatible OpenAI), sans API externes ni jetons. Comment la mémoire s'accumule : - Automatiquement en fin de session : un hook SessionEnd distille la transcription et la stocke ; un hook UserPromptSubmit associé injecte jusqu'à trois extraits pertinents du passé dans les nouveaux prompts, chacun portant des affirmations établies. - Worker Codex : comme Codex n'a pas de hook SessionEnd, un worker hôte analyse ~/.codex/sessions toutes les 20 minutes et ingère les transcriptions éligibles. - Backfill : `make collect` amorce un coffre autrement vide à partir de l'historique passé de Claude Code (du plus récent au plus ancien, idempotent, N par exécution) ; `make collect-kimi` fait de même pour Kimi Code. - En cours de session : `make distill-now` re-distille la transcription actuelle, et `make remember M="..."` enregistre une note explicite. La mémoire est markdown-first : des notes simples, lisibles par l'humain, comparables avec git, dans vault/wiki, qui peuvent être ouvertes directement comme coffre Obsidian pour la vue graphe, les backlinks, les tags et la recherche plein texte. Un accélérateur pgvector optionnel (BORING_VECTOR=on) ajoute la recherche par similarité et GraphRAG lorsque l'échelle l'exige. L'architecture sépare une porte de lecture rapide sans LLM (`make ask`, recall.py, MCP recall) d'une porte d'écriture contrôlée (distill-session.py appelle le LLM local et écrit via un outil MCP remember déterministe). Un filtre de doublons ignore les notes en double mais laisse une note plus riche réécrire le même fichier wiki. Un contrat de graphe de workflow typé côté Rust dans drudge/src/workflow.rs définit le vocabulaire des nœuds/arêtes pour la découverte de session, la distillation, la vérification, la réparation, remember, la mise à jour des marqueurs, la journalisation d'événements et la projection de disponibilité, tandis que les hooks et workers Python effectuent toujours les E/S de l'hôte. La configuration réside dans boring.json (à partir de boring.example.json) : langue des notes, fournisseur LLM/base_url/modèle/modèle d'embedding et dimension, règles d'origine du dépôt, et adaptateurs de transcription d'agent. Changer de backend se fait en un bloc de configuration ; `make up` dispatche vers des scripts d'amorçage spécifiques au fournisseur. Changer le modèle d'embedding change la dimension vectorielle, donc llm.embed_dim doit être mis à jour et `make reset` exécuté. Un fichier .env contient les secrets et les surcharges d'exécution telles que BORING_VECTOR, les surcharges LLM, les limites de distillation, les comptes d'affirmations de rappel et la mesure de pertinence, les paramètres de sink/spool d'événements, les fenêtres de disponibilité, et un jeton de propriétaire pour les appels d'écriture. L'outillage opérationnel comprend `make verify-llm` (fournisseur, identifiants de modèle, dimension d'embedding), `make doctor` (pile, hooks, worker/file d'attente Codex, dernier ingest), `make readiness` (porte stricte de pré-briefing), `make peek` (page locale en lecture seule montrant quelles notes le rappel a injectées et jusqu'où le récupérateur est allé), et `make usage` (utilisation de jetons et de modèles agrégée à partir des transcriptions locales). Un filtre PII/données sensibles dans vault/rules/pii.yaml prend en charge les actions block, redact et flag avec des marqueurs d'exemption par ligne. Les intégrations optionnelles incluent un assistant Slack et des workers cron Hermes pour les briefs matinaux. Les prérequis sont Docker, Python 3, jq, curl, git, make, et un serveur LLM local. Un clone frais démarre avec un coffre vide, donc le rappel du premier jour ne trouve rien tant que l'historique n'est pas rempli. Le projet est sous licence MIT et documente les conseils d'appariement de modèles locaux selon la RAM de la machine, les commandes de benchmark, et le comportement mesuré de distillation/embedding.