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. All metadata lives in the filename. The body is free-form markdown. 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 renames, which 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
cat body.md | taskmd new --slug add-oauth --priority p1                       # body from file
taskmd status 34042 in-progress                                               # change a task's status atomically
taskmd validate                                                               # check filenames for consistency
taskmd fix                                                                    # auto-repair legacy IDs and 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, 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 a single immediate child directory containing _TEMPLATE.md (for example ./tasks or ./tickets) 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

# Task Title

## Summary
What needs to be done.

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

The filename is the only source of truth. The body is free-form markdown.

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

Priorities: p0 (critical) through p4 (polish)

To change status: taskmd status <id> <new-status> renames the file. It refuses to clobber an existing target filename and rejects invalid statuses up front.

Task IDs

IDs are 5-digit numbers (e.g., 34042). The first two digits are a hash of (machine_identity, tasks_directory_path) mod 100. Different machines and different worktrees on the same machine land in different buckets, avoiding ID collisions without coordination. Birthday-50% collision point is ~12 concurrent worktrees.

Set TASKMD_MACHINE_ID to override the machine-identity input (any string; replaces hostname in the hash). Useful in ephemeral containers where the hostname is constant across sessions.

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-1.3.0.tar.gz (55.3 kB view details)

Uploaded Source

Built Distributions

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

taskmd-1.3.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

taskmd-1.3.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ x86-64

taskmd-1.3.0-cp314-cp314-win_amd64.whl (881.1 kB view details)

Uploaded CPython 3.14Windows x86-64

taskmd-1.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

taskmd-1.3.0-cp314-cp314-macosx_11_0_arm64.whl (943.2 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

taskmd-1.3.0-cp313-cp313-win_amd64.whl (881.2 kB view details)

Uploaded CPython 3.13Windows x86-64

taskmd-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

taskmd-1.3.0-cp313-cp313-macosx_11_0_arm64.whl (943.1 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

taskmd-1.3.0-cp312-cp312-win_amd64.whl (881.6 kB view details)

Uploaded CPython 3.12Windows x86-64

taskmd-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

taskmd-1.3.0-cp312-cp312-macosx_11_0_arm64.whl (943.8 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

taskmd-1.3.0-cp311-cp311-win_amd64.whl (883.1 kB view details)

Uploaded CPython 3.11Windows x86-64

taskmd-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.1 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

taskmd-1.3.0-cp311-cp311-macosx_11_0_arm64.whl (945.9 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for taskmd-1.3.0.tar.gz
Algorithm Hash digest
SHA256 eafe2aa42d86a3e51431a70171a9afa0f5890f56a54220b4535b5dcc1cb8ad18
MD5 b2d64973ecffbf1d4db251f3c34982ee
BLAKE2b-256 4a0a5dc7edb37b80f153fbc639852eee590edb464bbfacb1ca691ad8dba6aa4b

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.3.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2f3c078d4e66259010f122ccbb4eec8317230d5c9d433fd549cc86fa7eb7122c
MD5 fb6b19e4f7fb716a89f7224069aeb776
BLAKE2b-256 22c7944e9781aa6e21f99d200c9b1025d2ff2943fc65ca412c2d9f060f7c7854

See more details on using hashes here.

Provenance

The following attestation bundles were made for taskmd-1.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-1.3.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for taskmd-1.3.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 72214a66ffd5b05f6d1d99e03dde095b05ab4eb0cc57ed8e17cd414d24976cbd
MD5 d4da844cd96adc30ad1887578ea9a3d1
BLAKE2b-256 7281f0193d2f0b128939bb55b45695a91f0e5b9baf508de50aa6574dc93c55c4

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-1.3.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 881.1 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-1.3.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 62d4f134ee15dddb71aa04812fb3ccaffc55e797ef8b7403348143fe2b9e8437
MD5 818552d9f63976957c5ca840b4ac357f
BLAKE2b-256 e5305227b516c0292b62708a3124927b7ee202642bcdc900c28cb0c04c28b7d6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.3.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 97ab829b18e2304ae5d51fe369dc890ffa3eb2376262fc8fe67d58309484dc6a
MD5 b41b1e36c72d17264e52c523d58317a1
BLAKE2b-256 497c52e75de8fc73044e5a6b4f47fde16721b6b57312bec0f22b6da3b203beae

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.3.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 05d872d4023b37fd1ba721731445c214c83aa03850e6bd10e5344886fa0928f3
MD5 8839d25c1508154ef549acd21eeaa6d5
BLAKE2b-256 469e3e67806b23c39baa69903ee1a020ea9469c94024a4f1d3edb00fd7b62e1b

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-1.3.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 881.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-1.3.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 bb291f2e2ce036db4d9d129b70ea41c3f5d3eca5e579b3e0440eec94cbae4305
MD5 09e4f2e91cf17023220be1667c03b5ce
BLAKE2b-256 723e3ef7a1690a0018e7ed79c13733cf6d2ac6ecacce8a6bfd8139204e182235

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.3.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4ab91826e2b0a08bdac860af9b57308c4f84d100f48a73aa5e55e66acd1c2a49
MD5 e0f9c275ecd0527013ec2b1883ce66c4
BLAKE2b-256 9ebaec3fc7d2127df1c167743bde31f9599d681425105a95ac3e1ee96280c28a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.3.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 5c8f794e04a5bdc945607fd5c46282ab65095078859680a1f98b70228a19946f
MD5 01cd7369b0578b5005d8ddf5c6531d93
BLAKE2b-256 295d3504987346580b68f16b165f98f53dd15f9ba9691f9cf94c23c92b2f7bee

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-1.3.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 881.6 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-1.3.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 19fe1e54281754c3e043b95807944608b730b9b471bb5637ef7fe93abfe36aca
MD5 bedb5bf135c9ebcf3071597982507eb7
BLAKE2b-256 89338fba38f4da6911cad13f2f43ed97967c6fa9d0512ca8ea7e9d2e8a1b3aec

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3f698a9a39670c26ba161c93a6499c7549d63ea6af18c69ac2aae61b42ba0733
MD5 5b0c614bbbce6941701d6db66f111cb7
BLAKE2b-256 4c917f3005ab080fe0071e527e915c24b90a3c7f8143428238eb3a2ff9019850

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.3.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 039aee12289433af8dfaa7f642d60e9b10889bcc2bfc2ab910398d655813f649
MD5 2e19a3c43f76d6d7c6e7d9f4dfab0fd2
BLAKE2b-256 f0870160ac512e47b222c9d67875d4f2efe2004f12963dc3ce8e3f9563aa2cab

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-1.3.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 883.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-1.3.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 d7ea76d8135497669b96ba488fd06cb17a5fe93bfc0ea85660cb9048377f5916
MD5 2befcd9b756d3ebf29f99dd114537e82
BLAKE2b-256 a5b17b042a35c879e57103686c58add28b9fe8a4cb2e9d2216fa65374d0f8fd0

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d831bdc70ec1516cf78cff2981f90b8976beca99222bfe46b0937404d7d3b231
MD5 2164c0380ffd68039da52d27afaf9258
BLAKE2b-256 de3717bebc219388d496a526e7c0e5e42fa8a2d8c465153a39ba4bff3d6fc9ee

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.3.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1e13c5e30757f2da3255f0f15ccfbd331a500634df7b22ee1f9159275f54993b
MD5 e72db589694b655d9cfe7e6db568684c
BLAKE2b-256 daf77c21a232f6fcf8f92a1ec41ab576b09142ab9f3845be0898c4435b2b0b9e

See more details on using hashes here.

Provenance

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