Conversation
Implements three feature requests for automated/headless email workflows. #8 - Bridge password from environment: - GetPassword() checks PM_CLI_BRIDGE_PASSWORD before the system keyring, enabling headless/CI use where no secret service is available. Interactive use is unchanged (env var only consulted when set and non-empty). #9 - mail list enhancements: - --unread/--flagged now use server-side IMAP SEARCH, so results honor --limit instead of being thinned by client-side filtering. - Adds from_address, to, message_id, and in_reply_to to list/search output (all already in the ENVELOPE, no extra fetch). - Adds --fields (project onto named JSON fields) and --compact (bare array). - ListMessages now takes a ListOptions struct; all callers updated. #10 - mail batch: - New 'mail batch' subcommand executes a JSON array of operations (label, unlabel, archive, move, flag, delete) over a single IMAP session. - Operations are fully validated before connecting; mailbox/label names with IMAP special characters (including the source mailbox) are rejected; input is capped at 10MB; errors are sanitized for terminal output. - --stop-on-error halts after the first failure; per-op results reported. Docs (commands.md, batch-format.md) and JSON help schema updated; version bumped to 0.3.0. Note: batch's per-op success reporting depends on issue #11 (silent no-op detection in STORE/COPY) for full accuracy.
Report-level credit to @Juan-de-Costa-Rica for the detailed issue reports. Implementation written fresh against the issues.
No v0.3.0 release/tag exists yet; latest published release is v0.2.5.
These changes ship in the 0.2.6 line, not a 0.3.0 minor release.
There was a problem hiding this comment.
Your free trial has ended. If you'd like to continue receiving code reviews, you can add a payment method here.
|
Two things in 1. 2. That was silent, because unknown keys are dropped. Both keys accepted, neither honored. A 3. Minor: Happy to send a PR for any of these if useful. |
|
Closing in favor of #18, which carries forward this PR's unique contribution. This PR bundled three features. Two of them landed independently in the meantime:
Those overlapped this branch across five files ( Two things this PR did better were ported into #18 rather than lost:
Two defects from this branch are also fixed in #18: the Note #12 was an identical duplicate of this branch (same head SHA One item from this PR that did not carry over, worth a follow-up: |
Carries forward the unique portion of #13. The env-var and mail-list work in that PR landed independently via #14 and #16, so only the batch command remains; this drops the duplicated implementations rather than conflicting with what shipped. mail batch runs multiple label/unlabel/archive/move/flag/delete operations over a single IMAP session, avoiding a connect and auth round-trip per operation. All operations are validated up front, so malformed input fails before any connection is opened or any mailbox is mutated. Names containing IMAP special characters or CRLF are rejected, and input is capped at 10MB. Also fixes two defects from #13: - The --help-json examples used \" inside raw string literals, which emitted literal backslashes into the agent-facing schema. - docs/commands.md listed `seq` as a --fields name; the implementation that shipped in #16 uses `seq_num`. Adds a CHANGELOG covering everything in 0.2.6 and bumps the version. Closes #10. Co-authored-by: exe.dev user <exedev@discovery-lotus.exe.xyz> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Implements three feature requests (#8, #9, #10) for automated/headless email workflows. Reimplemented from scratch (issue branches used only as reference); builds clean,
go vetclean, all tests pass.#8 — Bridge password from env var
GetPassword()checksPM_CLI_BRIDGE_PASSWORDbefore the system keyring → enables headless/CI use with no secret service.#9 —
mail listenhancements--unreadundercount:--unread/--flaggednow use server-side IMAPSEARCH, so results honor--limitinstead of being thinned by client-side filtering. The two can be combined.from_address,to,message_id,in_reply_toto list/search JSON (all already in the ENVELOPE — zero extra fetch). Previouslyfromdropped the address whenever a display name was present.--fields(project onto named JSON fields) and--compact(bare array). JSON-only; text output unchanged.ListMessagesnow takes aListOptionsstruct; all callers updated.#10 —
mail batchmail batchsubcommand runs a JSON array of ops (label,unlabel,archive,move,flag,delete) over a single IMAP session.mailbox(closed a gap vs. the original proposal); 10MB input cap; errors sanitized viasafetext.--stop-on-errorhalts after first failure; per-op results + totals reported.Tests & docs
docs/commands.md, newdocs/batch-format.md, and the--help-jsonschema updated. Version bumped to 0.2.6.mail batchroutes throughCopyMessages/DeleteMessages/MoveMessages. Its per-op success reporting is only fully accurate once #11 (silent no-op detection in STORE/COPY) lands — and #11's COPY check still needs theUIDPLUS/COPYUIDverification flagged in that review. Recommend landing #11 before relying on batch'slabel/unlabelresults.Supersedes #12 (closed automatically when its branch was renamed to
v0.2.6).