Skip to content

feat(cli): add search subcommand - #1754

Open
Robin-Everaars wants to merge 4 commits into
floatpane:release/v1from
Robin-Everaars:feature/cli-search
Open

Robin-Everaars wants to merge 4 commits into
floatpane:release/v1from
Robin-Everaars:feature/cli-search

Conversation

@Robin-Everaars

@Robin-Everaars Robin-Everaars commented Oct 27, 2026 •

Copy link
Copy Markdown

What?

Adds matcha search [--from <email>] [--json] <folder> <query> with the TUI's query syntax (from:, to:, subject:, body:, since:, before:, larger:). Unquoted terms after the folder are joined, so matcha search INBOX from:a subject:b keeps both.

Search wasn't in the service layer yet, so this adds Search to daemonclient.Service (daemon and direct), a Search RPC method and its handler. The daemon receives the raw query and parses it itself.

A daemon started from an older build answers method not found: Search until it is restarted.

Why?

Part of #1642. Depends on #1753.

This is one of five small PRs that replace #1680, as asked there: rebuilt on release/v1 and split per command. They stack, so please merge them in order. Each one shows its predecessors' commits until those are merged.

  1. feat(cli): add folders subcommand #1751 folders
  2. feat(cli): add list subcommand #1752 list
  3. feat(cli): add read subcommand #1753 read
  4. feat(cli): add search subcommand #1754 search
  5. feat(cli): add mail manage commands #1755 archive, delete, mark-read, mark-unread, move

Every step passes gofmt, go vet, go test ./..., go mod tidy and golangci-lint on the new code.

Add `matcha folders [--from <email>] [--json]`, the first read-only
mail command next to `send`.

The shared plumbing for the follow-up commands lives in cli/util.go
(account resolution by --from, matching Email and then FetchEmail
case-insensitively) and cli/main.go (hookable config loader, service
constructor and output writers for tests).

daemonclient gains NewCLIClient(cfg, autoStart). With autoStart off, a
one-shot command uses a running daemon and otherwise connects directly
instead of forking a daemon. NewService keeps its behaviour.

Refs floatpane#1642
Add `matcha list [folder] [--from <email>] [--json]`, which prints the
newest 50 messages of a folder (INBOX by default) as a table or as JSON
with uid, from, subject, date and is_read.

Adds the helpers the later read, search and manage commands share:
INBOX normalization, flag parsing that allows flags after positionals,
and the table/JSON email renderer.

Refs floatpane#1642
Add `matcha read [--from <email>] [--json] <folder> <uid>`. A single
numeric argument reads that UID from INBOX. Plain output prints the
body; --json returns body, mime_type and attachment metadata.

backend.Attachment gets explicit snake_case JSON names, and its raw
Data bytes are excluded so scripts never receive the payload as base64.

Refs floatpane#1642
Add `matcha search [--from <email>] [--json] <folder> <query>`, using
the same query syntax as the TUI (from:, to:, subject:, body:, since:,
before:, larger:). Unquoted terms after the folder are joined, so
`matcha search INBOX from:a subject:b` keeps both terms.

Search was not reachable through the service layer yet, so this adds
Search to daemonclient.Service (daemon and direct), a Search RPC method
and its daemon handler. The daemon gets the raw query and parses it
itself.

Refs floatpane#1642
@floatpanebot

Copy link
Copy Markdown
Member

This PR exceeds the recommended size of 1000 lines. Please make sure you are NOT addressing multiple issues with one PR. Note this PR might be rejected due to its size.

@floatpanebot floatpanebot added ci CI / build pipeline enhancement New feature or request labels Oct 27, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/cli CLI flags / commands area/daemon Daemon / RPC ci CI / build pipeline enhancement New feature or request size/XL Diff: 800+ lines target/v1 PR targets the release/v1 branch directly

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants