Files
claude/skills/skills-perso/SKILL.md
T
bastien c859ae256f feat(effort): entry level on every skill next to its model pin (BDR-108)
- 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
2026-09-29 13:15:41 +02:00

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".
Bash
Read
Glob

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:

  1. External/framework skills are symlinks (gstack, npx skills, third-party) → excluded.
  2. Personal skills are real directories containing a SKILL.md → included.
  3. Machine-generated skills (e.g. find-docs, written by install-plugins.sh) are real dirs but gitignored in the config repo → excluded via git 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

  1. Run the detection command above to get the list of personal skill names.
  2. For each personal skill, read the first 20 lines of its SKILL.md.
  3. Extract description from the YAML frontmatter. Handle BOTH formats:
    • Inline: description: Some text here → take everything after description:
    • Block scalar: description: | → take the next indented line, trimmed
  4. Also extract the agent file it references (the .md filename from ~/.claude/agents/), or — for self-contained skills.
  5. Display a clean table with three columns: Skill, Agent, and Description (first line of description only, trimmed).
  6. 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.sh does; re-run it if an install went sideways.
  • Machine-generated dirs are caught only when ~/.claude/skills resolves into a git repo whose .gitignore marks them; outside that layout they are listed as personal. The stderr excluded: count makes an implausible split visible (e.g. excluded: 0 on a tree known to hold gstack symlinks).
  • Description extract edge cases: plain multi-line YAML (no |/>) is read as first line only. For users of description: | block scalars this is intended; otherwise inspect raw SKILL.md if 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.