Repository navigation
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