| name | progress |
|---|---|
| model | fast |
| description | Show progress across all tracking files — TODOs, roadmap phases, commits, blockers, and velocity |
| usage | /progress [--days <N>] [--roadmap <path>] |
Display a unified progress dashboard across TODOs, roadmap phases, recent commits, blockers, and velocity metrics.
/progress [--days <N>] [--roadmap <path>]
Arguments:
--days(optional) — Lookback window for commit history and staleness detection. Defaults to7.--roadmap(optional) — Path to the roadmap file. Defaults todocs/planning/roadmap.md.
/progress # Full dashboard with 7-day lookback (default)
/progress --days 14 # Two-week lookback for velocity and staleness
/progress --days 3 # Short window for daily standups
/progress --roadmap ROADMAP.md # Use a custom roadmap file location
/progress --days 30 --roadmap docs/PLAN.md # Monthly view with custom roadmap
- Reads
TODO.mdand counts items by status — completed, in-progress, pending, and blocked - Reads the roadmap file and determines phase status — done, active, upcoming, or blocked
- Parses git log for the lookback window to collect commits, contributors, and files changed
- Detects stale items — TODOs and roadmap entries with no matching commit activity for N days
- Identifies blockers from TODO tags (
[blocked],[question]) and roadmap annotations - Calculates velocity metrics — tasks completed per day, rolling average, and trend direction
- Computes completion percentages for the overall project and per roadmap phase
- Renders progress bars and a summary dashboard in markdown format
- Highlights at-risk items — stale work, declining velocity, or phases past their target date
- Outputs the full dashboard to the terminal for review
Use TodoWrite to track progress through each phase.
Read TODO.md and classify every item using regex pattern matching:
| Pattern | Status | Symbol |
|---|---|---|
- [x] or * [x] |
Completed | [x] |
- [-] or ~.*~ |
Cancelled | [-] |
- [/] or [in.progress] tag |
In-Progress | [/] |
- [ ] with [blocked] tag |
Blocked | [!] |
- [ ] (default) |
Pending | [ ] |
Use these regex patterns for detection:
completed: /^[\s]*[-*]\s*\[x\]/mi
cancelled: /^[\s]*[-*]\s*\[-\]/mi
in_progress: /^[\s]*[-*]\s*\[\/\]|(?:\[in.progress\])/mi
blocked: /^[\s]*[-*]\s*\[ \].*\[blocked\]/mi
pending: /^[\s]*[-*]\s*\[ \]/mi
Group TODOs by section header (H2/H3) if the file uses headings. Count items per status and compute the overall completion percentage:
completion_pct = (completed + cancelled) / total * 100
Read the roadmap file and extract phase information. Detect phases from H2/H3 headers and classify:
| Phase Marker | Status |
|---|---|
Header contains ✅, [done], or [complete] |
Done |
Header contains 🔄, [active], [current], or [in-progress] |
Active |
Header contains ⏳, [upcoming], [planned], or [next] |
Upcoming |
Header contains 🚫, [blocked], or [on-hold] |
Blocked |
| No marker — infer from child items | Inferred |
For phases without explicit markers, infer status from child TODO items:
- All
[x]→ Done - Mix of
[x]and[ ]→ Active - All
[ ]→ Upcoming
Calculate per-phase completion:
phase_pct = phase_completed / phase_total * 100
Run git commands to collect commit data within the lookback window:
# Commits in the lookback window
git log --since="$DAYS days ago" --format="%H|%h|%s|%an|%ai" --reverse
# Files changed with stats
git log --since="$DAYS days ago" --format="" --numstat
# Commit count per day
git log --since="$DAYS days ago" --format="%ad" --date=short | sort | uniq -cBuild a per-day commit frequency table for velocity calculations.
Cross-reference TODO items and roadmap entries against git history to find stale work:
- Extract keywords from each pending or in-progress TODO item
- Search git log messages for those keywords within the lookback window
- Flag items with zero matching commits as stale
| Staleness | Threshold | Label |
|---|---|---|
| Fresh | Activity within the last 3 days | — |
| Aging | No activity for 4–7 days | ⚠ aging |
| Stale | No activity for 8–14 days | 🔴 stale |
| Dormant | No activity for 15+ days | 💀 dormant |
Staleness thresholds scale with the --days flag — if --days 30, the thresholds double.
Collect blockers from multiple sources:
| Source | Detection |
|---|---|
TODO.md |
Items tagged [blocked], [question], or [waiting] |
| Roadmap | Phases marked [blocked] or [on-hold] |
| Git messages | Commits containing blocked, blocker, waiting on, depends on |
| Code comments | FIXME, HACK, XXX markers in files changed within the lookback window |
Deduplicate blockers by keyword similarity and present as a flat list with source attribution.
Compute velocity metrics from TODO completions and commit history:
tasks_per_day = completed_in_window / days
commits_per_day = total_commits / days
trend = (last_half_avg - first_half_avg) / first_half_avg * 100
| Metric | Calculation |
|---|---|
| Tasks/day | TODOs marked [x] with matching commits in window ÷ days |
| Commits/day | Total commits in window ÷ days |
| Trend | Compare first-half vs second-half of window, report as ▲/▼/► percentage |
| Est. completion | Pending items ÷ tasks/day = estimated days remaining |
If velocity is zero (no completions in the window), report "No tasks completed in the last N days" and skip estimated completion.
Generate markdown-compatible progress bars using block characters:
# Full block: █ Empty block: ░ Width: 20 characters
def progress_bar(pct):
filled = round(pct / 100 * 20)
empty = 20 - filled
return f"{'█' * filled}{'░' * empty} {pct:.0f}%"
# Examples:
# ████████████████░░░░ 80%
# ██████████░░░░░░░░░░ 50%
# ████░░░░░░░░░░░░░░░░ 20%
Render a bar for:
- Overall project completion
- Each roadmap phase
- TODO categories (completed vs total)
Combine all data into the output template (see Output section). Ensure every section has data or an explicit "N/A" note. Output to the terminal.
The terminal output follows this structure:
# Progress Dashboard — YYYY-MM-DD
**Window:** Last N days
**Generated:** YYYY-MM-DD HH:MM
---
## TODO Status
| Status | Count | Bar |
|-------------|-------|------------------------------|
| ✅ Completed | 12 | ████████████████░░░░ 80% |
| 🔄 In-Progress | 2 | ██░░░░░░░░░░░░░░░░░░ 13% |
| ⏳ Pending | 1 | █░░░░░░░░░░░░░░░░░░░ 7% |
| 🚫 Blocked | 0 | ░░░░░░░░░░░░░░░░░░░░ 0% |
| **Total** | **15** | ████████████████░░░░ **80%** |
## Roadmap Phases
| Phase | Status | Progress |
|--------------------------|----------|------------------------------|
| Phase 1: Foundation | ✅ Done | ████████████████████ 100% |
| Phase 2: Core Features | 🔄 Active | ████████████░░░░░░░░ 60% |
| Phase 3: Polish | ⏳ Upcoming | ░░░░░░░░░░░░░░░░░░░░ 0% |
## Recent Commits (last N days)
| Date | Count | Highlights |
|------------|-------|-------------------------------------------|
| 2026-02-06 | 4 | Add auth middleware, fix token refresh |
| 2026-02-05 | 6 | Implement user dashboard, add tests |
| 2026-02-04 | 2 | Update dependencies, fix CI pipeline |
**Total:** 12 commits across 8 files (+340, -87 lines)
## Blockers
| # | Source | Description |
|---|-----------|-----------------------------------------------|
| 1 | TODO.md:8 | Waiting on API key from payment provider |
| 2 | roadmap | Phase 3 blocked on design review completion |
## Stale Items
| Item | Last Activity | Status |
|-----------------------------------|---------------|--------------|
| Add CSV export to reports | 12 days ago | 🔴 stale |
| Refactor notification service | 18 days ago | 💀 dormant |
## Velocity
| Metric | Value |
|-------------------|----------------|
| Tasks/day | 1.7 |
| Commits/day | 4.2 |
| Trend (7d) | ▲ +15% |
| Est. completion | ~3 days |
---
Overall: ████████████████░░░░ 80% complete- Never modify
TODO.mdor the roadmap. This command is read-only. Report status without changing source files. - Never fabricate commit data. Only include commits that appear in
git logfor the lookback window. - Never count the same item twice. Deduplicate TODOs that appear in both
TODO.mdand the roadmap. - Never report velocity without sufficient data. If the window contains fewer than 2 completed tasks, note that velocity is unreliable.
- Never assume item status from keywords alone. Use the checkbox pattern (
[x],[ ]) as the source of truth, not the text content. - Never skip staleness detection. Stale items are the most actionable insight — always surface them.
- Never render progress bars wider than 20 characters. Wider bars break alignment in terminal output and narrow editors.
- Never report estimated completion as a commitment. Always prefix with
~orest.and note that it assumes constant velocity.
- If
TODO.mddoes not exist, skip the TODO section and note: "No TODO.md found — create one to enable task tracking." - If the roadmap file does not exist, skip the roadmap section and note: "No roadmap found at
[path]. Use--roadmapto specify a custom location." - If the git repository has no commits in the lookback window, report: "No commits in the last N days. Expand the window with
--days." - If the project is not a git repository, skip commit history, velocity, and staleness detection. Report TODO and roadmap status only.
- If
TODO.mduses a non-standard format (no checkboxes), attempt to parse by line and warn: "Non-standard TODO format detected — counts may be approximate." - If velocity is zero, skip estimated completion and note: "No tasks completed in the window — estimated completion unavailable."
- Optional automation: Run
python3 scripts/context_health.pyto score context health (0–100) across freshness, completeness, consistency, and coverage. - Optional automation: Run
python3 scripts/aggregate_context.pyto aggregate all context files into a unified summary.
- Command:
/session-summary(detailed single-session view vs cross-session progress) - Command:
/start-task(creates the task plans that feed into progress tracking) - Command:
/review-code(quality check before marking tasks complete) - Agent:
ai/agents/development/