Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
82b80c5
feat(identity-users): Identity resolution, direct messages, and user …
codesoda Sep 9, 2026
81fb429
feat(pins-emoji): Pins and custom emoji command groups
codesoda Sep 9, 2026
fea1ceb
feat(bookmarks): Channel bookmarks command group
codesoda Sep 9, 2026
4883ddc
feat(channels): Channel members, lifecycle management, and unread ove…
codesoda Sep 9, 2026
c401863
feat(messages-read): Time-bounded paginated reading and resolved mess…
codesoda Sep 9, 2026
f8bbea5
feat(messages-write): Message mutations, enriched permalinks, and sch…
codesoda Sep 9, 2026
0ede9be
feat(oauth-docs): Verify and document the reachable OAuth flow
codesoda Sep 9, 2026
a5b5a30
docs: consolidate documentation for feature batch
codesoda Sep 9, 2026
7c4084b
chore: ci fix-ups
codesoda Sep 9, 2026
bde61e9
chore: restore Cargo.lock v4 and rust-version 1.78; fix stale MSRV no…
codesoda Sep 9, 2026
e983016
test(ci-gate): Make coverage gate real and enable skipped client mock…
codesoda Sep 9, 2026
6f63b41
test(pr-critical): Cover Critical-risk entities resolve_channel pagin…
codesoda Sep 9, 2026
2fafc6d
test(users): CLI tests for users group
codesoda Sep 9, 2026
92c20c9
test(edge-api): Tests for the Edge API client
codesoda Sep 9, 2026
6f4d8b2
test(reminders-cli): CLI tests for reminders group
codesoda Sep 9, 2026
cda7413
test(status-reactions): CLI tests for status and reactions groups
codesoda Sep 9, 2026
7da0310
test(oauth): Tests for the OAuth flow
codesoda Sep 9, 2026
b97d4be
test(extract-fixtures): Fixture-based tests for browser/desktop crede…
codesoda Sep 9, 2026
8a977d7
test(keyring-storage): Testable keyring backend and un-ignored storag…
codesoda Sep 9, 2026
5510c8d
test(auth-cli): CLI tests for auth command paths
codesoda Sep 9, 2026
0bf5695
Merge branch 'cov/ci-gate' into feat/agent-feature-batch
codesoda Sep 9, 2026
dd78b0d
Merge branch 'cov/pr-critical' into feat/agent-feature-batch
codesoda Sep 9, 2026
64e3ee2
Merge branch 'cov/users' into feat/agent-feature-batch
codesoda Sep 9, 2026
53ffc4c
Merge branch 'cov/status-reactions' into feat/agent-feature-batch
codesoda Sep 9, 2026
eafa535
Merge branch 'cov/reminders-cli' into feat/agent-feature-batch
codesoda Sep 9, 2026
ef71fbf
Merge branch 'cov/edge-api' into feat/agent-feature-batch
codesoda Sep 9, 2026
0859d20
Merge branch 'cov/keyring-storage' into feat/agent-feature-batch
codesoda Sep 9, 2026
bd3e0b6
Merge branch 'cov/auth-cli' into feat/agent-feature-batch
codesoda Sep 9, 2026
3b0d11c
Merge branch 'cov/oauth' into feat/agent-feature-batch
codesoda Sep 9, 2026
8fca022
Merge branch 'cov/extract-fixtures' into feat/agent-feature-batch
codesoda Sep 9, 2026
9234cb7
fix(edge): reject non-2xx responses before decoding; docs: exit-code …
codesoda Sep 9, 2026
8875ff1
fix(files): validate upload paths before opening
codesoda Sep 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,6 @@ jobs:
${{ runner.os }}-cargo-coverage-

- name: Run coverage
run: cargo llvm-cov --all-features --workspace
run: cargo llvm-cov --all-features --workspace --ignore-filename-regex 'src/bin/test_keyring\.rs' --fail-under-lines 80
env:
SLACK_INTEGRATION_TESTS: "1"
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@ run-ralph-loop.sh
/.claude
/.codex
/.pi
/.aislop
19 changes: 10 additions & 9 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,17 +33,17 @@
- Verify linting: `cargo clippy --all-targets --all-features -- -D warnings`
- Run targeted tests while iterating: `cargo test <test_name>`
- Before finishing, run the full suite: `cargo test`
- MSRV is **1.75** — do not use features requiring a newer Rust edition or version
- MSRV is **1.78** (`rust-version` in Cargo.toml); CI builds on stable only

## CI checks (all must pass)

CI runs on every push/PR to main. These are the exact checks:
1. `cargo build --verbose` (Linux, macOS, Windows × stable + 1.75)
1. `cargo build --verbose` (Linux, macOS, Windows × stable)
2. `cargo test --verbose` (with `SLACK_INTEGRATION_TESTS=1`)
3. `cargo fmt --all -- --check`
4. `cargo clippy --all-targets --all-features -- -D warnings`
5. `cargo doc --no-deps --document-private-items` (with `RUSTDOCFLAGS=-D warnings`)
6. `cargo llvm-cov --all-features --workspace --fail-under 80`
6. `cargo llvm-cov --all-features --workspace --ignore-filename-regex 'src/bin/test_keyring\.rs' --fail-under-lines 80` (`src/bin/test_keyring.rs`, the diagnostic binary, is excluded from coverage)

## Guardrails (do not)

Expand Down Expand Up @@ -73,12 +73,13 @@ CI runs on every push/PR to main. These are the exact checks:
| Code | Meaning |
|------|---------|
| 0 | Success |
| 1 | General error |
| 2 | Authentication required |
| 3 | Invalid arguments |
| 4 | API error |
| 5 | Rate limited |
| 6 | Network error |
| 1 | Any runtime failure (auth required, API `ok: false`, rate limited, network, not found, …) |
| 2 | Usage error (invalid arguments/flags, including clap parse errors) |

Exit codes are defined in `SlackError::exit_code` (`src/error/types.rs`). The
JSON error object's `code` field (`SlackError::code`) is the stable,
machine-readable discriminator — do not add new exit codes without updating
this table, README.md, and the CLI tests that assert them.

## Release

Expand Down
63 changes: 63 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,69 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

### Added

- **Direct messages by user**: send directly to `@username` or a user ID by
opening or reusing the user's IM conversation.
- **User lookup by email**: resolve email addresses through
`users.lookupByEmail` with `slack users info`.
- **User groups**: list enabled groups and their members, with optional bulk
user-name resolution.
- **Message editing**: replace message text by `channel:timestamp` or Slack
permalink, with Markdown-to-mrkdwn conversion or verbatim text.
- **Message deletion**: delete a message by `channel:timestamp` or Slack
permalink without an interactive prompt.
- **Message permalinks**: retrieve strict permalinks and best-effort enrich
successful send/get JSON while preserving plain output.
- **Broadcast thread replies**: make a thread reply visible in its channel with
`messages send --broadcast`.
- **Message read markers**: mark a channel read through a timestamp, directly
or after an immediate send.
- **Scheduled messages**: schedule messages up to 120 days ahead, then list or
delete queued messages.
- **Block Kit messages**: send a nonempty Block Kit JSON array from a file or
stdin, with optional fallback text.
- **Resolved message output**: resolve authors and mentions from one paginated
workspace user-directory traversal.
- **Bounded message history**: read exclusive date/timestamp bounds and fetch
complete channel history with cursor pagination.
- **Message search sorting**: order search results by score or timestamp in
ascending or descending order.
- **Channel members**: list channel member IDs with optional bulk user-name
resolution.
- **Channel lifecycle**: create, join, leave, archive, restore, invite to,
rename, and update the topic or purpose of channels.
- **Unread overview**: show capability-dependent Web API unread counts and
report channels for which Slack omits count data.
- **File uploads**: upload named files through Slack's supported external-upload
flow, optionally sharing them to a channel or thread.
- **File search**: search workspace files with a user OAuth or browser token,
preserving Slack pagination metadata.
- **Pins**: add, remove, and list channel pins while preserving message, file,
and other pin item payloads in JSON output.
- **Custom emoji list**: list workspace custom emoji URLs and aliases with
sorted TSV output available through `--plain`.
- **Channel bookmarks**: list, add, and remove channel link bookmarks with an
optional emoji and script-friendly TSV output.

### Changed

- **OAuth documentation**: clarify that `auth add` reaches the configured Slack
app OAuth flow by default, document browser/manual routes, callback setup,
credential errors, token storage, and explicit scope replacement.

### Fixed

- **Edge API HTTP status handling**: `EdgeClient` decoded the response body
before checking the HTTP status, so a gateway/proxy error carrying a
plausible `ok: true` payload could be accepted as success. Non-2xx responses
are now reported as `api_error` with `HTTP <status>` and the (truncated) body
as `detail`, matching the Web API client.
- **Exit-code documentation**: README/AGENTS.md documented exit codes 2–6 for
auth/usage/API/rate-limit/network failures that the CLI never emitted. The
CLI exits `1` for any runtime failure and `2` for usage errors; the JSON
`code` field is the machine-readable discriminator. Docs now say so.

## [0.2.1] - 2026-09-08

### Fixed
Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ name = "slack-cli"
version = "0.2.1"
edition = "2021"
rust-version = "1.78"
default-run = "slack"
license = "MIT"
description = "A comprehensive CLI tool for Slack, designed for AI agents and automation"
repository = "https://github.com/user/slack-cli"
Expand Down
Loading
Loading