Repository navigation
Releases: budhash/tasks
Release list
tasks v1.4.1 — migration-ready (docs)
Docs-only release — no behavior changes. Marks the repo migration-ready: three independent blind cold-clone audits confirmed a fresh session (human or AI) can bootstrap and resume from the repo alone.
Added
MEMORY.md— successor briefing at the repo root (pinned resume point, off-repo context, new-machine bootstrap), ranked belowCLAUDE.mdand referenced from its fresh-session read order.- Docstring/
schema.md/README now state explicitly that tasks do not inherit their parent feature's@milestone=(the rollup counts task tags only;--tableattributes features directly or via their tagged tasks).
Fixed
- Stale "155 scenarios" claims (actual: 54 scenarios / 298 assertions as of v1.4.0), plus a dated editor's note on the mislabeled v1.0.0 changelog entry.
- Layout tables now list
LEARNINGS.md,MEMORY.md,docs/superpowers/specs/. examples/TASKS.mdnow showcases milestones (registry +@milestone=tags); still validates.CONTRIBUTING.md/CLAUDE.mdaligned with actual process (squash-merge only;gh release createevery release; issue-vs-PR numbering corrected).
The audits also surfaced #25 (validate silently ignores unknown args) — queued into the #14 round.
Upgrading
Vendored copies: ./tools/tasks.py selfupdate (1.4.0 → 1.4.1). Docs/docstring only; no behavior or format changes.
Full changelog: https://github.com/budhash/tasks/blob/main/CHANGELOG.md
tasks v1.4.0 — collision-resistant ID allocation
Collision-resistant ID allocation — the prevention leg of the multi-branch ID-collision story (renumber in v1.3.0 is the cleanup leg).
Added
new … --id T-42(#13) — create with an explicit ID (short forms normalized). Refused if the ID is already taken (primary or@shadow) or the kind doesn't match. No--force: a forced duplicate ID is file corruption, never a feature.new … --base <git-ref>(#13) — auto-allocatemax(local, ref) + 1by readingTASKS.mdat the ref, so a branch forked frommaincan't re-issue IDsmainalready handed out. Fails closed on any git problem — no silent fallback to local-only allocation. Combined with--id, the explicit ID must be free at the ref too.reserve N(persisted ranges) stays deferred — it would add a new concept to the file format.
Typical multi-branch flow: new task "..." --base origin/main on every branch, or hand branches disjoint --id ranges; clean up any survivor with renumber.
Design doc: docs/superpowers/specs/2026-07-15-id-allocation-design.md.
Upgrading
Vendored copies: ./tools/tasks.py selfupdate (1.3.0 → 1.4.0). New opt-in flags only; no behavior or format changes.
Full changelog: https://github.com/budhash/tasks/blob/main/CHANGELOG.md
tasks v1.3.0
The renumber verb — reassign an item's ID without hand-editing.
Added
renumber OLD (NEW | --next) [--refs](#12) — the one-command replacement for the multi-branch ID-collision cleanup:- Renames the item's primary line and every
@shadowcopy (features), repoints all@deps=/@rel=lists containing the old ID, and renames the## <OLD>header in# Notes. Prose mentions in titles are never rewritten (per the v1.1.1 tag-region rules). - Refuses an occupied target (use
--nextfor the next free ID of the same kind), cross-kind moves, and no-ops. No--force. --refsprints a read-only report of remaining mentions across git-tracked files (canonical and short forms) — repointing external references is deliberately the operator's job.
- Renames the item's primary line and every
Design doc: docs/superpowers/specs/2026-07-13-renumber-design.md. Pairs with #13 (collision-resistant allocation) and #14 (ref-integrity check) — this verb fixes the collisions that slip through.
Upgrading
Vendored copies: ./tools/tasks.py selfupdate (1.2.0 → 1.3.0). New verb only; no behavior or format changes.
Full changelog: https://github.com/budhash/tasks/blob/main/CHANGELOG.md
tasks v1.2.0
Retitle verb + the shadow-sync fix.
Added (1.2.0)
set ID --title "New title"— replace an item's descriptive title in place, preserving its ID, status, priority, and all trailing machine tags (#18; the retitle half of #11). Applies to the primary line and any@shadowcopies. Titles that would end with a tag-shaped token (e.g.... @milestone=m1) are rejected — on re-parse that token would merge into the machine-tag region; tag-lookalikes elsewhere in a title stay prose.
Fixed (1.1.2)
- Field edits landed on the first line carrying an ID in file order — for a feature with a
@shadowcopy that can be the shadow, not the canonical line.set F-N --milestone m1on such a feature tagged only the shadow, so the feature appeared in both its milestone and thedefaultbucket (#17). The same first-match bug affectedset(all tags),link --deps/--rel,prio, and the status verbs. All field edits now apply to the primary line and every shadow copy, keeping derived copies in sync.
Upgrading
Vendored copies: ./tools/tasks.py selfupdate (1.1.x → 1.2.0). No file migration needed. If you hit the #17 dual-bucket symptom, re-run the affected set ... --milestone once; both copies now get the tag.
Full changelog: https://github.com/budhash/tasks/blob/main/CHANGELOG.md
tasks v1.1.2
Patch: field edits (set/link/prio/status verbs) now apply to the primary line and every @shadow copy instead of the first line in file order — fixes the dual-bucket milestone leak on shadowed features (#17). Full notes roll up into v1.2.0.
tasks v1.1.1
Patch release — a milestone-parsing fix.
Fixed
-
Machine tags (
@milestone=,@deps=,@tags=,@effort=, …) are now parsed and edited only in the trailing tag region of an item line, not by scanning the whole line. A task whose descriptive title merely mentions@milestone=foo(e.g. one titled after the@tags=… → @milestone=…migration) is no longer:- miscounted into a phantom milestone bucket by
milestone, or - treated as an already-assigned conflict and skipped by
migrate-tags-to-milestone.
The write path is fixed too:
set/linkno longer strip a look-alike@key=valueout of the title prose. (#9) - miscounted into a phantom milestone bucket by
Upgrading
Vendored copies: ./tools/tasks.py selfupdate (1.1.0 → 1.1.1). No file changes required — tool-managed TASKS.md lines are unaffected.
Full changelog: https://github.com/budhash/tasks/blob/main/CHANGELOG.md
tasks v1.1.0
First-class milestone support — opt-in and fully backward-compatible.
Added
- Milestone dimension. A task may carry one
@milestone=<id-or-alias>tag; a task without it resolves to an implicit sentinel bucket (default, configurable viaTASKS_MILESTONE_SENTINEL, which must not match theM<n>id pattern). The sentinel is never written to task lines, so existingTASKS.mdfiles round-trip byte-for-byte. - Optional
# Milestonesregistry mapping id → alias → status → title. When present it powers alias resolution (@milestone=alpha≡@milestone=m1) and rollups; when absent, milestones are freeform (grouped by raw value). - CLI:
new … --milestone,set T-N --milestone(""/clear/sentinel-name clears),list --milestone(alias-resolved;default= unassigned),next --milestone, a newmilestonerollup with amilestone <id>detail view and amilestone --table(milestone × features × status) view, and amigrate-tags-to-milestone <tag>helper for projects moving off the interim@tags=<id>convention. Migration leaves a task with a conflicting@milestone=untouched and reports it (never silently drops the label).shownow displays a resolvedMilestone:line. validatewarns (exit 0) on an@milestone=value not in the registry, and on registry-health problems (duplicate ids, colliding aliases), when a registry exists; it never hard-fails on milestone data. Assigning an unknown milestone vianew/setprints a non-fatal freeform warning.
Upgrading
Vendored copies: ./tools/tasks.py selfupdate (1.0.x → 1.1.0). Projects that used the interim @tags=<id> convention can then run ./tools/tasks.py migrate-tags-to-milestone <id>.
Fully backward-compatible: a TASKS.md with no milestone data behaves exactly as before.
Full changelog: https://github.com/budhash/tasks/blob/main/CHANGELOG.md
tasks v1.0.1
Fixed
skip(and moves into## Skipped) crashed withTypeError: NoneType + intwhen the target standard section didn't already exist in TASKS.md. Missing standard sections (Now/Backlog/Skipped) are now auto-created in canonical order. (#1)
tasks v1.0.0
First release — a one-file, zero-dependency, hierarchy-aware TASKS.md task tracker (Python 3.8+).
Highlights
- Features/tasks with stable IDs, priority, status, deps, effort, notes
- Single active-task enforcement, checkbox↔status sync, CI-friendly
validate - GitHub issue
sync; mergedtreeview selfupdateto keep vendored copies current (HTTPS-only, trust-gated, payload-validated)- 155-scenario e2e suite; CI on Python 3.8–3.12
See CHANGELOG.md for details.