Files
openfang/docs/cli-reference.md
iven 92e5def702
Some checks failed
CI / Check / macos-latest (push) Has been cancelled
CI / Check / ubuntu-latest (push) Has been cancelled
CI / Check / windows-latest (push) Has been cancelled
CI / Test / macos-latest (push) Has been cancelled
CI / Test / ubuntu-latest (push) Has been cancelled
CI / Test / windows-latest (push) Has been cancelled
CI / Clippy (push) Has been cancelled
CI / Format (push) Has been cancelled
CI / Security Audit (push) Has been cancelled
CI / Secrets Scan (push) Has been cancelled
CI / Install Script Smoke Test (push) Has been cancelled
初始化提交
2026-03-01 16:24:24 +08:00

1355 lines
28 KiB
Markdown

# OpenFang CLI Reference
Complete command-line reference for `openfang`, the CLI tool for the OpenFang Agent OS.
## Overview
The `openfang` binary is the primary interface for managing the OpenFang Agent OS. It supports two modes of operation:
- **Daemon mode** -- When a daemon is running (`openfang start`), CLI commands communicate with it over HTTP. This is the recommended mode for production use.
- **In-process mode** -- When no daemon is detected, commands that support it will boot an ephemeral in-process kernel. Agents spawned in this mode are not persisted and will be lost when the process exits.
Running `openfang` with no subcommand launches the interactive TUI (terminal user interface) built with ratatui, which provides a full dashboard experience in the terminal.
## Installation
### From source (cargo)
```bash
cargo install --path crates/openfang-cli
```
### Build from workspace
```bash
cargo build --release -p openfang-cli
# Binary: target/release/openfang (or openfang.exe on Windows)
```
### Docker
```bash
docker run -it openfang/openfang:latest
```
### Shell installer
```bash
curl -fsSL https://get.openfang.ai | sh
```
## Global Options
These options apply to all commands.
| Option | Description |
|---|---|
| `--config <PATH>` | Path to a custom config file. Overrides the default `~/.openfang/config.toml`. |
| `--help` | Print help information for any command or subcommand. |
| `--version` | Print the version of the `openfang` binary. |
**Environment variables:**
| Variable | Description |
|---|---|
| `RUST_LOG` | Controls log verbosity (e.g. `info`, `debug`, `openfang_kernel=trace`). |
| `OPENFANG_AGENTS_DIR` | Override the agent templates directory. |
| `EDITOR` / `VISUAL` | Editor used by `openfang config edit`. Falls back to `notepad` (Windows) or `vi` (Unix). |
---
## Command Reference
### openfang (no subcommand)
Launch the interactive TUI dashboard.
```
openfang [--config <PATH>]
```
The TUI provides a full-screen terminal interface with panels for agents, chat, workflows, channels, skills, settings, and more. Tracing output is redirected to `~/.openfang/tui.log` to avoid corrupting the terminal display.
Press `Ctrl+C` to exit. A second `Ctrl+C` force-exits the process.
---
### openfang init
Initialize the OpenFang workspace. Creates `~/.openfang/` with subdirectories (`data/`, `agents/`) and a default `config.toml`.
```
openfang init [--quick]
```
**Options:**
| Option | Description |
|---|---|
| `--quick` | Skip interactive prompts. Auto-detects the best available LLM provider and writes config immediately. Suitable for CI/scripts. |
**Behavior:**
- Without `--quick`: Launches an interactive 5-step onboarding wizard (ratatui TUI) that walks through provider selection, API key configuration, and optionally starts the daemon.
- With `--quick`: Auto-detects providers by checking environment variables in priority order: Groq, Gemini, DeepSeek, Anthropic, OpenAI, OpenRouter. Falls back to Groq if none are found.
- File permissions are restricted to owner-only (`0600` for files, `0700` for directories) on Unix.
**Example:**
```bash
# Interactive setup
openfang init
# Non-interactive (CI/scripts)
export GROQ_API_KEY="gsk_..."
openfang init --quick
```
---
### openfang start
Start the OpenFang daemon (kernel + API server).
```
openfang start [--config <PATH>]
```
**Behavior:**
- Checks if a daemon is already running; exits with an error if so.
- Boots the OpenFang kernel (loads config, initializes SQLite database, loads agents, connects MCP servers, starts background tasks).
- Starts the HTTP API server on the address specified in `config.toml` (default: `127.0.0.1:4200`).
- Writes `daemon.json` to `~/.openfang/` so other CLI commands can discover the running daemon.
- Blocks until interrupted with `Ctrl+C`.
**Output:**
```
OpenFang Agent OS v0.1.0
Starting daemon...
[ok] Kernel booted (groq/llama-3.3-70b-versatile)
[ok] 50 models available
[ok] 3 agent(s) loaded
API: http://127.0.0.1:4200
Dashboard: http://127.0.0.1:4200/
Provider: groq
Model: llama-3.3-70b-versatile
hint: Open the dashboard in your browser, or run `openfang chat`
hint: Press Ctrl+C to stop the daemon
```
**Example:**
```bash
# Start with default config
openfang start
# Start with custom config
openfang start --config /path/to/config.toml
```
---
### openfang status
Show the current kernel/daemon status.
```
openfang status [--json]
```
**Options:**
| Option | Description |
|---|---|
| `--json` | Output machine-readable JSON for scripting. |
**Behavior:**
- If a daemon is running: queries `GET /api/status` and displays agent count, provider, model, uptime, API URL, data directory, and lists active agents.
- If no daemon is running: boots an in-process kernel and shows persisted state. Displays a warning that the daemon is not running.
**Example:**
```bash
openfang status
openfang status --json | jq '.agent_count'
```
---
### openfang doctor
Run diagnostic checks on the OpenFang installation.
```
openfang doctor [--json] [--repair]
```
**Options:**
| Option | Description |
|---|---|
| `--json` | Output results as JSON for scripting. |
| `--repair` | Attempt to auto-fix issues (create missing directories, config, remove stale files). Prompts for confirmation before each repair. |
**Checks performed:**
1. **OpenFang directory** -- `~/.openfang/` exists
2. **.env file** -- exists and has correct permissions (0600 on Unix)
3. **Config TOML syntax** -- `config.toml` parses without errors
4. **Daemon status** -- whether a daemon is running
5. **Port 4200 availability** -- if daemon is not running, checks if the port is free
6. **Stale daemon.json** -- leftover `daemon.json` from a crashed daemon
7. **Database file** -- SQLite magic bytes validation
8. **Disk space** -- warns if less than 100MB available (Unix only)
9. **Agent manifests** -- validates all `.toml` files in `~/.openfang/agents/`
10. **LLM provider keys** -- checks env vars for 10 providers (Groq, OpenRouter, Anthropic, OpenAI, DeepSeek, Gemini, Google, Together, Mistral, Fireworks), performs live validation (401/403 detection)
11. **Channel tokens** -- format validation for Telegram, Discord, Slack tokens
12. **Config consistency** -- checks that `api_key_env` references in config match actual environment variables
13. **Rust toolchain** -- `rustc --version`
**Example:**
```bash
openfang doctor
openfang doctor --repair
openfang doctor --json
```
---
### openfang dashboard
Open the web dashboard in the default browser.
```
openfang dashboard
```
**Behavior:**
- Requires a running daemon.
- Opens the daemon URL (e.g. `http://127.0.0.1:4200/`) in the system browser.
- Copies the URL to the system clipboard (uses PowerShell on Windows, `pbcopy` on macOS, `xclip`/`xsel` on Linux).
**Example:**
```bash
openfang dashboard
```
---
### openfang completion
Generate shell completion scripts.
```
openfang completion <SHELL>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<SHELL>` | Target shell. One of: `bash`, `zsh`, `fish`, `elvish`, `powershell`. |
**Example:**
```bash
# Bash
openfang completion bash > ~/.bash_completion.d/openfang
# Zsh
openfang completion zsh > ~/.zfunc/_openfang
# Fish
openfang completion fish > ~/.config/fish/completions/openfang.fish
# PowerShell
openfang completion powershell > openfang.ps1
```
---
## Agent Commands
### openfang agent new
Spawn an agent from a built-in template.
```
openfang agent new [<TEMPLATE>]
```
**Arguments:**
| Argument | Description |
|---|---|
| `<TEMPLATE>` | Template name (e.g. `coder`, `assistant`, `researcher`). If omitted, displays an interactive picker listing all available templates. |
**Behavior:**
- Templates are discovered from: the repo `agents/` directory (dev builds), `~/.openfang/agents/` (installed), and `OPENFANG_AGENTS_DIR` (env override).
- Each template is a directory containing an `agent.toml` manifest.
- In daemon mode: sends `POST /api/agents` with the manifest. Agent is persistent.
- In standalone mode: boots an in-process kernel. Agent is ephemeral.
**Example:**
```bash
# Interactive picker
openfang agent new
# Spawn by name
openfang agent new coder
# Spawn the assistant template
openfang agent new assistant
```
---
### openfang agent spawn
Spawn an agent from a custom manifest file.
```
openfang agent spawn <MANIFEST>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<MANIFEST>` | Path to an agent manifest TOML file. |
**Behavior:**
- Reads and parses the TOML manifest file.
- In daemon mode: sends the raw TOML to `POST /api/agents`.
- In standalone mode: boots an in-process kernel and spawns the agent locally.
**Example:**
```bash
openfang agent spawn ./my-agent/agent.toml
```
---
### openfang agent list
List all running agents.
```
openfang agent list [--json]
```
**Options:**
| Option | Description |
|---|---|
| `--json` | Output as JSON array for scripting. |
**Output columns:** ID, NAME, STATE, PROVIDER, MODEL (daemon mode) or ID, NAME, STATE, CREATED (in-process mode).
**Example:**
```bash
openfang agent list
openfang agent list --json | jq '.[].name'
```
---
### openfang agent chat
Start an interactive chat session with a specific agent.
```
openfang agent chat <AGENT_ID>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<AGENT_ID>` | Agent UUID. Obtain from `openfang agent list`. |
**Behavior:**
- Opens a REPL-style chat loop.
- Type messages at the `you>` prompt.
- Agent responses display at the `agent>` prompt, followed by token usage and iteration count.
- Type `exit`, `quit`, or press `Ctrl+C` to end the session.
**Example:**
```bash
openfang agent chat a1b2c3d4-e5f6-7890-abcd-ef1234567890
```
---
### openfang agent kill
Terminate a running agent.
```
openfang agent kill <AGENT_ID>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<AGENT_ID>` | Agent UUID to terminate. |
**Example:**
```bash
openfang agent kill a1b2c3d4-e5f6-7890-abcd-ef1234567890
```
---
## Workflow Commands
All workflow commands require a running daemon.
### openfang workflow list
List all registered workflows.
```
openfang workflow list
```
**Output columns:** ID, NAME, STEPS, CREATED.
---
### openfang workflow create
Create a workflow from a JSON definition file.
```
openfang workflow create <FILE>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<FILE>` | Path to a JSON file describing the workflow steps. |
**Example:**
```bash
openfang workflow create ./my-workflow.json
```
---
### openfang workflow run
Execute a workflow by ID.
```
openfang workflow run <WORKFLOW_ID> <INPUT>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<WORKFLOW_ID>` | Workflow UUID. Obtain from `openfang workflow list`. |
| `<INPUT>` | Input text to pass to the workflow. |
**Example:**
```bash
openfang workflow run abc123 "Analyze this code for security issues"
```
---
## Trigger Commands
All trigger commands require a running daemon.
### openfang trigger list
List all event triggers.
```
openfang trigger list [--agent-id <ID>]
```
**Options:**
| Option | Description |
|---|---|
| `--agent-id <ID>` | Filter triggers by the owning agent's UUID. |
**Output columns:** TRIGGER ID, AGENT ID, ENABLED, FIRES, PATTERN.
---
### openfang trigger create
Create an event trigger for an agent.
```
openfang trigger create <AGENT_ID> <PATTERN_JSON> [--prompt <TEMPLATE>] [--max-fires <N>]
```
**Arguments:**
| Argument | Description |
|---|---|
| `<AGENT_ID>` | UUID of the agent that owns the trigger. |
| `<PATTERN_JSON>` | Trigger pattern as a JSON string. |
**Options:**
| Option | Default | Description |
|---|---|---|
| `--prompt <TEMPLATE>` | `"Event: {{event}}"` | Prompt template. Use `{{event}}` as a placeholder for the event data. |
| `--max-fires <N>` | `0` (unlimited) | Maximum number of times the trigger will fire. |
**Pattern examples:**
```bash
# Fire on any lifecycle event
openfang trigger create <AGENT_ID> '{"lifecycle":{}}'
# Fire when a specific agent is spawned
openfang trigger create <AGENT_ID> '{"agent_spawned":{"name_pattern":"*"}}'
# Fire on agent termination
openfang trigger create <AGENT_ID> '{"agent_terminated":{}}'
# Fire on all events (limited to 10 fires)
openfang trigger create <AGENT_ID> '{"all":{}}' --max-fires 10
```
---
### openfang trigger delete
Delete a trigger by ID.
```
openfang trigger delete <TRIGGER_ID>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<TRIGGER_ID>` | UUID of the trigger to delete. |
---
## Skill Commands
### openfang skill list
List all installed skills.
```
openfang skill list
```
**Output columns:** NAME, VERSION, TOOLS, DESCRIPTION.
Loads skills from `~/.openfang/skills/` plus bundled skills compiled into the binary.
---
### openfang skill install
Install a skill from a local directory, git URL, or FangHub marketplace.
```
openfang skill install <SOURCE>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<SOURCE>` | Skill name (FangHub), local directory path, or git URL. |
**Behavior:**
- **Local directory:** Looks for `skill.toml` in the directory. If not found, checks for OpenClaw-format skills (SKILL.md with YAML frontmatter) and auto-converts them.
- **Remote (FangHub):** Fetches and installs from the FangHub marketplace. Skills pass through SHA256 verification and prompt injection scanning.
**Example:**
```bash
# Install from local directory
openfang skill install ./my-skill/
# Install from FangHub
openfang skill install web-search
# Install an OpenClaw-format skill
openfang skill install ./openclaw-skill/
```
---
### openfang skill remove
Remove an installed skill.
```
openfang skill remove <NAME>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<NAME>` | Name of the skill to remove. |
**Example:**
```bash
openfang skill remove web-search
```
---
### openfang skill search
Search the FangHub marketplace for skills.
```
openfang skill search <QUERY>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<QUERY>` | Search query string. |
**Example:**
```bash
openfang skill search "docker kubernetes"
```
---
### openfang skill create
Interactively scaffold a new skill project.
```
openfang skill create
```
**Behavior:**
Prompts for:
- Skill name
- Description
- Runtime (`python`, `node`, or `wasm`; defaults to `python`)
Creates a directory under `~/.openfang/skills/<name>/` with:
- `skill.toml` -- manifest file
- `src/main.py` (or `src/index.js`) -- entry point with boilerplate
**Example:**
```bash
openfang skill create
# Skill name: my-tool
# Description: A custom analysis tool
# Runtime (python/node/wasm) [python]: python
```
---
## Channel Commands
### openfang channel list
List configured channels and their status.
```
openfang channel list
```
**Output columns:** CHANNEL, ENV VAR, STATUS.
Checks `config.toml` for channel configuration sections and environment variables for required tokens. Status is one of: `Ready`, `Missing env`, `Not configured`.
**Channels checked:** webchat, telegram, discord, slack, whatsapp, signal, matrix, email.
---
### openfang channel setup
Interactive setup wizard for a channel integration.
```
openfang channel setup [<CHANNEL>]
```
**Arguments:**
| Argument | Description |
|---|---|
| `<CHANNEL>` | Channel name. If omitted, displays an interactive picker. |
**Supported channels:** `telegram`, `discord`, `slack`, `whatsapp`, `email`, `signal`, `matrix`.
Each wizard:
1. Displays step-by-step instructions for obtaining credentials.
2. Prompts for tokens/credentials.
3. Saves tokens to `~/.openfang/.env` with owner-only permissions.
4. Appends the channel configuration block to `config.toml` (prompts for confirmation).
5. Warns to restart the daemon if one is running.
**Example:**
```bash
# Interactive picker
openfang channel setup
# Direct setup
openfang channel setup telegram
openfang channel setup discord
openfang channel setup slack
```
---
### openfang channel test
Send a test message through a configured channel.
```
openfang channel test <CHANNEL>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<CHANNEL>` | Channel name to test. |
Requires a running daemon. Sends `POST /api/channels/<channel>/test`.
**Example:**
```bash
openfang channel test telegram
```
---
### openfang channel enable
Enable a channel integration.
```
openfang channel enable <CHANNEL>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<CHANNEL>` | Channel name to enable. |
In daemon mode: sends `POST /api/channels/<channel>/enable`. Without a daemon: prints a note that the change will take effect on next start.
---
### openfang channel disable
Disable a channel without removing its configuration.
```
openfang channel disable <CHANNEL>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<CHANNEL>` | Channel name to disable. |
In daemon mode: sends `POST /api/channels/<channel>/disable`. Without a daemon: prints a note to edit `config.toml`.
---
## Config Commands
### openfang config show
Display the current configuration file.
```
openfang config show
```
Prints the contents of `~/.openfang/config.toml` with the file path as a header comment.
---
### openfang config edit
Open the configuration file in your editor.
```
openfang config edit
```
Uses `$EDITOR`, then `$VISUAL`, then falls back to `notepad` (Windows) or `vi` (Unix).
---
### openfang config get
Get a single configuration value by dotted key path.
```
openfang config get <KEY>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<KEY>` | Dotted key path into the TOML structure. |
**Example:**
```bash
openfang config get default_model.provider
# groq
openfang config get api_listen
# 127.0.0.1:4200
openfang config get memory.decay_rate
# 0.05
```
---
### openfang config set
Set a configuration value by dotted key path.
```
openfang config set <KEY> <VALUE>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<KEY>` | Dotted key path. |
| `<VALUE>` | New value. Type is inferred from the existing value (integer, float, boolean, or string). |
**Warning:** This command re-serializes the TOML file, which strips all comments.
**Example:**
```bash
openfang config set default_model.provider anthropic
openfang config set default_model.model claude-sonnet-4-20250514
openfang config set api_listen "0.0.0.0:4200"
```
---
### openfang config set-key
Save an LLM provider API key to `~/.openfang/.env`.
```
openfang config set-key <PROVIDER>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<PROVIDER>` | Provider name (e.g. `groq`, `anthropic`, `openai`, `gemini`, `deepseek`, `openrouter`, `together`, `mistral`, `fireworks`, `perplexity`, `cohere`, `xai`, `brave`, `tavily`). |
**Behavior:**
- Prompts interactively for the API key.
- Saves to `~/.openfang/.env` as `<PROVIDER_NAME>_API_KEY=<value>`.
- Runs a live validation test against the provider's API.
- File permissions are restricted to owner-only on Unix.
**Example:**
```bash
openfang config set-key groq
# Paste your groq API key: gsk_...
# [ok] Saved GROQ_API_KEY to ~/.openfang/.env
# Testing key... OK
```
---
### openfang config delete-key
Remove an API key from `~/.openfang/.env`.
```
openfang config delete-key <PROVIDER>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<PROVIDER>` | Provider name. |
**Example:**
```bash
openfang config delete-key openai
```
---
### openfang config test-key
Test provider connectivity with the stored API key.
```
openfang config test-key <PROVIDER>
```
**Arguments:**
| Argument | Description |
|---|---|
| `<PROVIDER>` | Provider name. |
**Behavior:**
- Reads the API key from the environment (loaded from `~/.openfang/.env`).
- Hits the provider's models/health endpoint.
- Reports `OK` (key accepted) or `FAILED (401/403)` (key rejected).
- Exits with code 1 on failure.
**Example:**
```bash
openfang config test-key groq
# Testing groq (GROQ_API_KEY)... OK
```
---
## Quick Chat
### openfang chat
Quick alias for starting a chat session.
```
openfang chat [<AGENT>]
```
**Arguments:**
| Argument | Description |
|---|---|
| `<AGENT>` | Optional agent name or UUID. |
**Behavior:**
- **Daemon mode:** Finds the agent by name or ID among running agents. If no agent name is given, uses the first available agent. If no agents exist, suggests `openfang agent new`.
- **Standalone mode (no daemon):** Boots an in-process kernel and auto-spawns an agent from templates. Searches for an agent matching the given name, then falls back to `assistant`, then to the first available template.
This is the simplest way to start chatting -- it works with or without a daemon.
**Example:**
```bash
# Chat with the default agent
openfang chat
# Chat with a specific agent by name
openfang chat coder
# Chat with a specific agent by UUID
openfang chat a1b2c3d4-e5f6-7890-abcd-ef1234567890
```
---
## Migration
### openfang migrate
Migrate configuration and agents from another agent framework.
```
openfang migrate --from <FRAMEWORK> [--source-dir <PATH>] [--dry-run]
```
**Options:**
| Option | Description |
|---|---|
| `--from <FRAMEWORK>` | Source framework. One of: `openclaw`, `langchain`, `autogpt`. |
| `--source-dir <PATH>` | Path to the source workspace. Auto-detected if not set (e.g. `~/.openclaw`, `~/.langchain`, `~/Auto-GPT`). |
| `--dry-run` | Show what would be imported without making changes. |
**Behavior:**
- Converts agent configurations, YAML manifests, and settings from the source framework into OpenFang format.
- Saves imported data to `~/.openfang/`.
- Writes a `migration_report.md` summarizing what was imported.
**Example:**
```bash
# Dry run migration from OpenClaw
openfang migrate --from openclaw --dry-run
# Migrate from OpenClaw (auto-detect source)
openfang migrate --from openclaw
# Migrate from LangChain with explicit source
openfang migrate --from langchain --source-dir /home/user/.langchain
# Migrate from AutoGPT
openfang migrate --from autogpt
```
---
## MCP Server
### openfang mcp
Start an MCP (Model Context Protocol) server over stdio.
```
openfang mcp
```
**Behavior:**
- Exposes running OpenFang agents as MCP tools via JSON-RPC 2.0 over stdin/stdout with Content-Length framing.
- Each agent becomes a callable tool named `openfang_agent_<name>` (hyphens replaced with underscores).
- Connects to a running daemon via HTTP if available; otherwise boots an in-process kernel.
- Protocol version: `2024-11-05`.
- Maximum message size: 10MB (security limit).
**Supported MCP methods:**
| Method | Description |
|---|---|
| `initialize` | Returns server capabilities and info. |
| `tools/list` | Lists all available agent tools. |
| `tools/call` | Sends a message to an agent and returns the response. |
**Tool input schema:**
Each agent tool accepts a single `message` (string) argument.
**Integration with Claude Desktop / other MCP clients:**
Add to your MCP client configuration:
```json
{
"mcpServers": {
"openfang": {
"command": "openfang",
"args": ["mcp"]
}
}
}
```
---
## Daemon Auto-Detect
The CLI uses a two-step mechanism to detect a running daemon:
1. **Read `daemon.json`:** On startup, the daemon writes `~/.openfang/daemon.json` containing the listen address (e.g. `127.0.0.1:4200`). The CLI reads this file to learn where the daemon is.
2. **Health check:** The CLI sends `GET http://<listen_addr>/api/health` with a 2-second timeout. If the health check succeeds, the daemon is considered running and the CLI uses HTTP to communicate with it.
If either step fails (no `daemon.json`, stale file, health check timeout), the CLI falls back to in-process mode for commands that support it. Commands that require a daemon (workflows, triggers, channel test/enable/disable, dashboard) will exit with an error and a helpful message.
**Daemon lifecycle:**
```
openfang start # Starts daemon, writes daemon.json
# Other CLI instances detect daemon.json
openfang status # Connects to daemon via HTTP
Ctrl+C # Daemon shuts down, daemon.json removed
openfang doctor --repair # Cleans up stale daemon.json from crashes
```
---
## Environment File
OpenFang loads `~/.openfang/.env` into the process environment on every CLI invocation. System environment variables take priority over `.env` values.
The `.env` file stores API keys and secrets:
```bash
GROQ_API_KEY=gsk_...
ANTHROPIC_API_KEY=sk-ant-...
GEMINI_API_KEY=AIza...
TELEGRAM_BOT_TOKEN=123456:ABC-DEF...
```
Manage keys with the `config set-key` / `config delete-key` commands rather than editing the file directly, as these commands enforce correct permissions.
---
## Exit Codes
| Code | Meaning |
|---|---|
| `0` | Success. |
| `1` | General error (invalid arguments, failed operations, missing daemon, parse errors, spawn failures). |
| `130` | Interrupted by second `Ctrl+C` (force exit). |
---
## Examples
### First-time setup
```bash
# 1. Set your API key
export GROQ_API_KEY="gsk_your_key_here"
# 2. Initialize OpenFang
openfang init --quick
# 3. Start the daemon
openfang start
```
### Daily usage
```bash
# Quick chat (auto-spawns agent if needed)
openfang chat
# Chat with a specific agent
openfang chat coder
# Check what's running
openfang status
# Open the web dashboard
openfang dashboard
```
### Agent management
```bash
# Spawn from a template
openfang agent new assistant
# Spawn from a custom manifest
openfang agent spawn ./agents/custom-agent/agent.toml
# List running agents
openfang agent list
# Chat with an agent by UUID
openfang agent chat <UUID>
# Kill an agent
openfang agent kill <UUID>
```
### Workflow automation
```bash
# Create a workflow
openfang workflow create ./review-pipeline.json
# List workflows
openfang workflow list
# Run a workflow
openfang workflow run <WORKFLOW_ID> "Review the latest PR"
```
### Event triggers
```bash
# Create a trigger that fires on agent spawn
openfang trigger create <AGENT_ID> '{"agent_spawned":{"name_pattern":"*"}}' \
--prompt "New agent spawned: {{event}}" \
--max-fires 100
# List all triggers
openfang trigger list
# List triggers for a specific agent
openfang trigger list --agent-id <AGENT_ID>
# Delete a trigger
openfang trigger delete <TRIGGER_ID>
```
### Skill management
```bash
# Search FangHub
openfang skill search "code review"
# Install a skill
openfang skill install code-reviewer
# List installed skills
openfang skill list
# Create a new skill
openfang skill create
# Remove a skill
openfang skill remove code-reviewer
```
### Channel setup
```bash
# Interactive channel picker
openfang channel setup
# Direct channel setup
openfang channel setup telegram
# Check channel status
openfang channel list
# Test a channel
openfang channel test telegram
# Enable/disable channels
openfang channel enable discord
openfang channel disable slack
```
### Configuration
```bash
# View config
openfang config show
# Get a specific value
openfang config get default_model.provider
# Change provider
openfang config set default_model.provider anthropic
openfang config set default_model.model claude-sonnet-4-20250514
openfang config set default_model.api_key_env ANTHROPIC_API_KEY
# Manage API keys
openfang config set-key anthropic
openfang config test-key anthropic
openfang config delete-key openai
# Open in editor
openfang config edit
```
### Migration from other frameworks
```bash
# Preview migration
openfang migrate --from openclaw --dry-run
# Run migration
openfang migrate --from openclaw
# Migrate from LangChain
openfang migrate --from langchain --source-dir ~/.langchain
```
### MCP integration
```bash
# Start MCP server for Claude Desktop or other MCP clients
openfang mcp
```
### Diagnostics
```bash
# Run all diagnostic checks
openfang doctor
# Auto-repair issues
openfang doctor --repair
# Machine-readable diagnostics
openfang doctor --json
```
### Shell completions
```bash
# Generate and install completions for your shell
openfang completion bash >> ~/.bashrc
openfang completion zsh > "${fpath[1]}/_openfang"
openfang completion fish > ~/.config/fish/completions/openfang.fish
```
---
## Supported LLM Providers
The following providers are recognized by `openfang config set-key` and `openfang doctor`:
| Provider | Environment Variable | Default Model |
|---|---|---|
| Groq | `GROQ_API_KEY` | `llama-3.3-70b-versatile` |
| Gemini | `GEMINI_API_KEY` or `GOOGLE_API_KEY` | `gemini-2.5-flash` |
| DeepSeek | `DEEPSEEK_API_KEY` | `deepseek-chat` |
| Anthropic | `ANTHROPIC_API_KEY` | `claude-sonnet-4-20250514` |
| OpenAI | `OPENAI_API_KEY` | `gpt-4o` |
| OpenRouter | `OPENROUTER_API_KEY` | `openrouter/auto` |
| Together | `TOGETHER_API_KEY` | -- |
| Mistral | `MISTRAL_API_KEY` | -- |
| Fireworks | `FIREWORKS_API_KEY` | -- |
| Perplexity | `PERPLEXITY_API_KEY` | -- |
| Cohere | `COHERE_API_KEY` | -- |
| xAI | `XAI_API_KEY` | -- |
Additional search/fetch provider keys: `BRAVE_API_KEY`, `TAVILY_API_KEY`.