From epieczko-betty
Compare current and previous versions of skills/agents and report differences.
npx claudepluginhub joshuarweaver/cascade-code-general-misc-1 --plugin epieczko-bettyThis skill uses the workspace's default tool permissions.
Compare current and previous versions of skills/agents and report differences.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
Compare current and previous versions of skills/agents and report differences.
The registry.diff skill analyzes changes between a current manifest file (skill.yaml or agent.yaml) and its existing registry entry. It detects various types of changes, determines the required action, and provides suggestions for proper version management and breaking change prevention.
# Compare a skill manifest against the registry
./skills/registry.diff/registry_diff.py path/to/skill.yaml
# Compare an agent manifest
./skills/registry.diff/registry_diff.py path/to/agent.yaml
# Using with betty command (if configured)
betty registry.diff <manifest_path>
| Parameter | Type | Required | Description |
|---|---|---|---|
manifest_path | string | Yes | Path to skill.yaml or agent.yaml file to analyze |
The skill returns a JSON response with the following structure:
{
"ok": true,
"status": "success",
"errors": [],
"path": "path/to/manifest.yaml",
"details": {
"manifest_path": "path/to/manifest.yaml",
"manifest_type": "skill",
"diff_type": "version_bump",
"required_action": "register",
"suggestions": [
"Version upgraded: 0.1.0 -> 0.2.0",
"Clean version bump with no breaking changes"
],
"details": {
"name": "example.skill",
"current_version": "0.2.0",
"previous_version": "0.1.0",
"version_comparison": "upgrade",
"permission_changed": false,
"added_permissions": [],
"removed_permissions": [],
"removed_fields": [],
"status_changed": false,
"current_status": "active",
"previous_status": "active"
},
"timestamp": "2025-10-23T12:00:00+00:00"
}
}
| Type | Description |
|---|---|
new | Entry does not exist in registry (first-time registration) |
version_bump | Version was properly incremented |
version_downgrade | Version was decreased (breaking change) |
permission_change | Permissions were added or removed |
breaking_change | Breaking changes detected (removed fields, etc.) |
status_change | Status field changed (active, deprecated, etc.) |
needs_version_bump | Changes detected without version increment |
no_change | No significant changes detected |
| Action | Description | Exit Code |
|---|---|---|
register | Changes are acceptable, proceed with registration | 0 |
review | Manual review recommended before registration | 0 |
reject | Breaking/unauthorized changes, registration blocked | 1 |
skip | No changes detected, no action needed | 0 |
$ ./skills/registry.diff/registry_diff.py skills/new.skill/skill.yaml
Output:
{
"ok": true,
"status": "success",
"details": {
"diff_type": "new",
"required_action": "register",
"suggestions": [
"New skill 'new.skill' ready for registration"
]
}
}
$ ./skills/registry.diff/registry_diff.py skills/example.skill/skill.yaml
Output:
{
"ok": true,
"status": "success",
"details": {
"diff_type": "version_bump",
"required_action": "register",
"suggestions": [
"Version upgraded: 0.1.0 -> 0.2.0",
"Clean version bump with no breaking changes"
]
}
}
$ ./skills/registry.diff/registry_diff.py skills/example.skill/skill.yaml
Output:
{
"ok": false,
"status": "failed",
"errors": [
"Fields removed without version bump: dependencies",
"Removing fields requires a version bump",
"Suggested version: 0.2.0"
],
"details": {
"diff_type": "breaking_change",
"required_action": "reject",
"details": {
"removed_fields": ["dependencies"],
"current_version": "0.1.0",
"previous_version": "0.1.0"
}
}
}
Exit code: 1
$ ./skills/registry.diff/registry_diff.py skills/example.skill/skill.yaml
Output:
{
"ok": true,
"status": "success",
"details": {
"diff_type": "permission_change",
"required_action": "review",
"suggestions": [
"New permissions added: network",
"Review: Ensure new permissions are necessary and documented"
],
"details": {
"added_permissions": ["network"],
"removed_permissions": []
}
}
}
$ ./skills/registry.diff/registry_diff.py skills/example.skill/skill.yaml
Output:
{
"ok": false,
"status": "failed",
"errors": [
"Version downgrade detected: 0.2.0 -> 0.1.0",
"Version downgrades are not permitted",
"Suggested action: Restore version to at least 0.2.0"
],
"details": {
"diff_type": "version_downgrade",
"required_action": "reject"
}
}
Exit code: 1
# .git/hooks/pre-commit
#!/bin/bash
changed_files=$(git diff --cached --name-only | grep -E "skill\.yaml|agent\.yaml")
for file in $changed_files; do
echo "Checking $file..."
./skills/registry.diff/registry_diff.py "$file"
if [ $? -ne 0 ]; then
echo "❌ Registry diff failed for $file"
exit 1
fi
done
# .github/workflows/validate-changes.yml
name: Validate Skill Changes
on: [pull_request]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Check skill changes
run: |
for file in $(git diff --name-only origin/main | grep -E "skill\.yaml|agent\.yaml"); do
python3 skills/registry.diff/registry_diff.py "$file"
done
The skill follows semantic versioning principles:
| Change Type | Suggested Bump |
|---|---|
| Remove fields | Minor |
| Remove permissions | Minor |
| Add permissions | Patch or Minor |
| Status to deprecated | Minor |
| Bug fixes | Patch |
| New features | Minor |
| Breaking changes | Major |
packaging library (for version comparison)registry.update: Update registry entriesskill.define: Define and validate skill manifestsaudit.log: Audit trail for registry changesEnsure the path to the manifest file is correct and the file exists.
The YAML file exists but contains no data. Check for valid YAML content.
The registry hasn't been initialized yet. This is normal for new Betty Framework installations.
The manifest file contains syntax errors. Validate with a YAML parser.