name: auto-skill description: "Evaluate current session for skill-worthy workflows and create reusable skills. Triggers on: auto-skill, create skill from session, save workflow, capture this as a skill." license: MIT allowed-tools: "Read Glob Grep Bash Write Edit" metadata: author: claude-mods depends-on: "skill-creator"
Evaluate the current session and create a reusable skill from complex workflows. Enforces the Agent Skills specification and quality gates.
/auto-skillParse arguments after auto-skill (or /auto-skill):
| User says | Action |
|---|---|
auto-skill (no args) |
Run the full evaluation procedure below |
auto-skill off |
Disable globally: touch ~/.claude/auto-skill.disable and confirm |
auto-skill on |
Enable globally: rm -f ~/.claude/auto-skill.disable and confirm |
auto-skill off --project |
Disable for this project: mkdir -p .claude && touch .claude/auto-skill.disable |
auto-skill on --project |
Enable for this project: rm -f .claude/auto-skill.disable |
auto-skill status |
Show current state (see Status section below) |
When the user runs auto-skill status, check and report:
# Global toggle
[ -f "$HOME/.claude/auto-skill.disable" ] && echo "Global: OFF" || echo "Global: ON"
# Project toggle
[ -f ".claude/auto-skill.disable" ] && echo "Project: OFF" || echo "Project: ON"
# Hook scripts installed?
[ -x "$HOME/.claude/auto-skill/track-tools.sh" ] && echo "Hooks: installed" || echo "Hooks: not installed"
# Active session tracking?
ls /tmp/claude_autoskill_* 2>/dev/null | head -1 && echo "Tracking: active" || echo "Tracking: idle"
Report results in a brief table.
Review the conversation history in the current session. Ask yourself:
bash
ls ~/.claude/skills/ 2>/dev/null; ls .claude/skills/ 2>/dev/null
If ANY answer is no, tell the user: "This session doesn't look like a good skill candidate" and explain which criterion failed. Stop here.
Before creating, check for overlapping skills:
# List existing skill names and descriptions
for f in ~/.claude/skills/*/SKILL.md .claude/skills/*/SKILL.md 2>/dev/null; do
[ -f "$f" ] || continue
name=$(head -10 "$f" | grep '^name:' | sed 's/name: *//')
desc=$(head -10 "$f" | grep '^description:' | sed 's/description: *//' | tr -d '"')
echo "$name: $desc"
done
Block if:
If overlap detected, suggest extending the existing skill instead.
Propose a skill to the user with:
| Field | Value |
|---|---|
| Name | kebab-case, descriptive, matches what it does |
| Description | 1-2 sentences with trigger keywords |
| Procedure | Numbered steps extracted from the session workflow |
| Tools needed | Which tools the skill requires |
Ask the user to confirm or adjust before creating.
Before writing, validate:
| Gate | Requirement | Why |
|---|---|---|
| Name format | ^[a-z][a-z0-9-]*$, 1-64 chars |
Agent Skills spec |
| Description | Non-empty, 1-1024 chars, includes trigger phrases | Spec + discovery |
| Procedure | Must contain numbered steps, ## Procedure/## Steps, or checkboxes |
Ensures actionable content |
| Min content | 200+ characters in body (after frontmatter) | Rejects trivial stubs |
| License | license: MIT |
claude-mods convention |
| Metadata | metadata.author: claude-mods |
claude-mods convention |
| No non-standard top-level keys | Only name, description, license, compatibility, allowed-tools, metadata |
Agent Skills spec |
If any gate fails, explain which one and help the user fix it.
Write the skill to the project's skill directory:
.claude/skills/<skill-name>/
SKILL.md
scripts/.gitkeep
references/.gitkeep
assets/.gitkeep
SKILL.md frontmatter template (Agent Skills spec compliant):
---
name: <kebab-case-name>
description: "<what it does>. Triggers on: <keyword1>, <keyword2>, <keyword3>."
license: MIT
allowed-tools: "<space-delimited tool list>"
metadata:
author: claude-mods
---
Body structure:
# <Skill Title>
<1-2 sentence overview>
## When to Use
- <trigger condition 1>
- <trigger condition 2>
## Procedure
1. <Step one>
2. <Step two>
3. <Step three>
...
## Notes
<Edge cases, caveats, or tips>
After creating, verify the skill:
bash
head -20 .claude/skills/<name>/SKILL.md
touch .claude/auto-skill.disable # Disable Stop hook suggestions
rm .claude/auto-skill.disable # Re-enable
The skill itself can always be invoked manually regardless of this setting.
Auto-skill uses two hooks for automatic suggestions. These are installed globally:
~/.claude/auto-skill/
track-tools.sh # PostToolUse: counts tool calls per session
evaluate.sh # Stop: suggests skill creation if complex enough
Both hooks fail silently - they will never produce error output or block Claude.
Add to ~/.claude/settings.json (merge with existing hooks):
{
"hooks": {
"PostToolUse": [{
"matcher": "*",
"hooks": [{
"type": "command",
"command": "bash \"$HOME/.claude/auto-skill/track-tools.sh\"",
"timeout": 2
}]
}],
"Stop": [{
"hooks": [{
"type": "command",
"command": "bash \"$HOME/.claude/auto-skill/evaluate.sh\"",
"timeout": 5
}]
}]
}
}
The Stop hook only suggests skill creation when ALL of these pass:
| Gate | Threshold | Rationale |
|---|---|---|
| Mutating ops | 8+ | High bar reduces noise from routine edits |
| Tool diversity | 4+ distinct types | Write+Edit+Bash+Agent = workflow; Write*20 = repetitive |
| No skill loaded | Skill tool absent |
If following a skill, work isn't novel |
| Per-session | Once per session | Never nags on resume/continue |
| Not disabled | No .disable file |
Global or per-project toggle |
Read-only tools (Read, Glob, Grep, LS, Task*) are excluded from counts.
2>/dev/null and always exit 0.