546 lines
11 KiB
Markdown
546 lines
11 KiB
Markdown
# Updating Skills
|
|
|
|
Guidance for modifying and maintaining existing Agent Skills in Claude Code.
|
|
|
|
## Quick Update Process
|
|
|
|
### 1. Locate the Skill
|
|
|
|
```bash
|
|
# Personal skills
|
|
ls ~/.claude/skills/*/SKILL.md
|
|
|
|
# Project skills
|
|
ls .claude/skills/*/SKILL.md
|
|
|
|
# Find specific skill
|
|
find ~/.claude/skills -name "SKILL.md" -path "*/my-skill/*"
|
|
```
|
|
|
|
### 2. Edit SKILL.md
|
|
|
|
```bash
|
|
# Personal
|
|
code ~/.claude/skills/my-skill/SKILL.md
|
|
|
|
# Project
|
|
code .claude/skills/my-skill/SKILL.md
|
|
```
|
|
|
|
### 3. Apply Changes
|
|
|
|
Changes take effect the next time Claude Code starts.
|
|
|
|
**If Claude Code is already running**: Restart it to load updates.
|
|
|
|
## Common Update Scenarios
|
|
|
|
### Update Description
|
|
|
|
The description is critical for skill discovery. Update it when:
|
|
- Skill's purpose has expanded
|
|
- Trigger terms need refinement
|
|
- Usage context has changed
|
|
|
|
**Requirements**:
|
|
- Write in third person
|
|
- Include what the skill does AND when to use it
|
|
- Add specific trigger terms
|
|
- Maximum 1024 characters
|
|
|
|
**Before**:
|
|
```yaml
|
|
description: Helps with PDFs
|
|
```
|
|
|
|
**After**:
|
|
```yaml
|
|
description: Extract text and tables from PDF files, fill forms, merge documents. Use when working with PDF files or when the user mentions PDFs, forms, or document extraction.
|
|
```
|
|
|
|
### Update Instructions
|
|
|
|
When adding new features or improving clarity:
|
|
|
|
**Before** (vague):
|
|
```markdown
|
|
## Instructions
|
|
|
|
Process the data and generate output.
|
|
```
|
|
|
|
**After** (specific):
|
|
```markdown
|
|
## Instructions
|
|
|
|
1. Load data from CSV file using pandas:
|
|
```python
|
|
import pandas as pd
|
|
df = pd.read_csv('data.csv')
|
|
```
|
|
|
|
2. Clean data:
|
|
- Remove null values
|
|
- Normalize formats
|
|
- Validate ranges
|
|
|
|
3. Generate summary statistics:
|
|
```python
|
|
summary = df.describe()
|
|
```
|
|
|
|
4. Export results to Excel:
|
|
```python
|
|
summary.to_excel('output.xlsx')
|
|
```
|
|
```
|
|
|
|
### Add Examples
|
|
|
|
Examples improve skill effectiveness. Add input/output pairs:
|
|
|
|
````markdown
|
|
## Examples
|
|
|
|
**Example 1: Simple Extraction**
|
|
Input: PDF with plain text
|
|
Output:
|
|
```python
|
|
import pdfplumber
|
|
with pdfplumber.open("document.pdf") as pdf:
|
|
for page in pdf.pages:
|
|
text = page.extract_text()
|
|
print(text)
|
|
```
|
|
|
|
**Example 2: Table Extraction**
|
|
Input: PDF with tables
|
|
Output:
|
|
```python
|
|
import pdfplumber
|
|
with pdfplumber.open("tables.pdf") as pdf:
|
|
for page in pdf.pages:
|
|
tables = page.extract_tables()
|
|
for table in tables:
|
|
# Process table data
|
|
pass
|
|
```
|
|
````
|
|
|
|
### Add or Update allowed-tools
|
|
|
|
Restrict which tools Claude can use when the skill is active:
|
|
|
|
**Before** (no restrictions):
|
|
```yaml
|
|
---
|
|
name: Data Analyzer
|
|
description: Analyze data files and generate reports
|
|
---
|
|
```
|
|
|
|
**After** (read-only):
|
|
```yaml
|
|
---
|
|
name: Data Analyzer
|
|
description: Analyze data files and generate reports
|
|
allowed-tools: Read, Grep, Glob
|
|
---
|
|
```
|
|
|
|
This ensures Claude can't modify files when using this skill.
|
|
|
|
### Split Large Skills
|
|
|
|
If SKILL.md exceeds 500 lines, use progressive disclosure:
|
|
|
|
**Before** (single large file):
|
|
```markdown
|
|
# PDF Processing
|
|
|
|
## Basic Text Extraction
|
|
[100 lines of content...]
|
|
|
|
## Advanced Table Extraction
|
|
[150 lines of content...]
|
|
|
|
## Form Filling
|
|
[200 lines of content...]
|
|
|
|
## API Reference
|
|
[300 lines of content...]
|
|
```
|
|
|
|
**After** (split into multiple files):
|
|
|
|
```
|
|
pdf-processing/
|
|
├── SKILL.md # Overview and quick start
|
|
├── tables.md # Table extraction guide
|
|
├── forms.md # Form filling guide
|
|
└── reference.md # Complete API docs
|
|
```
|
|
|
|
**SKILL.md**:
|
|
```markdown
|
|
# PDF Processing
|
|
|
|
## Quick Start
|
|
[Brief overview]
|
|
|
|
## Text Extraction
|
|
[Common usage]
|
|
|
|
## Advanced Features
|
|
- **Table Extraction**: See [tables.md](tables.md)
|
|
- **Form Filling**: See [forms.md](forms.md)
|
|
- **Complete API**: See [reference.md](reference.md)
|
|
```
|
|
|
|
### Update Reference Files
|
|
|
|
When updating longer reference files (>100 lines), include a table of contents:
|
|
|
|
```markdown
|
|
# API Reference
|
|
|
|
## Contents
|
|
- Authentication and setup
|
|
- Core methods (create, read, update, delete)
|
|
- Advanced features (batch operations, webhooks)
|
|
- Error handling patterns
|
|
- Code examples
|
|
|
|
## Authentication and Setup
|
|
...
|
|
|
|
## Core Methods
|
|
...
|
|
```
|
|
|
|
## Refactoring Patterns
|
|
|
|
### Make Skills More Concise
|
|
|
|
Remove unnecessary explanations:
|
|
|
|
**Before** (too verbose):
|
|
```markdown
|
|
JSON (JavaScript Object Notation) is a data format that is commonly used
|
|
for APIs and configuration files. It uses key-value pairs and is human-readable.
|
|
To parse JSON in Python, you'll need to import the json module, which is
|
|
part of the standard library so you don't need to install anything extra.
|
|
```
|
|
|
|
**After** (concise):
|
|
```markdown
|
|
Parse JSON:
|
|
```python
|
|
import json
|
|
with open('data.json') as f:
|
|
data = json.load(f)
|
|
```
|
|
```
|
|
|
|
### Improve Terminology Consistency
|
|
|
|
**Before** (inconsistent):
|
|
```markdown
|
|
Use the API endpoint to send a request to the URL. The route will return...
|
|
The path can be accessed via the API...
|
|
```
|
|
|
|
**After** (consistent):
|
|
```markdown
|
|
Use the API endpoint to send a request. The endpoint will return...
|
|
The endpoint can be accessed via...
|
|
```
|
|
|
|
(Always use "API endpoint", never mix with "URL", "route", "path")
|
|
|
|
### Add Workflows for Complex Tasks
|
|
|
|
When users struggle with multi-step processes:
|
|
|
|
````markdown
|
|
## Data Analysis Workflow
|
|
|
|
Copy this checklist and track your progress:
|
|
|
|
```
|
|
Task Progress:
|
|
- [ ] Step 1: Load and validate data
|
|
- [ ] Step 2: Clean and normalize data
|
|
- [ ] Step 3: Perform analysis
|
|
- [ ] Step 4: Generate visualizations
|
|
- [ ] Step 5: Export results
|
|
```
|
|
|
|
**Step 1: Load and validate data**
|
|
```python
|
|
import pandas as pd
|
|
df = pd.read_csv('data.csv')
|
|
assert len(df) > 0, "Data file is empty"
|
|
assert not df.isnull().all().any(), "Column has all null values"
|
|
```
|
|
|
|
**Step 2: Clean and normalize data**
|
|
[Detailed instructions...]
|
|
|
|
**Step 3: Perform analysis**
|
|
[Detailed instructions...]
|
|
|
|
**Step 4: Generate visualizations**
|
|
[Detailed instructions...]
|
|
|
|
**Step 5: Export results**
|
|
[Detailed instructions...]
|
|
````
|
|
|
|
### Add Feedback Loops
|
|
|
|
For error-prone operations:
|
|
|
|
**Before** (no validation):
|
|
```markdown
|
|
1. Make changes to config.json
|
|
2. Deploy application
|
|
3. Test in production
|
|
```
|
|
|
|
**After** (with validation loop):
|
|
```markdown
|
|
1. Make changes to config.json
|
|
2. **Validate immediately**: `python scripts/validate_config.py`
|
|
3. If validation fails:
|
|
- Review error messages
|
|
- Fix issues in config.json
|
|
- Run validation again
|
|
4. **Only proceed when validation passes**
|
|
5. Deploy to staging
|
|
6. Test in staging environment
|
|
7. Deploy to production
|
|
```
|
|
|
|
## Version Management
|
|
|
|
### Document Changes
|
|
|
|
Add a version history section to track updates:
|
|
|
|
```markdown
|
|
# My Skill
|
|
|
|
## Version History
|
|
- v2.1.0 (2025-10-16): Added batch processing support
|
|
- v2.0.0 (2025-10-01): Breaking changes to API
|
|
- v1.1.0 (2025-09-15): Added table extraction
|
|
- v1.0.0 (2025-09-01): Initial release
|
|
|
|
## Instructions
|
|
...
|
|
```
|
|
|
|
### Deprecate Features
|
|
|
|
When removing old approaches:
|
|
|
|
```markdown
|
|
## Current Method
|
|
|
|
Use the v2 API for all new integrations:
|
|
```python
|
|
from api.v2 import Client
|
|
client = Client(api_key="...")
|
|
```
|
|
|
|
## Old Patterns
|
|
|
|
<details>
|
|
<summary>Legacy v1 API (deprecated 2025-08)</summary>
|
|
|
|
The v1 API used a different client:
|
|
```python
|
|
from api.v1 import OldClient # Don't use
|
|
```
|
|
|
|
This API is no longer supported. Migrate to v2.
|
|
</details>
|
|
```
|
|
|
|
## Testing Updates
|
|
|
|
### 1. Verify YAML Syntax
|
|
|
|
After updating frontmatter:
|
|
|
|
```bash
|
|
cat SKILL.md | head -n 10
|
|
```
|
|
|
|
Check:
|
|
- Opening `---` on line 1
|
|
- Closing `---` before markdown content
|
|
- Valid YAML (no tabs, correct indentation)
|
|
- No special characters in unquoted strings
|
|
|
|
### 2. Test Description Changes
|
|
|
|
If you updated the description, test that Claude uses the skill appropriately:
|
|
|
|
Ask questions that match your new description and verify Claude activates the skill.
|
|
|
|
### 3. Check File References
|
|
|
|
If you added or renamed reference files, verify links work:
|
|
|
|
```bash
|
|
cd ~/.claude/skills/my-skill
|
|
|
|
# Check that referenced files exist
|
|
ls -l *.md
|
|
```
|
|
|
|
### 4. Verify Examples Run
|
|
|
|
If you added code examples, test them:
|
|
|
|
```bash
|
|
# Extract and run Python examples
|
|
python test_examples.py
|
|
```
|
|
|
|
## Common Update Mistakes
|
|
|
|
### ❌ Forgetting to Restart
|
|
|
|
**Problem**: Updates don't appear after editing SKILL.md
|
|
|
|
**Solution**: Restart Claude Code to load changes
|
|
|
|
### ❌ Breaking YAML Frontmatter
|
|
|
|
**Problem**: Skill stops working after update
|
|
|
|
**Check**:
|
|
```bash
|
|
cat SKILL.md | head -n 10
|
|
```
|
|
|
|
**Common issues**:
|
|
- Missing closing `---`
|
|
- Tabs instead of spaces
|
|
- Unquoted strings with colons
|
|
- Incorrect indentation
|
|
|
|
### ❌ Making Description Too Generic
|
|
|
|
**Problem**: Skill activates too often or not at all
|
|
|
|
**Before**:
|
|
```yaml
|
|
description: Helps with files
|
|
```
|
|
|
|
**After**:
|
|
```yaml
|
|
description: Analyzes log files and system metrics for performance monitoring, debugging, and diagnostics. Use when analyzing logs, system performance, or troubleshooting issues.
|
|
```
|
|
|
|
### ❌ Adding Too Much Content
|
|
|
|
**Problem**: SKILL.md becomes >500 lines
|
|
|
|
**Solution**: Use progressive disclosure:
|
|
- Keep core instructions in SKILL.md
|
|
- Move detailed content to separate reference files
|
|
- Link to reference files from SKILL.md
|
|
|
|
### ❌ Nested References
|
|
|
|
**Problem**: Claude doesn't find information in deeply nested files
|
|
|
|
**Bad** (too deep):
|
|
```markdown
|
|
# SKILL.md → references advanced.md
|
|
# advanced.md → references details.md
|
|
# details.md → has the actual info
|
|
```
|
|
|
|
**Good** (one level):
|
|
```markdown
|
|
# SKILL.md → directly references all docs
|
|
- advanced.md
|
|
- details.md
|
|
- examples.md
|
|
```
|
|
|
|
## Rollback Strategy
|
|
|
|
### Create Backup Before Major Changes
|
|
|
|
```bash
|
|
# Backup entire skill
|
|
cp -r ~/.claude/skills/my-skill ~/.claude/skills/my-skill.backup
|
|
|
|
# Or just backup SKILL.md
|
|
cp ~/.claude/skills/my-skill/SKILL.md ~/.claude/skills/my-skill/SKILL.md.backup
|
|
```
|
|
|
|
### Restore from Backup
|
|
|
|
```bash
|
|
# Restore entire skill
|
|
rm -rf ~/.claude/skills/my-skill
|
|
mv ~/.claude/skills/my-skill.backup ~/.claude/skills/my-skill
|
|
|
|
# Or just restore SKILL.md
|
|
mv ~/.claude/skills/my-skill/SKILL.md.backup ~/.claude/skills/my-skill/SKILL.md
|
|
```
|
|
|
|
### Use Version Control
|
|
|
|
For project skills (in git repositories):
|
|
|
|
```bash
|
|
# See what changed
|
|
git diff .claude/skills/my-skill/SKILL.md
|
|
|
|
# Revert changes
|
|
git checkout .claude/skills/my-skill/SKILL.md
|
|
|
|
# Commit updates
|
|
git add .claude/skills/my-skill/
|
|
git commit -m "Update my-skill: add batch processing support"
|
|
```
|
|
|
|
## Team Collaboration
|
|
|
|
### Communicate Changes
|
|
|
|
For project skills, notify team members:
|
|
|
|
```bash
|
|
git commit -m "Update PDF skill: add form filling capability
|
|
|
|
- Added form filling workflow
|
|
- Updated description to include 'forms' trigger
|
|
- Added forms.md reference guide
|
|
|
|
Team members should restart Claude Code to get updates."
|
|
|
|
git push
|
|
```
|
|
|
|
### Review Process
|
|
|
|
For shared skills, consider a review process:
|
|
|
|
1. Create feature branch
|
|
2. Update skill
|
|
3. Test thoroughly
|
|
4. Create pull request
|
|
5. Have teammate review
|
|
6. Merge when approved
|
|
7. Team members pull and restart
|