К основному содержанию
скилл CX Codex

use-spark — скилл для Claude Code: почта и календарь Spark

Даёт агенту доступ к почте, календарю, контактам и встречам в Spark через CLI. Пригодится, когда нужно найти письмо или свободное окно, не выходя из редактора.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add readdle/spark-cli-skills --skill use-spark -a claude-code
Открыть на GitHub

Что делает use-spark

Скилл учит агента работать с spark — тонким клиентом, который общается по IPC с запущенным Spark Desktop. Своей почты, сети и учётных данных у него нет: всё берётся из живого приложения на вашем компьютере. Поэтому запускать его в песочнице, контейнере или CI не получится — соединение не установится. Если Spark Desktop закрыт, попросите пользователя открыть его, повторные попытки ничего не дадут.

Команд около двадцати: accounts, folders, emails, search, thread, attachment, draft, templates, events, availability, contacts, team, meetings, action и другие. Начинать стоит с spark accounts — она покажет аккаунты, календари, команды и общие ящики вместе с уровнем доступа. Уровни три: read-only разрешает только чтение, triage добавляет черновики, комментарии и действия над письмами, send открывает отправку и работу с событиями календаря. Настраиваются они отдельно для каждого аккаунта и общего ящика в Settings -> AI Agents, и общий ящик может иметь другой уровень, чем родительский аккаунт. Команда сверх уровня вернёт ошибку с подсказкой, как его поднять.

Флаг --json переводит вывод в JSON: значения не обрезаются, ключи в snake_case, даты в ISO 8601. Ошибка при этом печатает {"error": {"message": "…"}} в stdout и завершается с ненулевым кодом. Для чтения глазами хватает текстового вывода, а для обработки берите JSON — например, spark emails --json | jq '.emails[].id'. Поля только добавляются, переименовывать или удалять их не будут.

Какие задачи решает

  • найти письмо по теме, не открывая почтовый клиент
  • прочитать всю переписку в треде вместе с вложениями
  • проверить, свободен ли слот для встречи с участниками
  • собрать черновик ответа или переслать письмо
  • посмотреть состав команды и общие ящики

Примеры запросов агенту

  • покажи непрочитанные письма за последнюю неделю
  • найди свободное окно на завтра с участниками встречи
  • прочитай тред с последним письмом от клиента

Как установить use-spark

1Через Skills CLI (Vercel)

npx skills add readdle/spark-cli-skills --skill use-spark -a claude-code

2Вручную: положить файлы

~/.claude/skills/use-spark/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/use-spark/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о use-spark

Как установить use-spark в Claude?

Выполните npx skills add readdle/spark-cli-skills --skill use-spark -a claude-code. Скилл появится в ~/.claude/skills/use-spark/SKILL.md.

Что делает use-spark?

Даёт агенту доступ к данным Spark через CLI: письма, поиск, треды, календарь, доступность, контакты и информация о команде.

Почему spark не подключается?

Он работает по IPC с запущенным Spark Desktop и не имеет собственной сети и учётных данных. В песочнице, контейнере или CI соединения не будет, а если приложение закрыто — попросите пользователя его открыть.

Исходный текст

SKILL.md · MIT
---
name: use-spark
description: >-
  Use the spark CLI to access the user's Spark email data - list emails,
  search by topic, read threads, check calendar events, find availability,
  look up contacts, and view team info. Use when the user asks about their
  emails, calendar, contacts, meetings, or scheduling.
metadata:
  version: 1.4.1
  requires:
    bins:
      - spark
---

# Using spark

`spark` is a CLI for the Spark email client. Use it to query the user's mailbox, calendar, contacts, meetings, and team data.

## Running spark

```bash
spark <command> [options]
```

**Environment:** `spark` is a thin client that talks over IPC to the user's running Spark Desktop app - it does not ship its own mailbox, network stack, or credentials. Run it directly on the user's computer against the live Spark Desktop process. Do not try to execute it inside a sandbox, container, CI runner, or any environment isolated from the user's desktop session - it will fail to connect. If Spark Desktop is not running, ask the user to launch it instead of retrying.

**JSON output:** add `--json` to any command to get its result as JSON instead of text - the same data, with full (untruncated) values, snake_case keys, and ISO 8601 dates. A failure prints `{"error": {"message": "…"}}` on stdout and exits non-zero. Prefer the default text when you only need to read the result; use `--json` when you need to process it (e.g. `spark emails --json | jq '.emails[].id'`). Fields are only ever added, never renamed or removed.

## Commands

| Command | Description |
|---------|-------------|
| `accounts` | List accounts, calendars, teams, shared inboxes, and access levels |
| `folders` | List folders/labels with message counts |
| `emails` | List emails with filters and pagination |
| `search` | Hybrid keyword + semantic search with full bodies |
| `thread` | Read full thread - headers, bodies, attachments |
| `attachment` | Read a single email attachment by its ID (auto-downloads) |
| `draft` | Create, edit, or delete an email draft (new, reply, forward, from template), or list account signatures |
| `templates` | List saved message templates (personal and team) |
| `template` | Show a single template by ID or name with its placeholders |
| `comment` | Post a team comment on a thread |
| `events` | List calendar events for a time range |
| `event` | Create, update, delete, or RSVP to a calendar event, including managing attendees / invitations |
| `availability` | Find free time slots, optionally with attendees |
| `contacts` | Search contacts by name or email, or list the most-used ones |
| `contact` | Show one contact's details and settings |
| `team` | Show team info, members, shared inboxes, assignments |
| `meetings` | List meeting transcripts |
| `meeting` | Read a single meeting transcript |
| `action` | Perform actions on emails (archive, pin, snooze, assign, etc.) |
| `contact-action` | Perform actions on contacts (block, accept, categorize, etc.) |

### accounts

List all configured accounts with their aliases, calendars, teams, and shared inboxes. Each account and shared inbox shows its **access level** in parentheses, which controls what operations Spark can perform.

```bash
spark accounts
```

Run this first to discover what accounts, calendars, and teams are available, and to check their access levels.

**Access levels:**

| Level | Allowed operations |
|-------|-------------------|
| **read-only** | List, search, and read emails, threads, folders, events, contacts, meetings, teams |
| **triage** | Everything in read-only plus all write operations: drafts, team comments, email actions (archive, move, pin, snooze, assign, etc.), contact actions (block, accept, categorize, etc.) |
| **send** | Everything in triage plus mail-emitting operations: sending drafts (`action send`, including scheduled "Send Later"), and the entire `event` command: `event create` / `event update` / `event delete` / `event rsvp`, including attaching or detaching attendees via `--add` / `--remove` and the iTIP REQUEST / UPDATE / CANCEL / REPLY mail that goes with them. |

Access levels are configured separately for each account and each shared inbox in Spark Desktop under Settings -> AI Agents. Shared inboxes can have a different access level than the parent account - for example, a personal account may have triage access while a shared inbox under the same team is read-only or disabled.

If a command requires a higher access level than the account or shared inbox has, it returns an error with instructions on how to change the level.

### folders

List folders with message counts. Output includes folder identifiers in parentheses - use these as arguments to `emails` and `search`. Mailboxes backed by a Google account show `(Gmail labels)` on the **Email Account** or **Shared Inbox** header. Teams show the team name as a usable identifier for `emails`.

```bash
spark folders                        # all accounts
spark folders [email protected]       # single account
```

### emails

List emails with metadata (ID, From, Date, Subject, Flags). Supports pagination and Gmail-style filters.

```bash
spark emails                                                   # Unified Inbox
spark emails [email protected]:Archive                          # specific folder
spark emails "My Team"                                         # all shared threads in a team
spark emails --filter "from:[email protected] is:unread"             # filtered
spark emails --filter "newer_than:7d has:attachment"            # recent with attachments
spark emails --page 2 --page-size 20                           # pagination
spark emails --order ascending                                 # oldest first
spark emails --new-senders                                     # show only new sender emails
```

**GateKeeper filtering:** When viewing the Inbox with GateKeeper in explicit mode, new sender emails are automatically filtered out and a "New Senders" count is shown at the top. Use `--new-senders` to view those emails. Use `contact-action acceptContact <email>` or `contact-action blockContact <email>` to accept or block a sender.

**Folder identifier formats** (run `folders` to see available ones):

| Format | Example | Meaning |
|--------|---------|---------|
| Bare name | `Inbox`, `Archive` | Unified folder (cross-account) |
| `email` | `[email protected]` | Account inbox shorthand |
| `email:Folder` | `[email protected]:Archive` | Specific account folder |
| `"Team Name"` | `"My Team"` | All shared threads in a team (quote if spaces) |
| `shared@email:Inbox` | `[email protected]:Inbox` | Shared inbox open items (conversation view, matches Desktop) |
| `shared@email:Archive` | `[email protected]:Archive` | Shared inbox done/archived items (conversation view) |
| `shared@email:Folder` | `[email protected]:Label` | Other shared inbox folder / label |

**Filter operators** (combinable, Gmail-style):

| Operator | Example |
|----------|---------|
| `from:<addr>` | `from:[email protected]` |
| `to:<addr>` | `to:[email protected]` |
| `cc:<addr>` | `cc:[email protected]` |
| `subject:<text>` | `subject:"quarterly report"` |
| `before:yyyy/MM/dd` | `before:2026/03/01` |
| `after:yyyy/MM/dd` | `after:2026/01/01` |
| `newer_than:Xd` | `newer_than:7d` (also `w`, `m`, `y`) |
| `older_than:Xd` | `older_than:30d` |
| `has:attachment` | also `document`, `spreadsheet`, `presentation`, `reminder` |
| `is:unread` | also `read`, `starred`, `pinned`, `unreplied` |
| `is:shared` | emails shared to any team (alias for `is:shared_email`) |
| `is:shared_inbox_open` | open items in shared inbox |
| `is:shared_inbox_done` | completed/closed items in shared inbox |
| `category:personal` | also `priority`, `notification`, `newsletter`, `invitation`, `invitation_response` |
| `assigned_to:me` | emails assigned to current user |
| `assigned_to:<email>` | emails assigned to specific teammate |
| `assigned_to:unassigned` | shared inbox items with no assignee |
| `assigned_to:other` | emails assigned to someone else (not me) |
| `assigned_by:me` | emails delegated by current user |
| `filename:<name>` | `filename:report.pdf` |

### search

Two modes:

- **With a topic (keyword mode):** Hybrid keyword + semantic search returning up to 20 emails with full bodies, sorted by relevance.
- **Without a topic (list mode):** Paged compact table of every email matching `--filter` / `--in` across all folders and all accounts, sorted newest first. Same output as `emails`, but the default scope is "all folders" instead of the Unified Inbox. Trash, Spam, and Blocked are excluded (matching Spark's search field) unless `--in` explicitly targets one of those folders.

```bash
spark search "quarterly report"
spark search "API integration" --filter "from:[email protected]"
spark search "budget" --in [email protected]:Archive
spark search "vacation" --in [email protected]              # all folders in account

# Keywordless list mode - filter across every folder
spark search --filter "from:[email protected]"                  # every email from alice, all folders
spark search --filter "from:[email protected]" --in [email protected]
spark search --filter "is:unread newer_than:7d" --page 2
```

| Parameter | Required | Description |
|-----------|----------|-------------|
| `<about>` | No | Search topic (positional). Omit to switch to list mode. |
| `--filter` | No | Gmail-style filter (same operators as `emails`) |
| `--in` | No | Scope: account, team, folder, or shared inbox. All folders if omitted. |
| `--page` | No | Page number, 1-based (default: 1). List mode only. |
| `--page-size` | No | Emails per page (default: 50). List mode only. |
| `--order` | No | Sort order: `ascending` or `descending`. List mode only. |

**Use `search` with a topic when the user asks about content** - it returns email bodies so you can answer questions. **Use `search` without a topic when you need to filter emails (especially by `from:`) across every folder** - `emails` only sees the Unified Inbox so it can't answer questions like "every email from [email protected], anywhere". Use `emails` for plain browsing of Inbox / one folder.

### thread

Print every message in a thread - headers, full plain-text bodies, and attachment info. After the thread summary line, lists **custom (non-system) folder labels** once for the whole thread, using qualified names like `[email protected]:MyLabel` (same style as `folders`).

```bash
spark thread 1114                          # by message ID from emails/search output
spark thread --download-attachments 1114   # also fetch attachments via IMAP
spark thread "https://sparkmailapp.com/dpl/bl?token=ABC..."  # by Spark deep link
```

The positional argument accepts either a numeric message ID (the `ID:` line) or a Spark deep link (the `Link:` line) printed by a previous run - `https://sparkmailapp.com/dpl/bl?token=...`, `readdle-spark://bl=...`, or `readdlespark://bl=...`.

A `Reply-To:` line appears only when that header points somewhere other than `From` - mailing lists and website contact forms carry the real correspondent there. `draft --reply-to` already addresses the reply to it, so don't pass `--to` yourself.

Each message's `Attachments:` block is a table with columns `ID`, `Name`, `Size`, `MIME Type`, and `Path`. The `ID` column is the attachment's stable pk - feed it to `attachment` to read the file contents (auto-downloads if necessary). The `Path` column shows the local file or `(not downloaded, ...)` for attachments not yet fetched.

Use `emails` or `search` to find message IDs (the ID column), then `thread` to read the full conversation. Use `folders` to list valid label identifiers for `action attachLabel` / `detachLabel`.

### attachment

Read a single email attachment by its ID (pk) from the `thread` Attachments table. The file is auto-downloaded if it isn't cached locally yet.

```bash
spark attachment 42                          # print metadata (ID, Name, Size, MIME Type, Path, Message ID)
spark attachment 42 --stream > report.pdf    # write raw file bytes to stdout
```

| Parameter | Required | Description |
|-----------|----------|-------------|
| `<id>` | Yes | Attachment ID (pk) from the `thread` Attachments table. |
| `--stream` | No | Write the raw file bytes to stdout instead of metadata text. Useful inside sandboxed agents that can read the CLI's stdout but not local filesystem paths. The CLI streams the file in 64 KB chunks, so there is no practical size limit. To go the other way - attach a file the app can't read - pipe it into `draft`/`comment` with `--attach-stream`. |

Use `thread` to find attachment IDs (the `ID` column in the `Attachments:` table). The default text output is one `Key: value` per line, easy to parse from scripts.

### draft

**Requires: triage** access level.

Create a new email draft or edit an existing one. The body is written in markdown and converted to HTML.

```bash
spark draft --to "[email protected]" --subject "Hello" --body "Hi Alice, ..."
spark draft --to "[email protected]" --to "[email protected]" --cc "[email protected]" --subject "Meeting" --body "..."
spark draft --edit 1234 --subject "Updated subject" --body "Updated body"
spark draft --reply-to 5678 --body "Thanks for the update!"
spark draft --reply-all 5678 --body "Thanks everyone!"   # keeps the other recipients and the CCs
spark draft --forward 5678 --to "[email protected]" --body "FYI"
spark draft --account "[email protected]" --to "[email protected]" --subject "Hi" --body "..."
spark draft signatures                                                                # the signature each account appends
spark draft --to "[email protected]" --subject "Quick note" --body "..." --no-signature   # send without a signature
spark draft --edit 1234 --no-signature                                                # strip the signature from an existing draft
spark draft --to "[email protected]" --subject "Report" --body "See attached" --attach /path/to/report.pdf
spark draft --to "[email protected]" --subject "Files" --body "Two files" --attach /path/to/a.pdf --attach /path/to/b.xlsx
spark draft --to "[email protected]" --subject "Q3" --body $'Revenue is up:\n\n![Q3 revenue](chart.png)' --attach /path/to/chart.png   # show an attached image in the text
spark draft --reply-to 5678 --body "Resending the file" --attach-id 42   # attach a file from the original email
cat report.pdf | spark draft --to "[email protected]" --subject "Report" --body "See attached" --attach-stream report.pdf   # pipe a file the app can't read directly
spark draft --to "[email protected]" --subject "Proposal" --body "..." --team "Engineering" --user [email protected] --user [email protected]
spark draft --edit 1234 --team "Engineering" --user [email protected] --allow-send
spark draft --edit 1234 --user [email protected]           # invite carol on an already-shared draft
spark draft --edit 1234 --allow-send                  # grant send-on-behalf permission on an already-shared draft
spark draft --edit 1234 --no-allow-send               # revoke previously-granted send-on-behalf permission
spark draft --edit 1234 --remove-user [email protected]    # kick alice from a shared draft (keeps share, comments, other collaborators)
spark draft --edit 1234 --remove-user [email protected] --user [email protected]  # swap collaborators: remove alice, invite dave
spark draft --edit 1234 --unshare
spark draft --delete 1234                             # remove the draft for good (no Trash, no undo)
spark draft --template "Cold outbound v3" --to "[email protected]" --placeholder "Project name=Acme Q3" --placeholder "Deadline=Friday EOD"
spark draft --template 124 --edit 9821 --placeholder "Project name=Acme Q3" --placeholder "Deadline=Friday EOD"
```

| Parameter | Required | Description |
|-----------|----------|-------------|
| `--to` | No | Recipient address (RFC822). Repeat for multiple. |
| `--cc` | No | CC address. Repeat for multiple. |
| `--bcc` | No | BCC address. Repeat for multiple. |
| `--subject` | No | Subject line. |
| `--body` | Yes (new, no `--template`) | Body content in markdown. Required for new drafts unless a template provides one. `![alt](file name)` shows an attached image in the text - see **Images in the body** below. |
| `--edit` | No | Message ID of an existing draft to update. |
| `--reply-to` | No | Message ID to reply to. Addresses the sender alone (or the `Reply-To:` address when the message carries one). |
| `--reply-all` | No | Message ID to reply to, keeping everyone else on the thread: the other `To:` recipients land in To, the original `Cc:` in CC, minus your own address. Mutually exclusive with `--reply-to`; `--to` / `--cc` override the lists it builds. |
| `--forward` | No | Message ID to forward. |
| `--delete` | No | Message ID of a draft to delete **permanently**. Must be the only option on the command. Drafts have no Trash, so the deletion cannot be undone. A scheduled draft and a draft shared with teammates are both refused - `action unschedule` or `draft --edit <pk> --unshare` first. |
| `--account` | No | Account email to send from. Accepts a regular mail account, an alias, or a shared inbox email. |
| `--attach` | No | Absolute path to a file to attach. Repeat for multiple. The Spark app must be able to read the path; in the sandboxed App Store build a path outside the app's container can't be read and is rejected with a clear error - pipe the file with `--attach-stream` instead. Max 25 MB per file. |
| `--attach-id` | No | ID of an attachment on an existing email to copy onto this draft, from the Attachments table of `thread <message-id>`. Repeat for multiple. Use this to re-send a file the user received - replies don't inherit attachments (only `--forward` does). |
| `--attach-stream` | No | Attach a single file whose bytes are read from stdin, shown to recipients as `<name>`. Use this when the file is outside the app's sandbox (the App Store build can't read arbitrary paths) - it's the inbound twin of `attachment --stream`. One streamed file per command; combine with `--attach` for paths the app can read. Max 25 MB. Example: `cat report.pdf \| spark draft --edit 123 --attach-stream report.pdf`. Needs a real stdin, so it only works when you run the `spark` binary yourself - otherwise use `--attach-id` / `--attach`. |
| `--team` | No | Team name. Required when you belong to multiple teams. When editing a draft that's already shared, must match the team that owns the share. |
| `--user` | No | Teammate email to share with. Repeat for multiple. On an already-shared draft this **adds** collaborators without removing existing ones - use `--remove-user` to remove someone. |
| `--remove-user` | No | Teammate email to **remove** from an already-shared draft. Repeat for multiple. The shared draft, its comments, and the remaining collaborators are preserved (unlike `--unshare`, which tears the whole share down). Requires `--edit <shared-pk>`. Cannot remove yourself - use `--unshare` for that. Can be combined with `--user` in one command to swap collaborators; removals run before invites. |
| `--allow-send` | No | Grant teammates permission to send the shared draft on your behalf. New share: defaults to off when omitted. Edit of a shared draft: leaves the current value alone when omitted. Mutually exclusive with `--no-allow-send`. |
| `--no-allow-send` | No | Revoke teammates' permission to send the shared draft on your behalf. Useful when editing a shared draft whose allow-send is currently on. Mutually exclusive with `--allow-send`. |
| `--unshare` | No | Revert an already-shared draft back to a personal draft. Requires `--edit` and is mutually exclusive with `--team` / `--user` / `--remove-user` / `--allow-send` / `--no-allow-send` **and** with content edits (`--to` / `--cc` / `--bcc` / `--subject` / `--body` / `--attach` / `--attach-id` / `--attach-stream`) - issue the edit (or per-user removal) and the unshare as separate commands. |
| `--template` | No | Apply a saved template by ID or name. Combine with `--edit` to overlay onto an existing draft. |
| `--placeholder` | When template has manual placeholders | Fill a manual template placeholder, format `"<name>=<value>"`. Repeat for each. Auto-fillable placeholders (recipient/self names) are not addressable here - control them via `--to` and `--account`. |
| `--no-signature` | No | Send without a signature. Suppresses the account's per-mailbox default signature for this draft. On `--edit` it strips a signature already on the draft (the body and quoted thread are kept). Omit the flag to keep using the account default. |
| `signatures` | No | Positional, not a flag: prints every mailbox you can draft from with the signature it appends. Must be the only argument. |

Explicit flags always win over template fields. Use `template <id|name>` to discover the template's manual placeholders before calling `draft --template` - missing manual placeholders cause a hard error before any draft is created. Auto-fillable placeholders that fail to resolve (e.g. recipient name with multiple `--to`) leave a localized label in the body and surface in the response as a warning.

**Images in the body.** To put an image in the text instead of the attachment list, attach it and show it with markdown image syntax by its file name: `--attach /path/to/chart.png --body "![Q3 revenue](chart.png)"`. The file can come from `--attach`, `--attach-stream` or `--attach-id`, or already be on the draft. An `https://` image address is left as it is. A local image that matches no attached file, or a file that isn't an image, is an error, so a draft never goes out with a broken image. On `--edit` with `--body`, the new body decides which images stay: show an image already on the draft by its name (as `thread <draft-id>` lists it) to keep it, leave it out to remove it.

**The signature is added for you - never write your own sign-off.** Spark appends the mailbox's default signature to the body of every draft. `spark draft signatures` prints what each mailbox you can draft from appends.

When the user asks for a closing that differs from their signature, pass `--no-signature` and write the whole closing yourself.

On success the output includes the draft's `ID:` (use it with `--edit` and `action send`) and a `Link:` line with a Spark deep link (`https://sparkmailapp.com/dpl/bl?token=...`) that opens the draft directly in Spark. It also echoes the composed body under `Body:` - the whole message as the recipient will read it, signature included and quoted thread left out. Read it back to confirm the draft says what you meant, and to catch a sign-off of your own standing next to the account's.

**Always give the user the deep link.** After creating or updating a draft, include the `Link:` URL in your response as a clickable markdown link (e.g. `[Open draft in Spark](https://sparkmailapp.com/dpl/bl?token=...)`) so the user can jump straight to the draft to review or send it. Do not tell the user to open Spark and hunt for the draft manually.

Use `emails` to find message IDs for `--edit`, `--reply-to`, `--reply-all`, and `--forward`.
Use `accounts` to find account emails for `--account` - personal accounts, their `Alias:` entries, and shared inboxes are all listed there, and any of them can be used as the from address when the account has draft & comment access.
Use `teams` to find team names for `--team` and team member emails for `--user`.

**Threading is critical.** Whenever a new message belongs to an existing conversation, you **must** pass `--reply-to` with the **last message in that thread**. This is what attaches the draft to the conversation (correct In-Reply-To / References headers, same thread in the recipient's mailbox). Without `--reply-to` the draft starts a brand new thread, which is almost always wrong when the user asked you to "reply", "respond", "follow up", "answer", or "ping" anyone in the context of an existing conversation. Use `thread <id>` to inspect the conversation and pick the most recent message's ID as `--reply-to`. On a thread with several participants, use `--reply-all` unless the user wants a private answer to the sender.

**Follow-ups (no response yet).** When the user asks to follow up with someone you already emailed and they haven't replied yet (e.g. "send Alice a nudge - she never responded to my last email", "bump the proposal thread"), the most recent message in that thread is your own outgoing one. Use that message's ID as `--reply-to` - the follow-up stays attached to the original outgoing message so the recipient sees it as a bump on the existing conversation rather than a new cold email.

Sharing is triggered by the presence of `--team` or `--user`; teams with exactly one other active member auto-share with everyone, otherwise `--user` is required.
To add collaborators or change the allow-send setting on an existing shared draft, use `--edit <pk>` together with the sharing flags - the change is applied to the existing share instead of creating a new one.
To toggle allow-send off, pass `--no-allow-send`.
To remove a specific collaborator without tearing the share down, pass `--remove-user <email>`; the shared draft, its comments, and the remaining collaborators stay intact. Combine `--user` and `--remove-user` in one command to swap collaborators in a single operation - removals run before invites.
Content edits (`--to`, `--cc`, `--bcc`, `--subject`, `--body`, `--attach`) and sharing updates (`--team`, `--user`, `--remove-user`, `--allow-send`, `--no-allow-send`) must be issued as separate `draft` commands.

**Deleting a draft is final.** `--delete <pk>` removes the draft outright - unlike a received email there is no Trash to recover it from, and neither `history --undo` nor Spark's own undo can bring it back. Only delete a draft the user asked you to discard, and say so plainly in your response rather than implying it can be restored. To throw away just the *text* of a draft while keeping the draft itself, edit it (`draft --edit <pk> --body "..."`) instead.

### templates

List Spark message templates - the saved drafts users can apply via `draft --template`. Templates round-trip from desktop, so anything saved on the user's computer shows up here.

```bash
spark templates                          # all personal + team templates
spark templates --personal               # only personal templates
spark templates --team "Marketing"       # only that team's templates
spark templates --page 2 --page-size 20  # pagination
```

Output columns: `ID`, `Scope` (Personal / `<team name>`), `Name`, `Subject` (truncated to 40 chars), `Modified`. Use the `ID` or `Name` value with `template <id|name>` and `draft --template`.

### template

**Read-only.** Show a single template's full contents and its placeholder requirements. Run this before `draft --template` so you know which `--placeholder "<name>=<value>"` arguments the template needs.

```bash
spark template 123                       # by ID
spark template "Welcome reply"           # by name (case-insensitive)
```

Output includes scope, recipients, subject, body (HTML stripped to text), attachments, and a `Placeholders:` section listing every placeholder in the template:

- `[auto]` - auto-fillable (recipient/self name). Resolved from `--to` and `--account` when applied. **Not** overridable via `--placeholder`.
- `[manual]` - free-form placeholder. Required: must be passed as `--placeholder "<name>=<value>"` to `draft --template`.

If a name matches more than one template, you'll get an error listing the matching IDs - disambiguate by ID.

### comment

**Requires: triage** access level.

Post a team comment (chat message) on a thread. If the thread is not yet shared, it will be shared automatically. Supports text comments, file attachments, or both. Use `--edit` to update an existing comment.

```bash
spark comment 1234 --body "Looks good, let's proceed."
spark comment 1234 --body "Please review this" --team "Engineering"
spark comment 1234 --body "FYI" --team "Engineering" --user [email protected] --user [email protected]
spark comment 1234 --attach /path/to/screenshot.png
spark comment 1234 --body "See attached" --attach /path/to/report.pdf --attach /path/to/data.csv
cat screenshot.png | spark comment 1234 --attach-stream screenshot.png   # pipe a file the app can't read directly
spark comment --edit 5678 --body "Updated comment text"
```

| Parameter | Required | Description |
|-----------|----------|-------------|
| `<message-id>` | Yes (post) | Message ID of a message in the thread to comment on. |
| `--body` | When no `--attach` | Comment text to post. Required when using `--edit`. |
| `--attach` | When no `--body` | Absolute path to a file to attach. Repeat for multiple files. Each file is sent as a separate message. Cannot be used with `--edit`. The Spark app must be able to read the path; in the sandboxed App Store build a path outside the app's container can't be read and is rejected with a clear error - pipe the file with `--attach-stream` instead. Max 25 MB per file. |
| `--attach-stream` | When no `--body` | Attach a single file whose bytes are read from stdin, shown as `<name>`, sent as its own comment message. Use this when the file is outside the app's sandbox (the App Store build can't read arbitrary paths) - it's the inbound twin of `attachment --stream`. One streamed file per command; cannot be used with `--edit`. Max 25 MB. Example: `cat shot.png \| spark comment 456 --attach-stream shot.png --team "Engineering"`. Needs a real stdin, so it only works when you run the `spark` binary yourself - otherwise use `--attach`. |
| `--edit` | No | Message ID of an existing comment to edit. Requires `--body`. |
| `--team` | When >1 team | Team name. Required when you belong to multiple teams. |
| `--user` | When team >2 members | Teammate email to share with. Repeat for multiple. Only used when auto-sharing an unshared thread. For teams with 2 or fewer members, the whole team is shared with automatically. |

Use `emails` to find message IDs. Use `thread` to see comment IDs in a conversation. Use `team` to list t...

© readdle · MIT · readdle/spark-cli-skills

Похожие скиллы

Всё по теме «Заметки, задачи и проекты» →
daily-briefing официальный anthropics Собирает утреннюю сводку: встречи, контекст по аккаунтам, сделки с близким закрытием и ожидающие письма клиентов. Подходит для подготовки рабочего дня. CX Codex +1 3 300установок google-cloud-solution-agentic-analytics-spark-knowledge-catalog официальный google Скилл помогает спроектировать управляемую аналитику в Google Cloud для данных из разных облаков и систем. Подойдёт, если нужно согласовать требования, архитектуру и проверку решения. CX Codex 5 000установок spark-engineer https://github.com/Jeffallan Пишет PySpark-джобы и разбирает их тормоза: DataFrame, Spark SQL, перекос ключей, стриминг. Пригодится, когда джоб упирается в шуфл или падает по памяти. CX Codex +1 3 800установок extension-email-calendar-events caffeinelabs Скилл добавляет в приложение календарные события и рассылку iCalendar-приглашений по почте. Пригодится, если нужны встречи с гостями без ручной сборки ICS. CX Codex +1 28 400установок gws-calendar официальный googleworkspace Скилл помогает управлять событиями и календарями Google Calendar прямо через утилиту gws. CX Codex +1 61 200установок persona-project-manager официальный googleworkspace Скилл настраивает роль проектного менеджера через утилиту gws. Он помогает вести задачи в Таблицах, назначать встречи в Календаре и рассылать сводки. CX Codex +1 31 600установок

Из того же набора19

spark-recipe-morning-standup Собирает утреннюю сводку: события дня, непрочитанная почта по категориям и статус задач команды. Пригодится в начале рабочей сессии. CX Codex +1 362установок spark-recipe-inbox-by-category Скилл проходит по входящим в порядке важности: сначала приоритетные письма, потом личные, приглашения, уведомления и рассылки. Пригодится, когда просишь агента «что нового». CX Codex +1 360установок spark-recipe-end-of-day Скилл закрывает рабочий день: находит неотвеченные письма, разбирает закреплённое и показывает завтрашние встречи. CX Codex +1 359установок spark-recipe-meeting-prep Скилл собирает контекст перед встречей: повестку, письма по теме, данные участников и незакрытые треды, которые стоит поднять. CX Codex +1 354установок spark-recipe-inbox-zero Скилл ведёт агента по категориям входящих в Spark и доводит ящик до нуля: прочитать тред, архивировать, переместить или пометить выполненным. CX Codex +1 344установок spark-recipe-stakeholder-brief Собирает письма и встречи с одним человеком в короткий брифинг. Пригодится перед 1:1 или разговором после паузы. CX Codex +1 343установок spark-recipe-newsletter-cleanup Разбирает подписки на рассылки в Spark: блокирует ненужных отправителей, отписывает от шумных и включает ИИ-сводки для тех, что стоит оставить. CX Codex +1 340установок spark-recipe-shared-inbox-status Показывает, сколько писем в общих ящиках ждёт ответа, сколько висит без исполнителя и как распределена нагрузка по команде. CX Codex +1 336установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой