Slash commands vs skills in Claude Code

Definitie

Claude Code kent twee soorten herbruikbare gedragspatronen: slash commands (~/.claude/commands/) zijn gebruikers-getriggerde prompt-templates die Claude uitvoert bij het typen van /naam, en skills (~/.claude/skills/) zijn Claude-getriggerde reference-documenten die Claude zelf aanroept wanneer een taak matcht met de skill-description.

Context

Bij het bouwen van de project-handoff skill was het niet meteen duidelijk hoe je een skill via een /commando kon aanroepen. De reden: dat kan niet direct. Je maakt een slash command die de skill aanroept als tussenlaag. Dit onderscheid is belangrijk om de tooling bewust in te zetten.

Kernpunten

Slash commands

  • Locatie: ~/.claude/commands/*.md
  • Frontmatter: geen verplichte; de body is een prompt-template
  • Aanroep: gebruiker typt /commando-naam [arguments]
  • Argumenten: $ARGUMENTS in de body wordt vervangen door wat de gebruiker na het commando typt
  • Gebruik: Claude krijgt de body als system-injected instructie en voert hem uit
  • Goed voor: herhaalbare prompts, korte workflows, argument-gebaseerde taken (research, factcheck, transcript)

Skills

  • Locatie: ~/.claude/skills/naam/SKILL.md (mag ook symlink zijn)
  • Frontmatter: verplicht name en description (onder 1024 chars, description begint met “Use when…“)
  • Aanroep: Claude zelf besluit de skill te laden via de Skill tool wanneer de taak matcht met de description
  • Argumenten: geen; context komt uit de conversation
  • Gebruik: skill wordt geladen, Claude volgt de workflow erin
  • Goed voor: complexe workflows, discipline-afdwingende regels, reference documenten

Hoe combineer je ze

Als je een skill via /commando wil laten triggeren: maak een slash command die in de body verwijst naar de skill en de workflow beknopt beschrijft. Voorbeeld:

# ~/.claude/commands/project-handoff.md
Genereer een project handoff voor: $ARGUMENTS (default: cwd).
 
Roep de `project-handoff` skill aan en volg de workflow uit
`~/.claude/skills/project-handoff/SKILL.md`.

Claude krijgt dan het commando binnen, leest de skill, en volgt de workflow. Het beste van beide: gebruiker triggert expliciet, skill bepaalt het hoe.

Waarom niet alles als command schrijven

Slash commands zijn statische prompt-templates. Ze hebben geen test-flow, geen pressure scenarios, geen versioning via frontmatter. Voor simpele herhalingen prima. Voor disciplinair gedrag (secrets filter, TDD, verificatie-voor-klaar) wil je een skill met expliciete red flags en rationalization table.

Waarom niet alles als skill schrijven

Skills worden automatisch door Claude geladen op basis van description-matching. Dat maakt ze reactief op conversatie-inhoud. Als je expliciete gebruikers-controle wil (alleen uitvoeren als iemand typt /commando), is een slash command beter.

In plugins: commands/ en skills/ parallel

Een Claude Code plugin heeft zijn eigen commands/ en skills/ mappen, los van de user-level ~/.claude/commands/ en ~/.claude/skills/. De plugin-structuur:

mijn-plugin/
  .claude-plugin/
    plugin.json
  commands/
    foo.md              -- slash command, invocable als /foo
    bar.md
  skills/
    foo/SKILL.md        -- skill, auto-triggered op description
    bar/SKILL.md

Plugin-skills en plugin-commands zijn alleen beschikbaar wanneer de plugin geïnstalleerd is. Ze worden niet gekopieerd naar ~/.claude/; ze blijven in de plugin-map en worden door Claude Code uit die context geladen.

Valkuil: commando’s die na refactor verdwijnen

Als je tijdens development een commands/foo.md vervangt door een volwaardige skills/foo/SKILL.md, werkt de skill wel (auto-trigger) maar werkt /foo niet meer. Voor externe gebruikers die de README lezen en /foo verwachten is dat een regressie. Dit overkwam eindredacteur tussen v0.3.0 en v0.4.0: skills waren uitgebreid naar 13 stuks maar de oude commands/ was leeggemaakt zonder de README aan te passen.

Thin wrapper pattern

Als je wil dat een plugin zowel /foo als auto-trigger ondersteunt, schrijf een minimale command-wrapper die naar de skill verwijst via ${CLAUDE_PLUGIN_ROOT}:

---
description: <overgenomen uit de skill>
allowed-tools: <overgenomen uit de skill>
---
 
Voer de `foo` skill uit: `${CLAUDE_PLUGIN_ROOT}/skills/foo/SKILL.md`.
 
Volg de werkvolgorde, regels en outputformat exact zoals daar beschreven staan.

${CLAUDE_PLUGIN_ROOT} is een runtime-variabele die Claude Code vult met het absolute pad naar de geïnstalleerde plugin. Het wrapper-bestand bevat geen gedupliceerde workflow-inhoud, alleen de opdracht om de skill te laden. De skill blijft de single source of truth voor het gedrag; het commando is puur een alternatieve invocatie-laag.

Dit patroon schaalt: 13 commands voor 13 skills betekent 13 thin wrappers van elk ~10 regels. Onderhoud concentreert zich in de skill-bestanden. Voor eindredacteur v0.4.1 is dit patroon gebruikt voor alle journalistieke skills (/eindredactie, /transcriptie, /kopij-check, /koppen, /herschrijf, /interviewprep, /invalshoek, /itemsheet, /script, /montage, /sum-aiauth, /sumai, /leguit).

README documentatie-conventie

Noem in de README expliciet dat zowel slash commands als skill-triggers werken, bijvoorbeeld:

De functies zijn aanroepbaar als slash command (/eindredactie) of triggeren automatisch wanneer een matchende opdracht gegeven wordt (“beoordeel dit artikel”).

Zonder die regel raakt een externe gebruiker verward: de commando’s in de README zijn dan een subset van de werkelijke invocatie-mogelijkheden.

Verbanden

Bronnen

Sessie-herkomst