| name | cron-manager |
| description | Create, edit, delete, enable, disable, and list scheduled cron jobs |
Cron Manager Skill
Trigger
This skill activates when the user wants to create, edit, delete, enable, disable, or list scheduled cron jobs.
Data File
All cron jobs are stored in ~/.jinn/cron/jobs.json as a JSON array of job objects. If the file does not exist, create it with an empty array [].
CronJob Schema
{
"id": "uuid-v4",
"name": "daily-standup-summary",
"enabled": true,
"schedule": "0 9 * * 1-5",
"timezone": "America/New_York",
"engine": "claude",
"model": "sonnet",
"employee": "project-manager",
"prompt": "Review all department boards and summarize progress since yesterday. Highlight blockers and upcoming deadlines.",
"delivery": {
"connector": "slack",
"channel": "#engineering-standup"
}
}
Field details:
id - UUID v4, generated when creating the job
name - kebab-case human-readable identifier, must be unique across all jobs
enabled - boolean, whether the job is active
schedule - standard cron expression (minute hour day month weekday)
timezone - IANA timezone string (e.g., America/New_York, Europe/London, UTC)
engine - AI engine to run the job: claude or codex
model - model identifier (e.g., sonnet, opus, o3)
employee - optional, the employee persona to use (must match an employee name in the org)
prompt - the instruction to execute when the job fires
delivery - optional object specifying where to send output
connector - the connector to use (e.g., slack, discord)
channel - the target channel or destination
Operations
Creating a Job
- Read the current
~/.jinn/cron/jobs.json (or initialize as [] if missing).
- Ask the user for the required fields: name, schedule, engine, model, and prompt.
- Ask about the timezone. Default to
UTC if not specified.
- Ask about the employee persona to use. This is optional.
- Always ask the user about the delivery channel if they did not specify one. Explain that without delivery, the output will only be logged.
- Delegation check: If the job has delivery configured AND targets a non-{{portalSlug}} employee, warn the user. The correct pattern for reporting/analytical jobs is: target
{{portalSlug}}, and include delegation instructions in the prompt (e.g. "Delegate to @employee-name: ..."). {{portalName}} reviews and filters the output before it reaches the delivery channel. Only simple, no-review tasks (e.g. health checks) should target employees directly with delivery.
- Generate a UUID for the
id field.
- Set
enabled to true by default.
- Append the new job object to the array.
- Write the updated array back to
~/.jinn/cron/jobs.json.
- Confirm the creation and summarize the schedule in plain English.
Editing a Job
- Read
~/.jinn/cron/jobs.json.
- Find the job by name or id.
- Show the current values to the user.
- Apply the requested changes.
- Write the updated array back.
- Confirm the changes.
Deleting a Job
- Read
~/.jinn/cron/jobs.json.
- Find the job by name or id.
- Confirm deletion with the user (show job details).
- Remove the job from the array.
- Write the updated array back.
- Confirm deletion.
Enabling / Disabling a Job
- Read
~/.jinn/cron/jobs.json.
- Find the job by name or id.
- Set
enabled to true (enable) or false (disable).
- Write the updated array back.
- Confirm the status change.
Listing Jobs
- Read
~/.jinn/cron/jobs.json.
- Display jobs in a readable format, grouped by enabled/disabled.
- Include name, schedule (with plain-English interpretation), timezone, engine, and delivery info.
Cron Schedule Reference
The schedule field uses standard 5-field cron syntax:
┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12)
│ │ │ │ ┌───────────── day of week (0-7, 0 and 7 = Sunday)
│ │ │ │ │
* * * * *
Common examples:
0 9 * * 1-5 - Every weekday at 9:00 AM
0 0 * * * - Every day at midnight
*/15 * * * * - Every 15 minutes
0 9 * * 1 - Every Monday at 9:00 AM
0 8,17 * * * - Every day at 8:00 AM and 5:00 PM
0 0 1 * * - First day of every month at midnight
30 14 * * 5 - Every Friday at 2:30 PM
Error Handling
- If
jobs.json is malformed, attempt to fix it. If unrecoverable, back it up as jobs.json.bak and start fresh with [].
- If a job name already exists when creating, warn the user and ask for a different name.
- Validate the cron expression format before saving. Warn if the expression looks incorrect.
- Validate that the timezone is a valid IANA timezone string.
- If an employee is specified, verify it exists in the org directory.