skills/project-manager/SKILL.md
Manage Espen's projects across the Dev folder and Obsidian vault. Use for project status checks, creating new projects, syncing between code repos and vault notes, archiving, and cross-project search.
npx skillsauth add espennilsen/pi project-managerInstall 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.
Manage projects spanning two systems:
/Users/espen/Dev/ (git repos, code, configs)/Users/espen/Library/CloudStorage/OneDrive-Espennilsen.net/2-Areas/Digital_Life/Obsidian/e9n (notes, tasks, dashboards)AGENTS.md and relevant _Index.md files before creating or editing vault notes.DEV="/Users/espen/Dev"
VAULT="/Users/espen/Library/CloudStorage/OneDrive-Espennilsen.net/2-Areas/Digital_Life/Obsidian/e9n"
Active projects and their locations. Resolve project references against this list first.
| Project | Dev Path | Vault Path | Stack |
|---------|----------|------------|-------|
| pi (Hannah) | $DEV/pi | 1. Projects/AI Projects/Pi (Hannah) | Node/TypeScript, Pi agent |
| e9n.dev | $DEV/e9n.dev | 1. Projects/e9n Agency | Eleventy + Tailwind + Pagefind |
| Starheim | $DEV/Starheim | 1. Projects/Starheim | TanStack Start + React + Clerk + oRPC |
| x10s | $DEV/x10s | — | Node/TypeScript |
| x10s-pi | $DEV/x10s-pi | — | Monorepo, Docker + K8s |
| Hovdan Seil AS | $DEV/Hovdan Seil AS | — | Eleventy + Tailwind |
| hjernedal.no | $DEV/hjernedal.no | — | Next.js + Prisma + AI chatbot |
| SalesGPT | $DEV/SalesGPT | — | Autonomous sales agent |
| obsidian-agent | $DEV/obsidian-agent | — | Claude SDK + Obsidian |
| MCP-Bridge | $DEV/MCP-Bridge | — | OpenAI API → MCP bridge |
| stoic-tracker | $DEV/stoic-tracker | — | Monorepo, Docker |
| Sail La Vie | $DEV/Sail La Vie | — | TanStack React + Firebase |
| LocalBooks | $DEV/LocalBooks | — | React Native |
| comfyui-cheatsheet | $DEV/comfyui-cheatsheet | — | Vue.js |
| ClaudeCode | $DEV/ClaudeCode | — | Developer toolkit |
| CrewMap | — | 1. Projects/CrewMap | — |
| VibeBox | — | 1. Projects/VibeBox | — |
| Languages | — | 1. Projects/Languages | Thai + Spanish |
| Health | — | 1. Projects/Health | Bodybuilding, C25K, Weight Loss |
| Sales Coaching | — | 1. Projects/Sales Coaching | MEDDPICC |
| University Courses | — | 1. Projects/University Courses | Academic |
Get a quick status across all active projects:
# All git repos sorted by last commit (most recent first)
# Shows: project name, last commit timestamp, dirty file count
(for d in $DEV/*/; do
[ -d "$d/.git" ] || continue
name=$(basename "$d")
ts=$(git -C "$d" log -1 --format='%ct' 2>/dev/null)
date=$(git -C "$d" log -1 --format='%ai' 2>/dev/null | cut -d' ' -f1)
ago=$(git -C "$d" log -1 --format='%ar' 2>/dev/null)
dirty=$(git -C "$d" status --porcelain 2>/dev/null | wc -l | tr -d ' ')
week=$(git -C "$d" log --oneline --since="7 days ago" --no-merges 2>/dev/null | wc -l | tr -d ' ')
flag=""
[ "$dirty" -gt 0 ] && flag=" ⚠️ ${dirty} dirty"
[ "$week" -gt 0 ] && flag="${flag} 📝 ${week} this week"
echo "${ts:-0}|${name}|${date:-never}|${ago:-never}${flag}"
done) | sort -t'|' -k1 -rn | cut -d'|' -f2-
# Obsidian project status
cat "$VAULT/1. Projects/_Index.md"
For a specific project, gather comprehensive status:
PROJECT="project-name"
# Git status
git -C "$DEV/$PROJECT" status
git -C "$DEV/$PROJECT" log --oneline -10
# Recent changes
git -C "$DEV/$PROJECT" diff --stat HEAD~5 2>/dev/null
# Tech stack detection
ls "$DEV/$PROJECT/package.json" "$DEV/$PROJECT/Cargo.toml" "$DEV/$PROJECT/pyproject.toml" "$DEV/$PROJECT/go.mod" 2>/dev/null
cat "$DEV/$PROJECT/package.json" 2>/dev/null | head -20
# README / docs
cat "$DEV/$PROJECT/README.md" 2>/dev/null | head -50
# Open issues (if using GitHub)
# Check for TODO/FIXME/HACK
grep -rn "TODO\|FIXME\|HACK\|XXX" "$DEV/$PROJECT/src/" --include="*.ts" --include="*.tsx" --include="*.js" 2>/dev/null | head -20
For the vault side:
# Find related vault notes
find "$VAULT" -name "*.md" -path "*/Projects/*" | xargs grep -l "$PROJECT" 2>/dev/null
When starting a new project, set up both systems:
Dev side:
mkdir -p "$DEV/new-project"
cd "$DEV/new-project"
git init
# ... scaffold based on stack
Vault side (confirm with Espen first):
cat "$VAULT/Templates/Project Template.md"1. Projects/ following the template🏷️ Tag Taxonomy.md1. Projects/_Index.md if it's not auto-generated by DataviewMove a project to archived/inactive state:
Dev side:
# Ensure clean state
git -C "$DEV/$PROJECT" status
# Confirm no uncommitted work, then optionally:
mv "$DEV/$PROJECT" "$DEV/! Archive/"
Vault side (confirm first):
1. Projects/ to 4. Archive/#project/active to #project/completed or #project/archivedSearch across all code repos and vault notes:
# Search code
grep -rl "search term" $DEV/*/src/ --include="*.ts" --include="*.tsx" --include="*.py" 2>/dev/null | head -20
# Search vault
grep -rl "search term" "$VAULT" --include="*.md" 2>/dev/null | head -20
# Search git history across projects
for d in $DEV/*/; do
[ -d "$d/.git" ] || continue
result=$(git -C "$d" log --all --oneline --grep="search term" 2>/dev/null | head -3)
[ -n "$result" ] && echo "=== $(basename "$d") ===" && echo "$result"
done
Verify Dev projects and Obsidian are in sync:
# Projects in Dev that might need vault notes
for d in $DEV/*/; do
[ -d "$d/.git" ] || continue
name=$(basename "$d")
recent=$(git -C "$d" log -1 --format='%ar' 2>/dev/null)
vault_match=$(find "$VAULT/1. Projects" "$VAULT/2. Areas" -name "*.md" 2>/dev/null | xargs grep -l "$name" 2>/dev/null | head -1)
if [ -z "$vault_match" ]; then
echo "⚠️ $name (last: $recent) — no vault note found"
fi
done
# Vault projects that might not have Dev repos
for d in "$VAULT/1. Projects/"*/; do
name=$(basename "$d")
dev_match=$(ls -d "$DEV/$name" 2>/dev/null || ls -d "$DEV/"*"$name"* 2>/dev/null | head -1)
if [ -z "$dev_match" ]; then
echo "📝 $name — vault-only (no Dev repo)"
fi
done
Work with the Obsidian TaskNotes system:
# Open tasks across all projects
find "$VAULT/Tasks/" -name "*.md" -exec grep -l "#status/active\|#status/in-progress" {} \; 2>/dev/null
# Tasks for a specific project
grep -rl "$PROJECT" "$VAULT/Tasks/" --include="*.md" 2>/dev/null
Query Hannah's DB for per-channel/project usage:
sqlite3 /Users/espen/Dev/pi/hannah.db "
SELECT channel, COUNT(*) as jobs,
printf('\$%.4f', SUM(cost_total)) as cost,
SUM(total_tokens) as tokens,
printf('%.1fs', AVG(duration_ms)/1000.0) as avg_dur
FROM jobs
WHERE created_at >= datetime('now', '-7 days')
GROUP BY channel
ORDER BY jobs DESC;
"
When reporting project status, use this structure:
## Project Status: [name]
**Code:** [Dev path] | **Vault:** [vault path or "—"]
**Stack:** [tech stack]
**Last commit:** [relative time] | **Dirty:** [yes/no]
### Recent Activity
- [commit summaries or "No recent commits"]
### Open Items
- [TODOs, tasks, blockers]
### Vault Notes
- [Related notes or "No vault notes found"]
~/Dev/project not full paths) for readabilitytools
# pi-a2a Long-Running Tasks Skill ## Overview The pi-a2a extension supports **long-running tasks** that can execute for hours or days without timeouts. This is essential for: - Data processing pipelines - Batch operations - Research and aggregation tasks - External API jobs with unpredictable duration - Any A2A task that exceeds the standard timeout ## When to Use **Use long-running tasks when:** - Task execution time is unpredictable or known to exceed 10 minutes - The remote agent is proc
development
Orchestrate cmux terminal panes — split terminals, run parallel processes, read output from other panes, and use the built-in browser. Use when working inside cmux and you need to run a dev server, watch tests, spawn sub-agents, or preview web pages.
testing
Review UI designs and implementations for accessibility, consistency, usability, and visual quality. Use when asked to review a design, audit accessibility, check UI consistency, compare implementation against mockups, or evaluate a user interface.
tools
Create, review, and improve skills for Pi agents. A skill is a folder with a SKILL.md that teaches an agent specialized workflows, domain knowledge, or tool integrations. Use when asked to create a new skill, improve an existing skill, review a skill for quality, scaffold a skill from a workflow, or convert documentation into a skill. Also triggers on "make a skill for", "build a skill", "skill for [topic]", "teach the agent to", or "package this workflow as a skill".