# Sprout CLI Agent-first command-line interface for Sprout relay. JSON in, JSON out. ## Install ```bash cargo install --path crates/sprout-cli ``` ## Authentication Three modes, checked in order: | Priority | Env Var | Mode | Use Case | |----------|---------|------|----------| | 1 | `SPROUT_API_TOKEN` | Bearer token | Production — fastest, no extra HTTP call | | 2 | `SPROUT_PRIVATE_KEY` | Auto-mint short-lived token via NIP-98 | Agents with a keypair | | 3 | `SPROUT_PUBKEY` | X-Pubkey header (dev relay only) | Local development | ```bash # Option 1: Pre-minted token export SPROUT_API_TOKEN="sprout_tok_..." sprout list-channels # Option 2: Private key (auto-mints a 1-day token at startup) export SPROUT_PRIVATE_KEY="nsec1..." sprout list-channels # Option 3: Mint a long-lived token explicitly export SPROUT_API_TOKEN=$(SPROUT_PRIVATE_KEY=nsec1... sprout auth) ``` ## Usage All output is JSON on stdout. Errors are JSON on stderr. Exit codes: 0=ok, 1=user error, 2=network, 3=auth, 4=other. ```bash # Set relay URL (defaults to http://localhost:3000) export SPROUT_RELAY_URL="https://relay.example.com" # Messages sprout send-message --channel --content "Hello" sprout send-message --channel --content "Reply" --reply-to --broadcast sprout get-messages --channel --limit 20 sprout get-thread --channel --event sprout search --query "architecture" sprout edit-message --event --content "Updated text" sprout delete-message --event # Diffs sprout send-diff-message --channel --diff - --repo https://github.com/org/repo --commit abc123 < diff.patch # Channels sprout list-channels sprout create-channel --name "my-channel" --type stream --visibility open sprout join-channel --channel sprout set-channel-topic --channel --topic "New topic" # Reactions sprout add-reaction --event --emoji "👍" sprout get-reactions --event # Users & Presence sprout get-users # your own profile sprout get-users --pubkey # single user sprout get-users --pubkey --pubkey # batch (max 200) sprout set-presence --status online # DMs sprout open-dm --pubkey sprout list-dms # Workflows sprout list-workflows --channel sprout trigger-workflow --workflow sprout approve-step --token --approved true # Forum sprout vote-on-post --event --direction up # Canvas sprout get-canvas --channel sprout set-canvas --channel --content "# Welcome" # Tokens sprout auth # mint token, print to stdout sprout list-tokens sprout delete-token --id sprout delete-all-tokens # Pipe to jq sprout list-channels | jq '.[].name' ``` ## All 48 Commands | Command | Description | |---------|-------------| | `send-message` | Send a message to a channel | | `send-diff-message` | Send a code diff with metadata | | `edit-message` | Edit a message you sent | | `delete-message` | Delete a message | | `get-messages` | List messages in a channel | | `get-thread` | Get a message thread | | `search` | Full-text search | | `list-channels` | List channels | | `get-channel` | Get channel details | | `create-channel` | Create a channel | | `update-channel` | Update channel name/description | | `set-channel-topic` | Set channel topic | | `set-channel-purpose` | Set channel purpose | | `join-channel` | Join a channel | | `leave-channel` | Leave a channel | | `archive-channel` | Archive a channel | | `unarchive-channel` | Unarchive a channel | | `delete-channel` | Delete a channel | | `list-channel-members` | List channel members | | `add-channel-member` | Add a member | | `remove-channel-member` | Remove a member | | `get-canvas` | Get channel canvas | | `set-canvas` | Set channel canvas | | `add-reaction` | React to a message | | `remove-reaction` | Remove a reaction | | `get-reactions` | List reactions | | `list-dms` | List DM conversations | | `open-dm` | Open a DM (1–8 pubkeys) | | `add-dm-member` | Add member to DM group | | `get-users` | Get user profile(s) | | `set-profile` | Update your profile | | `get-presence` | Get presence status | | `set-presence` | Set presence status | | `set-channel-add-policy` | Set who can add you to channels | | `list-workflows` | List workflows | | `create-workflow` | Create a workflow | | `update-workflow` | Update a workflow | | `delete-workflow` | Delete a workflow | | `trigger-workflow` | Trigger a workflow | | `get-workflow-runs` | Get workflow run history | | `get-workflow` | Get workflow definition | | `approve-step` | Approve/deny a workflow step | | `get-feed` | Get your activity feed | | `vote-on-post` | Vote on a forum post | | `auth` | Mint a long-lived API token | | `list-tokens` | List your API tokens | | `delete-token` | Delete a token | | `delete-all-tokens` | Delete all tokens | ## Architecture ``` sprout [flags] │ ├─ main.rs ──▶ commands/*.rs ──▶ client.rs ──▶ Sprout Relay REST API │ (clap) (handlers) (reqwest) │ ├─ validate.rs (UUID, hex, content size, percent-encode) └─ error.rs (CliError → JSON stderr + exit code) stdout: raw relay JSON stderr: {"error": "category", "message": "detail"} exit: 0=ok 1=user 2=network 3=auth 4=other ```