Skip to content

Releases: budhash/tasks

tasks v1.4.1 — migration-ready (docs)

Choose a tag to compare

@budhash budhash released this 16 Jul 07:48
b367602

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 below CLAUDE.md and 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; --table attributes 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.md now showcases milestones (registry + @milestone= tags); still validates.
  • CONTRIBUTING.md/CLAUDE.md aligned with actual process (squash-merge only; gh release create every 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

Choose a tag to compare

@budhash budhash released this 16 Jul 06:19
97dc350

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-allocate max(local, ref) + 1 by reading TASKS.md at the ref, so a branch forked from main can't re-issue IDs main already 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

Choose a tag to compare

@budhash budhash released this 13 Jul 22:44
0c586c0

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 @shadow copy (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 --next for the next free ID of the same kind), cross-kind moves, and no-ops. No --force.
    • --refs prints a read-only report of remaining mentions across git-tracked files (canonical and short forms) — repointing external references is deliberately the operator's job.

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

Choose a tag to compare

@budhash budhash released this 13 Jul 19:54
8ca3036

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 @shadow copies. 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 @shadow copy that can be the shadow, not the canonical line. set F-N --milestone m1 on such a feature tagged only the shadow, so the feature appeared in both its milestone and the default bucket (#17). The same first-match bug affected set (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

Choose a tag to compare

@budhash budhash released this 13 Jul 19:54
3f631ce

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

Choose a tag to compare

@budhash budhash released this 01 Jul 23:13
63760d5

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/link no longer strip a look-alike @key=value out of the title prose. (#9)

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

Choose a tag to compare

@budhash budhash released this 01 Jul 22:56
0654ea4

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 via TASKS_MILESTONE_SENTINEL, which must not match the M<n> id pattern). The sentinel is never written to task lines, so existing TASKS.md files round-trip byte-for-byte.
  • Optional # Milestones registry 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 new milestone rollup with a milestone <id> detail view and a milestone --table (milestone × features × status) view, and a migrate-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). show now displays a resolved Milestone: line.
  • validate warns (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 via new/set prints 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

Choose a tag to compare

@budhash budhash released this 22 Jun 06:34

Fixed

  • skip (and moves into ## Skipped) crashed with TypeError: NoneType + int when 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

Choose a tag to compare

@budhash budhash released this 21 Jun 20:52

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; merged tree view
  • selfupdate to 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.