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.
- taskflow_git-0.3.0/.github/workflows/ci.yml +43 -0
- taskflow_git-0.3.0/.github/workflows/publish.yml +56 -0
- taskflow_git-0.3.0/.gitignore +8 -0
- taskflow_git-0.3.0/PKG-INFO +448 -0
- taskflow_git-0.3.0/README.md +417 -0
- taskflow_git-0.3.0/coverage.xml +1023 -0
- taskflow_git-0.3.0/pyproject.toml +69 -0
- taskflow_git-0.3.0/src/taskflow/__init__.py +3 -0
- taskflow_git-0.3.0/src/taskflow/archive.py +135 -0
- taskflow_git-0.3.0/src/taskflow/cli.py +550 -0
- taskflow_git-0.3.0/src/taskflow/config.py +195 -0
- taskflow_git-0.3.0/src/taskflow/reports.py +284 -0
- taskflow_git-0.3.0/src/taskflow/setup_cmd.py +305 -0
- taskflow_git-0.3.0/src/taskflow/tasklib.py +451 -0
- taskflow_git-0.3.0/taskflow +803 -0
- taskflow_git-0.3.0/tests/conftest.py +95 -0
- taskflow_git-0.3.0/tests/test_archive.py +155 -0
- taskflow_git-0.3.0/tests/test_cli.py +212 -0
- taskflow_git-0.3.0/tests/test_config.py +111 -0
- taskflow_git-0.3.0/tests/test_reports.py +188 -0
- taskflow_git-0.3.0/tests/test_tasklib.py +289 -0
- taskflow_git-0.3.0/uv.lock +872 -0
|
@@ -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,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
|