Name | thunter JSON |
Version |
0.2.0
JSON |
| download |
home_page | None |
Summary | A CLI To Do list w/ time tracking. |
upload_time | 2025-08-21 19:31:25 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.10 |
license | None |
keywords |
cli
task
todo
tracking
|
VCS |
 |
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
# Thunter
`thunter`, or task hunter, is a CLI To Do list with time tracking.
The purpose of `thunter` is to get better at time estimation, hence why you cannot create a task without a time estimate.
I made ths CLI tool so that I could piggy back off my pre-existing git workflows to estimate and track time spent on tasks.
See [git/thunter workflow](#my-gitthunter-workflow) for git hooks and aliases you can use to do the same.
<img src="img/create_task-pauses-removed.gif">
## Installation
Via pip
```
pip install thunter
```
Or via uv
```
uv tool install thunter
```
## Usage
The `thunter` CLI tool has commands for:
* `create` - create a new task and estimate it's length
* `workon` / `stop` to start and stop tracking time spent on a task
* `thunter workon --create <task_name>` will create the task if needed and then start tracking time on it
* `finish` / `restart` to mark a task as completed or to undo that action and restart it
* `estimate` to update your estimate
* `edit` to edit any aspect of a task, including it's history
* `rm` to delete/remove tasks
* `db` will start a sqlite3 session with the thunter database. `tasks` and `history` are the 2 tables
### Configuration options
Environment variables (see [settings.py](thunter/settings.py)):
- `EDITOR` - editor to use for `thunter edit` command
- `THUNTER_DIRECTORY` - directory to store thunter files, e.g. the sqlite database of tasks
- `THUNTER_DATABASE_NAME` - filename of the database
- `THUNTER_SILENT` - silent all console output. set to true, 1, yes, or y. Useful for scripting. Commands all have the `--silent` option as well for the same effect.
- `DEBUG` - get stack traces on errors. Useful for development
## My git/thunter workflow
With the below hook and aliases:
* checking out a branch will start tracking time spent on it
* checking out `main` will stop tracking time
* deleting a branch will mark the task as finished
### *post-checkout*
```
#!/bin/bash
branch_name=$(git rev-parse --abbrev-ref HEAD)
is_branch_switch=$3
if [[ "$is_branch_switch" == "1" ]]; then
if [[ "$branch_name" == "main" || "$branch_name" == "master" ]]; then
# `hash thunter 2>/dev/null` is a check for the existence of thunter before calling it
hash thunter 2>/dev/null && thunter stop
else
# `< /dev/tty` is needed to accept the user's time estimate input
hash thunter 2>/dev/null && thunter workon --create "$branch_name" < /dev/tty
fi
fi
```
### Git Aliases
```
## ~/.gitconfig
[alias]
s = "!git status && hash thunter 2>/dev/null && if [ \"$(git rev-parse --abbrev-ref HEAD)\" = \"main\" ]; then THUNTER_SILENT=1 thunter stop; else THUNTER_SILENT=1 thunter workon --create $(git rev-parse --abbrev-ref HEAD); fi"
bd = ! git branch -d $1 && hash thunter 2>/dev/null && THUNTER_SILENT=1 thunter finish
bdd = ! git branch -D $1 && hash thunter 2>/dev/null && THUNTER_SILENT=1 thunter finish
```
# Coming Soon
`thunter analyze` command that will give options for some basic data analysis on how accurate your time estimates are.
Raw data
{
"_id": null,
"home_page": null,
"name": "thunter",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": "Alejandro Frias <joker454@gmail.com>",
"keywords": "cli, task, todo, tracking",
"author": null,
"author_email": "Alejandro Frias <joker454@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/e1/97/1498f07618869b1d4922371e0702671f82ec89a5b5db18a8b8dcda3a5500/thunter-0.2.0.tar.gz",
"platform": null,
"description": "# Thunter\n\n`thunter`, or task hunter, is a CLI To Do list with time tracking.\n\nThe purpose of `thunter` is to get better at time estimation, hence why you cannot create a task without a time estimate.\n\nI made ths CLI tool so that I could piggy back off my pre-existing git workflows to estimate and track time spent on tasks.\nSee [git/thunter workflow](#my-gitthunter-workflow) for git hooks and aliases you can use to do the same.\n\n<img src=\"img/create_task-pauses-removed.gif\">\n\n## Installation\n\nVia pip\n```\npip install thunter\n```\n\nOr via uv\n```\nuv tool install thunter\n```\n\n## Usage\n\n\nThe `thunter` CLI tool has commands for:\n* `create` - create a new task and estimate it's length\n* `workon` / `stop` to start and stop tracking time spent on a task\n * `thunter workon --create <task_name>` will create the task if needed and then start tracking time on it\n* `finish` / `restart` to mark a task as completed or to undo that action and restart it\n* `estimate` to update your estimate\n* `edit` to edit any aspect of a task, including it's history\n* `rm` to delete/remove tasks\n* `db` will start a sqlite3 session with the thunter database. `tasks` and `history` are the 2 tables\n\n### Configuration options\nEnvironment variables (see [settings.py](thunter/settings.py)):\n- `EDITOR` - editor to use for `thunter edit` command\n- `THUNTER_DIRECTORY` - directory to store thunter files, e.g. the sqlite database of tasks\n- `THUNTER_DATABASE_NAME` - filename of the database\n- `THUNTER_SILENT` - silent all console output. set to true, 1, yes, or y. Useful for scripting. Commands all have the `--silent` option as well for the same effect.\n- `DEBUG` - get stack traces on errors. Useful for development\n\n\n## My git/thunter workflow\n\nWith the below hook and aliases:\n* checking out a branch will start tracking time spent on it\n* checking out `main` will stop tracking time\n* deleting a branch will mark the task as finished\n\n### *post-checkout*\n```\n#!/bin/bash\nbranch_name=$(git rev-parse --abbrev-ref HEAD)\nis_branch_switch=$3\nif [[ \"$is_branch_switch\" == \"1\" ]]; then\n if [[ \"$branch_name\" == \"main\" || \"$branch_name\" == \"master\" ]]; then\n # `hash thunter 2>/dev/null` is a check for the existence of thunter before calling it\n hash thunter 2>/dev/null && thunter stop\n else\n # `< /dev/tty` is needed to accept the user's time estimate input\n hash thunter 2>/dev/null && thunter workon --create \"$branch_name\" < /dev/tty\n fi\nfi\n```\n\n### Git Aliases\n\n```\n## ~/.gitconfig\n\n[alias]\n s = \"!git status && hash thunter 2>/dev/null && if [ \\\"$(git rev-parse --abbrev-ref HEAD)\\\" = \\\"main\\\" ]; then THUNTER_SILENT=1 thunter stop; else THUNTER_SILENT=1 thunter workon --create $(git rev-parse --abbrev-ref HEAD); fi\"\n bd = ! git branch -d $1 && hash thunter 2>/dev/null && THUNTER_SILENT=1 thunter finish\n bdd = ! git branch -D $1 && hash thunter 2>/dev/null && THUNTER_SILENT=1 thunter finish\n```\n\n# Coming Soon\n\n`thunter analyze` command that will give options for some basic data analysis on how accurate your time estimates are.\n",
"bugtrack_url": null,
"license": null,
"summary": "A CLI To Do list w/ time tracking.",
"version": "0.2.0",
"project_urls": {
"Issues": "https://github.com/AlejandroFrias/thunter/issues",
"Source": "https://github.com/AlejandroFrias/thunter"
},
"split_keywords": [
"cli",
" task",
" todo",
" tracking"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "5805da4aba4b441965beb0a8273a5325efa8143aa81ead2ba09c206e738fc448",
"md5": "fab0242935661a5c59f7e159c7475092",
"sha256": "9746341bd118660358d0eb440a17d3c9e0f0a034c55681621d27fe5d089646c6"
},
"downloads": -1,
"filename": "thunter-0.2.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "fab0242935661a5c59f7e159c7475092",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 36695,
"upload_time": "2025-08-21T19:31:23",
"upload_time_iso_8601": "2025-08-21T19:31:23.695700Z",
"url": "https://files.pythonhosted.org/packages/58/05/da4aba4b441965beb0a8273a5325efa8143aa81ead2ba09c206e738fc448/thunter-0.2.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e1971498f07618869b1d4922371e0702671f82ec89a5b5db18a8b8dcda3a5500",
"md5": "8daf835123858312e9422542f4bd16cf",
"sha256": "d36def8f353ef3467df795872243c25e3711ac3645982408dbece6a3d5f01f05"
},
"downloads": -1,
"filename": "thunter-0.2.0.tar.gz",
"has_sig": false,
"md5_digest": "8daf835123858312e9422542f4bd16cf",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 301077,
"upload_time": "2025-08-21T19:31:25",
"upload_time_iso_8601": "2025-08-21T19:31:25.342497Z",
"url": "https://files.pythonhosted.org/packages/e1/97/1498f07618869b1d4922371e0702671f82ec89a5b5db18a8b8dcda3a5500/thunter-0.2.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-08-21 19:31:25",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "AlejandroFrias",
"github_project": "thunter",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "thunter"
}