- lib/effort-pins.txt (map) + lib/effort-pins.sh (idempotent re-apply) replace the hardcoded brainstorming/writing-plans loop; called after the last vendoring step of install-plugins.sh AND update-all.sh (the resync dropped the pins until the next make plugin) - design stack high uniform (last loaded wins), superpowers, agent-skills, 21st pack pinned from the map; skills-perso low, pdf-translate medium, site-motion high - doctrine: design stack loads paired with the first Read; one level per stack (CLAUDE.global.md, lib/effort-shift.md) - lib/effort-audit.py prints thinking coverage per scope (sub-agent records carry no thinking count on ~94 % of requests) - census map-driven + fixture suite lib/tests/effort-pins.test.sh; docs README/USAGE/CHANGELOG; contract + TODO plan
4.0 KiB
4.0 KiB
name, effort, description, argument-hint, allowed-tools
| name | effort | description | argument-hint | allowed-tools | |||
|---|---|---|---|---|---|---|---|
| skills-perso | low | List personal (user-created) skills from ~/.claude/skills/. Excludes framework/gstack skills and symlinked/external skills. Shows only skills the user wrote themselves. Trigger: "skills-perso", "mes skills", "list my skills", "quels skills", "skills perso". |
|
skills-perso
List only user-created skills from ~/.claude/skills/, excluding framework
(gstack) skills, symlinked directories, and external skills.
How to detect user-created skills
The install convention (link.sh) IS the discriminator — no content heuristics:
- External/framework skills are symlinks (gstack, npx skills, third-party) → excluded.
- Personal skills are real directories containing a
SKILL.md→ included. - Machine-generated skills (e.g.
find-docs, written byinstall-plugins.sh) are real dirs but gitignored in the config repo → excluded viagit check-ignore.
Run this command to get the list of personal skills:
SKILLS_DIR=$(readlink -f ~/.claude/skills) # resolves into the config repo when wired by link.sh
found=0 excluded=0
for dir in ~/.claude/skills/*/; do
d=${dir%/}
skill=$(basename "$d")
if [ -L "$d" ]; then excluded=$((excluded + 1)); continue; fi # symlink = external/framework
if [ ! -f "$d/SKILL.md" ]; then excluded=$((excluded + 1)); continue; fi # container dir, not a skill
if git -C "$SKILLS_DIR" check-ignore -q "$skill" 2>/dev/null; then
excluded=$((excluded + 1)); continue # gitignored = machine-generated
fi
echo "$skill"
found=$((found + 1))
done
echo "(excluded: $excluded external/framework/generated)" >&2
if [ "$found" -eq 0 ]; then
echo "⚠️ No personal skills detected. Either none exist yet, or ~/.claude/skills" >&2
echo " is not wired by link.sh (externals must be symlinks for this split to hold)." >&2
exit 1
fi
Steps
- Run the detection command above to get the list of personal skill names.
- For each personal skill, read the first 20 lines of its
SKILL.md. - Extract
descriptionfrom the YAML frontmatter. Handle BOTH formats:- Inline:
description: Some text here→ take everything afterdescription: - Block scalar:
description: |→ take the next indented line, trimmed
- Inline:
- Also extract the agent file it references (the
.mdfilename from~/.claude/agents/), or—for self-contained skills. - Display a clean table with three columns: Skill, Agent, and Description (first line of description only, trimmed).
- At the end, show the total count of personal skills (and mention how many framework skills were excluded).
Output format
## Personal Skills (~/.claude/skills/)
| Skill | Agent | Description |
|-------|-------|-------------|
| feat | feater.md | Small feature implementation (1-5 files)... |
| ... | ... | ... |
**Total: N personal skills** (M framework/external skills excluded)
Keep descriptions to one line (~80 chars max, truncate with "..." if needed).
Known limits of the detection heuristic
- False positive: a framework skill COPIED (not symlinked) into
~/.claude/skills/reads as personal. Mitigation: keep externals symlinked —link.shdoes; re-run it if an install went sideways. - Machine-generated dirs are caught only when
~/.claude/skillsresolves into a git repo whose.gitignoremarks them; outside that layout they are listed as personal. The stderrexcluded:count makes an implausible split visible (e.g.excluded: 0on a tree known to hold gstack symlinks). - Description extract edge cases: plain multi-line YAML (no
|/>) is read as first line only. For users ofdescription: |block scalars this is intended; otherwise inspect rawSKILL.mdif a description looks truncated. - Override: to adopt a framework skill as your own, fork it into a real
directory under
~/.claude/skills/(drop the symlink). The fork is then yours to maintain and is listed as personal.