Community docs: - CODE_OF_CONDUCT.md (Contributor Covenant v2.1) - SECURITY.md (vulnerability reporting policy) - CHANGELOG.md (initial release notes) - CODEOWNERS (per-type review ownership) GitHub config: - Issue templates: bug-report, pricing-correction, documentation - FUNDING.yml (GitHub Sponsors) Validation enhancements: - Cross-reference check: hand [[requires]] → integration existence - Routing alias collisions as warnings (errors with --strict) - --strict flag to promote warnings to errors - --type filter to validate single content type - CI: add taplo format check and lychee link check jobs Developer experience: - Makefile with validate, fmt, and scaffold targets - Scaffold templates for all 5 content types - .pre-commit-config.yaml (trailing whitespace, TOML check, validate) - docs/content-guide.md (naming, descriptions, prompts, decision guide) Content quality: - schema.toml: add last_verified field for model pricing - CONTRIBUTING.md: add pricing verification guide with source links
7.8 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
last_verifieddate included (ISO format, e.g.2025-03-15)
Pricing Verification
Always verify pricing from official sources before submitting. Model pricing changes frequently and stale data leads to incorrect cost tracking for users.
When adding or updating model pricing:
- Check the provider's official pricing page (see links below)
- Record the exact
input_cost_per_mandoutput_cost_per_mvalues in USD per million tokens - Include the
last_verifiedfield with today's date in ISO format (YYYY-MM-DD) - If a model is subscription-based (e.g. GitHub Copilot) or has no public per-token pricing, note this in your PR description
Common official pricing pages:
- 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
- Together: https://www.together.ai/pricing
- Fireworks: https://fireworks.ai/pricing
- OpenRouter: https://openrouter.ai/models (per-model pricing listed)
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