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 ./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

# 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 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-1.1.0.tar.gz (54.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-1.1.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.1.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.1.0-cp314-cp314-win_amd64.whl (880.5 kB view details)

Uploaded CPython 3.14Windows x86-64

taskmd-1.1.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.1.0-cp314-cp314-macosx_11_0_arm64.whl (941.9 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

taskmd-1.1.0-cp313-cp313-win_amd64.whl (880.6 kB view details)

Uploaded CPython 3.13Windows x86-64

taskmd-1.1.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.1.0-cp313-cp313-macosx_11_0_arm64.whl (941.9 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

taskmd-1.1.0-cp312-cp312-win_amd64.whl (880.8 kB view details)

Uploaded CPython 3.12Windows x86-64

taskmd-1.1.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.1.0-cp312-cp312-macosx_11_0_arm64.whl (942.6 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

taskmd-1.1.0-cp311-cp311-win_amd64.whl (882.4 kB view details)

Uploaded CPython 3.11Windows x86-64

taskmd-1.1.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.1.0-cp311-cp311-macosx_11_0_arm64.whl (945.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

File details

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

File metadata

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

File hashes

Hashes for taskmd-1.1.0.tar.gz
Algorithm Hash digest
SHA256 9fddd030cecb9a84171c6d11152e723decdaad0f582be477e8918669fe61227b
MD5 ee9e5ff86e776cd14b027524635cd178
BLAKE2b-256 4e82be688efb794e0e7fb882590a94ef6a4d764a1e8dbdec039fd90640d91275

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.1.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 88963cdd881c7f20897a19c9dffbe7692e94fe94e1b4f4ef56a71b0ee3de7020
MD5 8f55efde7b415c12afd9bb4756c3c274
BLAKE2b-256 2474004a133fded437bf04cdc8591413e31284fc9e3dfe66a1825496da6717a5

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.1.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e674c0c07f202a045a94b3be139745b127bd64c222cf3ddcdcbc1ede9aa88389
MD5 874a363d77b891d45cca36ba2f2bdb9d
BLAKE2b-256 8c950e139136cf9c7a58484fed92a900da422f1e467014bb8dd1f4ffce124720

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-1.1.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 880.5 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.1.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 5fa2ab2c0ac199ff77ba7440c5a853e0eeb124d7354c0b7a23b3eaa9bee66c91
MD5 af30197f044d130f195dfd70d729606f
BLAKE2b-256 c187baacb9a5b652f9ea4b6121510d948724c8700c9dd9dd362aa7eac3290c0e

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.1.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 de83dac96ea1b1d53c84ed92284dcd2e1108171a7aca5f151066d08cc2b13986
MD5 22710aadfe3afec30ed256f791d5bbe3
BLAKE2b-256 4da0cbb7565287b18534e36552660246c2656ca6fb26042de0c2b77f7b97f8f6

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.1.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 807a732c2541c443fa268cd6337bb87ad31af156d0a23a16b7594269955b8e39
MD5 243d03d00bcb318d3772cb94a801491a
BLAKE2b-256 5da2c10fac9a6279663d469b4374eb1fc2760fff2c12202d1d1921466fc51557

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-1.1.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 880.6 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.1.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 724393a16515b539da536fa4d4e0095b9ea14e5d26b76712e1b98f8bf17932df
MD5 eb3b5987293e6f68c7a94d418eb1434f
BLAKE2b-256 058f2c7f74c416d54ef9d10a63fbef9a59df5cc1eb16716bc06529d4a42cf4e3

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 abd956796e4ac14de01468a825973ca0055c13709b9fc20059ec37409ed014d6
MD5 79546d0897bcf6839354bb07844e6c24
BLAKE2b-256 753ae2b87d0509f0bc408fc96913ed9ff0d441a49b5f588671a0840e8aa14fda

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.1.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e017a2a2a038b38c5726e65910447211ee299d26e8bd56badf629183809d5270
MD5 cbd903e69c89a606a5e11bfb92ec3cf7
BLAKE2b-256 fe840fb4b772edd2028857d5c9aebb09f4a503a321b1e777a2be982a6d0c9a06

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-1.1.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 880.8 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.1.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 52c9b19fb93f0c5c027c1731d59f96042d17b28b009cce347a1c09f4d78c1795
MD5 326c306579fa7b6892647677ac4c7153
BLAKE2b-256 80848889aba98a675e5d843911b42bfad8f6ef79fae0b217a4e336306f2eb82f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4105fba636b5da3de01a40724d0ed0a37a01a47f971a6c1df3572fb2348902a2
MD5 c03941cf5e0b1c57a95b2b82f39f8e71
BLAKE2b-256 9108f197f187cab711e23d7075ebf5bb5dbacad2d109d7ffa92a6c24dad9a62f

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.1.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 267178ebed92cf7753cebe3952dea9c921c97df2fef85a0dec2c9c831ed95be6
MD5 3b86b485b064f1f906e95cea4117493a
BLAKE2b-256 0d62b02ad8940ea952e9affdcea5eb326c87057cebb296e0658f79f1c53d5616

See more details on using hashes here.

Provenance

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

File metadata

  • Download URL: taskmd-1.1.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 882.4 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.1.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 80581ee5eedf8a4874f0cad8234bbb1ce1c31bb44a03343c901638b946a7a886
MD5 36e7afb3f73a885d60cd5448d1532425
BLAKE2b-256 fe170e1f6684af7d9e391e1d2d0af9188c8bbc918ea20f4651df1672015445cd

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 da9ced35abad3448bd90dbc3aa2a1120ebaf12f21c25adca1e5442d4d84a6bda
MD5 671262e62359646ae92d243a74af51ae
BLAKE2b-256 74f91e4d96b392af96b71cc6c1491c4991d1f9824c77ecbe6b1d5999742af87a

See more details on using hashes here.

Provenance

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

File metadata

File hashes

Hashes for taskmd-1.1.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2cf6f1427e1b78ba47155a45d3f0008b325f51de5f5299c28264fd4a0f9a5687
MD5 20d346c2aa7ed50bfcddb3c893a0099e
BLAKE2b-256 d79235124ba8b2da2c799e13de11de5ef8d6c961a518ee9c887355a5365c0dd5

See more details on using hashes here.

Provenance

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