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 ./tasksmd 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.2.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.2.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.2.0-cp314-cp314-win_amd64.whl (919.2 kB view details)

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

taskmd-0.2.0-cp313-cp313-win_amd64.whl (919.0 kB view details)

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

taskmd-0.2.0-cp312-cp312-win_amd64.whl (918.9 kB view details)

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

taskmd-0.2.0-cp311-cp311-win_amd64.whl (920.9 kB view details)

Uploaded CPython 3.11Windows x86-64

taskmd-0.2.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.2.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.2.0.tar.gz.

File metadata

  • Download URL: taskmd-0.2.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.2.0.tar.gz
Algorithm Hash digest
SHA256 d9713a3ae4999b126ac6b1662275a5042d5a05be76372c7b63d485584afddc1b
MD5 d4abbabef34f5a9a09db2ba94f09f242
BLAKE2b-256 77c598366d79f48241a6ea49f5fd4c834c6748d24955362c5089629025fe717d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1d6ef64afab28499c23dd7a4865aa0ed52a783c9b8333919738484a9dc2872de
MD5 79ad8ad9728d3527b95c91993337e1f4
BLAKE2b-256 7d811381ce4a93f14e12b39b8d71e45dfa950f5f50843726bb5b76569391d676

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-0.2.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 919.2 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.2.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 05b68b04d4ae582288ad2275c38088d428670e78d71698e8418d4468e574db48
MD5 3049b05f65132fec32eeb1122d42091d
BLAKE2b-256 da502d4355838946c7995183176568911bfea78c487a871df83eebd8240f54e2

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 26469032ce62d1dbe4e209be34881b259b985f3f41bed9433c5f596b58d50ca2
MD5 f66ddacfd8855649a32c7a6311992e28
BLAKE2b-256 b5225358d1e0971c5d8340a283bea729d67a3481eaa78a1c3faf770d3caf4b7c

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.2.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 97b4b5c1117d5c93612ee8daa94bad62081d0987578ea599053c15d39cbf6f99
MD5 ac0ca1d62fdf11a184ed23f7ee789a2c
BLAKE2b-256 36654e634592654d4e60811ace0d57dada7acdbb1dc8c52ba5f938849e74166a

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-0.2.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 919.0 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.2.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 1e5cbc673db13cf5fadca8146509d349e58125447501b0182bc93cf60a1c5d9a
MD5 de4d4358012e23d76e06eb200c0791d0
BLAKE2b-256 4bca8f30c74bfe2671cde9dce46948633ac3a4f89a3ca72b34c6f481847ff321

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d0ac31a8a09ba8e1a0c95925f6874cf1eb9a36e66316885a7270842105494bfc
MD5 4086e3ddbb71a0962f66759bc8347840
BLAKE2b-256 9f1a867ef7f21a6ef9d581dbe2d5aa51d939d001f76e0443a2923681b627903b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b65052653660b8c38d9b8c94ff9c9bb4cf74ff5e4ef4db662fea024e5ad3ecfb
MD5 463e28d68d1e7cb2aba136f9f2b2a010
BLAKE2b-256 f84ed89731840ed506ae5c8f0e4eaa1ff526954df77268147be04f9765428bc3

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-0.2.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 918.9 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.2.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 d4c634feada61eaa7db72ef2c01781542df190ad4c97244827ed8cc7aad3da62
MD5 15cd7aa5af48877af1d40886a1f4325a
BLAKE2b-256 27f002cbfbf8d0d05a1df8dc9681c7520b79a3754e3199b11490d91c70c4272d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9bff7d30801ef27a54264339a46bd56143b05c3edea307e2bb4fa32ee992daf6
MD5 d261d89a9c99248121652be961f81d17
BLAKE2b-256 4813049f0cc5c8b25606bee6fd5e76a774d9b2f4676cc0f8306e668d820c4009

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 0051d83f255704c6282e4b83210fb2086c05fcced0ebe655a29d58c404c654fb
MD5 3db85aff7345c348c493483f4ef324ee
BLAKE2b-256 36a32710edb3b3b8ddb5b2d273ce427631064d8189261a32b5c85f7398e8d30e

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-0.2.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 920.9 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.2.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 6650437c951fc2ae07e5607f732cf33429182d18827376b764fc87c74d78d2d6
MD5 23620de9e16bcbd13f044a112dd3995d
BLAKE2b-256 723e20530d048789bc66a04a8a6585ba4619f291719c5b9f3bd73a9910ba5980

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0bfeb0ea60c560c4d294b9f6d585df81cbc3da34cfb8e5cb79e62a34969d8497
MD5 20c66addb48825de1f21b435af3d8169
BLAKE2b-256 64e0ff88d09da602c88a844c0787cc07c79fadbb7643b84f6c2c050b3ae6c78e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bc646b7818f53d7b666a066647eb312db0f4872ecf7ec275774d50dcba70a782
MD5 6d8efa1908fa1e06509f7dc3e7fa1ad1
BLAKE2b-256 83f445d12b8095bdba927edbc8011fcb16931751de7e4f908148a4d0de724bd5

See more details on using hashes here.

Provenance

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