Scans the current conversation for patterns worth turning into a reusable skill or memory rule — feedback you've given Claude, workflows you've walked through, corrections, best practices, recurring setups. Proposes candidates, classifies each as skill (multi-step workflow) or memory (single rule), cross-checks against existing skills + MEMORY.md to avoid duplicates, then hands off to /skill-creator (for skills) or writes the memory entry directly. Use when the conversation contains reusable ...
Scanned 9/19/2026
Install to Claude Code
npx -y skills add mostafa-drz/claude-skills --skill extract-skill --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Extract Skill?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/mostafa-drz-extract-skill)More formats (shields.io, HTML) on the badges page.
---
name: extract-skill
description: >-
Scans the current conversation for patterns worth turning into a reusable skill or memory rule —
feedback you've given Claude, workflows you've walked through, corrections, best practices, recurring
setups. Proposes candidates, classifies each as skill (multi-step workflow) or memory (single rule),
cross-checks against existing skills + MEMORY.md to avoid duplicates, then hands off to
/skill-creator (for skills) or writes the memory entry directly. Use when the conversation contains
reusable knowledge you don't want to teach Claude again — "we just figured this out, capture it",
"turn this into a skill", "save this workflow", "from experience to skill".
argument-hint: "[--memory-only] [--skill-only] [--dry-run]"
disable-model-invocation: true
allowed-tools:
- AskUserQuestion
- Read
- Glob
- Grep
- Write
- Edit
- Bash(ls *)
- Bash(mkdir *)
- Bash(cat *)
- Bash(git *)
- Bash(wc *)
metadata:
trigger: "The conversation contains reusable knowledge you don't want to teach Claude again \u2014 \"capture this\", \"turn this into a skill\", \"save this workflow\"."
tags: "meta, skills, memory"
---
# extract-skill
Turn the **current conversation** into a reusable skill or memory rule. From experience → reusable artifact.
## Preferences
_On startup, use Read to load `~/.claude/skills/extract-skill/preferences.md`. If it does not exist, treat as "no preferences set" — proceed with sensible defaults._
## Context
_On startup, use Bash to:_
1. _List existing skills: `ls ~/.claude/skills/`_
2. _Read `~/.claude/skills/SKILLS_GUIDE.md` (inventory + conventions)_
3. _Read `~/.claude/projects/<project-slug>/memory/MEMORY.md` if accessible (the user's auto-memory index)_
_Skip any that fail. The point is to know what already exists so we don't propose duplicates._
## Command routing
Check `$ARGUMENTS`:
- **`help`** → display help then stop
- **`config`** → interactive setup, then stop
- **`reset`** → delete `~/.claude/skills/extract-skill/preferences.md`, confirm, stop
- **`--memory-only`** → only propose memory entries, never skills
- **`--skill-only`** → only propose skills, never memory entries
- **`--dry-run`** → print candidates + classification, do not create anything
- **anything else (including empty)** → run the skill
### Help
```
extract-skill — Capture conversation learnings as a skill or memory rule
Usage:
/extract-skill Scan this conversation, propose skill/memory candidates
/extract-skill --memory-only Only propose memory entries (single-rule preferences)
/extract-skill --skill-only Only propose skills (multi-step workflows)
/extract-skill --dry-run Print candidates + classification, do not create anything
/extract-skill config Set preferences
/extract-skill reset Clear preferences
/extract-skill help This help
Examples:
/extract-skill After a chat where you taught Claude how to do X
/extract-skill --dry-run Preview what would be captured before committing
Current preferences:
(loaded from preferences.md, shown above)
```
### Config
Use `AskUserQuestion` to collect:
- **Q1: Default routing** — When a candidate is ambiguous (could be skill or memory), default to: ask each time / route to skill / route to memory
- **Q2: Skill creation handoff** — Always hand off to `/skill-creator` / let me choose per skill
- **Q3: Memory project path** — Auto-detect from current project / always use a fixed path
- **Q4: Minimum signal threshold** — How strong must a pattern be to surface it? (any mention / repeated 2+ times / explicit "save this" only)
Save to `~/.claude/skills/extract-skill/preferences.md`.
### Reset
Delete `~/.claude/skills/extract-skill/preferences.md` and confirm: "Preferences cleared. Using defaults."
## First-time detection
If no preferences file exists, show:
> First time using /extract-skill? Run `/extract-skill config` to set defaults, or just continue with sensible defaults.
Then proceed.
---
## Step 1: Scan the conversation for signal
Look back over the conversation we're in **right now**. You don't need to read transcripts — you have the messages in context. Categorize what you see into these signal types:
### Signal types
| Type | Example phrasing in chat | Likely artifact |
|---|---|---|
| **Feedback / correction** | "don't do X", "stop doing Y", "always use Z" | Memory (single rule) |
| **Preference / convention** | "we use pnpm not npm", "kebab-case for components" | Memory (single rule) |
| **Workflow walkthrough** | User taught Claude a multi-step procedure ("first do X, then Y, then Z, then…") | **Skill** |
| **Repeated request** | User asked for the same kind of output 2+ times in similar way | **Skill** |
| **Setup / configuration ritual** | "every time I start, I do X, Y, Z" | **Skill** (or memory if 1 step) |
| **Best practice shared** | User explained why an approach is correct | Memory (with **Why:**) |
| **Tooling / integration** | User showed how to use a specific MCP or external tool | **Skill** |
| **Explicit "save this"** | "remember this", "turn this into a skill", "capture this" | Whatever the user named |
### What counts as signal vs noise
**Signal** (capture):
- Rules the user articulated explicitly ("always", "never", "we do it this way")
- Multi-step procedures the user walked through and validated
- Corrections to Claude's default behavior
- Preferences the user expressed with reasoning (the **Why:**)
**Noise** (skip):
- Casual chatter
- One-off task details ("fix this typo on line 42")
- Stuff already in MEMORY.md (cross-check before surfacing)
- Stuff already covered by an existing skill (cross-check inventory)
## Step 2: Classify — skill vs memory
For each candidate, decide:
- **Memory** — single rule, declarative, no procedure. "Always X." "Never Y." "We use Z." → goes into a memory file with frontmatter (type: feedback / user / project / reference) per the user's auto-memory format.
- **Skill** — multi-step workflow, has inputs/outputs/decision points, worth invoking explicitly with `/<name>`. → handed off to `/skill-creator`.
- **Both** — rare but real. A skill `/post-pr` might pair with a memory rule "PRs always use HEREDOC syntax".
- **Already exists** — flag it. Show the existing skill or memory entry instead of duplicating.
- **Skip** — not enough signal yet, or too task-specific.
If the user passed `--memory-only` or `--skill-only`, filter the output accordingly.
## Step 3: Cross-reference existing artifacts
Before surfacing any candidate:
1. **Check existing skills inventory** — search `~/.claude/skills/SKILLS_GUIDE.md` and the directory listing. If a skill already covers this workflow, mention it instead of proposing a duplicate.
2. **Check MEMORY.md** — search the user's auto-memory index for matching rules. If the rule already exists, propose an **update** (e.g., add a **Why:** line, sharpen wording) rather than a new entry.
3. **Check Claude Code built-ins** — don't propose a skill for things like `/init`, `/review`, `/loop` that already ship with Claude Code.
## Step 4: Present candidates to the user
Use `AskUserQuestion` to show 1–4 candidates at once. Each option should include:
- **Type** — Skill / Memory / Update existing / Skip
- **Name** (kebab-case for skills, descriptive title for memory)
- **One-liner** — what it does or what the rule says
- **Trigger** — when this applies / when to invoke
- **Source** — 1–2 quotes from the conversation showing the signal
Example layout:
```
Candidate 1: SKILL — extract-skill
One-liner: Scans current conversation, proposes skill/memory candidates, routes to /skill-creator or writes memory.
Trigger: After a chat where the user taught Claude something reusable.
Source: "from experience to skills, best practices my latest, learning, feedback…"
"I want to create a skill which basically when I call it looks at context available in a chat…"
Candidate 2: MEMORY — Always confirm name + scope before generating SKILL.md
Rule: Skill creation must confirm name and side-effect scope before writing files.
Why: Past skills were generated with wrong defaults that the user had to revise.
How to apply: When invoked, ask name + side-effects Q before any Write tool call.
```
Let the user pick which to proceed with (multi-select). Default-select all that look high-confidence.
## Step 5a: Skill candidates → hand off to /skill-creator
For each candidate the user accepted as a **skill**:
1. Build a single, self-contained `--from-description` brief: `"<one-liner>. Trigger: <when>. Key behaviors: <bullets>. Inputs: <args/flags>. Side effects: <yes/no + what>."`
2. Tell the user: _"Handing off to `/skill-creator --from-description \"…\"` — it will walk you through name, tools, and workflow with its own conventions."_
3. **Do not invoke `/skill-creator` yourself via tool** — slash commands aren't tool-callable from another skill. Print the exact command for the user to run, or to copy/paste.
4. If the user prefers direct creation (set in config), generate `SKILL.md` inline using SKILLS_GUIDE.md conventions — but flag this as the non-DRY path.
### The brief format (paste into /skill-creator)
```
/skill-creator --from-description "<purpose in 1–2 sentences>. Trigger: <when user reaches for it>. Key behaviors: <3–5 bullets>. Side effects: <yes/no — what does it create or modify?>. Tools: <best-guess list>."
```
## Step 5b: Memory candidates → write directly
For each candidate the user accepted as a **memory** entry:
1. Determine memory type from content:
- `feedback` — user corrections, preferences, do/don't rules
- `user` — facts about the user's role / context
- `project` — facts about ongoing work
- `reference` — pointers to external systems
2. Pick a filename (kebab-case): `feedback_<topic>.md`, `project_<topic>.md`, etc.
3. Write the file with frontmatter:
```markdown
---
name: <Title>
description: <one-line, specific>
type: feedback | user | project | reference
---
<Lead with the rule/fact.>
**Why:** <reason — often an incident or strong preference>
**How to apply:** <when/where this kicks in>
```
4. Add a one-line index entry to `MEMORY.md` under an appropriate heading:
```markdown
## <Short title> (MANDATORY / PREFERENCE / ACTIVE)
- See `memory/<filename>.md`
- <one-line hook capturing the essence>
```
5. Use `Edit` (not `Write`) on `MEMORY.md` so existing entries aren't clobbered.
### Where to write memory files
The auto-memory directory is per-project. Detect via:
```bash
git rev-parse --show-toplevel
```
Then map to: `~/.claude/projects/<encoded-path>/memory/`. If the directory doesn't exist or isn't accessible, fall back to asking the user for the path.
## Step 6: Update existing entries
If a candidate matches something already in MEMORY.md or an existing skill:
- **Memory match** — show the existing entry alongside the new signal. Ask: keep existing / sharpen wording / add **Why:** line / add **How to apply:** line.
- **Skill match** — show the existing skill name + description. Ask: extend it (rare — usually means editing its SKILL.md) / leave alone / propose a sibling skill.
## Step 7: Confirm and report
After all writes:
1. List what was created/updated:
- Skills proposed (with the exact `/skill-creator …` command to run)
- Memory files written (with paths)
- MEMORY.md entries added
2. Show 1–3 lines per artifact — no walls of text.
3. End with a single suggestion: "Run `<command>` to finalize the skill" or "Memory takes effect next conversation — nothing else to do".
## Step 8: Learn
If the user corrected your classification (e.g., "no, that's a memory not a skill", "use this name instead"), silently save to `preferences.md` under `## Learned`. Surface once: _"Noted: <pattern>. Saved for next time."_
---
## Principles
- **DRY across the meta-system** — defer to `/skill-creator` for skill generation; defer to MEMORY.md for memory routing. This skill is a router + classifier, not a re-implementation.
- **Cross-reference before proposing** — duplicate skills and duplicate memory entries are worse than missed captures. Always check inventory + MEMORY.md first.
- **Prefer memory for single rules, skills for workflows** — a one-liner like "always use pnpm" is memory. A 5-step "release a new note" procedure is a skill.
- **Quote the source** — every candidate must show 1–2 lines from the conversation that justify it. No hallucinated patterns.
- **Don't auto-invoke other skills** — print the exact `/skill-creator` command for the user. Side-effect chains shouldn't fire silently.
- **Confirm before writing** — every Write/Edit happens after explicit user accept. `--dry-run` prints without writing.
- **Keep the bar high** — if a pattern was mentioned once in passing, skip it. Strong signal = explicit rule, repeated request, or "save this" instruction.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!