NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #385 most downloaded on PyPI
Pythonic task execution
Last release 5 months ago
07 Apr 2026
Ships unpredictably
gaps range from 2 weeks to 2.2 years
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
14 years old
70 releases · first in 2013
This is technically a backwards incompatible change (reminder: we’re not at 1.0 yet!). You’ll only notice if you were relying on adding your tasks mod…
[ Feature ] #125 : Improve output of Failure exceptions when printed.
[ Feature ] #124 : Add a --debug flag to the core parser to enable easier debugging (on top of existing INVOKE_DEBUG env var.)
[ Feature ] #87 : (also #92 ) Rework the loader module such that recursive filesystem searching is implemented, and is used instead of searching sys.path .
This adds the behavior most users expect or are familiar with from Fabric 1 or similar tools; and it avoids nasty surprise collisions with other installed packages containing files named tasks.py .
Thanks to Michael Hahn for the original report & PR, and to Matt Iversen for providing the discovery algorithm used in the final version of this change.
Warning
This is technically a backwards incompatible change (reminder: we’re not at 1.0 yet!). You’ll only notice if you were relying on adding your tasks module to sys.path and then calling Invoke elsewhere on the filesystem.
[ Feature ] #110 : Add task docstrings’ 1st lines to --list output. Thanks to Hiroki Kiyohara for the original PR (with assists from Robert Read and James Thigpen.)
[ Feature ] #115 : Make it easier to reuse Invoke’s primary CLI machinery in other (non-Invoke-distributed) bin-scripts. Thanks to Noah Kantrowitz.
[ Feature ] #135 : (also bugs #120 , #123 ) Implement post-tasks to match pre-tasks, and allow control over the arguments passed to both (via invoke.tasks.call ). For details, see Pre- and post-tasks .
Warning
Pre-tasks were overhauled a moderate amount to implement this feature; they now require references to task objects instead of task names . This is a backwards incompatible change.
[ Bug ] #127 : Fill in tasks’ exposed name attribute with body name if explicit name not given.
[ Bug ] #116 : Ensure nested config overrides play nicely with default tasks and pre-tasks.
[ Bug ] #131 : Make sure one’s local tasks module is always first in sys.path , even if its parent directory was already somewhere else in sys.path . This ensures that local tasks modules never become hidden by third-party ones. Thanks to @crccheck for the early report and to Dorian Puła for assistance fixing.
[ Bug ] #121 : Add missing help output denoting inverse Boolean options (i.e. --[no-]foo for a --foo flag whose value defaults to true.) Thanks to Andrew Roberts for catch & patch.
[ Bug ] #128 : Positional arguments containing underscores were not exporting to the parser correctly; this has been fixed. Thanks to J. Javier Maestro for catch & patch.
[ Support ] : Refactor the invoke.runners.Runner module to differentiate what it means to run a command in the abstract, from execution specifics. Top level API is unaffected.
[ Support ] #117 : Tidy up setup.py a bit, including axing the (broken) distutils support. Thanks to Matt Iversen for the original PR & followup discussion.
[ Support ] #118 : Update the bundled six plus other minor tweaks to support files. Thanks to Matt Iversen.
[ Support ] #25 : Trim a bunch of time off the test suite by using mocking and other tools instead of dogfooding a bunch of subprocess spawns.
One column per quarter.
- [ Feature ] #107 : Update configuration merging behavior for more flexible reuse of imported task modules, such as parameterizing multiple copies of
[ Feature ] #107 : Update configuration merging behavior for more flexible reuse of imported task modules, such as parameterizing multiple copies of a module within a task tree.
[ Feature ] #108 : Update invoke.collection.Collection.from_module to accept useful shorthand arguments for tweaking the invoke.collection.Collection objects it creates (e.g. name, configuration.)
[ Feature ] #109 : Add a default kwarg to invoke.collection.Collection.add_task allowing per-collection control over default tasks.
- [ Bug ] #98 : BACKWARDS INCOMPATIBLE CHANGE! Configuration merging has been reversed so outer collections’ config settings override inner collection…
[ Bug ] #98 : BACKWARDS INCOMPATIBLE CHANGE! Configuration merging has been reversed so outer collections’ config settings override inner collections. This makes distributing reusable modules significantly less silly.
[ Bug ] #96 : Tasks in subcollections which set explicit names (via e.g. @task(name='foo') ) were not having those names honored. This is fixed. Thanks to Omer Katz for the report.
- [ Feature ] #89 : Implemented configuration for distributed task modules: can set config options in invoke.collection.Collection objects and they ar
[ Feature ] #89 : Implemented configuration for distributed task modules: can set config options in invoke.collection.Collection objects and they are made available to contextualized tasks.
[ Bug ] #86 : Task arguments named with an underscore broke the help feature; this is now fixed. Thanks to Stéphane Klein for the catch.
- [ Bug ] #83 : Fix a bug preventing underscored keyword arguments from working correctly as CLI flags (e.g. mytask --my-arg would not map back correc
[ Bug ] #83 : Fix a bug preventing underscored keyword arguments from working correctly as CLI flags (e.g. mytask --my-arg would not map back correctly to mytask(my_arg=...) .) Credit: @akitada .
[ Bug ] #81 : Fall back to sane defaults for PTY sizes when autodetection gives insane results. Thanks to @akitada for the patch.
- [ Feature ] #57 : Optional-value flags added - e.g. --foo tells the parser to set the foo option value to True; --foo myval sets the value to “myval
[ Feature ] #57 : Optional-value flags added - e.g. --foo tells the parser to set the foo option value to True; --foo myval sets the value to “myval”. The built-in --help option now leverages this feature for per-task help (e.g. --help displays global help, --help mytask displays help for mytask only.)
[ Bug ] #55 : A bug in our vendored copy of pexpect clashed with a Python 2->3 change in import behavior to prevent Invoke from running on Python 3 unless the six module was installed in one’s environment. This was fixed - our vendored pexpect now always loads its sibling vendored six correctly.
Pythonic task execution
Changelog
FAQs
Installing
Development
Prior art
Contact
Documentation
Professionally-supported Invoke is available with the Tidelift Subscription .
©2026 Jeff Forcier.
| Powered by Sphinx 7.2.6 & Alabaster 0.7.12 | Page source
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →