Repository navigation
feat(calendar): events remind, a reminder before each meeting for a timer to run - #2367
Merged
Merged
Conversation
leemour
force-pushed
the
feat/calendar-remind
branch
from
November 2, 2026 00:39
7646a35 to
24f8b5d
Compare
…imer to run `events remind` closes the last gap against gcalcli's `remind`. Cron or a timer runs it every few minutes. It syncs first unless --offline, then takes the events that start within --due-within (10m by default) and take the owner's time. It prints each one, or after `--` runs the owner's program once per event. - The program starts with no shell. The event goes as JSON on its stdin, and only ids reach its environment (<PREFIX>_EVENT, <PREFIX>_PROFILE). An invitation's text is a stranger's, so it never reaches a command line. A program still running after 60 s is stopped. - events.remind.hook defaults to deny, not ask: --yes answers ask, and anything that can type a command can add it. The read-only lock refuses the program at any level. The command is never an MCP tool. - What was reminded is kept per profile in a 0600 checkpoint file, one key per event and start, so a moved meeting is reminded again. A failed program leaves its event for the next run. A lock keeps two runs from reminding the same event twice. - A failed sync is reported in meta.issues, and the run still reminds from the store. - cli-base 0.73.0 adds the verb `remind`. The peer range is now >=0.73.0 <0.74.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
leemour
force-pushed
the
feat/calendar-remind
branch
from
November 2, 2026 00:46
24f8b5d to
080ff47
Compare
leemour
added a commit
to WireCatLabs/gcal-cli
that referenced
this pull request
Nov 2, 2026
….0 (#85) ## Task Close the last gap against gcalcli `remind`: remind the owner before a meeting. This is research IDEA-15, a Telegram message to the owner before a meeting. ## Why gcalcli users run `gcalcli remind` from cron. gcal had no equivalent. The command lives in cli-core (WireCatLabs/cli-core#2367, released in 0.543.0). This PR mounts it, bumps the dependencies and documents it. ## What - Bumps `@wirecat/cli-core` 0.540.0 → 0.543.0 and `@wirecat/cli-base` 0.72.0 → 0.73.0. cli-base 0.73.0 adds the verb `remind`. - `gcal <profile> events remind [--due-within 10m] [--dry-run] [-- <program> [args…]]`: - It syncs first, unless `--offline`. - It tells once about each event that starts soon and takes the owner's time. - It prints the event, or runs the owner's program once per event. The program gets the event as JSON on stdin and `GCAL_EVENT` / `GCAL_PROFILE` in its environment. - **Security** - No shell runs the program, and the invitation's text never reaches its command line. - `permissions.events.remind.hook` is `deny` until the owner allows it. `--yes` does not lift it. - `GCAL_READ_ONLY` refuses the program form. - No MCP tool offers the command. - **Docs** - `docs/usage.md`, a new section "Get reminded before a meeting": the hook contract, a notify-send hook, a Telegram hook, and cron / systemd user timer / launchd / Task Scheduler setups. - `docs/security.md`, roadmap, skill, CHANGELOG Unreleased. - The generated `docs/commands.md` and `docs/dev/test-matrix.md`. ## Testing - New test in `src/calendar.test.ts` over the fake Google API, with only `Date` faked. It covers: - the dry run; - each event told once; - the hook denied by default; - after `config set … allow`, the hook gets JSON on stdin and `GCAL_EVENT`. - These pass locally: `pnpm lint`, `typecheck`, `test`, `docs:check`, `generate:check`, `contracts:check`, `lint:commands`, `test:matrix` (0 missing). Some suites timed out once under machine load (load average about 30) and passed when run again alone. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Task
Close the last gcal gap against gcalcli
remind. Research IDEA-15 asks for a message to the owner before a meeting, with the meeting brief.Why
cron or a systemd timer can run one short command every few minutes. Running that command needs no long-lived process and no new background framework. The command is
events remind. It is in cli-core so that every calendar CLI gets it.What
events remind [--due-within 10m] [--dry-run] [-- <program> [args…]].--offline.shell: false.<PREFIX>_EVENT=event:<id>and<PREFIX>_PROFILEare added to its environment.events.remind.hookis inCALENDAR_WRITE_KEYSandCALENDAR_WRITE_DEFAULTSasdeny, because--yesanswersask.mcp: false.checkpoints/<profile>/events-remind.json, keyed by event id and start, so a moved meeting is reminded again. It keeps one day of history.takeLock) keeps overlapping runs from reminding twice.remind.hook-failed).meta.issues(sync.failed/sync.partial), and the run reminds from the store.ownsTime()is taken out of the next-meeting rule inprepare.tsand shared withisMeeting.remind(feat(vocabulary): the verb remind cli-base#443). The peer range is now>=0.73.0 <0.74.0.Testing
src/calendar/cli/remind.test.tsuse the fake source, the memory store and a fake clock. They cover:--offlineand--dry-run;$(touch pwned)title that does not run;pnpm lint,typecheck, the fulltestanddocs:checkpass locally.🤖 Generated with Claude Code