Skip to main content

Markdown-native task management for developer projects

Project description

task.md

Most task trackers assume a human is driving. But when an LLM agent picks up a task, it needs structured metadata -- priority, status, completion criteria -- not a Jira ticket behind an OAuth wall. And when a human reviews that same task, they don't want to parse JSON. They want to read a file.

taskmd makes tasks that work for both. Each task is a markdown file. Metadata lives in the filename and YAML frontmatter. The filesystem is the data store, git is the audit trail -- no database, no config, no coordination server.

tasks/
  34001-p1-done--initial-setup.md
  34002-p2-ready--add-feature.md
  34003-p3-blocked--waiting-on-api.md

Three properties make this work:

  • Filesystem-native. Tasks are files. Create them with your editor, move them with mv, search them with grep. Every tool you already have works.
  • Git-native. Status changes are commits. Branches get their own task state. Merges resolve naturally. git log is your audit trail.
  • Agent-native. When taskmd detects it's running inside Claude Code, Cursor, Codex, or a dozen other agents, it automatically switches to structured JSON output -- same files, same commands, zero configuration.

Install

pip install taskmd

Or run without installing:

uvx taskmd validate
uvx taskmd list

Quick start

taskmd init                                                                                         # create tasks/ with a template
echo "Fix the login redirect loop when JWT is expired." | taskmd new --slug fix-login --artifact src/auth.py
cat body.md | taskmd new --slug add-oauth --artifact src/oauth.py --priority p1                      # body from file
taskmd status 34042 in-progress                                                                      # change a task's status atomically
taskmd validate                                                                                      # check all task files for consistency
taskmd fix                                                                                           # auto-repair filenames, dates, legacy formats, duplicate IDs
taskmd list                                                                                          # list tasks with metadata
taskmd list --status ready --priority p0                                                             # filter to what matters

taskmd new is the recommended way to create tasks — it allocates the ID, formats the filename, synthesizes the frontmatter, and writes the file in one atomic step. The body is required on stdin; a task with no description is a placeholder that pollutes triage. taskmd next exists for integrations that need just an ID string, but it's a sharp edge (two concurrent callers can receive the same ID).

All commands auto-detect ./tasks or ./taskmds as the default directory. Pass a path to override.

Agent mode

When run inside an LLM coding agent, taskmd auto-detects the environment and switches to JSON output. The agent gets structured data; the human reading the same file gets markdown. No separate "agent API" to maintain.

taskmd --agent validate          # structured JSON envelope
taskmd --agent --help            # self-documenting schema for agents
taskmd --agent --compact --help  # minimal schema (fewer tokens)

Detection is automatic for Claude Code, Cursor, Codex, Windsurf, Aider, Cline, Amazon Q, Gemini Code Assist, Cody, and any tool that sets AGENT=1.

Task file format

Filename: DDNNN-pX-status--slug.md

---
created: 2026-03-04
priority: p2
status: ready
artifact: src/feature.py
---

# Task Title

## Summary
What needs to be done.

## Done When
- [ ] First criterion
- [ ] Second criterion

Statuses: ready, in-progress, blocked, done, wont-do, brainstorming

Priorities: p0 (critical) through p4 (polish)

Artifact: the concrete output this task produces (file path, config change, commit). Required -- if you can't name one, the task probably shouldn't exist.

Only these four fields are allowed in frontmatter. Unknown fields are rejected by validation.

To change status: taskmd status <id> <new-status> updates the frontmatter and renames the file to match in one atomic step. It refuses to clobber an existing target filename and rejects invalid statuses up front. Hand-editing the status: field and running taskmd fix still works as an escape hatch, but taskmd status is the preferred path.

Task IDs

IDs are 5-digit numbers (e.g., 34042). The first digit is derived from the machine's hostname, the second from the tasks directory path. This avoids ID collisions across machines and git worktrees without any coordination.

Set TASKMD_MACHINE_ID=0 to pin the first digit on your primary machine.

Library

taskmd is also a Python library -- the CLI is a thin wrapper around it.

pip install taskmd
from taskmd import validate, fix, next_id, list_tasks

result = validate("tasks")
if not result.ok:
    for err in result.errors:
        print(err)

tasks = list_tasks("tasks")
for t in tasks:
    print(f"{t.id:5s} {t.priority} {t.status:12s} {t.slug}")

n = next_id("tasks")
print(f"Next task: {n}")

Use from a PEP 723 script

#!/usr/bin/env -S uv run
# /// script
# requires-python = ">=3.11"
# dependencies = ["taskmd"]
# ///

from taskmd import validate

result = validate("tasks")
if not result.ok:
    print(f"Task validation failed: {len(result.errors)} errors")

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

taskmd-0.4.1.tar.gz (52.7 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

taskmd-0.4.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

taskmd-0.4.1-cp314-cp314-win_amd64.whl (919.4 kB view details)

Uploaded CPython 3.14Windows x86-64

taskmd-0.4.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

taskmd-0.4.1-cp314-cp314-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

taskmd-0.4.1-cp313-cp313-win_amd64.whl (919.2 kB view details)

Uploaded CPython 3.13Windows x86-64

taskmd-0.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

taskmd-0.4.1-cp313-cp313-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

taskmd-0.4.1-cp312-cp312-win_amd64.whl (919.1 kB view details)

Uploaded CPython 3.12Windows x86-64

taskmd-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

taskmd-0.4.1-cp312-cp312-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

taskmd-0.4.1-cp311-cp311-win_amd64.whl (921.1 kB view details)

Uploaded CPython 3.11Windows x86-64

taskmd-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

taskmd-0.4.1-cp311-cp311-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

Details for the file taskmd-0.4.1.tar.gz.

File metadata

  • Download URL: taskmd-0.4.1.tar.gz
  • Upload date:
  • Size: 52.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for taskmd-0.4.1.tar.gz
Algorithm Hash digest
SHA256 1604ed60cacdecc250925018156b364db1e3201428832e794505e14c759c4ddb
MD5 62e06305fc80c4311d462da15a79f8cd
BLAKE2b-256 11b1f7142ed114ca1c9ef3e64d25c1b75a3854eb201117234e904f5f6c1a0232

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1.tar.gz:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d210415e656ab5b9e1f4a55abbfdbe73460a1f849c27a34c3403cfa88a9af391
MD5 daf6308021e2315fdd4dc9294c05c1c1
BLAKE2b-256 08df5ce4e2a56d014b97ae7435ec1f7d0abd4392bca37ab89ef3aaf99bcb89c1

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: taskmd-0.4.1-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 919.4 kB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for taskmd-0.4.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 1901f4c4611de9d458af471e92f4b9812b64ce914c5e44a63c8bcfe2820aea50
MD5 5d5a0c8c79a725b58d8347de531747b1
BLAKE2b-256 73ece0f23982bc94fdb225c3e33d8558913795b846dc75cc0bd235bd5ffbead9

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp314-cp314-win_amd64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1d4958d251a649326c7e540a532ca045fff0efdb982a3ab320f164bd50bf955e
MD5 30876fb70c49f01d7f310467b0f45468
BLAKE2b-256 30d02c19eef33410b9f65169c7a623b1e36c7475e16d7c0a71334e5a788d3028

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0197bda95f97f89f74184fe1b8104cfbc8f5a874607b82595a1afa78f3e8e1bd
MD5 97d71bd48714f6770819e58b2e04cd2c
BLAKE2b-256 2d4e50973509e428a5b536821028682c60d3c1b6dc3faaefa7b348fed1ec325b

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp314-cp314-macosx_11_0_arm64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: taskmd-0.4.1-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 919.2 kB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for taskmd-0.4.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 294aa16a352a3df8554edf6d633741468659d61704c9fc49a52ffd27c67f95c2
MD5 58915dc286ad84ae39bfea0f23dd53bf
BLAKE2b-256 f89514fe2a9e315454b0f88221e62523924294b389aa9a7a5a94319a4f65e7e8

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp313-cp313-win_amd64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 821f5b2efc438e8d97e4b7d9936fe649b4dd33f3d8ea48ecdfb444e52bbf830d
MD5 0d66602a2dd12a5480632d3cc20f310c
BLAKE2b-256 c2e4eb704b0f4c31de174d549f38eac7b1b5a2aaba5eba3a8674916afbb73a4e

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 049f38a179a59563ad434a10f1b3fe96937823ef692beab82352616519ca9750
MD5 1a366e06d154b8330562712c8fdae334
BLAKE2b-256 693ce2153ef07d260f32e80c9ba7e84668dd57eb43e5f05f8a5b097f396fa982

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: taskmd-0.4.1-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 919.1 kB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for taskmd-0.4.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 fc51cb9fcc9efca58faac9015ba9cfc32fb3ead339a5e9276b26d65a28ab75e1
MD5 613bc2ae218e40c4723d87058e50fd9f
BLAKE2b-256 e238f5ddf534ad1dd532c83f18eed60f023442e224c6792796a49bf5518dff3d

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp312-cp312-win_amd64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3e0c401290a730b4032db05dfbd8e09c8fe3a8fbccfb626866632e8faa070398
MD5 37e7329e8c19bb13411d4f815f64da9e
BLAKE2b-256 c6868fbbad668b7e7e0c36cbc97f26a8bd482ca06fd70d458ebbe692f5893814

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 460f0a4f7590a65b6f5b5abd4f95ccb513b23fb1877b9fc843fc6473e1d1aedb
MD5 6f9c05de21bf6b029c46d32d53560273
BLAKE2b-256 e721ea967c20f2172c0f912dd8a864a0ca396607767f6f75d4d806d2e500e336

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: taskmd-0.4.1-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 921.1 kB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for taskmd-0.4.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 273178270210ec1e8fd7cf49c71f29b21e105928aeaff832e368f0601906b7a0
MD5 1a3bee8f9272f2ff64804944e84a3ee1
BLAKE2b-256 64a8bec8ed27ea9280a2f198f45fe2667313f7160f827377d7efbb93da31151e

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp311-cp311-win_amd64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3bafd2e5975a72c1538c99b63185ba02e46ff9aacb5fa62005d5e5b6594e6006
MD5 a25564bf617b47f90439594c55bc1c81
BLAKE2b-256 309935d889d519f9ddfb9ec909469b7d717d843c61c3bda3f2df2547e7b80689

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file taskmd-0.4.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d08fa9b85ce22e4855abe958e331071db0b7e04fe4e4b2792cd6c26c07099a09
MD5 3755230483e04dd25cfb8e5a498bfbdb
BLAKE2b-256 4081fda8a427837a02ce2779d2a1ca9d04b2de556f01a5b0f8d407fb2d2e8679

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.1-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: publish.yml on scottopell/taskmd

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page