Files
Aetheel/docs/commands.md
tanmay11k 6d73f74e0b feat: config-driven architecture, install wizard, live runtime switching, usage tracking, auto-failover
Major changes:
- Config-driven adapters: all channels (Slack, Discord, Telegram, WebChat, Webhooks) controlled via config.json with enabled flags and token auto-detection, no CLI flags required
- Runtime engine field: runtime.engine selects opencode/claude from config
- Interactive install script: 8-phase setup wizard with AI runtime detection/installation, token setup, identity file personalization (personality presets), aetheel CLI command, background service (launchd/systemd)
- Live runtime switching: /engine, /model, /provider commands hot-swap the AI runtime from chat without restart, changes persisted to config.json
- Usage tracking: per-request cost extraction from Claude Code JSON output, cumulative stats via /usage command
- Auto-failover: rate limit detection on both runtimes, automatic switch to other engine on quota errors with user notification
- Chat commands work without / prefix (Slack intercepts / in channels), commands: engine, model, provider, config, usage, reload, cron, subagents, status, help
- /config set for editing config.json from chat with dotted key notation
- Security audit saved to docs/security-audit.md
- Full command reference in docs/commands.md
- Future changes doc with NanoClaw agent teams analysis
- Logo added to README and WebChat UI
- README fully rewritten with all features documented
2026-02-18 01:07:12 -05:00

5.8 KiB

Aetheel Commands Reference

All commands work across every adapter (Slack, Discord, Telegram, WebChat).

Chat Commands

Type these as regular messages in any channel or DM. No / prefix needed — just send the word as a message. The / prefix also works in DMs and on platforms that don't intercept it (Discord, Telegram, WebChat).

In Slack channels, Slack intercepts / as a native slash command and blocks it. Use the prefix-free form instead (e.g. engine claude not /engine claude). In Slack DMs with the bot, both forms work.

General

Command Description
status Show bot status, engine, model, sessions
help Show all available commands
time Current server time
sessions Active session count + cleanup stale
reload Reload config.json and skills
subagents List active background tasks

Runtime Switching (live, no restart needed)

Command Description
engine Show current engine (opencode/claude)
engine opencode Switch to OpenCode runtime
engine claude Switch to Claude Code runtime
model Show current model
model <name> Switch model (e.g. model anthropic/claude-sonnet-4-20250514)
provider Show current provider (OpenCode only)
provider <name> Switch provider (e.g. provider anthropic, provider openai)
usage Show LLM usage stats, costs, and rate limit history

Engine, model, and provider changes take effect immediately and are persisted to config.json so they survive restarts.

Examples

engine claude
model claude-sonnet-4-20250514

engine opencode
model anthropic/claude-sonnet-4-20250514
provider anthropic

model openai/gpt-4o
provider openai

model google/gemini-2.5-pro
provider google

Configuration

Command Description
config Show config summary (engine, model, adapters)
config show Dump full config.json
config set <key> <value> Edit a config value (dotted notation)

Config Set Examples

config set runtime.timeout_seconds 300
config set claude.max_turns 5
config set webchat.enabled true
config set discord.enabled true
config set webhooks.token my-secret-token
config set heartbeat.silent true

After config set, run reload to apply changes that don't auto-apply (adapter changes require a restart).

Scheduler

Command Description
cron list List all scheduled jobs
cron remove <id> Remove a scheduled job by ID

AI Chat

Any message that isn't a command is sent to the AI. The AI can also trigger actions by including tags in its response:

AI Action Tag What It Does
[ACTION:remind|<minutes>|<message>] Schedule a one-shot reminder
[ACTION:cron|<cron_expr>|<prompt>] Schedule a recurring cron job
[ACTION:spawn|<task>] Spawn a background subagent

Terminal Commands

After installation, the aetheel command is available in your shell.

Service Management

Command Description
aetheel start Start Aetheel in the foreground
aetheel stop Stop the background service
aetheel restart Restart the background service
aetheel status Show install and service status
aetheel logs Tail the live log file

Setup & Maintenance

Command Description
aetheel setup Re-run the interactive setup wizard
aetheel update Pull latest code + update dependencies
aetheel doctor Run diagnostics (config, tokens, runtimes)
aetheel config Open config.json in your $EDITOR

Pass-Through

Any other arguments are passed directly to main.py:

aetheel --test              # Echo mode, no AI
aetheel --claude            # Override: use Claude engine
aetheel --model gpt-4o      # Override: specific model
aetheel --log DEBUG          # Override: debug logging

These flags are optional overrides. All settings come from ~/.aetheel/config.json by default.


Config File Reference

All features are controlled by ~/.aetheel/config.json. No flags required.

{
  "runtime": {
    "engine": "opencode",       // "opencode" or "claude"
    "mode": "cli",              // "cli" or "sdk"
    "model": null,              // e.g. "anthropic/claude-sonnet-4-20250514"
    "provider": null,           // e.g. "anthropic", "openai", "google"
    "timeout_seconds": 120
  },
  "claude": {
    "model": null,              // e.g. "claude-sonnet-4-20250514"
    "max_turns": 3,
    "no_tools": false
  },
  "slack":    { "enabled": true },
  "telegram": { "enabled": false },
  "discord":  { "enabled": false, "listen_channels": [] },
  "webchat":  { "enabled": false, "port": 8080 },
  "webhooks": { "enabled": false, "port": 8090, "token": "" },
  "heartbeat": { "enabled": true },
  "hooks":    { "enabled": true }
}

Adapters auto-enable when their token is set in .env, even if enabled is false in config.


Auto-Failover & Rate Limit Handling

When a rate limit or quota error is detected from the active engine:

  1. Aetheel notifies you in the channel with the error details
  2. Automatically attempts to failover to the other engine (claude → opencode or vice versa)
  3. If failover succeeds, the response is delivered and the active engine is switched
  4. If failover also fails, both errors are reported

Rate limit detection covers: HTTP 429, "rate limit", "quota exceeded", "too many requests", "usage limit", "credit balance", "overloaded", and similar patterns from both Claude Code and OpenCode.

Use usage to see cumulative stats including rate limit hits and failover count.

Note: Claude Code's --output-format json returns cost_usd per request. OpenCode does not currently expose per-request cost in its CLI output, so cost tracking is only available for the Claude engine.