td-task 0.1.4__tar.gz → 0.2.0__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.
- td_task-0.2.0/.env.enc +0 -0
- td_task-0.2.0/.github/workflows/publish.yml +33 -0
- {td_task-0.1.4 → td_task-0.2.0}/.gitignore +1 -0
- td_task-0.2.0/PKG-INFO +278 -0
- td_task-0.2.0/README.md +267 -0
- td_task-0.2.0/assets/demo.gif +0 -0
- td_task-0.2.0/demo.tape +56 -0
- {td_task-0.1.4 → td_task-0.2.0}/pyproject.toml +5 -3
- {td_task-0.1.4 → td_task-0.2.0}/src/td/CHANGELOG.md +15 -0
- {td_task-0.1.4 → td_task-0.2.0}/src/td/__main__.py +187 -16
- {td_task-0.1.4 → td_task-0.2.0}/src/td/db.py +654 -25
- {td_task-0.1.4 → td_task-0.2.0}/src/td/terminal.py +94 -52
- {td_task-0.1.4 → td_task-0.2.0}/src/td/tui.py +690 -65
- td_task-0.2.0/tests/test_cli_notes.py +80 -0
- td_task-0.2.0/tests/test_notes.py +247 -0
- td_task-0.2.0/tests/test_tui_notes.py +279 -0
- {td_task-0.1.4 → td_task-0.2.0}/uv.lock +7 -2
- td_task-0.1.4/.github/workflows/publish.yml +0 -42
- td_task-0.1.4/PKG-INFO +0 -55
- td_task-0.1.4/README.md +0 -45
- {td_task-0.1.4 → td_task-0.2.0}/.python-version +0 -0
- {td_task-0.1.4 → td_task-0.2.0}/src/td/__init__.py +0 -0
td_task-0.2.0/.env.enc
ADDED
|
Binary file
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
workflow_dispatch:
|
|
5
|
+
push:
|
|
6
|
+
tags:
|
|
7
|
+
- 'v*'
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
deploy:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
steps:
|
|
13
|
+
- name: Checkout code
|
|
14
|
+
uses: actions/checkout@v4
|
|
15
|
+
|
|
16
|
+
- name: Install uv
|
|
17
|
+
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
18
|
+
|
|
19
|
+
- name: Install Doppler CLI
|
|
20
|
+
uses: dopplerhq/cli-action@v3
|
|
21
|
+
|
|
22
|
+
- name: Set up Python
|
|
23
|
+
uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: '3.14'
|
|
26
|
+
|
|
27
|
+
- name: Build package
|
|
28
|
+
run: uv build
|
|
29
|
+
|
|
30
|
+
- name: Publish to PyPI
|
|
31
|
+
run: doppler run -- sh -c 'UV_PUBLISH_TOKEN="$PYPI_API" uv publish'
|
|
32
|
+
env:
|
|
33
|
+
DOPPLER_TOKEN: ${{ secrets.DOPPLER_TOKEN }}
|
td_task-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: td-task
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Fast TUI and CLI manager for tasks and Markdown notes
|
|
5
|
+
Requires-Python: >=3.14
|
|
6
|
+
Requires-Dist: cryptography>=42.0.0
|
|
7
|
+
Requires-Dist: rich>=15.0.0
|
|
8
|
+
Provides-Extra: dev-mode
|
|
9
|
+
Requires-Dist: watchdog>=6.0.0; extra == 'dev-mode'
|
|
10
|
+
Description-Content-Type: text/markdown
|
|
11
|
+
|
|
12
|
+
# td
|
|
13
|
+
|
|
14
|
+
A fast, keyboard-driven terminal manager for tasks and Markdown notes. Multi-list,
|
|
15
|
+
encrypted, scriptable, and built for humans and agents.
|
|
16
|
+
|
|
17
|
+

|
|
18
|
+
|
|
19
|
+
## Install
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
uv tool install td-task # recommended
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Or with pip:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
pip install td-task
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Run directly without installing:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
uvx td-task
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
For the `--dev` file watcher, install the optional extra:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
uv tool install 'td-task[dev-mode]'
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Usage
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
td [command] [--list <name>]
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
| Command | Description |
|
|
50
|
+
|---------|-------------|
|
|
51
|
+
| `td` | Open the TUI (defaults to first list) |
|
|
52
|
+
| `td add <text>` | Add a task to a list |
|
|
53
|
+
| `td list` | Print active tasks to stdout |
|
|
54
|
+
| `td notes …` | Create, inspect, update, list, and delete Markdown notes |
|
|
55
|
+
| `td archive` | Open the archive screen |
|
|
56
|
+
| `td export [file]` | Export database to JSON (stdout if no file) |
|
|
57
|
+
| `td import <file>` | Merge a JSON backup into the database |
|
|
58
|
+
| `td update` | Upgrade to the latest version |
|
|
59
|
+
| `td --version` | Print the installed version |
|
|
60
|
+
| `td --help` | Print the help menu |
|
|
61
|
+
|
|
62
|
+
The `-l` / `--list` flag scopes a command to a specific list. It is required for `add`, `list`, and `archive`.
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
td -l work # open TUI locked to the "work" list
|
|
66
|
+
td add "fix the flaky test" -l work
|
|
67
|
+
td list --list work
|
|
68
|
+
td export backup.json
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
### Notes CLI
|
|
72
|
+
|
|
73
|
+
Notes use the same lists, ordering, completion state, archives, and encryption as
|
|
74
|
+
tasks. Every command supports stable note IDs. Add `--json` for structured output.
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
# create with inline Markdown
|
|
78
|
+
td notes add "Release plan" -l work --body $'# Release\n* test\n* ship' --json
|
|
79
|
+
|
|
80
|
+
# create from a file or stdin
|
|
81
|
+
td notes add "Runbook" -l ops --body-file runbook.md
|
|
82
|
+
cat incident.md | td notes add "Incident" -l ops --body-file -
|
|
83
|
+
|
|
84
|
+
# discover and read notes
|
|
85
|
+
td notes list -l work --json
|
|
86
|
+
td notes show 12
|
|
87
|
+
td notes show 12 --json
|
|
88
|
+
|
|
89
|
+
# update title or body
|
|
90
|
+
td notes update 12 --title "Final release plan"
|
|
91
|
+
td notes update 12 --body-file plan.md --json
|
|
92
|
+
|
|
93
|
+
# delete note and its task-backed list item
|
|
94
|
+
td notes delete 12 --json
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
`td notes add` uses the current timestamp when you omit the title. Pass
|
|
98
|
+
`--include-archived` to `td notes list` when agents need archived notes too.
|
|
99
|
+
|
|
100
|
+
## TUI Keybindings
|
|
101
|
+
|
|
102
|
+
### Tasks
|
|
103
|
+
|
|
104
|
+
| Key | Action |
|
|
105
|
+
|-----|--------|
|
|
106
|
+
| `a` | Add new task |
|
|
107
|
+
| `A` | Add a task-backed Markdown note |
|
|
108
|
+
| `e` / `Enter` | Edit selected task or open selected note |
|
|
109
|
+
| `E` | Rename selected note |
|
|
110
|
+
| `d` | Delete selected task |
|
|
111
|
+
| `Space` | Toggle done / active |
|
|
112
|
+
| `s` | Star task (pin to top, bold yellow) |
|
|
113
|
+
| `c` | Archive all completed tasks |
|
|
114
|
+
| `y` | Copy task list to clipboard |
|
|
115
|
+
| `↑` / `k` `↓` / `j` | Navigate tasks |
|
|
116
|
+
| `Ctrl+↑` / `Ctrl+↓` | Reorder task position |
|
|
117
|
+
| `Alt+↑` / `Alt+↓` | Duplicate task above / below |
|
|
118
|
+
| `←` / `→` | Switch to previous / next list |
|
|
119
|
+
| `l` / `Tab` | Open Lists Menu |
|
|
120
|
+
| `Ctrl+P` | Fuzzy-search lists |
|
|
121
|
+
| `,` | Open archive screen |
|
|
122
|
+
| `/` | Open settings |
|
|
123
|
+
| `?` | Help screen |
|
|
124
|
+
| `q` / `Esc` | Quit |
|
|
125
|
+
|
|
126
|
+
### Note Editor
|
|
127
|
+
|
|
128
|
+
| Key | Action |
|
|
129
|
+
|-----|--------|
|
|
130
|
+
| `Esc` | Save and close |
|
|
131
|
+
| `Ctrl+S` | Save without closing |
|
|
132
|
+
| `Enter` | Insert a new line |
|
|
133
|
+
| `Alt+↑` / `Alt+↓` | Move current line up or down |
|
|
134
|
+
| `Cmd+Backspace` on macOS / `Ctrl+Backspace` elsewhere | Clear current line |
|
|
135
|
+
| `Tab` / `Shift+Tab` | Indent or outdent current line |
|
|
136
|
+
| Arrow keys / `Home` / `End` | Move cursor |
|
|
137
|
+
| `Backspace` / `Delete` | Delete text or join lines |
|
|
138
|
+
|
|
139
|
+
The active line shows raw Markdown. Other lines show a live preview. The editor
|
|
140
|
+
supports `#` headings, `*` bullets, `*bold*`, `**bold**`, and `_italic_` text.
|
|
141
|
+
`Alt+Left` / `Alt+Right` moves by word. `Alt+Backspace` deletes one word.
|
|
142
|
+
After a root bullet, `Enter` starts an indented continuation and keeps its bullet
|
|
143
|
+
marker. Press `Enter` or `Backspace` on an empty continuation to leave list mode.
|
|
144
|
+
|
|
145
|
+
### Lists Menu
|
|
146
|
+
|
|
147
|
+
| Key | Action |
|
|
148
|
+
|-----|--------|
|
|
149
|
+
| `Enter` | Switch to highlighted list |
|
|
150
|
+
| `a` | Create new list |
|
|
151
|
+
| `e` | Rename list |
|
|
152
|
+
| `A` | Archive list while preserving its items |
|
|
153
|
+
| `,` | Open archived lists |
|
|
154
|
+
| `d` | Delete list (with all its tasks) |
|
|
155
|
+
| `Shift+↑` / `Shift+↓` | Reorder list position |
|
|
156
|
+
| `↑` / `k` `↓` / `j` | Navigate lists |
|
|
157
|
+
| `q` / `Esc` | Quit |
|
|
158
|
+
|
|
159
|
+
### Archived Lists
|
|
160
|
+
|
|
161
|
+
| Key | Action |
|
|
162
|
+
|-----|--------|
|
|
163
|
+
| `Enter` / `r` | Restore highlighted list |
|
|
164
|
+
| `d` | Permanently delete highlighted list and its items |
|
|
165
|
+
| `↑` / `k` `↓` / `j` | Navigate archived lists |
|
|
166
|
+
| `q` / `Esc` | Return to active lists |
|
|
167
|
+
|
|
168
|
+
### Archive
|
|
169
|
+
|
|
170
|
+
| Key | Action |
|
|
171
|
+
|-----|--------|
|
|
172
|
+
| `↑` / `k` `↓` / `j` | Navigate |
|
|
173
|
+
| `r` | Restore task to active list |
|
|
174
|
+
| `d` | Delete task permanently |
|
|
175
|
+
| `c` | Clear all archived tasks |
|
|
176
|
+
| `q` / `Esc` | Return to tasks |
|
|
177
|
+
|
|
178
|
+
### Settings
|
|
179
|
+
|
|
180
|
+
| Key | Action |
|
|
181
|
+
|-----|--------|
|
|
182
|
+
| `e` / `Enter` | Edit selected setting |
|
|
183
|
+
| `↑` / `↓` | Adjust numeric values (when editing) |
|
|
184
|
+
| `↑` / `k` `↓` / `j` | Navigate settings |
|
|
185
|
+
| `q` / `Esc` | Return |
|
|
186
|
+
|
|
187
|
+
Settings you can change: max tasks per list (3–50), max starred tasks, whole-database
|
|
188
|
+
encryption, current-list encryption, and backup export / import.
|
|
189
|
+
|
|
190
|
+
## Agent-friendly
|
|
191
|
+
|
|
192
|
+
`td` works well as a task layer for AI agents and shell scripts. The CLI commands are designed for scripting:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# add tasks from a script or agent
|
|
196
|
+
td add "review PR #42" -l work
|
|
197
|
+
td add "update dependencies" -l work
|
|
198
|
+
|
|
199
|
+
# read tasks as plain text
|
|
200
|
+
td list -l work
|
|
201
|
+
|
|
202
|
+
# create and query Markdown notes as JSON
|
|
203
|
+
td notes add "PR review" -l work --body "# Findings" --json
|
|
204
|
+
td notes list -l work --json
|
|
205
|
+
td notes show 1 --json
|
|
206
|
+
|
|
207
|
+
# dump the full database as JSON
|
|
208
|
+
td export | jq '.tasks[] | select(.status == "active")'
|
|
209
|
+
|
|
210
|
+
# point at a separate database — useful for testing or sandboxing
|
|
211
|
+
TD_DB_PATH=/tmp/agent.db td add "isolated task" -l inbox
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
The `--help` output is written to be LLM-readable, so agents can self-orient by running `td --help`.
|
|
215
|
+
|
|
216
|
+
## Stack
|
|
217
|
+
|
|
218
|
+
- **Python 3.14+** — application and CLI runtime.
|
|
219
|
+
- **SQLite** — single-file storage for lists, tasks, notes, settings, and encryption metadata.
|
|
220
|
+
- **Rich + raw ANSI terminal I/O** — styled rendering and keyboard input without a TUI framework.
|
|
221
|
+
- **Cryptography** — Fernet encryption with PBKDF2-derived database or per-list keys.
|
|
222
|
+
- **uv + Hatchling** — dependency management, builds, and Python packaging.
|
|
223
|
+
|
|
224
|
+
## Architecture
|
|
225
|
+
|
|
226
|
+
`td` is a single Python package with no framework dependencies:
|
|
227
|
+
|
|
228
|
+
| File | Role |
|
|
229
|
+
|------|------|
|
|
230
|
+
| `__main__.py` | CLI entry point, argument parsing, non-TUI commands |
|
|
231
|
+
| `tui.py` | Raw terminal render loop, all keybinding logic |
|
|
232
|
+
| `db.py` | SQLite layer — all reads and writes go through here |
|
|
233
|
+
| `terminal.py` | Low-level raw mode I/O and key decoding |
|
|
234
|
+
|
|
235
|
+
The TUI uses raw ANSI escape sequences directly rather than Curses or Textual. This keeps startup instant and the binary small.
|
|
236
|
+
|
|
237
|
+
Runtime dependencies: `rich` (terminal rendering), `cryptography` (AES encryption). `watchdog` is optional (`[dev-mode]` extra).
|
|
238
|
+
|
|
239
|
+
Works on macOS, Linux, and Windows. On Windows, use a terminal with ANSI support such as Windows Terminal for the best experience.
|
|
240
|
+
|
|
241
|
+
## Data model
|
|
242
|
+
|
|
243
|
+
Four core tables in a SQLite file:
|
|
244
|
+
|
|
245
|
+
**`lists`** — `name` (PK), `position`, `max_tasks`, `archived_at`
|
|
246
|
+
|
|
247
|
+
**`tasks`** — `id`, `text`, `status` (`active` / `done` / `archived`), `position`, `created_at`, `done_at`, `archived_at`, `starred`, `list_name` (FK → lists, CASCADE DELETE)
|
|
248
|
+
|
|
249
|
+
**`notes`** — `id`, `task_id` (unique FK → tasks, CASCADE DELETE), `title`, `content`, `created_at`, `updated_at`
|
|
250
|
+
|
|
251
|
+
**`list_encryption`** — `list_name` (PK/FK → lists), `encryption_salt`, `password_verifier`
|
|
252
|
+
|
|
253
|
+
Each note attaches to a task. It therefore shares task ordering, completion,
|
|
254
|
+
starring, archiving, and list membership. Note names appear underlined in lists.
|
|
255
|
+
Deleting a task or list also deletes attached notes through cascades.
|
|
256
|
+
|
|
257
|
+
Archived lists keep all tasks and notes. They disappear from normal navigation
|
|
258
|
+
until restored from the Lists Menu.
|
|
259
|
+
|
|
260
|
+
## Portability
|
|
261
|
+
|
|
262
|
+
Everything lives in `~/.td.db` — a single SQLite file you can copy, back up, or move between machines.
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
# override the database path
|
|
266
|
+
export TD_DB_PATH=~/Dropbox/td.db
|
|
267
|
+
|
|
268
|
+
# back up
|
|
269
|
+
td export > backup.json
|
|
270
|
+
|
|
271
|
+
# restore on another machine
|
|
272
|
+
td import backup.json
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
You can encrypt the whole database or only the current list from settings (`/`).
|
|
276
|
+
Each encrypted list uses its own password-derived key. Tasks and note bodies stay
|
|
277
|
+
encrypted in JSON backups. Whole-database and per-list encryption cannot run
|
|
278
|
+
together. If you forget a password, there is no recovery.
|
td_task-0.2.0/README.md
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
# td
|
|
2
|
+
|
|
3
|
+
A fast, keyboard-driven terminal manager for tasks and Markdown notes. Multi-list,
|
|
4
|
+
encrypted, scriptable, and built for humans and agents.
|
|
5
|
+
|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
## Install
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
uv tool install td-task # recommended
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Or with pip:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
pip install td-task
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Run directly without installing:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
uvx td-task
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
For the `--dev` file watcher, install the optional extra:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
uv tool install 'td-task[dev-mode]'
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
td [command] [--list <name>]
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
| Command | Description |
|
|
39
|
+
|---------|-------------|
|
|
40
|
+
| `td` | Open the TUI (defaults to first list) |
|
|
41
|
+
| `td add <text>` | Add a task to a list |
|
|
42
|
+
| `td list` | Print active tasks to stdout |
|
|
43
|
+
| `td notes …` | Create, inspect, update, list, and delete Markdown notes |
|
|
44
|
+
| `td archive` | Open the archive screen |
|
|
45
|
+
| `td export [file]` | Export database to JSON (stdout if no file) |
|
|
46
|
+
| `td import <file>` | Merge a JSON backup into the database |
|
|
47
|
+
| `td update` | Upgrade to the latest version |
|
|
48
|
+
| `td --version` | Print the installed version |
|
|
49
|
+
| `td --help` | Print the help menu |
|
|
50
|
+
|
|
51
|
+
The `-l` / `--list` flag scopes a command to a specific list. It is required for `add`, `list`, and `archive`.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
td -l work # open TUI locked to the "work" list
|
|
55
|
+
td add "fix the flaky test" -l work
|
|
56
|
+
td list --list work
|
|
57
|
+
td export backup.json
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### Notes CLI
|
|
61
|
+
|
|
62
|
+
Notes use the same lists, ordering, completion state, archives, and encryption as
|
|
63
|
+
tasks. Every command supports stable note IDs. Add `--json` for structured output.
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
# create with inline Markdown
|
|
67
|
+
td notes add "Release plan" -l work --body $'# Release\n* test\n* ship' --json
|
|
68
|
+
|
|
69
|
+
# create from a file or stdin
|
|
70
|
+
td notes add "Runbook" -l ops --body-file runbook.md
|
|
71
|
+
cat incident.md | td notes add "Incident" -l ops --body-file -
|
|
72
|
+
|
|
73
|
+
# discover and read notes
|
|
74
|
+
td notes list -l work --json
|
|
75
|
+
td notes show 12
|
|
76
|
+
td notes show 12 --json
|
|
77
|
+
|
|
78
|
+
# update title or body
|
|
79
|
+
td notes update 12 --title "Final release plan"
|
|
80
|
+
td notes update 12 --body-file plan.md --json
|
|
81
|
+
|
|
82
|
+
# delete note and its task-backed list item
|
|
83
|
+
td notes delete 12 --json
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
`td notes add` uses the current timestamp when you omit the title. Pass
|
|
87
|
+
`--include-archived` to `td notes list` when agents need archived notes too.
|
|
88
|
+
|
|
89
|
+
## TUI Keybindings
|
|
90
|
+
|
|
91
|
+
### Tasks
|
|
92
|
+
|
|
93
|
+
| Key | Action |
|
|
94
|
+
|-----|--------|
|
|
95
|
+
| `a` | Add new task |
|
|
96
|
+
| `A` | Add a task-backed Markdown note |
|
|
97
|
+
| `e` / `Enter` | Edit selected task or open selected note |
|
|
98
|
+
| `E` | Rename selected note |
|
|
99
|
+
| `d` | Delete selected task |
|
|
100
|
+
| `Space` | Toggle done / active |
|
|
101
|
+
| `s` | Star task (pin to top, bold yellow) |
|
|
102
|
+
| `c` | Archive all completed tasks |
|
|
103
|
+
| `y` | Copy task list to clipboard |
|
|
104
|
+
| `↑` / `k` `↓` / `j` | Navigate tasks |
|
|
105
|
+
| `Ctrl+↑` / `Ctrl+↓` | Reorder task position |
|
|
106
|
+
| `Alt+↑` / `Alt+↓` | Duplicate task above / below |
|
|
107
|
+
| `←` / `→` | Switch to previous / next list |
|
|
108
|
+
| `l` / `Tab` | Open Lists Menu |
|
|
109
|
+
| `Ctrl+P` | Fuzzy-search lists |
|
|
110
|
+
| `,` | Open archive screen |
|
|
111
|
+
| `/` | Open settings |
|
|
112
|
+
| `?` | Help screen |
|
|
113
|
+
| `q` / `Esc` | Quit |
|
|
114
|
+
|
|
115
|
+
### Note Editor
|
|
116
|
+
|
|
117
|
+
| Key | Action |
|
|
118
|
+
|-----|--------|
|
|
119
|
+
| `Esc` | Save and close |
|
|
120
|
+
| `Ctrl+S` | Save without closing |
|
|
121
|
+
| `Enter` | Insert a new line |
|
|
122
|
+
| `Alt+↑` / `Alt+↓` | Move current line up or down |
|
|
123
|
+
| `Cmd+Backspace` on macOS / `Ctrl+Backspace` elsewhere | Clear current line |
|
|
124
|
+
| `Tab` / `Shift+Tab` | Indent or outdent current line |
|
|
125
|
+
| Arrow keys / `Home` / `End` | Move cursor |
|
|
126
|
+
| `Backspace` / `Delete` | Delete text or join lines |
|
|
127
|
+
|
|
128
|
+
The active line shows raw Markdown. Other lines show a live preview. The editor
|
|
129
|
+
supports `#` headings, `*` bullets, `*bold*`, `**bold**`, and `_italic_` text.
|
|
130
|
+
`Alt+Left` / `Alt+Right` moves by word. `Alt+Backspace` deletes one word.
|
|
131
|
+
After a root bullet, `Enter` starts an indented continuation and keeps its bullet
|
|
132
|
+
marker. Press `Enter` or `Backspace` on an empty continuation to leave list mode.
|
|
133
|
+
|
|
134
|
+
### Lists Menu
|
|
135
|
+
|
|
136
|
+
| Key | Action |
|
|
137
|
+
|-----|--------|
|
|
138
|
+
| `Enter` | Switch to highlighted list |
|
|
139
|
+
| `a` | Create new list |
|
|
140
|
+
| `e` | Rename list |
|
|
141
|
+
| `A` | Archive list while preserving its items |
|
|
142
|
+
| `,` | Open archived lists |
|
|
143
|
+
| `d` | Delete list (with all its tasks) |
|
|
144
|
+
| `Shift+↑` / `Shift+↓` | Reorder list position |
|
|
145
|
+
| `↑` / `k` `↓` / `j` | Navigate lists |
|
|
146
|
+
| `q` / `Esc` | Quit |
|
|
147
|
+
|
|
148
|
+
### Archived Lists
|
|
149
|
+
|
|
150
|
+
| Key | Action |
|
|
151
|
+
|-----|--------|
|
|
152
|
+
| `Enter` / `r` | Restore highlighted list |
|
|
153
|
+
| `d` | Permanently delete highlighted list and its items |
|
|
154
|
+
| `↑` / `k` `↓` / `j` | Navigate archived lists |
|
|
155
|
+
| `q` / `Esc` | Return to active lists |
|
|
156
|
+
|
|
157
|
+
### Archive
|
|
158
|
+
|
|
159
|
+
| Key | Action |
|
|
160
|
+
|-----|--------|
|
|
161
|
+
| `↑` / `k` `↓` / `j` | Navigate |
|
|
162
|
+
| `r` | Restore task to active list |
|
|
163
|
+
| `d` | Delete task permanently |
|
|
164
|
+
| `c` | Clear all archived tasks |
|
|
165
|
+
| `q` / `Esc` | Return to tasks |
|
|
166
|
+
|
|
167
|
+
### Settings
|
|
168
|
+
|
|
169
|
+
| Key | Action |
|
|
170
|
+
|-----|--------|
|
|
171
|
+
| `e` / `Enter` | Edit selected setting |
|
|
172
|
+
| `↑` / `↓` | Adjust numeric values (when editing) |
|
|
173
|
+
| `↑` / `k` `↓` / `j` | Navigate settings |
|
|
174
|
+
| `q` / `Esc` | Return |
|
|
175
|
+
|
|
176
|
+
Settings you can change: max tasks per list (3–50), max starred tasks, whole-database
|
|
177
|
+
encryption, current-list encryption, and backup export / import.
|
|
178
|
+
|
|
179
|
+
## Agent-friendly
|
|
180
|
+
|
|
181
|
+
`td` works well as a task layer for AI agents and shell scripts. The CLI commands are designed for scripting:
|
|
182
|
+
|
|
183
|
+
```bash
|
|
184
|
+
# add tasks from a script or agent
|
|
185
|
+
td add "review PR #42" -l work
|
|
186
|
+
td add "update dependencies" -l work
|
|
187
|
+
|
|
188
|
+
# read tasks as plain text
|
|
189
|
+
td list -l work
|
|
190
|
+
|
|
191
|
+
# create and query Markdown notes as JSON
|
|
192
|
+
td notes add "PR review" -l work --body "# Findings" --json
|
|
193
|
+
td notes list -l work --json
|
|
194
|
+
td notes show 1 --json
|
|
195
|
+
|
|
196
|
+
# dump the full database as JSON
|
|
197
|
+
td export | jq '.tasks[] | select(.status == "active")'
|
|
198
|
+
|
|
199
|
+
# point at a separate database — useful for testing or sandboxing
|
|
200
|
+
TD_DB_PATH=/tmp/agent.db td add "isolated task" -l inbox
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
The `--help` output is written to be LLM-readable, so agents can self-orient by running `td --help`.
|
|
204
|
+
|
|
205
|
+
## Stack
|
|
206
|
+
|
|
207
|
+
- **Python 3.14+** — application and CLI runtime.
|
|
208
|
+
- **SQLite** — single-file storage for lists, tasks, notes, settings, and encryption metadata.
|
|
209
|
+
- **Rich + raw ANSI terminal I/O** — styled rendering and keyboard input without a TUI framework.
|
|
210
|
+
- **Cryptography** — Fernet encryption with PBKDF2-derived database or per-list keys.
|
|
211
|
+
- **uv + Hatchling** — dependency management, builds, and Python packaging.
|
|
212
|
+
|
|
213
|
+
## Architecture
|
|
214
|
+
|
|
215
|
+
`td` is a single Python package with no framework dependencies:
|
|
216
|
+
|
|
217
|
+
| File | Role |
|
|
218
|
+
|------|------|
|
|
219
|
+
| `__main__.py` | CLI entry point, argument parsing, non-TUI commands |
|
|
220
|
+
| `tui.py` | Raw terminal render loop, all keybinding logic |
|
|
221
|
+
| `db.py` | SQLite layer — all reads and writes go through here |
|
|
222
|
+
| `terminal.py` | Low-level raw mode I/O and key decoding |
|
|
223
|
+
|
|
224
|
+
The TUI uses raw ANSI escape sequences directly rather than Curses or Textual. This keeps startup instant and the binary small.
|
|
225
|
+
|
|
226
|
+
Runtime dependencies: `rich` (terminal rendering), `cryptography` (AES encryption). `watchdog` is optional (`[dev-mode]` extra).
|
|
227
|
+
|
|
228
|
+
Works on macOS, Linux, and Windows. On Windows, use a terminal with ANSI support such as Windows Terminal for the best experience.
|
|
229
|
+
|
|
230
|
+
## Data model
|
|
231
|
+
|
|
232
|
+
Four core tables in a SQLite file:
|
|
233
|
+
|
|
234
|
+
**`lists`** — `name` (PK), `position`, `max_tasks`, `archived_at`
|
|
235
|
+
|
|
236
|
+
**`tasks`** — `id`, `text`, `status` (`active` / `done` / `archived`), `position`, `created_at`, `done_at`, `archived_at`, `starred`, `list_name` (FK → lists, CASCADE DELETE)
|
|
237
|
+
|
|
238
|
+
**`notes`** — `id`, `task_id` (unique FK → tasks, CASCADE DELETE), `title`, `content`, `created_at`, `updated_at`
|
|
239
|
+
|
|
240
|
+
**`list_encryption`** — `list_name` (PK/FK → lists), `encryption_salt`, `password_verifier`
|
|
241
|
+
|
|
242
|
+
Each note attaches to a task. It therefore shares task ordering, completion,
|
|
243
|
+
starring, archiving, and list membership. Note names appear underlined in lists.
|
|
244
|
+
Deleting a task or list also deletes attached notes through cascades.
|
|
245
|
+
|
|
246
|
+
Archived lists keep all tasks and notes. They disappear from normal navigation
|
|
247
|
+
until restored from the Lists Menu.
|
|
248
|
+
|
|
249
|
+
## Portability
|
|
250
|
+
|
|
251
|
+
Everything lives in `~/.td.db` — a single SQLite file you can copy, back up, or move between machines.
|
|
252
|
+
|
|
253
|
+
```bash
|
|
254
|
+
# override the database path
|
|
255
|
+
export TD_DB_PATH=~/Dropbox/td.db
|
|
256
|
+
|
|
257
|
+
# back up
|
|
258
|
+
td export > backup.json
|
|
259
|
+
|
|
260
|
+
# restore on another machine
|
|
261
|
+
td import backup.json
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
You can encrypt the whole database or only the current list from settings (`/`).
|
|
265
|
+
Each encrypted list uses its own password-derived key. Tasks and note bodies stay
|
|
266
|
+
encrypted in JSON backups. Whole-database and per-list encryption cannot run
|
|
267
|
+
together. If you forget a password, there is no recovery.
|
|
Binary file
|
td_task-0.2.0/demo.tape
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
Output assets/demo.gif
|
|
2
|
+
|
|
3
|
+
Set Shell "bash"
|
|
4
|
+
Set FontSize 14
|
|
5
|
+
Set Width 680
|
|
6
|
+
Set Height 360
|
|
7
|
+
Set Theme "Catppuccin Mocha"
|
|
8
|
+
Set Padding 16
|
|
9
|
+
Set TypingSpeed 70ms
|
|
10
|
+
Set PlaybackSpeed 0.85
|
|
11
|
+
|
|
12
|
+
# Warm up, set env, clear before Show
|
|
13
|
+
Hide
|
|
14
|
+
Type "export TD_DB_PATH=/tmp/td_demo.db && rm -f $TD_DB_PATH && td --version > /dev/null 2>&1 && clear"
|
|
15
|
+
Enter
|
|
16
|
+
Sleep 3s
|
|
17
|
+
Show
|
|
18
|
+
|
|
19
|
+
# Launch the TUI — env var already set in Hide
|
|
20
|
+
Type "td -l work"
|
|
21
|
+
Enter
|
|
22
|
+
Sleep 1400ms
|
|
23
|
+
|
|
24
|
+
# Add three tasks
|
|
25
|
+
Type "a"
|
|
26
|
+
Sleep 300ms
|
|
27
|
+
Type "design API endpoints"
|
|
28
|
+
Enter
|
|
29
|
+
Sleep 400ms
|
|
30
|
+
|
|
31
|
+
Type "a"
|
|
32
|
+
Sleep 300ms
|
|
33
|
+
Type "write unit tests"
|
|
34
|
+
Enter
|
|
35
|
+
Sleep 400ms
|
|
36
|
+
|
|
37
|
+
Type "a"
|
|
38
|
+
Sleep 300ms
|
|
39
|
+
Type "deploy to staging"
|
|
40
|
+
Enter
|
|
41
|
+
Sleep 600ms
|
|
42
|
+
|
|
43
|
+
# Star the top task
|
|
44
|
+
Up
|
|
45
|
+
Up
|
|
46
|
+
Type "s"
|
|
47
|
+
Sleep 600ms
|
|
48
|
+
|
|
49
|
+
# Toggle middle task done
|
|
50
|
+
Down
|
|
51
|
+
Type " "
|
|
52
|
+
Sleep 1200ms
|
|
53
|
+
|
|
54
|
+
# Quit
|
|
55
|
+
Type "q"
|
|
56
|
+
Sleep 300ms
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "td-task"
|
|
3
|
-
version = "0.
|
|
4
|
-
description = "
|
|
3
|
+
version = "0.2.0"
|
|
4
|
+
description = "Fast TUI and CLI manager for tasks and Markdown notes"
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
requires-python = ">=3.14"
|
|
7
7
|
dependencies = [
|
|
8
8
|
"rich>=15.0.0",
|
|
9
|
-
"watchdog>=6.0.0",
|
|
10
9
|
"cryptography>=42.0.0",
|
|
11
10
|
]
|
|
12
11
|
|
|
12
|
+
[project.optional-dependencies]
|
|
13
|
+
dev-mode = ["watchdog>=6.0.0"]
|
|
14
|
+
|
|
13
15
|
[project.scripts]
|
|
14
16
|
td = "td.__main__:main"
|
|
15
17
|
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.0] - 2026-08-03
|
|
4
|
+
- Add task-backed Markdown notes with a full-screen editor and live line preview.
|
|
5
|
+
- Add `A` to create notes, `e`/`Enter` to edit note bodies, and `E` to rename notes.
|
|
6
|
+
- Include notes in encryption, JSON backup and restore, list ordering, and task lifecycle actions.
|
|
7
|
+
- Add line movement, line clearing, word navigation, word deletion, and indentation controls to the note editor.
|
|
8
|
+
- Add restorable list archiving with preserved tasks, notes, settings, and JSON backup state.
|
|
9
|
+
- Auto-indent and continue Markdown bullets; exit empty continuation with Enter or Backspace.
|
|
10
|
+
- Add independent password encryption per list with portable encrypted backups and lazy unlock prompts.
|
|
11
|
+
- Add agent-friendly notes CLI with CRUD actions, JSON output, and file or stdin bodies.
|
|
12
|
+
|
|
13
|
+
## [0.1.5]
|
|
14
|
+
- Fix Windows keyboard input: arrow keys, Home/End, Delete, and Ctrl/Alt+arrow now work by decoding the native Windows scancode protocol instead of assuming ANSI escape sequences.
|
|
15
|
+
- Fix clipboard copy (`y`) on Windows by using the `clip` command.
|
|
16
|
+
- Gracefully degrade if a console cannot enable virtual terminal mode, instead of crashing on startup.
|
|
17
|
+
|
|
3
18
|
## [0.1.4]
|
|
4
19
|
- Fix list-scoped max tasks limit not being respected when adding or duplicating tasks in the TUI.
|
|
5
20
|
|