A standalone Python script (PEP 723 uv inline, zero external deps) that pretty-prints all Taskfile tasks grouped by namespace with ANSI colours and emoji headers β including descriptions, task aliases, and optional multi-line summaries.
Run task with no arguments to get a structured overview instead of a raw
alphabetical dump.
Default output (compact β no summaries, aliases in namespace colour):
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
My Project β Task Runner
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Usage: task <name> Run a task
task <name> --dry Preview commands
task --list Full task list
βοΈ Core / Setup
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
build Build the project
test Run all tests
lint Lint the code
π³ Docker Services
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
docker:up Start all containers
docker:down Stop all containers
docker:logs Tail container logs
π Deployment
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
deploy:staging Deploy to staging (aliases: ds)
deploy:prod Deploy to production (aliases: dp | deploy:production)
With --summary (shows multi-line summaries below each task):
π Deployment
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
deploy:staging Deploy to staging (aliases: ds)
β Runs the staging pipeline with smoke tests.
β Requires: AWS_PROFILE set in your shell.
deploy:prod Deploy to production (aliases: dp | deploy:production)
β Full production rollout β requires PR approval first.
With prelog and epilog (quick-start guide + footer notes):
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
My Project β Task Runner
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Usage: task <name> Run a task
task <name> --dry Preview commands
task --list Full task list
First time?
1. task install β interactive setup wizard
2. task build β build the project
3. task test β run all tests
βοΈ Core / Setup
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
build Build the project
test Run all tests
lint Lint the code
π³ Docker Services
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
docker:up Start all containers
docker:down Stop all containers
docker:logs Tail container logs
π Deployment
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
deploy:staging Deploy to staging (aliases: ds)
deploy:prod Deploy to production (aliases: dp | deploy:production)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
EXAMPLES
$ task build
$ task deploy:staging
LEARN MORE
Run task --list for the full task list.
Read the README at https://github.com/you/project
The prelog appears after the Usage block, before the first group header.
The epilog appears at the very end, after the footer rule.
curl -fsSL https://gist.githubusercontent.com/tobiashochguertel/261c54d64fff6dc1493619e2924161b4/raw/install.sh | bashInstalls to ~/.taskfiles/taskscripts/task-help/ (a real git repo β updatable
with a single command). Creates the parent directory structure automatically.
Or clone manually:
mkdir -p ~/.taskfiles/taskscripts
git clone https://gist.github.com/261c54d64fff6dc1493619e2924161b4.git \
~/.taskfiles/taskscripts/task-help
chmod +x ~/.taskfiles/taskscripts/task-help/task_help.pytask task-help:updateOr manually:
cd ~/.taskfiles/taskscripts/task-help && git fetch origin && git reset --hard origin/HEADThe recommended default task checks if task-help is installed on the host, runs
it if present, and falls back to task --list with a coloured install hint if not.
This means the Taskfile works on every machine, even without task-help installed.
vars:
# Set to "false" or "0" to suppress the "task-help not installed" warning
TASK_HELP_WARN: "true"
tasks:
default:
silent: true
desc: "Show grouped task list (falls back to 'task --list' if task-help not installed)"
cmds:
- |
SCRIPT="$HOME/.taskfiles/taskscripts/task-help/task_help.py"
if [ -x "$SCRIPT" ]; then
"$SCRIPT"
else
WARN="{{.TASK_HELP_WARN}}"
if [ "$WARN" != "false" ] && [ "$WARN" != "0" ]; then
printf '\033[33mβ task-help is not installed.\033[0m\n'
printf '\033[33m Install it for a prettier task list:\033[0m\n'
printf '\033[2m curl -fsSL https://gist.githubusercontent.com/tobiashochguertel/261c54d64fff6dc1493619e2924161b4/raw/install.sh | bash\033[0m\n'
printf '\033[2m (Set TASK_HELP_WARN=false to suppress this message)\033[0m\n'
echo ""
fi
task --list
fiSuppress the install hint permanently by setting TASK_HELP_WARN: "false" in your
vars: block. Suppress it for a single run with TASK_HELP_WARN=false task.
See Taskfile.example.yml in the Gist for a full copy-paste example with
alternative variants (--summary, env-var config, namespace overrides).
The installer also sets up a dedicated global Taskfile for managing task-help
itself, so you never need to embed scripts:install / scripts:update in project
Taskfiles:
~/.taskfiles/
βββ Taskfile.yml β your global root (includes taskscripts with flatten)
βββ Taskfile.taskscripts.yml β orchestrator (auto-created by installer)
βββ taskscripts/
βββ Taskfile.task-help.yml β task-help lifecycle tasks (auto-deployed by installer)
After install, from any directory:
task task-help:install # install or reinstall
task task-help:update # pull latest from Gist (also re-deploys Taskfile.task-help.yml)
task task-help:remove # uninstall (prompts for confirmation, keeps a backup)
task task-help:status # show installed commit and script pathWire the orchestrator into your global ~/.taskfiles/Taskfile.yml:
includes:
taskscripts:
taskfile: Taskfile.taskscripts.yml
optional: true
flatten: true # removes "taskscripts:" prefix β task-help:install, not taskscripts:task-help:install
dir: ~/.taskfilesThe flatten: true key (Taskfile v3 feature) merges the taskscripts namespace into
the root β so sub-namespaces like task-help: remain intact but the extra
taskscripts: layer disappears.
Adding a new tool later is one line in Taskfile.taskscripts.yml:
includes:
task-help:
taskfile: taskscripts/Taskfile.task-help.yml
optional: true
my-tool: # β add this
taskfile: taskscripts/Taskfile.my-tool.yml
optional: trueNamespace groups and display settings can be customised without editing the shared script. Five configuration sources are supported, applied in priority order (last wins):
| Priority | Source | How |
|---|---|---|
| 1 (lowest) | Built-in defaults | DEFAULT_NAMESPACE_META in the script |
| 2 | Config file | auto-discovered or --config PATH / TASK_HELP_CONFIG=PATH |
| 3 | Stdin | piped JSON/YAML, or forced with --stdin |
| 4 | Env vars | TASK_HELP_NS, TASK_HELP_NS_<NAME>, β¦ |
| 5 (highest) | CLI options | --ns, --ns-json, --header, β¦ |
Drop a .task-help.json in your project root (auto-discovered):
{
"header": "My Project β Task Runner",
"subtitle": "optional description line",
"prelog": "[bold]First time?[/bold]\n 1. task install\n 2. task test",
"epilog": "[dim]Run [green]task --list[/green] for the full list.[/dim]",
"replace": false,
"show_summary": false,
"show_aliases": true,
"desc_max_width": -1,
"theme": "dark",
"alias_color": "namespace",
"alias_color_adjust": "none",
"alias_fallback_color": "WHITE",
"namespace_order": ["_top", "build", "test", "deploy"],
"show_task_count": false,
"top_exclude": ["default"],
"show_summary_for": ["install"],
"hide_alias_patterns": ["^\\w+$"],
"groups": {
"_top": ["βοΈ ", "My Tasks", "CYAN"],
"deploy": ["π", "Deployment", "GREEN"],
"db": ["π ", "Database", "BLUE"]
}
}
groupsvsnamespaces: Both keys are accepted and produce the same result for simple array values. Usegroupsfor new configs β it also accepts rich descriptor objects withincludes,parent,note, and more (see Group Descriptor Objects below). Thenamespaceskey is deprecated since v1.1.0 and planned for removal in v2.0.
YAML is also supported (.task-help.yaml / .task-help.yml) when pyyaml is installed.
Multi-line prelog / epilog in YAML β use a literal block scalar (|):
# .task-help.yml
header: "My SSH Project"
prelog: |
[bold]First time?[/bold]
1. [green]task scripts:install[/green] β install task-help
2. [green]task install[/green] β interactive setup wizard
3. [green]task ssh:test[/green] β verify the setup
[bold]SSH Vault CLI:[/bold]
[cyan]task cli:install[/cyan] β install the CLI tool globally
epilog: |
[dim]LEARN MORE[/dim]
Use [green]task --list[/green] for the full task list.Global fallback: ~/.config/task-help/config.json
TASK_HELP_HEADER="My Project" # override header title
TASK_HELP_SUBTITLE="v1.2.3" # override subtitle
TASK_HELP_PRELOG="[bold]First time?[/bold]\\n 1. task install" # prelog (Rich markup OK)
TASK_HELP_EPILOG="[dim]Run task --list for more.[/dim]" # epilog (Rich markup OK)
TASK_HELP_REPLACE=1 # replace defaults entirely
TASK_HELP_NO_COLOR=1 # disable ANSI colours
TASK_HELP_SUMMARY=1 # enable multi-line summaries (off by default)
TASK_HELP_NO_SUMMARY=1 # explicitly disable summaries (compat alias)
TASK_HELP_NO_ALIASES=1 # hide task aliases
TASK_HELP_DESC_MAX_WIDTH=60 # truncate descriptions to 60 chars (-1 = no limit)
TASK_HELP_THEME=dark # colour theme: dark (default) or light
TASK_HELP_ALIAS_COLOR=namespace # alias colour: "namespace" or a color name/code
TASK_HELP_ALIAS_COLOR_ADJUST=none # alias brightness: none | dim | bright
TASK_HELP_ALIAS_FALLBACK_COLOR=WHITE # alias colour when namespace has none
TASK_HELP_UPDATE_CHECK=on # update check: on (default) | off | auto
TASK_HELP_NAMESPACE_ORDER='["_top","build","test","deploy"]' # explicit group order (JSON array)
TASK_HELP_SHOW_TASK_COUNT=1 # show task count badge on each group header
TASK_HELP_TOP_EXCLUDE='["default"]' # JSON array: task names to hide from _top
TASK_HELP_SHOW_SUMMARY_FOR='["install"]' # JSON array: namespaces that always show summaries
TASK_HELP_HIDE_ALIAS_PATTERNS='["^\\w+$"]' # JSON array of regex; hide matching aliases
NO_COLOR=1 # standard no-colour (no-color.org)
FORCE_COLOR=1 # force colours when stdout is not a TTY
# Namespace / group definitions:
TASK_HELP_NS='{"deploy":["π","Deploy","GREEN"]}' # old array style (still works)
TASK_HELP_GROUPS='{"deploy":{"emoji":"π","label":"Deployment","color":"GREEN","includes":["deploy"]}}' # new rich style
# Single namespace per env var:
TASK_HELP_NS_deploy="π,Deployment,GREEN"
TASK_HELP_NS_db="π ,Database,BLUE"Multi-line env vars: Use
\n(backslash + n) as a newline escape inTASK_HELP_PRELOGandTASK_HELP_EPILOG. task-help expands\nβ real newline. In Taskfile.yml, YAML block scalars (|) are the cleanest option.
task_help.py --header "My Project" --subtitle "v1.2.3"
task_help.py --prelog "[bold]First time?[/bold]\n 1. task install"
task_help.py --epilog "[dim]Run task --list for more.[/dim]"
task_help.py --ns deploy:π,Deployment,GREEN --ns db:π ,Database,BLUE
task_help.py --replace --ns-json '{"build":["π¨","Build","CYAN"]}'
task_help.py --no-color
task_help.py --summary # enable multi-line summaries
task_help.py --no-summary # explicitly disable (compat; default is off)
task_help.py --no-aliases # hide task aliases
task_help.py --desc-max-width 60 # truncate descriptions to 60 chars
task_help.py --theme light # white-background terminal theme
task_help.py --alias-color BRIGHT_CYAN # aliases in bright cyan
task_help.py --alias-color namespace # aliases in namespace colour (default)
task_help.py --alias-color-adjust dim # aliases slightly dimmed
task_help.py --alias-color-adjust bright # aliases bold
task_help.py --show-task-count # show "(N tasks)" badge on group headersecho '{"header":"CI","namespaces":{"ci":["π","CI/CD","YELLOW"]}}' | task_help.py
cat .task-help.json | task_help.py --stdinStandard (normal intensity):
CYAN GREEN YELLOW BLUE MAGENTA RED WHITE DIM BOLD RESET
Bright variants (high intensity):
BRIGHT_CYAN BRIGHT_GREEN BRIGHT_YELLOW BRIGHT_BLUE
BRIGHT_MAGENTA BRIGHT_RED BRIGHT_WHITE BRIGHT_BLACK GRAY
Style:
ITALIC UNDERLINE STRIKETHROUGH
256-color: use raw ANSI codes, e.g. "\033[38;5;208m" (orange).
Two optional free-text blocks for embedding usage guides or quick-start notes directly in the task listing output:
| Option | Position | Purpose |
|---|---|---|
prelog |
After the Usage block, before the first group | Quick-start steps, "first time?" guides |
epilog |
After the footer (very end of output) | Examples, links, further reading |
Both support Rich Console Markup (see below) and all four configuration methods: config file, env vars, CLI options, and stdin.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
SSH Project β Task Runner
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Usage: task <name> Run a task
task <name> --dry Preview commands
task --list Full task list
First time?
1. task scripts:install β install task-help pretty-printer
2. task install β interactive setup wizard
3. task ssh:test β verify the setup
π οΈ Setup & Maintenance
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
clean Remove sensitive artifacts
install Interactive setup wizard
...
12 tasks total Β· Run task --list for full details
LEARN MORE
Use task --list for the full task list.
Read the README at github.com/you/project
Both prelog and epilog accept
Rich Console Markup
for styling with colours, bold, italic, underline, and strikethrough.
If rich is installed (e.g. pip install rich), it is used automatically for
full markup support including 256-colours, background colours, and clickable links.
Without rich, a built-in fallback renderer handles the most common tags:
| Markup | Effect |
|---|---|
[bold]text[/bold] (or [b]) |
Bold |
[italic]text[/] (or [i]) |
Italic |
[underline]text[/] (or [u]) |
Underlined |
[strike]text[/] (or [s], [strikethrough]) |
|
[dim]text[/] |
Dimmed / muted |
[bold italic green]text[/] |
Compound styles β combine in one tag |
[red] [green] [cyan] [blue] [magenta] [yellow] [white] |
Standard colours |
[bright_red] [bright_green] [bright_cyan] β¦ |
Bright colour variants |
[gray] / [grey] |
Dark gray |
[/] |
Close last open tag (shorthand) |
[/tagname] |
Close a specific tag |
\[literal] |
Literal [ β escape to prevent markup parsing |
{
"prelog": "[bold]First time?[/bold]\n 1. [green]task scripts:install[/green] β install task-help\n 2. [green]task install[/green] β interactive setup wizard",
"epilog": "[dim]LEARN MORE\n Run [green]task --list[/green] for all tasks.[/dim]"
}# .task-help.yml
header: "My Project"
prelog: |
[bold]First time?[/bold]
1. [green]task scripts:install[/green] β install task-help
2. [green]task install[/green] β interactive setup wizard
3. [green]task test[/green] β run all tests
epilog: |
[bold]EXAMPLES[/bold]
[green]task build[/green]
[green]task test[/green]
[green]task deploy:staging[/green]
[bold]LEARN MORE[/bold]
Use [green]task --list[/green] for the full task list.tasks:
default:
silent: true
vars:
PRELOG: |
[bold]First time?[/bold]
1. task install
2. task test
cmds:
- TASK_HELP_PRELOG="{{.PRELOG}}" {{.TASK_HELP_SCRIPT}}Nerd Font glyphs work as plain Unicode characters β paste them directly. No special configuration needed; they render in any Nerd Font terminal:
prelog: |
Quick start (requires Nerd Font)
1. task install
2. task testtask-help can check for newer Gist versions and either show a hint or
auto-update. The check uses git ls-remote against the Gist remote and is
cached for 24 hours (~/.cache/task-help/update-check.json) to avoid
network overhead on every run.
TASK_HELP_UPDATE_CHECK |
Behaviour |
|---|---|
on (default) |
Show a hint at the end of output when a newer version exists |
off |
Disable all update checks |
auto |
Auto-update before displaying the task list (prints a patience message) |
# Disable the check for this run:
TASK_HELP_UPDATE_CHECK=off task
# Always auto-update in CI / shared environments:
TASK_HELP_UPDATE_CHECK=auto task
# Permanently disable in your project Taskfile.yml:
# vars:
# TASK_HELP_UPDATE_CHECK: "off"The update check only runs when task-help is installed as a git clone at
~/.taskfiles/taskscripts/task-help/ (the default install path). It is
silently skipped if that directory does not exist.
task-help groups tasks by the namespace prefix β the segment before the
first : in the task name. Tasks without a : go into the special _top
group (shown as "Core / Setup" by default).
| Task name | Namespace / group |
|---|---|
build |
_top (Core / Setup) |
test |
_top (Core / Setup) |
deploy:staging |
deploy |
deploy:prod |
deploy |
docker:up |
docker |
version: "3"
tasks:
build:
desc: "Build the project" # β _top group
test:
desc: "Run tests" # β _top group
deploy:staging:
desc: "Deploy to staging" # β deploy group
aliases: [ds]
deploy:prod:
desc: "Deploy to production" # β deploy group
aliases: [dp]
docker:up:
desc: "Start containers" # β docker group
docker:down:
desc: "Stop containers" # β docker groupMatch this Taskfile with a .task-help.json (or .task-help.yml):
{
"header": "My Project β Task Runner",
"namespaces": {
"_top": ["βοΈ ", "My Tasks", "CYAN"],
"deploy": ["π", "Deployment", "GREEN"],
"docker": ["π³", "Docker", "BLUE"]
}
}Prefer
groupsovernamespacesβ thenamespaceskey still works (backward compatible) but is deprecated since v1.1. Use thegroupskey for new configs; it supports rich descriptors withincludes,parent,note,order, and per-groupshow_summary. See Rich group descriptors below.
Or in YAML (.task-help.yml):
header: "My Project β Task Runner"
namespaces:
_top: ["βοΈ ", "My Tasks", "CYAN"]
deploy: ["π", "Deployment", "GREEN"]
docker: ["π³", "Docker", "BLUE"]If a task's namespace is not listed in the config, task-help falls back to
βΆ Deploy (title-cased from the key) in white.
Define sub-namespaces by using : in the namespace key. task-help will
group tasks by the longest matching prefix and display sub-groups
visually nested under their parent:
{
"namespaces": {
"deploy": ["π", "Deployment", "GREEN"],
"deploy:staging": ["π", "Staging Environment", "CYAN"],
"deploy:prod": ["π΄", "Production", "RED"]
}
}With a Taskfile containing:
tasks:
deploy:staging:run:
desc: "Run staging deployment"
deploy:staging:rollback:
desc: "Rollback staging"
deploy:prod:run:
desc: "Run production deployment"The output groups deploy:staging:* under deploy:staging and
deploy:prod:* under deploy:prod, both nested after the deploy header:
π Deployment
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π Staging Environment
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
deploy:staging:rollback Rollback staging
deploy:staging:run Run staging deployment
π΄ Production
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
deploy:prod:run Run production deployment
Backward compatible: if no sub-namespaces are defined in the config,
tasks are grouped exactly as before (by the first : segment).
Added in v1.1. The old
namespaceskey still works but is deprecated β migrate togroupsfor access toincludes,parent,note,order, and per-groupshow_summary. Planned removal ofnamespacesin v2.0.
The groups config key accepts rich descriptor objects instead of plain
["emoji", "label", "COLOR"] arrays. Short-form arrays still work inside
groups for gradual migration.
| Field | Type | Default | Description |
|---|---|---|---|
emoji |
string | "βΆ" |
Leading icon in the section header |
label |
string | key name | Human-readable section title |
color |
string | "WHITE" |
ANSI color name (CYAN, GREEN, β¦) or code |
includes |
string[] | [] |
Explicit task membership patterns (see below) |
excludes |
string[] | [] |
Patterns that opt tasks OUT of this group |
parent |
string|null | null |
Key of a parent group for visual nesting |
note |
string | "" |
Dim hint line shown before task rows |
show_summary |
bool|null | null |
Per-group summary override (null = inherit) |
order |
int|null | null |
Explicit sort position (lower = earlier) |
Task membership is resolved in priority order:
- Explicit
includespatterns β checked deepest group first (child before parent). - Longest colon-prefix β if no
includesmatch, the standard colon-prefix rule applies. _topcatch-all β tasks with no:that matched noincludesrule.
Pattern rules (same for includes and excludes):
| Pattern | Matches |
|---|---|
"deploy" |
Exact task "deploy" or any task starting with "deploy:" |
"deploy:prod" |
Exact "deploy:prod" or any task starting with "deploy:prod:" |
"deploy:prod:*" |
Glob β any task matching that glob (fnmatch) |
"ci" |
Exact "ci" or any "ci:*" task |
{
"header": "My Monorepo",
"top_exclude": ["default"],
"groups": {
"_top": {
"emoji": "βοΈ ", "label": "Core", "color": "CYAN",
"order": 1
},
"ci-cd": {
"emoji": "π", "label": "CI / CD", "color": "BLUE",
"note": "Trigger full pipeline with 'task ci-cd:all'",
"order": 2
},
"deploy-staging": {
"emoji": "π", "label": "Staging", "color": "CYAN",
"parent": "ci-cd",
"includes": ["deploy:staging"]
},
"deploy-prod": {
"emoji": "π΄", "label": "Production", "color": "RED",
"parent": "ci-cd",
"includes": ["deploy:prod"],
"show_summary": true,
"order": 10
},
"schema": {
"emoji": "π", "label": "Schema & Config", "color": "MAGENTA",
"includes": ["validate", "generate:schema", "migrate:*"],
"excludes": ["migrate:rollback"]
}
}
}header: "My Monorepo"
top_exclude: [default]
groups:
_top:
emoji: "βοΈ "
label: "Core"
color: CYAN
order: 1
ci-cd:
emoji: "π"
label: "CI / CD"
color: BLUE
note: "Trigger full pipeline with 'task ci-cd:all'"
order: 2
deploy-staging:
emoji: "π"
label: "Staging"
color: CYAN
parent: ci-cd
includes: [deploy:staging]
deploy-prod:
emoji: "π΄"
label: "Production"
color: RED
parent: ci-cd
includes: [deploy:prod]
show_summary: true
order: 10 βοΈ Core
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
π CI / CD
Trigger full pipeline with 'task ci-cd:all'
π Staging
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
deploy:staging:rollback Rollback staging
deploy:staging:run Run staging deployment
π΄ Production
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
deploy:prod:run Run production deployment
β Full production rollout β requires PR approval first.
Old namespaces format β still works:
{
"namespaces": {
"deploy": ["π", "Deployment", "GREEN"]
}
}New groups format β equivalent:
{
"groups": {
"deploy": { "emoji": "π", "label": "Deployment", "color": "GREEN" }
}
}Mixed migration (add groups for new entries, leave old namespaces intact):
{
"namespaces": { "docker": ["π³", "Docker", "BLUE"] },
"groups": {
"deploy": { "emoji": "π", "label": "Deployment", "color": "GREEN",
"includes": ["deploy:staging", "deploy:prod"] }
}
}Both keys are merged; groups entries override namespaces entries with the same key.
Accepts a JSON object of rich descriptors, merged into cfg.groups:
TASK_HELP_GROUPS='{"schema":{"emoji":"π","label":"Schema","color":"MAGENTA","includes":["validate","migrate"]}}'By default groups appear in the insertion order of cfg.namespaces (built-in
defaults first, then user-defined keys). Use namespace_order to impose an
explicit order:
{
"namespace_order": ["_top", "build", "test", "lint", "deploy", "docker"]
}Groups not listed in namespace_order are appended after the ordered groups,
sorted alphabetically.
Show the number of tasks in each group header separator:
{ "show_task_count": true } π Deployment
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ (3 tasks)
deploy:run ...
Also available via TASK_HELP_SHOW_TASK_COUNT=1 or --show-task-count.
The _top group collects all tasks without a colon prefix. To hide noise tasks
(e.g. the default task that just invokes task-help itself):
{ "top_exclude": ["default"] }_default, _root, and "" are also accepted as aliases for _top in the
namespaces key β they all map to the same built-in catch-all group.
Show summaries for specific namespaces even when the global show_summary is off:
{ "show_summary_for": ["install", "setup"] }This is useful when only a few groups have long, important summaries.
Suppress aliases that match a regex pattern. A common pattern is hiding
single-token aliases (e.g. dev, mcp-server) that appear as noisy "shorthand
for the namespace default task" entries:
{ "hide_alias_patterns": ["^\\w+$"] }^\\w+$ matches any alias containing only word characters (letters, digits,
underscore) with no spaces or special chars. Task-level aliases that are
genuinely multi-token (e.g. deploy:prod) are preserved.
Two built-in themes target different terminal backgrounds:
| Theme | Best for | Colors |
|---|---|---|
dark (default) |
Black / dark terminals | CYAN header, GREEN tasks, WHITE aliases |
light |
White / light terminals | BRIGHT_BLUE header, BLUE tasks, GRAY aliases |
Switch via --theme light, TASK_HELP_THEME=light, or "theme": "light" in config.
Aliases are shown inline after the description, in the same colour as the namespace group header:
gh-copilot:config Show Copilot CLI config file (aliases: ghc:config | ghco:config)
Multiple aliases are separated by |.
{
"alias_color": "namespace",
"alias_color_adjust": "none",
"alias_fallback_color": "WHITE"
}| Key | Values | Description |
|---|---|---|
alias_color |
"namespace" (default) |
Use the group's namespace colour |
| any color name / ANSI code | Override with a fixed colour | |
alias_color_adjust |
"none" (default) |
No brightness adjustment |
"dim" |
Apply DIM on top of the alias colour |
|
"bright" |
Apply BOLD on top of the alias colour |
|
alias_fallback_color |
any color name | Used when no namespace colour is defined |
Define aliases in a task's aliases: field β they are shown inline:
tasks:
deploy:staging:
aliases: [ds]
desc: "Deploy to staging"When including a Taskfile with namespace aliases, all tasks in that file are also accessible under the alias prefix:
includes:
zellij:
taskfile: ~/.taskfiles/Taskfile.zellij.yml
optional: true
aliases:
- zTaskfile registers both zellij:start and z:start as separate task entries.
task-help groups each by its namespace prefix, so you will see both zellij
and z groups in the output. Use --no-aliases / TASK_HELP_NO_ALIASES=1 to
suppress alias display for cleaner output.
| File | Description |
|---|---|
task_help.py |
The script β PEP 723 uv inline, run directly or via uv run |
install.sh |
One-liner installer (curl β¦ | bash) |
Taskfile.task-help.yml |
Lifecycle tasks (install/update/remove/status) β deployed to ~/.taskfiles/taskscripts/ by the installer |
Taskfile.taskscripts.yml |
Orchestrator template β deployed to ~/.taskfiles/ if not present |
Taskfile.example.yml |
Full project wiring example (smart default + fallback warning) |
CHANGELOG.md |
Version history |
README.md |
This file |