14 KiB
meta.skill - Skill Creator Meta-Agent
Generates complete Betty skills from natural language descriptions.
Overview
meta.skill is a meta-agent that creates fully functional skills from simple description files. It generates skill definitions, Python implementations, tests, and documentation, following Betty Framework conventions.
What it does:
- Parses skill descriptions (Markdown or JSON)
- Generates
skill.yamlconfigurations - Creates Python implementation stubs
- Generates test templates
- Creates comprehensive README documentation
- Validates skill names and structure
- Registers artifact metadata
Quick Start
Create a Skill
# Create skill from description
python3 agents/meta.skill/meta_skill.py examples/my_skill_description.md
Output:
🛠️ meta.skill - Creating skill from examples/my_skill_description.md
✨ Skill 'data.transform' created successfully!
📄 Created files:
- skills/data.transform/skill.yaml
- skills/data.transform/data_transform.py
- skills/data.transform/test_data_transform.py
- skills/data.transform/README.md
✅ Skill 'data.transform' is ready to use
Add to agent skills_available to use it.
Skill Description Format
Create a Markdown file with this structure:
# Name: domain.action
# Purpose:
Brief description of what the skill does
# Inputs:
- input_parameter_1
- input_parameter_2 (optional)
# Outputs:
- output_file_1.json
- output_file_2.yaml
# Permissions:
- filesystem:read
- filesystem:write
# Produces Artifacts:
- artifact-type-1
- artifact-type-2
# Consumes Artifacts:
- artifact-type-3
# Implementation Notes:
Detailed guidance for implementing the skill logic
Or use JSON format:
{
"name": "domain.action",
"purpose": "Brief description",
"inputs": ["param1", "param2"],
"outputs": ["output.json"],
"permissions": ["filesystem:read"],
"artifact_produces": ["artifact-type-1"],
"artifact_consumes": ["artifact-type-2"],
"implementation_notes": "Implementation guidance"
}
Generated Structure
For a skill named data.transform, meta.skill generates:
skills/data.transform/
├── skill.yaml # Skill configuration
├── data_transform.py # Python implementation
├── test_data_transform.py # Test suite
└── README.md # Documentation
skill.yaml
Complete skill configuration following Betty conventions:
name: data.transform
version: 0.1.0
description: Transform data between formats
inputs:
- input_file
- output_format
outputs:
- transformed_data.json
status: active
permissions:
- filesystem:read
- filesystem:write
entrypoints:
- command: /data/transform
handler: data_transform.py
runtime: python
description: Transform data between formats
artifact_metadata:
produces:
- type: transformed-data
consumes:
- type: raw-data
Implementation Stub
Python implementation with:
- Proper imports and logging
- Class structure
- execute() method with typed parameters
- CLI entry point with argparse
- Error handling
- Output formatting (JSON/YAML)
#!/usr/bin/env python3
"""
data.transform - Transform data between formats
Generated by meta.skill
"""
import os
import sys
import json
import yaml
from pathlib import Path
from typing import Dict, List, Any, Optional
from betty.config import BASE_DIR
from betty.logging_utils import setup_logger
logger = setup_logger(__name__)
class DataTransform:
"""Transform data between formats"""
def __init__(self, base_dir: str = BASE_DIR):
"""Initialize skill"""
self.base_dir = Path(base_dir)
def execute(self, input_file: Optional[str] = None,
output_format: Optional[str] = None) -> Dict[str, Any]:
"""Execute the skill"""
try:
logger.info("Executing data.transform...")
# TODO: Implement skill logic here
# Implementation notes: [your notes here]
result = {
"ok": True,
"status": "success",
"message": "Skill executed successfully"
}
logger.info("Skill completed successfully")
return result
except Exception as e:
logger.error(f"Error executing skill: {e}")
return {
"ok": False,
"status": "failed",
"error": str(e)
}
def main():
"""CLI entry point"""
import argparse
parser = argparse.ArgumentParser(
description="Transform data between formats"
)
parser.add_argument("--input-file", help="input_file")
parser.add_argument("--output-format", help="output_format")
parser.add_argument(
"--output-format",
choices=["json", "yaml"],
default="json",
help="Output format"
)
args = parser.parse_args()
skill = DataTransform()
result = skill.execute(
input_file=args.input_file,
output_format=args.output_format,
)
if args.output_format == "json":
print(json.dumps(result, indent=2))
else:
print(yaml.dump(result, default_flow_style=False))
sys.exit(0 if result.get("ok") else 1)
if __name__ == "__main__":
main()
Test Template
pytest-based test suite:
#!/usr/bin/env python3
"""Tests for data.transform"""
import pytest
import sys
import os
from pathlib import Path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")))
from skills.data_transform import data_transform
class TestDataTransform:
"""Tests for DataTransform"""
def setup_method(self):
"""Setup test fixtures"""
self.skill = data_transform.DataTransform()
def test_initialization(self):
"""Test skill initializes correctly"""
assert self.skill is not None
assert self.skill.base_dir is not None
def test_execute_basic(self):
"""Test basic execution"""
result = self.skill.execute()
assert result is not None
assert "ok" in result
assert "status" in result
def test_execute_success(self):
"""Test successful execution"""
result = self.skill.execute()
assert result["ok"] is True
assert result["status"] == "success"
# TODO: Add more specific tests
def test_cli_help(capsys):
"""Test CLI help message"""
sys.argv = ["data_transform.py", "--help"]
with pytest.raises(SystemExit) as exc_info:
data_transform.main()
assert exc_info.value.code == 0
Skill Naming Convention
Skills must follow the domain.action format:
- domain: Category (e.g.,
data,api,file,text) - action: Operation (e.g.,
validate,transform,parse) - Use only lowercase letters and numbers (no hyphens, underscores, or special characters)
Valid examples:
- ✅
data.validate - ✅
api.test - ✅
file.compress - ✅
text.summarize
Invalid examples:
- ❌
data.validate-json(hyphen not allowed) - ❌
data_validate(underscore not allowed) - ❌
DataValidate(uppercase not allowed) - ❌
validate(missing domain)
Usage Examples
Example 1: JSON Validator
Description file (json_validator.md):
# Name: data.validatejson
# Purpose:
Validates JSON files against JSON Schema definitions
# Inputs:
- json_file_path
- schema_file_path (optional)
# Outputs:
- validation_result.json
# Permissions:
- filesystem:read
# Produces Artifacts:
- validation-report
# Implementation Notes:
Use Python's jsonschema library for validation
Create skill:
python3 agents/meta.skill/meta_skill.py json_validator.md
Example 2: API Tester
Description file (api_tester.json):
{
"name": "api.test",
"purpose": "Test API endpoints and generate reports",
"inputs": ["openapi_spec_path", "base_url"],
"outputs": ["test_results.json"],
"permissions": ["network:http"],
"artifact_produces": ["test-report"],
"artifact_consumes": ["openapi-spec"],
"implementation_notes": "Use requests library to test each endpoint"
}
Create skill:
python3 agents/meta.skill/meta_skill.py api_tester.json
Example 3: File Compressor
Description file (file_compressor.md):
# Name: file.compress
# Purpose:
Compress files using various algorithms
# Inputs:
- input_path
- compression_type (gzip, zip, tar.gz)
# Outputs:
- compressed_file
# Permissions:
- filesystem:read
- filesystem:write
# Implementation Notes:
Support gzip, zip, and tar.gz formats using Python standard library
Create skill:
python3 agents/meta.skill/meta_skill.py file_compressor.md
Integration
With meta.agent
Create an agent that uses the skill:
name: data.validator
description: Data validation agent
skills_available:
- data.validatejson # Skill created by meta.skill
With plugin.sync
Sync skills to plugin format:
python3 skills/plugin.sync/plugin_sync.py
This converts skill.yaml to commands in .claude-plugin/plugin.yaml.
Artifact Types
Consumes
- skill-description - Natural language skill requirements
- Pattern:
**/skill_description.md - Format: Markdown or JSON
- Pattern:
Produces
-
skill-definition - Complete skill configuration
- Pattern:
skills/*/skill.yaml - Schema:
schemas/skill-definition.json
- Pattern:
-
skill-implementation - Python implementation code
- Pattern:
skills/*/[skill_module].py
- Pattern:
-
skill-tests - Test suite
- Pattern:
skills/*/test_[skill_module].py
- Pattern:
-
skill-documentation - README documentation
- Pattern:
skills/*/README.md
- Pattern:
Common Workflows
Workflow 1: Create and Test Skill
# 1. Create skill description
cat > my_skill.md <<EOF
# Name: data.parse
# Purpose: Parse structured data from text
# Inputs:
- input_text
# Outputs:
- parsed_data.json
# Permissions:
- filesystem:write
EOF
# 2. Generate skill
python3 agents/meta.skill/meta_skill.py my_skill.md
# 3. Implement logic (edit the generated file)
vim skills/data.parse/data_parse.py
# 4. Run tests
pytest skills/data.parse/test_data_parse.py -v
# 5. Test CLI
python3 skills/data.parse/data_parse.py --help
Workflow 2: Create Skill for Agent
# 1. Create skill
python3 agents/meta.skill/meta_skill.py api_analyzer_skill.md
# 2. Add to agent
echo " - api.analyze" >> agents/api.agent/agent.yaml
# 3. Sync to plugin
python3 skills/plugin.sync/plugin_sync.py
Workflow 3: Batch Create Skills
# Create multiple skills
for desc in skills_to_create/*.md; do
echo "Creating skill from $desc..."
python3 agents/meta.skill/meta_skill.py "$desc"
done
Tips & Best Practices
Skill Descriptions
Be specific about purpose:
# Good
# Purpose: Validate JSON against JSON Schema Draft 07
# Bad
# Purpose: Validate stuff
Include implementation notes:
# Implementation Notes:
Use the jsonschema library. Support Draft 07 schemas.
Provide detailed error messages with line numbers.
Specify optional parameters:
# Inputs:
- required_param
- optional_param (optional)
- another_optional (optional, defaults to 'value')
Parameter Naming
Parameters are automatically sanitized:
- Special characters removed (except
-,_, spaces) - Converted to lowercase
- Spaces and hyphens become underscores
Example conversions:
"Schema File Path (optional)"→schema_file_path_optional"API-Key"→api_key"Input Data"→input_data
Implementation Strategy
- Generate skeleton first - Let meta.skill create structure
- Implement gradually - Add logic to
execute()method - Test incrementally - Run tests after each change
- Update documentation - Keep README current
Artifact Metadata
Always specify artifact types for interoperability:
# Produces Artifacts:
- openapi-spec
- validation-report
# Consumes Artifacts:
- api-requirements
This enables:
- Agent discovery via meta.compatibility
- Pipeline suggestions via meta.suggest
- Workflow orchestration
Troubleshooting
Invalid skill name
Error: Skill name must be in domain.action format: my-skill
Solution: Use format domain.action with only alphanumeric characters:
# Wrong: my-skill, my_skill, MySkill
# Right: data.transform, api.validate
Skill already exists
Error: Skill directory already exists: skills/data.validate
Solution: Remove existing skill or use different name:
rm -rf skills/data.validate
Import errors in generated code
ModuleNotFoundError: No module named 'betty.config'
Solution: Ensure Betty framework is in Python path:
export PYTHONPATH="${PYTHONPATH}:/home/user/betty"
Test failures
ModuleNotFoundError: No module named 'skills.data_validate'
Solution: Run tests from Betty root directory:
cd /home/user/betty
pytest skills/data.validate/test_data_validate.py -v
Architecture
meta.skill
├─ Input: skill-description (Markdown/JSON)
├─ Parser: extract name, purpose, inputs, outputs
├─ Generator: create skill.yaml, Python, tests, README
├─ Validator: check naming conventions
└─ Output: Complete skill directory structure
Next Steps
After creating a skill with meta.skill:
- Implement logic - Add functionality to
execute()method - Write tests - Expand test coverage beyond basic tests
- Add to agent - Include in agent's
skills_available - Sync to plugin - Run plugin.sync to update plugin.yaml
- Test integration - Verify skill works in agent context
- Document usage - Update README with examples
Related Documentation
- META_AGENTS.md - Meta-agent ecosystem
- ARTIFACT_STANDARDS.md - Artifact system
- skill-description schema
- skill-definition schema
How Claude Uses This
Claude can:
- Create skills on demand - "Create a skill that validates YAML files"
- Extend agent capabilities - "Add a JSON validator skill to this agent"
- Build skill libraries - "Create skills for all common data operations"
- Prototype quickly - Test ideas by generating skill scaffolds
meta.skill enables rapid skill development and agent expansion!