/sibyl-save - Sincronización de Memoria de Sesión + Extracción de Habilidades (Sibyl Memory Plugin)
Parte de la colección abierta de habilidades de Sibyl Labs. Licencia MIT. Creado por Sibyl Labs, LLC.
Una habilidad complementaria para el Sibyl Memory Plugin. Captura todo lo que ocurrió en esta sesión y lo inyecta en la base de datos de memoria local del plugin (~/.sibyl-memory/memory.db) a través de su propia interfaz, luego extrae patrones reutilizables en nuevas habilidades.
No escribe archivos de memoria sin procesar. Toda la memoria pasa por el plugin, por lo que se respetan la clasificación por niveles, la indexación de texto completo y el límite del nivel gratuito. Debido a que el plugin expone las mismas herramientas MCP en todos los harness que soporta (Claude Code, Codex y cualquier host MCP; Hermes a través del SDK de Python), esta única habilidad es multiharness por construcción.
Requisitos
El Sibyl Memory Plugin, instalado y conectado:
pip install sibyl-memory-cli
sibyl init # activación de navegador/billetera, escribe ~/.sibyl-memory/
sibyl setup claude-code # o: codex | hermes (conecta la interfaz de memoria a su harness)
Esta habilidad se comunica con el plugin a través de una de dos superficies:
- MCP (Claude Code, Codex, Cursor, cualquier host MCP): las 8 herramientas
memory_*a continuación. - SDK de Python (Hermes o cualquier agente Python):
sibyl_memory_client.MemoryClient/sibyl_memory_hermes.SibylMemoryProvider.
La interfaz del plugin
| Propósito | Herramienta MCP | SDK de Python |
|---|---|---|
| Guardar un hecho/entidad | memory_remember(category, name, body) | client.set_entity(category, name, body) |
| Recuperar una entidad | memory_recall(category, name) | client.get_entity(category, name) |
| Listar entidades | memory_list(category, limit) | client.list_entities(category) |
| Búsqueda de texto completo | memory_search(query, limit, tiers) | client.search(query) |
| Establecer un documento de estado | memory_set_state(key, body) | client.set_state(key, body) |
| Obtener un documento de estado | memory_get_state(key) | client.get_state(key) |
| Registrar un evento de diario | memory_record_event(kind, body, category, name) | client.write_event(...) |
| Archivar/olvidar | memory_forget(category, name, reason) | client.archive_entity(category, name, reason) |
Los ejemplos a continuación usan los nombres MCP. En Hermes o un agente Python, use la columna del SDK.
Mapeo de niveles
| Contenido de la sesión | Nivel | Llamada |
|---|---|---|
| Puntero/resumen/elementos futuros de la sesión | HOT (estado) | memory_set_state("session", ...) |
| Prioridades ordenadas | HOT (estado) | memory_set_state("priorities", ...) |
| Entrada de registro de sesión | COLD (diario) | memory_record_event("session_save", ...) |
| Proyectos/personas/productos | WARM (entidades) | memory_remember(category, name, body) |
| Elementos cerrados/muertos | ARCHIVE | memory_forget(category, name, reason) |
| Configuración de esta habilidad + marcador delta | HOT (estado) | memory_set_state("sibyl_save:config" / "sibyl_save:last_save", ...) |
Modos
- run (predeterminado):
/sibyl-save,save session,sync memory. Inyecta el contexto de la sesión en el plugin, luego ofrece extracción de habilidades. - setup:
/sibyl-save setup,/sibyl-save config. Interactivo. Construye o edita la configuración (almacenada en el plugin en la clave de estadosibyl_save:config). Ejecute una vez antes del primer uso. - preview (simulación):
/sibyl-save preview,/sibyl-save --dry-run. Ejecuta el análisis completo e informa cada escritura planificada. No llama a nada que mute la base de datos. No avanza el marcador delta.
Modo: setup (configuración dinámica)
Objetivo: escribir la configuración en el plugin en la clave de estado sibyl_save:config. Sea interactivo y mínimo. Infiera lo que pueda; pregunte solo lo que no pueda.
- Harness. Detecte o pregunte qué harness es (claude-code, codex, cursor, hermes, otro). Esto determina dónde escribe la Fase 2 los archivos de habilidades.
- Salida de habilidades. Dónde se escriben las nuevas habilidades para este harness. Valor predeterminado para Claude Code:
.claude/skills/<name>/SKILL.md. Para otros harness, confirme la ubicación y el formato de la habilidad. Almacene comoskill_output: {dir, format}. - Prioridades. Clave de estado para la lista ordenada (predeterminado
priorities) y un límite. Límite predeterminado 15. Techo máximo 30: nunca acepte un valor superior a 30. Una lista de más de 30 es un backlog, no un conjunto de prioridades. - Categorías de entidades. Qué categorías WARM rastrea (predeterminado
project,person,product). El usuario agrega o elimina. - Captura adicional. Opcionalmente, nombre claves de estado adicionales o categorías de entidades que el guardado debe poblar en cada ejecución (un documento de estado de métricas, una categoría de contactos). Este es el punto de extensión.
- Modo simulación predeterminado. Alterne
dry_run_default(predeterminado falso). - Escriba la configuración mediante
memory_set_state("sibyl_save:config", {...}). No toque el marcador delta.
Forma de la configuración: ver examples/sibyl-save-config.example.json. Volver a ejecutar el setup lo edita en el lugar.
Modo: run
Fase 1: Sincronización de Memoria (en la base de datos del plugin)
Paso 0 - Cargar configuración + delta
memory_get_state("sibyl_save:config"). Si está ausente, cambie a setup. memory_get_state("sibyl_save:last_save") para el ancla delta (qué cambió desde el último guardado). Si dry_run_default es verdadero y no se proporcionó ningún modo, ejecute como preview.
Paso 1 - Leer el estado actual
memory_get_state("session")ymemory_get_state(<clave de prioridades>)memory_list(category, limit)para las categorías rastreadas, ymemory_recall/memory_searchpara las entidades tocadas en esta sesión- cualquier clave de estado o categoría adicional nombrada en la configuración
Paso 1.5 - Verificación y conciliación de prioridades
Lea el documento de estado de prioridades y concilie en el lugar (reescriba con memory_set_state). Condiciones y la acción que cada una requiere:
- Elemento COMPLETADO aún listado: elimínelo; registre el cierre mediante
memory_record_event("priority_closed", {...}). - RANK_DRIFT / DUP_RANK (rangos no contiguos 1..N, o un rango se repite): renumere a 1..N.
- OVER_CAP (más elementos que el límite): mueva los elementos de menor prioridad a un documento de estado de backlog hasta estar en o por debajo del límite.
- STALE_ITEM (>14 días sin tocar): muéstrelo al usuario.
- TERMINAL entity (la entidad referenciada está archivada/muerta): cierre la prioridad.
- BROKEN entity ref (apunta a una entidad inexistente): corríjala a una
category/namereal.
Aplique el límite en cada escritura (nunca exceda 30).
Paso 2 - Analizar la sesión
Revise la conversación desde el ancla delta (o desde el inicio de la sesión en el primer guardado). Extraiga:
- Entidades tocadas - proyectos, personas, productos creados, leídos o modificados
- Acciones realizadas - cosas concretas que sucedieron, con identificadores
- Decisiones tomadas - opciones estratégicas y su fundamento
- Elementos futuros - acciones para la próxima sesión, comenzando con verbo ("desplegar...", "dar seguimiento a...", "verificar...")
- Advertencias - riesgos activos, bloqueos, plazos, cuasi accidentes
- Lecciones aprendidas - mejoras operativas (alimentan la Fase 2)
- Capturas adicionales - datos para cualquier clave de estado/categoría adicional en la configuración
Paso 3 - Inyectar en la base de datos del plugin
En modo preview, no llame a nada que mute. Informe las escrituras planificadas (Paso 4) y deténgase.
- Estado de la sesión -
memory_set_state("session", { last_session, summary, forward, entities_touched, warnings }). Los elementos futuros son solo referencias de acción, nunca instantáneas de saldo ni nada que se vuelva obsoleto. - Evento de diario -
memory_record_event("session_save", { evaluated, acted, forward, extra }). Un evento por guardado (solo anexar por diseño). - Prioridades -
memory_set_state(<clave de prioridades>, { updated, cap, items }), limitado. Desbordamiento a un documento de estado de backlog. - Entidades - para cada entidad cambiada,
memory_remember(category, name, body). Las nuevas entidades son solo nuevas llamadasmemory_remember; el plugin las indexa, por lo que no hay un registro separado que mantener. - Cerradas/muertas -
memory_forget(category, name, reason). - Capturas adicionales - aplique cada clave de estado/categoría adicional configurada.
- Marcador delta -
memory_set_state("sibyl_save:last_save", { ts: <ahora> }). Omitir en preview.
Paso 4 - Informe
Resumen conciso: entidades escritas, documentos de estado actualizados, id del evento de diario, prioridades agregadas/cerradas, capturas adicionales y elementos futuros para la próxima sesión. En modo preview, etiquete cada línea con "haría" y confirme que no se escribió nada.
Fase 2: Extracción de Habilidades (nativas del harness)
Las habilidades se presentan de la misma manera independientemente del harness: identificar, proponer, luego crear como un archivo de habilidad nativa para el harness actual.
Paso 5 - Identificar patrones reutilizables
Escanee la sesión en busca de operaciones que cumplan AL MENOS UNA de estas: repetida (más de una vez en esta sesión), recurrente (probablemente de nuevo), multipaso (3+ pasos secuenciales), no obvia (un workaround que vale la pena conservar), propensa a errores (necesita una lista de verificación). Para cada candidato evalúe nombre (frase de verbo imperativo corta), activador, parámetros, complejidad (cualquier paso peligroso), frecuencia.
Paso 6 - Proponer candidatos
Presente cada uno como una línea con nombre, descripción y frecuencia estimada. Luego pregunte: "¿Crear estas? ¿O saltar alguna?"
Paso 7 - Crear habilidades aprobadas (nativas del harness)
Lea skill_output de la configuración para saber dónde y en qué formato espera este harness las habilidades. Valores predeterminados:
| Harness | Ubicación de la habilidad | Formato |
|---|---|---|
| claude-code | .claude/skills/<name>/SKILL.md | Frontmatter YAML (nombre, descripción) + cuerpo Markdown |
| codex | ~/.codex/prompts/<name>.md (confirmar en setup) | Prompt Markdown |
| cursor | .cursor/ comando/regla (confirmar en setup) | según convención de Cursor |
| otro | de skill_output.dir | de skill_output.format |
Para cada habilidad aprobada, escriba el archivo en la ubicación configurada con frases activadoras, instrucciones paso a paso, descripciones de parámetros, verificaciones de seguridad para cualquier paso peligroso y un ejemplo de invocación. Informe la ruta.
NO cree habilidades que: dupliquen una habilidad existente (verifique primero la ubicación de la habilidad), sean demasiado específicas de la sesión para repetirse, envuelvan un solo comando trivial, o requieran editar archivos que sus reglas operativas protejan (muéstrelos, no se autoedite).
Reglas (no negociables)
- Nunca almacene datos vivos (saldos, precios, cuentas) como hechos duraderos. Capture referencias, no instantáneas.
- Los elementos futuros de la sesión están orientados a la acción y comienzan con verbo.
- Un evento de diario por guardado (solo anexar; nunca reescriba el historial).
- Las prioridades tienen un límite (predeterminado 15, nunca superior a 30). Desbordamiento a un documento de estado de backlog.
- Las entidades se abordan por
category+name; deje que el plugin sea el índice. Sin registro paralelo. - Todas las escrituras de memoria pasan por la interfaz del plugin. Nunca escriba archivos
~/.sibyl-memory/ni abramemory.dbdirectamente: el cliente maneja el bloqueo y el límite del nivel gratuito. - Trate las habilidades existentes como solo lectura. Cree nuevas en lugar de editar en el lugar a menos que se le solicite explícitamente.
Licencia y procedencia
MIT (ver LICENSE). El comentario de marca de agua en la parte superior de cada archivo Markdown es atribución y procedencia, no una restricción de uso. Verifique una copia con node scripts/watermark.mjs verify. Detalles en WATERMARK.md.