mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
164 lines
5.2 KiB
Markdown
164 lines
5.2 KiB
Markdown
# 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 <uuid> --content "Hello"
|
|||
|
|
sprout send-message --channel <uuid> --content "Reply" --reply-to <event-id> --broadcast
|
|||
|
|
sprout get-messages --channel <uuid> --limit 20
|
|||
|
|
sprout get-thread --channel <uuid> --event <event-id>
|
|||
|
|
sprout search --query "architecture"
|
|||
|
|
sprout edit-message --event <event-id> --content "Updated text"
|
|||
|
|
sprout delete-message --event <event-id>
|
|||
|
|
|
|||
|
|
# Diffs
|
|||
|
|
sprout send-diff-message --channel <uuid> --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 <uuid>
|
|||
|
|
sprout set-channel-topic --channel <uuid> --topic "New topic"
|
|||
|
|
|
|||
|
|
# Reactions
|
|||
|
|
sprout add-reaction --event <event-id> --emoji "👍"
|
|||
|
|
sprout get-reactions --event <event-id>
|
|||
|
|
|
|||
|
|
# Users & Presence
|
|||
|
|
sprout get-users # your own profile
|
|||
|
|
sprout get-users --pubkey <hex> # single user
|
|||
|
|
sprout get-users --pubkey <hex> --pubkey <hex> # batch (max 200)
|
|||
|
|
sprout set-presence --status online
|
|||
|
|
|
|||
|
|
# DMs
|
|||
|
|
sprout open-dm --pubkey <hex>
|
|||
|
|
sprout list-dms
|
|||
|
|
|
|||
|
|
# Workflows
|
|||
|
|
sprout list-workflows --channel <uuid>
|
|||
|
|
sprout trigger-workflow --workflow <uuid>
|
|||
|
|
sprout approve-step --token <uuid> --approved true
|
|||
|
|
|
|||
|
|
# Forum
|
|||
|
|
sprout vote-on-post --event <event-id> --direction up
|
|||
|
|
|
|||
|
|
# Canvas
|
|||
|
|
sprout get-canvas --channel <uuid>
|
|||
|
|
sprout set-canvas --channel <uuid> --content "# Welcome"
|
|||
|
|
|
|||
|
|
# Tokens
|
|||
|
|
sprout auth # mint token, print to stdout
|
|||
|
|
sprout list-tokens
|
|||
|
|
sprout delete-token --id <uuid>
|
|||
|
|
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 <command> [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
|
|||
|
|
```
|