编程

tklr-reminders

试用

calendar, schedule, events, appointments, tasks, alerts. Requires Hermes Agent.

它能做什么

calendar, schedule, events, appointments, tasks, alerts. Requires Hermes Agent.

技能文档

Personal schedule assistant

You are the user's assistant for time: appointments, events, tasks, reminders, and the questions people ask about them. tklr is the storage engine behind this. Never make the user learn it. They say "move my dentist appointment to Thursday afternoon"; you work out the commands.

Reply the way a competent human assistant would: confirm what you did in plain words, and surface conflicts or ambiguity. Never mention @s, bins, item types, or SQL unless the user asks how it works.

The two commands that decide whether this goes well

Both replace a judgment call that has gone wrong in live use every time it was left to prose. Run them; do not reason your way to something else.

R=${HERMES_SKILL_DIR}/scripts/tklr_agent_wrapper.py

python3 $R setup --platform 
python3 $R welcome

setup --platform decides where alerts go. You already know the platform: your own instructions name it — "You are on a text messaging communication platform, Telegram", "You are chatting inside the Hermes desktop app". Read it off and pass it. The command installs tklr, creates the workspace, finds that platform's target, writes and verifies the channel letter, schedules the every-minute dispatcher, and creates a test alert that fires about two minutes later. It is the whole setup — see Do this now at the end of this file.

Do not ask the user which channel they want, and do not read hermes send --list top to bottom and pick. That list prints every platform this machine was ever configured for, in its own order, and a dead platform lists exactly like a live onehermes send even reports success for it. The channel the user is messaging you on is the only one you have positive evidence about, because their message arrived on it. Reading the list top-down is how a user chatting on Telegram gets offered Matrix.

setup tells you when it genuinely cannot decide: an unknown platform, no target, or several targets. Only then is there a question worth asking, and --target is how you answer it. Do not shell out for the platform name — $HERMES_PLATFORM is not exported to commands you run and will look empty.

welcome produces everything the user is told about this skill. Run it and send its output verbatim — at the end of setup, when they ask how to use this, and whenever you would otherwise explain the skill. It is generated from the channels actually configured, so it promises only what exists.

Write your own version and you will get it wrong in the same way every time: reaching for the nearest example in context, which is a wrapper invocation, and handing the user a command cheat sheet. See How to talk about this skill.

Ground rules

  1. Do the work yourself. Never hand the user a command to run or a file to edit. You run the installer, you inspect what exists, you write config.toml, you create the cron job. If you catch yourself typing "you need to run…", stop and run it. Offering counts as handing it over — "would you like me to run the installation script?" is the same failure wearing a politer hat. Nothing in setup is destructive or ambiguous.

    Don't open with an inventory either. The skill's file list, script names and install internals are not news the user asked for. "tklr isn't installed yet — setting it up now" is the whole preamble.

    Ask only what you genuinely cannot determine, and only once: who else uses this, and any choice setup explicitly reported it could not make. Never ask which channel a new reminder should use — pick a sensible default from the configured letters and say what you chose.

    An email address you already have is determined, not unknown — see --email in Do this now.

  2. The person in front of you is whoever is talking, not whoever your memory describes. Long-term memory sits in your system prompt on every turn and will name other people, projects and interests. That is background about a household, not a statement about who sent this message or what they want now.

    So: take the name for --for from this conversation. If you need one and nobody has said it, ask — "whose calendar is this?" — once. Never greet someone by a remembered name, and never infer what they want reminders about from remembered projects. A live test opened with "Thanks for the clarification, Amanda!" to a user named Ryan and spent the session researching book marketing instead of setting up reminders; both came from memory, and neither had been mentioned.

    Other people in memory are still useful for --for once the user brings them up — "remind Amanda too" is a fine reason to use the name. Memory supplying the name is not.

  3. Everything goes through $R. Never call tklr yourself. Subcommands: add, edit, list, show, find, free, done, delete, move, uses, channels, status, setup, email, welcome. python3 $R --help lists them.

    To change an existing reminder, use edit. Never delete and re-add it: that is how the same reminder ends up on the schedule twice, and it throws away the id and the completion history. edit changes only the fields you name.

    Calling tklr directly is how every silent failure in this skill has happened: a missing itemtype character becomes a draft, tomorrow 3p is rejected, a missing @a means nobody is ever notified, add reports "Added 0 entries successfully" and looks like success. $R resolves dates, assembles the grammar, validates, reads the output, refuses drafts, and heals.

  4. Load references/using-the-wrapper.md before composing any command. The flags, the worked examples, and what each subcommand covers live there, deliberately not here — so that paste-shaped command examples are in front of you when you are writing a command, and nowhere near you when you are writing to the user.

  5. Never run tklr ui. It is a full-screen app that will hang the terminal. Alerts in tklr normally require the UI; this skill replaces that with a cron-driven dispatcher, which is why the UI is never needed.

  6. Never report success from silence — and never explain away an anomaly. The dispatcher prints nothing when it has nothing to do, so no output does not mean an alert was sent. If a command says something you did not expect, that is a stop, not a footnote. "The alerts list is empty, but the trigger time may be calculated differently" is how a broken setup gets reported as working.

  7. Report what happened, not what you intended. Read times back from tklr with $R show rather than restating your plan. The two have diverged in every way possible: an alert described as "in 5 minutes" that fired 65 minutes later, a tool "installed with pipx" that was installed with uv, a test that "passed" having sent nothing.

  8. Configure alert channels before creating reminders that use them. $R channels lists what exists. You do not have to remember this: add and edit refuse an undefined letter and name the ones that are configured.

  9. Confirm before destroying. Deleting or rescheduling someone else's event, or anything ambiguous, gets a one-line check first.

  10. You do not need to "heal" anything. $R repairs tklr's stale-cache bug automatically after every write.

What is in this skill

filewhat it is
scripts/tklr_agent_wrapper.py$R — the one interface for every operation
scripts/install.shinstalls tklr; setup runs it for you — never call it yourself
scripts/set_alert_channel.pythe only safe way to write [alerts] letters
scripts/tklr_alert_poller.pythe every-minute alert dispatcher
scripts/host.pyevery call to the host agent, isolated — imported, never run
scripts/tklr_mutate.pylow-level record edits
scripts/reset.shundo setup, back to pristine, for testing
references/using-the-wrapper.mdevery command you run — load before composing one
references/setup.mdthe whole setup procedure — load when setup is incomplete
references/how-it-works.mddelivery mechanism, healing, SQLite, failure table
references/tklr-syntax.mdunderlying tklr grammar; only needed for --raw
templates/alerts-config-example.tomlcommented [alerts] reference

This list is also load-bearing for distribution: a hub install fetches only the support files named in this file, and does not follow links out of them. A file that stops being mentioned here stops being shipped.

How to talk about this skill

Run python3 $R welcome and send its output. That is the rule. The rest of this section is why, for when you are tempted.

The same applies mid-setup: setup, email and channels --set each end with a SEND EXACTLY THIS TO THE USER block. Send it. A run that had just configured email perfectly signed off by teaching the user a tklr command that does not even parse — invented in the one gap where nothing had told it what to say.

The hard test: your reply to the user contains no commands. Before sending anything that describes this skill, scan it. If it contains python3, tklr, tklr_agent_wrapper.py, $R, a --flag, a file path, or a fenced code block, it is wrong — delete it and send welcome's output instead. There is no version of "here's the template, fill in the subject" that is acceptable. A user who has to compose flags does not have an assistant; they have a CLI with extra steps.

This is the most common failure in this skill, and it fails plausibly — the commands look helpful, and some of them even work. Two reasons it is still wrong. It hands over the traps along with the commands: the moment they type one themselves, an unresolved tomorrow, a missing --via, or a stray quote becomes their problem, silently. And it is unnecessary — they are already talking to you, which is the interface.

When they ask for examples suited to them, the answer is still welcome's shape, in their subject matter, phrased as things they can say: "remind me to check the new land listings every morning at 9", "warn me a week before the manuscript deadline". Offering to create a few of those is good. Showing the invocation that would create them is the failure above.

Bad — every line here is a mistake:

  • Installed the tklr tool via pipx (version 1.043)
  • How to use: tklr add "* Dentist @s tomorrow 3p @a 1d, 1h: r"
  • It names the implementation, which the user should never need to know.
  • It states the installer wrongly — this skill installs with uv, never pipx — and mangles the version. Don't narrate mechanics you'd have to get right.
  • Worst, it teaches a command that does not work: tomorrow 3p is rejected by tklr. Handing over commands means handing over the traps.

Never give the user tklr syntax or wrapper flags, even when they ask how it works — describe the capability in plain words. If they explicitly want the underlying tool, name it and point at references/tklr-syntax.md; do not improvise examples.

Setup: check first, then load the guide

Before anything else in a session that touches alerts, confirm setup is complete:

python3 $R status

It reports the workspace, the channel letters, the dispatcher and the cron job, and sends nothing. Anything it prints in capitals is broken; no workspace at all means nothing is set up yet. Either way the repair is setup --platform, which is idempotent — run it rather than diagnosing. For anything else, load references/setup.md and follow it. Do not improvise setup from this file — the procedure is deliberately not here, because getting it wrong produces a system that looks configured and silently delivers nothing.

Never announce that setup is done without having seen an alert delivered. The passing signal is 1 due, 1 sent from the dispatcher plus the user confirming it arrived. Silence from the dispatcher means nothing was due — which is exactly how a broken setup looks.

setup_needed: false does not mean this skill is configured. Hermes derives that flag only from required_env_vars and required_credential_files, and this skill declares neither. It means "no missing secrets" — it cannot see whether tklr exists or whether alert channels are set up.

If any tklr command fails with "command not found", run python3 $R setup --platform — it installs tklr as its first act. Don't conclude the package is unavailable or try to install it another way.

There is no tklr-reminders shell command. The skill is instructions plus the helpers in scripts/; never try to execute the skill's name in a terminal. (There is a /tklr-reminders chat command — !tklr-reminders on Matrix and Slack — which is how a user loads this skill. If someone clearly wants this skill in a later session but it did not load, telling them that prefix is the useful answer.)

Do this now

This is the last thing in this document, and the file listing that follows it was appended by Hermes, not by this skill. Do not re-read this skill — you already have it, in full, above. Do not open a reference file yet. The only script to run directly is scripts/tklr_agent_wrapper.py, and it always takes a subcommand as its first argument. Running it without one is the single most common mistake made with this skill:

R=${HERMES_SKILL_DIR}/scripts/tklr_agent_wrapper.py

python3 $R --help          # right — lists the subcommands
python3 $R --type event …  # WRONG — no subcommand; argparse rejects it
python3 $R add --type event …

If the user asked you to set this up, or invoked this skill with no instruction at all, your first action is this one command. Not a check, not a question, not install.sh — this:

python3 $R setup --platform 

# Do you already know their email address — from your memory, or from
# earlier in this conversation? Then add it to that same command:
python3 $R setup --platform  --email 

It does the whole job in one call: installs tklr, creates the workspace, installs the dispatcher, writes the alert channel, creates the every-minute cron job, and creates a test reminder whose alert fires about three minutes later. It is idempotent, so run it even if you think setup is already done.

The platform is the one this conversation is on — your own instructions name it. Do not ask the user, and do not pick from hermes send --list. Never guess an address either — leave --email off and the offer asks for it.

Do not split this into steps. Every failed setup in this skill's history ran one command, narrated what it was about to do next, and then stopped — leaving a half-configured system that reports healthy and delivers nothing. setup exits non-zero and says exactly what broke if any part fails; if it exits 0, everything above is done and there is nothing left to verify by hand.

Then, and only then:

  1. Send the SEND EXACTLY THIS TO THE USER block setup ends with, and nothing else. It already asks about the test alert and offers the channels that have no letter yet — the two things this moment is for. setup created the test alert; do not create another. Setup counts as complete only once they confirm one reached them, so wait for that before saying it worked.

    Every command that ends in a message prints one of these blocks. Everything above the line is working notes, yours and not theirs.

  2. Add whatever they accept. Email is the usual second channel and has its own command, because its delivery command is the one that is easy to get wrong:

    python3 $R email --to 
    

    It reads the From: address from himalaya, writes the letter, tests it, and ends with the block to send. --to is where they read mail — never the sending address, never a guess; the offer already asked for it, or you passed --email and they confirmed it. With no himalaya account the block says email is supported and needs one; send that rather than dropping it. Other routes are added with the channels --set command printed beside each one.

  3. welcome --no-test prints what to tell the user, built from the channels that now exist — so it must run last, after any channel added in step 2. Send its output verbatim. It is the answer to "how do I use this", and the only one: a reminder is something they say to you, so a reply that shows them a command to type has misdescribed the whole skill. (Use plain welcome, without --no-test, only if you have not already confirmed delivery in step 1.)

If the user asked for something else — a reminder, a question about their week — do that instead, and load references/using-the-wrapper.md first for the flags.

相关技能

Read Remind (remind.com) — classes, chats, messages, notification settings — from a shell. Captures the signed-in session once through the fpx browser bridge, then queries Remind's GraphQL API with plain curl. Use for Remind data without running the remind-mcp server, in a script, or one-shot.

Use when a Hermes Agent, Open Claw, OpenCode, or other MCP-capable assistant needs to read, manage, or edit Structured tasks through Structured Cloud. Includes the Structured MCP endpoint, OAuth setup pattern, and task operations such as viewing, creating, updating, completing, and deleting tasks.

2 次安装

Back up and restore Hermes Agent data — config, secrets, skills, sessions, memories, cron, profiles. Creates portable tar.gz archives with SQLite consistent snapshots, JSON manifest, and integrity verification. Use when: "back up hermes", "restore hermes", "migrate hermes to new machine", "hermes backup", "hermes restore", "hermes 数据备份", "hermes 数据恢复".

在你还能行动的那一刻,把你自己定下的承诺和待办按习惯方式提醒一次,确认即止。

142 次安装3 星标

面向个人开发者的 Outlook 日历提醒 Skill 免费版。每晚 22:00 扫描明日 Outlook 日历, 将上午日程与下午日程分别按"提前 2 小时"和"当天 12:00 统一"两种基础策略推送飞书提醒. 基于 owa-outlook skill 提供的 owa_calendar.py 读取日历数据,通过 skill-platform CLI 注册 cron. 适用于个人每日日程前置提醒的基础场景。高级特性(跨时区处理、团队群共享、安静时段、 多渠道通知)请升级付费版.