/schedule-list
List all scheduled tasks with their status and next run times (project)
> /plugin marketplace add jshchnz/claude-code-scheduler > /plugin install scheduler@claude-scheduler
How it fires
How this command gets triggered: by you, by Claude, or both.
- Fires itselfClaude auto-loads it when your prompt matches the work.
- You can call itInvoke it directly when you want it.
- Slash command
/schedule-list
Context preview
What this command does when you run it.
List all scheduled tasks with their status and next run times (project)
Command definition
schedule-list.mddescription: List all scheduled tasks with their status and next run times (project)
allowed-tools: Read, Bash(ls:*), Bash(cat:*), Bash(plutil:*), Bash(launchctl:*), Bash(crontab:*), Bash(schtasks:*)
List Scheduled Tasks
Display ALL scheduled tasks across all projects by scanning the native scheduler.
Process
1. **Discover ALL Registered Tasks from Native Scheduler**
**macOS (launchd):**
ls ~/Library/LaunchAgents/com.claude.schedule.*.plist 2>/dev/null
For each plist found, extract task info:
plutil -p ~/Library/LaunchAgents/com.claude.schedule.<id>.plist
**Linux (crontab):**
crontab -l | grep "# claude-scheduler:"
**Windows:**
schtasks /Query /FO CSV | findstr "ClaudeScheduler"
2. **Parse Task Information** From each native scheduler entry, extract:
- **ID**: From filename/label (e.g., `com.claude.schedule.loc-review-joshing` → `loc-review-joshing`)
- **Type**: Detect from filename:
- `com.claude.schedule.once.<id>.plist` → **one-time**
- `com.claude.schedule.<id>.plist` → **recurring**
- **Project**: From `WorkingDirectory` in plist
- **Schedule**:
- **Recurring**: From `StartCalendarInterval` → pattern like "Daily at X"
- **One-time**: Extract `TARGET=<timestamp>` from ProgramArguments, convert with `date -r <timestamp>`
- **Command**: From `ProgramArguments`
**For one-time tasks**, extract target timestamp from bash command:
# ProgramArguments contains: "TARGET=1736376240; NOW=..."
# Extract and convert: date -r 1736376240 "+%b %d, %Y %I:%M %p"
3. **Enrich with Config Metadata (optional)**
- If the task's `WorkingDirectory` has a `.claude/schedules.json`, read it for name/description
- Fall back to ID as name if config not found
4. **Check Status**
launchctl list | grep com.claude.schedule
- Status `0` = enabled and healthy
- Status `-` = loaded but never run
5. **Display Table** Format output as a table with columns:
- ID (unique task identifier for use with other commands)
- Type (one-time / recurring)
- Project (working directory path, shortened with ~)
- Schedule (human-readable: exact date for one-time, pattern for recurring)
- Status (enabled/pending for one-time, enabled/disabled for recurring)
Output Format
# Scheduled Tasks
| ID | Type | Project | Schedule | Status |
|-------------------------|-----------|----------------------------|-----------------------|---------|
| once.loc-review-sched | one-time | ~/Documents/GitHub/sched | Jan 8, 2026 3:25 PM | pending |
| loc-review-joshing | recurring | ~/Documents/GitHub/joshing | Daily at 10:00 AM | enabled |
| daily-code-review | recurring | ~/Documents/GitHub/myapp | Weekdays at 9:00 AM | enabled |
**Total:** 3 tasks (1 one-time pending, 2 recurring)
**Platform:** macOS (launchd)
**Commands:** `/schedule-run <id>` | `/schedule-remove <id>` | `/schedule-logs <id>`
Converting Schedule to Human-Readable
Recurring Tasks (StartCalendarInterval):
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key><integer>10</integer>
<key>Minute</key><integer>0</integer>
</dict>→ "Daily at 10:00 AM"
With Weekday:
<key>Weekday</key><integer>1</integer>
→ "Mondays at 10:00 AM"
One-Time Tasks (StartInterval + timestamp):
One-time tasks use polling with embedded timestamp:
# ProgramArguments contains: "TARGET=1736376240; NOW=$(date +%s); if..."
Extract timestamp and convert:
date -r 1736376240 "+%b %d, %Y %I:%M %p"
→ "Jan 8, 2026 3:25 PM"
Additional Details
If the user asks for details about a specific task, read the plist and show:
- Task ID
- Full schedule configuration
- Command to execute
- Working directory
- Log file paths
- launchctl status
Empty State
If no plist files found:
No scheduled tasks found.
To create your first scheduled task, run:
/schedule-add
Commands Reference
After listing, remind the user of available commands:
- `/schedule-add` - Create a new task
- `/schedule-remove <id>` - Remove a task
- `/schedule-run <id>` - Run a task manually
- `/schedule-logs <id>` - View task logs
- `/schedule-status` - Check scheduler health
Read more
description: List all scheduled tasks with their status and next run times (project) allowed-tools: Read, Bash(ls:*), Bash(cat:*), Bash(plutil:*), Bash(launchctl:*), Bash(crontab:*), Bash(schtasks:*)
List Scheduled Tasks
Display ALL scheduled tasks across all projects by scanning the native scheduler.
Process
1. **Discover ALL Registered Tasks from Native Scheduler**
**macOS (launchd):**
ls ~/Library/LaunchAgents/com.claude.schedule.*.plist 2>/dev/null
For each plist found, extract task info:
plutil -p ~/Library/LaunchAgents/com.claude.schedule.<id>.plist
**Linux (crontab):**
crontab -l | grep "# claude-scheduler:"
**Windows:**
schtasks /Query /FO CSV | findstr "ClaudeScheduler"
2. **Parse Task Information** From each native scheduler entry, extract:
- **ID**: From filename/label (e.g., `com.claude.schedule.loc-review-joshing` → `loc-review-joshing`)
- **Type**: Detect from filename:
- `com.claude.schedule.once.<id>.plist` → **one-time**
- `com.claude.schedule.<id>.plist` → **recurring**
- **Project**: From `WorkingDirectory` in plist
- **Schedule**:
- **Recurring**: From `StartCalendarInterval` → pattern like "Daily at X"
- **One-time**: Extract `TARGET=<timestamp>` from ProgramArguments, convert with `date -r <timestamp>`
- **Command**: From `ProgramArguments`
**For one-time tasks**, extract target timestamp from bash command:
# ProgramArguments contains: "TARGET=1736376240; NOW=..." # Extract and convert: date -r 1736376240 "+%b %d, %Y %I:%M %p"
3. **Enrich with Config Metadata (optional)**
- If the task's `WorkingDirectory` has a `.claude/schedules.json`, read it for name/description
- Fall back to ID as name if config not found
4. **Check Status**
launchctl list | grep com.claude.schedule
- Status `0` = enabled and healthy
- Status `-` = loaded but never run
5. **Display Table** Format output as a table with columns:
- ID (unique task identifier for use with other commands)
- Type (one-time / recurring)
- Project (working directory path, shortened with ~)
- Schedule (human-readable: exact date for one-time, pattern for recurring)
- Status (enabled/pending for one-time, enabled/disabled for recurring)
Output Format
# Scheduled Tasks | ID | Type | Project | Schedule | Status | |-------------------------|-----------|----------------------------|-----------------------|---------| | once.loc-review-sched | one-time | ~/Documents/GitHub/sched | Jan 8, 2026 3:25 PM | pending | | loc-review-joshing | recurring | ~/Documents/GitHub/joshing | Daily at 10:00 AM | enabled | | daily-code-review | recurring | ~/Documents/GitHub/myapp | Weekdays at 9:00 AM | enabled | **Total:** 3 tasks (1 one-time pending, 2 recurring) **Platform:** macOS (launchd) **Commands:** `/schedule-run <id>` | `/schedule-remove <id>` | `/schedule-logs <id>`
Converting Schedule to Human-Readable
Recurring Tasks (StartCalendarInterval):
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key><integer>10</integer>
<key>Minute</key><integer>0</integer>
</dict>→ "Daily at 10:00 AM"
With Weekday:
<key>Weekday</key><integer>1</integer>
→ "Mondays at 10:00 AM"
One-Time Tasks (StartInterval + timestamp):
One-time tasks use polling with embedded timestamp:
# ProgramArguments contains: "TARGET=1736376240; NOW=$(date +%s); if..."
Extract timestamp and convert:
date -r 1736376240 "+%b %d, %Y %I:%M %p"
→ "Jan 8, 2026 3:25 PM"
Additional Details
If the user asks for details about a specific task, read the plist and show:
- Task ID
- Full schedule configuration
- Command to execute
- Working directory
- Log file paths
- launchctl status
Empty State
If no plist files found:
No scheduled tasks found. To create your first scheduled task, run: /schedule-add
Commands Reference
After listing, remind the user of available commands:
- `/schedule-add` - Create a new task
- `/schedule-remove <id>` - Remove a task
- `/schedule-run <id>` - Run a task manually
- `/schedule-logs <id>` - View task logs
- `/schedule-status` - Check scheduler health
Put Claude on autopilot. Schedule code reviews, security audits, and anything else - Claude Code runs them automatically, even while you sleep.
Repo: jshchnz/claude-code-scheduler
Other commands on scheduler.
- /schedule-add
Create a new scheduled task for recurring Claude Code execution (project)
Open command - /schedule-history
View execution history for all scheduled tasks with interactive selection
Open command - /schedule-logs
View execution logs for scheduled tasks
Open command - /schedule-remove
Remove a scheduled task by ID or name
Open command - /schedule-run
Manually run a scheduled task immediately
Open command - /schedule-status
Check the health and status of the scheduler system
Open command

