Best practices for bundling scripts in skills including error handling, constants documentation, and execution patterns. Use when creating script-enabled skills.
Script Best Practices
Guidelines for bundling executable scripts in skills.
When to Bundle Scripts
Bundle scripts when:
- Same code would be rewritten repeatedly
- Deterministic reliability needed
- Complex validation required
- Token cost of generation exceeds execution cost
Error Handling
Always handle errors explicitly rather than punting to Claude:
# Good: Handle errors explicitly
def process(path):
try:
with open(path) as f:
return f.read()
except FileNotFoundError:
print(f"Creating {path}")
with open(path, 'w') as f:
f.write('')
return ''
except PermissionError:
print(f"ERROR: Cannot access {path} - check permissions")
return None
# Bad: Let errors propagate unexpectedly
def process(path):
with open(path) as f:
return f.read() # Will crash on missing file
Document Constants
Every magic number needs rationale:
# Good: Document constants
TIMEOUT = 30 # HTTP requests typically complete in 30s
MAX_RETRIES = 3 # Most failures resolve by second retry
BATCH_SIZE = 100 # Balance between memory and API calls
# Bad: Magic numbers
TIMEOUT = 47 # Why 47?
MAX_RETRIES = 3 # Why 3?
Clarify Intent in SKILL.md
Be explicit about how scripts should be used:
Execute the script:
Run `scripts/analyze.py` to extract form fields from the PDF.
Read as reference:
See `scripts/analyze.py` for the extraction algorithm (do not run directly).
Script Organization
skill-name/
SKILL.md
scripts/
analyze.py # Main entry point
validate.py # Validation utilities
helpers/ # Shared utilities
formatting.py
parsing.py
Dependencies
Always list dependencies explicitly:
## Requirements
Before running scripts:
```bash
pip install pdfplumber python-docx
Or with the provided requirements file:
pip install -r scripts/requirements.txt
## Exit Codes
Use consistent exit codes:
```python
import sys
EXIT_SUCCESS = 0
EXIT_INVALID_INPUT = 1
EXIT_FILE_NOT_FOUND = 2
EXIT_PERMISSION_ERROR = 3
def main():
if not validate_input():
sys.exit(EXIT_INVALID_INPUT)
# ... process ...
sys.exit(EXIT_SUCCESS)
Output Formatting
Make output parseable:
# Good: Structured output
import json
result = {
"status": "success",
"files_processed": 5,
"errors": []
}
print(json.dumps(result))
# Bad: Unstructured output
print("Done! Processed 5 files with no errors.")
Idempotency
Scripts should be safe to run multiple times:
def ensure_directory(path):
"""Create directory if it doesn't exist (idempotent)."""
os.makedirs(path, exist_ok=True)
def write_if_changed(path, content):
"""Only write if content differs (idempotent)."""
if os.path.exists(path):
with open(path) as f:
if f.read() == content:
return False # No change needed
with open(path, 'w') as f:
f.write(content)
return True
You Might Also Like
Related Skills

coding-agent
Run Codex CLI, Claude Code, OpenCode, or Pi Coding Agent via background process for programmatic control.
openclaw
add-uint-support
Add unsigned integer (uint) type support to PyTorch operators by updating AT_DISPATCH macros. Use when adding support for uint16, uint32, uint64 types to operators, kernels, or when user mentions enabling unsigned types, barebones unsigned types, or uint support.
pytorch
at-dispatch-v2
Convert PyTorch AT_DISPATCH macros to AT_DISPATCH_V2 format in ATen C++ code. Use when porting AT_DISPATCH_ALL_TYPES_AND*, AT_DISPATCH_FLOATING_TYPES*, or other dispatch macros to the new v2 API. For ATen kernel files, CUDA kernels, and native operator implementations.
pytorch
skill-writer
Guide users through creating Agent Skills for Claude Code. Use when the user wants to create, write, author, or design a new Skill, or needs help with SKILL.md files, frontmatter, or skill structure.
pytorch
implementing-jsc-classes-cpp
Implements JavaScript classes in C++ using JavaScriptCore. Use when creating new JS classes with C++ bindings, prototypes, or constructors.
oven-sh
implementing-jsc-classes-zig
Creates JavaScript classes using Bun's Zig bindings generator (.classes.ts). Use when implementing new JS APIs in Zig with JSC integration.
oven-sh