poethepoet
CLAUDE.md2.1k starsChanged 6 months agoMITView on GitHub
Poe the Poet is a task runner for Python projects that integrates with poetry and uv. This repo is a Poetry project, and the package it builds is poethepoet itself. Two distinct installs are in play — keep them straight: It installs the project plus the locked dev dependencies (ruff, mypy, pytest, …) at their pinned versions. Those pins are load-bearing: formatting and schema-generation output differ across tool versions, so anything installed another way produces drift and false failures. 2.…
- Installs packages
Adopted by
Steady: 0 new projects took it in the last 4 weeks, none the 4 weeks before.thin data
Who's talking about nat-n/poethepoet
- astral-sh/uv“Using `uv run` as a task runner”GitHub · Aug 8, 2024 · 1k reactions
- Stack Overflow“Running a python script with poetry”Stack Overflow · Sep 27, 2023 · 5 votes
- Stack Overflow“Use poetry to create binary distributable with pyinstaller on 'package'?”Stack Overflow · May 7, 2023 · 4 votes
- tamasfe/taplo“Formatting issue with `"evenBetterToml.formatter.indentTables": true`”GitHub · Dec 16, 2022 · 3 reactions
- A Hacker News story“Poethepoet: A task runner that works well with poetry”Hacker News · May 7, 2021 · 3 points
The biggest 5 of 54 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 54
Talked about on GitHub, Stack Overflow and Hacker News (54 times).
On GitHub · 50
- Aug 8, 2024Using `uv run` as a task runner — astral-sh/uv1k reactions · 258 comments
- Dec 16, 2022Formatting issue with `"evenBetterToml.formatter.indentTables": true` — tamasfe/taplo3 reactions · 7 comments
- Oct 1, 2026chore(deps-dev): bump poethepoet from 0.37.0 to 0.48.0 — XRPLF/xrpl-py2 reactions · 2 comments
- Nov 4, 2026Bump the python-updates group with 9 updates — werdnum/family-assistant1 reaction · 2 comments
- Nov 1, 2026build(deps): bump the dependencies group with 13 updates — NotLeonian/competitive-verifier1 reaction · 3 comments
45 more on GitHub
- Oct 20, 2026Bump poethepoet from 0.48.0 to 0.49.0 — shizheng-rlfresh/mlflow-monitor1 reaction · 1 comment
- Oct 3, 2026Bump the dependencies group with 6 updates — NotLeonian/competitive-verifier1 reaction · 3 comments
- Apr 1, 2026chore(deps-dev): bump poethepoet from 0.37.0 to 0.45.0 — XRPLF/xrpl-py1 reaction · 1 comment
- Feb 23, 2026chore(backend/deps-dev): bump the development-dependencies group across 1 directory with 2 updates — Significant-Gravitas/AutoGPT1 reaction · 4 comments
- Jan 9, 2026chore(backend/deps-dev): bump the development-dependencies group across 1 directory with 5 updates — Significant-Gravitas/AutoGPT1 reaction · 11 comments
- Nov 24, 2025chore(backend/deps-dev): bump the development-dependencies group in /autogpt_platform/backend with 3 updates — Significant-Gravitas/AutoGPT1 reaction · 7 comments
- Feb 29, 2024Poetry fails to install the correct version of a git dependency if there are cached artifacts of the same version (but different commit hashes) — python-poetry/poetry1 reaction · 14 comments
- Dec 23, 2021Accept unknown options (for poetry plugin) — python-poetry/cleo1 reaction · 2 comments
- Nov 9, 2026chore(deps): update poethepoet requirement from <0.35,>=0.19 to >=0.19,<0.50 in /algokit-utils-py — joe-p/algokit-py0 reactions · 3 comments
- Nov 9, 2026chore(deps): update poethepoet requirement from >=0.36.0 to >=0.49.0 in /algokit-subscriber-py — joe-p/algokit-py0 reactions · 3 comments
- Nov 9, 2026chore(deps): update poethepoet requirement from <0.37,>=0.20 to >=0.20,<0.50 in /algokit-client-generator-py — joe-p/algokit-py0 reactions · 3 comments
- Nov 3, 2026Bump poethepoet from 0.45.0 to 0.48.0 — staging-zeropath/pilot-saleor0 reactions
- Nov 2, 2026chore(deps-dev): bump poethepoet from 0.48.0 to 0.49.0 — ink-splatters/apfs-hcp-patcher0 reactions
- Nov 2, 2026chore(deps-dev): bump poethepoet from 0.48.0 to 0.49.0 — betagouv/OTP-DS-to-Grist0 reactions · 1 comment
- Nov 1, 2026chore(deps): update poethepoet requirement from >=0.48.0 to >=0.49.0 in the runtime-dependencies group — rchretien/frozen-vault0 reactions
- Oct 29, 2026build(deps-dev): bump poethepoet from 0.48.0 to 0.49.0 in /backend — AunSyedShah/asknget-backend0 reactions
- Oct 29, 2026build(deps-dev): Bump poethepoet from 0.48.0 to 0.49.0 in /backend — awaisshahid965/weather-aware-truck-routing0 reactions
- Oct 28, 2026chore(deps): update dependency poethepoet to ^0.49.0 — g-mainardi/dpongpy0 reactions
- Oct 28, 2026chore(deps): update dependency poethepoet to ^0.49.0 — g-mainardi/lab-snippets0 reactions · 1 comment
- Oct 27, 2026chore(deps-dev): bump poethepoet from 0.48.0 to 0.49.0 — ink-splatters/stream-parser0 reactions
- Oct 27, 2026build(deps-dev): bump poethepoet from 0.48.0 to 0.49.0 — ink-splatters/nix-base320 reactions
- Oct 27, 2026Bump poethepoet from 0.48.0 to 0.49.0 — shizheng-rlfresh/skim0 reactions
- Oct 26, 2026chore(deps): Bump the uv group across 1 directory with 2 updates — metal-fingerzz/webapp-boilerplate0 reactions
- Oct 25, 2026Bump poethepoet from 0.48.0 to 0.49.0 — 0cherednoq/staged-pipeline0 reactions
- Oct 24, 2026[Update](deps-dev): Bump poethepoet from 0.48.0 to 0.49.0 in the development group — m-farial/pytest-a11y0 reactions · 1 comment
- Oct 20, 2026Bump poethepoet from 0.48.0 to 0.49.0 — yoelsherwin/Vertigo0 reactions
- Oct 19, 2026chore(deps): update poethepoet requirement from <0.37,>=0.20 to >=0.20,<0.50 — mrcointreau/algokit-client-generator-luca-py0 reactions
- Oct 19, 2026Bump poethepoet from 0.48.0 to 0.49.0 — EnergieID/cofy-api-epv0 reactions
- Oct 16, 2026chore(deps): update dependency poethepoet to ^0.49.0 — the-dotify-project/dotify0 reactions · 2 comments
- Oct 13, 2026chore(deps): update poethepoet requirement from <0.37,>=0.20 to >=0.20,<0.49 — algorandfoundation/algokit-client-generator-py0 reactions
- Oct 8, 2026chore(deps-dev): bump poethepoet from 0.32.2 to 0.48.0 — Mathwesm/scan_hardware0 reactions
- Oct 7, 2026build(deps-dev): bump poethepoet from 0.32.2 to 0.49.0 — Mathwesm/foco-llm0 reactions
- Sep 29, 2026chore(deps): update dependency poethepoet to v0.49.0 — revue-org/revue0 reactions · 2 comments
- Sep 19, 2026Update poethepoet requirement from <0.31,>=0.22 to >=0.22,<0.49 — PAE16/SportOrg-for-MacOS0 reactions
- Sep 18, 2026build(deps-dev): bump poethepoet from 0.32.2 to 0.48.0 — Mathwesm/NetSec0 reactions
- Sep 7, 2026Update dependency poethepoet to v0.49.0 — seapagan/link-page0 reactions · 1 comment
- Jul 23, 2026chore(deps): update poethepoet requirement from >=0.36.0 to >=0.48.0 — algorandfoundation/algokit-subscriber-py0 reactions
- Jul 6, 2026build(deps-dev): update poethepoet requirement from <0.31,>=0.22 to >=0.22,<0.49 — sportorg/pysport0 reactions
- Feb 14, 2026chore(deps): update dependency poethepoet to v0.49.0 — billsioros/trigon0 reactions · 8 comments
- Feb 11, 2026[Task Support]: poethepoet / poetry — camalot/vscode-workspace-tasks0 reactions
- Feb 9, 2026chore(deps): update dependency poethepoet to v0.49.0 — billsioros/cookiecutter-pypackage0 reactions · 7 comments
- Nov 3, 2025feat: 👍 introduce poethepoet — shin-sforzando/etude-manim0 reactions
- Apr 26, 2025add poethepoet task runner for admin tasks — blackwhitehere/acme-project-create0 reactions
- Dec 21, 2024Look into simple(r) task notations — rikardg/bygg0 reactions
- Nov 12, 2024Print task name by default when running task — pdm-project/pdm0 reactions · 1 comment
On Stack Overflow · 3
- Sep 27, 2023Running a python script with poetry5 votes
- May 7, 2023Use poetry to create binary distributable with pyinstaller on 'package'?4 votes
- Oct 8, 2022CreateProcess from python results in "OSError: [WinError 87] The parameter is incorrect"0 votes
On Hacker News · 1
- May 7, 2021Poethepoet: A task runner that works well with poetry3 points
The file
We split this CLAUDE.md into the rules it gives an agent
12 rules. About 0 are common, 5 are distinctive, and 7 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈5
Distinctive · estimate
This author's own choices. Worth a look.
7
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 43
Run poe to see available tasks and their descriptions.
- Very specific: line 73
Task types: use a metaclass registry (task/base.py:MetaPoeTask).
- Very specific: line 78
Executors: follow the same pattern (executor/base.py:MetaPoeExecutor).
- Distinctive: line 120
When writing tests, observe and replicate local testing style.
- Distinctive: line 121
When introducing new patterns or making any kind of contribution to architecture present the plan for operator review before making change …
- Distinctive: line 125
Don't use single character variable names
- Distinctive: line 126
Do use the walrus operator whenever applicable
- Very specific: line 128
Use relative imports for everything inside the poethepoet package — from ..task.base import PoeTask, not from poethepoet.task.base import …
- Very specific: line 147
when bespoke validation is needed, update the matching __schema_fragment__ (or generator logic) to encode the same constraint
- Very specific: line 148
add a fixture to tests/schema/fixtures/invalid/ with a # expected_error: header so the parity test pins the new case
- Very specific: line 149
check tests/schema/test_mutation.py for intentional structural gaps before assuming any mismatch is a bug
- Distinctive: line 157
If you see something, say something.
≈ “Common” is an estimate: at least 1 in 5 of the 26,980 CLAUDE.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Agent Guide
Poe the Poet is a task runner for Python projects that integrates with poetry and uv.
Set up your environment first (do this before running anything)
This repo is a Poetry project, and the package it builds is poethepoet itself. Two distinct installs are in play — keep them straight:
- Sync the project venv — this is where tests and checks actually execute:
It installs the project plus the locked dev dependencies (ruff, mypy, pytest, …) at their pinned versions. Those pins are load-bearing: formatting and schema-generation output differ across tool versions, so anything installed another way produces drift and false failures.poetry sync - Ensure a released
poeis installed globally, as a stable task runner — separate from the in-development Poe in the project venv. Install it only if it isn't already available:
You are editing poethepoet, so don't drive your own checks with the code under test. Run from the repo root, this globalcommand -v poe >/dev/null || pipx install poethepoetpoereads the project's[tool.poe.tasks]and executes each task inside the Poetry venv (its auto/poetry executor), so checks still run against the locked deps. - List the tasks as your first step of exploration:
poe # shows every task with its description
If a tool ever seems "missing," the fix is poetry sync — never pip
install into the system Python. Ad-hoc installs pull unpinned versions and
silently corrupt formatting/schema results.
Use poe tasks
This project uses poethepoet to manage development tasks. After the setup above, run everything through poe tasks — poe check, poe test, poe lint, poe types, poe format.
Run poe to see available tasks and their descriptions.
poe check # run all quality checks (style, types, lint, tests) - this takes a while.
poe test # run full test suite
poe test-quick # skip slow/flaky tests
poe format # auto-format code (ruff format + ruff fixes)
poe lint # ruff linting only
poe types # mypy type checkingTip: cmd tasks (like test or test-quick) pass extra args to the underlying command, so you can run specific tests:
poe test tests/test_script_tasks.py -k "test_running"
poe test-quick -x # stop on first failureTesting
Run tests with:
poe test [extra pytest arguments]Reference tests/README.md for instructions on how to write, run, and debug tests in this project.
Key Patterns
Task types use a metaclass registry (task/base.py:MetaPoeTask). Each task type:
- Inherits from
PoeTask - Sets
__key__and__content_type__class attributes - Implements
_handle_run()for execution logic
Executors follow the same pattern (executor/base.py:MetaPoeExecutor).
Config loading is async-first. See config/config.py:PoeConfig.
Type hints are used throughout. Circular imports are avoided with TYPE_CHECKING guards.
Lazy imports are used strategically with the goal of reducing latency, since this is a CLI app. Note the distinction: imports only needed for type annotations belong in a TYPE_CHECKING block (with from __future__ import annotations at the top of the module), not as lazy runtime imports inside functions.
Where to Look
| To do this... | Look here |
| Add a new task type | task/base.py, then task/*.py |
| Add a new executor | executor/base.py |
| Modify CLI behavior | ui.py, app.py |
| Change config parsing | config/config.py |
| Add environment variable handling | env/manager.py |
| Fix shell completion | completion/ |
| Edit the bundled Agent Skill | poethepoet/skills/poethepoet/ |
Bundled Agent Skill
This project ships an Agent Skill at poethepoet/skills/poethepoet/ that teaches AI coding assistants how to use poe. End-users install it via poe _install_skill, which copies the tree into a detected .claude/skills/, .codex/skills/, etc. (see poethepoet/skills/install.py).
- Skill content:
SKILL.md+references/*.md(task-types, task-options, args-reference, creating-tasks, task-packages). - Pinned version:
poethepoet/skills/poethepoet/version.txt— kept in step with poe's user-facing surface. Bump it when skill content changes meaningfully. - Evals:
tests/skills/evals.json(corpus) andtests/skills/run_evals.py(runner). The runner copies the skill into a fixture project's.claude/skills/and shells out toclaude -p, so it exercises the real discovery path. Run viapoe eval-skill.
When you change poe's behaviour, syntax, or user-facing semantics, check whether the skill's reference docs still describe it correctly — drift here causes downstream agents to hedge or generate broken configs. If you spot a gap while working on the skill, the canonical answer is in the installed source (poethepoet/task/*.py) and the published docs (https://poethepoet.natn.io); verify before paraphrasing.
Test Fixtures
Tests use fixture projects in tests/fixtures/*_project/. The run_poe fixture is the main way to invoke poe in tests, or run_poe_subprocess if necessary - see tests/conftest.py.
Branching
- Branch from
developmentfor features/bugfixes - Branch from
mainonly for docs or hotfixes
Development process
- The user docs are in the repo and good source of context on how the product is meant to work.
- When writing tests, observe and replicate local testing style.
- When introducing new patterns or making any kind of contribution to architecture present the plan for operator review before making change to code.
Code style
- Don't use single character variable names
- Do use the walrus operator whenever applicable
- docstrings must always use three lines minimum: opening
"""alone on its own line, content, closing"""alone on its own line — never"""text"""on one line - Use relative imports for everything inside the
poethepoetpackage —from ..task.base import PoeTask, notfrom poethepoet.task.base import PoeTask. Applies to top-level,TYPE_CHECKING, and lazy-inside-function imports alike. Sole exception:poethepoet/__main__.pykeepsfrom poethepoet import mainso it works whether invoked viapython -m poethepoetor as a direct script. - This is a CLI, so be mindful of performance concerns
poe lintandpoe typesmust passpoe formatshould be run to ensure correct formattingPoeOptionsfields use class-attribute docstrings (PEP 257-style) placed immediately after the annotation. These are extracted byPoeOptions.description_for_field()and consumed by the JSON Schema generator, so every field on aPoeOptionssubclass should have one — the description backfill tests catch gaps. Example:class TaskOptions(PoeOptions): cwd: str | None = None """ Working directory the task runs in. Relative to the project root unless absolute. """- We aggressively validate inputs and handle edge cases to avoid ever raising unhandled errors that are not instances of PoeException with a helpful message.
Schema/runtime validation parity
Runtime validation and the generated JSON Schema (poethepoet/schema/) are kept in parity by tests/schema/test_invalid_corpus.py ("if the runtime rejects it, the schema should too"). When you add or change validation in PoeOptions.validate(), _task_validations, or PoeOptions.parse:
- prefer expressing simple constraints (pattern, min/max, length, item count, etc.) via
Annotated[T, Metadata(...)]on the field —PoeOptions.parseenforces these at runtime AND the schema generator picks them up from the same annotation, so parity is automatic. Reserve bespokevalidate()overrides for cross-field rules or constraints that don't fitMetadata. - when bespoke validation is needed, update the matching
__schema_fragment__(or generator logic) to encode the same constraint - add a fixture to
tests/schema/fixtures/invalid/with a# expected_error:header so the parity test pins the new case - check
tests/schema/test_mutation.pyfor intentional structural gaps before assuming any mismatch is a bug
Development tasks
- This project uses poe tasks to manage project tasks. Always check if there is an applicable poe task for a common action, e.g. running servers, tests or other quality checks.
Agent behavior
- If you see something, say something. Always report potential bugs if you spot them, especially in new code.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

