project-manager
SkillSearchClone and track external repos. Use when user shares a GitHub URL to study or develop, or says "search repos", "find repo", "where is [project]". For active development, use /incubate.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the project-manager skill
What this skill tells your AI
The instructions your AI receives, as published by soul-brews-studio/arra-oracle-skills-cli in skills/project/SKILL.md and read by ahel’s review.
Track and manage external repos: Learn (study) | Incubate (develop)
Golden Rule
ghq owns the clone → ψ/ owns the symlink
Never copy. Always symlink. One source of truth.
When to Use
Invoke this skill when:
- User shares a GitHub URL and wants to study/clone it
- User mentions wanting to learn from a codebase
- User wants to start developing on an external repo
- Need to find where a previously cloned project lives
Step 0 — Anchor (date-stamp + root)
date "+🕐 %H:%M %Z (%A %d %B %Y)"
# Find oracle root — git toplevel that has CLAUDE.md + ψ/
ORACLE_ROOT=$(git rev-parse --show-toplevel 2>/dev/null)
if [ -n "$ORACLE_ROOT" ] && [ -f "$ORACLE_ROOT/CLAUDE.md" ] && { [ -d "$ORACLE_ROOT/ψ" ] || [ -L "$ORACLE_ROOT/ψ" ]; }; then
PSI="$ORACLE_ROOT/ψ"
elif [ -f "$(pwd)/CLAUDE.md" ] && { [ -d "$(pwd)/ψ" ] || [ -L "$(pwd)/ψ" ]; }; then
ORACLE_ROOT="$(pwd)"
PSI="$ORACLE_ROOT/ψ"
else
echo "⚠️ Not in oracle repo (no CLAUDE.md + ψ/ at git root). Writing to pwd."
ORACLE_ROOT="$(pwd)"
PSI="$ORACLE_ROOT/ψ"
fi
Actions
learn [url|slug]
Clone repo for study (read-only reference).
# 1. Clone via ghq
ghq get -u https://github.com/owner/repo
# 2. Create org/repo symlink structure
GHQ_ROOT=$(ghq root)
mkdir -p "$PSI/learn/owner"
ln -sf "$GHQ_ROOT/github.com/owner/repo" "$PSI/learn/owner/repo"
Output (announce-mode — absolute path):
announce-mode → absolute path (no ψ/, no ~/, no $VAR, no ...).
Use: echo "marker: $RESOLVED_PATH" — bash substitutes. See CONVENTIONS.md.
LINK="$PSI/learn/owner/repo"
echo "✅ Linked: $LINK"
incubate — REDIRECTS TO /incubate
/project incubateis now/incubate. If the user says/project incubate [args], run/incubate [args]instead. Do NOT execute incubate logic here — invoke the standalone/incubateskill with the same arguments.
find [query]
Search for project across all locations:
# Search ghq repos
ghq list | grep -i "query"
# Search learn/incubate symlinks (org/repo structure)
find "$PSI/learn" "$PSI/incubate" -type l 2>/dev/null | grep -i "query"
Output: List matches with their ghq paths
list
Show all tracked projects with rich metadata (#227):
echo "📦 Projects"
echo ""
# Collect all tracked repos (learn + incubate symlinks)
REPOS=()
for link in $(find "$PSI/learn" "$PSI/incubate" -name "origin" -type l 2>/dev/null | sort); do
dir=$(dirname "$link")
owner=$(basename "$(dirname "$dir")")
repo=$(basename "$dir")
type="learn"
echo "$link" | grep -q "incubate" && type="incubate"
REPOS+=("$owner/$repo:$type")
done
if [ ${#REPOS[@]} -eq 0 ]; then
echo " No tracked projects. Use /learn or /incubate to add."
else
printf " %-35s %-6s %-8s %-8s %s\n" "Repo" "Stars" "License" "Type" "Description"
printf " %-35s %-6s %-8s %-8s %s\n" "───────────────────────────────────" "──────" "────────" "────────" "──────────────────────"
for entry in "${REPOS[@]}"; do
slug="${entry%%:*}"
type="${entry##*:}"
# Fetch metadata from GitHub (cached per session)
meta=$(gh api "repos/$slug" --jq '"\(.stargazers_count)\t\(.license.spdx_id // "none")\t\(.description // "-" | .[0:40])"' 2>/dev/null || echo "?\tnone\t-")
stars=$(echo "$meta" | cut -f1)
license=$(echo "$meta" | cut -f2)
desc=$(echo "$meta" | cut -f3)
printf " %-35s %-6s %-8s %-8s %s\n" "$slug" "⭐$stars" "$license" "$type" "$desc"
done
fi
echo ""
echo " Total: ${#REPOS[@]} tracked repos"
Directory Structure
ψ/
├── learn/owner/repo → ~/Code/github.com/owner/repo (symlink)
└── incubate/owner/repo → ~/Code/github.com/owner/repo (symlink)
~/Code/ ← ghq root (source of truth)
└── github.com/owner/repo/ (actual clone)
Health Check
When listing, verify symlinks are valid:
# Check for broken symlinks
find "$PSI/learn" "$PSI/incubate" -type l ! -exec test -e {} \; -print 2>/dev/null
If broken: ghq get -u [url] to restore source.
Examples
# User shares URL to study
User: "I want to learn from https://github.com/SawyerHood/dev-browser"
→ ghq get -u https://github.com/SawyerHood/dev-browser
→ mkdir -p ψ/learn/SawyerHood
→ ln -sf ~/Code/github.com/SawyerHood/dev-browser ψ/learn/SawyerHood/dev-browser
# User wants to develop → redirect to /incubate
User: "I want to work on claude-mem"
→ /incubate https://github.com/thedotmack/claude-mem
# User says "/project incubate" → redirect to /incubate
User: "/project incubate https://github.com/Soul-Brews-Studio/arra-oracle-v3 --contribute"
→ /incubate https://github.com/Soul-Brews-Studio/arra-oracle-v3 --contribute
Anti-Patterns
| ❌ Wrong | ✅ Right |
|---|---|
git clone directly to ψ/ | ghq get then symlink |
Flat: ψ/learn/repo-name | Org structure: ψ/learn/owner/repo |
| Copy files | Symlink always |
| Manual clone outside ghq | Everything through ghq |
Quick Reference
# Add to learn
ghq get -u URL && mkdir -p "$PSI/learn/owner" && ln -sf "$(ghq root)/github.com/owner/repo" "$PSI/learn/owner/repo"
# Incubate (use standalone /incubate skill)
/incubate URL [--flash | --contribute | --status | --offload]
# Update source
ghq get -u URL
# Find repo
ghq list | grep name
Signals
- GitHub stars
- 121
- Forks
- 55
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
project-soul-brews-studio- Source
- github.com/soul-brews-studio/arra-oracle-skills-cli