blowhorn-axi
Reply in Slack as Blowhorn profiles, session only. Slack reads stay on the Cursor Slack connection; every write needs --confirm.
The agent interface to Blowhorn: TOON output, every write a dry run until --confirm, and every answer ending in a help[] list of next commands. It is installed with Blowhorn, next to blowhorn. Each command's --help prints the same text.
Exit codes:
| Exit code | Meaning |
|---|---|
0 |
Every profile succeeded (a dry run included) |
1 |
A refusal, a Slack rejection, an attribution finding or a partial failure |
2 |
A usage error: an unknown flag, command or missing value, caught before blowhorn runs |
3 |
The shared store could not be reached |
| Command | What it does |
|---|---|
blowhorn-axi |
Reply in Slack as Blowhorn profiles, session only. |
blowhorn-axi profile list |
Every profile: workspace, Slack user, session state |
blowhorn-axi profile status |
One profile: its Slack credential and each workspace's session |
blowhorn-axi slack send |
Send one message (a thread reply from a message link) as each profile, once. |
blowhorn-axi slack edit |
Replace the text of a message the profile sent with blowhorn (the send ledger says so). |
blowhorn-axi slack delete |
Delete a message the profile sent with blowhorn (the send ledger says so). |
blowhorn-axi slack react |
Add (or with --remove take back) an emoji reaction to any message as each profile. |
blowhorn-axi setup hooks |
Install or repair the SessionStart hooks that show this home view to Claude Code, Codex and OpenCode. |
blowhorn-axi
Reply in Slack as Blowhorn profiles, session only. Slack reads stay on the Cursor Slack connection; every write needs --confirm.
blowhorn-axiExamples:
blowhorn-axi
blowhorn-axi profile list
blowhorn-axi slack send --profile rian --to https://acme.slack.com/archives/C0123/p1776000000000100 --text-file reply.mdblowhorn-axi profile list
Every profile: workspace, Slack user, session state
blowhorn-axi profile list [-h] [--offline]| Flag | Type | Default | Description |
|---|---|---|---|
--offline |
boolean | false |
Skip auth.test; session reads unchecked |
Examples:
blowhorn-axi profile list
blowhorn-axi profile list --offlineblowhorn-axi profile status
One profile: its Slack credential and each workspace's session
blowhorn-axi profile status [-h] [--profile PROFILE] [--offline] [--full]| Flag | Type | Default | Description |
|---|---|---|---|
--profile |
string, repeatable | The profile to show | |
--offline |
boolean | false |
Skip auth.test; session reads unchecked |
--full |
boolean | false |
List every workspace, not the first five |
Examples:
blowhorn-axi profile status --profile rian
blowhorn-axi profile status --profile rian --fullblowhorn-axi slack send
Send one message (a thread reply from a message link) as each profile, once. Dry run unless --confirm. Session only: a profile with only an app token is refused (token_only). Slack reads (history, search, threads) are out of scope; use the Cursor Slack connection.
blowhorn-axi slack send [-h] [--profile PROFILE] [--confirm] [--dry-run] [--to TO] [--workspace WORKSPACE] [--idempotency-key IDEMPOTENCY_KEY] [--offline] [--full] [--text TEXT] [--text-file TEXT_FILE] [--message MESSAGE]| Flag | Type | Default | Description |
|---|---|---|---|
--profile |
string, repeatable | Profile to act as; repeat it or give a,b for several | |
--confirm |
boolean | false |
Actually do it; without it nothing is written to Slack |
--dry-run |
boolean | false |
Rehearse (the default); --confirm --dry-run is an error |
--to |
string | A Slack message link (thread reply), channel link, or #channel with --workspace | |
--workspace |
string | The workspace host when --to does not name one | |
--idempotency-key |
string | The key the send is recorded under (default: derived) | |
--offline |
boolean | false |
Skip the auth.test session check |
--full |
boolean | false |
Do not truncate the message preview |
--text |
string | '-' reads the text from stdin (mrkdwn passes through untouched) | |
--text-file |
string | Read the text from this UTF-8 file | |
--message |
string | One line of text |
Examples:
blowhorn-axi slack send --profile rian --to https://acme.slack.com/archives/C0123/p1776000000000100 --text-file reply.md
blowhorn-axi slack send --profile rian,lee --to https://acme.slack.com/archives/C0123/p1776000000000100 --text-file reply.md --confirm
blowhorn-axi slack send --profile rian --to '#general' --workspace acme.slack.com --text - --confirmblowhorn-axi slack edit
Replace the text of a message the profile sent with blowhorn (the send ledger says so). Dry run unless --confirm. Session only: a profile with only an app token is refused (token_only). Slack reads (history, search, threads) are out of scope; use the Cursor Slack connection.
blowhorn-axi slack edit [-h] [--profile PROFILE] [--confirm] [--dry-run] [--permalink PERMALINK] [--full] [--text TEXT] [--text-file TEXT_FILE] [--message MESSAGE]| Flag | Type | Default | Description |
|---|---|---|---|
--profile |
string, repeatable | Profile to act as; repeat it or give a,b for several | |
--confirm |
boolean | false |
Actually do it; without it nothing is written to Slack |
--dry-run |
boolean | false |
Rehearse (the default); --confirm --dry-run is an error |
--permalink |
string | The Slack message link of the message to edit | |
--full |
boolean | false |
Do not truncate the message preview |
--text |
string | '-' reads the text from stdin (mrkdwn passes through untouched) | |
--text-file |
string | Read the text from this UTF-8 file | |
--message |
string | One line of text |
Examples:
blowhorn-axi slack edit --profile rian --permalink https://acme.slack.com/archives/C0123/p1776000000000400 --text-file fixed.md
blowhorn-axi slack edit --profile rian --permalink https://acme.slack.com/archives/C0123/p1776000000000400 --message 'Fixed link' --confirmblowhorn-axi slack delete
Delete a message the profile sent with blowhorn (the send ledger says so). Dry run unless --confirm. Session only: a profile with only an app token is refused (token_only). Slack reads (history, search, threads) are out of scope; use the Cursor Slack connection.
blowhorn-axi slack delete [-h] [--profile PROFILE] [--confirm] [--dry-run] [--permalink PERMALINK]| Flag | Type | Default | Description |
|---|---|---|---|
--profile |
string, repeatable | Profile to act as; repeat it or give a,b for several | |
--confirm |
boolean | false |
Actually do it; without it nothing is written to Slack |
--dry-run |
boolean | false |
Rehearse (the default); --confirm --dry-run is an error |
--permalink |
string | The Slack message link of the message to delete |
Examples:
blowhorn-axi slack delete --profile rian --permalink https://acme.slack.com/archives/C0123/p1776000000000400
blowhorn-axi slack delete --profile rian --permalink https://acme.slack.com/archives/C0123/p1776000000000400 --confirmblowhorn-axi slack react
Add (or with --remove take back) an emoji reaction to any message as each profile. Dry run unless --confirm. Session only: a profile with only an app token is refused (token_only). Slack reads (history, search, threads) are out of scope; use the Cursor Slack connection.
blowhorn-axi slack react [-h] [--profile PROFILE] [--confirm] [--dry-run] [--permalink PERMALINK] [--emoji EMOJI] [--remove]| Flag | Type | Default | Description |
|---|---|---|---|
--profile |
string, repeatable | Profile to act as; repeat it or give a,b for several | |
--confirm |
boolean | false |
Actually do it; without it nothing is written to Slack |
--dry-run |
boolean | false |
Rehearse (the default); --confirm --dry-run is an error |
--permalink |
string | The Slack message link of the message to react to | |
--emoji |
string | The emoji name, with or without colons (white_check_mark, :+1:) | |
--remove |
boolean | false |
Take the reaction back (reactions.remove) |
Examples:
blowhorn-axi slack react --profile rian,lee --permalink https://acme.slack.com/archives/C0123/p1776000000000100 --emoji white_check_mark --confirm
blowhorn-axi slack react --profile rian --permalink https://acme.slack.com/archives/C0123/p1776000000000100 --emoji eyes --remove --confirmblowhorn-axi setup hooks
Install or repair the SessionStart hooks that show this home view to Claude Code, Codex and OpenCode. The npm launcher installs them; this command says how.
blowhorn-axi setup hooks [-h] [--status] [--remove] [--project]| Flag | Type | Default | Description |
|---|---|---|---|
--status |
boolean | false |
Report which agents have the hook; writes nothing |
--remove |
boolean | false |
Take back only the hooks blowhorn-axi wrote |
--project |
boolean | false |
Use this project's agent settings instead of your user settings |
Examples:
npx -y blowhorn-axi setup hooks
npx -y blowhorn-axi setup hooks --status
npx -y blowhorn-axi setup hooks --remove