From epieczko-betty
Generate marketplace catalog files from Betty Framework registries
npx claudepluginhub joshuarweaver/cascade-code-general-misc-1 --plugin epieczko-bettyThis skill uses the workspace's default tool permissions.
**generate.marketplace** generates the RiskExec Claude Marketplace catalogs by filtering certified skills, agents, commands, and hooks from the Betty Framework registries. It transforms registry entries into marketplace-ready JSON files optimized for discovery and distribution.
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.
generate.marketplace generates the RiskExec Claude Marketplace catalogs by filtering certified skills, agents, commands, and hooks from the Betty Framework registries. It transforms registry entries into marketplace-ready JSON files optimized for discovery and distribution.
Automates the generation of marketplace catalogs to maintain consistency between:
registry/skills.json) - All registered skillsregistry/agents.json) - All registered agentsregistry/commands.json) - All registered commandsregistry/hooks.json) - All registered hooksmarketplace/skills.json) - Certified skills for distributionmarketplace/agents.json) - Certified agents for distributionmarketplace/commands.json) - Certified commands for distributionmarketplace/hooks.json) - Certified hooks for distributionThis eliminates manual curation of marketplace catalogs and ensures only production-ready, certified components are published.
registry/skills.json, registry/agents.json, registry/commands.json, and registry/hooks.jsonstatus: activecertified: true (if field exists)marketplace/skills.json, marketplace/agents.json, marketplace/commands.json, and marketplace/hooks.jsonpython skills/generate.marketplace/generate_marketplace.py
No arguments required - reads from standard registry locations.
/marketplace/generate
betty/
├── registry/
│ ├── skills.json # Source: All registered skills
│ ├── agents.json # Source: All registered agents
│ ├── commands.json # Source: All registered commands
│ └── hooks.json # Source: All registered hooks
└── marketplace/
├── skills.json # Output: Certified skills only
├── agents.json # Output: Certified agents only
├── commands.json # Output: Certified commands only
└── hooks.json # Output: Certified hooks only
A skill, agent, command, or hook is included in the marketplace if:
status: "active"certified: trueIf the certified field is not present, active items are considered certified by default.
| Status | Included in Marketplace | Purpose |
|---|---|---|
active | Yes | Production-ready, certified items |
draft | No | Work in progress, not ready for distribution |
deprecated | No | Outdated, should not be used |
experimental | No | Testing phase, unstable |
{
"marketplace_version": "1.0.0",
"generated_at": "2025-10-23T17:51:58.579847+00:00",
"last_updated": "2025-10-23T17:51:58.579847+00:00",
"description": "Betty Framework Certified Skills Marketplace",
"total_skills": 20,
"certified_count": 16,
"draft_count": 4,
"catalog": [
{
"name": "api.validate",
"version": "0.1.0",
"description": "Validate OpenAPI and AsyncAPI specifications",
"status": "certified",
"tags": ["api", "validation", "openapi"],
"maintainer": "Betty Core Team",
"usage_examples": [
"Validate OpenAPI spec: /skill/api/validate --spec_path api.yaml"
],
"documentation_url": "https://betty-framework.dev/docs/skills/api.validate",
"dependencies": ["context.schema"],
"entrypoints": [...],
"inputs": [...],
"outputs": [...]
}
]
}
{
"marketplace_version": "1.0.0",
"generated_at": "2025-10-23T17:03:16.154165+00:00",
"last_updated": "2025-10-23T17:03:16.154165+00:00",
"description": "Betty Framework Certified Agents Marketplace",
"total_agents": 5,
"certified_count": 3,
"draft_count": 2,
"catalog": [
{
"name": "api.designer",
"version": "0.1.0",
"description": "Design RESTful APIs following enterprise guidelines",
"status": "certified",
"reasoning_mode": "iterative",
"skills_available": ["api.define", "api.validate"],
"capabilities": [
"Design RESTful APIs from natural language requirements"
],
"tags": ["api", "design", "openapi"],
"maintainer": "Betty Core Team",
"documentation_url": "https://betty-framework.dev/docs/agents/api.designer",
"dependencies": ["context.schema"]
}
]
}
{
"marketplace_version": "1.0.0",
"generated_at": "2025-10-23T17:51:58.579847+00:00",
"last_updated": "2025-10-23T17:51:58.579847+00:00",
"description": "Betty Framework Certified Commands Marketplace",
"total_commands": 4,
"certified_count": 1,
"draft_count": 3,
"catalog": [
{
"name": "/test-workflow-command",
"version": "1.0.0",
"description": "Test complete workflow",
"status": "certified",
"tags": ["test", "workflow"],
"execution": {
"type": "skill",
"target": "api.validate"
},
"parameters": [
{
"name": "input",
"type": "string",
"required": true,
"description": "Input parameter"
}
],
"maintainer": "Betty Core Team"
}
]
}
{
"marketplace_version": "1.0.0",
"generated_at": "2025-10-23T17:51:58.579847+00:00",
"last_updated": "2025-10-23T17:51:58.579847+00:00",
"description": "Betty Framework Certified Hooks Marketplace",
"total_hooks": 4,
"certified_count": 1,
"draft_count": 3,
"catalog": [
{
"name": "test-workflow-hook",
"version": "1.0.0",
"description": "Test complete workflow",
"status": "certified",
"tags": ["test", "workflow", "openapi"],
"event": "on_file_edit",
"command": "python validate.py {file_path}",
"blocking": true,
"when": {
"pattern": "*.openapi.yaml"
},
"timeout": 30000,
"on_failure": "show_errors",
"maintainer": "Betty Core Team"
}
]
}
The skill transforms registry entries to marketplace format:
| Registry Field | Marketplace Field | Transformation |
|---|---|---|
status: "active" | status: "certified" | Renamed for marketplace context |
name | name | Preserved |
version | version | Preserved |
description | description | Preserved |
tags | tags | Preserved (default: []) |
dependencies | dependencies | Preserved (default: []) |
entrypoints | entrypoints | Preserved (skills only) |
inputs | inputs | Preserved (skills only) |
outputs | outputs | Preserved (skills only) |
skills_available | skills_available | Preserved (agents only) |
capabilities | capabilities | Preserved (agents only) |
reasoning_mode | reasoning_mode | Preserved (agents only) |
| N/A | maintainer | Added (default: "Betty Core Team") |
| N/A | usage_examples | Generated from entrypoints or provided |
| N/A | documentation_url | Generated: https://betty-framework.dev/docs/{type}/{name} |
| N/A | last_updated | Added: ISO timestamp |
| Registry Field | Marketplace Field | Transformation |
|---|---|---|
status: "active" | status: "certified" | Renamed for marketplace context |
name | name | Preserved |
version | version | Preserved |
description | description | Preserved |
tags | tags | Preserved (default: []) |
execution | execution | Preserved |
parameters | parameters | Preserved (default: []) |
| N/A | maintainer | Added (default: "Betty Core Team") |
| N/A | last_updated | Added: ISO timestamp |
| Registry Field | Marketplace Field | Transformation |
|---|---|---|
status: "active" | status: "certified" | Renamed for marketplace context |
name | name | Preserved |
version | version | Preserved |
description | description | Preserved |
tags | tags | Preserved (default: []) |
event | event | Preserved |
command | command | Preserved |
blocking | blocking | Preserved (default: false) |
when | when | Preserved (default: {}) |
timeout | timeout | Preserved |
on_failure | on_failure | Preserved |
| N/A | maintainer | Added (default: "Betty Core Team") |
| N/A | last_updated | Added: ISO timestamp |
The skill adds marketplace-specific metadata:
https://betty-framework.dev/docs/{skills|agents}/{name} (skills and agents only)Reads JSON files from:
registry/skills.jsonregistry/agents.jsonregistry/commands.jsonregistry/hooks.jsonIf a registry file is missing, the skill fails with an error.
For each skill/agent/command/hook in the registry:
status field - must be "active"certified field (if present) - must be trueConverts each certified entry:
status: "active" → status: "certified"Tracks:
Writes marketplace catalogs:
marketplace/ directory if needed{
"ok": true,
"status": "success",
"skills_output": "/home/user/betty/marketplace/skills.json",
"agents_output": "/home/user/betty/marketplace/agents.json",
"commands_output": "/home/user/betty/marketplace/commands.json",
"hooks_output": "/home/user/betty/marketplace/hooks.json",
"skills_certified": 16,
"skills_total": 20,
"agents_certified": 3,
"agents_total": 5,
"commands_certified": 1,
"commands_total": 4,
"hooks_certified": 1,
"hooks_total": 4
}
{
"ok": false,
"status": "failed",
"error": "Registry file not found: /home/user/betty/registry/skills.json"
}
Scenario: Generate marketplace catalogs after adding new certified skills
# Register new skills
/skill/define skills/data.transform/skill.yaml
/skill/define skills/api.monitor/skill.yaml
# Update registry
/registry/update
# Generate marketplace
/marketplace/generate
Output:
INFO: Starting marketplace catalog generation from registries...
INFO: Loading registry files...
INFO: Generating marketplace catalogs...
INFO: Added certified skill: api.validate
INFO: Added certified skill: api.define
INFO: Skipped non-certified skill: test.hello (status: draft)
INFO: Added certified agent: api.designer
INFO: Added certified command: /test-workflow-command
INFO: Skipped non-certified command: /test-command (status: draft)
INFO: Added certified hook: test-workflow-hook
INFO: Skipped non-certified hook: test-validation-hook (status: draft)
INFO: Writing marketplace files...
INFO: ✅ Written marketplace file to /home/user/betty/marketplace/skills.json
INFO: ✅ Written marketplace file to /home/user/betty/marketplace/agents.json
INFO: ✅ Written marketplace file to /home/user/betty/marketplace/commands.json
INFO: ✅ Written marketplace file to /home/user/betty/marketplace/hooks.json
INFO: ✅ Generated marketplace catalogs:
INFO: Skills: 16/20 certified
INFO: Agents: 3/5 certified
INFO: Commands: 1/4 certified
INFO: Hooks: 1/4 certified
Scenario: Skills were marked as active and should now appear in marketplace
# Edit registry to mark skills as active
# (Normally done via skill.define)
# Regenerate marketplace
/marketplace/generate
Before (registry):
{
"name": "my.skill",
"status": "draft"
}
After (registry updated):
{
"name": "my.skill",
"status": "active"
}
Marketplace (now includes):
{
"name": "my.skill",
"status": "certified"
}
Scenario: Deploy marketplace catalogs to public API endpoint
# Generate marketplace
/marketplace/generate
# Copy to GitHub Pages directory
cp marketplace/*.json docs/api/v1/
# Commit and push
git add marketplace/ docs/api/v1/
git commit -m "Update marketplace catalog"
git push
Now accessible at:
https://riskexec.github.io/betty/api/v1/skills.jsonhttps://riskexec.github.io/betty/api/v1/agents.jsonhttps://riskexec.github.io/betty/api/v1/commands.jsonhttps://riskexec.github.io/betty/api/v1/hooks.jsonScenario: Auto-generate marketplace on every registry change
# .github/workflows/marketplace.yml
name: Update Marketplace
on:
push:
paths:
- 'registry/*.json'
jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Generate Marketplace
run: python skills/generate.marketplace/generate_marketplace.py
- name: Commit Changes
run: |
git config user.name "Betty Bot"
git config user.email "bot@riskexec.com"
git add marketplace/
git commit -m "chore: update marketplace catalog"
git push
After registering skills, regenerate marketplace:
/skill/define skills/new.skill/skill.yaml
/registry/update
/marketplace/generate
Include marketplace generation as a workflow step:
# workflows/skill_lifecycle.yaml
steps:
- skill: skill.create
args: ["new.skill", "Description"]
- skill: skill.define
args: ["skills/new.skill/skill.yaml"]
- skill: registry.update
args: ["skills/new.skill/skill.yaml"]
- skill: generate.marketplace
args: []
Auto-regenerate marketplace when registries change:
# .claude/hooks.yaml
- event: on_file_save
pattern: "registry/*.json"
command: python skills/generate.marketplace/generate_marketplace.py
blocking: false
description: Auto-regenerate marketplace when registry changes
status: "active"certified: true (if field exists)status: "draft"status: "deprecated"certified: false| Error | Cause | Solution |
|---|---|---|
| "Registry file not found" | Missing registry file | Ensure registry/skills.json and registry/agents.json exist |
| "Failed to parse JSON" | Invalid JSON syntax | Fix JSON syntax in registry files |
| "Permission denied" | Cannot write marketplace files | Check write permissions on marketplace/ directory |
| Empty marketplace | No active skills | Mark skills as status: "active" in registry |
registry/skills.json - Skill registry (source)registry/agents.json - Agent registry (source)registry/commands.json - Command registry (source)registry/hooks.json - Hook registry (source)marketplace/skills.json - Skills marketplace catalog (output)marketplace/agents.json - Agents marketplace catalog (output)marketplace/commands.json - Commands marketplace catalog (output)marketplace/hooks.json - Hooks marketplace catalog (output)Logs generation progress:
INFO: Starting marketplace catalog generation from registries...
INFO: Loading registry files...
INFO: Generating marketplace catalogs...
INFO: Added certified skill: api.validate
INFO: Added certified skill: hook.define
DEBUG: Skipped non-certified skill: test.hello (status: draft)
INFO: Added certified agent: api.designer
INFO: Added certified command: /test-workflow-command
DEBUG: Skipped non-certified command: /test-command (status: draft)
INFO: Added certified hook: test-workflow-hook
DEBUG: Skipped non-certified hook: test-validation-hook (status: draft)
INFO: Writing marketplace files...
INFO: ✅ Written marketplace file to marketplace/skills.json
INFO: ✅ Written marketplace file to marketplace/agents.json
INFO: ✅ Written marketplace file to marketplace/commands.json
INFO: ✅ Written marketplace file to marketplace/hooks.json
INFO: ✅ Generated marketplace catalogs:
INFO: Skills: 16/20 certified
INFO: Agents: 3/5 certified
INFO: Commands: 1/4 certified
INFO: Hooks: 1/4 certified
Problem: Changes to registry don't appear in marketplace
Solutions:
"active" in registrycertified field is true (if present)/registry/update before /marketplace/generateProblem: Active skills not appearing in marketplace
Solutions:
registry/skills.jsoncertified: false field/skill/defineProblem: Marketplace has 0 certified items
Solutions:
status: "active" in registrycertified: false from skill entries/skill/define to register skills firstTo add version diff vs. last release:
# Future enhancement
def get_version_diff(old_marketplace, new_marketplace):
"""Compare two marketplace versions and return diff."""
added = [s for s in new if s not in old]
removed = [s for s in old if s not in new]
updated = [s for s in new if s in old and version_changed(s)]
return {"added": added, "removed": removed, "updated": updated}
To upload generated catalogs to an API:
# Future enhancement
import requests
def upload_to_api(marketplace_data, api_endpoint, api_key):
"""Upload marketplace catalog to internal API."""
response = requests.post(
api_endpoint,
json=marketplace_data,
headers={"Authorization": f"Bearer {api_key}"}
)
return response.status_code == 200
Infrastructure - generate.marketplace maintains the marketplace layer by transforming registry state into certified catalogs.
Active - Production-ready infrastructure skill