taskflow-git 0.3.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.
@@ -0,0 +1,43 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: ["**"]
6
+ pull_request:
7
+ branches: ["**"]
8
+
9
+ jobs:
10
+ test:
11
+ name: Test (Python ${{ matrix.python-version }})
12
+ runs-on: ubuntu-latest
13
+ strategy:
14
+ fail-fast: false
15
+ matrix:
16
+ python-version: ["3.9", "3.10", "3.11", "3.12"]
17
+
18
+ steps:
19
+ - uses: actions/checkout@v4
20
+
21
+ - name: Install uv
22
+ uses: astral-sh/setup-uv@v3
23
+ with:
24
+ version: "latest"
25
+
26
+ - name: Set up Python ${{ matrix.python-version }}
27
+ run: uv python install ${{ matrix.python-version }}
28
+
29
+ - name: Install dependencies
30
+ run: uv sync --extra dev
31
+
32
+ - name: Run linter
33
+ run: uv run ruff check src/ tests/
34
+
35
+ - name: Run tests
36
+ run: uv run pytest --cov=taskflow --cov-report=term-missing --cov-report=xml
37
+
38
+ - name: Upload coverage
39
+ uses: codecov/codecov-action@v4
40
+ if: matrix.python-version == '3.12'
41
+ with:
42
+ files: coverage.xml
43
+ fail_ci_if_error: false
@@ -0,0 +1,56 @@
1
+ name: Publish
2
+
3
+ # runs on version tags — push v0.3.0, this kicks off
4
+ on:
5
+ push:
6
+ tags:
7
+ - "v*"
8
+
9
+ jobs:
10
+ test:
11
+ name: Test before publish
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@v4
16
+
17
+ - name: Install uv
18
+ uses: astral-sh/setup-uv@v3
19
+ with:
20
+ version: "latest"
21
+
22
+ - name: Set up Python
23
+ run: uv python install 3.12
24
+
25
+ - name: Install dependencies
26
+ run: uv sync --extra dev
27
+
28
+ - name: Run tests
29
+ run: uv run pytest
30
+
31
+ publish:
32
+ name: Build and publish to PyPI
33
+ needs: test
34
+ runs-on: ubuntu-latest
35
+ environment: pypi
36
+ permissions:
37
+ id-token: write # required for trusted publishing
38
+
39
+ steps:
40
+ - uses: actions/checkout@v4
41
+
42
+ - name: Install uv
43
+ uses: astral-sh/setup-uv@v3
44
+ with:
45
+ version: "latest"
46
+
47
+ - name: Set up Python
48
+ run: uv python install 3.12
49
+
50
+ - name: Build package
51
+ run: uv build
52
+
53
+ - name: Publish to PyPI
54
+ uses: pypa/gh-action-pypi-publish@release/v1
55
+ # uses PyPI trusted publishing — no API token needed
56
+ # set up at: https://pypi.org/manage/account/publishing/
@@ -0,0 +1,8 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ venv/
5
+ .env
6
+ *.egg-info/
7
+ dist/
8
+ build/
@@ -0,0 +1,448 @@
1
+ Metadata-Version: 2.4
2
+ Name: taskflow-git
3
+ Version: 0.3.0
4
+ Summary: Git-native task management for people who live in the terminal.
5
+ Project-URL: Homepage, https://github.com/quorum-systems/taskflow
6
+ Project-URL: Repository, https://github.com/quorum-systems/taskflow
7
+ Project-URL: Issues, https://github.com/quorum-systems/taskflow/issues
8
+ Author-email: Patrick McClory <patrick@quorumsystems.io>
9
+ License: MIT
10
+ Keywords: cli,devtools,git,productivity,task-management
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Topic :: Software Development :: Version Control :: Git
19
+ Classifier: Topic :: Utilities
20
+ Requires-Python: >=3.9
21
+ Requires-Dist: click>=8.1
22
+ Requires-Dist: pyyaml>=6.0
23
+ Provides-Extra: dev
24
+ Requires-Dist: black>=25.11.0; extra == 'dev'
25
+ Requires-Dist: flake8>=7.3.0; extra == 'dev'
26
+ Requires-Dist: isort>=6.1.0; extra == 'dev'
27
+ Requires-Dist: pytest-cov>=5.0; extra == 'dev'
28
+ Requires-Dist: pytest>=8.0; extra == 'dev'
29
+ Requires-Dist: ruff>=0.4; extra == 'dev'
30
+ Description-Content-Type: text/markdown
31
+
32
+ # taskflow
33
+
34
+ Git-native task management for people who are already in the terminal.
35
+
36
+ No database. No SaaS. No browser tab to context-switch into. Markdown files, a handful of Python scripts, and git aliases that turn your commit history into an execution log.
37
+
38
+ ---
39
+
40
+ ## Why this exists
41
+
42
+ Issue trackers are built for visibility into other people's work. When you're the one doing the work, they're mostly overhead — fields to fill in, statuses to update, ceremonies that exist to prove progress rather than make it.
43
+
44
+ I already knew this. My workaround was a graph paper notebook: hand-drawn checkboxes, running to-do lists, something I could capture a task in without clicking through three screens. It worked until it didn't — no state tracking, no history, no way to tell what was actually in progress versus just written down and forgotten.
45
+
46
+ taskflow is what I built instead. It took about 20 minutes to get the first version working. I've been using it on a real infrastructure build since, and it's earned everything I've added to it.
47
+
48
+ ---
49
+
50
+ ## The model
51
+
52
+ Every task lives in one of six files:
53
+
54
+ ```
55
+ backlog/
56
+ 0-now.md ▶ executing this week
57
+ 1-blocked.md ⊘ waiting on something external
58
+ 2-paused.md ⏸ deliberately on hold — not blocked, not forgotten
59
+ 3-next.md ◈ queued for the next window
60
+ 4-later.md ◇ longer-horizon work, organised by phase
61
+ done.md ✓ append-only completion log
62
+ ```
63
+
64
+ Tasks move between files via `taskflow` commands or git aliases. Every move is a commit. Your git log becomes a timeline of what actually happened — not what you said was happening in a standup.
65
+
66
+ File paths are configurable. If you want your backlog somewhere else, set it in `.taskflow.yml` and `taskflow setup` creates it.
67
+
68
+ ---
69
+
70
+ ## Getting started
71
+
72
+ **1. Clone and install the one dependency**
73
+
74
+ ```bash
75
+ git clone https://github.com/quorum-systems/taskflow.git myproject
76
+ cd myproject
77
+ pip install pyyaml
78
+ ```
79
+
80
+ pyyaml is only needed for `taskflow setup`. The task scripts are pure stdlib — once setup has run, you can uninstall it.
81
+
82
+ **2. Edit `.taskflow.yml`**
83
+
84
+ Define your categories and phases. That's the only configuration you need to touch. Everything else has sensible defaults.
85
+
86
+ ```yaml
87
+ categories:
88
+ - name: Backend
89
+ icon: "🔵"
90
+ - name: Frontend
91
+ icon: "🟢"
92
+ - name: DevOps
93
+ icon: "🔴"
94
+ - name: Product
95
+ icon: "🟡"
96
+
97
+ phases:
98
+ - name: "Phase 1 — MVP"
99
+ description: "Core features needed to ship."
100
+ - name: "Phase 2 — Scale"
101
+ description: "Performance, reliability, and growth."
102
+ ```
103
+
104
+ **3. Run setup**
105
+
106
+ ```bash
107
+ ./taskflow setup
108
+ ```
109
+
110
+ Generates your backlog file skeletons, installs the git aliases, and configures the weekly plan script. Re-run whenever you change `.taskflow.yml`.
111
+
112
+ ---
113
+
114
+ ## Daily usage
115
+
116
+ `taskflow` and the git aliases are identical. Use whichever is faster:
117
+
118
+ ```bash
119
+ taskflow start "task"
120
+ git start "task" # same thing
121
+ ```
122
+
123
+ ### Move a task into active work
124
+
125
+ ```bash
126
+ taskflow promote "task" # ◇ later → ◈ next
127
+ taskflow start "task" # ◈ next → ▶ now
128
+ ```
129
+
130
+ ### Handle blockers and holds
131
+
132
+ ```bash
133
+ taskflow block "task" # ▶ now → ⊘ blocked
134
+ taskflow unblock "task" # ⊘ blocked → ▶ now
135
+
136
+ taskflow pause "task" # ▶ now → ⏸ paused
137
+ taskflow unpause "task" # ⏸ paused → ▶ now
138
+
139
+ taskflow backlog "task" # ▶ now → ◈ next (put it back)
140
+ ```
141
+
142
+ ### Complete a task
143
+
144
+ ```bash
145
+ taskflow done "task"
146
+ ```
147
+
148
+ Removes the task from now, appends a timestamped entry to `done.md`, commits both.
149
+
150
+ ### Add a task directly
151
+
152
+ ```bash
153
+ taskflow add <state> <category> <task text>
154
+ ```
155
+
156
+ Add a task to any state without opening a file. Useful for capturing work that's already in flight or already done.
157
+
158
+ ```bash
159
+ taskflow add next DevOps "write deployment runbook"
160
+ taskflow add now Backend "hotfix: null pointer in auth"
161
+ taskflow add done Engineering "emergency patch deployed" # no prior 'now' needed
162
+ ```
163
+
164
+ Category matching is fuzzy and case-insensitive — `taskflow add next dev "..."` finds `DevOps`.
165
+
166
+ ### Fuzzy matching
167
+
168
+ You don't need to type the full task text for any command. All commands match by substring:
169
+
170
+ ```bash
171
+ taskflow done "auth"
172
+ # works if exactly one task contains "auth"
173
+
174
+ taskflow done "add"
175
+ # → Multiple tasks match 'add' — be more specific:
176
+ # line 4 [Backend] add JWT auth middleware
177
+ # line 11 [Frontend] add login form validation
178
+ ```
179
+
180
+ The commit message always uses the full matched task text, not your search string.
181
+
182
+ ---
183
+
184
+ ## Reporting and status
185
+
186
+ ### Quick status
187
+
188
+ ```bash
189
+ taskflow status
190
+ ```
191
+
192
+ ```
193
+ taskflow status — Sat Mar 28
194
+ ▶ now: 3 ⊘ blocked: 1 ⏸ paused: 0
195
+
196
+ ▶ now
197
+ 🔵 Backend
198
+ · add JWT auth middleware
199
+ · write integration tests
200
+ 🔴 DevOps
201
+ · configure CI pipeline
202
+
203
+ ⊘ blocked
204
+ 🔵 Backend
205
+ · integrate payment gateway
206
+ ```
207
+
208
+ ### This week's completions
209
+
210
+ ```bash
211
+ taskflow week
212
+ ```
213
+
214
+ ```
215
+ ✓ week of 2026-03-28 — 11 completed
216
+
217
+ 🔴 Infrastructure
218
+ · deploy MaaS 3.7
219
+ · commission first compute node
220
+ · validate Ubuntu 24.04 deploys cleanly
221
+ 🟣 Engineering
222
+ · validate network_switching role
223
+ · write latency rotation script
224
+ ```
225
+
226
+ ### Pipeline — work in flight
227
+
228
+ ```bash
229
+ taskflow pipeline
230
+ taskflow pipeline --json
231
+ ```
232
+
233
+ ```
234
+ pipeline — work in flight and completed this week
235
+
236
+ +----------------+---------+--------+----------+-----------+-------+----------+
237
+ | Category | ◇ Later | ◈ Next | ⏸ Paused | ⊘ Blocked | ▶ Now | ✓ Mar 28 |
238
+ +----------------+---------+--------+----------+-----------+-------+----------+
239
+ | 🔵 Backend | 3 | 2 | 0 | 1 | 2 | 1 |
240
+ | 🔴 DevOps | 1 | 2 | 0 | 0 | 1 | 1 |
241
+ | 🟢 Frontend | 1 | 2 | 0 | 0 | 0 | 1 |
242
+ | 🟡 Product | 0 | 0 | 1 | 0 | 0 | 0 |
243
+ +----------------+---------+--------+----------+-----------+-------+----------+
244
+ ```
245
+
246
+ ### Progress — completions over time
247
+
248
+ ```bash
249
+ taskflow progress
250
+ taskflow progress --json
251
+ ```
252
+
253
+ ```
254
+ progress — now vs. completed by week
255
+
256
+ +------------+-------+----------+----------+----------+----------+
257
+ | Category | ▶ Now | ✓ Mar 28 | ✓ Mar 21 | ✓ Mar 14 | ✓ Mar 7 |
258
+ +------------+-------+----------+----------+----------+----------+
259
+ | 🔵 Backend | 2 | 1 | 2 | 2 | 2 |
260
+ | 🔴 DevOps | 1 | 1 | 1 | 1 | 2 |
261
+ | 🟢 Frontend | 0 | 1 | 1 | 1 | 1 |
262
+ +------------+-------+----------+----------+----------+----------+
263
+ ```
264
+
265
+ That table wasn't written. It emerged from doing the work and running one command.
266
+
267
+ ---
268
+
269
+ ## Task format
270
+
271
+ Plain bullets under a category heading. No checkboxes.
272
+
273
+ ```markdown
274
+ ### 🔵 Backend
275
+ * add JWT auth middleware
276
+ * write integration tests for /api/users
277
+ * happy path
278
+ * 401 on missing token
279
+ * 403 on insufficient scope
280
+
281
+ ---
282
+ ```
283
+
284
+ Subtasks indent two spaces and move with their parent.
285
+
286
+ ---
287
+
288
+ ## Configuration
289
+
290
+ ### Categories
291
+
292
+ Categories are arbitrary labels. There are no built-in ones — define whatever reflects how you actually think about your work:
293
+
294
+ | Type of project | Example categories |
295
+ |---|---|
296
+ | Software product | Backend, Frontend, DevOps, Product, Design |
297
+ | Consulting practice | Delivery, Business Development, Operations, Writing |
298
+ | Research project | Experiments, Writing, Data, Infrastructure |
299
+ | Personal | Work, Health, Finance, Home, Learning |
300
+
301
+ One category per task. Categories aren't load-bearing — rename or restructure them in `.taskflow.yml` and re-run `taskflow setup`. Existing task content is never touched.
302
+
303
+ #### Icons
304
+
305
+ Optional but useful — makes headings scannable in editors and file browsers. Coloured circles work well as a set:
306
+
307
+ ```
308
+ 🔴 🟠 🟡 🟢 🔵 🟣 ⚫ ⚪ 🟤
309
+ ```
310
+
311
+ **Finding emoji:** macOS `Ctrl+Cmd+Space`, Windows `Win+.`, Linux `Ctrl+Shift+U` + code point, or [emojipedia.org](https://emojipedia.org).
312
+
313
+ ### Phases
314
+
315
+ Phases organise the later file into planning horizons. They have no effect on any other backlog file.
316
+
317
+ All categories appear under every phase by default. The `categories` field is an optional filter:
318
+
319
+ ```yaml
320
+ phases:
321
+ - name: "Phase 1 — Foundation"
322
+ description: "Infrastructure only."
323
+ categories: [DevOps] # only DevOps headings pre-generated
324
+
325
+ - name: "Phase 2 — Product"
326
+ description: "Full build."
327
+ # no filter — all categories appear
328
+ ```
329
+
330
+ No enforcement. Any task can go under any phase. The filter just controls which headings get pre-generated in the file skeleton.
331
+
332
+ ### States
333
+
334
+ By default taskflow uses the standard file layout. You can override any state's file path and icon:
335
+
336
+ ```yaml
337
+ states:
338
+ now:
339
+ file: "backlog/0-now.md"
340
+ icon: "▶"
341
+ blocked:
342
+ file: "backlog/1-blocked.md"
343
+ icon: "⊘"
344
+ paused:
345
+ file: "backlog/2-paused.md"
346
+ icon: "⏸"
347
+ next:
348
+ file: "backlog/3-next.md"
349
+ icon: "◈"
350
+ later:
351
+ file: "backlog/4-later.md"
352
+ icon: "◇"
353
+ done:
354
+ file: "backlog/done.md"
355
+ icon: "✓"
356
+ ```
357
+
358
+ The entire `states` section is optional. Leave it out and the defaults above apply. Override only what you want to change — partial overrides work fine.
359
+
360
+ `taskflow setup` creates all state file paths recursively, so you can put them anywhere.
361
+
362
+ ---
363
+
364
+ ## The git log
365
+
366
+ Every task transition commits with a structured message. The log reads like a journal:
367
+
368
+ ```
369
+ promote: Post 17: Automating Network Config on Live Hardware
370
+ start: Post 17: Automating Network Config on Live Hardware
371
+ done: Post 17: Automating Network Config on Live Hardware
372
+ start: Post 25: Scope First, Quote Second
373
+ done: Post 25: Scope First, Quote Second
374
+ ```
375
+
376
+ Diff from the start of the week to the end and you have a concrete record of what changed — not what you said was in progress. Feed that diff to a model and it's working from structured evidence, not trying to reconstruct your week from memory.
377
+
378
+ ---
379
+
380
+ ## Weekly plan
381
+
382
+ Generate a full snapshot of active work, grouped by category:
383
+
384
+ ```bash
385
+ scripts/git/week-plan # writes changelog/weekly/YYYY-MM-DD.md
386
+ scripts/git/week-plan --stdout # prints to terminal
387
+ ```
388
+
389
+ ---
390
+
391
+ ## What this is not
392
+
393
+ taskflow does not have:
394
+
395
+ - Due dates or priority scores
396
+ - Integrations with anything
397
+ - A web UI, mobile app, or notifications
398
+ - Collaboration features
399
+ - Burndown charts or velocity tracking
400
+ - A project manager to manage your project manager
401
+
402
+ If you **need** those things, there are good tools that provide them. This is explicitly not trying to be those tools. The design point is minimum viable friction for a solo practitioner or small team that lives in the terminal and wants their task state in the same place as their code.
403
+
404
+ ---
405
+
406
+ ## Repo structure
407
+
408
+ ```
409
+ .taskflow.yml the only file you need to edit
410
+ taskflow CLI — setup, workflow, reporting
411
+ requirements.txt pyyaml (setup only — not needed at runtime)
412
+
413
+ scripts/
414
+ git-aliases.sh installs git aliases (run by taskflow setup)
415
+ git/
416
+ tasklib.py shared parsing and mutation library
417
+ task-move moves a task between backlog files
418
+ task-done marks a task complete, appends to done.md
419
+ week-plan generates weekly execution plan markdown
420
+ reports.py pipeline and progress report logic
421
+
422
+ backlog/ generated by taskflow setup, filled in by you
423
+ 0-now.md
424
+ 1-blocked.md
425
+ 2-paused.md
426
+ 3-next.md
427
+ 4-later.md
428
+ done.md
429
+
430
+ changelog/
431
+ weekly/ weekly plan output
432
+ ```
433
+
434
+ ---
435
+
436
+ ## Philosophy
437
+
438
+ The backlog exists to support execution, not document it.
439
+
440
+ `now` should be short. If something is blocking you, move it to `blocked` rather than leaving it to rot in the active list. If something isn't a priority this week, move it back to `next`. The files should reflect reality, not aspiration.
441
+
442
+ `done.md` is the raw material for a weekly changelog or retrospective. The git log is the long-term record. Nothing else is required.
443
+
444
+ ---
445
+
446
+ ## License
447
+
448
+ MIT