simple-project-tracker 1.0.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.
- simple_project_tracker-1.0.0/LICENSE +21 -0
- simple_project_tracker-1.0.0/PKG-INFO +174 -0
- simple_project_tracker-1.0.0/README.md +142 -0
- simple_project_tracker-1.0.0/pyproject.toml +111 -0
- simple_project_tracker-1.0.0/setup.cfg +4 -0
- simple_project_tracker-1.0.0/simple_project_tracker.egg-info/PKG-INFO +174 -0
- simple_project_tracker-1.0.0/simple_project_tracker.egg-info/SOURCES.txt +65 -0
- simple_project_tracker-1.0.0/simple_project_tracker.egg-info/dependency_links.txt +1 -0
- simple_project_tracker-1.0.0/simple_project_tracker.egg-info/entry_points.txt +3 -0
- simple_project_tracker-1.0.0/simple_project_tracker.egg-info/top_level.txt +1 -0
- simple_project_tracker-1.0.0/tests/test_cli.py +269 -0
- simple_project_tracker-1.0.0/tests/test_commands.py +252 -0
- simple_project_tracker-1.0.0/tests/test_daemon.py +138 -0
- simple_project_tracker-1.0.0/tests/test_details.py +106 -0
- simple_project_tracker-1.0.0/tests/test_frecency.py +151 -0
- simple_project_tracker-1.0.0/tests/test_help.py +89 -0
- simple_project_tracker-1.0.0/tests/test_keys.py +76 -0
- simple_project_tracker-1.0.0/tests/test_labels.py +144 -0
- simple_project_tracker-1.0.0/tests/test_moves.py +195 -0
- simple_project_tracker-1.0.0/tests/test_names.py +130 -0
- simple_project_tracker-1.0.0/tests/test_render.py +318 -0
- simple_project_tracker-1.0.0/tests/test_selection.py +461 -0
- simple_project_tracker-1.0.0/tests/test_settings.py +218 -0
- simple_project_tracker-1.0.0/tests/test_storage.py +160 -0
- simple_project_tracker-1.0.0/tests/test_undo.py +141 -0
- simple_project_tracker-1.0.0/tests/test_view.py +182 -0
- simple_project_tracker-1.0.0/tracker/__init__.py +5 -0
- simple_project_tracker-1.0.0/tracker/__main__.py +6 -0
- simple_project_tracker-1.0.0/tracker/cli/__init__.py +0 -0
- simple_project_tracker-1.0.0/tracker/cli/app.py +393 -0
- simple_project_tracker-1.0.0/tracker/cli/commands.py +1297 -0
- simple_project_tracker-1.0.0/tracker/config/__init__.py +0 -0
- simple_project_tracker-1.0.0/tracker/config/defaults.py +180 -0
- simple_project_tracker-1.0.0/tracker/config/keys.py +110 -0
- simple_project_tracker-1.0.0/tracker/config/metadata.py +81 -0
- simple_project_tracker-1.0.0/tracker/config/paths.py +172 -0
- simple_project_tracker-1.0.0/tracker/config/settings.py +246 -0
- simple_project_tracker-1.0.0/tracker/config/writer.py +113 -0
- simple_project_tracker-1.0.0/tracker/core/__init__.py +0 -0
- simple_project_tracker-1.0.0/tracker/core/daemon.py +613 -0
- simple_project_tracker-1.0.0/tracker/core/discovery.py +212 -0
- simple_project_tracker-1.0.0/tracker/core/frecency.py +142 -0
- simple_project_tracker-1.0.0/tracker/core/identity.py +121 -0
- simple_project_tracker-1.0.0/tracker/core/inspect.py +382 -0
- simple_project_tracker-1.0.0/tracker/core/labels.py +109 -0
- simple_project_tracker-1.0.0/tracker/core/models.py +152 -0
- simple_project_tracker-1.0.0/tracker/core/selection.py +646 -0
- simple_project_tracker-1.0.0/tracker/core/storage.py +59 -0
- simple_project_tracker-1.0.0/tracker/core/undo.py +63 -0
- simple_project_tracker-1.0.0/tracker/core/view.py +48 -0
- simple_project_tracker-1.0.0/tracker/py.typed +0 -0
- simple_project_tracker-1.0.0/tracker/share/completion.bash +7 -0
- simple_project_tracker-1.0.0/tracker/share/completion.fish +12 -0
- simple_project_tracker-1.0.0/tracker/share/completion.zsh +13 -0
- simple_project_tracker-1.0.0/tracker/share/help.txt +523 -0
- simple_project_tracker-1.0.0/tracker/share/settings.toml +245 -0
- simple_project_tracker-1.0.0/tracker/ui/__init__.py +0 -0
- simple_project_tracker-1.0.0/tracker/ui/ansi.py +128 -0
- simple_project_tracker-1.0.0/tracker/ui/ask.py +21 -0
- simple_project_tracker-1.0.0/tracker/ui/details.py +172 -0
- simple_project_tracker-1.0.0/tracker/ui/help.py +234 -0
- simple_project_tracker-1.0.0/tracker/ui/render.py +548 -0
- simple_project_tracker-1.0.0/tracker/util/__init__.py +0 -0
- simple_project_tracker-1.0.0/tracker/util/compat.py +17 -0
- simple_project_tracker-1.0.0/tracker/util/files.py +118 -0
- simple_project_tracker-1.0.0/tracker/util/text.py +303 -0
- simple_project_tracker-1.0.0/tracker/util/unknown.py +48 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 MattFor
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: simple-project-tracker
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Simple project tracker
|
|
5
|
+
Author-email: MattFor <mattfor@relaxy.xyz>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/MattFor/tracker
|
|
8
|
+
Project-URL: Source, https://github.com/MattFor/tracker
|
|
9
|
+
Project-URL: Mirror, https://codeberg.org/MattFor/tracker
|
|
10
|
+
Project-URL: Issues, https://github.com/MattFor/tracker/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/MattFor/tracker/blob/master/CHANGELOG.md
|
|
12
|
+
Keywords: cli,projects,git,tracker
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Natural Language :: English
|
|
17
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
18
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
24
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
25
|
+
Classifier: Topic :: Software Development
|
|
26
|
+
Classifier: Topic :: Utilities
|
|
27
|
+
Classifier: Typing :: Typed
|
|
28
|
+
Requires-Python: >=3.11
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
License-File: LICENSE
|
|
31
|
+
Dynamic: license-file
|
|
32
|
+
|
|
33
|
+
# simple-project-tracker
|
|
34
|
+
|
|
35
|
+
[](https://www.python.org/downloads/)
|
|
36
|
+
[](LICENSE)
|
|
37
|
+
|
|
38
|
+
A simple, but very customizable tracker to keep track of your projects, their states and
|
|
39
|
+
your notes on them.
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
TID | ID | NAME | STATUS | LAST TOUCHED | NOTE
|
|
43
|
+
--- | -- | ----------------------------- | ------- | ------------ | ---------------------
|
|
44
|
+
1 | 8 | tracker | dev | 1m ago | release 1.0.0 today
|
|
45
|
+
2 | 3 | von-neumann-machine-simulator | dev | 23m ago | review saturday
|
|
46
|
+
3 | 26 | discord-profile-studio | stable | 1h ago
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Contents
|
|
50
|
+
|
|
51
|
+
- [Install](#install)
|
|
52
|
+
- [Commands](#commands)
|
|
53
|
+
- [Selecting projects](#selecting-projects)
|
|
54
|
+
- [Configuration](#configuration)
|
|
55
|
+
- [Development](#development)
|
|
56
|
+
- [License](#license)
|
|
57
|
+
|
|
58
|
+
## Install
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
./install.sh # ~/.local
|
|
62
|
+
sudo ./install.sh # /usr/local
|
|
63
|
+
./install.sh --daemon # also install the daemon autostart entry
|
|
64
|
+
./install.sh --uninstall
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Python 3.11+. Then `t init ~/(your project directory)` to fill the database.
|
|
68
|
+
|
|
69
|
+
## Commands
|
|
70
|
+
|
|
71
|
+
| Command | Aliases | What it does |
|
|
72
|
+
|--------------|-------------------|----------------------------------------------------------------------|
|
|
73
|
+
| `list` | `l`, `ls` | List projects, with search, regex, filters and setting overrides |
|
|
74
|
+
| `check` | `c`, `cc`, `info` | Everything about a project: git state, size, language, version, note |
|
|
75
|
+
| `add` | `a` | Track a project, or scan a directory and track what is inside |
|
|
76
|
+
| `remove` | `rm`, `r`, `del` | Stop tracking projects (files untouched) |
|
|
77
|
+
| `forget` | `ignore` | Stop tracking and keep scans from finding it again |
|
|
78
|
+
| `edit` | `e` | Change a `status` or a `note` |
|
|
79
|
+
| `note` | `n`, `sn` | Set a note without naming the field |
|
|
80
|
+
| `status` | `st`, `ss` | List statuses, set one, or move every project from one to another |
|
|
81
|
+
| `init` | `i`, `scan` | Scan a directory and merge the result into the database |
|
|
82
|
+
| `path` | `p`, `where` | Print a project's path, e.g. `cd "$(t path tracker)"` |
|
|
83
|
+
| `undo` | `u`, `revert` | Take back the last change, undo again to put it back |
|
|
84
|
+
| `stats` | `summary` | Totals, a breakdown by status, most and least recently touched |
|
|
85
|
+
| `settings` | `s`, `config` | Show, edit, get or set the configuration |
|
|
86
|
+
| `completion` | | Print a shell completion script for bash, zsh or fish |
|
|
87
|
+
| `daemon` | `d`, `bg` | `start`, `stop`, `restart`, `status`, `log`, `run` |
|
|
88
|
+
|
|
89
|
+
The project goes before or after the command, whichever reads better, and a command fuses
|
|
90
|
+
with its own action:
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
t 12 es blocked # edit status also: t edit 12 status blocked
|
|
94
|
+
t 12 sn review sunday # set note also: t note 12 review sunday
|
|
95
|
+
t dst # daemon status
|
|
96
|
+
t sset ll 30 # settings set display.list_limit 30
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
A bare word defaults to a project lookup.
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
t tra # the check view for tracker
|
|
103
|
+
t stable # nothing is called that, so every stable project
|
|
104
|
+
t all # everything, no limit
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
For more information do: `t help`, `t help <command>` or `t help <topic>`. The full guide
|
|
108
|
+
is within `man tracker`.
|
|
109
|
+
|
|
110
|
+
## Selecting projects
|
|
111
|
+
|
|
112
|
+
| Selector | Means |
|
|
113
|
+
|-------------|-----------------------------------------------------------|
|
|
114
|
+
| `12` | ID or TID 12 |
|
|
115
|
+
| `i:12` | The permanent ID, `id:` and `#12` too |
|
|
116
|
+
| `t:12` | The temporary ID, `tid:`, `@12` and `:12` too |
|
|
117
|
+
| `3-7`,`5+3` | A range, either direction, or a project and the next few |
|
|
118
|
+
| `s:blocked` | Every project with that status, `st:` and `status:` too |
|
|
119
|
+
| `name` | Exact or partial name, or a path, tab completion included |
|
|
120
|
+
| `all` | Every tracked project |
|
|
121
|
+
|
|
122
|
+
A temporary ID is the index of the latest output.
|
|
123
|
+
|
|
124
|
+
When a partial name matches several projects, it's settled by
|
|
125
|
+
`projects.conflict_resolution_preference`.
|
|
126
|
+
|
|
127
|
+
## Configuration
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
t settings # everything (default deviations marked)
|
|
131
|
+
t settings edit # open in $EDITOR
|
|
132
|
+
t sset list_limit 30 # rewrites that one line
|
|
133
|
+
t list ll=5 rt=true # override for one command only
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
A setting can be named in full, by its bare name, by a prefix, by the start of every word
|
|
137
|
+
or by its initials, with the section shortening the same way: `display.list_limit`,
|
|
138
|
+
`list_limit`, `list_lim`, `l_l`, `ll`, `d.ll`. Ambiguities are reported.
|
|
139
|
+
|
|
140
|
+
| Setting | What it does |
|
|
141
|
+
|-------------------------------------|-------------------------------------------------------------|
|
|
142
|
+
| `display.filter` | Filters every listing, e.g. `["-s:archive"]` |
|
|
143
|
+
| `display.columns`, `display.format` | Which columns, or a row layout of your own |
|
|
144
|
+
| `display.relative_times` | `2 days ago` instead of a timestamp |
|
|
145
|
+
| `display.name_max_width` | Shorten long names, `truncate` or `abbreviate` |
|
|
146
|
+
| `sorting.by`, `sorting.direction` | `last_touched`, `last_used`, `name`, `status`, `id`, `path` |
|
|
147
|
+
| `projects.ignore`, `.ignore_files` | Directories and files that never count as your own work |
|
|
148
|
+
| `projects.auto_status` | Status from how long ago a project was touched |
|
|
149
|
+
| `scan.detect_moves` | A moved project keeps its entry instead of looking deleted |
|
|
150
|
+
| `daemon.paths`, `daemon.interval` | What the background scanner watches, and how often |
|
|
151
|
+
|
|
152
|
+
Notes can colour themselves: `t note 12 {red}broken{/} since friday`.
|
|
153
|
+
|
|
154
|
+
## Development
|
|
155
|
+
|
|
156
|
+
```sh
|
|
157
|
+
make dev # editable install plus ruff, basedpyright, pytest
|
|
158
|
+
make check # format, lint, types and tests (what CI runs)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Disclosure
|
|
162
|
+
|
|
163
|
+
LLMs were used to:
|
|
164
|
+
|
|
165
|
+
- write the help section
|
|
166
|
+
- write the man page
|
|
167
|
+
- check for critical issues and annotation errors
|
|
168
|
+
|
|
169
|
+
HOWEVER, the output was then manually reviewed and issues were fixed by a human.
|
|
170
|
+
|
|
171
|
+
## License
|
|
172
|
+
|
|
173
|
+
MIT [LICENSE](LICENSE).
|
|
174
|
+
By MattFor.
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# simple-project-tracker
|
|
2
|
+
|
|
3
|
+
[](https://www.python.org/downloads/)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
|
|
6
|
+
A simple, but very customizable tracker to keep track of your projects, their states and
|
|
7
|
+
your notes on them.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
TID | ID | NAME | STATUS | LAST TOUCHED | NOTE
|
|
11
|
+
--- | -- | ----------------------------- | ------- | ------------ | ---------------------
|
|
12
|
+
1 | 8 | tracker | dev | 1m ago | release 1.0.0 today
|
|
13
|
+
2 | 3 | von-neumann-machine-simulator | dev | 23m ago | review saturday
|
|
14
|
+
3 | 26 | discord-profile-studio | stable | 1h ago
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Contents
|
|
18
|
+
|
|
19
|
+
- [Install](#install)
|
|
20
|
+
- [Commands](#commands)
|
|
21
|
+
- [Selecting projects](#selecting-projects)
|
|
22
|
+
- [Configuration](#configuration)
|
|
23
|
+
- [Development](#development)
|
|
24
|
+
- [License](#license)
|
|
25
|
+
|
|
26
|
+
## Install
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
./install.sh # ~/.local
|
|
30
|
+
sudo ./install.sh # /usr/local
|
|
31
|
+
./install.sh --daemon # also install the daemon autostart entry
|
|
32
|
+
./install.sh --uninstall
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Python 3.11+. Then `t init ~/(your project directory)` to fill the database.
|
|
36
|
+
|
|
37
|
+
## Commands
|
|
38
|
+
|
|
39
|
+
| Command | Aliases | What it does |
|
|
40
|
+
|--------------|-------------------|----------------------------------------------------------------------|
|
|
41
|
+
| `list` | `l`, `ls` | List projects, with search, regex, filters and setting overrides |
|
|
42
|
+
| `check` | `c`, `cc`, `info` | Everything about a project: git state, size, language, version, note |
|
|
43
|
+
| `add` | `a` | Track a project, or scan a directory and track what is inside |
|
|
44
|
+
| `remove` | `rm`, `r`, `del` | Stop tracking projects (files untouched) |
|
|
45
|
+
| `forget` | `ignore` | Stop tracking and keep scans from finding it again |
|
|
46
|
+
| `edit` | `e` | Change a `status` or a `note` |
|
|
47
|
+
| `note` | `n`, `sn` | Set a note without naming the field |
|
|
48
|
+
| `status` | `st`, `ss` | List statuses, set one, or move every project from one to another |
|
|
49
|
+
| `init` | `i`, `scan` | Scan a directory and merge the result into the database |
|
|
50
|
+
| `path` | `p`, `where` | Print a project's path, e.g. `cd "$(t path tracker)"` |
|
|
51
|
+
| `undo` | `u`, `revert` | Take back the last change, undo again to put it back |
|
|
52
|
+
| `stats` | `summary` | Totals, a breakdown by status, most and least recently touched |
|
|
53
|
+
| `settings` | `s`, `config` | Show, edit, get or set the configuration |
|
|
54
|
+
| `completion` | | Print a shell completion script for bash, zsh or fish |
|
|
55
|
+
| `daemon` | `d`, `bg` | `start`, `stop`, `restart`, `status`, `log`, `run` |
|
|
56
|
+
|
|
57
|
+
The project goes before or after the command, whichever reads better, and a command fuses
|
|
58
|
+
with its own action:
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
t 12 es blocked # edit status also: t edit 12 status blocked
|
|
62
|
+
t 12 sn review sunday # set note also: t note 12 review sunday
|
|
63
|
+
t dst # daemon status
|
|
64
|
+
t sset ll 30 # settings set display.list_limit 30
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
A bare word defaults to a project lookup.
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
t tra # the check view for tracker
|
|
71
|
+
t stable # nothing is called that, so every stable project
|
|
72
|
+
t all # everything, no limit
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
For more information do: `t help`, `t help <command>` or `t help <topic>`. The full guide
|
|
76
|
+
is within `man tracker`.
|
|
77
|
+
|
|
78
|
+
## Selecting projects
|
|
79
|
+
|
|
80
|
+
| Selector | Means |
|
|
81
|
+
|-------------|-----------------------------------------------------------|
|
|
82
|
+
| `12` | ID or TID 12 |
|
|
83
|
+
| `i:12` | The permanent ID, `id:` and `#12` too |
|
|
84
|
+
| `t:12` | The temporary ID, `tid:`, `@12` and `:12` too |
|
|
85
|
+
| `3-7`,`5+3` | A range, either direction, or a project and the next few |
|
|
86
|
+
| `s:blocked` | Every project with that status, `st:` and `status:` too |
|
|
87
|
+
| `name` | Exact or partial name, or a path, tab completion included |
|
|
88
|
+
| `all` | Every tracked project |
|
|
89
|
+
|
|
90
|
+
A temporary ID is the index of the latest output.
|
|
91
|
+
|
|
92
|
+
When a partial name matches several projects, it's settled by
|
|
93
|
+
`projects.conflict_resolution_preference`.
|
|
94
|
+
|
|
95
|
+
## Configuration
|
|
96
|
+
|
|
97
|
+
```sh
|
|
98
|
+
t settings # everything (default deviations marked)
|
|
99
|
+
t settings edit # open in $EDITOR
|
|
100
|
+
t sset list_limit 30 # rewrites that one line
|
|
101
|
+
t list ll=5 rt=true # override for one command only
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
A setting can be named in full, by its bare name, by a prefix, by the start of every word
|
|
105
|
+
or by its initials, with the section shortening the same way: `display.list_limit`,
|
|
106
|
+
`list_limit`, `list_lim`, `l_l`, `ll`, `d.ll`. Ambiguities are reported.
|
|
107
|
+
|
|
108
|
+
| Setting | What it does |
|
|
109
|
+
|-------------------------------------|-------------------------------------------------------------|
|
|
110
|
+
| `display.filter` | Filters every listing, e.g. `["-s:archive"]` |
|
|
111
|
+
| `display.columns`, `display.format` | Which columns, or a row layout of your own |
|
|
112
|
+
| `display.relative_times` | `2 days ago` instead of a timestamp |
|
|
113
|
+
| `display.name_max_width` | Shorten long names, `truncate` or `abbreviate` |
|
|
114
|
+
| `sorting.by`, `sorting.direction` | `last_touched`, `last_used`, `name`, `status`, `id`, `path` |
|
|
115
|
+
| `projects.ignore`, `.ignore_files` | Directories and files that never count as your own work |
|
|
116
|
+
| `projects.auto_status` | Status from how long ago a project was touched |
|
|
117
|
+
| `scan.detect_moves` | A moved project keeps its entry instead of looking deleted |
|
|
118
|
+
| `daemon.paths`, `daemon.interval` | What the background scanner watches, and how often |
|
|
119
|
+
|
|
120
|
+
Notes can colour themselves: `t note 12 {red}broken{/} since friday`.
|
|
121
|
+
|
|
122
|
+
## Development
|
|
123
|
+
|
|
124
|
+
```sh
|
|
125
|
+
make dev # editable install plus ruff, basedpyright, pytest
|
|
126
|
+
make check # format, lint, types and tests (what CI runs)
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Disclosure
|
|
130
|
+
|
|
131
|
+
LLMs were used to:
|
|
132
|
+
|
|
133
|
+
- write the help section
|
|
134
|
+
- write the man page
|
|
135
|
+
- check for critical issues and annotation errors
|
|
136
|
+
|
|
137
|
+
HOWEVER, the output was then manually reviewed and issues were fixed by a human.
|
|
138
|
+
|
|
139
|
+
## License
|
|
140
|
+
|
|
141
|
+
MIT [LICENSE](LICENSE).
|
|
142
|
+
By MattFor.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=77.0.3", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "simple-project-tracker"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Simple project tracker"
|
|
9
|
+
readme = "README.md"
|
|
10
|
+
requires-python = ">=3.11"
|
|
11
|
+
keywords = ["cli", "projects", "git", "tracker"]
|
|
12
|
+
|
|
13
|
+
authors = [
|
|
14
|
+
{ name = "MattFor", email = "mattfor@relaxy.xyz" }
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
license = "MIT"
|
|
18
|
+
license-files = ["LICENSE"]
|
|
19
|
+
|
|
20
|
+
classifiers = [
|
|
21
|
+
"Development Status :: 4 - Beta",
|
|
22
|
+
"Environment :: Console",
|
|
23
|
+
"Intended Audience :: Developers",
|
|
24
|
+
"Natural Language :: English",
|
|
25
|
+
"Operating System :: POSIX :: Linux",
|
|
26
|
+
"Operating System :: MacOS :: MacOS X",
|
|
27
|
+
"Programming Language :: Python :: 3",
|
|
28
|
+
"Programming Language :: Python :: 3.11",
|
|
29
|
+
"Programming Language :: Python :: 3.12",
|
|
30
|
+
"Programming Language :: Python :: 3.13",
|
|
31
|
+
"Programming Language :: Python :: 3.14",
|
|
32
|
+
"Programming Language :: Python :: Implementation :: CPython",
|
|
33
|
+
"Topic :: Software Development",
|
|
34
|
+
"Topic :: Utilities",
|
|
35
|
+
"Typing :: Typed",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
dependencies = []
|
|
39
|
+
|
|
40
|
+
[project.urls]
|
|
41
|
+
Homepage = "https://github.com/MattFor/tracker"
|
|
42
|
+
Source = "https://github.com/MattFor/tracker"
|
|
43
|
+
Mirror = "https://codeberg.org/MattFor/tracker"
|
|
44
|
+
Issues = "https://github.com/MattFor/tracker/issues"
|
|
45
|
+
Changelog = "https://github.com/MattFor/tracker/blob/master/CHANGELOG.md"
|
|
46
|
+
|
|
47
|
+
[project.scripts]
|
|
48
|
+
tracker = "tracker.cli.app:main"
|
|
49
|
+
t = "tracker.cli.app:main"
|
|
50
|
+
|
|
51
|
+
[tool.setuptools.packages.find]
|
|
52
|
+
where = ["."]
|
|
53
|
+
include = ["tracker*"]
|
|
54
|
+
|
|
55
|
+
[tool.setuptools.package-data]
|
|
56
|
+
tracker = ["py.typed", "share/*.toml", "share/*.txt", "share/completion.*"]
|
|
57
|
+
|
|
58
|
+
[dependency-groups]
|
|
59
|
+
dev = [
|
|
60
|
+
"ruff",
|
|
61
|
+
"basedpyright",
|
|
62
|
+
"pytest>=9.0.2"
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
[tool.ruff]
|
|
66
|
+
line-length = 90
|
|
67
|
+
indent-width = 4
|
|
68
|
+
|
|
69
|
+
[tool.ruff.format]
|
|
70
|
+
indent-style = "tab"
|
|
71
|
+
quote-style = "double"
|
|
72
|
+
line-ending = "auto"
|
|
73
|
+
skip-magic-trailing-comma = false
|
|
74
|
+
|
|
75
|
+
[tool.ruff.lint]
|
|
76
|
+
select = [
|
|
77
|
+
"E4", "E7", "E9", # pycodestyle: real mistakes, not whitespace taste
|
|
78
|
+
"F", # pyflakes
|
|
79
|
+
"B", # bugbear
|
|
80
|
+
"C4", # comprehensions
|
|
81
|
+
"PIE", # misc lint
|
|
82
|
+
"SIM", # simplify
|
|
83
|
+
"UP", # pyupgrade
|
|
84
|
+
"ARG", # unused arguments
|
|
85
|
+
"PLE", "PLW", # pylint errors and warnings
|
|
86
|
+
"FURB", # modernisation
|
|
87
|
+
"RUF", # ruff specific
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
[tool.ruff.lint.pycodestyle]
|
|
91
|
+
max-line-length = 90
|
|
92
|
+
|
|
93
|
+
[tool.pytest.ini_options]
|
|
94
|
+
testpaths = ["tests"]
|
|
95
|
+
addopts = "--strict-markers --strict-config"
|
|
96
|
+
xfail_strict = true
|
|
97
|
+
|
|
98
|
+
[tool.basedpyright]
|
|
99
|
+
include = ["tracker", "tests", "main.py"]
|
|
100
|
+
exclude = ["**/__pycache__", ".venv", "build", "dist"]
|
|
101
|
+
|
|
102
|
+
pythonVersion = "3.12"
|
|
103
|
+
|
|
104
|
+
reportAny = false
|
|
105
|
+
reportExplicitAny = false
|
|
106
|
+
reportPrivateUsage = false
|
|
107
|
+
reportImportCycles = false
|
|
108
|
+
reportUnknownMemberType = false
|
|
109
|
+
reportUnknownArgumentType = false
|
|
110
|
+
reportUnknownVariableType = false
|
|
111
|
+
reportUnknownParameterType = false
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: simple-project-tracker
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Simple project tracker
|
|
5
|
+
Author-email: MattFor <mattfor@relaxy.xyz>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/MattFor/tracker
|
|
8
|
+
Project-URL: Source, https://github.com/MattFor/tracker
|
|
9
|
+
Project-URL: Mirror, https://codeberg.org/MattFor/tracker
|
|
10
|
+
Project-URL: Issues, https://github.com/MattFor/tracker/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/MattFor/tracker/blob/master/CHANGELOG.md
|
|
12
|
+
Keywords: cli,projects,git,tracker
|
|
13
|
+
Classifier: Development Status :: 4 - Beta
|
|
14
|
+
Classifier: Environment :: Console
|
|
15
|
+
Classifier: Intended Audience :: Developers
|
|
16
|
+
Classifier: Natural Language :: English
|
|
17
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
18
|
+
Classifier: Operating System :: MacOS :: MacOS X
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
24
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
25
|
+
Classifier: Topic :: Software Development
|
|
26
|
+
Classifier: Topic :: Utilities
|
|
27
|
+
Classifier: Typing :: Typed
|
|
28
|
+
Requires-Python: >=3.11
|
|
29
|
+
Description-Content-Type: text/markdown
|
|
30
|
+
License-File: LICENSE
|
|
31
|
+
Dynamic: license-file
|
|
32
|
+
|
|
33
|
+
# simple-project-tracker
|
|
34
|
+
|
|
35
|
+
[](https://www.python.org/downloads/)
|
|
36
|
+
[](LICENSE)
|
|
37
|
+
|
|
38
|
+
A simple, but very customizable tracker to keep track of your projects, their states and
|
|
39
|
+
your notes on them.
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
TID | ID | NAME | STATUS | LAST TOUCHED | NOTE
|
|
43
|
+
--- | -- | ----------------------------- | ------- | ------------ | ---------------------
|
|
44
|
+
1 | 8 | tracker | dev | 1m ago | release 1.0.0 today
|
|
45
|
+
2 | 3 | von-neumann-machine-simulator | dev | 23m ago | review saturday
|
|
46
|
+
3 | 26 | discord-profile-studio | stable | 1h ago
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Contents
|
|
50
|
+
|
|
51
|
+
- [Install](#install)
|
|
52
|
+
- [Commands](#commands)
|
|
53
|
+
- [Selecting projects](#selecting-projects)
|
|
54
|
+
- [Configuration](#configuration)
|
|
55
|
+
- [Development](#development)
|
|
56
|
+
- [License](#license)
|
|
57
|
+
|
|
58
|
+
## Install
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
./install.sh # ~/.local
|
|
62
|
+
sudo ./install.sh # /usr/local
|
|
63
|
+
./install.sh --daemon # also install the daemon autostart entry
|
|
64
|
+
./install.sh --uninstall
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Python 3.11+. Then `t init ~/(your project directory)` to fill the database.
|
|
68
|
+
|
|
69
|
+
## Commands
|
|
70
|
+
|
|
71
|
+
| Command | Aliases | What it does |
|
|
72
|
+
|--------------|-------------------|----------------------------------------------------------------------|
|
|
73
|
+
| `list` | `l`, `ls` | List projects, with search, regex, filters and setting overrides |
|
|
74
|
+
| `check` | `c`, `cc`, `info` | Everything about a project: git state, size, language, version, note |
|
|
75
|
+
| `add` | `a` | Track a project, or scan a directory and track what is inside |
|
|
76
|
+
| `remove` | `rm`, `r`, `del` | Stop tracking projects (files untouched) |
|
|
77
|
+
| `forget` | `ignore` | Stop tracking and keep scans from finding it again |
|
|
78
|
+
| `edit` | `e` | Change a `status` or a `note` |
|
|
79
|
+
| `note` | `n`, `sn` | Set a note without naming the field |
|
|
80
|
+
| `status` | `st`, `ss` | List statuses, set one, or move every project from one to another |
|
|
81
|
+
| `init` | `i`, `scan` | Scan a directory and merge the result into the database |
|
|
82
|
+
| `path` | `p`, `where` | Print a project's path, e.g. `cd "$(t path tracker)"` |
|
|
83
|
+
| `undo` | `u`, `revert` | Take back the last change, undo again to put it back |
|
|
84
|
+
| `stats` | `summary` | Totals, a breakdown by status, most and least recently touched |
|
|
85
|
+
| `settings` | `s`, `config` | Show, edit, get or set the configuration |
|
|
86
|
+
| `completion` | | Print a shell completion script for bash, zsh or fish |
|
|
87
|
+
| `daemon` | `d`, `bg` | `start`, `stop`, `restart`, `status`, `log`, `run` |
|
|
88
|
+
|
|
89
|
+
The project goes before or after the command, whichever reads better, and a command fuses
|
|
90
|
+
with its own action:
|
|
91
|
+
|
|
92
|
+
```sh
|
|
93
|
+
t 12 es blocked # edit status also: t edit 12 status blocked
|
|
94
|
+
t 12 sn review sunday # set note also: t note 12 review sunday
|
|
95
|
+
t dst # daemon status
|
|
96
|
+
t sset ll 30 # settings set display.list_limit 30
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
A bare word defaults to a project lookup.
|
|
100
|
+
|
|
101
|
+
```sh
|
|
102
|
+
t tra # the check view for tracker
|
|
103
|
+
t stable # nothing is called that, so every stable project
|
|
104
|
+
t all # everything, no limit
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
For more information do: `t help`, `t help <command>` or `t help <topic>`. The full guide
|
|
108
|
+
is within `man tracker`.
|
|
109
|
+
|
|
110
|
+
## Selecting projects
|
|
111
|
+
|
|
112
|
+
| Selector | Means |
|
|
113
|
+
|-------------|-----------------------------------------------------------|
|
|
114
|
+
| `12` | ID or TID 12 |
|
|
115
|
+
| `i:12` | The permanent ID, `id:` and `#12` too |
|
|
116
|
+
| `t:12` | The temporary ID, `tid:`, `@12` and `:12` too |
|
|
117
|
+
| `3-7`,`5+3` | A range, either direction, or a project and the next few |
|
|
118
|
+
| `s:blocked` | Every project with that status, `st:` and `status:` too |
|
|
119
|
+
| `name` | Exact or partial name, or a path, tab completion included |
|
|
120
|
+
| `all` | Every tracked project |
|
|
121
|
+
|
|
122
|
+
A temporary ID is the index of the latest output.
|
|
123
|
+
|
|
124
|
+
When a partial name matches several projects, it's settled by
|
|
125
|
+
`projects.conflict_resolution_preference`.
|
|
126
|
+
|
|
127
|
+
## Configuration
|
|
128
|
+
|
|
129
|
+
```sh
|
|
130
|
+
t settings # everything (default deviations marked)
|
|
131
|
+
t settings edit # open in $EDITOR
|
|
132
|
+
t sset list_limit 30 # rewrites that one line
|
|
133
|
+
t list ll=5 rt=true # override for one command only
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
A setting can be named in full, by its bare name, by a prefix, by the start of every word
|
|
137
|
+
or by its initials, with the section shortening the same way: `display.list_limit`,
|
|
138
|
+
`list_limit`, `list_lim`, `l_l`, `ll`, `d.ll`. Ambiguities are reported.
|
|
139
|
+
|
|
140
|
+
| Setting | What it does |
|
|
141
|
+
|-------------------------------------|-------------------------------------------------------------|
|
|
142
|
+
| `display.filter` | Filters every listing, e.g. `["-s:archive"]` |
|
|
143
|
+
| `display.columns`, `display.format` | Which columns, or a row layout of your own |
|
|
144
|
+
| `display.relative_times` | `2 days ago` instead of a timestamp |
|
|
145
|
+
| `display.name_max_width` | Shorten long names, `truncate` or `abbreviate` |
|
|
146
|
+
| `sorting.by`, `sorting.direction` | `last_touched`, `last_used`, `name`, `status`, `id`, `path` |
|
|
147
|
+
| `projects.ignore`, `.ignore_files` | Directories and files that never count as your own work |
|
|
148
|
+
| `projects.auto_status` | Status from how long ago a project was touched |
|
|
149
|
+
| `scan.detect_moves` | A moved project keeps its entry instead of looking deleted |
|
|
150
|
+
| `daemon.paths`, `daemon.interval` | What the background scanner watches, and how often |
|
|
151
|
+
|
|
152
|
+
Notes can colour themselves: `t note 12 {red}broken{/} since friday`.
|
|
153
|
+
|
|
154
|
+
## Development
|
|
155
|
+
|
|
156
|
+
```sh
|
|
157
|
+
make dev # editable install plus ruff, basedpyright, pytest
|
|
158
|
+
make check # format, lint, types and tests (what CI runs)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Disclosure
|
|
162
|
+
|
|
163
|
+
LLMs were used to:
|
|
164
|
+
|
|
165
|
+
- write the help section
|
|
166
|
+
- write the man page
|
|
167
|
+
- check for critical issues and annotation errors
|
|
168
|
+
|
|
169
|
+
HOWEVER, the output was then manually reviewed and issues were fixed by a human.
|
|
170
|
+
|
|
171
|
+
## License
|
|
172
|
+
|
|
173
|
+
MIT [LICENSE](LICENSE).
|
|
174
|
+
By MattFor.
|