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.0.tar.gz (52.5 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.0-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.0-cp314-cp314-win_amd64.whl (916.4 kB view details)

Uploaded CPython 3.14Windows x86-64

taskmd-0.4.0-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.0-cp314-cp314-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

taskmd-0.4.0-cp313-cp313-win_amd64.whl (916.5 kB view details)

Uploaded CPython 3.13Windows x86-64

taskmd-0.4.0-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.0-cp313-cp313-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

taskmd-0.4.0-cp312-cp312-win_amd64.whl (916.4 kB view details)

Uploaded CPython 3.12Windows x86-64

taskmd-0.4.0-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.0-cp312-cp312-macosx_11_0_arm64.whl (1.0 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

taskmd-0.4.0-cp311-cp311-win_amd64.whl (917.8 kB view details)

Uploaded CPython 3.11Windows x86-64

taskmd-0.4.0-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.0-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.0.tar.gz.

File metadata

  • Download URL: taskmd-0.4.0.tar.gz
  • Upload date:
  • Size: 52.5 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.0.tar.gz
Algorithm Hash digest
SHA256 bf3fd772a9df72016444c7d20c82e5b51947b018b36c7f3436077bb9289157fc
MD5 eeb7fbc58dde5bdacf00c56ca83b2852
BLAKE2b-256 8cb67c88c5b5714ac90ec80bf911ba5d7dc838e6259d8ca9bfdb9a9c05611971

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0.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.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 056da25bcab029ad550006645dadc471031897ca80b816ca30192b0d78e27b09
MD5 1fa0dd5b2c0e4e4aab47018c887564f6
BLAKE2b-256 75d7728b6c5a38d184fd52415ecd6d0996c1552512e32dc63fc36793f1a4e833

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: taskmd-0.4.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 916.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.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 e93115b54877687f1e6c731f6c345948b2f4093d1c19f4fa3cc37c8008c10949
MD5 089d7b0a2313349809757dcb17c5ddd6
BLAKE2b-256 d294b36bd794b74e1242b09743ea5277a78c3f55c7ed30f39561f5df6e1b7541

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4a63162785a5c3122b47a3278f3fac6863a34e56bfe964901a40a669c2e56ac2
MD5 b275b011f7c466fd8803b190ba086b2a
BLAKE2b-256 0ed62176d34bd9a3c9b900e8c5b8a4982732f9e15fd011ff3362e932d50b95a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c5344f38d4a63f343757983cf8d214289999726dfb6822c3beef9baffef0f66e
MD5 feacf742a37512c7890d5713fe5a9fe7
BLAKE2b-256 1b9d68e268604a47ff494ebc0cf4c77b5f1e2bd2590c64262b8a62e7a33bd4c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: taskmd-0.4.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 916.5 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.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 8a610eab494a07beccba51ddd8c999ee00086d583d53dd204c5b4fbde8bfcc61
MD5 974063d85e5713a192eb07dff72ffcc9
BLAKE2b-256 d779fbef6b3ec71e28365db65139b3a3d83f3a86eea40bfc39c9e715f8c4d0b5

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 a45d2909aeec03f4102637c43671be23fb782c27a908753e5e9b284bff50c14f
MD5 16fea0335efda6f33e3857428b07e1ad
BLAKE2b-256 a8e713d947e23a4d33b8a117dde70c69e1f6875232ff0ecadc517348e02bdc55

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e1be8a4f205d4904379b06df404fc1e75721638e8361de13321a64ca6c14d089
MD5 f5fe5a4407e57ac8d806590a384d512f
BLAKE2b-256 1f02002b4b0c465e7581758464e2e50295b0fdc1844948b0e57c737abf29a626

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: taskmd-0.4.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 916.4 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.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 a6614241d50a9347e4815dfd25077a2c4872b31965b295d2b808264628e6fe1c
MD5 9565711360bca95efe4d2cfa9ff81c3e
BLAKE2b-256 8fb3d3d449ad48c3f1107c0523d7624b36f7a2ba475e162b031a03818be585bb

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 74e998a21f788ccf8bee499aa4496de6bb529f8696510a858d96d9c7334516ae
MD5 b0c68a8ee9028cb9373f7806e6e23bce
BLAKE2b-256 30caba8cd4fdd692f14c490c9be841cd65df672bba511d7d5809693abdb83f84

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 894779ed5059068f40e9b1dd6738acad24414a21b2be487e10e08706a58ac885
MD5 17fcb4de11933a850c65c13bd43bf3b9
BLAKE2b-256 b8fb0a350e078e190d840ed11da2b5c77a73b33e7e04587626b6b2cc74ea8acd

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: taskmd-0.4.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 917.8 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.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 f51426cbde15f3450bc41cda226f3f768d5025d0187a0ad60efe00f6e5a2d54b
MD5 280fdeac488dc1efe6fe4658d928081b
BLAKE2b-256 26112e2488166a8d091e395aa4744aad95665284205060df3ee80e6190256c63

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e67695e092c27b6ed7c4863fc177f9434e79824c153ba4358f49c45e6fb8a9f7
MD5 78a555b07f93c62d326a8fba0ad3cfe1
BLAKE2b-256 c903d9b03208b11b39edb92d0a4ba914d8aea37a01a60c7d3ada9edeac3e1e8d

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for taskmd-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5bdf00a84c2a5d8c00673e6fbacb2945adbfd6cdfd85e7ecad5a27e72f208918
MD5 a404cce427c0584be8b83c5e14e5db3c
BLAKE2b-256 990efa9c148cb69a6ec060ce06984b4d30b268323534bb4375c269648a3193aa

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-0.4.0-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