rook-cli 0.2.0__tar.gz → 0.2.1__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.
Files changed (108) hide show
  1. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/README.md +3 -10
  2. rook_cli-0.2.1/.claude/worktrees/streamed-orbiting-llama/src/rook/__init__.py +1 -0
  3. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/__main__.py +22 -3
  4. {rook_cli-0.2.0 → rook_cli-0.2.1}/DEVELOPMENT_GUIDE.md +164 -25
  5. {rook_cli-0.2.0 → rook_cli-0.2.1}/PKG-INFO +4 -11
  6. {rook_cli-0.2.0 → rook_cli-0.2.1}/README.md +3 -10
  7. rook_cli-0.2.1/src/rook/__init__.py +1 -0
  8. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/__main__.py +22 -3
  9. rook_cli-0.2.0/.claude/worktrees/streamed-orbiting-llama/src/rook/__init__.py +0 -1
  10. rook_cli-0.2.0/src/rook/__init__.py +0 -1
  11. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/settings.local.json +0 -0
  12. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/.claude/settings.local.json +0 -0
  13. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/.gitignore +0 -0
  14. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/LICENSE +0 -0
  15. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/pyproject.toml +0 -0
  16. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/app.py +0 -0
  17. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/branding.py +0 -0
  18. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/domain/__init__.py +0 -0
  19. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/domain/tasks.py +0 -0
  20. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/formatting.py +0 -0
  21. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/paths.py +0 -0
  22. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/persistence/__init__.py +0 -0
  23. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/persistence/archive.py +0 -0
  24. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/persistence/database.py +0 -0
  25. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/persistence/metadata.py +0 -0
  26. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/persistence/migrations.py +0 -0
  27. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/persistence/tasks.py +0 -0
  28. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/services/__init__.py +0 -0
  29. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/services/rollover.py +0 -0
  30. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/services/tasks.py +0 -0
  31. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/services/undo.py +0 -0
  32. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/symbols.py +0 -0
  33. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/widgets/__init__.py +0 -0
  34. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/widgets/archive_screen.py +0 -0
  35. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/widgets/shortcut_footer.py +0 -0
  36. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/widgets/task_line_input.py +0 -0
  37. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/widgets/task_list.py +0 -0
  38. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/src/rook/widgets/task_row.py +0 -0
  39. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/support.py +0 -0
  40. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_app.py +0 -0
  41. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_archive_navigation.py +0 -0
  42. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_archive_queries.py +0 -0
  43. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_formatting.py +0 -0
  44. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_migrations.py +0 -0
  45. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_paths.py +0 -0
  46. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_persistence_failure.py +0 -0
  47. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_rollover.py +0 -0
  48. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_rollover_app.py +0 -0
  49. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_selection.py +0 -0
  50. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_shortcut_footer_selection.py +0 -0
  51. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_smoke.py +0 -0
  52. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_symbols.py +0 -0
  53. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_task_creation_and_editing.py +0 -0
  54. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_task_repository.py +0 -0
  55. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_task_row_rendering.py +0 -0
  56. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_task_service.py +0 -0
  57. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_task_states.py +0 -0
  58. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_undo.py +0 -0
  59. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_undo_manager.py +0 -0
  60. {rook_cli-0.2.0 → rook_cli-0.2.1}/.claude/worktrees/streamed-orbiting-llama/tests/test_widget_markup_safety.py +0 -0
  61. {rook_cli-0.2.0 → rook_cli-0.2.1}/.gitignore +0 -0
  62. {rook_cli-0.2.0 → rook_cli-0.2.1}/LICENSE +0 -0
  63. {rook_cli-0.2.0 → rook_cli-0.2.1}/pyproject.toml +0 -0
  64. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/app.py +0 -0
  65. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/branding.py +0 -0
  66. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/domain/__init__.py +0 -0
  67. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/domain/tasks.py +0 -0
  68. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/formatting.py +0 -0
  69. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/paths.py +0 -0
  70. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/persistence/__init__.py +0 -0
  71. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/persistence/archive.py +0 -0
  72. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/persistence/database.py +0 -0
  73. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/persistence/metadata.py +0 -0
  74. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/persistence/migrations.py +0 -0
  75. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/persistence/tasks.py +0 -0
  76. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/services/__init__.py +0 -0
  77. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/services/rollover.py +0 -0
  78. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/services/tasks.py +0 -0
  79. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/services/undo.py +0 -0
  80. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/symbols.py +0 -0
  81. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/widgets/__init__.py +0 -0
  82. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/widgets/archive_screen.py +0 -0
  83. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/widgets/shortcut_footer.py +0 -0
  84. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/widgets/task_line_input.py +0 -0
  85. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/widgets/task_list.py +0 -0
  86. {rook_cli-0.2.0 → rook_cli-0.2.1}/src/rook/widgets/task_row.py +0 -0
  87. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/support.py +0 -0
  88. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_app.py +0 -0
  89. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_archive_navigation.py +0 -0
  90. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_archive_queries.py +0 -0
  91. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_formatting.py +0 -0
  92. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_migrations.py +0 -0
  93. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_paths.py +0 -0
  94. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_persistence_failure.py +0 -0
  95. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_rollover.py +0 -0
  96. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_rollover_app.py +0 -0
  97. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_selection.py +0 -0
  98. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_shortcut_footer_selection.py +0 -0
  99. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_smoke.py +0 -0
  100. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_symbols.py +0 -0
  101. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_task_creation_and_editing.py +0 -0
  102. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_task_repository.py +0 -0
  103. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_task_row_rendering.py +0 -0
  104. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_task_service.py +0 -0
  105. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_task_states.py +0 -0
  106. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_undo.py +0 -0
  107. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_undo_manager.py +0 -0
  108. {rook_cli-0.2.0 → rook_cli-0.2.1}/tests/test_widget_markup_safety.py +0 -0
@@ -79,21 +79,14 @@ Uninstalling Rook does not delete the database.
79
79
 
80
80
  **How do I change the archive week layout from Sun–Sat to Mon–Sun?**
81
81
 
82
- There is no in-app setting yet. Update the value directly in the SQLite database.
83
- Find the exact path with `rook --data-path`, or use the default:
84
-
85
82
  ```powershell
86
- sqlite3 "$env:LOCALAPPDATA\Rook\data.sqlite3"
87
- ```
88
-
89
- ```sql
90
- INSERT OR REPLACE INTO app_meta (key, value) VALUES ('week_start_day', 'monday');
83
+ rook --week-start monday
91
84
  ```
92
85
 
93
86
  To switch back to Sunday-start:
94
87
 
95
- ```sql
96
- INSERT OR REPLACE INTO app_meta (key, value) VALUES ('week_start_day', 'sunday');
88
+ ```powershell
89
+ rook --week-start sunday
97
90
  ```
98
91
 
99
92
  ## License
@@ -1,5 +1,6 @@
1
1
  import sys
2
2
 
3
+ from rook import __version__
3
4
  from rook.app import RookApp
4
5
  from rook.paths import default_database_path
5
6
  from rook.persistence.database import connect
@@ -11,9 +12,27 @@ from rook.services.tasks import TaskService
11
12
 
12
13
 
13
14
  def main() -> int:
14
- if len(sys.argv) > 1 and sys.argv[1] == "--data-path":
15
- print(default_database_path())
16
- return 0
15
+ if len(sys.argv) > 1:
16
+ if sys.argv[1] == "--version":
17
+ print(__version__)
18
+ return 0
19
+ if sys.argv[1] == "--data-path":
20
+ print(default_database_path())
21
+ return 0
22
+ if sys.argv[1] == "--week-start":
23
+ value = sys.argv[2].lower() if len(sys.argv) > 2 else ""
24
+ if value not in ("sunday", "monday"):
25
+ print("Usage: rook --week-start sunday|monday")
26
+ return 1
27
+ db_path = default_database_path()
28
+ connection = connect(db_path)
29
+ try:
30
+ migrate(connection)
31
+ MetadataRepository(connection).set_week_start_day(0 if value == "monday" else 6)
32
+ finally:
33
+ connection.close()
34
+ print(f"Week start set to {value}.")
35
+ return 0
17
36
 
18
37
  db_path = default_database_path()
19
38
  connection = connect(db_path)
@@ -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.1 |
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 | Not started |
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 [r] routine [a] archive [q] quit
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 r routine a archive q quit
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 r a q
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 [r] routine [a] archive [?] help [q] quit
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
- [Enter] save [Esc] cancel
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 [r] routine [a] archive [?] help [q] quit
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 r a ? q
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 [r] routine [a] archive [?] help [q] quit
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
- [Enter] save [Esc] cancel
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 [r] routine [a] archive [?] help [q] quit
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 r a ? q
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 `[Enter] save [Esc] cancel`.
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 [r] routine [a] archive [?] help [q] quit
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 r a ? q
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 [r] routine [a] archive [?] help [q] quit
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
- [Enter] save [Esc] cancel
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
- [Enter] save [Esc] cancel
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 [r] routine [a] archive [?] help [q] quit
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 r a ? q
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 r a ? q
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 [r] routine [a] archive [?] help [q] quit
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
- [Enter] save [Esc] cancel
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.0
3
+ Version: 0.2.1
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
@@ -96,21 +96,14 @@ Uninstalling Rook does not delete the database.
96
96
 
97
97
  **How do I change the archive week layout from Sun–Sat to Mon–Sun?**
98
98
 
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
99
  ```powershell
103
- sqlite3 "$env:LOCALAPPDATA\Rook\data.sqlite3"
104
- ```
105
-
106
- ```sql
107
- INSERT OR REPLACE INTO app_meta (key, value) VALUES ('week_start_day', 'monday');
100
+ rook --week-start monday
108
101
  ```
109
102
 
110
103
  To switch back to Sunday-start:
111
104
 
112
- ```sql
113
- INSERT OR REPLACE INTO app_meta (key, value) VALUES ('week_start_day', 'sunday');
105
+ ```powershell
106
+ rook --week-start sunday
114
107
  ```
115
108
 
116
109
  ## License
@@ -79,21 +79,14 @@ Uninstalling Rook does not delete the database.
79
79
 
80
80
  **How do I change the archive week layout from Sun–Sat to Mon–Sun?**
81
81
 
82
- There is no in-app setting yet. Update the value directly in the SQLite database.
83
- Find the exact path with `rook --data-path`, or use the default:
84
-
85
82
  ```powershell
86
- sqlite3 "$env:LOCALAPPDATA\Rook\data.sqlite3"
87
- ```
88
-
89
- ```sql
90
- INSERT OR REPLACE INTO app_meta (key, value) VALUES ('week_start_day', 'monday');
83
+ rook --week-start monday
91
84
  ```
92
85
 
93
86
  To switch back to Sunday-start:
94
87
 
95
- ```sql
96
- INSERT OR REPLACE INTO app_meta (key, value) VALUES ('week_start_day', 'sunday');
88
+ ```powershell
89
+ rook --week-start sunday
97
90
  ```
98
91
 
99
92
  ## License
@@ -0,0 +1 @@
1
+ __version__ = "0.2.1"
@@ -1,5 +1,6 @@
1
1
  import sys
2
2
 
3
+ from rook import __version__
3
4
  from rook.app import RookApp
4
5
  from rook.paths import default_database_path
5
6
  from rook.persistence.database import connect
@@ -11,9 +12,27 @@ from rook.services.tasks import TaskService
11
12
 
12
13
 
13
14
  def main() -> int:
14
- if len(sys.argv) > 1 and sys.argv[1] == "--data-path":
15
- print(default_database_path())
16
- return 0
15
+ if len(sys.argv) > 1:
16
+ if sys.argv[1] == "--version":
17
+ print(__version__)
18
+ return 0
19
+ if sys.argv[1] == "--data-path":
20
+ print(default_database_path())
21
+ return 0
22
+ if sys.argv[1] == "--week-start":
23
+ value = sys.argv[2].lower() if len(sys.argv) > 2 else ""
24
+ if value not in ("sunday", "monday"):
25
+ print("Usage: rook --week-start sunday|monday")
26
+ return 1
27
+ db_path = default_database_path()
28
+ connection = connect(db_path)
29
+ try:
30
+ migrate(connection)
31
+ MetadataRepository(connection).set_week_start_day(0 if value == "monday" else 6)
32
+ finally:
33
+ connection.close()
34
+ print(f"Week start set to {value}.")
35
+ return 0
17
36
 
18
37
  db_path = default_database_path()
19
38
  connection = connect(db_path)
@@ -1 +0,0 @@
1
- __version__ = "0.2.0"
@@ -1 +0,0 @@
1
- __version__ = "0.2.0"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes