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.json - •
registry/agents.json - •
registry/commands.json - •
registry/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.json - •
https://riskexec.github.io/betty/api/v1/agents.json - •
https://riskexec.github.io/betty/api/v1/commands.json - •
https://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