rook-cli 0.2.0__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rook_cli-0.2.0 → rook_cli-0.2.2}/DEVELOPMENT_GUIDE.md +164 -25
- {rook_cli-0.2.0 → rook_cli-0.2.2}/PKG-INFO +7 -12
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/README.md +98 -103
- rook_cli-0.2.2/src/rook/__init__.py +1 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/src/rook/__main__.py +22 -3
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/app.py +12 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/src/rook/persistence/archive.py +4 -4
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/services/rollover.py +17 -2
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/symbols.py +3 -4
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/src/rook/widgets/archive_screen.py +9 -1
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/widgets/task_row.py +2 -3
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/tests/test_app.py +1 -1
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_rollover.py +3 -1
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_rollover_app.py +1 -1
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_symbols.py +1 -1
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/.claude/settings.local.json +0 -66
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/LICENSE +0 -10
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/__init__.py +0 -1
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/app.py +0 -222
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/branding.py +0 -69
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/domain/tasks.py +0 -55
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/formatting.py +0 -10
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/paths.py +0 -31
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/persistence/database.py +0 -18
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/persistence/migrations.py +0 -111
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/persistence/tasks.py +0 -185
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/services/rollover.py +0 -94
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/services/tasks.py +0 -85
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/services/undo.py +0 -72
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/symbols.py +0 -40
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/widgets/task_line_input.py +0 -44
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/widgets/task_row.py +0 -155
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_formatting.py +0 -11
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_migrations.py +0 -52
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_paths.py +0 -20
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_persistence_failure.py +0 -47
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_rollover.py +0 -257
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_rollover_app.py +0 -104
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_selection.py +0 -40
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_shortcut_footer_selection.py +0 -26
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_smoke.py +0 -5
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_symbols.py +0 -30
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_task_creation_and_editing.py +0 -430
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_task_repository.py +0 -153
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_task_row_rendering.py +0 -57
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_task_service.py +0 -37
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_task_states.py +0 -261
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_undo.py +0 -245
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_undo_manager.py +0 -34
- rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/tests/test_widget_markup_safety.py +0 -47
- rook_cli-0.2.0/.gitignore +0 -20
- rook_cli-0.2.0/README.md +0 -103
- rook_cli-0.2.0/pyproject.toml +0 -51
- rook_cli-0.2.0/src/rook/__init__.py +0 -1
- rook_cli-0.2.0/src/rook/__main__.py +0 -48
- rook_cli-0.2.0/src/rook/domain/__init__.py +0 -0
- rook_cli-0.2.0/src/rook/persistence/__init__.py +0 -0
- rook_cli-0.2.0/src/rook/persistence/archive.py +0 -72
- rook_cli-0.2.0/src/rook/persistence/metadata.py +0 -56
- rook_cli-0.2.0/src/rook/services/__init__.py +0 -0
- rook_cli-0.2.0/src/rook/widgets/__init__.py +0 -0
- rook_cli-0.2.0/src/rook/widgets/archive_screen.py +0 -162
- rook_cli-0.2.0/src/rook/widgets/shortcut_footer.py +0 -79
- rook_cli-0.2.0/src/rook/widgets/task_list.py +0 -415
- rook_cli-0.2.0/tests/support.py +0 -75
- rook_cli-0.2.0/tests/test_app.py +0 -369
- rook_cli-0.2.0/tests/test_archive_navigation.py +0 -188
- rook_cli-0.2.0/tests/test_archive_queries.py +0 -152
- {rook_cli-0.2.0 → rook_cli-0.2.2}/.claude/settings.local.json +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/.gitignore +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/LICENSE +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/pyproject.toml +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/branding.py +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/src/rook/domain/__init__.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/domain/tasks.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/formatting.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/paths.py +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/src/rook/persistence/__init__.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/persistence/database.py +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/src/rook/persistence/metadata.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/persistence/migrations.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/persistence/tasks.py +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/src/rook/services/__init__.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/services/tasks.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/services/undo.py +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/src/rook/widgets/__init__.py +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/src/rook/widgets/shortcut_footer.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/src/rook/widgets/task_line_input.py +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/src/rook/widgets/task_list.py +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/tests/support.py +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/tests/test_archive_navigation.py +0 -0
- {rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama → rook_cli-0.2.2}/tests/test_archive_queries.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_formatting.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_migrations.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_paths.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_persistence_failure.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_selection.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_shortcut_footer_selection.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_smoke.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_task_creation_and_editing.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_task_repository.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_task_row_rendering.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_task_service.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_task_states.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_undo.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_undo_manager.py +0 -0
- {rook_cli-0.2.0 → rook_cli-0.2.2}/tests/test_widget_markup_safety.py +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Rook Product & Engineering RFC
|
|
1
|
+
# Rook Product & Engineering RFC
|
|
2
2
|
## A Local, Keyboard-First Terminal Daily Journal
|
|
3
3
|
|
|
4
4
|
> **Accepted brand:** The application is named **Rook**, uses `rook` as its command and Python package slug, and uses `♜` as its default icon. Branding resources remain isolated from domain logic so visual identity can evolve without changing task behavior, persistence, or schema terminology.
|
|
@@ -18,11 +18,11 @@
|
|
|
18
18
|
| Console command | `rook` |
|
|
19
19
|
| Python package slug | `rook` |
|
|
20
20
|
| Status | Draft for implementation |
|
|
21
|
-
| Version | 0.
|
|
21
|
+
| Version | 0.2 |
|
|
22
22
|
| Owner | Project creator and maintainer |
|
|
23
23
|
| Primary implementation environment | Windows with PowerShell and a modern terminal emulator |
|
|
24
24
|
| Intended audience | Project maintainer, contributors, and Claude Code |
|
|
25
|
-
| Implementation status |
|
|
25
|
+
| Implementation status | Partially implemented — v0.2.0 published to PyPI as `rook-cli` |
|
|
26
26
|
| Last updated | July 2026 |
|
|
27
27
|
|
|
28
28
|
This document is the authoritative product and engineering specification for version 1 of `Rook`.
|
|
@@ -2907,7 +2907,7 @@ The application MUST NOT rely on function keys or terminal-specific scan codes f
|
|
|
2907
2907
|
The standard wide footer is:
|
|
2908
2908
|
|
|
2909
2909
|
```text
|
|
2910
|
-
[n] new [e] edit [x] complete [>] migrate [d] delete [u] undo [
|
|
2910
|
+
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
2911
2911
|
```
|
|
2912
2912
|
|
|
2913
2913
|
The footer MUST remain one physical row.
|
|
@@ -2917,17 +2917,23 @@ When the terminal is too narrow, the footer must progressively shorten rather th
|
|
|
2917
2917
|
Medium-width form:
|
|
2918
2918
|
|
|
2919
2919
|
```text
|
|
2920
|
-
n new e edit x done > migrate d delete u undo
|
|
2920
|
+
n new e/Ent edit x done > migrate d delete u undo a archive q quit
|
|
2921
2921
|
```
|
|
2922
2922
|
|
|
2923
2923
|
Compact form:
|
|
2924
2924
|
|
|
2925
2925
|
```text
|
|
2926
|
-
n e x > d u
|
|
2926
|
+
n e x > d u a q
|
|
2927
2927
|
```
|
|
2928
2928
|
|
|
2929
2929
|
A separate Help overlay is not implemented. The footer text is self-explanatory.
|
|
2930
2930
|
|
|
2931
|
+
Editing footer:
|
|
2932
|
+
|
|
2933
|
+
```text
|
|
2934
|
+
[Ent] save [Esc] cancel
|
|
2935
|
+
```
|
|
2936
|
+
|
|
2931
2937
|
---
|
|
2932
2938
|
|
|
2933
2939
|
# 10. Screen and Component Specifications
|
|
@@ -2970,7 +2976,7 @@ rook ♖ Today — Friday, July 24, 2026
|
|
|
2970
2976
|
× Submit the expense report
|
|
2971
2977
|
• B̶u̶y̶ ̶a̶n̶o̶t̶h̶e̶r̶ ̶m̶o̶n̶i̶t̶o̶r̶
|
|
2972
2978
|
|
|
2973
|
-
[n] new [e] edit [x] complete [>] migrate [d] delete [u] undo [
|
|
2979
|
+
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
2974
2980
|
```
|
|
2975
2981
|
|
|
2976
2982
|
Required vertical structure:
|
|
@@ -3146,11 +3152,13 @@ The editor MUST NOT open a separate dialog.
|
|
|
3146
3152
|
During editing, the shortcut footer SHOULD change to:
|
|
3147
3153
|
|
|
3148
3154
|
```text
|
|
3149
|
-
[
|
|
3155
|
+
[Ent] save [Esc] cancel
|
|
3150
3156
|
```
|
|
3151
3157
|
|
|
3152
3158
|
This prevents the interface from implying that normal state shortcuts remain active while typing.
|
|
3153
3159
|
|
|
3160
|
+
After creating a new task, the list scrolls to keep the editing row visible without animation. This is implemented by calling `row.scroll_visible(animate=False)` after `recompose()` in both `begin_create` (when creation starts) and `_save_new_task` (after the task is saved and the list recomposes).
|
|
3161
|
+
|
|
3154
3162
|
## 10.8 One-Row Shortcut Footer
|
|
3155
3163
|
|
|
3156
3164
|
The footer is anchored at the bottom of the application viewport.
|
|
@@ -3167,13 +3175,13 @@ It MUST:
|
|
|
3167
3175
|
Wide Today footer:
|
|
3168
3176
|
|
|
3169
3177
|
```text
|
|
3170
|
-
[n] new [e] edit [x] complete [>] migrate [d] delete [u] undo [
|
|
3178
|
+
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
3171
3179
|
```
|
|
3172
3180
|
|
|
3173
3181
|
Compact Today footer:
|
|
3174
3182
|
|
|
3175
3183
|
```text
|
|
3176
|
-
n e x > d u
|
|
3184
|
+
n e x > d u a q
|
|
3177
3185
|
```
|
|
3178
3186
|
|
|
3179
3187
|
The footer is instructional, not interactive. Mouse clicking is not required.
|
|
@@ -3462,7 +3470,7 @@ rook ♖ Today — Friday, July 24, 2026
|
|
|
3462
3470
|
× Submit the expense report
|
|
3463
3471
|
• B̶u̶y̶ ̶a̶n̶o̶t̶h̶e̶r̶ ̶m̶o̶n̶i̶t̶o̶r̶
|
|
3464
3472
|
|
|
3465
|
-
[n] new [e] edit [x] complete [>] migrate [d] delete [u] undo [
|
|
3473
|
+
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
3466
3474
|
```
|
|
3467
3475
|
|
|
3468
3476
|
### Today: creating a Task
|
|
@@ -3475,7 +3483,7 @@ rook ♖ Today — Friday, July 24, 2026
|
|
|
3475
3483
|
× Submit the expense report
|
|
3476
3484
|
❯ • Draft blog outline▋
|
|
3477
3485
|
|
|
3478
|
-
[
|
|
3486
|
+
[Ent] save [Esc] cancel
|
|
3479
3487
|
```
|
|
3480
3488
|
|
|
3481
3489
|
### Archive index
|
|
@@ -3813,7 +3821,7 @@ The application chooses among three predefined levels based on available width:
|
|
|
3813
3821
|
### Full
|
|
3814
3822
|
|
|
3815
3823
|
```text
|
|
3816
|
-
[n] new [e] edit [x] complete [>] migrate [d] delete [u] undo [
|
|
3824
|
+
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
3817
3825
|
```
|
|
3818
3826
|
|
|
3819
3827
|
### Condensed
|
|
@@ -3825,7 +3833,7 @@ n new e edit x done > migrate d delete u undo r routine a archive ? help
|
|
|
3825
3833
|
### Keys only
|
|
3826
3834
|
|
|
3827
3835
|
```text
|
|
3828
|
-
n e x > d u
|
|
3836
|
+
n e x > d u a q
|
|
3829
3837
|
```
|
|
3830
3838
|
|
|
3831
3839
|
The footer MUST NOT wrap into a second row.
|
|
@@ -3911,6 +3919,25 @@ The visual design is acceptable for version 1 when:
|
|
|
3911
3919
|
- the mascot and quote do not displace core controls; and
|
|
3912
3920
|
- the application appears intentional in the primary customized PowerShell environment.
|
|
3913
3921
|
|
|
3922
|
+
## 11.19 Open Task Visual Treatment — Decision Record
|
|
3923
|
+
|
|
3924
|
+
**Decision:** Open tasks render in bold. Tasks in any other state (completed, migrated, deleted) render in normal weight. No color differentiation is applied to task state.
|
|
3925
|
+
|
|
3926
|
+
**Iterations tried and rejected:**
|
|
3927
|
+
|
|
3928
|
+
1. **Dim (SGR 2) for resolved tasks** — attempted first. On the primary terminal (Windows Terminal with a custom color scheme), `dim` rendered as dark gray/black rather than a dimmer version of the foreground color. SGR 2 does not respect custom terminal palettes and breaks on light-background setups. Rejected.
|
|
3929
|
+
2. **CSS opacity on a `-resolved` class** — attempted second. Textual CSS `opacity` works by blending RGB values. The `ansi-dark` theme uses ANSI pass-through colors (terminal-controlled), so Textual has no actual RGB value to blend against. Opacity had no visible effect. Rejected.
|
|
3930
|
+
3. **Italic for resolved tasks** — attempted third. User disliked the visual result. Rejected.
|
|
3931
|
+
4. **Semi-bold** — user requested after seeing full bold. Impossible: ANSI terminals have only on/off bold (SGR 1); there is no SGR code for semi-bold. Terminal emulators that render bold as a slightly heavier weight are not controllable from the application side. Rejected (impossible).
|
|
3932
|
+
|
|
3933
|
+
**Why bold for OPEN works:**
|
|
3934
|
+
|
|
3935
|
+
- Bold (SGR 1) is universally supported across terminal emulators and respects any foreground color.
|
|
3936
|
+
- Visually: open tasks draw the eye; resolved tasks recede naturally — which matches the intended reading pattern.
|
|
3937
|
+
- No color required, fully compatible with the ANSI pass-through approach.
|
|
3938
|
+
|
|
3939
|
+
**Implementation:** `row.stylize("bold", len(prefix))` in `render_task_row_text` in `task_row.py`. Only OPEN tasks get bold; all other states render at normal weight. Strikethrough still applied to DELETED tasks.
|
|
3940
|
+
|
|
3914
3941
|
---
|
|
3915
3942
|
|
|
3916
3943
|
# 12. Archive Specification
|
|
@@ -4545,6 +4572,8 @@ The mascot must not:
|
|
|
4545
4572
|
|
|
4546
4573
|
Version 1 supports a small finite set of visual mood categories.
|
|
4547
4574
|
|
|
4575
|
+
**v0.2.0 implementation note:** Mood categories are specified but not implemented in v0.2.0. The current implementation uses a flat pool of mascots and quotes regardless of mood. The mood system is deferred to a future version.
|
|
4576
|
+
|
|
4548
4577
|
| Category | Trigger concept | Example mascot direction |
|
|
4549
4578
|
|---|---|---|
|
|
4550
4579
|
| `fresh` | new day or first ordinary opening | `( ˶ᵔ ᵕ ᵔ˶ )` |
|
|
@@ -4633,6 +4662,21 @@ This provides variation across days without visual flicker during ordinary Task
|
|
|
4633
4662
|
|
|
4634
4663
|
Tests must be able to inject a date and mood input and receive a predictable result.
|
|
4635
4664
|
|
|
4665
|
+
**v0.2.0 actual implementation:** Date-only deterministic selection. No mood logic. One mascot and one quote per day, seeded by `random.Random(today.toordinal())`.
|
|
4666
|
+
|
|
4667
|
+
```python
|
|
4668
|
+
import random
|
|
4669
|
+
from datetime import date
|
|
4670
|
+
|
|
4671
|
+
def pick_for_date(today: date) -> tuple[str, str]:
|
|
4672
|
+
rng = random.Random(today.toordinal())
|
|
4673
|
+
mascot = rng.choice(_MASCOTS)
|
|
4674
|
+
quote = rng.choice(_QUOTES)
|
|
4675
|
+
return mascot, quote
|
|
4676
|
+
```
|
|
4677
|
+
|
|
4678
|
+
Seeded by oday.toordinal() (the day's absolute integer). This gives a stable result for the full day and changes naturally at midnight with the date. No mood input. Tests inject a fixed date for determinism.
|
|
4679
|
+
|
|
4636
4680
|
## 14.8 Quote Length
|
|
4637
4681
|
|
|
4638
4682
|
Built-in quotes should generally contain no more than 80 characters including punctuation.
|
|
@@ -4759,6 +4803,54 @@ This keeps the initial data model and interface focused.
|
|
|
4759
4803
|
|
|
4760
4804
|
The architecture should load built-in mascots and quotes from a dedicated resource module so customization can be added later without modifying Task logic.
|
|
4761
4805
|
|
|
4806
|
+
**v0.2.0 shipped content:**
|
|
4807
|
+
|
|
4808
|
+
Both lists are centralized in `src/rook/branding.py`. User-supplied quotes are original or personally meaningful. Mascots are kaomoji/Unicode art combinations with a soft, warm aesthetic.
|
|
4809
|
+
|
|
4810
|
+
Mascots (23 kaomoji strings):
|
|
4811
|
+
|
|
4812
|
+
```text
|
|
4813
|
+
。・::・゚★ (。•̀ᴗ-) ✧.。
|
|
4814
|
+
˚₊‧꒰ (˶ˆ ᗜ ˆ˵) ꒱‧₊˚
|
|
4815
|
+
⋆⁺₊ (。
|
|
4816
|
+
'
|
|
4817
|
+
▽
|
|
4818
|
+
'
|
|
4819
|
+
。)♡ ₊⁺⋆
|
|
4820
|
+
‧₊˚ ☁️ ₊‧₊˚ (˘▽˘)
|
|
4821
|
+
∿∿∿ (っ˘ω˘ς) ∿∿∿
|
|
4822
|
+
✧˖° (ᵔ◡ᵔ) °˖✧
|
|
4823
|
+
˚ ༘ ♡⋆。˚ (◍•ᴗ•◍)
|
|
4824
|
+
‧₊˚ 🖇️✩ ₊˚⊹ (。•̀ᴗ-)
|
|
4825
|
+
⊹ ₊ ⋆ (˘͈ᵕ˘͈ ) ⋆ ₊ ⊹
|
|
4826
|
+
˘͈ᵕ˘͈ ₊˚⊹
|
|
4827
|
+
(ˊᗜˋ*) ₊˚⊹
|
|
4828
|
+
✩₊˚.⋆☾⋆⁺₊✧ (˶˃ ᵕ ˂˶)
|
|
4829
|
+
(˶ᵔ ᵕ ᵔ˶) ₊˚⊹
|
|
4830
|
+
˚₊‧ ⊹ (˶ˆᗜˆ˵) ⊹ ‧₊˚
|
|
4831
|
+
🌸 (◠‿◠✿) 🌸
|
|
4832
|
+
⊹˚₊ (ᵒ ᵕ ᵒ) ₊˚⊹
|
|
4833
|
+
✦ (。•̀ᴗ-)✦
|
|
4834
|
+
₊˚⊹ (ˊ• ॢ•ˋ) ⊹˚₊
|
|
4835
|
+
♡₊˚ (˶ᵔ ᵕ ᵔ˶) ˚₊♡
|
|
4836
|
+
✿ (◡ ω ◡) ✿
|
|
4837
|
+
‧₊˚ ✩ (。•́‿•̀。) ✩ ˚₊‧
|
|
4838
|
+
⊹ ₊˚ (≧ᴗ≦) ˚₊ ⊹
|
|
4839
|
+
❀ (ᵕ—ᴗ—) ❀
|
|
4840
|
+
```
|
|
4841
|
+
|
|
4842
|
+
Quotes (7):
|
|
4843
|
+
|
|
4844
|
+
```text
|
|
4845
|
+
You are art. You will never be again.
|
|
4846
|
+
Do the thing, and you shall have the power.
|
|
4847
|
+
You already survived every day before this one.
|
|
4848
|
+
Discipline is a mountain of evidence.
|
|
4849
|
+
You are the proof of your own effort.
|
|
4850
|
+
Your genius is how everything meets in you.
|
|
4851
|
+
Showing up is the whole trick.
|
|
4852
|
+
```
|
|
4853
|
+
|
|
4762
4854
|
## 14.16 Mascot and Quote Acceptance Criteria
|
|
4763
4855
|
|
|
4764
4856
|
This feature is complete for version 1 when:
|
|
@@ -5880,6 +5972,20 @@ The lifecycle is:
|
|
|
5880
5972
|
|
|
5881
5973
|
The application MUST NOT require a resident background process after the TUI exits.
|
|
5882
5974
|
|
|
5975
|
+
**v0.2.0 CLI flags:**
|
|
5976
|
+
|
|
5977
|
+
The `main()` function in `__main__.py` checks `sys.argv` before launching the TUI. Three utility flags are handled before any database is opened (except `--week-start`, which needs the DB):
|
|
5978
|
+
|
|
5979
|
+
| Flag | Behavior |
|
|
5980
|
+
|---|---|
|
|
5981
|
+
| `--version` | Print `__version__` and exit 0 |
|
|
5982
|
+
| `--data-path` | Print the platform-specific SQLite path and exit 0 |
|
|
5983
|
+
| `--week-start sunday\|monday` | Update `app_meta.week_start_day` and exit 0 |
|
|
5984
|
+
|
|
5985
|
+
Minimal manual `sys.argv` parsing was chosen over `argparse` because the flag set is tiny (three flags, no subcommands) and `argparse` would add boilerplate that obscures simple logic. If flags grow significantly in a future version, migrating to `argparse` or `click` is straightforward.
|
|
5986
|
+
|
|
5987
|
+
`--week-start` rationale: previously required users to manually run `sqlite3` and write SQL to change the archive week layout, documented in the README FAQ. The flag removes the need for any SQL knowledge and is consistent with the "feels like a small terminal tool" packaging goal.
|
|
5988
|
+
|
|
5883
5989
|
---
|
|
5884
5990
|
|
|
5885
5991
|
## 16.9 Domain Models
|
|
@@ -8076,6 +8182,14 @@ Publishing to PyPI may occur when:
|
|
|
8076
8182
|
|
|
8077
8183
|
PyPI publication is not required to begin coding or make the repository public.
|
|
8078
8184
|
|
|
8185
|
+
**v0.2.0 actual state:** Published to PyPI as `rook-cli` (see Section 20.30). Recommended installation:
|
|
8186
|
+
|
|
8187
|
+
```powershell
|
|
8188
|
+
uv tool install rook-cli
|
|
8189
|
+
```
|
|
8190
|
+
|
|
8191
|
+
`pip install rook-cli` also works for users who prefer it.
|
|
8192
|
+
|
|
8079
8193
|
---
|
|
8080
8194
|
|
|
8081
8195
|
## 20.10 User Data Directory
|
|
@@ -8530,6 +8644,28 @@ Packaging and repository setup are acceptable when:
|
|
|
8530
8644
|
- the private RFC is excluded locally if the maintainer chooses not to publish it;
|
|
8531
8645
|
- and README setup instructions have been followed successfully from a clean environment.
|
|
8532
8646
|
|
|
8647
|
+
---
|
|
8648
|
+
|
|
8649
|
+
## 20.30 Distribution Name, Installation Tool, License, and Build Backend — Decision Record (v0.2.0)
|
|
8650
|
+
|
|
8651
|
+
### Distribution name conflict — `rook-cli`
|
|
8652
|
+
|
|
8653
|
+
The PyPI distribution name `rook` was already taken by an unrelated package. Chosen resolution: publish as `rook-cli` on PyPI while keeping `rook` as both the console command and the Python import package (`import rook`). Users install with `uv tool install rook-cli` but run `rook` in the terminal. This is a well-established pattern (e.g., `Pillow` installs as `Pillow` but imports as `PIL`). Alternative considered: rename the import package to `rook_cli` — rejected because it would break every import statement and the console command, and the PyPI name is an installation detail users rarely see after the first install.
|
|
8654
|
+
|
|
8655
|
+
### Installation tool — uv, not pipx
|
|
8656
|
+
|
|
8657
|
+
`pipx` was the original target for end-user installation. On the primary development machine, `pipx` was installed via Scoop but broken (missing `colorama` dependency, not easily fixable). `uv tool install` was used as the alternative. `uv` is now the documented and recommended installation method. `pip install rook-cli` also works for users who prefer it.
|
|
8658
|
+
|
|
8659
|
+
### License — Proprietary (not MIT)
|
|
8660
|
+
|
|
8661
|
+
Changed from MIT to a custom proprietary license before the first public release. Reason: the maintainer does not want others to redistribute, fork, or build derivative products from the source. The license permits personal, non-commercial use only. In `pyproject.toml`, the non-SPDX identifier `LicenseRef-Proprietary` is used (required because `pyproject.toml`'s `license` field only accepts SPDX identifiers; `LicenseRef-` prefix is the SPDX convention for custom identifiers). The full license text is in `LICENSE`. The plan is to eventually move the project to a personal website and make the GitHub repository private; the public repo is kept open in the interim for visibility and discoverability.
|
|
8662
|
+
|
|
8663
|
+
### Build backend — Hatchling
|
|
8664
|
+
|
|
8665
|
+
`hatchling` is used as the build backend. Version is read dynamically from `src/rook/__init__.py` via `[tool.hatch.version] path = "src/rook/__init__.py"`. This keeps version defined in one place (importable as `rook.__version__`) and avoids duplication in `pyproject.toml`.
|
|
8666
|
+
|
|
8667
|
+
---
|
|
8668
|
+
|
|
8533
8669
|
# 21. Incremental Development Plan
|
|
8534
8670
|
|
|
8535
8671
|
## 21.1 Purpose of the Plan
|
|
@@ -9006,7 +9142,7 @@ Implement the defining notebook-like interaction: pressing `n` produces a blank
|
|
|
9006
9142
|
- `Escape` restores original text during edit.
|
|
9007
9143
|
- Blank edit cannot save.
|
|
9008
9144
|
- Printable shortcut letters remain text while editing.
|
|
9009
|
-
- Footer changes to `[
|
|
9145
|
+
- Footer changes to `[Ent] save [Esc] cancel`.
|
|
9010
9146
|
- Pasted newlines normalize to spaces.
|
|
9011
9147
|
- Text length is capped at 1,000 code points.
|
|
9012
9148
|
|
|
@@ -9505,6 +9641,9 @@ feat: add archive weekly view
|
|
|
9505
9641
|
|
|
9506
9642
|
## 21.15 Phase 10 — Archive Day Detail
|
|
9507
9643
|
|
|
9644
|
+
> **Status: Superseded by Phase 9.**
|
|
9645
|
+
> The original Phase 9 was a date index screen. The original Phase 10 was a per-day detail drill-down from that index. Both were replaced in the shipped Phase 9 with a single combined weekly view that shows all tasks for the week at once. There is no separate day-detail screen. The design decision is documented in Section 21.14. This section is retained for historical reference.
|
|
9646
|
+
|
|
9508
9647
|
### Objective
|
|
9509
9648
|
|
|
9510
9649
|
Allow the user to open a Past Day and read its completed and deleted Tasks as a historical page.
|
|
@@ -13368,7 +13507,7 @@ All other keys should be ignored unless the overlay is scrollable.
|
|
|
13368
13507
|
Wide Today footer:
|
|
13369
13508
|
|
|
13370
13509
|
```text
|
|
13371
|
-
[n] new [e] edit [x] complete [>] migrate [d] delete [u] undo [
|
|
13510
|
+
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
13372
13511
|
```
|
|
13373
13512
|
|
|
13374
13513
|
Medium Today footer:
|
|
@@ -13380,7 +13519,7 @@ n new e edit x done > migrate d delete u undo r routine a archive ? help
|
|
|
13380
13519
|
Compact Today footer:
|
|
13381
13520
|
|
|
13382
13521
|
```text
|
|
13383
|
-
n e x > d u
|
|
13522
|
+
n e x > d u a q
|
|
13384
13523
|
```
|
|
13385
13524
|
|
|
13386
13525
|
Footers must shorten rather than wrap. The complete labels remain available in Help.
|
|
@@ -13403,7 +13542,7 @@ rook ♖ Today — Friday, July 24, 2026
|
|
|
13403
13542
|
× Submit the expense report
|
|
13404
13543
|
• B̶u̶y̶ ̶a̶n̶o̶t̶h̶e̶r̶ ̶m̶o̶n̶i̶t̶o̶r̶
|
|
13405
13544
|
|
|
13406
|
-
[n] new [e] edit [x] complete [>] migrate [d] delete [u] undo [
|
|
13545
|
+
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
13407
13546
|
```
|
|
13408
13547
|
|
|
13409
13548
|
## B.2 Empty Today
|
|
@@ -13427,7 +13566,7 @@ rook ♖ Today — Friday, July 24, 2026
|
|
|
13427
13566
|
× Submit the expense report
|
|
13428
13567
|
❯ • Draft blog outline▋
|
|
13429
13568
|
|
|
13430
|
-
[
|
|
13569
|
+
[Ent] save [Esc] cancel
|
|
13431
13570
|
```
|
|
13432
13571
|
|
|
13433
13572
|
## B.4 Editing a Migrated Task
|
|
@@ -13440,7 +13579,7 @@ Rook ♜ Friday, July 24, 2026
|
|
|
13440
13579
|
❯ > Call the dentist on Monday▋
|
|
13441
13580
|
× Submit the expense report
|
|
13442
13581
|
|
|
13443
|
-
[
|
|
13582
|
+
[Ent] save [Esc] cancel
|
|
13444
13583
|
```
|
|
13445
13584
|
|
|
13446
13585
|
The edit preserves the Migrated symbol.
|
|
@@ -13517,7 +13656,7 @@ Rook ♜ Friday, July 24, 2026
|
|
|
13517
13656
|
another full-featured productivity system
|
|
13518
13657
|
• Reply to Spencer
|
|
13519
13658
|
|
|
13520
|
-
[n] new [e] edit [x] complete [>] migrate [d] delete [u] undo [
|
|
13659
|
+
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
13521
13660
|
```
|
|
13522
13661
|
|
|
13523
13662
|
Continuation lines align under Task text, not under the selection or state symbols.
|
|
@@ -13532,7 +13671,7 @@ Rook ♜ Fri, Jul 24, 2026
|
|
|
13532
13671
|
> Call the dentist
|
|
13533
13672
|
× Submit expenses
|
|
13534
13673
|
|
|
13535
|
-
n e x > d u
|
|
13674
|
+
n e x > d u a q
|
|
13536
13675
|
```
|
|
13537
13676
|
|
|
13538
13677
|
The date and footer shorten. The footer does not wrap.
|
|
@@ -13546,7 +13685,7 @@ Rook ♜ Fri, Jul 24, 2026
|
|
|
13546
13685
|
❯ • Finish the client deck
|
|
13547
13686
|
> Call the dentist
|
|
13548
13687
|
|
|
13549
|
-
n e x > d u
|
|
13688
|
+
n e x > d u a q
|
|
13550
13689
|
```
|
|
13551
13690
|
|
|
13552
13691
|
The Task region scrolls. The header and footer remain visible when practical.
|
|
@@ -13562,7 +13701,7 @@ Rook ♜ Friday, July 24, 2026
|
|
|
13562
13701
|
|
|
13563
13702
|
Could not save. Your change was not applied.
|
|
13564
13703
|
|
|
13565
|
-
[n] new [e] edit [x] complete [>] migrate [d] delete [u] undo [
|
|
13704
|
+
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
13566
13705
|
```
|
|
13567
13706
|
|
|
13568
13707
|
The visible Task state must match the database after the failed write.
|
|
@@ -13809,7 +13948,7 @@ Rook ♜ Edit Routine
|
|
|
13809
13948
|
□ Brush teeth
|
|
13810
13949
|
❯ □ Fill water bottle▋
|
|
13811
13950
|
|
|
13812
|
-
[
|
|
13951
|
+
[Ent] save [Esc] cancel
|
|
13813
13952
|
```
|
|
13814
13953
|
|
|
13815
13954
|
## D.8 Active Routine Session
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: rook-cli
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.2
|
|
4
4
|
Summary: A local, keyboard-first terminal daily journal.
|
|
5
5
|
Project-URL: Repository, https://github.com/JanviChawla/rook
|
|
6
6
|
Author: Janvi Chawla
|
|
@@ -67,13 +67,15 @@ uv tool upgrade rook-cli
|
|
|
67
67
|
| `e` or `Ent` | Edit selected task |
|
|
68
68
|
| `x` | Toggle complete |
|
|
69
69
|
| `>` | Toggle migrated |
|
|
70
|
-
| `d` | Soft-delete / permanently remove (press twice) |
|
|
70
|
+
| `d` | Soft-delete (shows `~` and strikethrough) / permanently remove (press twice) |
|
|
71
71
|
| `u` | Undo last action |
|
|
72
72
|
| `a` | Open weekly archive |
|
|
73
73
|
| `↑` / `↓` | Move selection |
|
|
74
74
|
| `Esc` | Cancel edit |
|
|
75
75
|
| `q` | Quit |
|
|
76
76
|
|
|
77
|
+
> **Mac note:** strikethrough on soft-deleted tasks requires a terminal that supports it. macOS Terminal.app does not; [iTerm2](https://iterm2.com), Alacritty, and kitty do. The `~` bullet still appears regardless of terminal.
|
|
78
|
+
|
|
77
79
|
## Data and privacy
|
|
78
80
|
|
|
79
81
|
Tasks are stored in a local SQLite database. Nothing leaves your machine.
|
|
@@ -96,21 +98,14 @@ Uninstalling Rook does not delete the database.
|
|
|
96
98
|
|
|
97
99
|
**How do I change the archive week layout from Sun–Sat to Mon–Sun?**
|
|
98
100
|
|
|
99
|
-
There is no in-app setting yet. Update the value directly in the SQLite database.
|
|
100
|
-
Find the exact path with `rook --data-path`, or use the default:
|
|
101
|
-
|
|
102
101
|
```powershell
|
|
103
|
-
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
```sql
|
|
107
|
-
INSERT OR REPLACE INTO app_meta (key, value) VALUES ('week_start_day', 'monday');
|
|
102
|
+
rook --week-start monday
|
|
108
103
|
```
|
|
109
104
|
|
|
110
105
|
To switch back to Sunday-start:
|
|
111
106
|
|
|
112
|
-
```
|
|
113
|
-
|
|
107
|
+
```powershell
|
|
108
|
+
rook --week-start sunday
|
|
114
109
|
```
|
|
115
110
|
|
|
116
111
|
## License
|
|
@@ -1,103 +1,98 @@
|
|
|
1
|
-
# Rook ♖
|
|
2
|
-
|
|
3
|
-
A local, keyboard-first terminal journal for working through one day at a time.
|
|
4
|
-
|
|
5
|
-
```text
|
|
6
|
-
rook ♖ Today — Friday, July 24, 2026
|
|
7
|
-
⋆⁺₊ (。'▽'。)♡ ₊⁺⋆ "Showing up is the whole trick."
|
|
8
|
-
|
|
9
|
-
❯ • Finish the presentation
|
|
10
|
-
• Reply to Alex
|
|
11
|
-
> Read Chapter 3
|
|
12
|
-
× Submit the expense report
|
|
13
|
-
|
|
14
|
-
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
Rook is inspired by the simplicity of a paper bullet journal:
|
|
18
|
-
|
|
19
|
-
- one active list: **Today**
|
|
20
|
-
- direct, in-place editing
|
|
21
|
-
- local SQLite storage
|
|
22
|
-
- read-only history
|
|
23
|
-
- no accounts, cloud sync, reminders, priorities, or telemetry
|
|
24
|
-
|
|
25
|
-
## Installation
|
|
26
|
-
|
|
27
|
-
Requires Python 3.10 or newer. Install with [uv](https://docs.astral.sh/uv/):
|
|
28
|
-
|
|
29
|
-
```powershell
|
|
30
|
-
uv tool install rook-cli
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Then launch:
|
|
34
|
-
|
|
35
|
-
```powershell
|
|
36
|
-
rook
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
To upgrade later:
|
|
40
|
-
|
|
41
|
-
```powershell
|
|
42
|
-
uv tool upgrade rook-cli
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Keyboard reference
|
|
46
|
-
|
|
47
|
-
| Key | Action |
|
|
48
|
-
|-----|--------|
|
|
49
|
-
| `n` | New task |
|
|
50
|
-
| `e` or `Ent` | Edit selected task |
|
|
51
|
-
| `x` | Toggle complete |
|
|
52
|
-
| `>` | Toggle migrated |
|
|
53
|
-
| `d` | Soft-delete / permanently remove (press twice) |
|
|
54
|
-
| `u` | Undo last action |
|
|
55
|
-
| `a` | Open weekly archive |
|
|
56
|
-
| `↑` / `↓` | Move selection |
|
|
57
|
-
| `Esc` | Cancel edit |
|
|
58
|
-
| `q` | Quit |
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
|
67
|
-
|
|
68
|
-
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
## License
|
|
100
|
-
|
|
101
|
-
Copyright (c) 2026 Janvi Chawla. All Rights Reserved.
|
|
102
|
-
|
|
103
|
-
Personal use permitted. No redistribution or derivative works without permission.
|
|
1
|
+
# Rook ♖
|
|
2
|
+
|
|
3
|
+
A local, keyboard-first terminal journal for working through one day at a time.
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
rook ♖ Today — Friday, July 24, 2026
|
|
7
|
+
⋆⁺₊ (。'▽'。)♡ ₊⁺⋆ "Showing up is the whole trick."
|
|
8
|
+
|
|
9
|
+
❯ • Finish the presentation
|
|
10
|
+
• Reply to Alex
|
|
11
|
+
> Read Chapter 3
|
|
12
|
+
× Submit the expense report
|
|
13
|
+
|
|
14
|
+
[n] new [e/Ent] edit [x] complete [>] migrate [d] delete [u] undo [a] archive [q] quit
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Rook is inspired by the simplicity of a paper bullet journal:
|
|
18
|
+
|
|
19
|
+
- one active list: **Today**
|
|
20
|
+
- direct, in-place editing
|
|
21
|
+
- local SQLite storage
|
|
22
|
+
- read-only history
|
|
23
|
+
- no accounts, cloud sync, reminders, priorities, or telemetry
|
|
24
|
+
|
|
25
|
+
## Installation
|
|
26
|
+
|
|
27
|
+
Requires Python 3.10 or newer. Install with [uv](https://docs.astral.sh/uv/):
|
|
28
|
+
|
|
29
|
+
```powershell
|
|
30
|
+
uv tool install rook-cli
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Then launch:
|
|
34
|
+
|
|
35
|
+
```powershell
|
|
36
|
+
rook
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
To upgrade later:
|
|
40
|
+
|
|
41
|
+
```powershell
|
|
42
|
+
uv tool upgrade rook-cli
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Keyboard reference
|
|
46
|
+
|
|
47
|
+
| Key | Action |
|
|
48
|
+
|-----|--------|
|
|
49
|
+
| `n` | New task |
|
|
50
|
+
| `e` or `Ent` | Edit selected task |
|
|
51
|
+
| `x` | Toggle complete |
|
|
52
|
+
| `>` | Toggle migrated |
|
|
53
|
+
| `d` | Soft-delete (shows `~` and strikethrough) / permanently remove (press twice) |
|
|
54
|
+
| `u` | Undo last action |
|
|
55
|
+
| `a` | Open weekly archive |
|
|
56
|
+
| `↑` / `↓` | Move selection |
|
|
57
|
+
| `Esc` | Cancel edit |
|
|
58
|
+
| `q` | Quit |
|
|
59
|
+
|
|
60
|
+
> **Mac note:** strikethrough on soft-deleted tasks requires a terminal that supports it. macOS Terminal.app does not; [iTerm2](https://iterm2.com), Alacritty, and kitty do. The `~` bullet still appears regardless of terminal.
|
|
61
|
+
|
|
62
|
+
## Data and privacy
|
|
63
|
+
|
|
64
|
+
Tasks are stored in a local SQLite database. Nothing leaves your machine.
|
|
65
|
+
|
|
66
|
+
| Platform | Location |
|
|
67
|
+
|----------|----------|
|
|
68
|
+
| Windows | `%LOCALAPPDATA%\Rook\data.sqlite3` |
|
|
69
|
+
| macOS | `~/Library/Application Support/Rook/data.sqlite3` |
|
|
70
|
+
| Linux | `~/.local/share/rook/data.sqlite3` |
|
|
71
|
+
|
|
72
|
+
To print the exact path on your system:
|
|
73
|
+
|
|
74
|
+
```powershell
|
|
75
|
+
rook --data-path
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Uninstalling Rook does not delete the database.
|
|
79
|
+
|
|
80
|
+
## FAQ
|
|
81
|
+
|
|
82
|
+
**How do I change the archive week layout from Sun–Sat to Mon–Sun?**
|
|
83
|
+
|
|
84
|
+
```powershell
|
|
85
|
+
rook --week-start monday
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
To switch back to Sunday-start:
|
|
89
|
+
|
|
90
|
+
```powershell
|
|
91
|
+
rook --week-start sunday
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## License
|
|
95
|
+
|
|
96
|
+
Copyright (c) 2026 Janvi Chawla. All Rights Reserved.
|
|
97
|
+
|
|
98
|
+
Personal use permitted. No redistribution or derivative works without permission.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.2.2"
|