slack-term 1.44.0 → 1.46.0

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 CHANGED
@@ -123,9 +123,10 @@ slack react "<permalink>" eyes --remove # take a reaction back
123
123
 
124
124
  # Ask a question with its choices pre-seeded as 1️⃣..🔟 reactions — answering is
125
125
  # one tap on an existing pill, no emoji picker. Same two-step confirm gate as send.
126
- # A ❓ "その他 (other)" pill always follows the choices: pressing it means "none of
127
- # these" and the answer comes as a reply (exit 5), not as the ❓ itself.
128
- # --explain (or SLACK_TERM_ASK_EXPLAIN=1) adds an ℹ️ "説明して (explain)" pill after ❓:
126
+ # A ➕ "その他 (other)" pill always follows the choices: pressing it means "none of
127
+ # these" and the answer comes as a reply (exit 5), not as the ➕ itself. (Pills posted
128
+ # before ➕ carry ❓ there; they are still read, collected and voided the same way.)
129
+ # --explain (or SLACK_TERM_ASK_EXPLAIN=1) adds an ℹ️ "説明して (explain)" pill after ➕:
129
130
  # pressing it asks YOU to explain in the thread and is never an answer — the question
130
131
  # stays open. --wait/--waitFor say so on stderr and may post ONE thread note (once per
131
132
  # question) saying an explanation is coming; --explain-exit makes that exit 7.
@@ -151,7 +152,7 @@ slack ask "#eng" "@here 誰か見れる?" "見る" "あとで" # anyo
151
152
  # With no choices the question asks for a free-text reply and the reply is the answer.
152
153
  # In a DM a plain reply counts; in a channel only reactions and thread replies do.
153
154
  # Once answered, the question is edited to "✅ …回答済み > <answer>" — the body/background
154
- # and the CHOSEN option line stay; the other options, ❓ line and instructions go. The
155
+ # and the CHOSEN option line stay; the other options, ➕ line and instructions go. The
155
156
  # unpressed seeds are removed, leaving the chosen pill visible.
156
157
  #
157
158
  # Thread notes (audience replies that are not the answer, even after ✅) go to
@@ -362,9 +363,15 @@ into a second board.
362
363
 
363
364
  ### tail — real-time message stream
364
365
 
365
- `slack tail` polls a channel every 3 seconds (configurable via `--interval`) and
366
- prints new messages as they arrive, in the same `[ts] @handle: text` format as
367
- the `read` command.
366
+ `slack tail` prints new messages in a channel as they arrive, in the same
367
+ `[ts] @handle: text` format as the `read` command.
368
+
369
+ - **Transport: RTM WebSocket** (default) when the token is a desktop session
370
+ (`xoxc-` + cookie) and none of `--since`, `--timeout`, `--exit-on-message` is
371
+ given. If RTM can't connect it says `RTM unavailable — switching to polling.`
372
+ - **Fallback: polling** every `--interval` ms (default `60000` = 60 s; e.g.
373
+ `--interval=3000` for near-real-time at the cost of more API calls). Used for
374
+ other tokens, with any of the three flags above, or with `--no-rtm`.
368
375
 
369
376
  ```sh
370
377
  slack tail "#general" # follow new messages from now
package/SKILL.md CHANGED
@@ -174,13 +174,16 @@ without losing clicks. A reaction is durable state anyone can read back later.
174
174
  destination resolve with the bot token (so the bot needs `users:read`).
175
175
  - **Answer paths**: a pill, or free text. In a DM a plain reply counts; in a channel only
176
176
  reactions and thread replies do (a channel carries unrelated traffic).
177
- - **❓ is the standing "other" choice.** Every question with choices lists it last
178
- (`1️⃣ … 2️⃣ … 3️⃣ … ❓ その他 — スレッドで返信`) and seeds it after the keycaps. Pressing it
177
+ - **➕ is the standing "other" choice.** Every question with choices lists it last
178
+ (`1️⃣ … 2️⃣ … 3️⃣ … ➕ その他 — スレッドで返信`) and seeds it after the keycaps. Pressing it
179
179
  is not an answer — `--wait` notes it on stderr and keeps waiting for the reply, which
180
- arrives as free text (exit `5`).
180
+ arrives as free text (exit `5`). Questions posted before 2026-10-14 carry ❓ as this
181
+ pill (line and seed); they keep working, and a ❓ press counts as "other" on either kind.
182
+ The head marker stays `:question:` — only the pill moved. A free-text question has no
183
+ other choice and still seeds ❓.
181
184
  - **ℹ️ is the "explain first" pill** — offered with `--explain` (or
182
- `SLACK_TERM_ASK_EXPLAIN=1`; `--no-explain` overrides), listed under ❓ and seeded after
183
- it. ❓ means "none fit, my answer follows"; ℹ️ means "I can't answer yet — explain".
185
+ `SLACK_TERM_ASK_EXPLAIN=1`; `--no-explain` overrides), listed under ➕ and seeded after
186
+ it. ➕ means "none fit, my answer follows"; ℹ️ means "I can't answer yet — explain".
184
187
  It **never answers or closes** the question: no ✅, the pills stay. `--wait`/`--waitFor`
185
188
  print who pressed it on stderr (`--json`: `explain: [user ids]`) and may post ONE thread
186
189
  note per question saying an explanation is coming (the thread is the record — re-presses
@@ -218,7 +221,7 @@ never get the same note twice. Only the question's audience counts; the asker, b
218
221
  bystanders are never notes.
219
222
 
220
223
  **Answering keeps the context.** The ✅ rewrite keeps the question's body (its background)
221
- and the chosen option; only the options not chosen, the ❓ line and the instructions go.
224
+ and the chosen option; only the options not chosen, the ➕ (or ❓) line and the instructions go.
222
225
  The head is unchanged (`:white_check_mark:` prefix, question, stamp, quoted answer), so
223
226
  anything that keys on the prefix or re-reads the answer works on old and new ✅ bodies alike.
224
227
 
@@ -228,7 +231,11 @@ anything that keys on the prefix or re-reads the answer works on old and new ✅
228
231
  (repeatable `--void=`; alias `slack ask void <link…>`; same `--code` gate; own questions
229
232
  only, `--as-bot` for the bot's). The text becomes `:no_entry_sign:` + reason with the body
230
233
  kept, our pills come off, and a 🚫 reaction is added. Three states, three prefixes:
231
- `:question:` open, `:white_check_mark:` answered, `:no_entry_sign:` void. `--wait` /
234
+ `:question:` open, `:white_check_mark:` answered, `:no_entry_sign:` void (the text prefix;
235
+ the open question's marker REACTION is ➕ on a question with choices, ❓ on free text and
236
+ on questions posted before ➕ — search `has::question: OR has::heavy_plus_sign:`; ➕ is a common
237
+ emoji, so that can match unrelated messages — `slack ask --ls` reads the local sent-log
238
+ and is unaffected). `--wait` /
232
239
  `--waitFor` on a void question **exit 6** (`--json` → `status: "void"`): stop waiting.
233
240
  Answered questions cannot be voided.
234
241
 
@@ -355,7 +362,7 @@ Reason flags stack independently of progress and of each other: ❗ `exclamation
355
362
  `slack thread`/`slack read` before replying to avoid duplicates; consolidate multiple
356
363
  points into one message.
357
364
 
358
- ### todos — Slack's To-dos tab (read-only)
365
+ ### todos — Slack's To-dos tab
359
366
 
360
367
  Not `slack todo`: that tracks tasks as reactions. `slack todos` reads Slack's own
361
368
  **personal** To-dos tab (the successor of "Later"), the list in the sidebar.
@@ -364,12 +371,23 @@ Not `slack todo`: that tracks tasks as reactions. `slack todos` reads Slack's ow
364
371
  slack todos # open to-dos, soonest due first (OVERDUE marked)
365
372
  slack todos --filter completed # also: saved (everything saved), archived
366
373
  slack todos --json -n 20 # one object per item: due, done, permalink, text
374
+
375
+ # Writes — gated like send: the first run previews and prints a code, rerun with --code=<code>
376
+ slack todos add "<permalink>" --due 2026-11-01T18:00 # --saved: no checkbox
377
+ slack todos done "<permalink>" # --undo reopens it
378
+ slack todos edit "<permalink>" --due none # or --due <time>, --todo / --saved
379
+ slack todos rm "<permalink>" # removes the to-do; the message stays
367
380
  ```
368
381
 
382
+ A To-do always points at a message, so the target is a message permalink or
383
+ `#chan:<ts>`. `add` refuses a message that is already saved; `done`/`edit`/`rm`
384
+ refuse one that isn't (Slack's delete answers ok even when there is nothing to
385
+ delete, so the CLI checks first).
386
+
369
387
  There is no public API: it uses the desktop client's internal `saved.list`, so
370
388
  it needs the **xoxc session** (`slack auth login`) and shows only your own
371
- to-dos. Bots can't see them. Slack can change this endpoint without notice.
372
- Adding and completing to-dos is not supported yet.
389
+ to-dos. Bots can't see them. Writes use the internal `saved.add` /
390
+ `saved.update` / `saved.delete`. Slack can change these endpoints without notice.
373
391
 
374
392
  ## Output formatting
375
393