Loading...
Loading...
Set up and manage local skills for automatic matching and invocation
npx skill4agent add yeachan-heo/oh-my-claudecode local-skills-setup# Check and create user-level skills directory
USER_SKILLS_DIR="$HOME/.claude/skills/omc-learned"
if [ -d "$USER_SKILLS_DIR" ]; then
echo "User skills directory exists: $USER_SKILLS_DIR"
else
mkdir -p "$USER_SKILLS_DIR"
echo "Created user skills directory: $USER_SKILLS_DIR"
fi
# Check and create project-level skills directory
PROJECT_SKILLS_DIR=".omc/skills"
if [ -d "$PROJECT_SKILLS_DIR" ]; then
echo "Project skills directory exists: $PROJECT_SKILLS_DIR"
else
mkdir -p "$PROJECT_SKILLS_DIR"
echo "Created project skills directory: $PROJECT_SKILLS_DIR"
fi# Scan user-level skills
echo "=== USER-LEVEL SKILLS (~/.claude/skills/omc-learned/) ==="
if [ -d "$HOME/.claude/skills/omc-learned" ]; then
USER_COUNT=$(find "$HOME/.claude/skills/omc-learned" -name "*.md" 2>/dev/null | wc -l)
echo "Total skills: $USER_COUNT"
if [ $USER_COUNT -gt 0 ]; then
echo ""
echo "Skills found:"
find "$HOME/.claude/skills/omc-learned" -name "*.md" -type f -exec sh -c '
FILE="$1"
NAME=$(grep -m1 "^name:" "$FILE" 2>/dev/null | sed "s/name: //")
DESC=$(grep -m1 "^description:" "$FILE" 2>/dev/null | sed "s/description: //")
MODIFIED=$(stat -c "%y" "$FILE" 2>/dev/null || stat -f "%Sm" "$FILE" 2>/dev/null)
echo " - $NAME"
[ -n "$DESC" ] && echo " Description: $DESC"
echo " Modified: $MODIFIED"
echo ""
' sh {} \;
fi
else
echo "Directory not found"
fi
echo ""
echo "=== PROJECT-LEVEL SKILLS (.omc/skills/) ==="
if [ -d ".omc/skills" ]; then
PROJECT_COUNT=$(find ".omc/skills" -name "*.md" 2>/dev/null | wc -l)
echo "Total skills: $PROJECT_COUNT"
if [ $PROJECT_COUNT -gt 0 ]; then
echo ""
echo "Skills found:"
find ".omc/skills" -name "*.md" -type f -exec sh -c '
FILE="$1"
NAME=$(grep -m1 "^name:" "$FILE" 2>/dev/null | sed "s/name: //")
DESC=$(grep -m1 "^description:" "$FILE" 2>/dev/null | sed "s/description: //")
MODIFIED=$(stat -c "%y" "$FILE" 2>/dev/null || stat -f "%Sm" "$FILE" 2>/dev/null)
echo " - $NAME"
[ -n "$DESC" ] && echo " Description: $DESC"
echo " Modified: $MODIFIED"
echo ""
' sh {} \;
fi
else
echo "Directory not found"
fi
# Summary
TOTAL=$((USER_COUNT + PROJECT_COUNT))
echo "=== SUMMARY ==="
echo "Total skills across all directories: $TOTAL"Use the Skill tool to invoke: learnerecho "=== DETAILED SKILL INVENTORY ==="
echo ""
# Function to show skill details
show_skill_details() {
FILE="$1"
LOCATION="$2"
echo "---"
echo "Location: $LOCATION"
echo "File: $(basename "$FILE")"
# Extract frontmatter
NAME=$(grep -m1 "^name:" "$FILE" 2>/dev/null | sed "s/name: //")
DESC=$(grep -m1 "^description:" "$FILE" 2>/dev/null | sed "s/description: //")
TRIGGERS=$(grep -m1 "^triggers:" "$FILE" 2>/dev/null | sed "s/triggers: //")
QUALITY=$(grep -m1 "^quality:" "$FILE" 2>/dev/null | sed "s/quality: //")
[ -n "$NAME" ] && echo "Name: $NAME"
[ -n "$DESC" ] && echo "Description: $DESC"
[ -n "$TRIGGERS" ] && echo "Triggers: $TRIGGERS"
[ -n "$QUALITY" ] && echo "Quality: $QUALITY"
# Last modified
MODIFIED=$(stat -c "%y" "$FILE" 2>/dev/null | cut -d. -f1 || stat -f "%Sm" "$FILE" 2>/dev/null)
echo "Last modified: $MODIFIED"
echo ""
}
# Export function for subshell
export -f show_skill_details
# Show user-level skills
if [ -d "$HOME/.claude/skills/omc-learned" ]; then
echo "USER-LEVEL SKILLS:"
find "$HOME/.claude/skills/omc-learned" -name "*.md" -type f -exec bash -c 'show_skill_details "$0" "user-level"' {} \;
fi
# Show project-level skills
if [ -d ".omc/skills" ]; then
echo "PROJECT-LEVEL SKILLS:"
find ".omc/skills" -name "*.md" -type f -exec bash -c 'show_skill_details "$0" "project-level"' {} \;
fi---
id: error-[unique-id]
name: [Error Name]
description: Solution for [specific error in specific context]
source: conversation
triggers: ["error message fragment", "file path", "symptom"]
quality: high
---
# [Error Name]
## The Insight
What is the underlying cause of this error? What principle did you discover?
## Why This Matters
What goes wrong if you don't know this? What symptom led here?
## Recognition Pattern
How do you know when this applies? What are the signs?
- Error message: "[exact error]"
- File: [specific file path]
- Context: [when does this occur]
## The Approach
Step-by-step solution:
1. [Specific action with file/line reference]
2. [Specific action with file/line reference]
3. [Verification step]
## Example
\`\`\`typescript
// Before (broken)
[problematic code]
// After (fixed)
[corrected code]
\`\`\`---
id: workflow-[unique-id]
name: [Workflow Name]
description: Process for [specific task in this codebase]
source: conversation
triggers: ["task description", "file pattern", "goal keyword"]
quality: high
---
# [Workflow Name]
## The Insight
What makes this workflow different from the obvious approach?
## Why This Matters
What fails if you don't follow this process?
## Recognition Pattern
When should you use this workflow?
- Task type: [specific task]
- Files involved: [specific patterns]
- Indicators: [how to recognize]
## The Approach
1. [Step with specific commands/files]
2. [Step with specific commands/files]
3. [Verification]
## Gotchas
- [Common mistake and how to avoid it]
- [Edge case and how to handle it]---
id: pattern-[unique-id]
name: [Pattern Name]
description: Pattern for [specific use case in this codebase]
source: conversation
triggers: ["code pattern", "file type", "problem domain"]
quality: high
---
# [Pattern Name]
## The Insight
What's the key principle behind this pattern?
## Why This Matters
What problems does this pattern solve in THIS codebase?
## Recognition Pattern
When do you apply this pattern?
- File types: [specific files]
- Problem: [specific problem]
- Context: [codebase-specific context]
## The Approach
Decision-making heuristic, not just code:
1. [Principle-based step]
2. [Principle-based step]
## Example
\`\`\`typescript
[Illustrative example showing the principle]
\`\`\`
## Anti-Pattern
What NOT to do and why:
\`\`\`typescript
[Common mistake to avoid]
\`\`\`---
id: integration-[unique-id]
name: [Integration Name]
description: How [system A] integrates with [system B] in this codebase
source: conversation
triggers: ["system name", "integration point", "config file"]
quality: high
---
# [Integration Name]
## The Insight
What's non-obvious about how these systems connect?
## Why This Matters
What breaks if you don't understand this integration?
## Recognition Pattern
When are you working with this integration?
- Files: [specific integration files]
- Config: [specific config locations]
- Symptoms: [what indicates integration issues]
## The Approach
How to work with this integration correctly:
1. [Configuration step with file paths]
2. [Setup step with specific details]
3. [Verification step]
## Gotchas
- [Integration-specific pitfall #1]
- [Integration-specific pitfall #2]/oh-my-claudecode:local-skills-setup list/oh-my-claudecode:local-skills-setup add/oh-my-claudecode:local-skills-setup scan/oh-my-claudecode:learner/oh-my-claudecode:note/oh-my-claudecode:deepinit> /oh-my-claudecode:local-skills-setup
Checking skill directories...
✓ User skills directory exists: ~/.claude/skills/omc-learned/
✓ Project skills directory exists: .omc/skills/
Scanning for skills...
=== USER-LEVEL SKILLS ===
Total skills: 3
- async-network-error-handling
Description: Pattern for handling independent I/O failures in async network code
Modified: 2026-01-20 14:32:15
- esm-path-resolution
Description: Custom path resolution in ESM requiring fileURLToPath
Modified: 2026-01-19 09:15:42
=== PROJECT-LEVEL SKILLS ===
Total skills: 5
- session-timeout-fix
Description: Fix for sessionId undefined after restart in session.ts
Modified: 2026-01-22 16:45:23
- build-cache-invalidation
Description: When to clear TypeScript build cache to fix phantom errors
Modified: 2026-01-21 11:28:37
=== SUMMARY ===
Total skills: 8
What would you like to do?
1. Add new skill
2. List all skills with details
3. Scan conversation for patterns
4. Import skill
5. Done/oh-my-claudecode:local-skills-setup scan