- Add .gitignore (.DS_Store, .vscode, __pycache__) - Remove stale .gitkeep files (directories have content now) - Expand schema.toml to document all 6 content types (agent, hand, integration, skill, plugin) - Add plugin validation and contribution guide - Add id/name vs directory name consistency checks - Add cross-type routing alias collision detection (14 warnings found)
6.6 KiB
6.6 KiB
Contributing to LibreFang Registry
Thank you for helping grow the LibreFang ecosystem! This guide explains how to add or update content for each type.
General Workflow
- Fork & clone the repository
- Create a branch:
git checkout -b feat/add-my-content - Add or edit files in the appropriate directory
- Run validation:
python scripts/validate.py - Submit a Pull Request
Adding an Agent
Create a directory agents/<name>/ with an agent.toml file:
name = "my-agent"
version = "0.1.0"
description = "What this agent does"
author = "your-name"
module = "builtin:chat"
[model]
provider = "default"
model = "default"
max_tokens = 4096
temperature = 0.7
system_prompt = """Your system prompt here."""
[capabilities]
tools = ["web_search", "file_read"]
Agent Checklist
namematches the directory namedescriptionis clear and concise (one sentence)system_promptprovides clear behavioral instructionstoolsonly lists tools the agent actually needs- Routing aliases (if any) are relevant and don't conflict with existing agents
Adding a Hand
Create a directory hands/<name>/ with a HAND.toml file and optionally a SKILL.md:
id = "my-hand"
name = "My Hand"
description = "What this hand does"
category = "productivity" # communication | content | data | development | devops | finance | productivity | research | social
icon = "🔧"
tools = ["tool1", "tool2"]
[routing]
aliases = ["activate my hand", "do the thing"]
[agent]
name = "my-hand-agent"
module = "builtin:chat"
system_prompt = """Your agent prompt here."""
[[settings]]
key = "some_setting"
label = "Setting Label"
setting_type = "toggle"
default = "true"
Hand Checklist
idmatches the directory namecategoryis valid (communication,content,data,development,devops,finance,productivity,research,social)toolslists all required tools[agent]section has a complete system prompt[[requires]]sections list any external dependencies (binaries, services)[[settings]]sections provide user-configurable options where appropriate
Adding an Integration
Create a file integrations/<name>.toml:
id = "my-service"
name = "My Service"
description = "What this integration provides"
category = "devtools" # devtools | communication | storage | monitoring | data
icon = "🔌"
tags = ["relevant", "tags"]
[transport]
type = "stdio"
command = "npx"
args = ["-y", "@some/mcp-server"]
[[required_env]]
name = "MY_SERVICE_API_KEY"
label = "API Key"
help = "Get your key from https://..."
is_secret = true
get_url = "https://my-service.com/settings/api-keys"
setup_instructions = """
1. Get an API key from ...
2. Paste it into the field above.
"""
Integration Checklist
idmatches the filename (without.toml)[transport]section is correct (test the MCP server command locally)[[required_env]]lists all needed environment variablessetup_instructionsare clear enough for first-time usersis_secret = truefor any sensitive values (API keys, tokens)
Adding a Skill
Create a directory skills/<name>/ with a skill.toml and optionally implementation files:
Prompt-only Skill
[skill]
name = "my-skill"
version = "0.1.0"
description = "What this skill does"
author = "your-name"
tags = ["relevant", "tags"]
[runtime]
type = "promptonly"
[input]
param1 = { type = "string", description = "Description", required = true }
[prompt]
template = """Your prompt template using {{param1}}."""
Python Skill
[skill]
name = "my-skill"
version = "0.1.0"
description = "What this skill does"
[runtime]
type = "python"
entry = "main.py"
Plus a main.py with your implementation.
Skill Checklist
namematches the directory name[runtime].typeispromptonlyorpython[input]section documents all parameters- Prompt-only skills have a
[prompt].templatewith correct{{param}}placeholders - Python skills include all required files
Adding a Plugin
Create a directory plugins/<name>/ with a plugin.toml and hook scripts:
name = "my-plugin"
version = "0.1.0"
description = "What this plugin does"
author = "your-name"
[hooks]
ingest = "hooks/ingest.py" # Called when user message is received
after_turn = "hooks/after_turn.py" # Called after each conversation turn
Hook scripts communicate via stdin/stdout JSON. See schema.toml for the protocol format.
Plugin Checklist
namematches the directory name[hooks]lists at least one hook- All referenced hook files exist
- Hook scripts read JSON from stdin and write JSON to stdout
requirements.txtlists any Python dependencies (stdlib-only preferred)
Adding or Updating a Provider / Model
Edit the appropriate provider file in providers/. If the provider doesn't exist, create a new file.
[provider]
id = "my-provider"
display_name = "My Provider"
api_key_env = "MY_PROVIDER_API_KEY"
base_url = "https://api.my-provider.com"
key_required = true
[[models]]
id = "model-id"
display_name = "Model Name"
tier = "smart" # frontier | smart | balanced | fast | local
context_window = 128000
max_output_tokens = 16384
input_cost_per_m = 2.50 # USD per million input tokens
output_cost_per_m = 10.0 # USD per million output tokens
supports_tools = true
supports_vision = false
supports_streaming = true
aliases = ["short-name"]
Provider Checklist
python scripts/validate.pypasses- No duplicate model IDs
- Pricing is in USD per million tokens
- Tier is one of:
frontier,smart,balanced,fast,local context_windowandmax_output_tokensare positive integers- Boolean capability fields are correct
- Pricing verified from official source
Where to Find Model Information
- OpenAI: https://openai.com/pricing
- Anthropic: https://docs.anthropic.com/en/docs/about-claude/models
- Google Gemini: https://ai.google.dev/pricing
- DeepSeek: https://platform.deepseek.com/api-docs/pricing
- Mistral: https://mistral.ai/technology/#pricing
- Groq: https://wow.groq.com/
- xAI: https://docs.x.ai/docs
Guidelines
- Don't guess -- only add data you can verify from official sources
- Keep descriptions concise -- one sentence that explains the purpose
- Test locally -- try your content with LibreFang before submitting
- One PR per content type -- don't mix agent additions with provider updates
- Keep aliases short -- 1-3 word abbreviations users would naturally type