docs: add README for every content directory
Each directory (agents, hands, integrations, plugins, providers, scripts, skills) now has a README documenting its TOML format, current contents, and contribution steps.
This commit is contained in:
1 parent
d1bc8ead69
commit
206169c1d7
7 files changed
+448
No files matched your search
@@ -0,0 +1,63 @@
|
|||||||
|
# Agents
|
||||||
|
|
||||||
|
Autonomous agent definitions for LibreFang. Each agent is a directory containing an `agent.toml` manifest.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
agents/
|
||||||
|
├── hello-world/agent.toml
|
||||||
|
├── researcher/agent.toml
|
||||||
|
├── coder/agent.toml
|
||||||
|
└── ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## agent.toml Format
|
||||||
|
|
||||||
|
```toml
|
||||||
|
name = "agent-name" # Must match directory name
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "What this agent does"
|
||||||
|
author = "author-name"
|
||||||
|
module = "builtin:chat" # Runtime module
|
||||||
|
|
||||||
|
[model]
|
||||||
|
provider = "default"
|
||||||
|
model = "default"
|
||||||
|
max_tokens = 4096
|
||||||
|
temperature = 0.7
|
||||||
|
system_prompt = """Behavioral instructions for the agent."""
|
||||||
|
|
||||||
|
[metadata.routing]
|
||||||
|
aliases = ["exact match phrases"]
|
||||||
|
weak_aliases = ["keyword hints"]
|
||||||
|
|
||||||
|
[resources]
|
||||||
|
max_llm_tokens_per_hour = 100000
|
||||||
|
|
||||||
|
[capabilities]
|
||||||
|
tools = ["web_search", "file_read"]
|
||||||
|
network = ["*"]
|
||||||
|
memory_read = ["*"]
|
||||||
|
memory_write = ["self.*"]
|
||||||
|
agent_spawn = false
|
||||||
|
```
|
||||||
|
|
||||||
|
## Current Agents (33)
|
||||||
|
|
||||||
|
| Agent | Description |
|
||||||
|
|-------|-------------|
|
||||||
|
| assistant | Default conversational assistant |
|
||||||
|
| researcher | Deep research with web search |
|
||||||
|
| coder | Code generation and editing |
|
||||||
|
| hello-world | Friendly greeting agent for new users |
|
||||||
|
| ... | See each directory for details |
|
||||||
|
|
||||||
|
## Adding a New Agent
|
||||||
|
|
||||||
|
1. Create `agents/<name>/agent.toml`
|
||||||
|
2. Ensure `name` matches the directory name
|
||||||
|
3. Run `python scripts/validate.py`
|
||||||
|
4. Submit a PR
|
||||||
|
|
||||||
|
See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full guide.
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
# Hands
|
||||||
|
|
||||||
|
Hand definitions for LibreFang. Hands are the user-facing "apps" -- higher-level application bundles that package an agent with tools, settings, dashboard metrics, and dependency requirements.
|
||||||
|
|
||||||
|
> "You have many hands helping you." -- Hands are how LibreFang users interact with specialized capabilities.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
hands/
|
||||||
|
├── browser/
|
||||||
|
│ ├── HAND.toml # Hand definition
|
||||||
|
│ └── SKILL.md # Documentation
|
||||||
|
├── trader/
|
||||||
|
│ ├── HAND.toml
|
||||||
|
│ └── SKILL.md
|
||||||
|
└── ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## HAND.toml Format
|
||||||
|
|
||||||
|
```toml
|
||||||
|
id = "hand-id" # Must match directory name
|
||||||
|
name = "Hand Name"
|
||||||
|
description = "What this hand does"
|
||||||
|
category = "productivity" # communication | content | data | development |
|
||||||
|
# devops | finance | productivity | research | social
|
||||||
|
icon = "🔧"
|
||||||
|
tools = ["tool1", "tool2"]
|
||||||
|
|
||||||
|
[routing]
|
||||||
|
aliases = ["activate phrases"]
|
||||||
|
weak_aliases = ["keyword hints"]
|
||||||
|
|
||||||
|
[[requires]] # External dependencies
|
||||||
|
key = "python3"
|
||||||
|
requirement_type = "binary"
|
||||||
|
check_value = "python3"
|
||||||
|
|
||||||
|
[[settings]] # User-configurable options
|
||||||
|
key = "headless"
|
||||||
|
setting_type = "toggle"
|
||||||
|
default = "true"
|
||||||
|
|
||||||
|
[agent] # The agent powering this hand
|
||||||
|
name = "hand-agent"
|
||||||
|
module = "builtin:chat"
|
||||||
|
system_prompt = """..."""
|
||||||
|
|
||||||
|
[dashboard] # Dashboard metrics
|
||||||
|
[[dashboard.metrics]]
|
||||||
|
label = "Tasks Completed"
|
||||||
|
memory_key = "metric_key"
|
||||||
|
format = "number"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Current Hands (14)
|
||||||
|
|
||||||
|
| Hand | Category | Description |
|
||||||
|
|------|----------|-------------|
|
||||||
|
| browser | productivity | Autonomous web browser |
|
||||||
|
| trader | data | Crypto/stock trading assistant |
|
||||||
|
| researcher | productivity | Deep research automation |
|
||||||
|
| analytics | data | Data analysis and dashboards |
|
||||||
|
| ... | | See each directory for details |
|
||||||
|
|
||||||
|
## Adding a New Hand
|
||||||
|
|
||||||
|
1. Create `hands/<name>/HAND.toml` (and optionally `SKILL.md`)
|
||||||
|
2. Ensure `id` matches the directory name
|
||||||
|
3. Run `python scripts/validate.py`
|
||||||
|
4. Submit a PR
|
||||||
|
|
||||||
|
See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full guide.
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
# Integrations
|
||||||
|
|
||||||
|
MCP (Model Context Protocol) server integration templates for LibreFang. Each integration connects LibreFang to an external service (GitHub, Slack, databases, etc.).
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
integrations/
|
||||||
|
├── github.toml
|
||||||
|
├── slack.toml
|
||||||
|
├── postgresql.toml
|
||||||
|
└── ...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Integration TOML Format
|
||||||
|
|
||||||
|
```toml
|
||||||
|
id = "service-id" # Must match filename (without .toml)
|
||||||
|
name = "Service Name"
|
||||||
|
description = "What this integration provides"
|
||||||
|
category = "devtools" # devtools | communication | storage | monitoring | data
|
||||||
|
icon = "🐙"
|
||||||
|
tags = ["relevant", "tags"]
|
||||||
|
|
||||||
|
[transport] # MCP server transport config
|
||||||
|
type = "stdio" # "stdio" or "sse"
|
||||||
|
command = "npx"
|
||||||
|
args = ["-y", "@pkg/mcp-server"]
|
||||||
|
|
||||||
|
[[required_env]] # Required environment variables
|
||||||
|
name = "SERVICE_API_KEY"
|
||||||
|
label = "API Key"
|
||||||
|
help = "How to obtain this key"
|
||||||
|
is_secret = true
|
||||||
|
get_url = "https://..."
|
||||||
|
|
||||||
|
[oauth] # Optional: OAuth config
|
||||||
|
provider = "github"
|
||||||
|
scopes = ["repo"]
|
||||||
|
auth_url = "https://..."
|
||||||
|
token_url = "https://..."
|
||||||
|
|
||||||
|
[health_check]
|
||||||
|
interval_secs = 60
|
||||||
|
unhealthy_threshold = 3
|
||||||
|
|
||||||
|
setup_instructions = """
|
||||||
|
Step-by-step setup guide for users.
|
||||||
|
"""
|
||||||
|
```
|
||||||
|
|
||||||
|
## Current Integrations (25)
|
||||||
|
|
||||||
|
| Integration | Category | Service |
|
||||||
|
|-------------|----------|---------|
|
||||||
|
| github | devtools | GitHub repos, issues, PRs |
|
||||||
|
| slack | communication | Slack messaging |
|
||||||
|
| notion | productivity | Notion pages and databases |
|
||||||
|
| postgresql | storage | PostgreSQL database |
|
||||||
|
| ... | | See each file for details |
|
||||||
|
|
||||||
|
## Adding a New Integration
|
||||||
|
|
||||||
|
1. Create `integrations/<name>.toml`
|
||||||
|
2. Ensure `id` matches the filename
|
||||||
|
3. Test the MCP server command locally
|
||||||
|
4. Run `python scripts/validate.py`
|
||||||
|
5. Submit a PR
|
||||||
|
|
||||||
|
See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full guide.
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# Plugins
|
||||||
|
|
||||||
|
Plugin packages for LibreFang. Plugins extend agent behavior through lifecycle hooks -- they can inject memories, modify context, or perform side effects during conversations.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
plugins/
|
||||||
|
└── echo-memory/
|
||||||
|
├── plugin.toml # Plugin manifest
|
||||||
|
├── hooks/
|
||||||
|
│ ├── ingest.py # Called on user message
|
||||||
|
│ └── after_turn.py # Called after each turn
|
||||||
|
└── requirements.txt # Python dependencies
|
||||||
|
```
|
||||||
|
|
||||||
|
## plugin.toml Format
|
||||||
|
|
||||||
|
```toml
|
||||||
|
name = "plugin-name" # Must match directory name
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "What this plugin does"
|
||||||
|
author = "author-name"
|
||||||
|
|
||||||
|
[hooks]
|
||||||
|
ingest = "hooks/ingest.py" # Receives user message, can return memories
|
||||||
|
after_turn = "hooks/after_turn.py" # Post-turn processing
|
||||||
|
```
|
||||||
|
|
||||||
|
## Hook Protocol
|
||||||
|
|
||||||
|
Hooks communicate via stdin/stdout JSON:
|
||||||
|
|
||||||
|
### ingest hook
|
||||||
|
|
||||||
|
```
|
||||||
|
stdin: {"type": "ingest", "agent_id": "...", "message": "user message"}
|
||||||
|
stdout: {"type": "ingest_result", "memories": [{"content": "..."}]}
|
||||||
|
```
|
||||||
|
|
||||||
|
### after_turn hook
|
||||||
|
|
||||||
|
```
|
||||||
|
stdin: {"type": "after_turn", "agent_id": "...", "messages": [...]}
|
||||||
|
stdout: {"type": "ok"}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Current Plugins (1)
|
||||||
|
|
||||||
|
| Plugin | Description |
|
||||||
|
|--------|-------------|
|
||||||
|
| echo-memory | Demo plugin that echoes user messages as recalled memories |
|
||||||
|
|
||||||
|
## Adding a New Plugin
|
||||||
|
|
||||||
|
1. Create `plugins/<name>/plugin.toml`
|
||||||
|
2. Add hook scripts in `hooks/`
|
||||||
|
3. List dependencies in `requirements.txt` (prefer stdlib-only)
|
||||||
|
4. Run `python scripts/validate.py`
|
||||||
|
5. Submit a PR
|
||||||
|
|
||||||
|
See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full guide.
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
# Providers
|
||||||
|
|
||||||
|
LLM provider and model metadata for LibreFang. Each provider file defines the provider's API configuration and all available models with pricing, context windows, and capability flags.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
providers/
|
||||||
|
├── anthropic.toml
|
||||||
|
├── openai.toml
|
||||||
|
├── groq.toml
|
||||||
|
└── ... (46 providers, 220+ models)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Provider TOML Format
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[provider]
|
||||||
|
id = "provider-id" # Unique identifier (lowercase, hyphenated)
|
||||||
|
display_name = "Provider Name"
|
||||||
|
api_key_env = "PROVIDER_API_KEY" # Env var for API key
|
||||||
|
base_url = "https://api.example.com"
|
||||||
|
key_required = true
|
||||||
|
|
||||||
|
[[models]]
|
||||||
|
id = "model-id" # Exact API 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"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Tier Definitions
|
||||||
|
|
||||||
|
| Tier | Description | Examples |
|
||||||
|
|------|-------------|----------|
|
||||||
|
| `frontier` | Most capable, cutting-edge | Claude Opus, GPT-4.1 |
|
||||||
|
| `smart` | Smart, cost-effective | Claude Sonnet, Gemini 2.5 Flash |
|
||||||
|
| `balanced` | Balanced speed/cost | GPT-4.1 Mini, Llama 3.3 70B |
|
||||||
|
| `fast` | Fastest, cheapest | GPT-4o Mini, Claude Haiku |
|
||||||
|
| `local` | Local models, zero cost | Ollama, vLLM, LM Studio |
|
||||||
|
|
||||||
|
## Validation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python scripts/validate.py
|
||||||
|
```
|
||||||
|
|
||||||
|
Checks: required fields, valid tiers, non-negative costs, no duplicate model IDs.
|
||||||
|
|
||||||
|
## Adding or Updating a Model
|
||||||
|
|
||||||
|
1. Edit or create the provider file in `providers/`
|
||||||
|
2. Use exact API model IDs and verify pricing from official sources
|
||||||
|
3. Run `python scripts/validate.py`
|
||||||
|
4. Submit a PR
|
||||||
|
|
||||||
|
See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full guide and pricing source links.
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# Scripts
|
||||||
|
|
||||||
|
Utility scripts for maintaining the LibreFang registry.
|
||||||
|
|
||||||
|
## validate.py
|
||||||
|
|
||||||
|
Validates all TOML content files across the registry.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python scripts/validate.py
|
||||||
|
```
|
||||||
|
|
||||||
|
### What It Checks
|
||||||
|
|
||||||
|
**Per content type:**
|
||||||
|
- **Providers** -- required fields, valid tiers, non-negative costs, no duplicate model IDs
|
||||||
|
- **Agents** -- required fields (name, description, module), name matches directory
|
||||||
|
- **Hands** -- required fields (id, name, description), valid category, [agent] section, id matches directory
|
||||||
|
- **Integrations** -- required fields (id, name), [transport] section, id matches filename
|
||||||
|
- **Skills** -- [skill] section with name, [runtime] with valid type
|
||||||
|
- **Plugins** -- name matches directory, [hooks] section, hook files exist
|
||||||
|
|
||||||
|
**Cross-type checks:**
|
||||||
|
- Routing alias collisions between agents and hands (reported as warnings)
|
||||||
|
- Cross-file duplicate model IDs within the same provider
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
- Python 3.11+ (uses `tomllib`)
|
||||||
|
- Or Python 3.8+ with `pip install tomli`
|
||||||
|
|
||||||
|
### Exit Codes
|
||||||
|
|
||||||
|
- `0` -- all checks passed
|
||||||
|
- `1` -- one or more validation errors
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# Skills
|
||||||
|
|
||||||
|
Reusable skill definitions for LibreFang agents. Skills are either prompt templates or code scripts that agents can invoke to perform specific tasks.
|
||||||
|
|
||||||
|
## Structure
|
||||||
|
|
||||||
|
```
|
||||||
|
skills/
|
||||||
|
├── custom-skill-prompt/
|
||||||
|
│ └── skill.toml # Prompt-only skill
|
||||||
|
└── custom-skill-python/
|
||||||
|
├── skill.toml # Skill manifest
|
||||||
|
└── main.py # Python implementation
|
||||||
|
```
|
||||||
|
|
||||||
|
## Skill Types
|
||||||
|
|
||||||
|
### Prompt-Only
|
||||||
|
|
||||||
|
No code needed -- pure prompt engineering:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[skill]
|
||||||
|
name = "meeting-agenda"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "Generate a structured meeting agenda"
|
||||||
|
tags = ["meeting", "productivity"]
|
||||||
|
|
||||||
|
[runtime]
|
||||||
|
type = "promptonly"
|
||||||
|
|
||||||
|
[input]
|
||||||
|
topic = { type = "string", description = "The meeting topic", required = true }
|
||||||
|
duration_minutes = { type = "string", description = "Duration in minutes", required = true }
|
||||||
|
|
||||||
|
[prompt]
|
||||||
|
template = """
|
||||||
|
Create a meeting agenda for:
|
||||||
|
Topic: {{topic}}
|
||||||
|
Duration: {{duration_minutes}} minutes
|
||||||
|
"""
|
||||||
|
```
|
||||||
|
|
||||||
|
### Python
|
||||||
|
|
||||||
|
Custom logic with a Python entry point:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[skill]
|
||||||
|
name = "my-skill"
|
||||||
|
version = "0.1.0"
|
||||||
|
description = "Skill with custom logic"
|
||||||
|
|
||||||
|
[runtime]
|
||||||
|
type = "python"
|
||||||
|
entry = "main.py"
|
||||||
|
|
||||||
|
[input]
|
||||||
|
data = { type = "string", description = "Input data", required = true }
|
||||||
|
```
|
||||||
|
|
||||||
|
### Other Runtimes
|
||||||
|
|
||||||
|
Also supported: `node`, `shell`.
|
||||||
|
|
||||||
|
## Testing Skills Locally
|
||||||
|
|
||||||
|
```bash
|
||||||
|
librefang skill test ./skills/custom-skill-prompt \
|
||||||
|
--input '{"topic": "Q1 planning", "duration_minutes": "30"}'
|
||||||
|
```
|
||||||
|
|
||||||
|
## Adding a New Skill
|
||||||
|
|
||||||
|
1. Create `skills/<name>/skill.toml`
|
||||||
|
2. Add implementation files if not `promptonly`
|
||||||
|
3. Run `python scripts/validate.py`
|
||||||
|
4. Submit a PR
|
||||||
|
|
||||||
|
See [CONTRIBUTING.md](../CONTRIBUTING.md) for the full guide.
|
||||||
Reference in new issue
Block a user