stock-price-checker-proBefore calling the script, you MUST have all four resolved:
| Field | Question to answer | Example |
|---|---|---|
| --- | --- | --- |
| WHAT | What should happen / be said? | "Check NVDA stock price" |
| WHEN / HOW OFTEN | One-time or recurring? At what time/interval? | "Every Monday at 9 AM" |
| WHERE | Which channel + chat ID to deliver to? | Auto-detected from session |
| TIMEZONE | What timezone should times be interpreted in? | Auto-detected from USER.md |
The source channel and chat ID are available in your session context. Extract them before doing anything else.
telegram, discord))These two values are passed as --channel and --to to the script.
Never ask the user for these. Never hardcode them. Always read from session context.
Resolve the user's timezone using this exact priority chain:
| Priority | Source | How to read it |
|---|---|---|
| --- | --- | --- |
| 1 | Message itself | User says "at 9 AM London time" or "remind me at 3 PM EST" → extract from their words |
| 2 | USER.md | Read the Timezone: field from /root/.openclaw/workspace/USER.md |
| 3 | Ask the user | Only if tiers 1 and 2 both fail — ask once, then offer to save it |
Rules:
USER.mdtz: to the scripttz:UTC and mention it in the confirmation summaryFrom the user's natural language request, extract:
Map what the user said to one of three prefixed schedule strings.
> ⚠️ When the user states a clock time (e.g. "9 AM", "3 PM", "noon"), always interpret it in their resolved timezone (from Step 1), not UTC. The --tz flag passed to the script ensures cron expressions fire at the correct local time.
| What user said | Schedule string to pass |
|---|---|
| --- | --- |
| "every 30 minutes" | every:30m |
| "every hour" | every:1h |
| "every day at 9 AM" | cron:0 9 * |
| "every Monday at 9 AM" | cron:0 9 1 |
| "weekdays at 8 AM" | cron:0 8 1-5 |
| "every Friday at 5 PM" | cron:0 17 5 |
| "in 20 minutes" | at:20m |
| "in 2 hours" | at:2h |
| "at 3 PM today" | at: |
| "once at 9:30 AM tomorrow" | at: |
at: → always one-shot (--once is auto-set by the script)every: or cron: → recurring by defaultcron: or every: → pass --onceGenerate a short, descriptive name from the user's request.
"NVDA Check - Monday 9AM""Alert - 20min""Groceries - Noon"The message is what the agent will say or do when the job fires.
Craft it clearly so the agent knows exactly what to do:
"Reminder: Time to do groceries! 🛒""Check the current NVDA stock price and send me a summary.""Send me an inspiring motivational quote to start the day."> Ask: "Sure! When would you like me to remind you — just once at a specific time, or on a recurring schedule?"
> Ask: "How often? Every hour, every day, or something else?"
> Ask: "Just to confirm — should this be a one-time reminder or repeat every Monday?"
Before calling the script, summarise what you're about to set up and get a quick confirmation:
> "Got it! Here's what I'll set up:
> ⏰ Reminder: Check NVDA stock price
> 🔁 Schedule: Every Monday at 9 AM
> 🌍 Timezone: Africa/Lagos (UTC+1)
> 📱 Delivered to: This chat
>
> Shall I go ahead?"
Always include the Timezone line in the confirmation summary. If falling back to UTC because none was found, say so clearly:
> 🌍 Timezone: UTC (no timezone found — times will be in UTC)
Only proceed after user confirms.
uv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
"<job name>" \
"<what to say or do>" \
"<every:duration | cron:expr | at:duration>" \
"<channel>" \
"<chatId>" \
[once] \
[tz:<IANA timezone>]
tz: is optional but always include it when a timezone was resolved (tiers 1–2)tz:UTC explicitly when falling back — makes the stored description accuratetz:Africa/Lagos, tz:America/New_York, tz:Europe/London, tz:Asia/Kolkatatz:EST, tz:IST, tz:CET, tz:Lagos, tz:Londonuv run /root/.openclaw/workspace/skills/remind-me/src/main.py list \
"<channel>" \
"<chatId>"
uv run /root/.openclaw/workspace/skills/remind-me/src/main.py cancel name "<job name>"
uv run /root/.openclaw/workspace/skills/remind-me/src/main.py cancel id "<job id>"
User: "Remind me every Monday at 9 AM to check NVDA"
Africa/Lagosuv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
"NVDA Check - Monday 9AM" \
"Check the current NVDA stock price and send me a summary." \
"cron:0 9 * * 1" \
"telegram" \
"<chatId>" \
"tz:Africa/Lagos"
User: "Remind me to go do groceries by 12 PM"
Africa/Lagosat:3h30muv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
"Groceries - Noon" \
"Reminder: Time to go do groceries! 🛒" \
"at:3h30m" \
"telegram" \
"<chatId>" \
once \
"tz:Africa/Lagos"
User: "What reminders do I have?"
uv run /root/.openclaw/workspace/skills/remind-me/src/main.py list \
"telegram" \
"<chatId>"
Format the output as a readable list, not raw JSON. Example response:
> You have 2 active reminders in this chat:
>
> 1. NVDA Check - Monday 9AM 🔁 Every Monday at 9 AM
> _"Check the current NVDA stock price..."_
> 🌍 Timezone: Africa/Lagos (UTC+1)
> Next run: Mon 10 Mar 2026, 09:00
>
> 2. Groceries - Noon (one-time)
> _"Time to go do groceries!"_
> 🌍 Timezone: Africa/Lagos (UTC+1)
> Runs in: 3h 30m
User: "Cancel my NVDA reminder"
uv run /root/.openclaw/workspace/skills/remind-me/src/main.py cancel name "NVDA Check - Monday 9AM"
User: "In 30 seconds send me a love letter"
> at: schedules are duration-based (relative to now), so timezone does not affect when they fire.
> Still pass tz: so it is stored in the job description for consistency.
uv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
"Love Letter - 30s" \
"Write a beautiful, heartfelt love letter. Make it romantic and touching." \
"at:30s" \
"telegram" \
"<chatId>" \
"tz:Africa/Lagos"
User: "Remind me every day at 8 AM New York time to drink water"
America/New_York — no need to check USER.mduv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
"Drink Water - 8AM NY" \
"Reminder: Time to drink water! 💧" \
"cron:0 8 * * *" \
"telegram" \
"<chatId>" \
"tz:America/New_York"
User: "Remind me every day at 7 AM to exercise"
Africa/LagosTimezone: Africa/Lagosuv run /root/.openclaw/workspace/skills/remind-me/src/main.py create \
"Exercise - 7AM" \
"Reminder: Time to exercise! 💪" \
"cron:0 7 * * *" \
"telegram" \
"<chatId>" \
"tz:Africa/Lagos"
[remind-me:channel:chatId] tag embedded in each job's descriptionAfter running any command, always format the result in plain conversational language — never dump raw JSON to the user.
> ✅ Done! I've set up your reminder:
> ⏰ NVDA Check — Every Monday at 9 AM
> 📱 Delivered to this chat
> You have no active reminders in this chat.
> ✅ Reminder "NVDA Check - Monday 9AM" has been cancelled.
> ❌ Something went wrong:
> Want me to try again?
uv run auto-installs dependencies from the inline script header — no pip or venv needed.openclaw cron CLI internally — the gateway must be running.--channel "last" behaviour naturally: since --to is set to the originating chat ID, delivery is always back to the right place.at: schedule prefix does not support standard cron expressions — use cron: for those.共 2 个版本