con un clic
foliome-loop
Manage recurring scheduled tasks — add, list, pause, resume, remove
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Menú
Manage recurring scheduled tasks — add, list, pause, resume, remove
Instalar con Codex o Claude Copia este prompt, pégalo en Codex, Claude u otro asistente, y deja que revise la página de la skill y la instale por ti.
Basado en la clasificación ocupacional SOC
Daily financial summary — net worth, recent activity, payment due dates, alerts
Build a custom dashboard view from a natural language request — query, API, React component, build, deploy
On-demand financial briefing — spending, balances, portfolio, transactions, reports, CSV export
Override transaction categories via natural language — update rules, reclassify
Guided first-bank setup — credentials, exploration, sync, extraction, import
Discover and build a complete bank integration by answering 9 required questions
| name | foliome-loop |
| description | Manage recurring scheduled tasks — add, list, pause, resume, remove |
| trigger | manual |
Persist recurring schedules to config/schedules.json and register them via CronCreate on every agent startup. Schedules survive agent restarts because they're config-driven — the agent re-registers all enabled entries on boot.
Parse the user's message to determine which subcommand to run:
Trigger: "schedule", "every day at", "recurring", "automate", or any natural language describing a recurring task.
/sync:
readers/institutions/*.js config. If mfa.sms, mfa.email, mfa.push, mfa.totp are ALL false/absent → non-MFA. All API connectors (connectors/*.js) are always non-MFA.prompt field as --banks bank1,bank2non-MFA to exclude themconfig/schedules.json, append the new entry, write back:
{
"id": "<slug>",
"description": "<human-readable schedule description>",
"cron": "<cron expression>",
"command": "<skill name>",
"prompt": "<full prompt for the agent when the cron fires>",
"enabled": true,
"cronJobId": null,
"createdAt": "<ISO timestamp>",
"lastRun": null,
"lastStatus": null,
"consecutiveFailures": 0,
"maxFailures": 3,
"suspendedAt": null,
"suspendReason": null
}
config/schedules.json to get the entry detailslastRun, lastStatus, consecutiveFailures in the config after completionconsecutiveFailures. If >= maxFailures, auto-suspends (see Auto-Suspend below)Trigger: "list schedules", "show schedules", "what's scheduled"
Read config/schedules.json and display a table:
ID Schedule Command Status
──────────────────────────────────────────────────────────────────────
daily-sync-non-mfa Every day 6am /sync (non-MFA) ✓ active — last ok 2h ago
weekday-brief Weekdays 7am /morning-brief ✓ active — last ok 5h ago
sunday-full-sync Sundays 10am /sync (all) ⏸ suspended — MFA timeout (3 failures)
monthly-reflect 1st of month 9am /reflect ✓ active — never run
<id>Trigger: "remove schedule", "delete schedule", "cancel schedule"
config/schedules.json, find the entry by IDcronJobId, call CronDelete to unregister it<id>Trigger: "pause schedule", "disable schedule", "stop schedule"
enabled: falsecronJobId, call CronDeletecronJobId: null<id>. Run /foliome-loop resume <id> to re-enable."<id>Trigger: "resume schedule", "enable schedule", "unpause schedule"
enabled: trueconsecutiveFailures: 0, clear suspendedAt and suspendReasoncronJobIdThe agent parses natural language into standard 5-field cron expressions. Follow CronCreate conventions — offset from :00/:30 when the user says "around" or "morning" (pick a minute like :03, :07, :57 etc.).
| Input | Cron | Notes |
|---|---|---|
| "every day at 6am" | 0 6 * * * | Exact time requested |
| "every morning" | 57 8 * * * | Approximate — offset from :00 |
| "every Tuesday" | 3 9 * * 2 | Default 9am, offset |
| "weekdays 7am" | 0 7 * * 1-5 | Exact time |
| "every 6 hours" | 7 */6 * * * | Offset minute |
| "first of every month" | 3 9 1 * * | Default 9am, offset |
| "every 30 minutes" | */30 * * * * | Interval — no offset needed |
| "twice a day" | Two entries: 3 9 * * * and 3 17 * * * | Create two schedule entries |
Some requests are event-relative, not time-fixed:
These can't be a single cron. Translate to a daily schedule and let the target skill handle the logic:
every day at 9am /payment-remindersSome requests specify a time window:
Prefer creating multiple schedule entries from a single request (simpler, more transparent):
30 9 * * 1-5 (9:30am weekdays)30 13 * * 1-5 (1:30pm weekdays)market-check-0930 and market-check-1330Schedules that fail repeatedly get auto-paused to avoid churning forever.
When a scheduled task completes:
lastStatus: "ok", lastRun to now, reset consecutiveFailures: 0lastStatus: "failed", lastRun to now, increment consecutiveFailuresconsecutiveFailures >= maxFailures (default 3):
enabled: falsecronJobId: nullsuspendedAt to current ISO timestampsuspendReason to the last error message<id> suspended after <maxFailures> consecutive failures. Last error: . Run /foliome-loop resume <id> when ready."When registering a schedule via CronCreate, use this prompt template:
Scheduled task firing: "<schedule-id>"
1. Read config/schedules.json, find the entry with id "<schedule-id>"
2. Execute the command: <prompt from the schedule entry>
3. After completion, read config/schedules.json again and update the entry:
- Set lastRun to the current ISO timestamp
- If the task succeeded: set lastStatus to "ok", set consecutiveFailures to 0
- If the task failed: set lastStatus to "failed", increment consecutiveFailures by 1
- If consecutiveFailures >= maxFailures: set enabled to false, set suspendedAt to current ISO timestamp, set suspendReason to the error message, and notify the user that the schedule has been suspended
4. Write the updated config back to config/schedules.json
This is handled by the agent on startup (documented in CLAUDE.md), not by this skill. The agent:
config/schedules.jsonenabled: true, calls CronCreatecronJobId valueslastRun is null or significantly older than the schedule period, executes a catch-up run immediatelyCronCreate jobs auto-expire after 7 days. This is not an issue in practice — the Telegram agent restarts for context management more frequently than every 7 days, and each restart re-registers all schedules from config. The persistent config is the source of truth; CronCreate is just the session-level executor.
Config: config/schedules.json (gitignored, initialized from config-templates/schedules.json)