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.3.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.3.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.3.0-cp314-cp314-win_amd64.whl (916.4 kB view details)

Uploaded CPython 3.14Windows x86-64

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

Uploaded CPython 3.14macOS 11.0+ ARM64

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

Uploaded CPython 3.13Windows x86-64

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

Uploaded CPython 3.13macOS 11.0+ ARM64

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

Uploaded CPython 3.12Windows x86-64

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

Uploaded CPython 3.12macOS 11.0+ ARM64

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

Uploaded CPython 3.11Windows x86-64

taskmd-0.3.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.3.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.3.0.tar.gz.

File metadata

  • Download URL: taskmd-0.3.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.3.0.tar.gz
Algorithm Hash digest
SHA256 d91c818351ff0e9b6a145b568dc32d59e74406a548b409bca2ac8d0041af84a1
MD5 084689fe752e8b072716a415eee8ff75
BLAKE2b-256 10e60adcc6b59100509bda31995b5be570bee3bb5aa6c1929b3156138d2958d5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.3.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 83e710cc18147a9f79969aa04c6f350c33ea3cc4780cd2bd7e575a3344a8b9cf
MD5 6c23f6960f9f95ae4c5bb5f47a4ec615
BLAKE2b-256 850f939b9b0d5b7b4d4c59e1e5bee52aced984012c3495a6bba2b5daccb7f1a8

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-0.3.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.3.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 06158c12c887f58fb21c9600a69be6f7fcf2ccf3afe31ab0795ab76552164c22
MD5 3ba6ac523df95d0a822faa384c292ea5
BLAKE2b-256 0c1b3b9f9cbb750203af544c72fff3c4165f0a767ba18c04ca6d52dc087c21da

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 7b9885c5bca523b115c97ee9e6ebd00653dab361ffc5e508b492f67894a8695d
MD5 7c8b0195b22402047832ab6267b40a38
BLAKE2b-256 ed833c9d2c57634f4cd58cefb4993c1feb500e24ea4b59fb0547a9a2cc682e8d

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.3.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6d8ec4ff8fdbfefb2803518057bed7ced4d51820b6a6ce68dfb88ff14df957b1
MD5 0ff26a55aa8ef0bb6635d4ddef59ae2d
BLAKE2b-256 c41914e1baeb7f749a8ef100bfe0c36ff3ef3c65ecf4cc4f69c8e0320ab82748

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-0.3.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.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 5f71c12a5ca2aca96f867dac8e8dac541f56a1876235747b9b347c8af9839933
MD5 7289a1873dea4731b6cef630d5ec17c8
BLAKE2b-256 96eac6ee6f41f06e27c8c3abc91ba8768144b4b27a1bca0eaf75eb0182f7e781

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 0fae23f98a0bb49bf149c57246593efcabe264a60f2acb14e9b1ea2446578939
MD5 2488181ffed8907bf7e79a24e4437aed
BLAKE2b-256 ab93c5596696a22b2e9fde7c0fff35e771ff9cec8d26ddacd5363fdd202a03b0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d1324786426ee2e9e031180256544b4f8a134a7720ecc1f40e499cde4a67ca8b
MD5 1509e5ecb94ec2b1f6e3d82e6f563826
BLAKE2b-256 09ad904ec8231985c84785ace4c68d2a97361c392366683aee10088d0a8da9dc

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-0.3.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.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 c4640831c36f74c50e2a5f30f2655e92c1d08b8968c9a48c0ab186d952587331
MD5 49e175023b1fb830f01e16177bf95546
BLAKE2b-256 7cba67365e6f244f1d911299ecbeee1578d145dc2f136fa5726fcf384089a09e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 24af534aae56c4b14ae7926682ac04d4e12150ca8646101badb98939c1a64a2d
MD5 4911b653feb80ff8c0e4c3e78b9dd409
BLAKE2b-256 41a09763b3f33e1f34f37f29715cddb4671f4dc7e2fd129f7833ebf32a0d450f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 73a8dfe9a1f2485cf66cce21a3a5f48d57bb6e2dcbe4b4a663acb0b6bb617bf1
MD5 ca69011d7048fcf7460b6733049563d0
BLAKE2b-256 e829315fdca1480feb2e507fb1c6b2708928b4225a798cc4c231bbcd173cf79f

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-0.3.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.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 3e045dd24fe8fb38fa63d1e4511e4325e4699648b2aea806f4cd5ba8055ede27
MD5 22ba768f620c95a18ba88e324a3c3299
BLAKE2b-256 59d809ebc6877a5c09953ee47e96e8ea7b6e99da1b51a5c7d45b99d6bbe3ab6a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c9bb2995ef44325c266fe73b6659ef801a42a8b176e170f48bff59d3e7222652
MD5 4df5e918f415bc9f22eb23bdfbe5f6ad
BLAKE2b-256 da8d6297b586d805b120eef68724b6944ddc80f2ecd0343508fbc09fb99f9210

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-0.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bc7f3a4cd5d1957172dd97fb9c45b9e5d7da1ffd806da472543d28889408cf37
MD5 51afa3d2107563b928108da09f0c3e7a
BLAKE2b-256 3b60f93c4ca5729a9c40d8e5e979260e0c6818197ab726263b15e6180ebb442e

See more details on using hashes here.

Provenance

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