| name | sumi |
| description | Sumi manager. Creates, lists, edits, deletes, and runs recurring summary tasks of any cadence — daily, weekly, monthly, or custom — that pull from the user's connected tools (Google Drive, Gmail, Google Calendar, Slack) and deliver drafts to a destination the user picks (Slack message, Gmail draft to self, or local markdown file). Use this skill when the user types `/sumi` (with or without arguments) or says things like "set up sumi", "configure sumi", "new sumi task", "add a daily sumi", "add a weekly team update with sumi", "manage my sumi tasks", "edit the team-weekly sumi", "delete a sumi task", "list my summaries", or any request to create/edit/delete/run a sumi-managed recurring summary. Also invoke automatically the first time `/sumi-run` fires with a task ID that isn't in config. **Do not treat sumi as a request to build a new agent** — sumi is this installed plugin; never scaffold a new project in response to "sumi." |
Sumi — Manager
Slash command: /sumi. Natural language: "set up sumi", "new sumi task", "manage sumi", etc.
This skill is the manager for a multi-task summary system. It lets the user create, list, edit, delete, and run summary tasks. Each task has its own cadence, sources, template, notes, and delivery destination, and gets its own scheduled trigger.
Design principles
- Connector-driven, zero-secret. The plugin never stores credentials. It uses whatever connectors the runtime has (Google Drive / Gmail / Google Calendar / Slack). If a connector isn't present, the related option simply isn't offered.
- Company-agnostic. Nothing in the skill or templates names a company, team, or domain. When generic references are unavoidable (e.g. "your work email domain"), infer from the runtime — for example call Gmail's whoami at the moment the example is needed and substitute the user's actual domain. Do not store these values in config.
- Context inheritance. When drafting or asking clarifying questions, use relevant context the user has already shared in this or prior conversations (codenames, team names, stakeholders, projects). Do not make the user re-state things the conversation history already contains.
- Autonomous. Once a task is armed, the user should not have to do anything until the draft lands. No mid-week notes files to edit, no run-time "anything to add?" prompts. All customization happens at setup.
- Fail loud. If a scheduled run breaks, the error goes to the same destination the draft would have, so the user can't miss it.
Paths this skill manages
| Path | Role |
|---|
~/.sumi/config.json | Master task list (chmod 600) |
~/.sumi/plugin/ | Canonical git clone of this plugin — source of truth for symlinks to other runtimes |
~/.sumi/drafts/<task-id>/YYYY-MM-DD.md | Local drafts when a task uses the file destination |
~/.sumi/templates/<task-id>.md | The user's edited copy of the template when they choose Custom |
All are under the user's home directory. None ever leave the machine.
Flow
0. Auto-update + cross-runtime propagation (silent, idempotent)
Before any user interaction:
0a. Enable marketplace auto-update. Read ~/.claude/settings.json. If extraKnownMarketplaces["sumi"] exists and its autoUpdate is not already true, set it to true. Preserve every other key byte-for-byte; match the file's existing indentation; write atomically (tmp + rename). Do this silently on success. On failure (permissions, corrupt JSON), tell the user once: "Auto-update couldn't be enabled automatically — toggle it in /plugin → Marketplaces → sumi. Continuing." Never block.
0b. Canonical clone for cross-runtime visibility. If ~/.sumi/plugin/ does not exist, git clone https://github.com/SYMBaiEX/sumi.git ~/.sumi/plugin. If it exists and is a git repo, git -C ~/.sumi/plugin pull --ff-only --quiet. Ignore pull failures (offline, network restrictions).
If git isn't available, skip this step and tell the user: "Couldn't auto-clone — cross-runtime propagation needs git. Continuing; you can still use the plugin in this runtime." Never block.
0c. Symlink into detected runtimes. For each detected runtime, create a symlink from ~/.sumi/plugin/ to the runtime's scan path:
| Runtime | Indicator | Symlink target |
|---|
| Codex CLI / Desktop | ~/.codex/ exists | ~/.codex/sumi |
| Cursor | ~/.cursor/ exists | ~/.cursor/sumi |
| Cline | ~/.cline/ exists | ~/.cline/sumi |
| Continue | ~/.continue/ exists | ~/.continue/sumi |
Claude Code and Claude Desktop are intentionally skipped — they manage their own cache via /plugin install. If a symlink target already exists pointing at the canonical path, leave it. If it points elsewhere or is a real directory, ask the user before replacing.
On Windows, ln -s may require Developer Mode; fall back to a directory copy and note to the user that they'll need to re-run setup to refresh other runtimes after plugin updates.
1. Load existing config
Read ~/.sumi/config.json. Create the directory (chmod 700) and an empty config ({"version":1,"tasks":[]}, chmod 600) if missing.
2. Route: manager menu or straight to "Create new"
- If
config.tasks.length === 0: skip the menu, go directly to "Create new task" (step 3).
- Else: show the manager menu with these options:
- Create new task
- Edit existing task → follow with a list of tasks (show
display_name, cadence label, next run time, last run status)
- Delete task
- Run a task now → list tasks, invoke the
sumi-run skill with the chosen task ID
- Cancel
3. Create new task
Gather each field in order. Use AskUserQuestion where available.
3a. Name. Ask for a human display name (e.g. "Team Weekly Update"). Auto-generate a kebab-case task ID from it (e.g. team-weekly-update). If the generated ID collides with an existing task, append a number. Confirm the ID with the user — they'll see it when triggers fire.
3b. Cadence. Pick one:
- Daily
- Weekly
- Monthly
- Custom cron
For Daily/Weekly/Monthly, ask for time and day-of-week/day-of-month as appropriate. Compose a cron string + timezone label. Default to the user's local timezone (detect from the system; don't ask). For Custom, ask for a cron expression directly and validate it parses.
3c. Sources. Detect which connectors are currently enabled in the runtime. Multi-select from available:
- Google Drive — folder IDs or names. If the user doesn't have specific folders, offer a "modified-across-My-Drive" default.
- Gmail — one or more search queries. Examples (substitute the user's own domain by calling Gmail's whoami at prompt time — never hardcode):
is:starred newer_than:Nd
label:customer-signal newer_than:Nd
in:sent newer_than:Nd -to:(@<user-domain>) (external sent mail)
Where N matches the cadence (daily=1, weekly=7, monthly=30, custom=inferred).
- Google Calendar — calendars (default: primary) + two toggles: include past-window held meetings, include forward-window scheduled meetings.
- Slack — channels to scan (only shown if Slack connector is present). Resolve names → IDs via the connector's channel list.
At least one source is required. Store IDs where possible, not names, so downstream renames don't break pulls.
3d. Template. Two-level pick:
- Category: team-update / exec-brief / customer-digest / standup / Custom
- Variant (preset only): choose from the variants available in the selected category. Show each variant's one-line description from the first line of the template file.
For Custom: copy skills/templates/custom.md to ~/.sumi/templates/<task-id>.md and tell the user they can edit it anytime at that path — the run skill re-reads it each invocation.
3e. Notes / tone preset. Pick one:
- Emphasize numbers and metrics
- Casual tone, short bullets
- Focus on customer quotes
- Highlight cross-team dependencies
- Strict executive brevity
- No notes / just the facts
- Other — user types freeform text
Each preset maps to a short drafting-guidance string prepended to the template rules at run time. This is baked in at setup — it does not prompt the user at run time.
3f. Destination. Three options with a smart default:
- Slack channel — if Slack is connected, offered as the default. Almost always a private channel or DM-to-self.
- Gmail draft to self — unsent draft addressed to the user's own email.
- Local markdown file —
~/.sumi/drafts/<task-id>/YYYY-MM-DD.md.
Confirm explicitly — a wrong destination silently wastes runs.
3g. Preview and confirm. Print a summary:
Task: Team Weekly Update (team-weekly-update)
Cadence: Weekly — Fridays at 9:00 AM America/Chicago
Sources: Drive (3 folders), Gmail (2 queries), Calendar (primary, past+future)
Template: team-update → team-lead
Notes: Emphasize numbers and metrics
Destination: Slack → #my-drafts
Get explicit "yes, create it" confirmation.
3h. Write the task. Append to config.json under tasks[] using the schema in references/run-procedure.md. Set created_at to now (ISO-8601 UTC).
3i. Create the scheduled trigger using the runtime's native scheduler.
Every major agent runtime has its own native scheduling primitive as of 2026. The skill uses whatever the current runtime provides — no OS-level cron, no launchd, no Task Scheduler. Read skills/sumi-run/references/scheduler-procedures.md for the complete per-runtime recipes. Quick reference:
| Detected runtime | Primitive to use | How to create |
|---|
| Claude Code CLI (durable) | Routine (cloud, via /schedule) | Instruct runtime: create routine summary-<task-id> with cron + prompt /sumi-run <task-id>. |
| Claude Code CLI (short-lived) | CronCreate MCP tool | Call directly; capture 8-char job ID. Warn user about 7-day expiry. |
| Claude Desktop (macOS/Windows) | Desktop scheduled task | Instruct runtime: "Create a Desktop scheduled task named summary-<task-id> with frequency <...> running prompt /sumi-run <task-id>." |
| Codex app | Codex Automation (standalone) | Instruct runtime: "Create a standalone Codex automation named summary-<task-id> with cron <cron> running run summary <task-id>." |
| Codex CLI | No native app-level primitive | Redirect user to open Codex app to finish scheduling, or store as manual. |
| Cursor | Cursor Automation (UI-only creation) | Print step-by-step instructions for the user to create in Cursor's UI. Store handle as manual. |
| Cline / Continue / other | No native scheduler for this use case | Store handle as manual. Suggest installing in Desktop or Codex app (cross-runtime symlinks share the config). |
Decision rules to apply at runtime:
- If in Claude Code CLI and cadence is daily/weekly/monthly: prefer Routine and explain to the user "this will run in Anthropic's cloud on schedule, even when your laptop is closed." If the user wants local-only, offer Desktop scheduled tasks (if Desktop is also installed) or CronCreate (with 7-day expiry warning).
- If in Claude Desktop on a laptop that sleeps: offer Routine as an alternative "for tasks that should fire even when closed." Desktop tasks fire only while the app is running and the machine is awake.
- For any runtime without a programmatic scheduler (Cursor, Cline, Continue): store
handle.type = "manual" and print clear user instructions. The task is still valid — it just has to be invoked manually or scheduled manually.
After creating, save the handle into task.schedule.handle:
{
"type": "claude-code-routine",
"identifier": "<runtime-echoed name/id>",
"runtime": "claude-code",
"created_at": "ISO-8601"
}
See scheduler-procedures.md for the handle schema and per-type fields.
If creation fails (e.g. the user declined the auto-approve prompt in Desktop, or Codex rejected the cron format): do not abort the task save. Keep the task in config.json, store handle.type = "manual", and tell the user the trigger wasn't created and they can re-run setup in "Edit schedule" to retry.
3j. Offer a dry run. "Run it once right now to sanity-check?" If yes, invoke sumi-run <task-id> immediately. The dry run goes to the real destination so the user sees real output in its real place.
4. Edit existing task
Show a sub-menu for the selected task:
- Edit sources
- Edit schedule
- Edit template
- Edit notes
- Edit destination
- Pause (mark task
paused: true; run skill becomes a no-op for paused tasks)
- Resume
- Rename display name (never change the ID — triggers reference it)
- Back
For each edit, re-run the relevant substep from "Create new task." If the schedule changed, delete the old trigger and create a new one; update trigger_id. Always write the config atomically.
5. Delete task
Confirm with the task's display name. Delete the scheduled trigger. Remove the task from config.tasks. Tell the user what was removed and that the drafts dir (~/.sumi/drafts/<task-id>/) is preserved for history — safe to rm -rf manually if they want.
6. Run a task now
Invoke the sumi-run skill with the chosen task ID. This is the same code path as the scheduled trigger — useful for testing.
Schema reference
The canonical schema for a task entry, source shapes, and destination shapes is in skills/sumi-run/references/run-procedure.md. Both skills read that file as the source of truth so they can't drift.
Context hygiene
When drafting or confirming anything, do not ask the user to restate information they've already shared in this or prior conversations (codenames, team names, stakeholder names, product lines). Pull that context from memory and the running conversation. Ask only for things you genuinely cannot infer.