mirror of
https://github.com/block/buzz.git
synced 2026-08-18 06:50:31 +02:00
Move drilled thread reply scoping out of MCP by having relay ingest suppress broadcast for branch-owned replies and letting desktop inherit branch ownership from the parent chain for live events. Made-with: Cursor
Sprout CLI
Agent-first command-line interface for Sprout relay. JSON in, JSON out.
Install
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 |
# 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.
# 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