Skill Spec Audit
Check installed skills against the agentskills.io specification and local conventions for metadata completeness.
Arguments
- Skill names: tokens after the command -> filter to those skills only
- --fix: automatically add missing fields (prompts for values)
- Default: scan all non-symlinked skills in
~/.claude/skills/
Spec Requirements (agentskills.io)
| Field |
Required |
Notes |
name |
Yes |
1-64 chars, lowercase, hyphens only, must match directory name |
description |
Yes |
1-1024 chars, non-empty |
compatibility |
No |
Max 500 chars, environment requirements |
metadata |
No |
Arbitrary key-value map |
allowed-tools |
No |
Space-delimited tool list (experimental) |
Naming Conventions
Skill names follow the pattern: [scope]-[platform/org]-[group]-<name-with-layer-suffix>
Rules
- Lowercase, kebab-case, no consecutive hyphens, 2-4 words, max 40 chars
- Suffix encodes the layer (see "Layer Conventions" below)
- Standardized action synonyms:
audit (compliance), scan (broad analysis), search (lookup), triage (classify+act)
Scope prefix (required)
Derived from metadata.scope:
| Scope |
Prefix |
Example |
personal |
p- |
p-slack-triage, p-daily-standup |
organization |
o- |
o-org-release-digest |
generic |
(none) |
skill-spec-audit, gh-dep-pr-triage |
Platform prefix (when single-platform dependent)
| Platform |
Prefix |
When to use |
| GitHub |
gh- |
Skill requires gh CLI or GitHub API |
| Git |
git- |
Skill requires git but not GitHub |
| Slack |
slack- |
Skill requires Slack MCP server |
| Google Workspace |
gws- |
Skill requires gws CLI |
Multi-platform or general skills stay unprefixed. If a skill touches 2+ platforms, no platform prefix — the scope prefix alone is enough.
Group prefix (when 2+ skills share a domain)
| Group |
Skills in group |
daily- |
standup, report, reflection |
skill- |
dry-run, prereq-audit, spec-audit |
blog- |
writer, post-mining |
oss- |
release, release-prep |
org- |
release-digest, incident-investigation, sync-skills-to-plugins |
When creating a new skill, check for existing siblings. If a second skill appears in the same domain, retroactively add a shared prefix to both.
Layer Conventions
Every skill is exactly one of four layers, declared via metadata.layer. The
suffix of the name must match the layer.
| Layer |
metadata.layer |
Suffix family |
Example |
| Primitive |
primitive |
verb: -read, -list, -fetch, -search, -post, -insert, -append, -query, -get, -scan |
gws-sheets-read |
| Renderer |
renderer |
format noun (-slides, -docs, -pdf, -card, -message) or agent noun (-writer, -explainer, -namer, -generator) |
gws-slides, visual-explainer |
| Workflow |
workflow |
outcome noun: -digest, -deck, -report, -triage, -audit, -standup, -prep, -recap, -investigation |
o-tailor-allhands-deck |
| Reference |
reference |
-shared |
o-tailor-shared |
Reference skills must:
- End in
-shared.
- Begin their description with:
"Internal reference loaded by other <prefix>-* skills. Do not invoke directly."
- Not appear in user-facing trigger phrases.
See ~/.claude/skills/CONVENTIONS.md for full rationale.
Local Conventions (beyond spec)
These are project-specific conventions enforced on top of the spec:
| Field |
Expected |
Values |
argument-hint |
If skill accepts args |
Short usage hint string |
metadata.author |
Always |
Must be present (non-empty) |
metadata.scope |
Always |
generic, personal, or organization |
metadata.layer |
Always |
primitive, renderer, workflow, or reference |
metadata.confirms |
If skill has side effects |
List of operations requiring user confirmation |
Workflow
Phase 1: Discover Skills
- Glob for
~/.claude/skills/*/SKILL.md
- Also check
.claude/skills/*/SKILL.md (project-level)
- Skip symlinks — those point to
.agents/skills/ and have their own conventions
- If user specified skill names, filter to matching directories
- Read each SKILL.md frontmatter
Phase 2: Validate Each Skill
For each SKILL.md, check:
Spec compliance:
name exists, matches directory name, is lowercase with hyphens only, no consecutive hyphens, 1-64 chars
description exists, is non-empty, 1-1024 chars
compatibility exists (warn if missing — not required by spec but expected locally)
Naming conventions:
- Scope prefix matches
metadata.scope: p- for personal, o- for organization, none for generic
- Platform prefix present if skill depends on a single platform (
gh-, git-, slack-, gws-)
- No platform prefix if skill uses 2+ platforms
- Action synonym is standardized:
audit not review/check, scan not inspect
- No single-word names (must have at least one hyphen)
- Max 40 chars, 2-4 words
- Abbreviations only from allowlist:
pr, cli, oss, dep, mcp, gh, gws
Local conventions:
metadata.author is present and non-empty
metadata.scope is one of: generic, personal, organization
metadata.confirms exists if the skill body references any of these patterns:
- Slack:
send_message, post message, post to Slack
- Git:
git commit, git push, create commit, push to remote
- GitHub:
merge, approve, create PR, create issue, create release, gh release
- Calendar:
create event, insert event
- Files:
save to, write to, create file
- Install:
brew install, install
argument-hint exists if the skill body references arg parsing, ## Arguments, or accepts parameters
Phase 3: Report
Print a table:
## Skill Spec Audit
| Skill | name | naming | desc | compat | author | scope | confirms | arg-hint | Issues |
|-------|------|--------|------|--------|--------|-------|----------|----------|--------|
| gh-dep-pr-triage | ok | ok | ok | ok | ok | ok | ok | — | 0 |
| p-blog-writer | ok | ok | ok | ok | ok | ok | ok | ok | 0 |
| new-skill | ok | MISS:scope-prefix | ok | MISS | MISS | MISS | WARN | — | 4 |
Legend: ok = present and valid, MISS = missing, WARN = likely needed but missing, — = not applicable
Summary: N skills checked, M fully compliant, X issues found
Phase 4: Fix (if --fix or user asks)
For each issue, prompt the user for the value or infer it:
| Field |
Inference strategy |
compatibility |
Scan for CLI tools, MCP servers in body -> suggest "Requires X, Y" |
metadata.author |
Infer from existing skills or ask user |
metadata.scope |
Ask user: generic, personal, or organization? |
metadata.confirms |
Extract side-effect patterns from body, present list for confirmation |
argument-hint |
Extract from ## Arguments section if present, otherwise ask |
After fixing, use Edit to insert missing fields before the closing ---.
Re-run validation and show updated table.
Determining metadata.scope
| Scope |
Criteria |
generic |
Works for anyone, no personal/org-specific data |
personal |
References your specific accounts, channels, search terms, voice |
organization |
References company repos, internal tools, team-specific workflows |
Determining metadata.confirms
Only add confirms if the skill can perform irreversible or externally-visible operations. Read-only skills (scanning, searching, reporting) do NOT need confirms.
Common confirms patterns:
| Operation |
confirms entry |
| Post Slack message |
send Slack messages |
| Merge PR |
merge PRs |
| Approve PR |
approve PRs |
| Create GitHub issue |
create GitHub issues |
| Create GitHub release |
create GitHub releases |
| Create calendar event |
create calendar event |
| Git commit |
create git commit |
| Git push |
push to remote |
| Write files |
save to filesystem |
| Install tools |
install missing tools |
| Create PR |
create PR |
| Modify settings |
modify settings files |
1---2name: claude-skill-spec-audit3description: Audit skill SKILL.md files for compliance with the agentskills.io specification and house conventions. Checks frontmatter fields (name, description, compatibility, metadata, argument-hint), metadata sub-fields (author, scope, layer, confirms), and layer/suffix consistency. Use when adding new skills, reviewing skill quality, or ensuring all skills follow the spec. Triggers: "audit skills", "check skill spec", "skill compliance", "are my skills up to spec", "/claude-skill-spec-audit".4license: MIT5---67# Skill Spec Audit89Check installed skills against the [agentskills.io specification](https://agentskills.io/specification) and local conventions for metadata completeness.1011## Arguments1213- **Skill names**: tokens after the command -> filter to those skills only14- **--fix**: automatically add missing fields (prompts for values)15- **Default**: scan all non-symlinked skills in `~/.claude/skills/`1617## Spec Requirements (agentskills.io)1819| Field | Required | Notes |20| --------------- | -------- | -------------------------------------------------------------- |21| `name` | Yes | 1-64 chars, lowercase, hyphens only, must match directory name |22| `description` | Yes | 1-1024 chars, non-empty |23| `compatibility` | No | Max 500 chars, environment requirements |24| `metadata` | No | Arbitrary key-value map |25| `allowed-tools` | No | Space-delimited tool list (experimental) |2627## Naming Conventions2829Skill names follow the pattern: `[scope]-[platform/org]-[group]-<name-with-layer-suffix>`3031### Rules32331. Lowercase, kebab-case, no consecutive hyphens, 2-4 words, max 40 chars342. **Suffix encodes the layer** (see "Layer Conventions" below)353. Standardized action synonyms: `audit` (compliance), `scan` (broad analysis), `search` (lookup), `triage` (classify+act)3637### Scope prefix (required)3839Derived from `metadata.scope`:4041| Scope | Prefix | Example |42| -------------- | ------ | -------------------------------------- |43| `personal` | `p-` | `p-slack-triage`, `p-daily-standup` |44| `organization` | `o-` | `o-org-release-digest` |45| `generic` | (none) | `skill-spec-audit`, `gh-dep-pr-triage` |4647### Platform prefix (when single-platform dependent)4849| Platform | Prefix | When to use |50| ---------------- | -------- | ------------------------------------- |51| GitHub | `gh-` | Skill requires `gh` CLI or GitHub API |52| Git | `git-` | Skill requires git but not GitHub |53| Slack | `slack-` | Skill requires Slack MCP server |54| Google Workspace | `gws-` | Skill requires `gws` CLI |5556**Multi-platform or general skills stay unprefixed.** If a skill touches 2+ platforms, no platform prefix — the scope prefix alone is enough.5758### Group prefix (when 2+ skills share a domain)5960| Group | Skills in group |61| -------- | -------------------------------------------------------------- |62| `daily-` | standup, report, reflection |63| `skill-` | dry-run, prereq-audit, spec-audit |64| `blog-` | writer, post-mining |65| `oss-` | release, release-prep |66| `org-` | release-digest, incident-investigation, sync-skills-to-plugins |6768When creating a new skill, check for existing siblings. If a second skill appears in the same domain, retroactively add a shared prefix to both.6970### Layer Conventions7172Every skill is exactly one of four **layers**, declared via `metadata.layer`. The73**suffix** of the name must match the layer.7475| Layer | `metadata.layer` | Suffix family | Example |76| --- | --- | --- | --- |77| Primitive | `primitive` | verb: `-read`, `-list`, `-fetch`, `-search`, `-post`, `-insert`, `-append`, `-query`, `-get`, `-scan` | `gws-sheets-read` |78| Renderer | `renderer` | format noun (`-slides`, `-docs`, `-pdf`, `-card`, `-message`) or agent noun (`-writer`, `-explainer`, `-namer`, `-generator`) | `gws-slides`, `visual-explainer` |79| Workflow | `workflow` | outcome noun: `-digest`, `-deck`, `-report`, `-triage`, `-audit`, `-standup`, `-prep`, `-recap`, `-investigation` | `o-tailor-allhands-deck` |80| Reference | `reference` | `-shared` | `o-tailor-shared` |8182**Reference skills** must:8384- End in `-shared`.85- Begin their description with: `"Internal reference loaded by other <prefix>-* skills. Do not invoke directly."`86- Not appear in user-facing trigger phrases.8788See [`~/.claude/skills/CONVENTIONS.md`](../CONVENTIONS.md) for full rationale.8990## Local Conventions (beyond spec)9192These are project-specific conventions enforced on top of the spec:9394| Field | Expected | Values |95| ------------------- | ------------------------- | ------------------------------------------------------------ |96| `argument-hint` | If skill accepts args | Short usage hint string |97| `metadata.author` | Always | Must be present (non-empty) |98| `metadata.scope` | Always | `generic`, `personal`, or `organization` |99| `metadata.layer` | Always | `primitive`, `renderer`, `workflow`, or `reference` |100| `metadata.confirms` | If skill has side effects | List of operations requiring user confirmation |101102## Workflow103104### Phase 1: Discover Skills1051061. Glob for `~/.claude/skills/*/SKILL.md`1072. Also check `.claude/skills/*/SKILL.md` (project-level)1083. **Skip symlinks** — those point to `.agents/skills/` and have their own conventions1094. If user specified skill names, filter to matching directories1105. Read each SKILL.md frontmatter111112### Phase 2: Validate Each Skill113114For each SKILL.md, check:115116**Spec compliance:**1171181. `name` exists, matches directory name, is lowercase with hyphens only, no consecutive hyphens, 1-64 chars1192. `description` exists, is non-empty, 1-1024 chars1203. `compatibility` exists (warn if missing — not required by spec but expected locally)121122**Naming conventions:**1231244. Scope prefix matches `metadata.scope`: `p-` for personal, `o-` for organization, none for generic1255. Platform prefix present if skill depends on a single platform (`gh-`, `git-`, `slack-`, `gws-`)1266. No platform prefix if skill uses 2+ platforms1277. Action synonym is standardized: `audit` not `review`/`check`, `scan` not `inspect`1288. No single-word names (must have at least one hyphen)1299. Max 40 chars, 2-4 words13010. Abbreviations only from allowlist: `pr`, `cli`, `oss`, `dep`, `mcp`, `gh`, `gws`131132**Local conventions:**13313411. `metadata.author` is present and non-empty13512. `metadata.scope` is one of: `generic`, `personal`, `organization`13613. `metadata.confirms` exists if the skill body references any of these patterns:137138- Slack: `send_message`, `post message`, `post to Slack`139- Git: `git commit`, `git push`, `create commit`, `push to remote`140- GitHub: `merge`, `approve`, `create PR`, `create issue`, `create release`, `gh release`141- Calendar: `create event`, `insert event`142- Files: `save to`, `write to`, `create file`143- Install: `brew install`, `install`1441457. `argument-hint` exists if the skill body references arg parsing, `## Arguments`, or accepts parameters146147### Phase 3: Report148149Print a table:150151```152## Skill Spec Audit153154| Skill | name | naming | desc | compat | author | scope | confirms | arg-hint | Issues |155|-------|------|--------|------|--------|--------|-------|----------|----------|--------|156| gh-dep-pr-triage | ok | ok | ok | ok | ok | ok | ok | — | 0 |157| p-blog-writer | ok | ok | ok | ok | ok | ok | ok | ok | 0 |158| new-skill | ok | MISS:scope-prefix | ok | MISS | MISS | MISS | WARN | — | 4 |159160Legend: ok = present and valid, MISS = missing, WARN = likely needed but missing, — = not applicable161Summary: N skills checked, M fully compliant, X issues found162```163164### Phase 4: Fix (if --fix or user asks)165166For each issue, prompt the user for the value or infer it:167168| Field | Inference strategy |169| ------------------- | --------------------------------------------------------------------- |170| `compatibility` | Scan for CLI tools, MCP servers in body -> suggest "Requires X, Y" |171| `metadata.author` | Infer from existing skills or ask user |172| `metadata.scope` | Ask user: generic, personal, or organization? |173| `metadata.confirms` | Extract side-effect patterns from body, present list for confirmation |174| `argument-hint` | Extract from `## Arguments` section if present, otherwise ask |175176After fixing, use Edit to insert missing fields before the closing `---`.177178Re-run validation and show updated table.179180## Determining `metadata.scope`181182| Scope | Criteria |183| -------------- | ----------------------------------------------------------------- |184| `generic` | Works for anyone, no personal/org-specific data |185| `personal` | References your specific accounts, channels, search terms, voice |186| `organization` | References company repos, internal tools, team-specific workflows |187188## Determining `metadata.confirms`189190Only add `confirms` if the skill can perform **irreversible or externally-visible operations**. Read-only skills (scanning, searching, reporting) do NOT need confirms.191192Common confirms patterns:193194| Operation | confirms entry |195| --------------------- | ------------------------ |196| Post Slack message | `send Slack messages` |197| Merge PR | `merge PRs` |198| Approve PR | `approve PRs` |199| Create GitHub issue | `create GitHub issues` |200| Create GitHub release | `create GitHub releases` |201| Create calendar event | `create calendar event` |202| Git commit | `create git commit` |203| Git push | `push to remote` |204| Write files | `save to filesystem` |205| Install tools | `install missing tools` |206| Create PR | `create PR` |207| Modify settings | `modify settings files` |