Skills can now declare runtime prerequisites (env vars, CLI binaries) via YAML frontmatter. Skills with unmet prerequisites are excluded from the system prompt so the agent never claims capabilities it can't deliver, and skill_view() warns the agent about what's missing. Three layers of defense: - build_skills_system_prompt() filters out unavailable skills - _find_all_skills() flags unmet prerequisites in metadata - skill_view() returns prerequisites_warning with actionable details Tagged 12 bundled skills that have hard runtime dependencies: gif-search (TENOR_API_KEY), notion (NOTION_API_KEY), himalaya, imessage, apple-notes, apple-reminders, openhue, duckduckgo-search, codebase-inspection, blogwatcher, songsee, mcporter. Closes #658 Fixes #630
278 lines
5.9 KiB
Markdown
278 lines
5.9 KiB
Markdown
---
|
|
name: himalaya
|
|
description: CLI to manage emails via IMAP/SMTP. Use himalaya to list, read, write, reply, forward, search, and organize emails from the terminal. Supports multiple accounts and message composition with MML (MIME Meta Language).
|
|
version: 1.0.0
|
|
author: community
|
|
license: MIT
|
|
metadata:
|
|
hermes:
|
|
tags: [Email, IMAP, SMTP, CLI, Communication]
|
|
homepage: https://github.com/pimalaya/himalaya
|
|
prerequisites:
|
|
commands: [himalaya]
|
|
---
|
|
|
|
# Himalaya Email CLI
|
|
|
|
Himalaya is a CLI email client that lets you manage emails from the terminal using IMAP, SMTP, Notmuch, or Sendmail backends.
|
|
|
|
## References
|
|
|
|
- `references/configuration.md` (config file setup + IMAP/SMTP authentication)
|
|
- `references/message-composition.md` (MML syntax for composing emails)
|
|
|
|
## Prerequisites
|
|
|
|
1. Himalaya CLI installed (`himalaya --version` to verify)
|
|
2. A configuration file at `~/.config/himalaya/config.toml`
|
|
3. IMAP/SMTP credentials configured (password stored securely)
|
|
|
|
### Installation
|
|
|
|
```bash
|
|
# Pre-built binary (Linux/macOS — recommended)
|
|
curl -sSL https://raw.githubusercontent.com/pimalaya/himalaya/master/install.sh | PREFIX=~/.local sh
|
|
|
|
# macOS via Homebrew
|
|
brew install himalaya
|
|
|
|
# Or via cargo (any platform with Rust)
|
|
cargo install himalaya --locked
|
|
```
|
|
|
|
## Configuration Setup
|
|
|
|
Run the interactive wizard to set up an account:
|
|
|
|
```bash
|
|
himalaya account configure
|
|
```
|
|
|
|
Or create `~/.config/himalaya/config.toml` manually:
|
|
|
|
```toml
|
|
[accounts.personal]
|
|
email = "you@example.com"
|
|
display-name = "Your Name"
|
|
default = true
|
|
|
|
backend.type = "imap"
|
|
backend.host = "imap.example.com"
|
|
backend.port = 993
|
|
backend.encryption.type = "tls"
|
|
backend.login = "you@example.com"
|
|
backend.auth.type = "password"
|
|
backend.auth.cmd = "pass show email/imap" # or use keyring
|
|
|
|
message.send.backend.type = "smtp"
|
|
message.send.backend.host = "smtp.example.com"
|
|
message.send.backend.port = 587
|
|
message.send.backend.encryption.type = "start-tls"
|
|
message.send.backend.login = "you@example.com"
|
|
message.send.backend.auth.type = "password"
|
|
message.send.backend.auth.cmd = "pass show email/smtp"
|
|
```
|
|
|
|
## Hermes Integration Notes
|
|
|
|
- **Reading, listing, searching, moving, deleting** all work directly through the terminal tool
|
|
- **Composing/replying/forwarding** — piped input (`cat << EOF | himalaya template send`) is recommended for reliability. Interactive `$EDITOR` mode works with `pty=true` + background + process tool, but requires knowing the editor and its commands
|
|
- Use `--output json` for structured output that's easier to parse programmatically
|
|
- The `himalaya account configure` wizard requires interactive input — use PTY mode: `terminal(command="himalaya account configure", pty=true)`
|
|
|
|
## Common Operations
|
|
|
|
### List Folders
|
|
|
|
```bash
|
|
himalaya folder list
|
|
```
|
|
|
|
### List Emails
|
|
|
|
List emails in INBOX (default):
|
|
|
|
```bash
|
|
himalaya envelope list
|
|
```
|
|
|
|
List emails in a specific folder:
|
|
|
|
```bash
|
|
himalaya envelope list --folder "Sent"
|
|
```
|
|
|
|
List with pagination:
|
|
|
|
```bash
|
|
himalaya envelope list --page 1 --page-size 20
|
|
```
|
|
|
|
### Search Emails
|
|
|
|
```bash
|
|
himalaya envelope list from john@example.com subject meeting
|
|
```
|
|
|
|
### Read an Email
|
|
|
|
Read email by ID (shows plain text):
|
|
|
|
```bash
|
|
himalaya message read 42
|
|
```
|
|
|
|
Export raw MIME:
|
|
|
|
```bash
|
|
himalaya message export 42 --full
|
|
```
|
|
|
|
### Reply to an Email
|
|
|
|
To reply non-interactively from Hermes, read the original message, compose a reply, and pipe it:
|
|
|
|
```bash
|
|
# Get the reply template, edit it, and send
|
|
himalaya template reply 42 | sed 's/^$/\nYour reply text here\n/' | himalaya template send
|
|
```
|
|
|
|
Or build the reply manually:
|
|
|
|
```bash
|
|
cat << 'EOF' | himalaya template send
|
|
From: you@example.com
|
|
To: sender@example.com
|
|
Subject: Re: Original Subject
|
|
In-Reply-To: <original-message-id>
|
|
|
|
Your reply here.
|
|
EOF
|
|
```
|
|
|
|
Reply-all (interactive — needs $EDITOR, use template approach above instead):
|
|
|
|
```bash
|
|
himalaya message reply 42 --all
|
|
```
|
|
|
|
### Forward an Email
|
|
|
|
```bash
|
|
# Get forward template and pipe with modifications
|
|
himalaya template forward 42 | sed 's/^To:.*/To: newrecipient@example.com/' | himalaya template send
|
|
```
|
|
|
|
### Write a New Email
|
|
|
|
**Non-interactive (use this from Hermes)** — pipe the message via stdin:
|
|
|
|
```bash
|
|
cat << 'EOF' | himalaya template send
|
|
From: you@example.com
|
|
To: recipient@example.com
|
|
Subject: Test Message
|
|
|
|
Hello from Himalaya!
|
|
EOF
|
|
```
|
|
|
|
Or with headers flag:
|
|
|
|
```bash
|
|
himalaya message write -H "To:recipient@example.com" -H "Subject:Test" "Message body here"
|
|
```
|
|
|
|
Note: `himalaya message write` without piped input opens `$EDITOR`. This works with `pty=true` + background mode, but piping is simpler and more reliable.
|
|
|
|
### Move/Copy Emails
|
|
|
|
Move to folder:
|
|
|
|
```bash
|
|
himalaya message move 42 "Archive"
|
|
```
|
|
|
|
Copy to folder:
|
|
|
|
```bash
|
|
himalaya message copy 42 "Important"
|
|
```
|
|
|
|
### Delete an Email
|
|
|
|
```bash
|
|
himalaya message delete 42
|
|
```
|
|
|
|
### Manage Flags
|
|
|
|
Add flag:
|
|
|
|
```bash
|
|
himalaya flag add 42 --flag seen
|
|
```
|
|
|
|
Remove flag:
|
|
|
|
```bash
|
|
himalaya flag remove 42 --flag seen
|
|
```
|
|
|
|
## Multiple Accounts
|
|
|
|
List accounts:
|
|
|
|
```bash
|
|
himalaya account list
|
|
```
|
|
|
|
Use a specific account:
|
|
|
|
```bash
|
|
himalaya --account work envelope list
|
|
```
|
|
|
|
## Attachments
|
|
|
|
Save attachments from a message:
|
|
|
|
```bash
|
|
himalaya attachment download 42
|
|
```
|
|
|
|
Save to specific directory:
|
|
|
|
```bash
|
|
himalaya attachment download 42 --dir ~/Downloads
|
|
```
|
|
|
|
## Output Formats
|
|
|
|
Most commands support `--output` for structured output:
|
|
|
|
```bash
|
|
himalaya envelope list --output json
|
|
himalaya envelope list --output plain
|
|
```
|
|
|
|
## Debugging
|
|
|
|
Enable debug logging:
|
|
|
|
```bash
|
|
RUST_LOG=debug himalaya envelope list
|
|
```
|
|
|
|
Full trace with backtrace:
|
|
|
|
```bash
|
|
RUST_LOG=trace RUST_BACKTRACE=1 himalaya envelope list
|
|
```
|
|
|
|
## Tips
|
|
|
|
- Use `himalaya --help` or `himalaya <command> --help` for detailed usage.
|
|
- Message IDs are relative to the current folder; re-list after folder changes.
|
|
- For composing rich emails with attachments, use MML syntax (see `references/message-composition.md`).
|
|
- Store passwords securely using `pass`, system keyring, or a command that outputs the password.
|