From citadel
Schedules recurring and one-off tasks via local OS cron/Task Scheduler or remote Anthropic Cron APIs. Supports list/add/remove with quota-aware defaults.
npx claudepluginhub sethgammon/citadel --plugin citadelThis skill uses the workspace's default tool permissions.
**Use when:** scheduling a recurring or one-off remote agent run (cron-style, outside the current session).
Schedules Claude Code tasks via native OS schedulers (launchd, crontab, Task Scheduler) from natural language. Handles one-time/recurring jobs with git worktree isolation.
Create and manage scheduled tasks that execute Claude CLI using cron expressions, intervals, or one-time schedules via Python scripts.
Share bugs, ideas, or general feedback.
Use when: scheduling a recurring or one-off remote agent run (cron-style, outside the current session). Don't use when: repeating work within the current session (use /loop); continuous unattended campaigns (use /daemon).
/schedule add does NOT call CronCreate by default. It shells out to
node scripts/local-schedule.js which installs a native OS entry (Windows
Task Scheduler or Unix cron). Only pass --remote to use Anthropic's routine
system, and only after explicit user confirmation.
Why: CronCreate counts against the account-wide 15 routine runs / 24h
cap; every fire of the scheduled task counts. See
docs/ROUTINE-QUOTA.md.
/schedule add "<expr>" "<command>" (no --remote)Run:
node scripts/local-schedule.js add "<expr>" "<command>"
Then report the returned ID and the removal command. This survives session
end, machine reboot, and consumes zero routine quota. Use
/schedule list and /schedule remove {id} (which also shell out to
local-schedule.js) by default.
/schedule add --remote ...Only when --remote is explicitly passed:
CronCreate, which counts against your 15 routine
runs / 24h quota and is cleared at session end. Continue? (y/N)"CronCreate-based flow documented below.The rest of the protocol documents the full CronCreate flow for reference
and for --remote invocations.
List all currently scheduled tasks using CronList.
Output format:
Active schedules (N):
[id] {description} — {cron expression} — next run: {time}
No schedules active.
If CronList is not available: output a helpful error (see Fringe Cases).
Create a recurring task.
Steps:
/pr-watch, /do status, etc.{command} {natural-language-interval} (cron: {expression}). OK?"/schedule remove {id} to cancel."Cron Expression Conversion Table:
| Natural Language | Cron Expression |
|---|---|
| every minute | * * * * * |
| every 5 minutes | */5 * * * * |
| every 15 minutes | */15 * * * * |
| every 30 minutes | */30 * * * * |
| every hour / hourly | 0 * * * * |
| every 2 hours | 0 */2 * * * |
| every 6 hours | 0 */6 * * * |
| every day / daily | 0 9 * * * (default 9am) |
| every day at {H}am/pm | 0 {H} * * * |
| every weekday | 0 9 * * 1-5 |
| every Monday | 0 9 * * 1 |
If the user provides a raw cron expression directly, use it as-is without converting. Validate it has 5 fields before accepting.
Remove a scheduled task by ID using CronDelete.
If the user doesn't know the ID: run /schedule list first, show the list,
and ask which one to remove.
Output: "Removed schedule {id} ({description})."
Show all active schedules and their next run times. Equivalent to /schedule list
with additional context about what each task does and when it last ran (if available).
CronCreate schedules tasks that run during the current Claude Code session only. When the session ends (Claude Code closes or the conversation is reset), all session-scoped schedules are cleared.
Use session-scoped when:
For tasks that need to survive machine sleep, network drops, or session restarts, use RemoteTrigger — a one-off cloud trigger that fires from Anthropic's infrastructure rather than your local session.
Use cloud-persistent when:
How to set up a one-off cloud trigger:
Note: RemoteTrigger requires Claude Code with cloud features enabled (Pro or Team plan). CronCreate works on all plans but is session-scoped only.
CronCreate not available: Output error; suggest OS cron/Task Scheduler. Never fail silently.
Ambiguous interval: Ask for clarification before proceeding.
Raw cron expression: Accept without conversion; validate 5 fields.
Every-minute schedule: Warn about 60 fires/hour; suggest 5m or 15m instead.
No schedules when listing: "No active schedules. Use /schedule add to create one."
Pause requested: Explain pause isn't supported; remove and recreate instead.
Disclosure: "Creating schedule: {command} at {cron expression}. OK?"
Reversibility: amber — creates OS cron entries or CronCreate sessions (side effects outside the repo); undo with /schedule remove {id}
Trust gates:
/schedule does not produce a HANDOFF block. After each action, output a concise confirmation or list and wait for the next command.
add: "Scheduled. ID: {id}. Use /schedule remove {id} to cancel."remove: "Removed schedule {id}."list or status: the active schedule list (or "No active schedules.")