Files
LLS/README.md
T
alejo 35c568333d Exit prompt
Cause: any answer other than y was treated as no, so your t discarded the changes.
Fix: the prompt now only accepts y (save), n (discard) or c (cancel the exit). Anything else asks again, so a typo can't lose data. In my test, t, an empty line, then y saved correctly.
Also: I changed the db restore confirmation to y/n only, with no cancel option. Closing stdin still saves automatically.

Wait without a time

tsk restat <task> wait: works with no time while the task's account is still waiting, and the task just follows that wait. tsk add <task> <acc> wait works the same way.
Time required: otherwise it asks for one, with a message saying why. That covers an account that isn't waiting, an account whose wait is already over (Limit reset), and a task with no account.
acc wait: it still requires a time. A plain acc wait would have nothing to do, since the account already has a wait.

Account panel: there's a new RESET column showing when the account's wait ends. It shows 16:30 for today, tomorrow 06:40 for the next day, or a full date like 2020-01-01 10:00 (which is how an old, already-reset wait appears). Accounts with no wait show -. Since the time is in its own column now, an account with a wait but no task showing it lists just (wait) or (limit reset) in the TASKS column.
2026-10-24 09:18:43 -03:00

108 lines
5.4 KiB
Markdown

# LLS
Interactive C++17 / SQLite task + account tracker. Type commands at the `>` prompt.
## Build
Requires CMake >= 3.14 and a C++17 compiler. SQLite is taken from the system if
installed; otherwise CMake downloads the amalgamation (needs network once).
# optional, system SQLite:
# Debian/Ubuntu: sudo apt install libsqlite3-dev
# Fedora: sudo dnf install sqlite-devel
# Arch: sudo pacman -S sqlite
cmake -S . -B build
cmake --build build
./build/lls [database-file] # default: tasks.db
## Commands
acc add <name> tsk add <name> [acc] [status]
acc del <name> tsk del <name>
acc rename <name> <new> tsk rename <name> <new>
acc wait <name> <time> tsk reacc <name> <new|->
acc unwait <name> tsk restat <name> <new>
acc ls tsk notes <name> (opens your editor)
tsk ls
disp tsk (hide|show)
disp tsk level (hide|show) (prompt|limit-reset|testing|wait|uploading|frozen|done|all)
disp acc (hide|show)
disp acc level (hide|show) (busy|taken|free|all)
disp (show current settings)
db save | db backup [file] | db restore <file>
editor [command | default] (show / set the editor used by tsk notes)
help | quit
Names containing spaces go in double quotes: `tsk add "Breeze A" Acrux testing`.
## Statuses and times
`prompt` (free to accept prompts), `limit-reset`, `testing`, `wait <time>`,
`uploading`, `frozen`, `done`. `limit-reset` is normally computed: a `wait`
task shows as `Limit reset` once its time has passed (it can also be set by
hand; `limit reset` with a space works too). Old databases that say
`available` are converted to `prompt` on load.
Times may be 24-hour or 12-hour: `wait 16:30`, `wait 4:30pm`, `wait 4 pm`,
`wait 12:05am`. Without am/pm the time is read as 24-hour (`6:40` = 06:40).
A time that has already passed today is stored as tomorrow.
## Prompt keys
Up/Down history (saved between sessions), Left/Right/Home/End editing,
Ctrl-Left/Right word jump, Tab completion (commands, task and account names,
statuses, levels, editors, file paths; press Tab twice-ish to list options),
Ctrl-A/E, Ctrl-U/K/W, Ctrl-L clear, Ctrl-C cancel line, Ctrl-D quit.
Pressing Enter on an empty line redraws the panels (waits expire with time).
## Editor
`tsk notes <name>` opens the notes in an external editor. Use `editor nvim`
(or `vim`, `vi`, `nano`, `code --wait`, ...) to choose one; `editor default`
goes back to `$VISUAL` / `$EDITOR` / nano / vim / vi. The choice is stored in
`~/.config/task_tracker/config` (history is in the same folder).
## How it works
* Data lives in an in-memory SQLite database. `db save` writes it to the file,
`db backup` writes a copy, `db restore` loads a file. On `quit` you are asked
to save if there are unsaved changes (`y` save, `n` discard, `c` cancel the
exit); any other answer asks again, so a mistyped key never loses data.
* The stored status is never shown directly: a `wait` task displays as
`Wait HH:MM` until that time passes, then as `Limit reset`. Tasks are sorted
by computed status (Limit reset, Testing, Prompt, Wait, Uploading, Frozen,
Done); Wait and Limit reset tasks then sort by time (earliest first: when
the wait ends / ended), then account A-Z (unassigned last), then name. The panels are cleared and redrawn after changes.
* Account panel: the RESET column is when the account's wait ends (`16:30`,
`tomorrow 06:40`, or a full date); `-` if it has none. One row per account, judged by its tasks: `Busy` if any is
Testing, Limit reset or Wait; else `Taken` if any is Prompt; else `Free`
(only Done, Frozen or Uploading tasks, or no tasks). The TASKS column lists
the tasks at that level, so a Free account shows its Uploading, Frozen and
Done tasks (`-` if it has none). Rows are sorted most free first: Free, Taken, Busy;
within Taken and Busy fewer tasks first, ties by name (see `levelOf` in `Display.cpp` and
`StatusUtil::isBusy` / `isTaken` to change the rules).
* Waits belong to the account: `acc wait <name> <time>` (or `tsk restat <task> wait
<time>`, which sets its account's wait). Until the time the account's Prompt
and Testing tasks show `Wait HH:MM`; after it they show `Limit reset`, until
you run `acc unwait <name>`, which also clears a stale one. Uploading, Frozen
and Done tasks are not affected, and the tasks keep their own stored status
underneath. A wait that no task shows (no tasks, or only Done / Frozen /
Uploading ones) is listed in the account row as `(wait HH:MM)` or
`(limit reset)` and keeps the account Busy. Tasks without an account keep
their own wait.
* A time is only optional while the account is already waiting: then
`tsk restat <task> wait` (or `tsk add <task> <acc> wait`) just makes the task
follow that wait. Otherwise (no account, or its wait is over) a time is
required. Old databases with per-task waits are converted on load.
* Deleting an account leaves its tasks unassigned (`-`).
* Names are case-insensitive; the original spelling is kept.
* Notes live in the database (SQLite TEXT, binary-safe, SQLite's default limit is ~1 GB). The task table shows `-` when a task has no notes, otherwise the number of lines (e.g. `3 lines`); open them with `tsk notes <name>`.
## Layout
include/ headers (declarations only, no inline definitions)
src/ implementations