Cross-platform task scheduler that programs one-off delayed actions using the OS native scheduler (at on Linux/macOS · schtasks on Windows). It wakes the agent at an EXACT future moment with FULL context injection.
Schedule, LIST, and MANAGE ephemeral tasks that fire at a PRECISE time in the user's timezone — ENSURE the future agent wakes up with a FULLY self-contained instruction, correct routing, and ZERO ambiguity.
OPENCLAW_BIN: Absolute path to the openclaw binary (ej. /usr/bin/openclaw)OPENCLAW_TZ: User's IANA timezone (ej. America/Mexico_City)The skill WILL NOT START if either variable is missing.
Why OPENCLAW_TZ? The server may run in UTC while the user lives in a different timezone. This variable ensures "schedule at 15:00" means 15:00 USER TIME, not server time.
# Schedule a task (timezone is optional — defaults to OPENCLAW_TZ)
node skills/to-do/to-do.js schedule "<YYYY-MM-DD HH:mm>" "<instruction>" "<user_id>" "<channel>" ["<timezone>"]
# Get current time in user's timezone
node skills/to-do/to-do.js now ["<timezone>"]
# List pending tasks
node skills/to-do/to-do.js list
# Delete a task by ID
node skills/to-do/to-do.js delete <ID>
now BEFORE resolving any relative time ("tomorrow", "in 2 hours", "tonight"). Server clock is NOT user clock. Use now output as your ONLY reference for "today", "tomorrow", and "right now".YYYY-MM-DD HH:mm timestamp BEFORE calling schedule. as if explaining to a STRANGER with ZERO CONTEXT. Future agent wakes up with TOTAL AMNESIA in a COMPLETELY ISOLATED session.user_id and channel for correct routing — USE ONLY raw alphanumeric data from system context to prevent command injection.list BEFORE delete to confirm the correct ID.now first → INSTEAD, run now, confirm date/time, THEN schedule.list first, confirm ID, THEN delete.now command output ALWAYS.;, &, |, $, ` `, (, )`) in any scheduler argument → INSTEAD, use only literal text and system identifiers to AVOID COMMAND INJECTION.If the user request matches any of these patterns, STOP AND ASK before scheduling:
RULE: If you cannot write a FULLY SELF-CONTAINED instruction, you DO NOT have enough information to schedule.
— Good instruction: clear, specific, fully self-contained
User: "Remind me tomorrow at 5pm to check PRs on the backend repo"
now → "🕒 Current Time (America/Mexico_City): 2/26/2026, 2:45 PM" → tomorrow = 2026-02-27```bash
node skills/to-do/to-do.js schedule "2026-02-27 17:00" \
"Check the 'backend-api' repo on GitHub. If there are pending PRs for the authentication module, send Alice (alice@company.com) a Slack reminder to review them before the 5 PM deployment freeze. Reference deployment logs at /var/log/deploy.log." \
"7684875449" "telegram"
```
— Bad instruction: vague, missing details
"Remind him to push the code later."
❌ DO NOT schedule this. Missing: who is "him"? Which repo? Which branch? What time is "later"?
→ Ask the user to clarify all missing details first.
— Relative time resolution
User: "Set a reminder for in 2 hours"
now → "🕒 Current Time (America/Mexico_City): 2/26/2026, 2:45 PM"
After scheduling, respond with EXACTLY THREE PARTS in this order:
Brief, casual confirmation. Match user tone/energy. NEVER just say "Done". Acknowledge WHAT was scheduled conversationally.
Template for the user to see exact details:
> `Day, Month DD · HH:MM TZ`
> EXACT INSTRUCTION LEFT FOR THE FUTURE AGENT
Short suggestion or question (1-2 sentences).
DO NOT BE PUSHY. JUST BE HELPFUL.
— CASUAL / PERSONAL TASK
All set! Your gym session is locked in for tomorrow at noon 🏋️
> Friday, February 27 · 12:00 PM CST
> SEND A TELEGRAM REMINDER TO DANIEL: "TIME TO HIT THE GYM FOR A BIT."
Want me to add another reminder 30 min before so you can get ready? 💪
— WORK / PROFESSIONAL TASK
Done! Got that scheduled for 5 PM sharp 📋
> Thursday, February 27 · 5:00 PM CST
> CHECK THE 'BACKEND-API' REPOSITORY ON GITHUB. IF THERE ARE PENDING PRS FOR THE AUTHENTICATION MODULE, SEND ALICE A SLACK REMINDER TO REVIEW THEM BEFORE THE 5 PM DEPLOYMENT FREEZE.
Need to schedule anything else for today, or a follow-up after reviewing those PRs?
Missing required environment variable(s)OPENCLAW_BIN or OPENCLAW_TZ not set.env or shell profileat not foundatd daemon not runningsudo systemctl enable atd && sudo systemctl start atdnownow first; NEVER trust server clocklist first, confirm ID, THEN delete共 1 个版本