src/skills/learn/SKILL.md
Explore a codebase with parallel Haiku agents — clone, read, and document. Modes — --fast (1 agent), default (3), --deep (5). Use when user says "learn [repo]", "explore codebase", "study this repo", or shares a GitHub URL to study. Do NOT trigger for finding projects (use /trace), session mining (use /dig), or cloning for active development (use /incubate).
npx skillsauth add Soul-Brews-Studio/oracle-skills-cli learnInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Explore a codebase with 3 parallel Haiku agents → create organized documentation.
/learn [url] # Auto: clone via ghq, symlink origin/, then explore
/learn [slug] # Use slug from ψ/memory/slugs.yaml
/learn [repo-path] # Path to repo
/learn [repo-name] # Finds in ψ/learn/owner/repo
/learn --init # Restore all origins after git clone (like submodule init)
| Flag | Agents | Files | Use Case |
|------|--------|-------|----------|
| --fast | 1 | 1 overview | Quick scan, "what is this?" |
| (default) | 3 | 3 docs | Normal exploration |
| --deep | 5 | 5 docs | Master complex codebases |
/learn --fast [target] # Quick overview (1 agent, ~2 min)
/learn [target] # Standard (3 agents, ~5 min)
/learn --deep [target] # Deep dive (5 agents, ~10 min)
ψ/learn/
├── .origins # Manifest of learned repos (committed)
└── owner/
└── repo/
├── origin # Symlink to ghq source (gitignored)
├── repo.md # Hub file - links to all sessions (committed)
└── YYYY-MM-DD/ # Date folder
├── 1349_ARCHITECTURE.md # Time-prefixed files
├── 1349_CODE-SNIPPETS.md
├── 1349_QUICK-REFERENCE.md
├── 1520_ARCHITECTURE.md # Second run same day
└── ...
Multiple learnings: Each run gets time-prefixed files (HHMM_), nested in date folder.
Offload source, keep docs:
unlink ψ/learn/owner/repo/origin # Remove symlink
ghq rm owner/repo # Remove source
# Docs remain in ψ/learn/owner/repo/
Restore all origins after cloning (like git submodule init):
ROOT="$(pwd)"
# Read .origins manifest and restore symlinks
while read repo; do
ghq get -u "https://github.com/$repo"
OWNER=$(dirname "$repo")
REPO=$(basename "$repo")
mkdir -p "$ROOT/ψ/learn/$OWNER/$REPO"
ln -sf "$(ghq root)/github.com/$repo" "$ROOT/ψ/learn/$OWNER/$REPO/origin"
echo "✓ Restored: $repo"
done < "$ROOT/ψ/learn/.origins"
CRITICAL: Capture ABSOLUTE paths first (before spawning any agents):
date "+🕐 %H:%M %Z (%A %d %B %Y)" && ROOT="$(pwd)"
echo "Learning from: $ROOT"
IMPORTANT FOR SUBAGENTS: When spawning Haiku agents, you MUST give them TWO literal paths:
origin/ symlink⚠️ THE BUG: If you only give agents origin/ path, they cd into it and write there → files end up in WRONG repo!
FIX: Always give BOTH paths as LITERAL absolute values (no variables!):
Example: ROOT=/home/user/ghq/.../my-oracle, learning acme-corp/cool-library, TODAY=2026-02-04, TIME=1349:
READ from: .../ψ/learn/acme-corp/cool-library/origin/
WRITE to: .../ψ/learn/acme-corp/cool-library/2026-02-04/1349_[FILENAME].md
Tell each agent: "Read from [SOURCE_DIR]. Write to [DOCS_DIR]/[TIME]_[FILENAME].md"
Clone, create docs dir, symlink origin, update manifest:
# Replace [URL] with actual URL
URL="[URL]"
ROOT="$(pwd)" # CRITICAL: Save current directory!
ghq get -u "$URL" && \
GHQ_ROOT=$(ghq root) && \
OWNER=$(echo "$URL" | sed -E 's|.*github.com/([^/]+)/.*|\1|') && \
REPO=$(echo "$URL" | sed -E 's|.*/([^/]+)(\.git)?$|\1|') && \
mkdir -p "$ROOT/ψ/learn/$OWNER/$REPO" && \
ln -sf "$GHQ_ROOT/github.com/$OWNER/$REPO" "$ROOT/ψ/learn/$OWNER/$REPO/origin" && \
echo "$OWNER/$REPO" >> "$ROOT/ψ/learn/.origins" && \
sort -u -o "$ROOT/ψ/learn/.origins" "$ROOT/ψ/learn/.origins" && \
echo "✓ Ready: $ROOT/ψ/learn/$OWNER/$REPO/origin → source"
Verify:
ls -la "$ROOT/ψ/learn/$OWNER/$REPO/"
Note: Grep tool doesn't follow symlinks. Use:
rg -L "pattern" ψ/learn/owner/repo/origin/
# Find by name (searches origin symlinks)
find ψ/learn -name "origin" -type l | xargs -I{} dirname {} | grep -i "$INPUT" | head -1
For external repos: Clone with script first, then explore via origin/
For local projects (in specs/, ψ/lib/): Read directly
Check arguments for --fast or --deep:
--fast → Single overview agent--deep → 5 parallel agentsCalculate ACTUAL paths (replace variables with real values):
TODAY = YYYY-MM-DD (e.g., 2026-02-04)
TIME = HHMM (e.g., 1349)
REPO_DIR = [ROOT]/ψ/learn/[OWNER]/[REPO]/
DOCS_DIR = [ROOT]/ψ/learn/[OWNER]/[REPO]/[TODAY]/ ← date folder
SOURCE_DIR = [ROOT]/ψ/learn/[OWNER]/[REPO]/origin/ ← symlink
FILE_PREFIX = [TIME]_ ← time prefix for files
Example:
- ROOT = /home/user/ghq/github.com/my-org/my-oracle
- OWNER = acme-corp
- REPO = cool-library
- TODAY = 2026-02-04, TIME = 1349
- DOCS_DIR = .../ψ/learn/acme-corp/cool-library/2026-02-04/
- Files: 1349_ARCHITECTURE.md, 1349_CODE-SNIPPETS.md, etc.
⚠️ CRITICAL: Create symlink AND date folder FIRST, then spawn agents!
date +%H%M (e.g., 1349)mkdir -p "$DOCS_DIR"Multiple runs same day? Each run gets unique TIME prefix → no overwrites.
Prompt the agent with (use LITERAL paths, not variables!):
You are exploring a codebase.
READ source code from: [SOURCE_DIR]
WRITE your output to: [DOCS_DIR]/[TIME]_OVERVIEW.md
⚠️ IMPORTANT: Write to DOCS_DIR (the date folder), NOT inside origin/!
Analyze:
- What is this project? (1 sentence)
- Key files to look at
- How to use it (install + basic example)
- Notable patterns or tech
Skip to Step 2 after agent completes.
Launch 3 agents in parallel. Each prompt must include (use LITERAL paths!):
READ source code from: [SOURCE_DIR]
WRITE your output to: [DOCS_DIR]/[TIME]_[filename].md
⚠️ IMPORTANT: Write to DOCS_DIR (the date folder), NOT inside origin/!
[TIME]_ARCHITECTURE.md[TIME]_CODE-SNIPPETS.md[TIME]_QUICK-REFERENCE.mdSkip to Step 2 after all agents complete.
Launch 5 agents in parallel. Each prompt must include (use LITERAL paths!):
READ source code from: [SOURCE_DIR]
WRITE your output to: [DOCS_DIR]/[TIME]_[filename].md
⚠️ IMPORTANT: Write to DOCS_DIR (the date folder), NOT inside origin/!
[TIME]_ARCHITECTURE.md[TIME]_CODE-SNIPPETS.md[TIME]_QUICK-REFERENCE.md[TIME]_TESTING.md[TIME]_API-SURFACE.mdSkip to Step 2 after all agents complete.
# [REPO] Learning Index
## Source
- **Origin**: ./origin/
- **GitHub**: https://github.com/$OWNER/$REPO
## Explorations
### [TODAY] [TIME] ([mode])
- [[YYYY-MM-DD/HHMM_ARCHITECTURE|Architecture]]
- [[YYYY-MM-DD/HHMM_CODE-SNIPPETS|Code Snippets]]
- [[YYYY-MM-DD/HHMM_QUICK-REFERENCE|Quick Reference]]
- [[YYYY-MM-DD/HHMM_TESTING|Testing]] <!-- --deep only -->
- [[YYYY-MM-DD/HHMM_API-SURFACE|API Surface]] <!-- --deep only -->
**Key insights**: [2-3 things learned]
### [TODAY] [EARLIER-TIME] ([mode])
...
After learning completes, print the hub + generated file paths.
echo "📚 Hub: $REPO_DIR/$REPO.md"
echo "📚 Files: $DOCS_DIR/${TIME}_*.md"
ls "$DOCS_DIR"/${TIME}_*.md
Files generated depend on mode (--fast → 1 overview; default → 3 docs; --deep → 5 docs). Add a 2–3 line "Key Insights" summary after the file listing.
For Oracles that want to commit docs but ignore symlinks:
# Ignore origin symlinks only (source lives in ghq)
# Note: no trailing slash - origin is a symlink, not a directory
ψ/learn/**/origin
After running /learn, check your repo's .gitignore has these patterns so docs are committed but symlinks are ignored.
After writing docs, log the learning to Oracle so it's discoverable via /trace:
Write to ψ/memory/learnings/YYYY-MM-DD_<slug>.md with frontmatter:
---
pattern: "Learned [REPO]: [2-3 key insights]"
date: <today>
source: learn: OWNER/REPO
concepts: ["learn", "codebase", <relevant-tags>]
---
# Learned [REPO]
<2-3 key insights in body>
The Oracle's auto-memory layer picks up new files in ψ/memory/learnings/ automatically — no separate API call needed.
This connects /learn to the shared knowledge layer — future /trace queries find what was learned.
--fast: 1 agent, quick scan for "what is this?"--deep: 5 agents, comprehensive for complex reposorigin/ structure allows easy offload.origins manifest enables --init restoretesting
Cut a beta pre-release — bump CalVer with --beta, PR to beta branch, CI auto-tags + publishes to npm @beta. Use when user says 'release beta', 'cut beta', '/release-beta', or wants to publish a beta version for pre-release testing.
testing
Cut an alpha pre-release — bump CalVer, PR to alpha branch, CI auto-tags + publishes to npm @alpha. Use when user says 'release alpha', 'cut alpha', '/release-alpha', or wants to publish an alpha version.
tools
Talk to another oracle via maw federation. Uses fleet machine names (white, mba, clinic-nat, oracle-world, phaith). Auto-signs with current oracle's [host:handle] from CLAUDE.md. Global — works from any oracle repo.
development
Log information for future reference. Use when user says "fyi", "remember this", "note that", "for your info".