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.
Files changed (67) hide show
  1. simple_project_tracker-1.0.0/LICENSE +21 -0
  2. simple_project_tracker-1.0.0/PKG-INFO +174 -0
  3. simple_project_tracker-1.0.0/README.md +142 -0
  4. simple_project_tracker-1.0.0/pyproject.toml +111 -0
  5. simple_project_tracker-1.0.0/setup.cfg +4 -0
  6. simple_project_tracker-1.0.0/simple_project_tracker.egg-info/PKG-INFO +174 -0
  7. simple_project_tracker-1.0.0/simple_project_tracker.egg-info/SOURCES.txt +65 -0
  8. simple_project_tracker-1.0.0/simple_project_tracker.egg-info/dependency_links.txt +1 -0
  9. simple_project_tracker-1.0.0/simple_project_tracker.egg-info/entry_points.txt +3 -0
  10. simple_project_tracker-1.0.0/simple_project_tracker.egg-info/top_level.txt +1 -0
  11. simple_project_tracker-1.0.0/tests/test_cli.py +269 -0
  12. simple_project_tracker-1.0.0/tests/test_commands.py +252 -0
  13. simple_project_tracker-1.0.0/tests/test_daemon.py +138 -0
  14. simple_project_tracker-1.0.0/tests/test_details.py +106 -0
  15. simple_project_tracker-1.0.0/tests/test_frecency.py +151 -0
  16. simple_project_tracker-1.0.0/tests/test_help.py +89 -0
  17. simple_project_tracker-1.0.0/tests/test_keys.py +76 -0
  18. simple_project_tracker-1.0.0/tests/test_labels.py +144 -0
  19. simple_project_tracker-1.0.0/tests/test_moves.py +195 -0
  20. simple_project_tracker-1.0.0/tests/test_names.py +130 -0
  21. simple_project_tracker-1.0.0/tests/test_render.py +318 -0
  22. simple_project_tracker-1.0.0/tests/test_selection.py +461 -0
  23. simple_project_tracker-1.0.0/tests/test_settings.py +218 -0
  24. simple_project_tracker-1.0.0/tests/test_storage.py +160 -0
  25. simple_project_tracker-1.0.0/tests/test_undo.py +141 -0
  26. simple_project_tracker-1.0.0/tests/test_view.py +182 -0
  27. simple_project_tracker-1.0.0/tracker/__init__.py +5 -0
  28. simple_project_tracker-1.0.0/tracker/__main__.py +6 -0
  29. simple_project_tracker-1.0.0/tracker/cli/__init__.py +0 -0
  30. simple_project_tracker-1.0.0/tracker/cli/app.py +393 -0
  31. simple_project_tracker-1.0.0/tracker/cli/commands.py +1297 -0
  32. simple_project_tracker-1.0.0/tracker/config/__init__.py +0 -0
  33. simple_project_tracker-1.0.0/tracker/config/defaults.py +180 -0
  34. simple_project_tracker-1.0.0/tracker/config/keys.py +110 -0
  35. simple_project_tracker-1.0.0/tracker/config/metadata.py +81 -0
  36. simple_project_tracker-1.0.0/tracker/config/paths.py +172 -0
  37. simple_project_tracker-1.0.0/tracker/config/settings.py +246 -0
  38. simple_project_tracker-1.0.0/tracker/config/writer.py +113 -0
  39. simple_project_tracker-1.0.0/tracker/core/__init__.py +0 -0
  40. simple_project_tracker-1.0.0/tracker/core/daemon.py +613 -0
  41. simple_project_tracker-1.0.0/tracker/core/discovery.py +212 -0
  42. simple_project_tracker-1.0.0/tracker/core/frecency.py +142 -0
  43. simple_project_tracker-1.0.0/tracker/core/identity.py +121 -0
  44. simple_project_tracker-1.0.0/tracker/core/inspect.py +382 -0
  45. simple_project_tracker-1.0.0/tracker/core/labels.py +109 -0
  46. simple_project_tracker-1.0.0/tracker/core/models.py +152 -0
  47. simple_project_tracker-1.0.0/tracker/core/selection.py +646 -0
  48. simple_project_tracker-1.0.0/tracker/core/storage.py +59 -0
  49. simple_project_tracker-1.0.0/tracker/core/undo.py +63 -0
  50. simple_project_tracker-1.0.0/tracker/core/view.py +48 -0
  51. simple_project_tracker-1.0.0/tracker/py.typed +0 -0
  52. simple_project_tracker-1.0.0/tracker/share/completion.bash +7 -0
  53. simple_project_tracker-1.0.0/tracker/share/completion.fish +12 -0
  54. simple_project_tracker-1.0.0/tracker/share/completion.zsh +13 -0
  55. simple_project_tracker-1.0.0/tracker/share/help.txt +523 -0
  56. simple_project_tracker-1.0.0/tracker/share/settings.toml +245 -0
  57. simple_project_tracker-1.0.0/tracker/ui/__init__.py +0 -0
  58. simple_project_tracker-1.0.0/tracker/ui/ansi.py +128 -0
  59. simple_project_tracker-1.0.0/tracker/ui/ask.py +21 -0
  60. simple_project_tracker-1.0.0/tracker/ui/details.py +172 -0
  61. simple_project_tracker-1.0.0/tracker/ui/help.py +234 -0
  62. simple_project_tracker-1.0.0/tracker/ui/render.py +548 -0
  63. simple_project_tracker-1.0.0/tracker/util/__init__.py +0 -0
  64. simple_project_tracker-1.0.0/tracker/util/compat.py +17 -0
  65. simple_project_tracker-1.0.0/tracker/util/files.py +118 -0
  66. simple_project_tracker-1.0.0/tracker/util/text.py +303 -0
  67. 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
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org/downloads/)
36
+ [![License](https://img.shields.io/badge/license-MIT-green)](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
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org/downloads/)
4
+ [![License](https://img.shields.io/badge/license-MIT-green)](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,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -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
+ [![Python](https://img.shields.io/badge/python-3.11%2B-blue)](https://www.python.org/downloads/)
36
+ [![License](https://img.shields.io/badge/license-MIT-green)](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.