Learn
Professional development studio for Claude Code CLI
npx -y skills add manastalukdar/ai-devstudio --skill learnAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Record, list, search, and apply cross-session learnings — capture insights from completed work as JSONL entries so patterns persist across conversations and accumulate into institutional knowledge. Inspired by gstack's learn skill.
SKILL.md
5.8 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
Learn
I'll capture insights from this session as persistent JSONL learnings so patterns accumulate into institutional knowledge across conversations. Inspired by gstack's learn skill.
Token Optimization
Expected range: 50–200 tokens per operation
Patterns used: Bash for JSONL read/write, Grep for search, early exit (file not found for list/search)
Early exit: For list and search, if no learnings file exists, report "No learnings recorded yet" and stop.
Storage
All learnings are stored in .claude/learnings.jsonl — one JSON object per line:
{"id": "uuid", "date": "2026-04-27", "category": "testing", "learning": "Always run a single test file before the full suite to catch import errors early.", "tags": ["testing", "debugging"], "source": "session"}
Usage
/learn add "Always run a single test file before the full suite" # record a learning
/learn add "Use --force-with-lease instead of --force" --tag git # with tag
/learn list # show all learnings
/learn list --tag git # filter by tag
/learn search "force push" # keyword search
/learn apply # surface relevant learnings for current context
/learn remove <id> # delete a learning by ID
Step 1 — add
mkdir -p .claude
LEARNING_FILE=".claude/learnings.jsonl"
DATE=$(date '+%Y-%m-%d')
ID=$(python3 -c "import uuid; print(str(uuid.uuid4())[:8])")
CATEGORY="${CATEGORY:-general}"
# Build JSON entry
ENTRY=$(python3 -c "
import json, sys
entry = {
'id': '$ID',
'date': '$DATE',
'category': '$CATEGORY',
'learning': sys.argv[1],
'tags': ['$TAG'] if '$TAG' else [],
'source': 'manual'
}
print(json.dumps(entry))
" "$LEARNING_TEXT")
echo "$ENTRY" >> "$LEARNING_FILE"
echo "✓ Learning recorded [ID: $ID]"
echo " $LEARNING_TEXT"
Auto-detect category from content keywords:
- "test", "spec", "mock" →
testing - "git", "commit", "branch", "push" →
git - "performance", "slow", "speed", "cache" →
performance - "security", "auth", "token", "secret" →
security - "api", "endpoint", "http", "curl" →
api - default →
general
Step 2 — list
LEARNING_FILE=".claude/learnings.jsonl"
if [ ! -f "$LEARNING_FILE" ]; then
echo "No learnings recorded yet."
echo "Use: /learn add \"your insight here\""
exit 0
fi
# Filter by tag if provided
if [ -n "$TAG" ]; then
grep "\"$TAG\"" "$LEARNING_FILE"
else
cat "$LEARNING_FILE"
fi | python3 -c "
import json, sys
entries = [json.loads(l) for l in sys.stdin if l.strip()]
for e in sorted(entries, key=lambda x: x['date'], reverse=True):
print(f\"[{e['id']}] {e['date']} ({e['category']}) — {e['learning'][:80]}\")
print(f'\n{len(entries)} learnings total')
"
Step 3 — search
LEARNING_FILE=".claude/learnings.jsonl"
QUERY="$1"
grep -i "$QUERY" "$LEARNING_FILE" | python3 -c "
import json, sys
entries = [json.loads(l) for l in sys.stdin if l.strip()]
for e in entries:
print(f\"[{e['id']}] {e['date']} — {e['learning']}\")
print(f'\n{len(entries)} match(es) for: $QUERY')
"
Step 4 — apply
Surface learnings relevant to the current working context:
# Detect current context signals
BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
RECENT_FILES=$(git diff --name-only HEAD~3 2>/dev/null | head -10)
STAGED=$(git diff --cached --name-only 2>/dev/null | head -5)
# Extract keywords from context
CONTEXT_KEYWORDS=$(echo "$BRANCH $RECENT_FILES $STAGED" | tr '/' ' ' | tr '-' ' ')
# Search learnings for each keyword
for KEYWORD in $CONTEXT_KEYWORDS; do
[ ${#KEYWORD} -lt 4 ] && continue # skip short words
grep -i "$KEYWORD" .claude/learnings.jsonl 2>/dev/null
done | sort -u | python3 -c "
import json, sys
entries = set()
for l in sys.stdin:
try:
e = json.loads(l.strip())
entries.add((e['id'], e['learning']))
except: pass
if entries:
print('Relevant learnings for this context:')
for id_, learning in list(entries)[:5]:
print(f' [{id_}] {learning}')
else:
print('No relevant learnings found for current context.')
"
Step 5 — remove
ID="$1"
LEARNING_FILE=".claude/learnings.jsonl"
# Show the entry first
grep "\"id\": \"$ID\"" "$LEARNING_FILE" | python3 -c "import json,sys; e=json.loads(sys.stdin.read()); print(f\"Remove: {e['learning']}? [y/N]\")"
# On confirmation: filter out the entry
python3 -c "
import json, sys
entries = [json.loads(l) for l in open('$LEARNING_FILE') if l.strip()]
kept = [e for e in entries if e['id'] != '$ID']
with open('$LEARNING_FILE', 'w') as f:
for e in kept:
f.write(json.dumps(e) + '\n')
print(f'Removed [{\"$ID\"}] — {len(kept)} learnings remain')
"
Integration with /retro
At the end of a /retro session, any pattern surfaced in Step 5 ("Carry Forward") can be recorded:
/learn add "Run smoke-test after every skill addition to catch count drift" --tag workflow
Edge Cases
- Duplicate learning: before adding, check if a very similar learning exists (Levenshtein > 80% match); warn but allow
- Long learning text: truncate display to 80 chars; store full text in JSONL
- Corrupted JSONL: skip malformed lines; report "N lines skipped (malformed)"
- Empty file: treat same as missing file
- apply with no git: fall back to current directory name and file types as context signals
What ships with it
Read from the repository
Just SKILL.md. No reference files, no scripts.
Gives 0 of the 12 instructions most learn study skills give in ~1.5k tokens
Counted across 546 of the 573 authors here whose files we hold, read 2026-08-07
- Calculate the zone of proximal development before teachingin 25 of 546, across 8 files
- Produce self-contained HTML lessonsin 24 of 546, across 8 files
- Record user preferences in a notes filein 23 of 546, across 5 files
- Maintain a teaching workspace in the current directoryin 21 of 546, across 4 files
- Find high-quality resources before writing lessonsin 19 of 546, across 5 files
- Make lessons beautiful, short, and quickly completablein 19 of 546, across 3 files
- Create reusable components for lessonsin 19 of 546, across 5 files
- Create compressed reference documents for quick lookupin 19 of 546, across 3 files
- Update the mission file and records upon mission changesin 16 of 546, across 2 files
- Set min_dist to 0.0 for clustering preprocessingin 16 of 546, across 6 files
- Populate the mission file before teachingin 15 of 546, across 1 file
- Include interactive feedback loops in lessonsin 15 of 546, across 1 file
Said here and by no other author read
- store each learning as jsonl
- auto-detect category from content keywords
- filter list output by tag
- search learnings case-insensitively
- surface relevant learnings for current context
- skip short words during apply context extraction
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.