Help us improve
Share bugs, ideas, or general feedback.
From aprende
EN — Review the current conversation and surface reusable learnings across four categories (memory, lesson, skill, project-doc). Generate a numbered candidate list first; only write to disk after the user confirms. Trigger when the user types /aprende, /learn, "reflect on this", "save what we learned", "remember this for next time", or after correcting the agent on a recurring mistake. ES — Revisa la conversación actual y extrae aprendizajes reusables en cuatro categorías (memoria, lección, skill, project-doc). Genera primero una lista numerada de candidatos; solo escribe a disco después de la confirmación del usuario. Activa cuando el usuario escriba /aprende, /learn, "reflexiona sobre esto", "guarda lo que aprendimos", "recordar esto para la próxima", o después de corregir al agente sobre un error recurrente.
npx claudepluginhub hainrixz/aprende-skill --plugin aprendeHow this skill is triggered — by the user, by Claude, or both
Slash command
/aprende:aprendeThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
> EN — A skill that turns finished conversations into durable, structured
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Explores codebases via GitNexus: discover repos, query execution flows, trace processes, inspect symbol callers/callees, and review architecture.
Share bugs, ideas, or general feedback.
aprende — Learn from this conversation / Aprende de esta conversaciónEN — A skill that turns finished conversations into durable, structured learnings: memories, anti-patterns (Reflexion-style), skill stubs, and project-doc updates. Confirmation-first. Never auto-writes.
ES — Un skill que convierte conversaciones terminadas en aprendizajes durables y estructurados: memorias, anti-patrones (estilo Reflexion), stubs de skills, y actualizaciones a project-docs. Confirmación primero. Nunca escribe automáticamente.
EN. Coding agents repeat mistakes across sessions because the corrections a
user makes in one conversation evaporate when the session ends. aprende
fixes that. When invoked, it reviews the current conversation, identifies what
is worth preserving across four well-defined categories, and writes those
learnings to the right files — in the format the user's existing memory
system already reads — only after the user picks the items to keep.
Guiding principle: a false positive locked into memory is worse than repeating a correction three times. Be liberal at surfacing candidates, strict at confirming them, and conservative at writing them. Prefer false negatives.
ES. Los agentes de código repiten errores entre sesiones porque las
correcciones que el usuario hace en una conversación se evaporan cuando esa
sesión termina. aprende arregla eso. Al activarse, revisa la conversación
actual, identifica qué vale la pena preservar a través de cuatro categorías
bien definidas, y escribe esos aprendizajes en los archivos correctos — en el
formato que ya usa el sistema de memoria del usuario — solo después de que el
usuario elija qué guardar.
Principio rector: un falso positivo cristalizado en la memoria es peor que repetir una corrección tres veces. Sé liberal al proponer candidatos, estricto al confirmarlos, y conservador al escribirlos. Prefiere los falsos negativos.
EN — Trigger on any of:
/aprende or /learn (the English alias)./aprende (one line, in the assistant turn);
do not run it without permission..aprende-signals.md exists with content).ES — Activa con cualquiera de estos:
/aprende o /learn (alias en inglés)./aprende (una línea, en el turno del
asistente); no lo ejecutes sin permiso..aprende-signals.md con
contenido).| # | Category / Categoría | Lives at / Vive en | When / Cuándo |
|---|---|---|---|
| 1 | memory | ~/.claude/projects/<slug>/memory/<name>.md (metadata.type: user | project | reference | feedback) | Durable facts, preferences, project context, external references. Hechos durables, preferencias, contexto del proyecto, referencias externas. |
| 2 | lesson (anti-pattern) | Same folder, metadata.type: lesson | A mistake happened. We know what, why, and how to avoid. Un error pasó. Sabemos qué, por qué, y cómo evitar. |
| 3 | skill (stub) | ~/.claude/skills/<slug>/SKILL.md or ./.claude/skills/<slug>/ | A reusable multi-step workflow surfaced. Apareció un workflow multi-paso reutilizable. |
| 4 | project-doc | ./CLAUDE.md + ./AGENTS.md (dual-write) — or ~/.claude/CLAUDE.md + ~/.claude/AGENTS.md for global | Build commands, repo conventions, gotchas worth telling every future agent. Comandos de build, convenciones del repo, gotchas que vale la pena contarle a cada agente futuro. |
One example each / Un ejemplo de cada:
memory — "User prefers pnpm over npm in all JS projects." / "El usuario prefiere pnpm sobre npm en todos los proyectos JS."lesson — "Assumed localStorage works inside a WebView purchase flow; it does not — caused silent purchase failures. Use IndexedDB instead." / "Asumí que localStorage funciona dentro de un flujo de compra en WebView; no funciona — causó fallos de compra silenciosos. Usa IndexedDB."skill — /verify-rls — a 6-step Supabase RLS verification workflow that came up three times today. / un workflow de 6 pasos para verificar RLS en Supabase que apareció tres veces hoy.project-doc — "Run tests with pnpm run test:unit, not npm test. The latter triggers the e2e suite which needs a running DB." / "Corre tests con pnpm run test:unit, no npm test. El último dispara la suite e2e que necesita una DB activa."Run these in order. Do not skip. Each pass has a hard output shape.
Ejecuta en orden. No saltes pasos. Cada pase tiene una forma de output estricta.
EN. Read the conversation transcript silently. Look for the patterns in
references/signal-patterns.md (multi-language). The high-signal classes:
references/signal-patterns.md.skill stub) — four or more sequential tool calls that the user explicitly
walked through.If ~/.claude/projects/<current-project-slug>/.aprende-signals.md exists and
is non-empty, prepend its contents to the scratch list — those are signals
captured by the PostToolUse hook earlier in this session.
ES. Lee la transcripción de la conversación en silencio. Busca los
patrones de references/signal-patterns.md (multi-idioma). Las clases de
alta señal:
skill stub) — cuatro o más llamadas secuenciales que el usuario detalló.Si ~/.claude/projects/<slug-del-proyecto>/.aprende-signals.md existe y no
está vacío, anteponé su contenido a la lista — son señales capturadas por el
hook PostToolUse antes en esta sesión.
For each signal, draft a candidate item with this internal shape:
Para cada señal, draftea un candidato con esta forma interna:
{
"category": "memory" | "lesson" | "skill" | "project-doc",
"title": "<short imperative title, ≤ 60 chars>",
"rationale": "<one sentence; what this captures and why>",
"confidence": "high" | "medium" | "low",
"source_excerpt": "<short verbatim quote or tool-result line, optional>"
}
Confidence derivation (mandatory):
high — explicit user feedback in the conversation, OR error→fix with a
user explanation, OR the same correction repeated by the user.medium — inferred pattern, single user comment without elaboration,
error→fix without explanation.low — guess, single observation the model thinks might matter.Be liberal at this pass. It's cheaper to filter at confirmation than to miss a real learning. Cap the candidate list at 15 items per run; if you find more, keep the 15 highest-confidence and tell the user to re-run.
Sé liberal en este pase. Es más barato filtrar en la confirmación que perder un aprendizaje real. Limita la lista a 15 items por corrida; si encuentras más, conserva los 15 de mayor confidence y dile al usuario que vuelva a correr.
Before showing the list, check overlaps without dropping silently:
Antes de mostrar la lista, chequea overlaps sin dropear en silencio:
~/.claude/projects/<slug>/memory/MEMORY.md if it exists. For each
candidate, do a title + topic similarity check against existing bullets.skill candidates, ls ~/.claude/skills/ and ls ./.claude/skills/
(if the project-local folder exists).project-doc candidates, grep -i <keyword> against ./CLAUDE.md and
./AGENTS.md (if either exists).[overlaps with: <existing-name-or-path>] in the
numbered list so the user can decide whether to skip, edit, or replace.Output exactly this template (substitute values, keep the structure):
Imprime exactamente esta plantilla (sustituye valores, mantén la estructura):
Found N candidate learnings from this conversation.
Encontré N aprendizajes candidatos en esta conversación.
Reply with: numbers (e.g. 1,3,5), ranges (1-4), "all", "none", or
"edit N: <new wording>" / "drop low" / "skip N".
Responde con: números (ej. 1,3,5), rangos (1-4), "all", "none", o
"edit N: <nueva descripción>" / "drop low" / "skip N".
1. [memory] <title> — <rationale> (<confidence>)
2. [lesson] <title> — <rationale> (<confidence>) [overlaps with: <name>]
3. [skill] <title> — <rationale> (<confidence>)
4. [project-doc] <title> — <rationale> (<confidence>)
...
>
Then wait. Do not call Write, Edit, or any file-mutating tool until the user replies. This is the most important rule in this skill.
Después espera. No llames Write, Edit, ni ninguna herramienta que modifique archivos hasta que el usuario responda. Esta es la regla más importante del skill.
Accepted inputs / Inputs aceptados:
1,3,51-4 or 1-3,7,9-11all — accept everything as shownnone — accept nothing, exit cleanlyedit 5: <new wording> — replace the candidate's rationale/title before savingskip 3 — accept all except the listed numbersdrop low — filter out everything below the named confidence band (drop low, drop medium)If the input is ambiguous, ask once. Do not guess.
Si el input es ambiguo, pregunta una vez. No adivines.
For each confirmed candidate, run the category-specific write procedure:
Para cada candidato confirmado, ejecuta el procedimiento de escritura por categoría:
memory<slug> for the current project: read pwd, then convert
/Users/soyenrique/Desktop/aprende-skill to -Users-soyenrique-Desktop-aprende-skill
(replace / with -, drop leading dash, keep dashes). The folder is
~/.claude/projects/<slug>/memory/. Create it if missing (mkdir -p).metadata.type
(e.g. feedback_pnpm-over-npm.md, project_supabase-rls-policy.md).
If a file with that name exists, append -2, -3, ... Never overwrite.references/memory-format.md.~/.claude/projects/<slug>/memory/MEMORY.md:
- [<Title>](<filename>.md) — <one-sentence hook>.lessonmemory. Filename starts with lesson_ (e.g.
lesson_webview-assumed-localstorage.md).references/lesson-format.md:
**What happened / Qué pasó:****Why it happened / Por qué pasó:****How to avoid / Cómo evitar:****Detection signal / Señal de detección:**MEMORY.md under a ## Lessons / Lecciones subsection (create
the subsection if missing).skill (stub)~/.claude/skills/<slug>/) by default;
project-local (./.claude/skills/<slug>/) only if the workflow references
repo-specific paths or tools.SKILL.md as a stub, not a full skill — use
references/skill-stub-template.md. Fill in only what the conversation
shows; mark the rest [STUB — fill in: ...].<path>. Run the
skill-creator plugin (or edit manually) to flesh it out before publishing."project-doc./CLAUDE.md and ./AGENTS.md — dual-write)
by default; global (~/.claude/CLAUDE.md and ~/.claude/AGENTS.md) only
if the candidate is repo-agnostic.~/.claude/CLAUDE.md or ~/.claude/AGENTS.md. Global
docs affect every session on this machine.## Commands,
## Conventions). Append under it.## Learnings (added by /aprende)
section at the end of the file.<!-- /aprende YYYY-MM-DD -->.CLAUDE.md and AGENTS.md. If one doesn't exist,
create it with the entry alone. Content is identical between the two.After all writes, emit one confirmation line per write:
Después de cada escritura, imprime una línea de confirmación:
✓ memory → ~/.claude/projects/.../feedback_pnpm-over-npm.md (+MEMORY.md)
✓ lesson → ~/.claude/projects/.../lesson_webview-localstorage.md (+MEMORY.md)
✓ skill → ~/.claude/skills/verify-rls/SKILL.md (stub — finish before use)
✓ project → ./CLAUDE.md + ./AGENTS.md (## Commands)
End with a one-paragraph summary of what was learned and a pointer to
/aprende --review for later pruning.
Termina con un párrafo resumen de lo aprendido y un puntero a
/aprende --review para podar después.
The strict specs live in separate references so this file stays scannable:
Las especificaciones estrictas están en references separadas para que este archivo siga siendo fácil de escanear:
references/memory-format.md — frontmatter + body for type: user|project|reference|feedback.references/lesson-format.md — frontmatter + 4 mandatory subheads (Reflexion).references/skill-stub-template.md — bare SKILL.md scaffold.references/signal-patterns.md — multi-language correction phrases and detection heuristics.references/review-workflow.md — semantics of /aprende --review.The lesson format is the most important; here it is inline as well:
El formato lesson es el más importante; aquí va inline también:
---
name: lesson_<short-slug>
description: One-sentence summary of the mistake and its corrective rule.
metadata:
type: lesson
confidence: high | medium | low
status: active # active | retired | superseded-by-<name>
createdAt: YYYY-MM-DD
lastValidated: YYYY-MM-DD
originSessionId: <session-id or omit>
---
**What happened / Qué pasó:** <factual paragraph, one to three sentences>
**Why it happened / Por qué pasó:** <root cause — not the symptom>
**How to avoid / Cómo evitar:** <concrete rule the next agent should follow>
**Detection signal / Señal de detección:** <how a future run knows it's about to repeat this>
Related: [[other-memory-name]]
--review mode / modo --reviewWhen invoked as /aprende --review:
Cuando se invoca como /aprende --review:
metadata.type: lesson file in the current project's memory
folder, sorted by lastValidated ascending (oldest first).confidence, status, lastValidated, and the
one-sentence description.Still valid? [y/n/edit/skip]
y — bump lastValidated to today's date.n — set status: retired. Do not delete the file.edit — show the full body, let the user paste a new version inline, then
overwrite (and bump lastValidated).skip — leave untouched.N validated, M retired, K edited, L skipped.Lessons with status: retired are skipped by future /aprende runs when
reading memory at session start.
Las lecciones con status: retired se ignoran en futuras corridas de
/aprende cuando lee memoria al inicio de la sesión.
Full procedure: references/review-workflow.md.
--portable mode / modo --portableWhen invoked as /aprende --portable:
Cuando se invoca como /aprende --portable:
lesson candidates, also mirror each
lesson file to ./.aprende/lessons/<filename>.md in the project root../.aprende/index.md with a one-line entry per lesson — Codex and
other tools can read this from AGENTS.md instructions.--portable is used in a project, append this line to
./AGENTS.md (creating it if missing):
Before any non-trivial change, read `.aprende/index.md` for prior lessons.
Antes de cualquier cambio no trivial, lee `.aprende/index.md` para ver lecciones previas.
This is off by default. Plain /aprende does not write ./.aprende/.
Esto está apagado por defecto. Un /aprende normal no escribe ./.aprende/.
User said earlier in the session: "No, in this repo we use spaces, not tabs. Always 2 spaces."
User invokes: /aprende
Expected output:
Found 1 candidate learning from this conversation.
1. [project-doc] Indent with 2 spaces, not tabs — user stated repo convention explicitly (high)
>
User: 1
Execution:
✓ project → ./CLAUDE.md + ./AGENTS.md (## Conventions)
./CLAUDE.md now contains, under ## Conventions:
- Indent with 2 spaces, not tabs. <!-- /aprende 2026-05-11 -->
./AGENTS.md mirrors the same line.
Session contained: Bash call npm test failed with "no test command"; user
said "oh, this project uses pnpm"; Bash call pnpm test succeeded.
User invokes: /aprende
Expected output:
Found 2 candidate learnings from this conversation.
1. [lesson] Don't default to npm in this repo — pnpm is the package manager (high)
2. [project-doc] Test command is `pnpm test`, not `npm test` (high)
>
User: all
Execution: writes lesson file + project-doc append, MEMORY.md updated.
EN — Hard rules:
-2, -3 suffix).metadata.status: retired.~/.claude/CLAUDE.md
or ~/.claude/AGENTS.md requires a second user yes.(high|medium|low).capture-signal.sh only appends signal
records; stop-suggest.sh only emits text. Learnings are written exclusively
by the user-confirmed /aprende flow./aprende later if it repeats."ES — Reglas duras:
-2, -3).metadata.status: retired.~/.claude/CLAUDE.md o ~/.claude/AGENTS.md requiere un segundo sí del
usuario.(high|medium|low).capture-signal.sh solo
appendea registros de señales; stop-suggest.sh solo emite texto. Los
aprendizajes se escriben exclusivamente por el flujo /aprende confirmado./aprende si se
repite."The memory folder is ~/.claude/projects/<slug>/memory/. To get <slug>:
La carpeta de memoria es ~/.claude/projects/<slug>/memory/. Para obtener <slug>:
pwd (the current working directory absolute path)./ with -.-, that leading dash stays (matches the
existing convention — ~/.claude/projects/-Users-soyenrique-Desktop-aprende-skill/).Example: pwd = /Users/soyenrique/Desktop/myproject
→ slug = -Users-soyenrique-Desktop-myproject
→ folder = ~/.claude/projects/-Users-soyenrique-Desktop-myproject/memory/
If the folder does not exist, create it with mkdir -p. Also create
MEMORY.md with a single-line header (# Memory Index) if it's missing.
Si la carpeta no existe, créala con mkdir -p. También crea MEMORY.md con
un header de una línea (# Memory Index) si no existe.
If the plugin's hooks are enabled (they ship ON by default), this skill benefits from them but never depends on them:
Si los hooks del plugin están activos (vienen ON por defecto), este skill se beneficia de ellos pero nunca depende de ellos:
~/.claude/projects/<slug>/.aprende-signals.md. Pass A reads this file
if it exists and prepends its content to the scratch list.additionalContext reminder if signals exist and /aprende was not run.After a successful /aprende run (one that produced at least one
confirmed write), delete .aprende-signals.md to mark the signals as
consumed.
Después de una corrida exitosa de /aprende (que produjo al menos una
escritura confirmada), borra .aprende-signals.md para marcar las señales
como consumidas.
This skill is designed to work in both Claude Code and Codex:
Este skill está diseñado para funcionar tanto en Claude Code como Codex:
project-doc writes always dual-write to CLAUDE.md and AGENTS.md.
Codex reads AGENTS.md; Claude Code reads CLAUDE.md. Same content in
both. No symlinks, no imports.memory and lesson, use /aprende --portable to mirror to
./.aprende/ in the project root. Codex can then read
.aprende/index.md per the line auto-added to AGENTS.md.skills/aprende/SKILL.md) is plain Markdown with YAML
frontmatter — readable by any agent that supports the agentskills.io
convention.| Command | Effect |
|---|---|
/aprende | Standard run — review conversation, prompt, write. |
/learn | English alias for /aprende. |
/aprende --review | Revisit existing lessons; mark retired or refresh. |
/aprende --portable | Standard run + mirror lessons to ./.aprende/. |
/aprende --dry-run | Run passes A-D but skip the write pass. Preview only. |
/aprende-enable-hooks | Install PostToolUse + Stop hooks into ~/.claude/settings.json. |
/aprende-disable-hooks | Remove those hooks. |
Made with discipline against false positives. / Hecho con disciplina contra los falsos positivos.