amem

Memoria local del agente sin Docker: amem + MCP (los hechos permanecen en ~/.amem)

Documentación

amem

Memoria personal del agente que permanece en tu máquina.

Los agentes de codificación olvidan entre sesiones. Vuelven a buscar en el mismo árbol, vuelven a aprender las mismas restricciones y queman tokens redescubriendo decisiones que ya pagaste una vez.

amem les da a Cursor, Claude Code y otros hosts locales una memoria privada y buscable de hechos duraderos sobre tus repositorios — qué es dueño de qué, qué archivos importan, qué se rompió la última vez — para que la próxima sesión comience orientada en lugar de en frío.

amem context "sync auth startup"
# Agent Memory Context

## Best Claims
### claim.sync_auth_mode_startup
Kind: `constraint`
Why: `keyword+8`, `fts+18.0`, `embed+6.3`, `kind:constraint`, `fresh`

The sync service checks auth mode during startup before enabling Drive sync.
Anchors: `src/background/sync-service.ts`

Nada se sube. Nada se escribe en el historial de git de tu producto. La memoria vive bajo ~/.amem/ solo en tu laptop.


Por qué existe amem

Sin amemCon amem
El agente explora ampliamente cada sesiónEl agente consulta la memoria primero, luego verifica los archivos correctos
Las decisiones viven en el scrollback del chatLas decisiones se convierten en afirmaciones estructuradas con anclas de archivo
Presión de compartir en equipo sobre documentos de "contexto de IA"Explícitamente personal — tus prompts y aprendizajes permanecen locales
AGENTS.md plano que se vuelve obsoletoGrafo pequeño: componentes → flujos → afirmaciones, actualizado mediante propuestas

amem no es un wikiware compartido de empresa y no es un producto RAG en la nube. Es una herramienta local para desarrolladores individuales que quieren agentes que recuerden su trabajo.


Privacidad (no negociable)

PiezaUbicación¿Compartida?
La herramienta amem (este repo)GitHub / npmSí — instalable
Tu base de datos de memoria~/.amem/graph.db (o .enc cuando está bloqueada)No
Regla de proyecto de Cursor.cursor/rules/amem.mdc en el repo del productoSeguro de commitear — solo orientación, sin contenidos de memoria
Exportaciones / copias de seguridad que creesDonde las escribasMantén privadas — no las commitees

Garantías:

  • ~/.amem se crea con modo 0700
  • La UI local se vincula solo a 127.0.0.1
  • La memoria nunca sale de la máquina — sin sincronización gestionada, sin modo "compartir con la organización"
  • Solo ping anónimo de instalación opcional (ver Telemetría); puedes optar por no participar en cualquier momento
  • Se instruye a los agentes a almacenar hechos del repo, no estrategia de prompting propietaria
  • Bloqueo AES-256-GCM opcional y copias de seguridad locales cifradas — aún sin nube

Requisitos

  • Node.js 20+ (better-sqlite3 nativo)
  • git (la identidad del repo usa URL remota / ruta raíz)

Instala la herramienta

npx @iamem/amem setup   # Node 20+ — installs the `amem` CLI
# or
npm i -g @iamem/amem && amem setup

Desde un clon mientras desarrollas:

git clone https://github.com/sslugic/amem.git
cd amem
npm install
npm link
amem setup

Ver docs/npm-release.md. CI ejecuta npm test y npm run pack:check. better-sqlite3 usa sus propios prebuilds — sin paso nativo extra en macOS/Linux comunes + Node 20/22.

Si npm install falla al compilar código nativo, instala Xcode CLT (macOS) o build-essential (Linux) y reintenta, o usa un binario oficial de Node 20/22 que coincida con la matriz de prebuilds.

Telemetría

En npm install / npx (fuera de CI y pruebas), amem puede enviar un único POST anónimo a https://getamem.com/api/beacon/npm-install con:

  • nombre y versión del paquete
  • versión de Node.js
  • plataforma del SO y arquitectura de CPU

No se incluyen código, rutas, nombres de usuario, correos electrónicos, IPs ni contenidos de memoria. Opta por no participar:

AMEM_TELEMETRY_DISABLED=1 npm i -g @iamem/amem

La memoria bajo ~/.amem sigue sin salir nunca de tu máquina.

Rutas rápidas

# Cursor or Claude Code in a git repo
amem init --platform cursor    # or: claude

# Other hosts (thin installers, same local DB)
amem init --platform windsurf|continue|aider|zed|claude-desktop

# Any other MCP client — binds the repo and prints the endpoint to paste
amem init --platform codex|copilot|gemini|cline|roo|jetbrains|opencode|goose|…
amem platforms                  # every id amem accepts (aliases included)

# Cross-repo “how I work” prefs (blended into project context)
amem init --personal
# or: amem setup --personal

Cifrado en reposo + copias de seguridad locales

amem lock --passphrase '…'       # or AMEM_PASSPHRASE
amem unlock --passphrase '…'
amem backup --passphrase '…'     # ~/.amem/backups by default
amem backup schedule             # daily local timer (no cloud)
amem backup unschedule

Mientras esté bloqueado, establece AMEM_PASSPHRASE (o desbloquea) antes de cualquier comando que abra la base de datos.

Embeddings y el resto del kit de herramientas

Todo es gratis. No hay niveles ni nada retenido — embeddings locales, higiene de memoria y su horario, sincronización de reglas y el paquete de atestación están todos incluidos.

amem embed use ngram                     # local n-gram model, or `external` for your own command
amem embed reindex
amem restore --file ~/.amem/backups/amem-….db.enc
amem hygiene
amem rules sync
amem it-pack --out ~/.amem/it-pack
amem doctor --attest

El embedder se envía como modelo de hash por defecto (sin descarga); ngram y external (texto stdin → vector JSON) también son locales. Aún sin API de embed en la nube, y nada se sube.

El checkout + entrega por correo es un proceso de vendedor separado (npm run shop) que no se publica con el CLI. Puede incluir en la lista blanca nombres de Mailtrap y Stripe desde el .env de otro proyecto — ver shop/README.md.


Enseñar a cada cliente cómo usar amem

Conectar un host al endpoint MCP le dice a amem que existe; no le dice que revise el tablero de tareas o consulte la memoria antes de explorar. amem init y amem setup ahora escriben instrucciones en el archivo que el host realmente lee, y un comando cubre todo lo demás:

amem instructions                 # the client(s) bound to this repo
amem instructions --all           # every supported client
amem instructions --check         # CI-friendly: exits 1 if missing or stale
amem instructions --platform roo  # just one

Un texto canónico (src/instructions.ts) se renderiza por host, para que la orientación no se desvíe entre clientes:

ArchivoClientes
.cursor/rules/amem.mdcCursor
CLAUDE.mdClaude Code
AGENTS.mdCodex, Grok, OpenCode, Crush, Amp, Qwen, Droid, OpenHands, Warp, Zed, Cody, Antigravity, Neovim, Claude Desktop, Devin, Jules
GEMINI.mdGemini CLI
.github/copilot-instructions.mdGitHub Copilot
.windsurf/rules/amem.md · .continue/rules/amem.md · .clinerules/amem.md · .roo/rules/amem.md · .kilocode/rules/amem.md · .augment/rules/amem.md · .kiro/steering/amem.md · .trae/rules/amem.md · .amazonq/rules/amem.mdWindsurf, Continue, Cline, Roo, Kilo, Augment, Kiro, Trae, Amazon Q
.junie/guidelines.md · .goosehints · .aider.amem.mdJunie, Goose, Aider

Los hosts que comparten un archivo se escriben una vez, así que --all produce 17 archivos, no 30. Los archivos compartidos (CLAUDE.md, AGENTS.md, .github/copilot-instructions.md) reciben un bloque marcado que se reemplaza en su lugar — cualquier cosa que escribas alrededor sobrevive:

# My Project
Use pnpm, not npm.

<!-- BEGIN amem (generated) -->
…
<!-- END amem -->

Aider no tiene MCP, así que recibe comandos CLI en lugar de nombres de herramientas. Cada archivo es solo orientación — sin contenidos de memoria — y seguro de commitear. amem doctor lo dice cuando las instrucciones de un cliente vinculado faltan o están desactualizadas.


Memoria que se cura sola

La memoria se pudre si nada la retira. amem limpia en un horario en lugar de esperar a que se lo pidan:

amem hygiene schedule          # daily; amem doctor warns when it is not installed

Cada ejecución toma una copia de seguridad de seguridad, luego, por repo:

SeñalQué significaAcción
No-hechoRelleno de chat almacenado como afirmaciónEliminado (retenido si supera el 25% del repo — un heurístico que coincide con la mayor parte de un corpus es un heurístico roto)
Ancla podridaCada archivo al que apunta la afirmación ha desaparecidoDecaído. Las anclas de tipo etiqueta y los espacios de trabajo sin fuente están exentos
Poco útilAtestiguado 3+ veces y nunca respondió la preguntaDecaído
Sin usoNo devuelto y no tocado dentro de la ventanaDecaído
Casi duplicadoMismo contenido, anclas superpuestasFusionado

Una afirmación solo se retira con evidencia positiva. La falta de atestación nunca cuenta en su contra — de lo contrario, enviar esto decaería todo a la vez. Las afirmaciones fijadas nunca decaen.

Ahorros que puedes verificar

amem context registra lo que entregó; el agente (o el hook de detención, desde la transcripción del host) registra lo que aún tuvo que abrir. El ahorro se calcula entonces a partir del tamaño real de los archivos que se evitaron:

saved = Σ(measured tokens of anchors returned but not opened) − packet_tokens

Nada le pide a un modelo que estime su propio valor, y un paquete que no evitó nada reporta una pérdida. El panel dice modelled hasta que se hayan atestiguado 30 eventos, luego cambia a measured y corrige el total por la proporción observada.

amem usage attest --opened "src/db.ts"   # or let the stop hook do it
amem usage recompute --scope all --apply # re-measure historical events

Configuración inicial (recomendada)

amem ui

Eso abre http://127.0.0.1:7843 en la pestaña Configuración. Escanea tu carpeta de inicio en busca de repos git (omite Library, node_modules, Downloads y ruido similar). Marca los que quieras, elige clientes (Cursor, Claude Code, Windsurf, Continue, Aider, Zed, …), luego Comenzar a rastrear los seleccionados. Cada selección se vincula en ~/.amem y recibe el instalador correspondiente cuando esté disponible.

¿Prefieres una ventana de escritorio en lugar de una pestaña del navegador (mismo servidor localhost, misma privacidad)?

# once per machine/checkout (downloads Electron — not included in npm i -g)
npm run app:setup

amem app

amem ui sigue abriendo el navegador; amem app abre Electron. Ambos hablan solo con 127.0.0.1. Si el servidor de UI ya está en ejecución, amem app se adjunta a él. Instalaciones globales: ejecuta npm run app:setup desde el directorio del paquete (o clon), luego amem app.

El encabezado tiene un interruptor Personal (preferencias entre repos) y un marco Bloquear / respaldar — estado de bloqueo, último respaldo y un horario local diario. La memoria muestra los mismos chips de bloqueo/respaldo. La pestaña Configuración incluye un contrato de recordar copiable para cualquier host MCP (amem recipe).

Opcional: marca Iniciar amem ui cuando esta computadora inicie sesión para que el servidor localhost regrese después de un reinicio:

amem service install    # macOS LaunchAgent, Linux systemd --user, or Windows Startup
amem service status
amem service uninstall

Pestañas después de la configuración:

  1. Configuración — escanear/seleccionar repos, plataformas, auto-inicio de inicio de sesión, propuesta de arranque
  2. Memoria — hechos por archivo, borradores puntuados (aprobar / reemplazar más antiguos / descartar / rechazar ruidosos), editar/fijar/eliminar, buscar, aciertos/fallos recientes
  3. Tareas — Kanban por proyecto para trabajo diferido del agente (Pendiente → Siguiente → Haciendo → Bloqueado → Hecho). MCP: amem_task_add / amem_task_update / amem_task_complete. Las tareas abiertas aparecen en amem_context. Usa Memoria para hechos duraderos; Tareas para "hacer después".
  4. Estadísticas — tokens estimados ahorrados por LLM, más exportación JSON / markdown / PDF (proxies, no una factura)

Solo servidor (sin navegador abierto):

amem ui --port 7843 --no-open

Para escanear carpetas adicionales (o solo un subconjunto), establece AMEM_SCAN_ROOTS a una lista de directorios separada por dos puntos.

Alternativa CLI (sin UI)

cd ~/path/to/your-real-project
amem init --platform cursor    # or: --platform claude
amem doctor
amem status

Para conectar ambos agentes a la misma memoria local, ejecuta init una vez por plataforma (o selecciona ambos en la UI).


Bucle del día a día

1. Consulta antes de explorar

amem context "billing webhook retry"

O deja que el agente lo haga — Cursor obtiene una regla de proyecto siempre activa; Claude obtiene orientación de hooks. Ambos instalan las habilidades:

  • amem-bootstrap — sembrar memoria de línea base
  • amem-update-working-memory — guardar aprendizajes duraderos después de una sesión

Los hooks también inyectan contexto al inicio de la sesión / envío de prompt, almacenan notas de conversación, ponen en cola borradores de fin de sesión y pueden poner en cola borradores fallo→aprendizaje después de búsquedas de contexto vacías cuando el agente luego cita archivos reales. Aprueba borradores en Memoria (o permite tipos de bajo riesgo mediante la política auto_apply_kinds).

2. Trabaja como de costumbre

Trata la memoria como un mapa, no como fuente de verdad. Lee los archivos anclados antes de cambiarlos. Prefiere afirmaciones marcadas como frescas; verifica las obsoletas (archivos anclados cambiados después de la afirmación).

3. Guarda lo que debería sobrevivir

Pídele al agente que ejecute amem-update-working-memory, aprueba borradores de Memoria o aplica una propuesta tú mismo:

amem propose validate /tmp/memory.json
amem propose diff /tmp/memory.json
amem propose apply /tmp/memory.json

4. Instalación opcional de una sola vez del agente

Desde dentro del repo del producto, pega docs/agent-install-prompt.md en Cursor o Claude Code y deja que ejecute la configuración por ti.


Qué se almacena

La memoria es un pequeño grafo local en SQLite:

ObjetoSignificado
ComponenteUn subsistema / módulo (component.api)
FlujoCómo se mueve el trabajo (flow.checkout)
AfirmaciónUn hecho duradero con anclas de archivo (puede ser active o superseded; pin opcional)
BordeEnlaces (afirmación → flujo → componente); kind: "supersedes" archiva la afirmación objetivo
BorradorPropuestas pendientes de sesión / fallo→aprendizaje esperando aprobación de Memoria
TareaTrabajo diferido en el Kanban del proyecto (Pendiente / Siguiente / Haciendo / Bloqueado / Hecho) — no es un hecho duradero
HabilidadUn procedimiento reutilizable de varios pasos, almacenado como archivo SKILL.md (ver abajo)
Evento de usoCada acierto de amem context + estimación de tokens

Las afirmaciones son la unidad de recuperación. La clasificación combina:

  • SQLite FTS5 (stemming de Porter) + puntuación de palabras clave
  • Embeddings de hash en el dispositivo (sin descarga de modelo)
  • Impulso de pin, pesos de tipo (constraint / gotcha > session), frescura
  • Afirmaciones de preferencias personales opcionales mezcladas en el contexto del proyecto

Cada afirmación inyectada incluye una línea Por qué:. Las afirmaciones obsoletas (anclas cambiadas después de updated_at) se clasifican más abajo.

Ejemplo de afirmación:

{
  "id": "claim.webhook_idempotency",
  "kind": "constraint",
  "text": "Stripe webhooks must be idempotent on event.id before mutating invoices.",
  "code_anchors": ["src/webhooks/stripe.ts"],
  "supersedes": ["claim.webhook_old_rule"]
}

supersedes (o un borde con kind: "supersedes") marca ids de afirmaciones más antiguas como archivados para que salgan de la recuperación.


Habilidades (memoria procedimental)

Claims responden qué es verdad. Skills responden cómo hacemos esto aquí — una secuencia de despliegue, un baile de migración, un camino de depuración que alguien ya recorrió. Son demasiado largos para estar en cada prompt, así que se cargan bajo demanda.

Los skills viven como archivos SKILL.md bajo ~/.amem/skills/, indexados en SQLite para clasificación:

~/.amem/skills/deploy-staging/SKILL.md
~/.amem/skills/deploy-staging/references/runbook.md

Divulgación progresiva. Un paquete de contexto lleva solo nombres y descripciones. El agente llama a amem_skill_view para extraer un cuerpo una vez que decide que el procedimiento aplica, por lo que una biblioteca de skills no utilizada cuesta casi cero tokens.

El bucle de aprendizaje. amem no incluye ningún modelo, por lo que nunca escribe un skill por sí mismo. Al final de la sesión, busca la forma de un procedimiento difícil de conseguir — pasos enumerados o comandos reales, más un error del que se recuperó o una corrección que diste. Cuando varias señales coinciden, pone en cola una sugerencia, que llega a tu agente como un empujón en el siguiente paquete de contexto. El agente escribe el skill; tú lo apruebas. Si un skill se cargó durante una sesión que aún así salió mal, amem pone en cola una revisión en lugar de un duplicado.

El listón es deliberadamente alto, y una sesión puede poner en cola como máximo una sugerencia.

amem skills list                # index of what is stored
amem skills show deploy-staging # full body
amem skills new deploy-staging --desc "Deploy staging and verify health"
amem skills import ./some-skill # bring in an agentskills.io skill
amem skills drafts              # pending suggestions and staged writes
amem skills approve <draft-id>

Los skills también son una pestaña de Skills en amem ui.

Seguridad. Los skills son instrucciones que un agente seguirá, por lo que el contenido se escanea en busca de credenciales y patrones de inyección de prompts antes de cualquier escritura. Tres claves de política los controlan:

ClavePredeterminadoEfecto
skills_enabledtrueInterruptor maestro para almacenamiento, clasificación e inyección
skill_write_approvalfalseEscenifica las escrituras del agente para revisión en lugar de escribir en disco
skill_capturetruePermitir sugerencias de skills al final de la sesión

Un policy.toml ilegible fuerza skill_write_approval a activarse. amem doctor --attest informa cada skill instalado con un hash de contenido, para que puedas comparar lo que se les dice a los agentes que hagan.

Las copias de seguridad actualmente copian solo la base de datos — ~/.amem/skills/ aún no está incluido. Mantén los skills que te importan en control de versiones hasta que eso llegue.


Ahorro de tokens (estimaciones)

Cada amem context registra un evento de uso. La pestaña Stats de la interfaz desglosa esto por plataforma (cursor, claude, …).

Estimación automática:

estimated_avoided = max(0, anchors×4000 + claims×200 − packet_tokens)

Esto es un proxy de exploración evitada — no tu factura de Cursor/Anthropic. El dinero usa el mismo proxy de tokens a $3 por 1M de tokens de entrada (entrada de clase Sonnet). El uso incluido de Cursor y los tokens de salida no se facturan de esta manera, así que trata $ como una estimación de orden de magnitud.

El tiempo ahorrado es un proxy separado: cada ancla de archivo devuelta se trata como ~1.2s de ida y vuelta de herramienta que el agente no tuvo que hacer. El tiempo de búsqueda local se mide (SQLite en localhost). La tasa de aciertos son coincidencias de palabras clave en amem context — no llamadas a la API de Cursor/modelo (esas aún ocurren). Un fallo significa que ningún hecho almacenado coincidió con la consulta; los hechos más nuevos aún pueden inyectarse como un respaldo débil, y el agente aún habla con el modelo.

Stats también muestra una proyección mensual: últimos 7 días de llamadas (o menos si acabas de empezar), escalados a 30 días. Sigue siendo un proxy, no una factura.

Si luego conoces un número mejor:

amem usage report --platform cursor --saved 12000
# or attach to a specific event:
amem usage report --event-id usage_… --saved 12000

Clientes LLM (más allá de repositorios git)

amem puede vincular un espacio de trabajo nombrado que no es un checkout de git — para Luna Client o cualquier herramienta que hable con Cursor/Claude/otros modelos.

amem init --workspace my-app
# seeds starter facts and runs a context check automatically

Adjunta cualquier cliente LLM tú mismo (HTTP o MCP). Mantén amem ui ejecutándose para HTTP. Desde el cliente, antes de cada llamada al modelo:

const res = await fetch("http://127.0.0.1:7843/api/context", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    workspace: "my-app",
    query: userMessage,
    platform: "app",
    sessionId,
  }),
});
const { markdown } = await res.json();
// prepend markdown to the prompt / tool result so the model skips a large retrieve

Después de un resultado duradero:

await fetch("http://127.0.0.1:7843/api/remember", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    workspace: "my-app",
    text: takeaway,
    kind: "session",
    anchors: ["my-app"],
  }),
});

Configuración MCP (cualquier host MCP):

Mantén amem ui ejecutándose (o amem service install para que se inicie al iniciar sesión). Las aplicaciones GUI a menudo no pueden encontrar amem en PATH, lo que aparece como "falló el descubrimiento de herramientas en vivo" / MCP error — no un mensaje de inicio de sesión. Prefiere HTTP:

{
  "mcpServers": {
    "amem": {
      "url": "http://127.0.0.1:7843/mcp?workspace=my-app"
    }
  }
}

Stdio también funciona si el host puede generar el binario. Imprime una configuración con rutas absolutas:

amem mcp --print-config --workspace my-app

Misma base de datos localhost que la memoria de repositorio git. El conmutador de la interfaz agrupa Repositorios Git y Espacios de trabajo. Renombra el nombre para mostrar de un espacio de trabajo en cualquier momento — el slug MCP (workspace=luna-ai) y los claims almacenados permanecen en el mismo id.

amem rename "Luna Client" --workspace luna-ai

Herramientas MCP (stdio o HTTP):

HerramientaCuándo usarla
amem_contextPaquete de memoria clasificado para la pregunta actual
amem_rememberAlmacenar un hecho duradero después de un resultado
amem_recipeContrato genérico de lectura-luego-escritura (cualquier host MCP)
amem_skill_listÍndice barato de procedimientos almacenados (solo nombres + descripciones)
amem_skill_viewCargar un cuerpo de skill, después de que el índice diga que aplica
amem_skill_saveAlmacenar un procedimiento de varios pasos que acabas de resolver
amem_reposQué se monitorea (repositorios git + espacios de trabajo nombrados)
amem_statsTiempo de búsqueda, tokens/ms estimados ahorrados, tasa de aciertos
amem_graphClaims / componentes / flujos almacenados para un espacio de trabajo o repositorio
amem_statusVinculación + conteos; omite el espacio de trabajo para una visión general de toda la máquina

Referencia de comandos

amem setup [--personal] [--platform <host>]
amem init --platform <client>      # amem platforms lists every id
amem platforms [--json]
amem init --workspace <name> [--path <dir>] [--platform …]
amem init --personal
amem rename "<display name>" --workspace <slug>
amem status [--workspace <name>]
amem doctor [--attest] [--json]
amem context "<query>" [--workspace <name>] [--platform …]
amem remember "<text>" [--workspace <name>] [--kind …] [--anchor <path>]
amem recipe [--json]
amem skills list|show <name>|new <name> [--desc <text>]|rm <name>|sync|import <path>
amem skills drafts|approve <draft-id>|dismiss <draft-id>
amem mcp [--print-config] [--workspace <name>]
amem propose validate|diff|apply <file.json>
amem export [--out <file.json>]
amem wipe --yes
amem wipe --all --yes
amem lock|unlock --passphrase <secret>
amem backup [--out <dir>] [--passphrase <secret>] [--label <name>]
amem backup schedule [--out <dir>] [--hour <0-23>]
amem backup unschedule
amem session touch --platform cursor|claude [--session-id <id>]
amem hook
amem usage report --saved <n> [--platform …] [--event-id …]
amem usage export [--format json|md|pdf] [--days 30] [--scope current|all] [--out <file>]
amem license status|apply|activate|clear|issue|keys
amem embed status|use hash|use ngram|reindex
amem ui [--port 7843] [--no-open]
amem app [--port 7843]
amem service install|uninstall|status
ComandoPropósito
setupEspacio de trabajo personal de una sola vez + instalación opcional del host
initVincular un repositorio git, espacio de trabajo nombrado, preferencias personales o host
renameCambiar el nombre para mostrar de un espacio de trabajo; el slug MCP y la memoria permanecen vinculados
contextRecuperar un paquete Markdown; registrar uso
rememberAlmacenar un hecho local
mcpHerramientas MCP stdio; MCP HTTP en http://127.0.0.1:7843/mcp mientras la interfaz se ejecuta
skillsGestionar memoria procedimental (list, show, new, import, drafts, approve)
propose diffPrevisualizar cambios de claim/componente/flujo antes de aplicar
propose applyInsertar o actualizar memoria estructurada localmente
lock / unlockCifrado opcional en reposo AES-256-GCM para graph.db
backupInstantánea local (opcionalmente cifrada); schedule para temporizador diario
uiAsistente de configuración + Memoria + Stats en el navegador (localhost)
appMisma interfaz en una ventana Electron (npm run app:setup una vez)
serviceElemento de inicio de sesión para que amem ui se inicie después del reinicio
doctor --attestAtestación de política/privacidad para tickets de TI
export / wipeCopia de seguridad personal o eliminación (aún local)
wipe --all --yesDesvinculación: borrar cada repositorio y eliminar ~/.amem

Qué coloca la instalación y dónde

Cursor

ArtefactoRuta
Skills~/.cursor/skills/amem-*
Regla de proyecto.cursor/rules/amem.mdc (en el repositorio del producto)
Hooks~/.cursor/hooks.json

Recarga Cursor si los skills/reglas no aparecen de inmediato.

Claude Code

ArtefactoRuta
Skills~/.claude/skills/amem-*
Hooks~/.claude/settings.json (UserPromptSubmit / Stop / relacionados → amem hook completo)

Otros hosts

HostQué escribe amem
WindsurfEntrada MCP ~/.codeium/windsurf/mcp_config.json
ContinueServidores MCP ~/.continue/config.json
AiderSugerencias CLI .aider.amem.md en el repositorio
ZedSugerencia settings.json context_servers / HTTP
Claude DesktopEntrada MCP stdio claude_desktop_config.json

Cada otro cliente en amem platforms — Codex, Copilot, Gemini CLI, Grok, Cline, Roo, Kilo, Cody, Augment, JetBrains, Kiro, Trae, Antigravity, Neovim, OpenCode, Goose, Crush, Amp, Qwen Code, Factory Droid, OpenHands, Amazon Q, Warp, Devin, Jules — no tiene instalador local: amem init --platform <id> vincula el repositorio e imprime el endpoint MCP para pegar (amem recipe para la configuración completa).

Los ids de cliente se pliegan por alias, por lo que claude-code, vscode, pycharm y chatgpt se resuelven a claude, copilot, jetbrains y codex en lugar de disparar policy.allowed_platforms.


Preguntas frecuentes de seguridad y arquitectura

¿Cómo previene amem el envenenamiento de herramientas y la inyección de prompts?

Las herramientas de memoria sin restricciones que registran ciegamente transcripciones de chat son vulnerables a almacenar residuos conversacionales, instrucciones adversarias o contexto envenenado. amem aplica múltiples puertas defensivas:

  1. Filtrado de sintaxis Hecho vs. Ruido (isFactLike): Las oraciones de transcripción, preguntas, cortesías de chat y fragmentos de prompts de usuario se rechazan automáticamente antes de convertirse en claims, incluso si mencionan rutas de archivo reales.
  2. Listas de denegación de secretos integradas y personalizadas (BUILTIN_DENY_CLAIM_PATTERNS): Las expresiones regulares integradas eliminan contraseñas, claves API, tokens y claves privadas. Los administradores pueden imponer patrones de denegación regex adicionales mediante política del sistema.
  3. Puntuación de calidad y especificidad (scoreProposal): Las propuestas se puntúan según la presencia de anclas, vocabulario duradero (constraint, gotcha, must) y especificidad. Las entradas delgadas o de baja puntuación por debajo del umbral de rechazo se descartan.
  4. Cola de ingesta escalonada por defecto (ProposalDraft): Las capturas en segundo plano y las deducciones al final de la sesión se escalonan como propuestas en SQLite para revisión humana en la interfaz. La aplicación automática está deshabilitada por defecto (auto_apply_kinds = []).
  5. Seguimiento de conflictos y superación: Cuando nuevos claims comparten anclas con hechos existentes, amem calcula similitud y plantea advertencias de conflicto, requiriendo superación explícita en lugar de permitir sobrescrituras silenciosas.

¿Cómo previene amem la hinchazón de contexto y la fuga de memoria entre proyectos?

  1. Partición por repositorio: Cada claim de memoria, tarea, componente y nota está claveado por repo_id (derivado de la URL remota git / ruta del espacio de trabajo). Las consultas en un proyecto no pueden recuperar ni filtrar memoria de otro repositorio.
  2. Recuperación híbrida y límites estrictos: En lugar de volcar el grafo, amem_context usa búsqueda híbrida de texto completo BM25, embeddings en el dispositivo, coincidencia de palabras clave y multiplicadores de frescura para clasificar y seleccionar solo los hechos relevantes principales (límite predeterminado: 12).
  3. Límites duros de caracteres: Las inyecciones automáticas de hooks están limitadas a 2,400 caracteres para prevenir la hinchazón de prompts y ataques de agotamiento de tokens.
  4. Divulgación progresiva para skills: Los paquetes de contexto inyectan solo un índice de Nivel 0 (nombres de skills y descripciones de una línea). Los cuerpos procedimentales completos nunca se inyectan a menos que el modelo los solicite explícitamente mediante amem_skill_view.

¿Cómo maneja amem los cambios de código sin servir memoria obsoleta?

Cada claim está fundamentado con anclas de archivo (code_anchors). Durante la generación de contexto, amem verifica la existencia de archivos y compara las marcas de tiempo de modificación de archivos con los tiempos de creación de claims:

  • Si los archivos anclados han cambiado, el claim se marca como obsoleto y se penaliza en la clasificación.
  • Los paquetes de contexto inyectan explícitamente una advertencia en el prompt del agente: "_X claim(s) marked stale — anchored files changed after the claim was written. Verify before trusting._"

¿Expone amem un servidor de red no autenticado o sube código?

  • Vinculación estricta a loopback: El daemon HTTP / MCP de la interfaz local se vincula exclusivamente a 127.0.0.1. Las vinculaciones que no sean loopback están bloqueadas por reglas de política codificadas.
  • Cero egress externo: La telemetría está codificada como desactivada (telemetry: false). Todas las bases de datos SQLite (graph.db), vectores y registros permanecen bajo ~/.amem con permisos de sistema de archivos local 0700.
  • Cifrado opcional en reposo: La base de datos local se puede cifrar usando AES-256-GCM (amem lock --passphrase '...').

Desarrolla amem tú mismo

cd amem
npm install
npm run build
npm run test          # unit + integration + CLI e2e (node:test)
npm run smoke         # end-to-end CLI/API smoke
npm run test:all      # both
npm link

Diseño:

src/           CLI, SQLite, policy, attest, installers, localhost API
ui-static/     Setup / Memory / Stats UI
skills/        Agent skill markdown
templates/     Cursor rule + example enterprise policy
docs/          Agent install prompt + IT endpoint runbook + backlog
test/          Comprehensive node:test suite
scripts/       Smoke tests + MDM offboard helper

Anula el hogar de memoria para pruebas:

AMEM_HOME=/tmp/amem-test amem status

Endpoint empresarial (gestionado por TI)

amem sigue siendo memoria personal en la computadora portátil — no una wiki compartida ni RAG en la nube.
TI / DevEx puede gobernar la flota: instalación aprobada, política, atestación, desvinculación.

ControlMechanism
Política/etc/amem/policy.toml (sistema) anula ~/.amem/policy.toml; o AMEM_POLICY_PATH
Atestaciónamem doctor --attest / --json (también GET /api/attest en la UI local)
Higiene de secretosPatrones de denegación integrados + política deny_claim_patterns al proponer
Bloqueo de exportaciónallow_export = false
Listas de permitidos de plataforma/repositorioallowed_platforms, allowed_remote_hosts
Borradores de auto-aplicaciónauto_apply_kinds (vacío = nunca; aún local)
Offboardingamem wipe --all --yes o scripts/mdm-offboard.sh

Garantías estrictas (no configurables):

  • Sin telemetría de memoria ni carga de reclamos — ~/.amem permanece local
  • Solo ping opcional y anónimo de instalación npm (exclusión: AMEM_TELEMETRY_DISABLED=1)
  • La UI se vincula solo a loopback (127.0.0.1)
  • La memoria permanece bajo ~/.amem (modo 0700)

Inicio rápido de TI

# 1) Pin / install amem on the endpoint (internal npm, pkg, or npm link)
# 2) Deploy policy (root-owned on managed machines)
sudo mkdir -p /etc/amem
sudo cp templates/policy.example.toml /etc/amem/policy.toml

# 3) Verify for security review
amem doctor --attest --json

# 4) On offboard / laptop return
amem wipe --all --yes
# or: scripts/mdm-offboard.sh

Política de ejemplo: templates/policy.example.toml
Runbook completo de TI: docs/enterprise-endpoint.md

Despliegue sugerido: piloto pequeño de DevEx → paquete MDM + política → builds firmados/SBOM si adquisiciones lo solicita. La memoria organizacional compartida está intencionalmente fuera de alcance.


No objetivos

  • Memoria compartida o sincronizada de la empresa
  • "Cerebro de equipo" alojado en la nube
  • Integración exacta de facturación del proveedor
  • APIs de incrustación en la nube/remota (solo FTS5 local + embeddings de hash en el dispositivo)
  • Escribir contenidos de memoria en el historial de git del producto

Ideas futuras (no programadas): ver docs/backlog.md.


Licencia

MIT — ver LICENSE.