project-manager
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
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 ψ/learn/owner
ln -sf "$GHQ_ROOT/github.com/owner/repo" ψ/learn/owner/repoOutput: "✓ Linked [repo] to ψ/learn/owner/repo"
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 ψ/learn ψ/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 ψ/learn ψ/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 ψ/learn ψ/incubate -type l ! -exec test -e {} \; -print 2>/dev/nullIf 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 --contributeAnti-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 ψ/learn/owner && ln -sf "$(ghq root)/github.com/owner/repo" ψ/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