taskunity 2026.1__py3-none-any.whl

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.
@@ -0,0 +1,238 @@
1
+ Metadata-Version: 2.4
2
+ Name: taskunity
3
+ Version: 2026.1
4
+ Summary: A local, file-backed productivity app for program/task tracking.
5
+ Author: Taskunity Contributors
6
+ License: MIT
7
+ Keywords: tasks,productivity,fastapi,local-first,dashboard
8
+ Classifier: Development Status :: 3 - Alpha
9
+ Classifier: Framework :: FastAPI
10
+ Classifier: Intended Audience :: Developers
11
+ Classifier: License :: OSI Approved :: MIT License
12
+ Classifier: Programming Language :: Python :: 3
13
+ Classifier: Programming Language :: Python :: 3.10
14
+ Classifier: Programming Language :: Python :: 3.11
15
+ Classifier: Programming Language :: Python :: 3.12
16
+ Requires-Python: >=3.10
17
+ Description-Content-Type: text/markdown
18
+ Requires-Dist: fastapi>=0.111
19
+ Requires-Dist: uvicorn[standard]>=0.30
20
+ Requires-Dist: jinja2>=3.1
21
+ Requires-Dist: python-multipart>=0.0.9
22
+ Requires-Dist: pydantic>=2.7
23
+ Requires-Dist: markdown>=3.6
24
+ Provides-Extra: dev
25
+ Requires-Dist: pytest>=8; extra == "dev"
26
+ Requires-Dist: ruff>=0.5; extra == "dev"
27
+ Provides-Extra: docs
28
+ Requires-Dist: sphinx>=7; extra == "docs"
29
+ Requires-Dist: myst-parser>=3; extra == "docs"
30
+ Requires-Dist: furo>=2024.1; extra == "docs"
31
+
32
+ # Taskunity
33
+
34
+ A local-first, file-backed productivity web app for managing tasks. Everything lives in
35
+ plain files on your disk — no database, no account, no cloud. Point Taskunity at a folder and it
36
+ serves a browser UI for dashboards, a Gantt timeline, a Kanban board, a calendar, activity logs,
37
+ burndown charts, and an editable task side panel.
38
+
39
+ > Documentation: a full guide is in the [`docs/`](docs/) folder and is set up to build on
40
+ > [Read the Docs](https://readthedocs.org/) (Sphinx + Markdown).
41
+
42
+ ## Screenshots
43
+
44
+ | Task List | Task Board |
45
+ |-----------|-----------|
46
+ | ![Task List](https://raw.githubusercontent.com/briday1/taskwright/main/docs/_static/screenshots/task-list.png) | ![Task Board](https://raw.githubusercontent.com/briday1/taskwright/main/docs/_static/screenshots/task-board.png) |
47
+
48
+ | Gantt Timeline | Calendar |
49
+ |----------------|----------|
50
+ | ![Gantt](https://raw.githubusercontent.com/briday1/taskwright/main/docs/_static/screenshots/gantt.png) | ![Calendar](https://raw.githubusercontent.com/briday1/taskwright/main/docs/_static/screenshots/calendar.png) |
51
+
52
+ | Milestones | Projects |
53
+ |------------|----------|
54
+ | ![Milestones](https://raw.githubusercontent.com/briday1/taskwright/main/docs/_static/screenshots/milestones.png) | ![Projects](https://raw.githubusercontent.com/briday1/taskwright/main/docs/_static/screenshots/projects.png) |
55
+
56
+ | Task Activity Log | Settings (Theme) |
57
+ |-------------------|------------------|
58
+ | ![Task Panel](https://raw.githubusercontent.com/briday1/taskwright/main/docs/_static/screenshots/task-panel.png) | ![Settings Popup](https://raw.githubusercontent.com/briday1/taskwright/main/docs/_static/screenshots/settings-popup.png) |
59
+
60
+ | Task Burndown Chart | Milestone Burndown Chart |
61
+ |---------------------|--------------------------|
62
+ | ![Task Burndown](https://raw.githubusercontent.com/briday1/taskwright/main/docs/_static/screenshots/task-burndown.png) | ![Milestone Burndown](https://raw.githubusercontent.com/briday1/taskwright/main/docs/_static/screenshots/milestone-burndown.png) |
63
+
64
+ ## Why Taskunity
65
+
66
+ - **File-backed source of truth.** Each task is a single JSON file you can read, diff, and commit
67
+ to git. The whole workspace is a folder you own.
68
+ - **Local-first.** Runs entirely on `127.0.0.1`. Your data never leaves your machine.
69
+ - **Git-aware.** The UI shows branch/ahead/behind/dirty status and has a one-click commit + pull +
70
+ push sync button when the workspace folder itself is a git repo.
71
+
72
+ ## Workspace layout
73
+
74
+ The source of truth is a workspace folder:
75
+
76
+ ```text
77
+ workspace/
78
+ config.json # editable workspace/app metadata
79
+ projects/
80
+ apollo.json # one file per project
81
+ tasks/
82
+ A1B2-C3D4-E5F6-7890.json # one file per task (native id format)
83
+ milestones/
84
+ M-1A2B-3C4D.json # one file per milestone (groups tasks across projects)
85
+ assets/
86
+ A1B2-C3D4-E5F6-7890/ # attachments live alongside their task id
87
+ screenshot.png
88
+ ```
89
+
90
+ The app provides a browser UI for viewing dashboards, timelines, task boards, activity logs,
91
+ burndown charts, and editing tasks through a side panel.
92
+
93
+ ## Install locally
94
+
95
+ From a clone of this repository:
96
+
97
+ ```bash
98
+ pip install -e .
99
+ ```
100
+
101
+ This installs the `taskunity` command. (A PyPI release will come later; for now install from
102
+ source.)
103
+
104
+ ## Quick start
105
+
106
+ ```bash
107
+ taskunity serve --workspace ./my-workboard
108
+ ```
109
+
110
+ If the workspace folder does not exist yet, `taskunity serve` will create the empty Taskunity
111
+ structure for you. You can also run it from the current directory and let Taskunity use `.` as
112
+ the workspace.
113
+
114
+ Then open:
115
+
116
+ ```text
117
+ http://127.0.0.1:8000
118
+ ```
119
+
120
+ `init` is available if you want to scaffold a folder explicitly. It creates an editable
121
+ `config.json`, empty `projects/`, `tasks/`, `milestones/`, and `assets/` directories, plus a README
122
+ stub. It does not create starter projects or tasks; use the app to add your own once you begin.
123
+
124
+ ## Serve an existing workspace
125
+
126
+ ```bash
127
+ taskunity serve --workspace ./path/to/workspace --host 127.0.0.1 --port 8000
128
+ ```
129
+
130
+ | Flag | Default | Description |
131
+ | --- | --- | --- |
132
+ | `--workspace` | `.` | Workspace folder to serve |
133
+ | `--host` | `127.0.0.1` | Host interface to bind |
134
+ | `--port` | `8000` | Port to listen on |
135
+ | `--reload` | off | Enable uvicorn auto-reload (development) |
136
+
137
+ ## Task file example
138
+
139
+ ```json
140
+ {
141
+ "id": "A1B2-C3D4-E5F6-7890",
142
+ "title": "CAF refinement prototype",
143
+ "status": "working",
144
+ "priority": "high",
145
+ "project": "Apollo",
146
+ "summary": "Build a prototype CAF refinement workflow.",
147
+ "description": "Compare baseline CAF sharpness against protection-aware refinement.",
148
+ "tags": ["caf", "signal-processing", "prototype"],
149
+ "start_date": "2026-06-24",
150
+ "due_date": "2026-06-30",
151
+ "completed_date": null,
152
+ "percent_complete": 60,
153
+ "depends_on": ["0EBB-528F-371E-61AE"],
154
+ "checklist": [
155
+ {"text": "Generate baseline CAF", "done": true},
156
+ {"text": "Export comparison plots", "done": false}
157
+ ],
158
+ "activity": [
159
+ {
160
+ "id": "a1b2c3d4",
161
+ "event_type": "note",
162
+ "created_at": "2026-06-26T10:30:00",
163
+ "note_text": "Protection-aware version improved sharpness."
164
+ },
165
+ {
166
+ "id": "e5f6a7b8",
167
+ "event_type": "progress_update",
168
+ "created_at": "2026-06-26T11:00:00",
169
+ "progress_before": 40,
170
+ "progress_after": 60
171
+ }
172
+ ]
173
+ }
174
+ ```
175
+
176
+ `depends_on` stores task **ids**. In the UI you add dependencies with a search-as-you-type picker
177
+ that finds tasks by name and shows their status, project, due date, and id — then stores the id.
178
+ Dependencies are reflected on the Gantt timeline (an `↳ after <name>` label plus a marker where the
179
+ dependency's bar ends).
180
+
181
+ ## Milestones
182
+
183
+ Milestones are a separate entity from projects. A milestone can span **multiple projects**, holds an
184
+ **ordered list of tasks** (which can come from any project, and a task can belong to any number of
185
+ milestones), and has its own description, notes, and attachments — just like a task.
186
+
187
+ - Open the **Milestones** view to see every milestone with a live rollup (task count, progress,
188
+ target date).
189
+ - Click a milestone to **filter the whole board to just its tasks** and show a rollup banner; the
190
+ side panel opens the milestone for editing.
191
+ - Each milestone has its **own colour** used on milestone cards and the rollup banner.
192
+ - From inside a milestone you can **add a task** with one search-as-you-type picker and use the
193
+ sticky **+ New task** button at the bottom of the list for quick creation (auto-added to that
194
+ milestone), and remove tasks.
195
+
196
+ Milestones are stored one JSON file per milestone under `milestones/`.
197
+
198
+ ## Features
199
+
200
+ - JSON-per-task source model you can version with git
201
+ - Dashboard summary cards (total / done / working / blocked)
202
+ - Kanban-style board with per-project color strips
203
+ - Gantt timeline with dependency markers
204
+ - Calendar view
205
+ - **Milestones** that group tasks across projects, with per-milestone colour,
206
+ click-to-filter rollup, and their own notes/attachments/description
207
+ - Click any task (row, card, timeline bar, calendar entry) to open an editable side panel
208
+ - Save edits back to the JSON file; raw JSON editor escape hatch
209
+ - **Unified activity log** per task: notes, images, and progress changes in chronological order
210
+ - **Task burndown chart**: remaining work over time from progress_update events
211
+ - **Milestone cumulative burndown chart**: aggregate remaining work across all tasks in a milestone
212
+ - Searchable "depends on" picker that resolves names to task ids
213
+ - Project management with custom colors, each stored in its own JSON file
214
+ - Filtering by project, milestone, date range, and free-text search; sortable views
215
+ - CSV / JSON export
216
+ - Built-in git status chip and one-click sync (commit + pull + push)
217
+
218
+ ## Building the docs locally
219
+
220
+ ```bash
221
+ pip install -e ".[docs]"
222
+ sphinx-build -b html docs docs/_build/html
223
+ ```
224
+
225
+ Open `docs/_build/html/index.html`. On Read the Docs the build is driven by
226
+ [`.readthedocs.yaml`](.readthedocs.yaml).
227
+
228
+ ## Development
229
+
230
+ ```bash
231
+ pip install -e ".[dev]"
232
+ pytest
233
+ ruff check .
234
+ ```
235
+
236
+ ## License
237
+
238
+ MIT
@@ -0,0 +1,27 @@
1
+ taskunity/__init__.py,sha256=kUR5RAFc7HCeiqdlX36dZOHkUI5wI6V_43RpEcD8b-0,22
2
+ taskunity/app.py,sha256=L8ZpCHD6FmrevznU89cYWHwDyJBh-2w0aOVNlmd7950,46654
3
+ taskunity/cli.py,sha256=JSBe-O5H0_A9BK2Xy4S6O_6E_Y1lqoFQ7BOdsDhtxSU,1702
4
+ taskunity/models.py,sha256=aBNhVdY8naS0M19Dy9Vi0NOkSan6ytMbo1xm81l0SZ4,3057
5
+ taskunity/render.py,sha256=yd9D8TBlcedlGuwklRNtE-S3Uhbg2tq1kY1knd6q0kk,12952
6
+ taskunity/task_store.py,sha256=2_BGI42MbbiiMHn_r_4MVfX_2tUz2zEpauZUIa99y3Y,22217
7
+ taskunity/static/app.css,sha256=moWR7hOM-iBeh33PCXJqfXklLcBsEG735zMBrzTmMVU,45847
8
+ taskunity/static/chart.umd.min.js,sha256=SERKgtTty1vsDxll-qzd4Y2cF9swY9BCq62i9wXJ9Uo,208522
9
+ taskunity/static/chartjs-adapter-date-fns.bundle.min.js,sha256=6nqzDSbDjc8fLSa7Q-c6lFN7WPGQb1XhpUbdCTIbVhU,50650
10
+ taskunity/static/htmx.min.js,sha256=klmgDHsZ6a8XOPG-kmXPLypaMFoBKirr7Mt0uEVp8vw,2773
11
+ taskunity/templates/base.html,sha256=m2VfkK3if5VeqkU56dmD1DSSM5AHRCSuExx5LJTzP6E,16576
12
+ taskunity/templates/index.html,sha256=pwN71jYXFk9F2_u0lnKfjIa1hyheYORJw8pwmh5R7zs,95
13
+ taskunity/templates/partials/board.html,sha256=O3kHt4JOqCLWv-XEodsTtnfhdZWkcwdtzEbI6khelP4,1462
14
+ taskunity/templates/partials/calendar.html,sha256=enMtbW7aLCH22LESwiiH6FVjcy0wEmoR32DkQbmgTrk,1182
15
+ taskunity/templates/partials/main.html,sha256=ADYaFA1SLwbHXcDcunuIhQM7XaHs4fPSaVozKW-GyhQ,18901
16
+ taskunity/templates/partials/milestone_banner.html,sha256=idIeD9uAU4EDnV48m04_st-T5D0J_iXk77OT9--8XhA,2097
17
+ taskunity/templates/partials/milestone_panel.html,sha256=6ACKRGIN77vo9UVSkD2kXiNmAp2U8uvK0p4Ay5a2A2U,12542
18
+ taskunity/templates/partials/milestones.html,sha256=UmbLMCwpPhaxydr3Uqmc3SKxKCqra56bTVg6kuBfnPs,2876
19
+ taskunity/templates/partials/projects.html,sha256=PFvhEprbihtH9sVW-kIB2i5Rth7ffJH7imbTZPl86FI,1768
20
+ taskunity/templates/partials/task_list.html,sha256=HhZikF2clnExMav2PiVbojpTckRKYTm3KRDEk-KZ030,3233
21
+ taskunity/templates/partials/task_panel.html,sha256=qBrs7NZwn5CwVBzdzAZI9atgY7_V_Lr6YDjOPycZy1c,17591
22
+ taskunity/templates/partials/timeline.html,sha256=ae8d_do8Z5bI_IQLiDZmz3o5flAP8fxYQ-yZVqF_zos,1750
23
+ taskunity-2026.1.dist-info/METADATA,sha256=pjWS42bAS6GJRJJYusx-ZZAhYwLWt4SpAf2HPMXU3SY,9134
24
+ taskunity-2026.1.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
25
+ taskunity-2026.1.dist-info/entry_points.txt,sha256=gRoen6I_jQKeihjHZlkw4ewKlr6nfe2YGgvYXDczM4w,49
26
+ taskunity-2026.1.dist-info/top_level.txt,sha256=umSK26x52afLBsi90EfwiR0MuTWrxmgReATuMUAE5L0,10
27
+ taskunity-2026.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ taskunity = taskunity.cli:main
@@ -0,0 +1 @@
1
+ taskunity