feat(tasks): add a folder-based task tracker (new / inprogress / done) - #173
Merged
Conversation
Tracks what is done, in progress, and not started, without opening GitHub.
A task's folder IS its status:
new.inprogress.done/new/ not started (may be blocked)
new.inprogress.done/inprogress/ started, not finished
new.inprogress.done/done/ finished and verified
Each task is Markdown: front-matter (id, title, status, priority, created,
updated, owner, repo, issue, prs, blocked_by, tokens) then fixed sections --
goal, scope, out of scope, steps, acceptance criteria, dependencies/blockers,
files changed, validation, token usage, notes, completion summary.
Docs (English, matching the repo's existing documentation):
README.md purpose, status meanings, create/move process, required
file format, naming convention, Definition of Done, and
an example -- plus an explicit note that `tokens:` is an
estimate (len(text) // 4), not a billing figure
TASK_TEMPLATE.md the template itself
tools/tasks.py is a stdlib-only CLI: list (with [blocked] markers), report
(counts + estimated tokens), new (next free id), move (relocates the file AND
rewrites status:, so the two cannot drift).
tests/ enforces the structure instead of trusting it: required front-matter
keys, unique ids, ISO dates, status matching the containing folder, and a PR
reference on anything in done/. 15 tests pass.
Seeded with four real tasks: Issue #63 / pure-agent-dev (done), the
CHANGELOG+README update (done), the new-crystalcastle SHA fix (inprogress,
blocked on write access), and the GitHub Actions repair (new, blocked on
`.github/workflows/` permission) -- the last is the worked example.
Documentation and process only: no application code, and nothing under app/,
tests/, or the project configuration is touched.
| counts[status] += 1 | ||
| try: | ||
| total += int(fm.get("tokens") or 0) | ||
| except ValueError: |
| import re | ||
|
|
||
| import tasks | ||
| import pytest |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Task tracker —
new/inprogress/doneAdditive only: 11 new files under
new.inprogress.done/. Nothing existing is modified, moved, or deleted — verified withgit diff --name-only(empty) againstmain.Inspected before building
I checked the real repository rather than assuming:
main; the directory did not exist (no collision).mht,tasks,todoacross the repo, the org (gh search code), every branch/PR, and Issue pure-agent-dev #63 — nothing.task|todo|plan|roadmap|progress) — none.CONTRIBUTING.mdyes,AGENTS.mdandCOPILOT_INSTRUCTIONS.mddo not — so nothing references them.README.mdandCONTRIBUTING.mdcontain 0 Thai characters, so the new docs are written in English to match the repository, not in Thai.Structure
Status meanings
new/inprogress/done/Task file format
Front-matter (
id,title,status,priority,created,updated,owner,repo,issue,prs,blocked_by,tokens) then fixed sections: Goal · Scope · Out of scope · Steps · Acceptance criteria · Dependencies/blockers · Files changed · Validation · Token usage · Notes · Completion summary.The three things you asked to be reported — what was done, which files changed, whether tokens were used — are structural sections, not optional prose.
CLI
moverelocates the file and rewritesstatus:, so the two cannot disagree.Definition of Done
A task enters
done/only when every step is complete or its omission is explained, every acceptance criterion is checked, the Validation table holds real commands and real results, andprs:names a merged PR or the task records a commit SHA. A task indone/without evidence fails the test suite.On tokens
tokens:uses this project'slen(text) // 4rule over the files a task lists. It is an estimate, not a measured API figure — real provider usage also includes the system prompt and session context. The README says this explicitly so nobody bills against it.Verification
python3 -m pytest tests/tools/tasks.py listtools/tasks.py reportgit diff --name-onlyvsmaingit status --shortTests enforce the structure rather than trusting it: required front-matter keys, unique ids, ISO dates,
status:matching the containing folder, a numerictokensvalue, and a PR reference on anything indone/.Two real bugs surfaced while writing them and were fixed in the tool:
cmd_newsubstituted the title by placeholder text (silently did nothing when the template wording changed), and the move test caught thattemplates/no longer exists — the template lives at the directory root.Blocked work is recorded, not hidden
The seed tasks carry honest blockers in
blocked_by:, which is whylistprints[blocked]:.github/workflows/; the App lacks theworkflowspermission.Not done
new-crystalcastleCI fix and this repo's workflow repair remain blocked and unstarted — recorded as tasks rather than quietly dropped.