feat(reminder)!: one command per reminder, marked as done into a file command; append to a file command #275

Merged
kfickel merged 6 commits from 274_reminders-done-and-file-append into main 2026-10-16 18:33:55 +02:00
Collaborator

Closes #274.

What changes

streamd <file-command> append TEXT... (R31): adds # <TEXT> at the end of the file the command has for now (a section match gets the line at the end of its file), with the moment markers that make the line a shard of now: @HHMMSS on a file of today, @YYYYMMDD @HHMMSS on one of another day. The markers go after the tags the text starts with. Without a file for now, one is created that holds only the line, not the template. It prints Appended to <path> / Created <path>.

One command per reminder (breaking) (R29): [[commands.<key>.rules]] is gone. A reminder is its own [commands.<key>] with description (what it says; its key without one), expect, trigger, start and the new optional into_file. An old rules is rejected at its line, with how to rewrite it. Outline, change, index, completion, schema, rename (into_file follows a renamed file command), init.toml (three commented reminder examples), LSP and FFI records are adapted.

streamd <reminder> done: writes the tag the reminder expects (# @CalledXYZ @143000) into the file of its into_file command through append. The tag is the one that places the first expect table on its own, together with what the file type hands down; a tag named like the value comes first, then the rest by name, and never an alias. Validation rejects an into_file that is not a file command, into_file with an if trigger, and a reminder no tag can write. A reminder without into_file, or with an if trigger, fails at run time with a reason (CoreError::NoIntoFile / DoneNotSupported, also in StreamdException).

Terminal front-end: reminder commands no longer get a tab each. There is one built-in view remind, next to config, listing the due reminders of all of them. d marks the selected one as done, and streamd <reminder> -i opens the view on that reminder.

Facade / bindings: append_to_file, reminder_done, can_mark_done; DueReminder carries key (and no longer rule).

App: a reminder's text is shown once. Done sits at the bottom right of every reminder that can be marked as done, on the Stream tab and under Reminders in All (shared ReminderBanner). A failed Done shows its reason inside the banner; the plan asked for a snackbar, but these screens have no snackbar host. A successful one is committed like a save. The reminder form edits expect, trigger, start and Done into directly.

Checks

  • cargo test (core, CLI, FFI), clippy and fmt through the hooks, nix flake check: all pass.
  • App: testDebugUnitTest and validateDebugScreenshotTest pass. The re-recorded references (Stream reminders, All commands, Commands tab of the configuration, reminder form) were looked at.
  • Not tried on a device or the emulator.
Closes #274. ## What changes **`streamd <file-command> append TEXT...`** (R31): adds `# <TEXT>` at the end of the file the command has for now (a section match gets the line at the end of its file), with the moment markers that make the line a shard of now: `@HHMMSS` on a file of today, `@YYYYMMDD @HHMMSS` on one of another day. The markers go after the tags the text starts with. Without a file for now, one is created that holds only the line, not the template. It prints `Appended to <path>` / `Created <path>`. **One command per reminder (breaking)** (R29): `[[commands.<key>.rules]]` is gone. A reminder is its own `[commands.<key>]` with `description` (what it says; its key without one), `expect`, `trigger`, `start` and the new optional `into_file`. An old `rules` is rejected at its line, with how to rewrite it. Outline, change, index, completion, schema, rename (`into_file` follows a renamed file command), `init.toml` (three commented reminder examples), LSP and FFI records are adapted. **`streamd <reminder> done`**: writes the tag the reminder expects (`# @CalledXYZ @143000`) into the file of its `into_file` command through `append`. The tag is the one that places the first `expect` table on its own, together with what the file type hands down; a tag named like the value comes first, then the rest by name, and never an alias. Validation rejects an `into_file` that is not a file command, `into_file` with an `if` trigger, and a reminder no tag can write. A reminder without `into_file`, or with an `if` trigger, fails at run time with a reason (`CoreError::NoIntoFile` / `DoneNotSupported`, also in `StreamdException`). **Terminal front-end**: reminder commands no longer get a tab each. There is one built-in view `remind`, next to `config`, listing the due reminders of all of them. `d` marks the selected one as done, and `streamd <reminder> -i` opens the view on that reminder. **Facade / bindings**: `append_to_file`, `reminder_done`, `can_mark_done`; `DueReminder` carries `key` (and no longer `rule`). **App**: a reminder's text is shown once. **Done** sits at the bottom right of every reminder that can be marked as done, on the Stream tab and under Reminders in All (shared `ReminderBanner`). A failed Done shows its reason inside the banner; the plan asked for a snackbar, but these screens have no snackbar host. A successful one is committed like a save. The reminder form edits `expect`, trigger, `start` and **Done into** directly. ## Checks - `cargo test` (core, CLI, FFI), clippy and fmt through the hooks, `nix flake check`: all pass. - App: `testDebugUnitTest` and `validateDebugScreenshotTest` pass. The re-recorded references (Stream reminders, All commands, Commands tab of the configuration, reminder form) were looked at. - Not tried on a device or the emulator.
A reminder is its own `[commands.<key>]` with `type = "reminder"`: the fields
of a rule (`expect`, `trigger`, `start`) move up into the command, its
`description` is what it says, and the new `into_file` names the file command
`done` writes into. The terminal shows the due reminders of every command in
one built-in view, `remind`, next to `config`.

BREAKING CHANGE: `[[commands.<key>.rules]]` of a reminder command is rejected;
write one `[commands.<key>]` with `type = "reminder"` per rule.
docs: one command per reminder, done into a file command, and append
All checks were successful
Continuous Integration / Build Package (push) Successful in 18m54s
Continuous Integration / Conventional Commits (push) Successful in 16s
Continuous Integration / Lint, Check & Test (push) Successful in 5m35s
81931dea4f
kfickel deleted branch 274_reminders-done-and-file-append 2026-10-16 18:33:56 +02:00
Sign in to join this conversation.
No reviewers
No labels
android
cli
epic
planned
tui
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
kfickel/streamd!275
No description provided.