| name | Generate Marketplace |
| description | Generate marketplace catalog files from Betty Framework registries |
generate.marketplace
Overview
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.
Purpose
Automates the generation of marketplace catalogs to maintain consistency between:
- Skill Registry (
registry/skills.json) - All registered skills - Agent Registry (
registry/agents.json) - All registered agents - Command Registry (
registry/commands.json) - All registered commands - Hook Registry (
registry/hooks.json) - All registered hooks - Skills Marketplace (
marketplace/skills.json) - Certified skills for distribution - Agents Marketplace (
marketplace/agents.json) - Certified agents for distribution - Commands Marketplace (
marketplace/commands.json) - Certified commands for distribution - Hooks Marketplace (
marketplace/hooks.json) - Certified hooks for distribution
This eliminates manual curation of marketplace catalogs and ensures only production-ready, certified components are published.
What It Does
- Reads Registries: Loads
registry/skills.json,registry/agents.json,registry/commands.json, andregistry/hooks.json - Filters Active Items: Processes only entries with
status: active - Filters Certified Items: Includes only entries with
certified: true(if field exists) - Transforms Format: Converts registry entries to marketplace format
- Enriches Metadata: Adds maintainer, usage examples, documentation URLs, and last_updated timestamps
- Generates Catalogs: Outputs
marketplace/skills.json,marketplace/agents.json,marketplace/commands.json, andmarketplace/hooks.json - Reports Statistics: Shows certification counts and totals
Usage
Basic Usage
python skills/generate.marketplace/generate_marketplace.py
No arguments required - reads from standard registry locations.
Via Betty CLI
/marketplace/generate
Expected Directory Structure
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
Filtering Logic
Certification Criteria
A skill, agent, command, or hook is included in the marketplace if:
- Status is Active:
status: "active" - Certified Flag (if present):
certified: true
If the certified field is not present, active items are considered certified by default.
Status Values
| 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 |
Output Format
Skills Marketplace Structure
{
"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": [...]
}
]
}
Agents Marketplace Structure
{
"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"]
}
]
}
Commands Marketplace Structure
{
"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"
}
]
}
Hooks Marketplace Structure
{
"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"
}
]
}
Marketplace Transformations
From Registry to Marketplace
The skill transforms registry entries to marketplace format:
Skills and Agents
| 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 |
Commands
| 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 |
Hooks
| 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 |
Metadata Enrichment
The skill adds marketplace-specific metadata:
- Maintainer: Defaults to "Betty Core Team" if not specified
- Usage Examples: Auto-generated from entrypoint commands if missing (skills only)
- Documentation URL: Generated following the pattern
https://betty-framework.dev/docs/{skills|agents}/{name}(skills and agents only) - Last Updated: ISO timestamp added to all marketplace files
- Statistics: Adds total counts, certified counts, and draft counts
Behavior
1. Registry Loading
Reads JSON files from:
registry/skills.jsonregistry/agents.jsonregistry/commands.jsonregistry/hooks.json
If a registry file is missing, the skill fails with an error.
2. Filtering
For each skill/agent/command/hook in the registry:
- Checks
statusfield - must be"active" - Checks
certifiedfield (if present) - must betrue - Skips items that don't meet criteria
- Logs which items are included/excluded
3. Transformation
Converts each certified entry:
- Copies core fields (name, version, description, tags)
- Transforms
status: "active"→status: "certified" - Adds marketplace metadata (maintainer, last_updated timestamp)
- For skills: Adds docs URL and generates usage examples if not provided
- For agents: Adds docs URL
- Preserves all technical details (entrypoints, inputs, outputs, execution, parameters, event, command, etc.)
4. Statistics Calculation
Tracks:
- Total items: All items in registry
- Certified count: Items included in marketplace
- Draft count: Items excluded (total - certified)
5. File Writing
Writes marketplace catalogs:
- Creates
marketplace/directory if needed - Formats JSON with 2-space indentation
- Preserves Unicode characters (no ASCII escaping)
- Adds generation timestamp
Outputs
Success Response
{
"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
}
Failure Response
{
"ok": false,
"status": "failed",
"error": "Registry file not found: /home/user/betty/registry/skills.json"
}
Examples
Example 1: Basic Marketplace Generation
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
Example 2: After Promoting Skills to Active
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"
}
Example 3: Publishing to GitHub Pages
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.json
Example 4: CI/CD Integration
Scenario: 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
Integration
With skill.define Workflow
After registering skills, regenerate marketplace:
/skill/define skills/new.skill/skill.yaml
/registry/update
/marketplace/generate
With Workflows
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: []
With Hooks
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
What Gets Included
Included in Marketplace
- Skills/agents/commands/hooks with
status: "active" - Skills/agents/commands/hooks with
certified: true(if field exists) - All technical metadata (entrypoints, inputs, outputs, execution, parameters, event, command, etc.)
- All semantic metadata (tags, dependencies)
- Last updated timestamp for all entries
Not Included
- Skills/agents/commands/hooks with
status: "draft" - Skills/agents/commands/hooks with
status: "deprecated" - Skills/agents/commands/hooks with
certified: false - Internal-only items
- Test/experimental items (unless marked active)
Common Errors
| 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 |
Files Read
registry/skills.json- Skill registry (source)registry/agents.json- Agent registry (source)registry/commands.json- Command registry (source)registry/hooks.json- Hook registry (source)
Files Modified
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)
Exit Codes
- 0: Success (marketplace catalogs generated successfully)
- 1: Failure (error during generation)
Logging
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
Best Practices
- Run After Registry Updates: Regenerate marketplace after adding/updating skills
- Automate with CI/CD: Set up automated marketplace generation in pipelines
- Review Before Publishing: Check generated catalogs before deploying
- Version Control: Commit marketplace files with registry changes
- Keep Registries Clean: Remove deprecated skills to keep marketplace focused
- Document Thoroughly: Ensure skills have good descriptions and examples
Troubleshooting
Marketplace Files Not Updating
Problem: Changes to registry don't appear in marketplace
Solutions:
- Ensure skill status is
"active"in registry - Check that
certifiedfield istrue(if present) - Run
/registry/updatebefore/marketplace/generate - Verify registry JSON syntax is valid
Skills Missing from Marketplace
Problem: Active skills not appearing in marketplace
Solutions:
- Check skill status in
registry/skills.json - Verify no
certified: falsefield - Ensure skill.yaml has been validated with
/skill/define - Check logs for filtering messages
Empty Marketplace Catalogs
Problem: Marketplace has 0 certified items
Solutions:
- Mark skills as
status: "active"in registry - Remove
certified: falsefrom skill entries - Ensure registry files are not empty
- Run
/skill/defineto register skills first
Version Diff (Optional)
To 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}
Upload to API (Optional)
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
Architecture
Skill Categories
Infrastructure - generate.marketplace maintains the marketplace layer by transforming registry state into certified catalogs.
Design Principles
- Single Source of Truth: Registry files are the source
- Idempotent: Can be run multiple times safely
- Certification Filter: Only production-ready items included
- Metadata Enrichment: Adds marketplace-specific fields
- Clear Statistics: Reports certification rates
See Also
- plugin.sync - Generate plugin.yaml from registries (SKILL.md)
- registry.update - Update skill registry (SKILL.md)
- skill.define - Validate and register skills (SKILL.md)
- Betty Architecture - Framework overview (betty-architecture.md)
Dependencies
- registry.update: Registry management
- betty.config: Configuration constants and paths
- betty.logging_utils: Logging infrastructure
Status
Active - Production-ready infrastructure skill
Version History
- 0.2.0 (Oct 2025) - Added support for commands and hooks, added last_updated timestamps
- 0.1.0 (Oct 2025) - Initial implementation with filtering and marketplace generation for skills and agents