# List Skills

> List all available skills with their descriptions. Use: /list-skills

- Skill: `demithras/list-skills` (Agent Skill)
- Install (CLI): `npx skillmds@latest add demithras/list-skills`
- Raw SKILL.md: https://api.skillmd.com/api/skills/demithras/list-skills/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: demithras (https://skillmd.com/u/demithras)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/demithras/list-skills

---


# /list-skills — Skill Discovery

> **TL;DR**: Show all available skills across project and global scopes.

---

## Usage

```
/list-skills                # List all skills (project + global)
/list-skills --scope=project  # Only project skills (.claude/skills/)
/list-skills --scope=global   # Only global skills (~/.claude/skills/)
/list-skills --all          # Include experimental skills
```

---

## Scope Hierarchy

| Scope | Location | Priority |
|-------|----------|----------|
| **Project** | `.claude/skills/` | Higher (overrides global) |
| **Global** | `~/.claude/skills/` | Lower (default fallback) |

**Override rule**: If same skill name exists in both scopes, project version wins.

---

## Execution

```
1. PARSE flags:
   scope_filter = PARSE --scope flag (default: "all")
   include_experimental = PARSE --all flag (default: false)

2. COLLECT skills:
   skills = []

   # Global skills first (lower priority)
   IF scope_filter IN ["all", "global"]:
       FOR EACH path IN Glob("~/.claude/skills/*/SKILL.md"):
           IF "_experimental" IN path AND NOT include_experimental:
               CONTINUE
           skill = PARSE_SKILL(path)
           skill.scope = "global"
           skills.push(skill)

   # Project skills second (higher priority, override global)
   IF scope_filter IN ["all", "project"]:
       FOR EACH path IN Glob(".claude/skills/*/SKILL.md"):
           IF "_experimental" IN path AND NOT include_experimental:
               CONTINUE
           skill = PARSE_SKILL(path)
           skill.scope = "project"

           # Check for override
           existing = skills.find(s => s.name == skill.name)
           IF existing:
               existing.overridden = true
               skill.overrides = existing.name

           skills.push(skill)

3. PARSE_SKILL(path):
   content = Read(path)
   frontmatter = EXTRACT YAML between ---
   RETURN {
       name: frontmatter.name,
       description: frontmatter.description,
       version: frontmatter.version,
       path: path,
       scope: null  # set by caller
   }

4. OUTPUT formatted table with scope indicators
```

---

## Output Format

```markdown
## Available Skills

| Skill | Scope | Description | Version |
|-------|-------|-------------|---------|
| /meta | 📁 project | Strategic decision analysis | 3.0.0 |
| /skill-check | 📁 project | Validate skill quality | 1.0.0 |
| /retro | 📁 project | Session retrospective | 2.1.0 |
| /commit | 🌐 global | Git commit helper | 1.0.0 |
| /review | 🌐 global | Code review | 1.0.0 |

**Total**: 3 project + 2 global = 5 skills

### Overrides
| Project Skill | Overrides Global |
|---------------|------------------|
| /meta | ~/.claude/skills/meta |
```

---

## Scope Indicators

| Icon | Meaning |
|------|---------|
| 📁 | Project scope (`.claude/skills/`) |
| 🌐 | Global scope (`~/.claude/skills/`) |
| ⚠️ | Overridden (global skill hidden by project) |

---

## Notes

- Skills in `_experimental/` hidden by default (use `--all`)
- Project skills take precedence over global with same name
- Use `/skill-check <name>` to validate any skill
- Use `/skill-farm` to create or improve skills

