hey-axi 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +31 -15
- package/package.json +1 -1
- package/skills/hey-axi/SKILL.md +48 -45
- package/skills/hey-axi/references/commands.md +39 -36
- package/src/activity.js +160 -0
- package/src/args.js +75 -10
- package/src/arity.js +94 -0
- package/src/cli.js +373 -136
- package/src/errors.js +128 -31
- package/src/examples.js +57 -0
- package/src/guide.js +21 -2
- package/src/home-path.js +12 -0
- package/src/home.js +48 -16
- package/src/hooks.js +176 -23
- package/src/manifest.json +699 -251
- package/src/policy.js +154 -11
- package/src/router.js +45 -11
- package/src/scope.js +177 -0
- package/src/shape.js +197 -56
- package/src/text.js +3 -3
- package/src/version.js +1 -1
package/README.md
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
# hey-axi
|
|
2
2
|
|
|
3
|
+
[](https://skills.sh/TangentialSolutions/hey-axi)
|
|
4
|
+
|
|
3
5
|
An agent-friendly wrapper for [HEY CLI](https://github.com/basecamp/hey-cli) (`hey`), Basecamp's command line for HEY email, calendars, todos, habits, time tracking and journals.
|
|
4
6
|
|
|
5
|
-
hey-axi runs `hey`, asks for its JSON response envelope, and prints it as [TOON](https://github.com/toon-format/toon). It follows the [AXI](https://axi.md) principles: a live home view, minimal default fields, truncated long text, definitive empty states, and unknown flags rejected up front. On our synthetic benchmark that's **~89% fewer tokens than `hey --json`** ([docs/benchmarks.md](docs/benchmarks.md)). It also adds a few safety rails. It covers **every command in HEY CLI v1.7.0** (
|
|
7
|
+
hey-axi runs `hey`, asks for its JSON response envelope, and prints it as [TOON](https://github.com/toon-format/toon). It follows the [AXI](https://axi.md) principles: a live home view, minimal default fields, truncated long text, definitive empty states, and unknown flags rejected up front. On our synthetic benchmark that's **~89% fewer tokens than `hey --json`** ([docs/benchmarks.md](docs/benchmarks.md)). It also adds a few safety rails. It covers **every command in HEY CLI v1.7.0** (154 runnable command paths, including the `login`/`logout` aliases, plus the `box <id>`-style shortcuts) by routing from a snapshot of HEY's own `hey commands --json` catalog. See [CHANGELOG.md](CHANGELOG.md) for what changed in each release.
|
|
6
8
|
|
|
7
9
|
## Install
|
|
8
10
|
|
|
@@ -24,7 +26,7 @@ hey-axi uses `$HEY_BIN` if it's set, and otherwise finds `hey` on `PATH`. launch
|
|
|
24
26
|
## Usage
|
|
25
27
|
|
|
26
28
|
```bash
|
|
27
|
-
hey-axi # home view:
|
|
29
|
+
hey-axi # home view: scope, last session, Imbox count + 10 threads, next commands
|
|
28
30
|
hey-axi box view imbox # TOON: summary, a few columns per thread, notice, help
|
|
29
31
|
hey-axi box imbox # HEY's shortcut forms work too
|
|
30
32
|
hey-axi --account 2 search --from a@b.com # global flags anywhere
|
|
@@ -32,7 +34,9 @@ hey-axi thread read 123 # bodies cut at 1000 chars with "(tru
|
|
|
32
34
|
hey-axi thread read 123 --full # HEY's complete, untouched result
|
|
33
35
|
hey-axi box view imbox --fields id,subject,creator.email_address # choose columns (--fields all = every field)
|
|
34
36
|
hey-axi thread read 123 --json # the same shaped output as compact JSON
|
|
35
|
-
hey-axi box view imbox --quiet # data
|
|
37
|
+
hey-axi box view imbox --quiet # drop HEY's summary/notice/breadcrumbs; keep data, count and hints
|
|
38
|
+
hey-axi reply 123 --message - < note.txt # message body from stdin (saved as a draft)
|
|
39
|
+
hey-axi setup scope --label Acme # per-directory home view (.hey-axi.json)
|
|
36
40
|
hey-axi --version # bare hey-axi version (fast path); `hey-axi version` adds HEY's
|
|
37
41
|
hey-axi box view imbox --ids-only # raw HEY output (also --count/--markdown/--html/--styled/--jq)
|
|
38
42
|
hey-axi set-aside group view 4 --limit 5 # three-word commands
|
|
@@ -41,12 +45,15 @@ hey-axi move --help # usage, flags, examples, notes (no H
|
|
|
41
45
|
|
|
42
46
|
### Output shaping
|
|
43
47
|
|
|
44
|
-
- **Home view.** `hey-axi` with no arguments prints `bin`, `description`, the
|
|
45
|
-
- **
|
|
48
|
+
- **Home view.** `hey-axi` with no arguments prints `bin`, `description`, the `scope`, a one-line `last_session` summary (when session capture is on), a `count` of threads, the 10 newest threads, and `help` lines with next commands (including how to see the rest). If HEY is missing, signed out or failing, it prints `status` with the fix and still exits 0.
|
|
49
|
+
- **Directory scope.** `hey-axi setup scope --label Acme` (or `--box`, `--search`, `--account`, `--limit`) writes `.hey-axi.json` in the current directory. The home view in that directory (or any subdirectory) then shows that label, box or search instead of the Imbox, and carries `--account` into every suggested command. `--status` shows it, `--remove` deletes it, and re-running with the same values is a no-op.
|
|
50
|
+
- **Minimal fields.** List commands show at most 4 columns (usually an id, the thread id, sender and subject). The defaults per command are in `src/shape.js` and in each command's `--help`. `--fields a,b,c` picks columns, using default aliases (`from`, `subject`, `at`) or dotted paths (`creator.email_address`, `messages.0.summary`); `--fields all` keeps everything. An unknown field exits 2 and lists what's available.
|
|
46
51
|
- **Truncation.** Strings longer than 1000 characters (120 in list cells) are cut and marked `… (truncated, N chars total)`, and a `help` line suggests `--full`.
|
|
47
|
-
- **Aggregates and empty states.** `count
|
|
48
|
-
- **Help lines.** HEY's breadcrumbs become ``help: Run `hey-axi …` to …``,
|
|
49
|
-
- **Fail loud.** Unknown flags and missing required flags (`move` without `--to`) exit 2 before HEY runs,
|
|
52
|
+
- **Aggregates and empty states.** Every list gets a `count`: `N of T total` when HEY reports a total (in `meta` or next to the list), `N total` when HEY says the list is complete, `N shown; more available` with a `help` line naming `--all`/`--page`/`--limit` when HEY says there's more, and `N shown; no more pages reported` when HEY says neither. Lists of plain values and results holding several lists (`2 todos, 1 habits`) are counted too. An empty list prints ``empty: 0 results for `…` ``, and a command with no data prints `result: no data returned`. Non-JSON success output is wrapped as `ok: true` + `output`.
|
|
53
|
+
- **Help lines.** A list always ends with a next step: HEY's own, or (when HEY gives none) the matching `view`/`show` command. HEY's breadcrumbs (next-command hints) become ``help: Run `hey-axi …` to …``, HEY's hints are rewritten to name `hey-axi`, and `--account`/`--base-url` are carried into them.
|
|
54
|
+
- **Fail loud.** Unknown commands (with "did you mean"), unknown flags, flags with a missing or wrongly typed value (`--limit abc`), missing or extra arguments (`thread read` without an id), and missing required flags (`move` without `--to`) all exit 2 before HEY runs, with the valid usage.
|
|
55
|
+
- **Idempotent mutations.** For state-setting commands (`seen`, `todo complete`, `label add`, `move`, `screener approve`, `timetrack stop`, name-based `create`s, …), when HEY's failure says that command's own end state already holds ("already seen", "already completed", "already exists", …), and for deletes whose target is already gone, hey-axi prints `ok: true`, `noop: true` and exits 0. The patterns are per command (`END_STATES` in `src/policy.js`); a generic conflict, any read, any send or reply, a `move` whose failure names a different box than `--to`, "already exists" on a create, and a delete whose not-found names something other than the target stay errors.
|
|
56
|
+
- **Complete per-command help.** `hey-axi <command> --help` lists arguments, every flag with its type and default, global flags, and 2-3 examples, with no HEY call.
|
|
50
57
|
- `--full` turns all of this off, and `--json` prints the same shaped result as compact JSON.
|
|
51
58
|
|
|
52
59
|
### How each kind of command runs
|
|
@@ -54,9 +61,10 @@ hey-axi move --help # usage, flags, examples, notes (no H
|
|
|
54
61
|
| Kind | Commands | Behavior |
|
|
55
62
|
|---|---|---|
|
|
56
63
|
| JSON (default) | almost everything | `hey … --json` → TOON (or compact JSON with `--json`) |
|
|
57
|
-
| Raw output | `--ids-only`, `--count`, `--markdown`, `--html`, `--styled`, `--jq`; `shell-completion generate`; `timetrack export` without `--output` | HEY's output is printed as-is |
|
|
58
|
-
| Stream | `watch` |
|
|
59
|
-
|
|
|
64
|
+
| Raw output | `--ids-only`, `--count`, `--markdown`, `--html`, `--styled`, `--jq`; `shell-completion generate`; `timetrack export` without `--output` | HEY's output is printed as-is once HEY succeeds; on failure only a structured error is printed |
|
|
65
|
+
| Stream | `watch` | Each event printed as it arrives, as a TOON block followed by a blank line (`--json`: HEY's NDJSON, one line per event); Ctrl-C/SIGTERM forwarded to HEY |
|
|
66
|
+
| Needs a person | `tui`, `mcp`, the `setup` wizard, `auth login`/`login` without `--token`/`--cookie` | Refused (exit 2) unless `--interactive` is passed, terminal or not, with the alternative (e.g. pass `--token`, or ask the user to run `hey-axi auth login --interactive` in their terminal). With `--interactive`, HEY gets the terminal (for `mcp`, its stdio, so an MCP client can register `hey-axi mcp --interactive`); the others also need a real terminal |
|
|
67
|
+
| Captured | other `setup …` commands, `upgrade`, `auth login --token …` | Run with stdin closed, `HEY_NONINTERACTIVE=1` and `EDITOR`/`VISUAL=false`, so nothing can wait for input; output is shaped like any other command |
|
|
60
68
|
|
|
61
69
|
### Safety rails
|
|
62
70
|
|
|
@@ -65,20 +73,28 @@ hey-axi move --help # usage, flags, examples, notes (no H
|
|
|
65
73
|
- `forward`, `draft send` and `bulk-reply send` have no draft mode in HEY, so they're refused (exit 2) with the safe alternative (`reply … --to`, `draft show`, `bulk-reply preview`).
|
|
66
74
|
- If you pass `--draft` or `--dry-run` yourself, hey-axi adds and marks nothing.
|
|
67
75
|
- **Credentials stay out of agent context.** `auth token` needs `--allow-secret` or `HEY_AXI_ALLOW_SECRETS=1`.
|
|
68
|
-
-
|
|
76
|
+
- **Content-first.** `compose`, `reply`, `draft edit`, `journal write`, `contact note set` and `bulk-reply send` must be given their content (`--message`, `--message -` for stdin, or a positional) and are refused (exit 2) otherwise, so HEY never opens an editor.
|
|
77
|
+
- hey-axi's own flags (`--allow-send`, `--allow-secret`, `--interactive`, `--fields`, `--full`) are never forwarded to HEY. Switches take no value: `--draft=false` or `--allow-send=false` is refused (exit 2) rather than guessed at.
|
|
69
78
|
|
|
70
79
|
### Errors and exit codes
|
|
71
80
|
|
|
72
|
-
Errors are printed as structured TOON: `ok: false`, `error`, and, when HEY gave them, `code`, `hint
|
|
81
|
+
Errors are printed as structured TOON on stdout: `ok: false`, `error`, a `kind`, and, when HEY gave them, `code`, `hint` and `meta`, plus a `help` next step. HEY's error text is translated too: only its first meaningful line is kept, stack traces, panics and terminal escapes are dropped, and debug keys (`stack`, `trace`, …) are removed from `meta`. On success HEY's stderr notices (warnings, `next_page: …`) go to stderr without that noise.
|
|
82
|
+
|
|
83
|
+
| Exit | Meaning |
|
|
84
|
+
|---|---|
|
|
85
|
+
| 0 | success (including no-op mutations and empty results) |
|
|
86
|
+
| 1 | the command failed; `kind` says why: `not_found`, `auth`, `forbidden`, `rate_limited`, `network`, `api_error`, `ambiguous`, `hey_missing`, `command_error` |
|
|
87
|
+
| 2 | usage error (`kind: usage`): unknown command/flag/field, bad flag value, missing or extra arguments, missing required flag or content, a switch given a value (`--draft=false`), blocked send, a person-only command without `--interactive`, or a usage error reported by HEY |
|
|
73
88
|
|
|
74
89
|
## Agent integrations: session hook or skill
|
|
75
90
|
|
|
76
91
|
There are two ways to give an agent hey-axi. You only need one:
|
|
77
92
|
|
|
78
|
-
1. **Session
|
|
93
|
+
1. **Session hooks (recommended where supported):** `hey-axi setup hooks` registers the home view as session-start context, and a session-end hook (`hey-axi hook session-end`), for **Claude Code** (`~/.claude/settings.json`), **Codex** (`~/.codex/hooks.json`, and it turns on `[features].hooks` in `~/.codex/config.toml`) and **OpenCode** (a managed plugin in `~/.config/opencode/plugins/`). Every new session then starts with your Imbox summary and the next commands, and no tool call is needed.
|
|
79
94
|
- `--project` writes to the current directory's `.claude/`, `.codex/` and `.opencode/` instead.
|
|
80
95
|
- `--status` reports what's installed, and `--remove` removes only hey-axi's entries.
|
|
81
96
|
- Re-running is a no-op, or repairs the path if hey-axi moved. It uses [axi-sdk-js](https://www.npmjs.com/package/axi-sdk-js)'s installer.
|
|
97
|
+
- The session-end hook records a one-line summary (at most 300 characters) of what the session did (drafts saved, messages sent, other changes; command names and numeric ids only, never message content) under `$XDG_STATE_HOME/hey-axi` (or `$HEY_AXI_STATE_DIR`), and the next home view shows it as `last_session`. Nothing is recorded unless `setup hooks` turned it on, and `setup hooks --remove` turns it off. Entries are tagged with the agent session (`CLAUDE_CODE_SESSION_ID` in Claude Code, `CODEX_THREAD_ID` in Codex, or `HEY_AXI_SESSION_ID`) so concurrent sessions in one directory stay apart. OpenCode has no exact session-end event, so its plugin records on `session.idle`/`session.deleted`.
|
|
82
98
|
- Note that the hook puts Imbox senders and subjects into every session's context.
|
|
83
99
|
2. **Agent skill (broader support, loads on demand):** see below.
|
|
84
100
|
|
|
@@ -110,7 +126,7 @@ See [docs/listing.md](docs/listing.md) for how hey-axi gets listed on skills.sh
|
|
|
110
126
|
npm run refresh-manifest # runs only `hey version` and `hey commands`
|
|
111
127
|
```
|
|
112
128
|
|
|
113
|
-
|
|
129
|
+
hey-axi routes only from the snapshot, so an unknown command is rejected immediately (exit 2, with suggestions) without running HEY. New HEY commands become available after a refresh and a hey-axi release. A weekly GitHub Action (`manifest-drift`) fails when the snapshot falls behind the latest HEY release.
|
|
114
130
|
|
|
115
131
|
## Development
|
|
116
132
|
|
package/package.json
CHANGED
package/skills/hey-axi/SKILL.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: hey-axi
|
|
3
3
|
description: Read, triage and draft HEY email (and HEY calendars, todos, habits, journal, time tracking) from the shell through hey-axi, a token-efficient TOON wrapper around Basecamp's HEY CLI that saves outgoing mail as drafts unless sending is explicitly allowed. Use when the user asks you to check, search, read, summarize, sort, label, screen, archive or reply to their HEY (hey.com) email, watch for new mail, or manage HEY todos, events, habits, journal entries or time tracks.
|
|
4
4
|
license: MIT
|
|
5
|
-
compatibility: Requires Node.js 20
|
|
5
|
+
compatibility: Requires Node.js 20+ (commands run as `npx -y hey-axi`), the HEY CLI (`hey`, v1.7.0 or newer) signed in to a HEY account, and network access to app.hey.com.
|
|
6
6
|
metadata:
|
|
7
7
|
author: TangentialSolutions
|
|
8
8
|
repository: https://github.com/TangentialSolutions/hey-axi
|
|
@@ -10,116 +10,119 @@ metadata:
|
|
|
10
10
|
|
|
11
11
|
# hey-axi: HEY email for agents
|
|
12
12
|
|
|
13
|
-
`hey-axi` runs Basecamp's HEY CLI (`hey`) and prints compact TOON. Lists show
|
|
13
|
+
`hey-axi` runs Basecamp's HEY CLI (`hey`) and prints compact TOON. Lists show at most four columns and a count, long text is cut (the total size is shown), and suggestions name `hey-axi` commands. Every `hey` command works: `npx -y hey-axi <same args as hey>`.
|
|
14
|
+
|
|
15
|
+
Examples below use `npx -y hey-axi`, which works without installing anything. If `hey-axi` is installed globally (`npm i -g hey-axi`), drop the `npx -y`.
|
|
14
16
|
|
|
15
17
|
## 1. Start here
|
|
16
18
|
|
|
17
|
-
Run `hey-axi` with no arguments. It shows the Imbox and what to do next. If HEY is missing or signed out, it prints a `status` line and the fix instead.
|
|
19
|
+
Run `npx -y hey-axi` with no arguments. It shows the mail for this directory's scope (the Imbox unless a `.hey-axi.json` says otherwise), a `count`, what the last session here did, and what to do next. If HEY is missing or signed out, it prints a `status` line and the fix instead.
|
|
18
20
|
|
|
19
21
|
<!-- generated:home:start -->
|
|
20
22
|
<!-- Generated by scripts/gen-skill.js from src/guide.js, the same text the home view prints. Do not edit by hand. -->
|
|
21
23
|
What hey-axi is: HEY email, calendars and todos for agents: compact TOON over Basecamp's HEY CLI; outgoing mail is saved as a draft unless --allow-send
|
|
22
24
|
|
|
23
25
|
Next steps the home view suggests:
|
|
24
|
-
- Run `hey-axi thread read <topic_id>` to read a thread
|
|
25
|
-
- Run `hey-axi box view imbox --limit 50` for more (also feed, papertrail, aside, later)
|
|
26
|
-
- Run `hey-axi search "<query>"` to search mail
|
|
27
|
-
- Run `hey-axi screener list` for senders waiting to be screened
|
|
28
|
-
- Run `hey-axi reply <topic_id> --message "..."` to draft a reply (not sent without --allow-send)
|
|
29
|
-
- Run `hey-axi --help` for all commands; lists take --fields a,b / --fields all, long text --full
|
|
26
|
+
- Run `npx -y hey-axi thread read <topic_id>` to read a thread
|
|
27
|
+
- Run `npx -y hey-axi box view imbox --limit 50` for more (also feed, papertrail, aside, later)
|
|
28
|
+
- Run `npx -y hey-axi search "<query>"` to search mail
|
|
29
|
+
- Run `npx -y hey-axi screener list` for senders waiting to be screened
|
|
30
|
+
- Run `npx -y hey-axi reply <topic_id> --message "..."` to draft a reply (not sent without --allow-send)
|
|
31
|
+
- Run `npx -y hey-axi --help` for all commands; lists take --fields a,b / --fields all, long text --full
|
|
30
32
|
<!-- generated:home:end -->
|
|
31
33
|
|
|
32
34
|
Problems:
|
|
33
|
-
- `
|
|
34
|
-
- `status:
|
|
35
|
-
- `
|
|
36
|
-
- `hey-axi doctor` finds other login and config problems. `hey-axi version` shows both versions.
|
|
35
|
+
- `status: HEY CLI not found` (`kind: hey_missing`): install `hey`, or set `HEY_BIN=/path/to/hey` (cron/launchd jobs usually need `HEY_BIN=$HOME/.local/bin/hey`).
|
|
36
|
+
- `status: not signed in` (`kind: auth`): ask the **user** to run `npx -y hey-axi auth login --interactive` in their own terminal. It opens a browser, so without `--interactive` it is refused (exit 2); `tui`, `mcp` and the `setup` wizard work the same way. Never pass `--interactive` yourself. Don't try to sign in for them, and never print tokens (`auth token` is blocked unless `--allow-secret` is passed).
|
|
37
|
+
- `npx -y hey-axi doctor` finds other login and config problems. `npx -y hey-axi version` shows both versions.
|
|
37
38
|
|
|
38
39
|
## 2. Read and triage
|
|
39
40
|
|
|
40
41
|
```bash
|
|
41
|
-
hey-axi box list # boxes and their ids
|
|
42
|
-
hey-axi box view imbox --limit 25 # rows in a box (imbox, feed, papertrail, aside, later, …)
|
|
43
|
-
hey-axi thread read <topic_id> # the thread (long bodies cut; --full for all)
|
|
44
|
-
hey-axi search "invoice" --from a@b.com --date last_30_days
|
|
45
|
-
hey-axi screener list # senders waiting to be screened
|
|
46
|
-
hey-axi set-aside view | hey-axi bubble list | hey-axi draft list
|
|
42
|
+
npx -y hey-axi box list # boxes and their ids
|
|
43
|
+
npx -y hey-axi box view imbox --limit 25 # rows in a box (imbox, feed, papertrail, aside, later, …)
|
|
44
|
+
npx -y hey-axi thread read <topic_id> # the thread (long bodies cut; --full for all)
|
|
45
|
+
npx -y hey-axi search "invoice" --from a@b.com --date last_30_days
|
|
46
|
+
npx -y hey-axi screener list # senders waiting to be screened
|
|
47
|
+
npx -y hey-axi set-aside view | npx -y hey-axi bubble list | npx -y hey-axi draft list
|
|
47
48
|
```
|
|
48
49
|
|
|
49
50
|
**Which id to use.** Each `box view` row has an `id` (the box item) and a `topic_id` (the thread):
|
|
50
51
|
- `topic_id` goes to `thread read`, `reply` and `forward`.
|
|
51
52
|
- `id` goes to `seen`, `unseen`, `move`, `label`, `bubble`, `trash`, `spam` and `ignore`.
|
|
52
|
-
- A row with kind `bundle` has no `topic_id`. Open it with `hey-axi bundle view <id>`.
|
|
53
|
+
- A row with kind `bundle` has no `topic_id`. Open it with `npx -y hey-axi bundle view <id>`.
|
|
53
54
|
- Screener commands take the clearance `id` from `screener list`. These aren't contact ids.
|
|
54
55
|
|
|
55
56
|
```bash
|
|
56
|
-
hey-axi seen <id>... hey-axi unseen <id>...
|
|
57
|
-
hey-axi move <id>... --to feed # imbox | feed | aside | later | papertrail
|
|
58
|
-
hey-axi label add <id>... --to "Receipts"
|
|
59
|
-
hey-axi bubble up <id>... --tomorrow #
|
|
60
|
-
|
|
61
|
-
hey-axi trash <id>... hey-axi spam <id>... hey-axi ignore <id>...
|
|
57
|
+
npx -y hey-axi seen <id>... npx -y hey-axi unseen <id>...
|
|
58
|
+
npx -y hey-axi move <id>... --to feed # imbox | feed | aside | later | papertrail
|
|
59
|
+
npx -y hey-axi label add <id>... --to "Receipts"
|
|
60
|
+
npx -y hey-axi bubble up <id>... --tomorrow # exactly one of --now | --on <date> | --tomorrow | --weekend | --next-week
|
|
61
|
+
npx -y hey-axi screener approve <clearance-id>
|
|
62
|
+
npx -y hey-axi trash <id>... npx -y hey-axi spam <id>... npx -y hey-axi ignore <id>...
|
|
62
63
|
```
|
|
63
64
|
|
|
64
65
|
`trash`, `spam`, `ignore`, `screener deny --spam` and `screener clear` (which clears the whole queue) run without any confirmation. Confirm with the user before you run them in bulk.
|
|
65
66
|
|
|
66
|
-
|
|
67
|
+
Mutations are idempotent: when the desired state already holds (already seen, already deleted), the answer is `noop: true` with exit 0, not an error.
|
|
68
|
+
|
|
69
|
+
Output includes HEY's breadcrumb hints as `help` lines (with your `--account` carried over), plus `Run … --all for all N` when a list was cut. Follow them instead of guessing.
|
|
67
70
|
|
|
68
71
|
## 3. Writing mail: drafts by default
|
|
69
72
|
|
|
70
73
|
- `compose` and `reply` are **saved as drafts** automatically. The output starts with `sent: false`, `saved_as: draft` and an `axi_notice`. Tell the user that a draft is waiting in HEY. Don't claim it was sent.
|
|
71
74
|
```bash
|
|
72
|
-
hey-axi reply <topic_id> --message "Thanks, Thursday works."
|
|
73
|
-
hey-axi compose --to a@b.com --subject "Hi" --message "…"
|
|
74
|
-
|
|
75
|
+
npx -y hey-axi reply <topic_id> --message "Thanks, Thursday works."
|
|
76
|
+
npx -y hey-axi compose --to a@b.com --subject "Hi" --message "…"
|
|
77
|
+
cat reply.md | npx -y hey-axi reply <topic_id> --message -
|
|
78
|
+
npx -y hey-axi draft list | npx -y hey-axi draft show <draft-id>
|
|
75
79
|
```
|
|
80
|
+
- The message is required (`--message`, `--message-html`, `--attach`, or `--message -` to read stdin): HEY never opens an editor under hey-axi. The same goes for `journal write --content`, `contact note set --note` and `draft edit` (pass the fields to change).
|
|
76
81
|
- `forward`, `draft send` and `bulk-reply send` are **refused** (exit 2) because HEY has no draft mode for them. The error names the safe alternative.
|
|
77
82
|
- To actually send, the user must explicitly ask you to, and you add `--allow-send` (or they set `HEY_AXI_ALLOW_SEND=1`). Don't add it on your own initiative.
|
|
78
83
|
|
|
79
|
-
## 4. Output: fields, truncation, modes
|
|
84
|
+
## 4. Output: fields, truncation, counts, modes
|
|
80
85
|
|
|
81
|
-
- **Lists show
|
|
86
|
+
- **Lists show at most four columns** (for example `box view`: `id, topic_id, from, subject`). Pick others with `--fields id,subject,seen,at,creator.email_address`; aliases and dotted paths both work. `--fields all` keeps every field. An unknown field fails with exit 2 and lists the ones available. `npx -y hey-axi <command> --help` shows the defaults.
|
|
82
87
|
- **Long text is cut** at 1000 characters in detail views (thread bodies, drafts) and 120 in list cells, marked `… (truncated, N chars total)`. The output then includes a `Run … --full` help line. Use `--full` only when you need the whole text.
|
|
83
|
-
-
|
|
88
|
+
- **Every list has a `count`**: `N of T total`, `N total` (HEY said the list is complete), `N shown; more available` (then a help line says how to get the rest), or `N shown; no more pages reported` (HEY gave no total and no further page). Empty lists say `empty: 0 results for …`.
|
|
84
89
|
|
|
85
90
|
| Want | Use |
|
|
86
91
|
|---|---|
|
|
87
|
-
| Default: summary, data, help lines, as TOON | (nothing) |
|
|
92
|
+
| Default: summary, count, data, help lines, as TOON | (nothing) |
|
|
88
93
|
| The same as compact JSON | `--json` |
|
|
89
|
-
|
|
|
94
|
+
| Less: data, count, empty state and hints only | `--quiet` |
|
|
90
95
|
| HEY's complete, untouched result | `--full` (combine with `--json` for raw JSON) |
|
|
91
96
|
| Raw HEY output | `--ids-only`, `--count`, `--markdown`, `--html`, `--styled`, `--jq '<expr>'` |
|
|
92
|
-
| Help for one command: usage, flags, examples, notes (no network) | `hey-axi <command> --help` |
|
|
97
|
+
| Help for one command: usage, arguments, flags with defaults, examples, notes (no network) | `npx -y hey-axi <command> --help` |
|
|
93
98
|
|
|
94
|
-
|
|
99
|
+
Everything is checked before HEY runs (exit 2, with the fix inline): unknown commands (with "did you mean"), unknown flags (the valid ones are listed), flags without a value, values of the wrong type (`--limit abc`), missing or extra arguments (quote multi-word text), missing required flags such as `move --to`. Global flags like `--account <id|all>` can go anywhere.
|
|
95
100
|
|
|
96
101
|
## 5. Watching for changes
|
|
97
102
|
|
|
98
|
-
`hey-axi watch` streams HEY's NDJSON one line
|
|
103
|
+
`npx -y hey-axi watch` streams each event as it arrives (a TOON block per event, separated by blank lines; add `--json` for HEY's NDJSON, one line per event) until it's interrupted. Use bounded forms in agent sessions:
|
|
99
104
|
|
|
100
105
|
```bash
|
|
101
|
-
hey-axi watch --box imbox --events new --exit-on-first --timeout 10m
|
|
106
|
+
npx -y hey-axi watch --box imbox --events new --exit-on-first --timeout 10m
|
|
102
107
|
```
|
|
103
108
|
|
|
104
109
|
Lines also include `ready`, `disconnected` and `resync`. On `resync`, re-read that box.
|
|
105
110
|
|
|
106
111
|
## 6. Errors and exit codes
|
|
107
112
|
|
|
108
|
-
Errors are TOON on stdout: `ok: false`, `error`,
|
|
113
|
+
Errors are TOON on stdout: `ok: false`, `error`, `kind` (`usage`, `not_found`, `auth`, `forbidden`, `rate_limited`, `network`, `api_error`, `ambiguous`, `hey_missing`, `command_error`), HEY's `code`/`hint`/`meta` when it gave them, and a `help` line with the next step. Exit codes: **0** success (including no-ops) · **1** error · **2** usage error or refusal (unknown command/flag/field, bad argument, blocked send, needs the user). Read `hint`/`help` before you retry.
|
|
109
114
|
|
|
110
115
|
## Install
|
|
111
116
|
|
|
112
117
|
```bash
|
|
113
118
|
# HEY CLI (macOS/Linux)
|
|
114
119
|
curl -fsSL https://hey.com/install-cli | bash # or: brew install --cask basecamp/tap/hey
|
|
115
|
-
hey auth login
|
|
120
|
+
npx -y hey-axi auth login --interactive # the user runs this once, in their own terminal
|
|
116
121
|
|
|
117
|
-
# hey-axi
|
|
122
|
+
# hey-axi (optional: every example here also works as npx -y hey-axi …)
|
|
118
123
|
npm i -g hey-axi # puts `hey-axi` on PATH
|
|
119
124
|
```
|
|
120
125
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
Optional: `hey-axi setup hooks` (user-invoked) shows the home view at the start of every Claude Code, Codex and OpenCode session. `--project` limits it to one directory, and `--remove` undoes it.
|
|
126
|
+
Session hook (the alternative to this skill; you only need one): `npx -y hey-axi setup hooks` (user-invoked) shows the home view at the start of every Claude Code, Codex and OpenCode session and records what each session did for the next one. `--project` limits it to one directory, and `--remove` undoes it. `npx -y hey-axi setup scope --label <name>` focuses a directory's home view on one label, box or search.
|
|
124
127
|
|
|
125
128
|
More commands (calendar, todos, habits, journal, time tracking, contacts, collections), with their default fields: [references/commands.md](references/commands.md).
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
<!-- Generated by scripts/gen-skill.js from src/manifest.json (hey 1.7.0). Do not edit by hand. -->
|
|
4
4
|
|
|
5
|
-
Every command from HEY CLI 1.7.0 (
|
|
6
|
-
`hey-axi <command> --help` shows usage, flag
|
|
7
|
-
Flags every command accepts: `--account <id|all>`, `--json`, `--quiet`, `--fields <a,b|all>`, `--full`, `--ids-only`, `--count`, `--markdown`, `--html`, `--styled`, `--jq <expr>`.
|
|
5
|
+
Every command from HEY CLI 1.7.0 (154 runnable paths, including the `login`/`logout` aliases and shortcut forms such as `box <name>`). Run each as `npx -y hey-axi <command> [args] [flags]` (just `hey-axi …` when it is installed globally).
|
|
6
|
+
`npx -y hey-axi <command> --help` shows usage, arguments, every flag with its default, 2-3 examples and notes, offline.
|
|
7
|
+
Flags every command accepts: `--account <id|all>`, `--json`, `--quiet`, `--fields <a,b|all>`, `--full`, `--ids-only`, `--count`, `--markdown`, `--html`, `--styled`, `--jq <expr>`. Unknown commands, flags and arguments, flags without a value and values of the wrong type are rejected before HEY runs (exit 2).
|
|
8
8
|
|
|
9
9
|
| Command | What it does | Flags | hey-axi behavior |
|
|
10
10
|
|---|---|---|---|
|
|
@@ -13,33 +13,33 @@ Flags every command accepts: `--account <id|all>`, `--json`, `--quiet`, `--field
|
|
|
13
13
|
| `account use` | Set the default linked mail account | | |
|
|
14
14
|
| `attachment list` | List a thread's attachments | `--allow-partial` | fields: id, filename, content_type, byte_size |
|
|
15
15
|
| `attachment save` | Save an attachment to disk | `--force` `--output <v>` | |
|
|
16
|
-
| `auth login` | Authenticate with the HEY server | `--cookie <v>` `--no-browser` `--token <v>` |
|
|
16
|
+
| `auth login` | Authenticate with the HEY server | `--cookie <v>` `--no-browser` `--token <v>` | |
|
|
17
17
|
| `auth logout` | Clear stored credentials | | |
|
|
18
18
|
| `auth refresh` | Force token refresh | | |
|
|
19
19
|
| `auth status` | Show authentication status | | |
|
|
20
20
|
| `auth token` | Print access token to stdout | `--stored` | refused unless `--allow-secret` |
|
|
21
|
-
| `box` | List HEY boxes and their email threads | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
21
|
+
| `box` | List HEY boxes and their email threads | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
22
22
|
| `box list` | List your HEY boxes | `--all` `--limit <v>` | fields: id, kind, name |
|
|
23
|
-
| `box view` | List email threads in a box | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
24
|
-
| `bubble list` | List bubbled-up and scheduled email threads | `--all` `--limit <v>` | fields: id, topic_id,
|
|
23
|
+
| `box view` | List email threads in a box | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
24
|
+
| `bubble list` | List bubbled-up and scheduled email threads | `--all` `--limit <v>` | fields: id, topic_id, subject, bubbles_up |
|
|
25
25
|
| `bubble pop` | Cancel bubble-ups | | |
|
|
26
26
|
| `bubble up` | Bubble email threads up | `--next-week` `--now` `--on <v>` `--tomorrow` `--weekend` | |
|
|
27
27
|
| `bulk-reply preview` | Preview threads and recipients without sending | | |
|
|
28
28
|
| `bulk-reply send` | Send one reply to multiple threads | `--attach <v>` `--message <v>` `--message-html <v>` | refused unless `--allow-send` |
|
|
29
29
|
| `bulk-reply undo` | Recall a delayed bulk reply | | |
|
|
30
|
-
| `bundle` | List the unseen threads a bundle groups | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
31
|
-
| `bundle view` | List the unseen threads a bundle groups | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
30
|
+
| `bundle` | List the unseen threads a bundle groups | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
31
|
+
| `bundle view` | List the unseen threads a bundle groups | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
32
32
|
| `calendar list` | List calendars | | fields: id, name, kind, owned |
|
|
33
33
|
| `clip create` | Save text from an email entry | `--content <v>` | |
|
|
34
34
|
| `clip delete` | Delete a saved clip | | |
|
|
35
|
-
| `clip list` | List the newest page of passages clipped from email | | fields: id,
|
|
36
|
-
| `collection` | List and manage email collections | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
35
|
+
| `clip list` | List the newest page of passages clipped from email | | fields: id, topic_id, at |
|
|
36
|
+
| `collection` | List and manage email collections | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
37
37
|
| `collection add` | Add email threads to a collection | `--to <v>` | |
|
|
38
38
|
| `collection create` | Create a collection | `--summary <v>` | |
|
|
39
39
|
| `collection list` | List your email collections | `--all` `--limit <v>` | fields: id, name |
|
|
40
40
|
| `collection remove` | Remove email threads from a collection | `--from <v>` | |
|
|
41
41
|
| `collection update` | Update a collection | `--name <v>` `--summary <v>` | |
|
|
42
|
-
| `collection view` | List email threads in a collection | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
42
|
+
| `collection view` | List email threads in a collection | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
43
43
|
| `commands` | List all available commands | | |
|
|
44
44
|
| `compose` | Write and send a new email | `--attach <v>` `--bcc <v>` `--cc <v>` `--draft` `--from <v>` `--message <v>` `--message-html <v>` `--no-name-tag` `--subject <v>` `--thread-id <v>` `--to <v>` | saved as a draft unless `--allow-send` |
|
|
45
45
|
| `config set` | Set a configuration value in the global config | | |
|
|
@@ -56,7 +56,7 @@ Flags every command accepts: `--account <id|all>`, `--json`, `--quiet`, `--field
|
|
|
56
56
|
| `contact note show` | Read a private contact note | | |
|
|
57
57
|
| `contact show` | View a contact | | |
|
|
58
58
|
| `contact show-again` | Show a hidden contact again | | |
|
|
59
|
-
| `contact threads` | List every thread with a contact | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
59
|
+
| `contact threads` | List every thread with a contact | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
60
60
|
| `contact unbundle` | List a contact's mail separately | | |
|
|
61
61
|
| `contact update` | Edit a contact | `--alias <v>` `--email <v>` `--name <v>` | |
|
|
62
62
|
| `doctor` | Find login and configuration problems | | |
|
|
@@ -66,11 +66,11 @@ Flags every command accepts: `--account <id|all>`, `--json`, `--quiet`, `--field
|
|
|
66
66
|
| `draft send` | Deliver a draft | | refused unless `--allow-send` |
|
|
67
67
|
| `draft show` | Read a draft back | | |
|
|
68
68
|
| `event add` | Create an event | `--all-day` `--calendar <v>` `--circle` `--countdown <v>` `--countdown-unit <v>` `--end-time <v>` `--ends-on <v>` `--invite <v>` `--link <v>` `--location <v>` `--notes <v>` `--remind <v>` `--repeat <v>` `--repeat-times <v>` `--repeat-until <v>` `--start-time <v>` `--starts-on <v>` `--time-zone <v>` `--title <v>` | |
|
|
69
|
-
| `event day` | List the events of one day, as HEY draws it | `--all` `--limit <v>` | fields: id, title, starts_at, ends_at
|
|
69
|
+
| `event day` | List the events of one day, as HEY draws it | `--all` `--limit <v>` | fields: id, title, starts_at, ends_at |
|
|
70
70
|
| `event delete` | Delete an event | | |
|
|
71
71
|
| `event edit` | Change an event | `--all-day` `--allow-plain-notes` `--apply-to <v>` `--calendar <v>` `--circle` `--countdown <v>` `--countdown-unit <v>` `--end-time <v>` `--ends-on <v>` `--invite <v>` `--link <v>` `--location <v>` `--notes <v>` `--occurrence <v>` `--remind <v>` `--repeat <v>` `--repeat-times <v>` `--repeat-until <v>` `--start-time <v>` `--starts-on <v>` `--time-zone <v>` `--title <v>` | |
|
|
72
|
-
| `event list` | List calendar events | `--all` `--calendar <v>` `--ends-on <v>` `--limit <v>` `--starts-on <v>` | fields: id, title, starts_at, ends_at
|
|
73
|
-
| `event week` | List the events of one week, as HEY draws it | `--all` `--limit <v>` | fields: id, title, starts_at, ends_at
|
|
72
|
+
| `event list` | List calendar events | `--all` `--calendar <v>` `--ends-on <v>` `--limit <v>` `--starts-on <v>` | fields: id, title, starts_at, ends_at |
|
|
73
|
+
| `event week` | List the events of one week, as HEY draws it | `--all` `--limit <v>` | fields: id, title, starts_at, ends_at |
|
|
74
74
|
| `forward` | Forward the latest message in a thread | `--bcc <v>` `--cc <v>` `--message <v>` `--message-html <v>` `--to <v>` | refused unless `--allow-send` |
|
|
75
75
|
| `habit complete` | Mark a habit as complete for a date | `--date <v>` | |
|
|
76
76
|
| `habit create` | Create a habit | `--color <v>` `--days <v>` `--icon <v>` `--name <v>` | |
|
|
@@ -79,47 +79,50 @@ Flags every command accepts: `--account <id|all>`, `--json`, `--quiet`, `--field
|
|
|
79
79
|
| `habit list` | List habits | `--all` `--date <v>` `--limit <v>` | fields: id, title, days |
|
|
80
80
|
| `habit uncomplete` | Remove a habit completion for a date | `--date <v>` | |
|
|
81
81
|
| `ignore` | Ignore email threads | | |
|
|
82
|
-
| `journal list` | List journal entries | `--all` `--calendar <v>` `--ends-on <v>` `--limit <v>` `--starts-on <v>` | fields: id,
|
|
82
|
+
| `journal list` | List journal entries | `--all` `--calendar <v>` `--ends-on <v>` `--limit <v>` `--starts-on <v>` | fields: id, date |
|
|
83
83
|
| `journal read` | Read a journal entry (default: today) | | |
|
|
84
84
|
| `journal write` | Write or edit a journal entry (default: today) | `--content <v>` `--content-html <v>` | |
|
|
85
|
-
| `label` | List and manage email labels | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
85
|
+
| `label` | List and manage email labels | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
86
86
|
| `label add` | Add a label to email threads | `--to <v>` | |
|
|
87
87
|
| `label create` | Create a label and add it to email threads | | |
|
|
88
88
|
| `label list` | List your email labels | `--all` `--limit <v>` | fields: id, name |
|
|
89
89
|
| `label remove` | Remove labels from email threads | `--from <v>` | |
|
|
90
|
-
| `label view` | List email threads with a label | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
91
|
-
| `login` | Authenticate with the HEY server | `--cookie <v>` `--no-browser` `--token <v>` |
|
|
90
|
+
| `label view` | List email threads with a label | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
91
|
+
| `login` | Authenticate with the HEY server | `--cookie <v>` `--no-browser` `--token <v>` | |
|
|
92
92
|
| `logout` | Clear stored credentials | | |
|
|
93
|
-
| `mcp` | Serve HEY to MCP clients over stdio | `--domains <v>` `--read-only` |
|
|
93
|
+
| `mcp` | Serve HEY to MCP clients over stdio | `--domains <v>` `--read-only` | |
|
|
94
94
|
| `move` | Move email threads to another box | `--to <v>` | |
|
|
95
95
|
| `reply` | Reply to a thread | `--attach <v>` `--bcc <v>` `--cc <v>` `--draft` `--dry-run` `--message <v>` `--message-html <v>` `--replace-recipients` `--to <v>` | saved as a draft unless `--allow-send` |
|
|
96
96
|
| `screener approve` | Let a sender through | `--box <v>` `--seen` | |
|
|
97
97
|
| `screener clear` | Empty the Screener without deciding | | |
|
|
98
98
|
| `screener deny` | Turn a sender away | `--spam` | |
|
|
99
|
-
| `screener history` | List the senders already screened | `--all` `--page <v>` | fields: id, status,
|
|
100
|
-
| `screener list` | List the senders waiting to be screened | `--all` `--page <v>` | fields: id,
|
|
101
|
-
| `search` | Search email threads and messages | `--all` `--any <v>` `--attachment <v>` `--date <v>` `--exact <v>` `--from <v>` `--in <v>` `--label <v>` `--none <v>` `--page <v>` `--required <v>` `--subject <v>` `--to <v>` | fields:
|
|
99
|
+
| `screener history` | List the senders already screened | `--all` `--page <v>` | fields: id, status, email_address, decided |
|
|
100
|
+
| `screener list` | List the senders waiting to be screened | `--all` `--page <v>` | fields: id, email_address, subject, topic_id |
|
|
101
|
+
| `search` | Search email threads and messages | `--all` `--any <v>` `--attachment <v>` `--date <v>` `--exact <v>` `--from <v>` `--in <v>` `--label <v>` `--none <v>` `--page <v>` `--required <v>` `--subject <v>` `--to <v>` | fields: topic_id, subject, from, at |
|
|
102
102
|
| `search filters` | List available search refinement values | | |
|
|
103
103
|
| `seen` | Mark email threads as seen | | |
|
|
104
|
+
| `set-aside` | List and group email threads in Set Aside | | |
|
|
105
|
+
| `set-aside group` | List and manage groups in Set Aside | | |
|
|
104
106
|
| `set-aside group add` | Add email threads to a Set Aside group | `--to <v>` | |
|
|
105
107
|
| `set-aside group create` | Gather email threads into a new Set Aside group | | |
|
|
106
108
|
| `set-aside group delete` | Break up a Set Aside group | | |
|
|
107
109
|
| `set-aside group list` | List the groups in Set Aside | | fields: id, thread_count |
|
|
108
110
|
| `set-aside group remove` | Take email threads out of their Set Aside group | | |
|
|
109
|
-
| `set-aside group view` | List email threads in a Set Aside group | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
110
|
-
| `set-aside view` | List email threads in Set Aside | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject
|
|
111
|
-
| `setup` | Set up HEY for first use | `--silent-success` `--skip-agents` `--skip-omarchy` |
|
|
112
|
-
| `setup agents` | Install or remove HEY coding-agent integrations | `--remove` |
|
|
113
|
-
| `setup claude` | Connect Claude Code to HEY | |
|
|
114
|
-
| `setup codex` | Connect Codex to HEY | |
|
|
115
|
-
| `setup omarchy` | Install hey into the Omarchy desktop | `--no-notify` `--notify` `--remove` |
|
|
111
|
+
| `set-aside group view` | List email threads in a Set Aside group | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
112
|
+
| `set-aside view` | List email threads in Set Aside | `--all` `--limit <v>` `--page <v>` | fields: id, topic_id, from, subject |
|
|
113
|
+
| `setup` | Set up HEY for first use | `--silent-success` `--skip-agents` `--skip-omarchy` | |
|
|
114
|
+
| `setup agents` | Install or remove HEY coding-agent integrations | `--remove` | |
|
|
115
|
+
| `setup claude` | Connect Claude Code to HEY | | |
|
|
116
|
+
| `setup codex` | Connect Codex to HEY | | |
|
|
117
|
+
| `setup omarchy` | Install hey into the Omarchy desktop | `--no-notify` `--notify` `--remove` | |
|
|
116
118
|
| `share` | Get a sharing link for an email thread | | |
|
|
117
119
|
| `shell-completion generate` | Print a completion script to stdout | | raw output |
|
|
118
120
|
| `shell-completion install` | Install shell completions where your shell will find them | `--force` | |
|
|
121
|
+
| `skill` | Manage the embedded agent skill | | |
|
|
119
122
|
| `skill install` | Install the hey skill globally for your coding agents | | |
|
|
120
123
|
| `snippet create` | Create a reusable email snippet | `--content <v>` `--content-html <v>` `--name <v>` | |
|
|
121
124
|
| `snippet delete` | Delete a reusable email snippet | | |
|
|
122
|
-
| `snippet list` | List reusable email snippets | | fields: id, name
|
|
125
|
+
| `snippet list` | List reusable email snippets | | fields: id, name |
|
|
123
126
|
| `snippet update` | Update a reusable email snippet | `--content <v>` `--content-html <v>` `--name <v>` | |
|
|
124
127
|
| `spam` | Mark email threads as spam | | |
|
|
125
128
|
| `stop-ignoring` | Stop ignoring email threads | | |
|
|
@@ -132,7 +135,7 @@ Flags every command accepts: `--account <id|all>`, `--json`, `--quiet`, `--field
|
|
|
132
135
|
| `timetrack delete` | Delete a time track | | |
|
|
133
136
|
| `timetrack edit` | Edit a completed time track | `--category <v>` `--end <v>` `--notes <v>` `--start <v>` | |
|
|
134
137
|
| `timetrack export` | Export completed time tracks as CSV | `--force` `--output <v>` | raw CSV unless `--output <file>` |
|
|
135
|
-
| `timetrack list` | List completed time tracks | `--all` `--category <v>` `--limit <v>` | fields: id, starts_at, ends_at, category
|
|
138
|
+
| `timetrack list` | List completed time tracks | `--all` `--category <v>` `--limit <v>` | fields: id, starts_at, ends_at, category |
|
|
136
139
|
| `timetrack start` | Start time tracking | | |
|
|
137
140
|
| `timetrack stop` | Stop time tracking | `--category <v>` | |
|
|
138
141
|
| `todo add` | Create a new todo | `--date <v>` `--title <v>` | |
|
|
@@ -141,12 +144,12 @@ Flags every command accepts: `--account <id|all>`, `--json`, `--quiet`, `--field
|
|
|
141
144
|
| `todo list` | List todos | `--all` `--calendar <v>` `--ends-on <v>` `--limit <v>` `--starts-on <v>` | fields: id, title, starts_at, completed_at |
|
|
142
145
|
| `todo uncomplete` | Mark a todo as incomplete | | |
|
|
143
146
|
| `trash` | Move email threads to Trash | | |
|
|
144
|
-
| `tui` | Launch the interactive terminal UI | `--instance <v>` `--remote` `--screener` `--topic <v>` `--topic-title <v>` |
|
|
147
|
+
| `tui` | Launch the interactive terminal UI | `--instance <v>` `--remote` `--screener` `--topic <v>` `--topic-title <v>` | |
|
|
145
148
|
| `unseen` | Mark email threads as unseen | | |
|
|
146
149
|
| `unshare` | Turn off an email thread's sharing link | | |
|
|
147
|
-
| `upgrade` | Upgrade hey to the latest release | |
|
|
150
|
+
| `upgrade` | Upgrade hey to the latest release | | |
|
|
148
151
|
| `version` | Show the installed hey version | | |
|
|
149
|
-
| `watch` | Follow email threads and calendars as they change | `--box <v>` `--events <v>` `--exit-on-first` `--run-async <v>` `--run-sync <v>` `--since <v>` `--timeout <v>` | streams NDJSON |
|
|
152
|
+
| `watch` | Follow email threads and calendars as they change | `--box <v>` `--events <v>` `--exit-on-first` `--run-async <v>` `--run-sync <v>` `--since <v>` `--timeout <v>` | streams events (TOON; --json for NDJSON) |
|
|
150
153
|
| `workflow` | List and manage email workflows | | |
|
|
151
154
|
| `workflow add` | Add email threads to a workflow stage | `--stage <v>` `--to <v>` | |
|
|
152
155
|
| `workflow create` | Create an email workflow | | |
|