[x]mdtask

Evergreen
Spec-Driven Development
with task-driven specs

A spec is a single Markdown file.
Your app's behavior sits on top.
Planned tasks live as checkboxes below.

Ideal for an agent loop. On each pass your agent picks an unblocked task, builds it, and closes it in one commit — code, checkbox, and updated spec.

Plain files in your repo, with tracker features from the CLI.

docs/specs/auth.md
# Authentication
## Login
Users sign in with email and password.
Sessions last 30 days; refresh tokens rotate on every use.
spec
· · ·
# Tasks
- [x] AUTH-001 Add email and password login
      **Implemented:**
      POST /auth/login verifies the password hash
      and issues a 30-day session cookie.
- [x] AUTH-003 Rotate refresh tokens on every use
      **Implemented:**
      Each refresh swaps the token, revokes the old one.
- [ ] AUTH-004 Add passwordless magic-link login !high
      Email a one-time link that signs the user in.
- [ ] AUTH-005 Rate-limit the magic-link @blocked_by:AUTH-004
      Cap requests per email and per IP once the endpoint exists.
tasks

Living Specs

One commit carries the code, the task closure, and the spec update.

Agents follow a predefined skill-based workflow. A task is not complete until the implementation, task state, and documentation are updated together.

The usual way
Code is shipped and the task is closed, but the spec is stale
docs/specs/auth.md
# Authentication
## Login
Users sign in with email and password.
Sessions last 30 days.
Forgot to add magic-link login behavior
## Password reset
Users request a reset link by email.
## Security
Failed attempts are throttled per IP.
bash
$ git show --stat a1b2c3d
a1b2c3d AUTH-004 Add magic-link login
auth/magic-link.ts+128
auth/views.ts+34
2 files changed, 162 insertions(+)
AUTH-004 Done
Add magic-link login
High Auth JD
With mdtask
Spec updated in the same commit :)
docs/specs/auth.md
# Authentication
## Login
Users sign in with email and password.
Sessions last 30 days.
Plus a one-time magic link that signs the user in.
## Password reset
Users request a reset link by email.
## Security
Failed attempts are throttled per IP.
# Tasks
- [x] AUTH-004 Add magic-link login
bash
$ git show --stat a1b2c3d
a1b2c3d AUTH-004 Add magic-link login
docs/specs/auth.md+3
auth/magic-link.ts+128
auth/views.ts+34
3 files changed, 165 insertions(+)

J**A SUCKS!!!

The tracker is your repo

Each spec is one file. Together they are your backlog.

Each file shows what already works and what tasks are planned.

No boards. No database. No workspace. Just files in your repo.

docs/specs/auth.md
# Authentication
## Login
Users sign in with email and password.
Sessions last 30 days; refresh tokens rotate on every use.
# Tasks
- [x] AUTH-001 Add email and password login
      **Implemented:**
      POST /auth/login verifies the password hash
      and issues a 30-day session cookie.
- [ ] AUTH-004 Add passwordless magic-link login !high
      Email a one-time link that signs the user in.
terminal
$ ls docs/specs/
auth.md billing.md onboarding.md search.md
terminal
$ mdtask list
[ ] AUTH-004 Add passwordless magic-link login !high
[ ] AUTH-005 Rate-limit the magic-link @blocked_by:AUTH-004
$ mdtask list --all
[x] AUTH-001 Add email and password login
[x] AUTH-003 Rotate refresh tokens on every use
[ ] AUTH-004 Add passwordless magic-link login !high
[ ] AUTH-005 Rate-limit the magic-link @blocked_by:AUTH-004
$ mdtask view AUTH-005
docs/specs/auth.md:42
[ ] AUTH-005 Rate-limit the magic-link @blocked_by:AUTH-004
Cap requests per email and per IP once the endpoint exists.

CLI

Query your Markdown specs like a task tracker.

Open tasks Blockers Tags Custom fields Relationships Archive Missing IDs

It's just Markdown

A checkbox, stable ID, title, and optional description make a task. Priority, tags, and custom fields can be added when needed.

docs/specs/cli.md
# CLI
 
...
 
# Tasks
- [ ] CLI-042 Add export command    #cli !high @blocked_by:CLI-041
      Write task output as JSON for scripts and agents
 
 
...
 

@blocked_by is a custom field mdtask understands out of the box.
The task shows up as blocked.

How it's different

Most tools split specs and tasks into different places. mdtask keeps them in one Markdown file.

Get started in a minute

Your agent does this from one instruction — not you by hand.

1
Install the CLI
2
Ask your agents to install the skills

One commit.
Code, task, and spec.

No second system to chase.
Full command reference in the README →