Full Code of go-task/task for AI

main 19d8fae5f95a cached
715 files
1.0 MB
337.6k tokens
1160 symbols
1 requests
Download .txt
Showing preview only (1,238K chars total). Download the full file or copy to clipboard to get everything.
Repository: go-task/task
Branch: main
Commit: 19d8fae5f95a
Files: 715
Total size: 1.0 MB

Directory structure:
gitextract_c5f3ar5r/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── pull_request_template.md
│   ├── renovate.json
│   └── workflows/
│       ├── issue-awaiting-response.yml
│       ├── issue-closed.yml
│       ├── issue-experiment.yml
│       ├── issue-needs-triage.yml
│       ├── lint.yml
│       ├── pr-build.yml
│       ├── release-nightly.yml
│       ├── release.yml
│       └── test.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser-nightly.yml
├── .goreleaser-pr.yml
├── .goreleaser.yml
├── .mockery.yaml
├── .prettierrc.yml
├── .taskrc.yml
├── .vscode/
│   ├── extensions.json
│   └── settings-sample.json
├── CHANGELOG.md
├── LICENSE
├── README.md
├── Taskfile.yml
├── args/
│   ├── args.go
│   └── args_test.go
├── bin/
│   └── .keep
├── call.go
├── cmd/
│   ├── release/
│   │   └── main.go
│   ├── sleepit/
│   │   └── sleepit.go
│   └── task/
│       └── task.go
├── compiler.go
├── completion/
│   ├── bash/
│   │   └── task.bash
│   ├── fish/
│   │   └── task.fish
│   ├── ps/
│   │   └── task.ps1
│   └── zsh/
│       └── _task
├── completion.go
├── concurrency.go
├── errors/
│   ├── error_taskfile_decode.go
│   ├── errors.go
│   ├── errors_task.go
│   ├── errors_taskfile.go
│   └── errors_taskrc.go
├── executor.go
├── executor_test.go
├── experiments/
│   ├── errors.go
│   ├── experiment.go
│   ├── experiment_test.go
│   └── experiments.go
├── formatter_test.go
├── go.mod
├── go.sum
├── hash.go
├── help.go
├── init.go
├── init_test.go
├── install-task.sh
├── internal/
│   ├── deepcopy/
│   │   └── deepcopy.go
│   ├── editors/
│   │   └── output.go
│   ├── env/
│   │   └── env.go
│   ├── execext/
│   │   ├── coreutils.go
│   │   ├── devnull.go
│   │   └── exec.go
│   ├── filepathext/
│   │   └── filepathext.go
│   ├── fingerprint/
│   │   ├── checker.go
│   │   ├── checker_mock.go
│   │   ├── glob.go
│   │   ├── sources.go
│   │   ├── sources_checksum.go
│   │   ├── sources_checksum_test.go
│   │   ├── sources_none.go
│   │   ├── sources_timestamp.go
│   │   ├── status.go
│   │   ├── task.go
│   │   └── task_test.go
│   ├── flags/
│   │   └── flags.go
│   ├── fsext/
│   │   ├── fs.go
│   │   ├── fs_test.go
│   │   └── testdata/
│   │       ├── bar.txt
│   │       └── foo.txt
│   ├── fsnotifyext/
│   │   └── fsnotify_dedup.go
│   ├── goext/
│   │   └── meta.go
│   ├── hash/
│   │   └── hash.go
│   ├── input/
│   │   └── input.go
│   ├── logger/
│   │   └── logger.go
│   ├── output/
│   │   ├── group.go
│   │   ├── interleaved.go
│   │   ├── output.go
│   │   ├── output_test.go
│   │   └── prefixed.go
│   ├── slicesext/
│   │   ├── slicesext.go
│   │   └── slicesext_test.go
│   ├── sort/
│   │   ├── sorter.go
│   │   └── sorter_test.go
│   ├── summary/
│   │   ├── summary.go
│   │   └── summary_test.go
│   ├── sysinfo/
│   │   ├── uid.go
│   │   └── uid_win.go
│   ├── templater/
│   │   ├── funcs.go
│   │   └── templater.go
│   ├── term/
│   │   └── term.go
│   └── version/
│       ├── version.go
│       └── version.txt
├── precondition.go
├── requires.go
├── setup.go
├── signals.go
├── signals_test.go
├── status.go
├── task.go
├── task_test.go
├── taskfile/
│   ├── ast/
│   │   ├── cmd.go
│   │   ├── defer.go
│   │   ├── dep.go
│   │   ├── for.go
│   │   ├── glob.go
│   │   ├── graph.go
│   │   ├── include.go
│   │   ├── location.go
│   │   ├── matrix.go
│   │   ├── output.go
│   │   ├── platforms.go
│   │   ├── platforms_test.go
│   │   ├── precondition.go
│   │   ├── precondition_test.go
│   │   ├── prompt.go
│   │   ├── requires.go
│   │   ├── task.go
│   │   ├── taskfile.go
│   │   ├── taskfile_test.go
│   │   ├── tasks.go
│   │   ├── var.go
│   │   └── vars.go
│   ├── dotenv.go
│   ├── node.go
│   ├── node_base.go
│   ├── node_cache.go
│   ├── node_file.go
│   ├── node_git.go
│   ├── node_git_test.go
│   ├── node_http.go
│   ├── node_http_test.go
│   ├── node_stdin.go
│   ├── node_test.go
│   ├── reader.go
│   ├── snippet.go
│   ├── snippet_test.go
│   ├── taskfile.go
│   ├── templates/
│   │   └── default.yml
│   └── themes/
│       └── task.xml
├── taskrc/
│   ├── ast/
│   │   └── taskrc.go
│   ├── node.go
│   ├── reader.go
│   ├── taskrc.go
│   └── taskrc_test.go
├── testdata/
│   ├── alias/
│   │   ├── Taskfile.yml
│   │   ├── Taskfile2.yml
│   │   └── testdata/
│   │       ├── TestAlias-alias.golden
│   │       ├── TestAlias-alias_summary.golden
│   │       ├── TestAlias-duplicate_alias-err-run.golden
│   │       └── TestAlias-duplicate_alias.golden
│   ├── checksum/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   ├── generated-wildcard.txt
│   │   ├── ignore_me.txt
│   │   └── source.txt
│   ├── cmds_vars/
│   │   ├── Taskfile.yml
│   │   └── source.txt
│   ├── concurrency/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestConcurrency.golden
│   ├── cyclic/
│   │   └── Taskfile.yml
│   ├── deferred/
│   │   └── Taskfile.yml
│   ├── deps/
│   │   ├── Taskfile.yml
│   │   ├── d1.txt
│   │   ├── d11.txt
│   │   ├── d12.txt
│   │   ├── d13.txt
│   │   ├── d2.txt
│   │   ├── d21.txt
│   │   ├── d22.txt
│   │   ├── d23.txt
│   │   ├── d3.txt
│   │   ├── d31.txt
│   │   ├── d32.txt
│   │   ├── d33.txt
│   │   └── testdata/
│   │       └── TestDeps.golden
│   ├── desc/
│   │   └── Taskfile.yml
│   ├── dir/
│   │   ├── Taskfile.yml
│   │   ├── dynamic_var/
│   │   │   ├── .gitignore
│   │   │   ├── Taskfile.yml
│   │   │   └── subdirectory/
│   │   │       └── Taskfile.yml
│   │   ├── dynamic_var_on_created_dir/
│   │   │   └── Taskfile.yml
│   │   ├── explicit_doesnt_exist/
│   │   │   └── Taskfile.yml
│   │   └── explicit_exists/
│   │       ├── Taskfile.yml
│   │       └── exists/
│   │           └── .keep
│   ├── dotenv/
│   │   ├── .gitignore
│   │   ├── default/
│   │   │   └── Taskfile.yml
│   │   ├── env_var_in_path/
│   │   │   └── Taskfile.yml
│   │   ├── error_included_envs/
│   │   │   └── Taskfile.yml
│   │   ├── include1/
│   │   │   └── Taskfile.yml
│   │   ├── local_env_in_path/
│   │   │   └── Taskfile.yml
│   │   ├── local_var_in_path/
│   │   │   └── Taskfile.yml
│   │   ├── missing_env/
│   │   │   └── Taskfile.yml
│   │   └── parse_error/
│   │       ├── .env-with-error
│   │       └── Taskfile.yml
│   ├── dotenv_task/
│   │   └── default/
│   │       ├── .gitignore
│   │       └── Taskfile.yml
│   ├── dry/
│   │   └── Taskfile.yml
│   ├── dry_checksum/
│   │   ├── Taskfile.yml
│   │   └── source.txt
│   ├── empty_task/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestEmptyTask.golden
│   ├── empty_taskfile/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestEmptyTaskfile-err-setup.golden
│   │       └── TestEmptyTaskfile.golden
│   ├── env/
│   │   ├── Taskfile.yml
│   │   ├── dynamic.txt
│   │   ├── global.txt
│   │   ├── local.txt
│   │   ├── multiple_type.txt
│   │   ├── not-overridden.txt
│   │   ├── overridden.txt
│   │   └── testdata/
│   │       ├── TestEnv-env_precedence_disabled.golden
│   │       └── TestEnv-env_precedence_enabled.golden
│   ├── error_code/
│   │   └── Taskfile.yml
│   ├── evaluate_symlinks_in_paths/
│   │   ├── Taskfile.yaml
│   │   ├── shared/
│   │   │   ├── b
│   │   │   └── inner_shared/
│   │   │       └── c
│   │   └── src/
│   │       └── a
│   ├── exit_code/
│   │   └── Taskfile.yml
│   ├── exit_immediately/
│   │   └── Taskfile.yml
│   ├── expand/
│   │   └── Taskfile.yml
│   ├── failfast/
│   │   ├── default/
│   │   │   ├── Taskfile.yaml
│   │   │   └── testdata/
│   │   │       ├── TestFailfast-Default-default-err-run.golden
│   │   │       ├── TestFailfast-Default-default.golden
│   │   │       ├── TestFailfast-Option-default-err-run.golden
│   │   │       └── TestFailfast-Option-default.golden
│   │   └── task/
│   │       ├── Taskfile.yaml
│   │       └── testdata/
│   │           ├── TestFailfast-Task-task-err-run.golden
│   │           └── TestFailfast-Task-task.golden
│   ├── file_names/
│   │   ├── .gitignore
│   │   ├── Taskfile.dist.yaml/
│   │   │   └── Taskfile.dist.yaml
│   │   ├── Taskfile.dist.yml/
│   │   │   └── Taskfile.dist.yml
│   │   ├── Taskfile.yaml/
│   │   │   └── Taskfile.yaml
│   │   └── Taskfile.yml/
│   │       └── Taskfile.yml
│   ├── for/
│   │   ├── cmds/
│   │   │   ├── Taskfile.yml
│   │   │   ├── bar.txt
│   │   │   ├── foo.txt
│   │   │   └── testdata/
│   │   │       ├── TestForCmds-loop-different-tasks.golden
│   │   │       ├── TestForCmds-loop-explicit.golden
│   │   │       ├── TestForCmds-loop-generates-glob.golden
│   │   │       ├── TestForCmds-loop-generates.golden
│   │   │       ├── TestForCmds-loop-matrix-ref-error-err-run.golden
│   │   │       ├── TestForCmds-loop-matrix-ref-error.golden
│   │   │       ├── TestForCmds-loop-matrix-ref.golden
│   │   │       ├── TestForCmds-loop-matrix.golden
│   │   │       ├── TestForCmds-loop-sources-glob.golden
│   │   │       ├── TestForCmds-loop-sources.golden
│   │   │       ├── TestForCmds-loop-task-as.golden
│   │   │       ├── TestForCmds-loop-task.golden
│   │   │       ├── TestForCmds-loop-vars-sh.golden
│   │   │       └── TestForCmds-loop-vars.golden
│   │   └── deps/
│   │       ├── Taskfile.yml
│   │       ├── bar.txt
│   │       ├── foo.txt
│   │       └── testdata/
│   │           ├── TestForDeps-loop-different-tasks.golden
│   │           ├── TestForDeps-loop-explicit.golden
│   │           ├── TestForDeps-loop-generates-glob.golden
│   │           ├── TestForDeps-loop-generates.golden
│   │           ├── TestForDeps-loop-matrix-ref-error-err-run.golden
│   │           ├── TestForDeps-loop-matrix-ref-error.golden
│   │           ├── TestForDeps-loop-matrix-ref.golden
│   │           ├── TestForDeps-loop-matrix.golden
│   │           ├── TestForDeps-loop-sources-glob.golden
│   │           ├── TestForDeps-loop-sources.golden
│   │           ├── TestForDeps-loop-task-as.golden
│   │           ├── TestForDeps-loop-task.golden
│   │           ├── TestForDeps-loop-vars-sh.golden
│   │           └── TestForDeps-loop-vars.golden
│   ├── force/
│   │   └── Taskfile.yml
│   ├── fuzzy/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestFuzzyModel-fuzzy-err-run.golden
│   │       ├── TestFuzzyModel-fuzzy.golden
│   │       ├── TestFuzzyModel-intern-err-run.golden
│   │       ├── TestFuzzyModel-intern.golden
│   │       └── TestFuzzyModel-not-fuzzy.golden
│   ├── generates/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── sub/
│   │       └── .keep
│   ├── if/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestIf-cmd-if-false.golden
│   │       ├── TestIf-cmd-if-true.golden
│   │       ├── TestIf-if-in-for-loop.golden
│   │       ├── TestIf-task-call-if-false.golden
│   │       ├── TestIf-task-call-if-true.golden
│   │       ├── TestIf-task-if-dynamic-false.golden
│   │       ├── TestIf-task-if-dynamic-true.golden
│   │       ├── TestIf-task-if-false.golden
│   │       ├── TestIf-task-if-true.golden
│   │       ├── TestIf-task-level-template-false.golden
│   │       ├── TestIf-task-level-template.golden
│   │       ├── TestIf-template-and.golden
│   │       ├── TestIf-template-bool-false.golden
│   │       ├── TestIf-template-bool-true.golden
│   │       ├── TestIf-template-cli-var.golden
│   │       ├── TestIf-template-direct-false.golden
│   │       ├── TestIf-template-direct-true.golden
│   │       ├── TestIf-template-eq-false.golden
│   │       ├── TestIf-template-eq-true.golden
│   │       ├── TestIf-template-ne.golden
│   │       └── TestIf-template-or.golden
│   ├── ignore_errors/
│   │   └── Taskfile.yml
│   ├── ignore_nil_elements/
│   │   ├── cmds/
│   │   │   └── Taskfile.yml
│   │   ├── deps/
│   │   │   └── Taskfile.yml
│   │   ├── includes/
│   │   │   ├── Taskfile.yml
│   │   │   └── inc.yml
│   │   └── preconditions/
│   │       └── Taskfile.yml
│   ├── ignore_signals/
│   │   └── Taskfile.yml
│   ├── include_with_vars/
│   │   ├── Taskfile.yml
│   │   └── include/
│   │       ├── Taskfile.include1.yml
│   │       ├── Taskfile.include2.yml
│   │       └── Taskfile.include3.yml
│   ├── include_with_vars_inside_include/
│   │   ├── Taskfile.yml
│   │   └── include/
│   │       └── Taskfile.include.yml
│   ├── include_with_vars_multi_level/
│   │   ├── Taskfile.yml
│   │   ├── bar/
│   │   │   └── Taskfile.yml
│   │   ├── foo/
│   │   │   └── Taskfile.yml
│   │   └── lib/
│   │       └── Taskfile.yml
│   ├── included_taskfile_var_merging/
│   │   ├── Taskfile.yaml
│   │   ├── bar/
│   │   │   └── Taskfile.yaml
│   │   └── foo/
│   │       └── Taskfile.yaml
│   ├── includes/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   ├── Taskfile2.yml
│   │   ├── Taskfile_darwin.yml
│   │   ├── Taskfile_linux.yml
│   │   ├── Taskfile_windows.yml
│   │   ├── included/
│   │   │   └── Taskfile.yml
│   │   ├── module1/
│   │   │   └── Taskfile.yml
│   │   └── module2/
│   │       └── Taskfile.yml
│   ├── includes_call_root_task/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── Taskfile2.yml
│   ├── includes_checksum/
│   │   ├── correct/
│   │   │   ├── Taskfile.yml
│   │   │   └── testdata/
│   │   │       └── TestIncludeChecksum-correct.golden
│   │   ├── correct_remote/
│   │   │   └── Taskfile.yml
│   │   ├── included.yml
│   │   └── incorrect/
│   │       ├── Taskfile.yml
│   │       └── testdata/
│   │           ├── TestIncludeChecksum-incorrect-err-setup.golden
│   │           └── TestIncludeChecksum-incorrect.golden
│   ├── includes_cycle/
│   │   ├── Taskfile.yml
│   │   └── one/
│   │       ├── Taskfile.yml
│   │       └── two/
│   │           └── Taskfile.yml
│   ├── includes_deps/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── Taskfile2.yml
│   ├── includes_empty/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── Taskfile2.yml
│   ├── includes_flatten/
│   │   ├── .gitignore
│   │   ├── Taskfile.multiple.yml
│   │   ├── Taskfile.with_default.yml
│   │   ├── Taskfile.yml
│   │   ├── included/
│   │   │   └── Taskfile.yml
│   │   └── nested/
│   │       └── Taskfile.yml
│   ├── includes_http/
│   │   ├── child-taskfile2.yml
│   │   ├── child-taskfile3.yml
│   │   ├── root-taskfile-remotefile-empty-dir-1st.yml
│   │   └── root-taskfile-remotefile-empty-dir-2nd.yml
│   ├── includes_incorrect/
│   │   ├── Taskfile.yml
│   │   └── incomplete.yml
│   ├── includes_internal/
│   │   ├── Taskfile.yml
│   │   └── Taskfile2.yml
│   ├── includes_interpolation/
│   │   ├── include/
│   │   │   └── Taskfile.yml
│   │   ├── include_with_dir/
│   │   │   └── Taskfile.yml
│   │   ├── include_with_env_variable/
│   │   │   └── Taskfile.yml
│   │   └── included/
│   │       └── Taskfile.yml
│   ├── includes_multi_level/
│   │   ├── Taskfile.yml
│   │   ├── called_one.txt
│   │   ├── called_three.txt
│   │   ├── called_two.txt
│   │   └── one/
│   │       ├── Taskfile.yml
│   │       └── two/
│   │           ├── Taskfile.yml
│   │           └── three/
│   │               └── Taskfile.yml
│   ├── includes_optional/
│   │   ├── .gitignore
│   │   └── Taskfile.yml
│   ├── includes_optional_explicit_false/
│   │   └── Taskfile.yml
│   ├── includes_optional_implicit_false/
│   │   └── Taskfile.yml
│   ├── includes_rel_path/
│   │   ├── Taskfile.yml
│   │   ├── common/
│   │   │   └── Taskfile.yml
│   │   └── included/
│   │       └── Taskfile.yml
│   ├── includes_remote/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── first/
│   │       ├── Taskfile.yml
│   │       └── second/
│   │           └── Taskfile.yml
│   ├── includes_shadowed_default/
│   │   ├── Taskfile.yml
│   │   ├── Taskfile2.yml
│   │   └── file.txt
│   ├── includes_silent/
│   │   ├── Taskfile-inc.yml
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestIncludeSilent-include-taskfile-silent.golden
│   ├── includes_unshadowed_default/
│   │   ├── Taskfile.yml
│   │   ├── Taskfile2.yml
│   │   └── file.txt
│   ├── includes_with_excludes/
│   │   ├── Taskfile.yml
│   │   └── included/
│   │       └── Taskfile.yml
│   ├── includes_yaml/
│   │   ├── .gitignore
│   │   ├── Custom.ext
│   │   └── included/
│   │       ├── Taskfile.yaml
│   │       └── custom.yaml
│   ├── init/
│   │   └── .gitignore
│   ├── interactive_vars/
│   │   ├── .taskrc.yml
│   │   └── Taskfile.yml
│   ├── internal_task/
│   │   └── Taskfile.yml
│   ├── json_list_format/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestJsonListFormat.golden
│   ├── label_error/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestLabel-label_in_error-err-run.golden
│   │       └── TestLabel-label_in_error.golden
│   ├── label_list/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestNoLabelInList.golden
│   ├── label_status/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestLabel-status-err-status.golden
│   │       └── TestLabel-status.golden
│   ├── label_summary/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestLabel-label_in_summary.golden
│   │       └── TestLabel-summary.golden
│   ├── label_uptodate/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestLabel-up_to_date.golden
│   ├── label_var/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestLabel-var.golden
│   ├── list_desc_interpolation/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestListDescInterpolation.golden
│   ├── list_mixed_desc/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestListAllShowsNoDesc.golden
│   │       └── TestListCanListDescOnly.golden
│   ├── output_group/
│   │   └── Taskfile.yml
│   ├── output_group_error_only/
│   │   └── Taskfile.yml
│   ├── params/
│   │   ├── Taskfile.yml
│   │   ├── dep1.txt
│   │   ├── dep2.txt
│   │   ├── exclamation.txt
│   │   ├── german.txt
│   │   ├── hello.txt
│   │   ├── portuguese.txt
│   │   ├── portuguese2.txt
│   │   ├── spanish-dep.txt
│   │   ├── spanish.txt
│   │   ├── testdata/
│   │   │   └── TestParams.golden
│   │   └── world.txt
│   ├── platforms/
│   │   └── Taskfile.yml
│   ├── precondition/
│   │   ├── Taskfile.yml
│   │   ├── foo.txt
│   │   └── testdata/
│   │       ├── TestPrecondition-a_precondition_has_been_met.golden
│   │       ├── TestPrecondition-a_precondition_was_not_met-err-run.golden
│   │       ├── TestPrecondition-a_precondition_was_not_met.golden
│   │       ├── TestPrecondition-precondition_in_cmd_fails_the_task-err-run.golden
│   │       ├── TestPrecondition-precondition_in_cmd_fails_the_task.golden
│   │       ├── TestPrecondition-precondition_in_dependency_fails_the_task-err-run.golden
│   │       └── TestPrecondition-precondition_in_dependency_fails_the_task.golden
│   ├── prefix_uptodate/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestPrefix-up_to_dat_with_no_output_style.golden
│   │       └── TestPrefix-up_to_date.golden
│   ├── prompt/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestPromptAssumeYes---yes_flag_should_skip_prompt.golden
│   │       ├── TestPromptAssumeYes-task_should_raise_errors.TaskCancelledError-err-run.golden
│   │       ├── TestPromptAssumeYes-task_should_raise_errors.TaskCancelledError.golden
│   │       ├── TestPromptInSummary-test_Enter_stops_task-test_Enter_stops_task-err-run.golden
│   │       ├── TestPromptInSummary-test_Enter_stops_task-test_Enter_stops_task.golden
│   │       ├── TestPromptInSummary-test_junk_value_stops_task-test_junk_value_stops_task-err-run.golden
│   │       ├── TestPromptInSummary-test_junk_value_stops_task-test_junk_value_stops_task.golden
│   │       ├── TestPromptInSummary-test_long_approval-test_long_approval.golden
│   │       ├── TestPromptInSummary-test_short_approval-test_short_approval.golden
│   │       ├── TestPromptInSummary-test_stops_task-test_stops_task-err-run.golden
│   │       ├── TestPromptInSummary-test_stops_task-test_stops_task.golden
│   │       ├── TestPromptInSummary-test_uppercase_approval-test_uppercase_approval.golden
│   │       └── TestPromptWithIndirectTask.golden
│   ├── requires/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestRequires-fails_validation-err-run.golden
│   │       ├── TestRequires-fails_validation.golden
│   │       ├── TestRequires-passes_validation.golden
│   │       ├── TestRequires-require_before_compile-err-run.golden
│   │       ├── TestRequires-require_before_compile.golden
│   │       ├── TestRequires-required_var_missing-err-run.golden
│   │       ├── TestRequires-required_var_missing.golden
│   │       ├── TestRequires-required_var_missing_+_fails_validation#01.golden
│   │       ├── TestRequires-required_var_missing_+_fails_validation-err-run.golden
│   │       ├── TestRequires-required_var_missing_+_fails_validation.golden
│   │       ├── TestRequires-required_var_ok.golden
│   │       └── TestRequires-var_defined_in_task.golden
│   ├── run/
│   │   ├── .gitignore
│   │   └── Taskfile.yml
│   ├── run_once_shared_deps/
│   │   ├── Taskfile.yml
│   │   ├── library/
│   │   │   └── Taskfile.yml
│   │   ├── service-a/
│   │   │   ├── Taskfile.yml
│   │   │   └── src/
│   │   │       └── imasource.go
│   │   └── service-b/
│   │       ├── Taskfile.yml
│   │       └── src/
│   │           └── imasource.go
│   ├── run_when_changed/
│   │   ├── Taskfile.yml
│   │   ├── library/
│   │   │   └── Taskfile.yml
│   │   ├── service-a/
│   │   │   └── Taskfile.yml
│   │   └── service-b/
│   │       └── Taskfile.yml
│   ├── shopts/
│   │   ├── command_level/
│   │   │   └── Taskfile.yml
│   │   ├── global_level/
│   │   │   └── Taskfile.yml
│   │   └── task_level/
│   │       └── Taskfile.yml
│   ├── short_task_notation/
│   │   └── Taskfile.yml
│   ├── silent/
│   │   └── Taskfile.yml
│   ├── single_cmd_dep/
│   │   ├── .gitignore
│   │   └── Taskfile.yml
│   ├── special_vars/
│   │   ├── Taskfile.yml
│   │   ├── included/
│   │   │   └── Taskfile.yml
│   │   ├── subdir/
│   │   │   ├── .gitkeep
│   │   │   └── testdata/
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-included-print-root-dir.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-included-print-task.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-included-print-taskfile-dir.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-included-print-taskfile.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-print-root-dir.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-print-root-taskfile.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-print-task-dir.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-print-task.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-print-taskfile-dir.golden
│   │   │       └── TestSpecialVars-testdata-special_vars-subdir-print-taskfile.golden
│   │   └── testdata/
│   │       ├── TestSpecialVars-testdata-special_vars-included-print-root-dir.golden
│   │       ├── TestSpecialVars-testdata-special_vars-included-print-task.golden
│   │       ├── TestSpecialVars-testdata-special_vars-included-print-taskfile-dir.golden
│   │       ├── TestSpecialVars-testdata-special_vars-included-print-taskfile.golden
│   │       ├── TestSpecialVars-testdata-special_vars-print-root-dir.golden
│   │       ├── TestSpecialVars-testdata-special_vars-print-root-taskfile.golden
│   │       ├── TestSpecialVars-testdata-special_vars-print-task-dir.golden
│   │       ├── TestSpecialVars-testdata-special_vars-print-task.golden
│   │       ├── TestSpecialVars-testdata-special_vars-print-taskfile-dir.golden
│   │       └── TestSpecialVars-testdata-special_vars-print-taskfile.golden
│   ├── split_args/
│   │   └── Taskfile.yml
│   ├── status/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestStatus-run_gen-bar_1_silent.golden
│   │       ├── TestStatus-run_gen-bar_2_silent.golden
│   │       ├── TestStatus-run_gen-bar_3_silent.golden
│   │       ├── TestStatus-run_gen-bar_4_silent.golden
│   │       ├── TestStatus-run_gen-bar_5.golden
│   │       ├── TestStatus-run_gen-bar_6.golden
│   │       ├── TestStatus-run_gen-baz_2.golden
│   │       ├── TestStatus-run_gen-baz_3.golden
│   │       ├── TestStatus-run_gen-baz_4_verbose.golden
│   │       ├── TestStatus-run_gen-baz_silent.golden
│   │       ├── TestStatus-run_gen-foo_1_silent.golden
│   │       ├── TestStatus-run_gen-foo_2.golden
│   │       └── TestStatus-run_gen-foo_3.golden
│   ├── status_vars/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── source.txt
│   ├── summary/
│   │   ├── Taskfile.yml
│   │   └── task-with-summary.txt
│   ├── summary-vars-requires/
│   │   ├── Taskfile-with-env.yml
│   │   ├── Taskfile-with-globals.yml
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestSummaryWithVarsAndRequires-shell-vars.golden
│   │       └── TestSummaryWithVarsAndRequires-vars-and-requires.golden
│   ├── taskfile_walk/
│   │   ├── Taskfile.yml
│   │   └── foo/
│   │       └── bar/
│   │           └── .gitkeep
│   ├── user_working_dir/
│   │   └── Taskfile.yml
│   ├── user_working_dir_with_includes/
│   │   ├── Taskfile.yml
│   │   ├── included/
│   │   │   └── Taskfile.yml
│   │   └── somedir/
│   │       └── .keep
│   ├── var_inheritance/
│   │   └── v3/
│   │       ├── entrypoint-global-dotenv/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-global-dotenv.golden
│   │       ├── entrypoint-global-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-global-vars.golden
│   │       ├── entrypoint-task-call-dotenv/
│   │       │   ├── Taskfile.yml
│   │       │   ├── called-task.env
│   │       │   ├── global.env
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-task-call-dotenv.golden
│   │       ├── entrypoint-task-call-task-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-task-call-task-vars.golden
│   │       ├── entrypoint-task-call-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-task-call-vars.golden
│   │       ├── entrypoint-task-dotenv/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-task-dotenv.golden
│   │       ├── entrypoint-task-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-task-vars.golden
│   │       ├── included-global-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-global-vars.golden
│   │       ├── included-task/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   └── task.env
│   │       ├── included-task-call-dotenv/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-task-call-dotenv.golden
│   │       ├── included-task-call-task-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-task-call-task-vars.golden
│   │       ├── included-task-call-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-task-call-vars.golden
│   │       ├── included-task-dotenv/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-task-dotenv.golden
│   │       ├── included-task-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-task-vars.golden
│   │       └── shell/
│   │           ├── Taskfile.yml
│   │           └── testdata/
│   │               └── TestVarInheritance-shell.golden
│   ├── var_references/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestReference-reference_in_command.golden
│   │       ├── TestReference-reference_in_dependency.golden
│   │       ├── TestReference-reference_using_templating_resolver.golden
│   │       └── TestReference-reference_using_templating_resolver_and_dynamic_var.golden
│   ├── vars/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   ├── any/
│   │   │   ├── Taskfile.yml
│   │   │   ├── example.json
│   │   │   └── example.yaml
│   │   └── testdata/
│   │       ├── TestVars-cli-var-priority-default.golden
│   │       ├── TestVars-cli-var-priority-override.golden
│   │       └── TestVars.golden
│   ├── version/
│   │   ├── v1/
│   │   │   └── Taskfile.yml
│   │   ├── v2/
│   │   │   └── Taskfile.yml
│   │   └── v3/
│   │       └── Taskfile.yml
│   ├── watch/
│   │   ├── .gitignore
│   │   └── Taskfile.yaml
│   └── wildcards/
│       └── Taskfile.yml
├── variables.go
├── watch.go
├── watch_test.go
└── website/
    ├── .gitignore
    ├── .prettierignore
    ├── .vitepress/
    │   ├── components/
    │   │   ├── AuthorCard.vue
    │   │   ├── BlogPost.vue
    │   │   ├── HomePage.vue
    │   │   ├── VPTeamMembersItem.vue
    │   │   └── Version.vue
    │   ├── components.d.ts
    │   ├── config.ts
    │   ├── meta.ts
    │   ├── plugins/
    │   │   └── github-links.ts
    │   ├── sponsors.ts
    │   ├── team.ts
    │   └── theme/
    │       ├── custom.css
    │       └── index.ts
    ├── Taskfile.yml
    ├── netlify.toml
    ├── package.json
    ├── prettier.config.js
    ├── src/
    │   ├── blog/
    │   │   ├── any-variables.md
    │   │   ├── if-and-variable-prompt.md
    │   │   ├── index.md
    │   │   ├── task-in-2023.md
    │   │   └── windows-core-utils.md
    │   ├── docs/
    │   │   ├── changelog.md
    │   │   ├── community.md
    │   │   ├── contributing.md
    │   │   ├── deprecations/
    │   │   │   ├── completion-scripts.md
    │   │   │   ├── index.md
    │   │   │   ├── template-functions.md
    │   │   │   ├── template.md
    │   │   │   └── version-2-schema.md
    │   │   ├── experiments/
    │   │   │   ├── env-precedence.md
    │   │   │   ├── gentle-force.md
    │   │   │   ├── index.md
    │   │   │   ├── remote-taskfiles.md
    │   │   │   └── template.md
    │   │   ├── faq.md
    │   │   ├── getting-started.md
    │   │   ├── guide.md
    │   │   ├── installation.md
    │   │   ├── integrations.md
    │   │   ├── reference/
    │   │   │   ├── cli.md
    │   │   │   ├── config.md
    │   │   │   ├── environment.md
    │   │   │   ├── package.md
    │   │   │   ├── schema.md
    │   │   │   └── templating.md
    │   │   ├── releasing.md
    │   │   ├── styleguide.md
    │   │   └── taskfile-versions.md
    │   ├── donate.md
    │   ├── index.md
    │   ├── public/
    │   │   ├── CNAME
    │   │   ├── _redirects
    │   │   ├── install.sh
    │   │   ├── robots.txt
    │   │   ├── schema-taskrc.json
    │   │   └── schema.json
    │   └── team.md
    └── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
# editorconfig.org

root = true

[*]
insert_final_newline = true
charset = utf-8
trim_trailing_whitespace = true
indent_style = tab

[*.{md,mdx,yml,yaml,json,toml,htm,html,js,ts,vue,css,svg,sh,bash,fish}]
indent_style = space
indent_size = 2


================================================
FILE: .gitattributes
================================================
* text=auto
*.mdx -linguist-detectable


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: '🐞 Bug Report'
description: Report a bug in Task.
labels: ['state: needs-triage']
body:
  - type: markdown
    attributes:
      value: |
        Thanks for your bug report!

        Before submitting, please check the list of [existing issues](https://github.com/go-task/task/issues) and make sure the same bug was not already reported by someone else.

  - type: textarea
    id: description
    attributes:
      label: Description
      description: Describe the bug you're seeing.
      placeholder: |
        - What did you do?
        - What did you expect to happen?
        - What happened instead?
    validations:
      required: true

  - type: input
    id: version
    attributes:
      label: Version
      description: What version(s) of Task is the issue occurring on?
    validations:
      required: true

  - type: input
    id: os
    attributes:
      label: Operating system
      description: What operating system(s) is the issue occurring on?
    validations:
      required: true

  - type: dropdown
    id: experiments
    attributes:
      label: Experiments Enabled
      description: Do you have any experiments enabled? You can check by running `task --experiments`.
      multiple: true
      options:
        - Env Precedence
        - Gentle Force
        - Map Variables (1)
        - Map Variables (2)
        - Remote Taskfiles
    validations:
      required: false

  - type: textarea
    id: logs
    attributes:
      label: Example Taskfile
      description: |
        If you have a Taskfile that reproduces the issue, please paste it here.
        This will be automatically formatted into code, so no need for backticks.
      render: YAML
      placeholder: |
        version: '3'

        tasks:
          default:
            cmds:
              - 'echo "This Taskfile is buggy :("'


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: '🔌 Task for Visual Studio Code'
    url: https://github.com/go-task/vscode-task
    about: 'Issues related to the Visual Studio Code extension should be opened here.'
  - name: '💬 Help forum on Discord'
    url: https://discord.com/channels/974121106208354339/1025054680289660989
    about: 'The #help channel on our Discord is the best way to get help from the community.'
  - name: '❓ Questions, Ideas and General Discussions'
    url: https://github.com/go-task/task/discussions
    about: 'Ask questions and discuss general ideas with the community.'


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: '✨ Feature Request'
description: Suggest a new feature or enhancement for Task.
labels: ['state: needs-triage']
body:
  - type: markdown
    attributes:
      value: |
        Thanks for your feature request!

        Before submitting, please check the list of [existing issues](https://github.com/go-task/task/issues) and make sure the same change was not already requested by someone else.
        If your request is more of an idea than a feature request, consider opening a [discussion](https://github.com/go-task/task/discussions) instead.

  - type: textarea
    id: description
    attributes:
      label: Description
      description: Describe the feature/enhancement you want to see in Task.
      placeholder: |
        - Give a general overview of the feature/enhancement.
        - Explain problem is the change trying to solve.
        - Give examples of how you would use the feature.
    validations:
      required: true


================================================
FILE: .github/pull_request_template.md
================================================
<!--

Thanks for your pull request, we really appreciate contributions!

Please understand that it may take some time to be reviewed.

Also, make sure to follow the [Contribution Guide](https://taskfile.dev/contributing/).

-->


================================================
FILE: .github/renovate.json
================================================
{
  "$schema": "https://docs.renovatebot.com/renovate-schema.json",
  "extends": [
    "config:recommended",
    "group:allNonMajor",
    "schedule:weekly",
    ":semanticCommitTypeAll(chore)"
  ],
  "mode": "full",
  "addLabels":["area: dependencies"],
  "customManagers": [
    {
      "customType": "regex",
      "fileMatch": ["^\\.github/workflows/.*\\.ya?ml$"],
      "matchStrings": [
        "uses:\\s*golangci/golangci-lint-action@\\S+\\s+with:\\s+version:\\s*(?<currentValue>v[\\d.]+)"
      ],
      "datasourceTemplate": "github-releases",
      "depNameTemplate": "golangci/golangci-lint"
    }
  ],
  "packageRules": [
    {
      "matchManagers": ["github-actions"],
      "addLabels": ["area: github actions"]
    },
    {
      "matchCategories": ["js", "node"],
      "addLabels": ["lang: javascript"]
    },
    {
      "matchCategories": ["golang"],
      "addLabels": ["lang: go"]
    }
  ]
}


================================================
FILE: .github/workflows/issue-awaiting-response.yml
================================================
name: issue awaiting response

on:
  issue_comment:
    types: [created]

jobs:
  issue-awaiting-response:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{secrets.GH_PAT}}
          script: |
            const issue = await github.rest.issues.get({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
            })
            const comments = await github.paginate(
              github.rest.issues.listComments, {
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: context.issue.number,
              }
            )
            const labels = await github.paginate(
              github.rest.issues.listLabelsOnIssue, {
                issue_number: context.issue.number,
                owner: context.repo.owner,
                repo: context.repo.repo,
              }
            )
            if (labels.find(label => label.name === 'state: awaiting response')) {
              if (comments[comments.length-1].user?.login === issue.data.user?.login) {
                github.rest.issues.removeLabel({
                  owner: context.repo.owner,
                  repo: context.repo.repo,
                  issue_number: context.issue.number,
                  name: 'state: awaiting response'
                })
              }
            }


================================================
FILE: .github/workflows/issue-closed.yml
================================================
name: issue closed

on:
  issues:
    types: [closed]

jobs:
  issue-closed:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{secrets.GH_PAT}}
          script: |
            const labels = await github.paginate(
              github.rest.issues.listLabelsOnIssue, {
                issue_number: context.issue.number,
                owner: context.repo.owner,
                repo: context.repo.repo,
              }
            )
            if (labels.find(label => label.name === 'state: needs triage')) {
              github.rest.issues.removeLabel({
                owner: context.repo.owner,
                repo: context.repo.repo,
                issue_number: context.issue.number,
                name: 'state: needs triage'
              })
            }


================================================
FILE: .github/workflows/issue-experiment.yml
================================================
name: issue experiment

on:
  issues:
    types: [labeled]

jobs:
  issue-experiment-proposed:
    if: github.event.label.name == format('status{0} proposed', ':')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{secrets.GH_PAT}}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'This issue has been marked as an experiment proposal! :test_tube: It will now enter a period of consultation during which we encourage the community to provide feedback on the proposed design. Please see the [experiment workflow documentation](https://taskfile.dev/experiments#workflow) for more information on how we release experiments.'
            })
  issue-experiment-draft:
    if: github.event.label.name == format('status{0} draft', ':')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{secrets.GH_PAT}}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'This experiment has been marked as a draft! :sparkles: This means that an initial implementation has been added to the latest release of Task! You can find information about this experiment and how to enable it in our [experiments documentation](https://taskfile.dev/experiments). Please see the [experiment workflow documentation](https://taskfile.dev/experiments#workflow) for more information on how we release experiments.'
            })
  issue-experiment-candidate:
    if: github.event.label.name == format('status{0} candidate', ':')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{secrets.GH_PAT}}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'This experiment has been marked as a candidate! :fire: This means that the  implementation is nearing completion and we are entering a period for final comments and feedback! You can find information about this experiment and how to enable it in our [experiments documentation](https://taskfile.dev/experiments). Please see the [experiment workflow documentation](https://taskfile.dev/experiments#workflow) for more information on how we release experiments.'
            })
  issue-experiment-stable:
    if: github.event.label.name == format('status{0} stable', ':')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{secrets.GH_PAT}}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'This experiment has been marked as stable! :metal: This means that the  implementation is now final and ready to be released. No more changes will be made and the experiment is safe to use in production! You can find information about this experiment and how to enable it in our [experiments documentation](https://taskfile.dev/experiments). Please see the [experiment workflow documentation](https://taskfile.dev/experiments#workflow) for more information on how we release experiments.'
            })
  issue-experiment-released:
    if: github.event.label.name == format('status{0} released', ':')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{secrets.GH_PAT}}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'This experiment has been released! :rocket: This means that it is no longer an experiment and is available in the latest major version of Task. Please see the [experiment workflow documentation](https://taskfile.dev/experiments#workflow) for more information on how we release experiments.'
            })
            github.rest.issues.update({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              state: 'closed'
            })
  issue-experiment-abandoned:
    if: github.event.label.name == format('status{0} abandoned', ':')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{secrets.GH_PAT}}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'This experiment has been abandoned. :disappointed: This means that this feature will not be added to Task and any experimental functionality will be removed. Please see the [experiment workflow documentation](https://taskfile.dev/experiments#workflow) for more information on how we release experiments.'
            })
            github.rest.issues.update({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              state: 'closed'
            })
  issue-experiment-superseded:
    if: github.event.label.name == format('status{0} superseded', ':')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{secrets.GH_PAT}}
          script: |
            github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'This experiment has been superseded. :seedling: This means that another experiment has replaced this one. Please see the [experiment workflow documentation](https://taskfile.dev/experiments#workflow) for more information on how we release experiments.'
            })
            github.rest.issues.update({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              state: 'closed'
            })


================================================
FILE: .github/workflows/issue-needs-triage.yml
================================================
name: issue needs triage

on:
  issues:
    types: [opened]

jobs:
  issue-needs-triage:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
        with:
          github-token: ${{secrets.GH_PAT}}
          script: |
            const labels = await github.paginate(
              github.rest.issues.listLabelsOnIssue, {
                issue_number: context.issue.number,
                owner: context.repo.owner,
                repo: context.repo.repo,
              }
            )
            if (labels.length === 0) {
              github.rest.issues.addLabels({
                issue_number: context.issue.number,
                owner: context.repo.owner,
                repo: context.repo.repo,
                labels: ['state: needs triage']
              })
            }


================================================
FILE: .github/workflows/lint.yml
================================================
name: Lint

on:
  pull_request:
  push:
    tags:
      - v*
    branches:
      - main

jobs:
  lint:
    name: Lint
    strategy:
      matrix:
        go-version: [1.25.x, 1.26.x]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          go-version: ${{matrix.go-version}}

      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: golangci-lint
        uses: golangci/golangci-lint-action@1e7e51e771db61008b38414a730f564565cf7c20 # v9.2.0
        with:
          version: v2.11.1

  lint-jsonschema:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
        with:
          python-version: 3.14

      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: install check-jsonschema
        run: python -m pip install 'check-jsonschema==0.27.3'

      - name: check-jsonschema (metaschema)
        run: check-jsonschema --check-metaschema website/src/public/schema.json


================================================
FILE: .github/workflows/pr-build.yml
================================================
name: PR Build

on:
  pull_request_target:
    types: [labeled, synchronize]

permissions:
  contents: read
  pull-requests: write

jobs:
  build:
    if: contains(github.event.pull_request.labels.*.name, 'needs-build')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          ref: ${{ github.event.pull_request.head.sha }}
          fetch-depth: 0
      - uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          go-version: '1.26.x'
          cache: true
      - uses: goreleaser/goreleaser-action@ec59f474b9834571250b370d4735c50f8e2d1e29 # v7
        with:
          version: '~> v2'
          args: release --snapshot --clean --config .goreleaser-pr.yml
      - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        with:
          name: task_linux_amd64
          path: dist/task_linux_amd64.tar.gz
      - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        with:
          name: task_linux_arm64
          path: dist/task_linux_arm64.tar.gz
      - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        with:
          name: task_darwin_amd64
          path: dist/task_darwin_amd64.tar.gz
      - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        with:
          name: task_darwin_arm64
          path: dist/task_darwin_arm64.tar.gz
      - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        with:
          name: task_windows_amd64
          path: dist/task_windows_amd64.zip
      - uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
        with:
          name: checksums
          path: dist/task_checksums.txt
      - uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4.0.0
        id: find-comment
        with:
          token: ${{ secrets.GH_PAT || github.token }}
          issue-number: ${{ github.event.pull_request.number }}
          body-includes: '📦 Build artifacts ready!'
      - uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
        with:
          token: ${{ secrets.GH_PAT || github.token }}
          comment-id: ${{ steps.find-comment.outputs.comment-id }}
          issue-number: ${{ github.event.pull_request.number }}
          body: |
            ## 📦 Build artifacts ready!

            Download binaries from [this workflow run](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}).

            Available platforms: Linux, macOS, Windows (amd64, arm64)
          edit-mode: replace


================================================
FILE: .github/workflows/release-nightly.yml
================================================
name: Release nightly

on:
  workflow_dispatch:
  schedule:
    - cron: 0 0 * * *
jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0

      - name: Set up Go
        uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          go-version: 1.26.x

      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@ec59f474b9834571250b370d4735c50f8e2d1e29 # v7
        with:
          distribution: goreleaser-pro
          version: latest
          args: release --clean --nightly -f .goreleaser-nightly.yml
        env:
          GITHUB_TOKEN: ${{secrets.GH_PAT}}
          GORELEASER_KEY: ${{secrets.GORELEASER_KEY}}
          CLOUDSMITH_TOKEN: ${{secrets.CLOUDSMITH_TOKEN}}


================================================
FILE: .github/workflows/release.yml
================================================
name: goreleaser

on:
  push:
    tags:
      - 'v*'

permissions:
  id-token: write  # Required for OIDC
  contents: read

jobs:
  goreleaser:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0

      - name: Set up Go
        uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          go-version: 1.26.x

      - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
        with:
          node-version: '24'
          registry-url: 'https://registry.npmjs.org'

      - name: Update npm
        run: npm install -g npm@latest

      - name: Install Task
        uses: go-task/setup-task@0ab1b2a65bc55236a3bc64cde78f80e20e8885c2 # v1

      - name: Install pnpm
        uses: pnpm/action-setup@fc06bc1257f339d1d5d8b3a19a8cae5388b55320 # v4
        with:
          package_json_file: 'website/package.json'
          run_install: 'true'

      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@ec59f474b9834571250b370d4735c50f8e2d1e29 # v7
        with:
          distribution: goreleaser-pro
          version: latest
          args: release --clean --draft
        env:
          GITHUB_TOKEN: ${{secrets.GH_PAT}}
          GORELEASER_KEY: ${{secrets.GORELEASER_KEY}}
          CLOUDSMITH_TOKEN: ${{secrets.CLOUDSMITH_TOKEN}}

      - name: Deploy Website
        shell: bash
        run: |
          task website:deploy:prod
        env:
          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}


================================================
FILE: .github/workflows/test.yml
================================================
name: Test

on:
  pull_request:
  push:
    tags:
      - v*
    branches:
      - main

jobs:
  test:
    name: Test
    strategy:
      matrix:
        go-version: [1.25.x, 1.26.x]
        platform: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{matrix.platform}}
    steps:
      - name: Set up Go ${{matrix.go-version}}
        uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
        with:
          go-version: ${{matrix.go-version}}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

      - name: Download Go modules
        run: go mod download
        env:
          GOPROXY: https://proxy.golang.org

      - name: Build
        run: go build -o ./bin/task -v ./cmd/task

      - name: Test
        run: ./bin/task test --output=group --output-group-begin='::group::{{.TASK}}' --output-group-end='::endgroup::'


================================================
FILE: .gitignore
================================================
# Binaries for programs and plugins
*.exe
*.dll
*.so
*.dylib

# Test binary, build with `go test -c`
*.test

# Output of the go coverage tool, specifically when used with LiteIDE
*.out

# Graphvis files
*.gv

# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736
.glide/

./task
.task
dist/

.DS_Store

# editors
.idea/
.vscode/settings.json
.fleet/

# exuberant ctags
tags

/bin/*
!/bin/.keep
/testdata/vars/v1
/tmp
node_modules
website/.netlify/


================================================
FILE: .golangci.yml
================================================
version: "2"

formatters:
  enable:
    - gofmt
    - gofumpt
    - goimports
    - gci
  settings:
    gofmt:
      simplify: true
      rewrite-rules:
        - pattern: interface{}
          replacement: any
    gofumpt:
      module-path: github.com/go-task/task/v3
    goimports:
      local-prefixes:
        - github.com/go-task
    gci:
      sections:
        - standard
        - default
        - prefix(github.com/go-task)
        - localmodule
  exclusions:
    generated: lax
    paths:
      - third_party$
      - builtin$
      - examples$

linters:
  enable:
    - depguard
    - mirror
    - misspell
    - noctx
    - paralleltest
    - thelper
    - tparallel
    - usetesting
  settings:
    depguard:
      rules:
        main:
          files:
            - $all
            - '!$test'
            - '!**/errors/*.go'
          deny:
            - pkg: errors
              desc: Use github.com/go-task/task/v3/errors instead
  exclusions:
    generated: lax
    presets:
      - comments
      - common-false-positives
      - legacy
      - std-error-handling
    paths:
      - third_party$
      - builtin$
      - examples$


================================================
FILE: .goreleaser-nightly.yml
================================================
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
version: 2
pro: true

release:
  name_template: 'v{{.Version}}'

nightly:
  publish_release: true
  keep_single_release: true
  version_template: "{{incminor .Version}}-nightly"

includes:
  - from_file:
      path: ./.goreleaser.yml


================================================
FILE: .goreleaser-pr.yml
================================================
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
version: 2

builds:
  - binary: task
    main: ./cmd/task
    goos: [windows, darwin, linux]
    goarch: [amd64, arm64]
    env:
      - CGO_ENABLED=0
    mod_timestamp: '{{ .CommitTimestamp }}'
    flags:
      - -trimpath
    ldflags:
      - "-s -w"

archives:
  - name_template: '{{.Binary}}_{{.Os}}_{{.Arch}}'
    files:
      - README.md
      - LICENSE
      - completion/**/*
    format_overrides:
      - goos: windows
        formats: [zip]

snapshot:
  version_template: 'pr-{{ .ShortCommit }}'

checksum:
  name_template: 'task_checksums.txt'


================================================
FILE: .goreleaser.yml
================================================
# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
version: 2

builds:
  - binary: task
    main: ./cmd/task
    goos:
      - windows
      - darwin
      - linux
      - freebsd
    goarch:
      - '386'
      - amd64
      - arm
      - arm64
      - riscv64
    goarm:
      - '6'
    ignore:
      - goos: darwin
        goarch: '386'
      - goos: darwin
        goarch: riscv64
      - goos: windows
        goarch: arm
      - goos: windows
        goarch: riscv64
    env:
      - CGO_ENABLED=0
    mod_timestamp: '{{ .CommitTimestamp }}'
    flags:
      - -trimpath
    ldflags:
      - "-s -w"
      - "{{if .IsNightly}}-X github.com/go-task/task/v3/internal/version.version={{.Version}}{{end}}"

gomod:
  proxy: true

archives:
  - name_template: '{{.Binary}}_{{.Os}}_{{.Arch}}'
    files:
      - README.md
      - LICENSE
      - completion/**/*
    format_overrides:
      - goos: windows
        formats: [zip]

git:
  ignore_tags:
    - "{{if not .IsNightly}}nightly{{end}}"

snapshot:
  version_template: '{{.Version}}'

checksum:
  name_template: 'task_checksums.txt'

nfpms:
  - vendor: Task
    homepage: https://taskfile.dev
    maintainer: The Task authors <task@taskfile.dev>
    description: A fast, cross-platform build tool inspired by Make, designed for modern workflows.
    section: golang
    license: MIT
    conflicts:
      - taskwarrior
    formats:
      - deb
      - rpm
      - apk
    file_name_template: '{{.ProjectName}}_{{.Version}}_{{.Os}}_{{.Arch}}'
    contents:
      - src: completion/bash/task.bash
        dst: /etc/bash_completion.d/task
      - src: completion/fish/task.fish
        dst: /usr/share/fish/completions/task.fish
      - src: completion/zsh/_task
        dst: /usr/local/share/zsh/site-functions/_task

brews:
  - name: go-task
    description: A fast, cross-platform build tool inspired by Make, designed for modern workflows.
    license: MIT
    homepage: https://taskfile.dev
    directory: Formula
    repository:
      owner: go-task
      name: homebrew-tap
    test: system "#{bin}/task", "--help"
    install: |-
      bin.install "task"
      bash_completion.install "completion/bash/task.bash" => "task"
      zsh_completion.install "completion/zsh/_task" => "_task"
      fish_completion.install "completion/fish/task.fish"
    commit_author:
      name: task-bot
      email: 106601941+task-bot@users.noreply.github.com

winget:
  - name: Task
    publisher: Task
    short_description: The modern task runner.
    description: A fast, cross-platform build tool inspired by Make, designed for modern workflows.
    license: MIT
    homepage: https://taskfile.dev/
    publisher_url: https://taskfile.dev/
    publisher_support_url: https://github.com/go-task/task/issues
    package_identifier: Task.Task
    commit_author:
      name: task-bot
      email: 106601941+task-bot@users.noreply.github.com
    commit_msg_template: 'chore: release {{.PackageIdentifier}} {{.Tag}}'
    release_notes_url: https://github.com/go-task/task/releases/tag/{{.Tag}}
    tags:
      - build
      - build-tool
      - devops
      - go
      - make
      - makefile
      - runner
      - task
      - task-runner
      - taskfile
      - tool
    repository:
      owner: go-task
      name: winget-pkgs
      branch: 'task-{{.Version}}'
      pull_request:
        enabled: true
        draft: false
        check_boxes: true
        base:
          owner: microsoft
          name: winget-pkgs
          branch: master
        body: |
          /cc @andreynering @pd93 @vmaerten


npms:
  - name: "@go-task/cli"
    repository: "git+https://github.com/go-task/task.git"
    bugs: https://github.com/go-task/task/issues
    description: A fast, cross-platform build tool inspired by Make, designed for modern workflows.
    homepage: https://taskfile.dev
    license: MIT
    author: "The Task authors"
    access: public
    keywords:
      - "task"
      - "taskfile"
      - "build-tool"
      - "task-runner"

cloudsmiths:
  - organization: "task"
    repository: "{{if not .IsNightly}}task{{end}}"
    formats:
      - deb
      - rpm
      - apk
    distributions:
      deb:
        - "any-distro/any-version"
      rpm:
        - "any-distro/any-version"
      alpine:
        - "alpine/any-version"
    component: main
    republish: true


================================================
FILE: .mockery.yaml
================================================
all: False
template: testify
filename: '{{base (trimSuffix ".go" .InterfaceFile)}}_mock.go'
packages:
  github.com/go-task/task/v3/internal/fingerprint:
    interfaces:
      SourcesCheckable:
      StatusCheckable:


================================================
FILE: .prettierrc.yml
================================================
trailingComma: none
singleQuote: true
overrides:
  - files: "*.md"
    options:
      printWidth: 80
      proseWrap: always


================================================
FILE: .taskrc.yml
================================================
experiments:
  GENTLE_FORCE: 0
  REMOTE_TASKFILES: 0
  ENV_PRECEDENCE: 0


================================================
FILE: .vscode/extensions.json
================================================
{
  "recommendations": [
    "editorconfig.editorconfig",
    "golang.go",
    "task.vscode-task"
  ]
}


================================================
FILE: .vscode/settings-sample.json
================================================
{
  "yaml.schemas": {
    "./website/src/public/schema.json": [
        "Taskfile.yml",
        "Taskfile.yaml",
        "taskfile.yml",
        "taskfile.yaml"
    ]
  },
  "gopls": {
      "formatting.local": "github.com/go-task"
  },
  "go.formatTool": "gofumpt"
}


================================================
FILE: CHANGELOG.md
================================================
# Changelog

## v3.49.1 - 2026-03-08

* Reverted #2632 for now, which caused some regressions. That change will be
  reworked (#2720, #2722, #2723).

## v3.49.0 - 2026-03-07

- Fixed included Taskfiles with `watch: true` not triggering watch mode when
  called from the root Taskfile (#2686, #1763 by @trulede).
- Fixed Remote Git Taskfiles failing on Windows due to backslashes in URL paths
  (#2656 by @Trim21).
- Fixed remote Git Taskfiles timing out when resolving includes after accepting
  the trust prompt (#2669, #2668 by @vmaerten).
- Fixed unclear error message when Taskfile search stops at a directory
  ownership boundary (#2682, #1683 by @trulede).
- Fixed global variables from imported Taskfiles not resolving `ref:` values
  correctly (#2632 by @trulede).
- Every `.taskrc.yml` option can now be overridden with a `TASK_`-prefixed
  environment variable, making CI and container configuration easier (#2607,
  #1066 by @vmaerten).

## v3.48.0 - 2026-01-26

- Fixed `if:` conditions when using to check dynamic variables. Also, skip
  variable prompt if task would be skipped by `if:` (#2658, #2660 by @vmaerten).
- Fixed `ROOT_TASKFILE` variable pointing to directory instead of the actual
  Taskfile path when no explicit `-t` flag is provided (#2635, #1706 by
  @trulede).
- Included Taskfiles with `silent: true` now properly propagate silence to their
  tasks, while still allowing individual tasks to override with `silent: false`
  (#2640, #1319 by @trulede).
- Added TLS certificate options for Remote Taskfiles: use `--cacert` for
  self-signed certificates and `--cert`/`--cert-key` for mTLS authentication
  (#2537, #2242 by @vmaerten).

## v3.47.0 - 2026-01-24

- Fixed remote git Taskfiles: cloning now works without explicit ref, and
  directory includes are properly resolved (#2602 by @vmaerten).
- For `output: prefixed`, print `prefix:` if set instead of task name (#1566,
  #2633 by @trulede).
- Ensure no ANSI sequences are printed for `--color=false` (#2560, #2584 by
  @trulede).
- Task aliases can now contain wildcards and will match accordingly (e.g., `s-*`
  as alias for `start-*`) (#1900, #2234 by @vmaerten).
- Added conditional execution with the `if` field: skip tasks, commands, or task
  calls based on shell exit codes or template expressions like
  `{{ eq .ENV "prod" }}` (#2564, #608 by @vmaerten).
- Task can now interactively prompt for missing required variables when running
  in a TTY, with support for enum selection menus. Enable with `--interactive`
  flag or `interactive: true` in `.taskrc.yml` (#2579, #2079 by @vmaerten).

## v3.46.4 - 2025-12-24

- Fixed regressions in completion script for Fish (#2591, #2604, #2592 by
  @WinkelCode).

## v3.46.3 - 2025-12-19

- Fixed regression in completion script for zsh (#2593, #2594 by @vmaerten).

## v3.46.2 - 2025-12-18

- Fixed a regression on previous release that affected variables passed via
  command line (#2588, #2589 by @vmaerten).

## v3.46.1 - 2025-12-18

### ✨ Features

- A small behavior change was made to dependencies. Task will now wait for all
  dependencies to finish running before continuing, even if any of them fail. To
  opt for the previous behavior, set `failfast: true` either on your
  `.taskrc.yml` or per task, or use the `--failfast` flag, which will also work
  for `--parallel` (#1246, #2525 by @andreynering).
- The `--summary` flag now displays `vars:` (both global and task-level),
  `env:`, and `requires:` sections. Dynamic variables show their shell command
  (e.g., `sh: echo "hello"`) instead of the evaluated value (#2486 ,#2524 by
  @vmaerten).
- Improved performance of fuzzy task name matching by implementing lazy
  initialization. Added `--disable-fuzzy` flag and `disable-fuzzy` taskrc option
  to allow disabling fuzzy matching entirely (#2521, #2523 by @vmaerten).
- Added LLM-optimized documentation via VitePress plugin, generating `llms.txt`
  and `llms-full.txt` for AI-powered development tools (#2513 by @vmaerten).
- Added `--trusted-hosts` CLI flag and `remote.trusted-hosts` config option to
  skip confirmation prompts for specified hosts when using Remote Taskfiles
  (#2491, #2473 by @maciejlech).
- When running in GitHub Actions, Task now automatically emits error annotations
  on failure, improving visibility in workflow summaries (#2568 by @vmaerten).
- The `--yes` flag is now accessible in templates via the new `CLI_ASSUME_YES`
  variable (#2577, #2479 by @semihbkgr).
- Improved shell completion scripts (Zsh, Fish, PowerShell) by adding missing
  flags and dynamic experimental feature detection (#2532 by @vmaerten).
- Remote Taskfiles now accept `application/octet-stream` Content-Type (#2536,
  #1944 by @vmaerten).
- Shell completion now works when Task is installed or aliased under a different
  binary name via TASK_EXE environment variable (#2495, #2468 by @vmaerten).
- Some small fixes and improvements were made to `task --init` and to the
  default Taskfile it generates (#2433 by @andreynering).
- Added `--remote-cache-dir` flag and `remote.cache-dir` taskrc option to
  customize the cache directory for Remote Taskfiles (#2572 by @vmaerten).
- Zsh completion now supports zstyle verbose option to show or hide task
  descriptions (#2571 by @vmaerten).
- Task now automatically enables colored output in CI environments (GitHub
  Actions, GitLab CI, etc.) without requiring FORCE_COLOR=1 (#2569 by
  @vmaerten).
- Added color taskrc option to explicitly enable or disable colored output
  globally (#2569 by @vmaerten).
- Improved Git Remote Taskfiles by switching to go-getter: SSH authentication
  now works out of the box and `applyOf` is properly supported (#2512 by
  @vmaerten).

### 🐛 Fixes

- Fix RPM upload to Cloudsmith by including the version in the filename to
  ensure unique filenames (#2507 by @vmaerten).
- Fix `run: when_changed` to work properly for Taskfiles included multiple times
  (#2508, #2511 by @trulede).
- Fixed Zsh and Fish completions to stop suggesting task names after `--`
  separator, allowing proper CLI_ARGS completion (#1843, #1844 by
  @boiledfroginthewell).
- Watch mode (`--watch`) now always runs the task, regardless of `run: once` or
  `run: when_changed` settings (#2566, #1388 by @trulede).
- Fixed global variables (CLI_ARGS, CLI_FORCE, etc.) not being accessible in
  root-level vars section (#2403, #2397 by @trulede, @vmaerten).
- Fixed a bug where `ignore_error` was ignored when using `task:` to call
  another task (#2552, #363 by @trulede).
- Fixed Zsh completion not suggesting global tasks when using `-g`/`--global`
  flag (#1574, #2574 by @vmaerten).
- Fixed Fish completion failing to parse task descriptions containing colons
  (e.g., URLs or namespaced functions) (#2101, #2573 by @vmaerten).
- Fixed false positive "property 'for' is not allowed" warnings in IntelliJ when
  using `for` loops in Taskfiles (#2576 by @vmaerten).

## v3.45.5 - 2025-11-11

- Fixed bug that made a generic message, instead of an useful one, appear when a
  Taskfile could not be found (#2431 by @andreynering).
- Fixed a bug that caused an error when including a Remote Git Taskfile (#2438
  by @twelvelabs).
- Fixed issue where `.taskrc.yml` was not returned if reading it failed, and
  corrected handling of remote entrypoint Taskfiles (#2460, #2461 by @vmaerten).
- Improved performance of `--list` and `--list-all` by introducing a faster
  compilation method that skips source globbing and checksum updates (#1322,
  #2053 by @vmaerten).
- Fixed a concurrency bug with `output: group`. This ensures that begin/end
  parts won't be mixed up from different tasks (#1208, #2349, #2350 by
  @trulede).
- Do not re-evaluate variables for `defer:` (#2244, #2418 by @trulede).
- Improve error message when a Taskfile is not found (#2441, #2494 by
  @vmaerten).
- Fixed generic error message `exit status 1` when a dependency task failed
  (#2286 by @GrahamDennis).
- Fixed YAML library from the unmaintained `gopkg.in/yaml.v3` to the new fork
  maintained by the official YAML org (#2171, #2434 by @andreynering).
- On Windows, the built-in version of the `rm` core utils contains a fix related
  to the `-f` flag (#2426,
  [u-root/u-root#3464](https://github.com/u-root/u-root/pull/3464),
  [mvdan/sh#1199](https://github.com/mvdan/sh/pull/1199), #2506 by
  @andreynering).

## v3.45.4 - 2025-09-17

- Fixed a bug where `cache-expiry` could not be defined in `.taskrc.yml` (#2423
  by @vmaerten).
- Fixed a bug where `.taskrc.yml` files in parent folders were not read
  correctly (#2424 by @vmaerten).
- Fixed a bug where autocomplete in subfolders did not work with zsh (#2425 by
  @vmaerten).

## v3.45.3 - 2025-09-15

- Task now includes built-in core utilities to greatly improve compatibility on
  Windows. This means that your commands that uses `cp`, `mv`, `mkdir` or any
  other common core utility will now work by default on Windows, without extra
  setup. This is something we wanted to address for many many years, and it's
  finally being shipped!
  [Read our blog post this the topic](https://taskfile.dev/blog/windows-core-utils).
  (#197, #2360 by @andreynering).
- :sparkles: Built and deployed a [brand new website](https://taskfile.dev)
  using [VitePress](https://vitepress.dev) (#2359, #2369, #2371, #2375, #2378 by
  @vmaerten, @andreynering, @pd93).
- Began releasing
  [nightly builds](https://github.com/go-task/task/releases/tag/nightly). This
  will allow people to test our changes before they are fully released and
  without having to install Go to build them (#2358 by @vmaerten).
- Added support for global config files in `$XDG_CONFIG_HOME/task/taskrc.yml` or
  `$HOME/.taskrc.yml`. Check out our new
  [configuration guide](https://taskfile.dev/docs/reference/config) for more
  details (#2247, #2380, #2390, #2391 by @vmaerten, @pd93).
- Added experiments to the taskrc schema to clarify the expected keys and values
  (#2235 by @vmaerten).
- Added support for new properties in `.taskrc.yml`: insecure, verbose,
  concurrency, remote offline, remote timeout, and remote expiry. :warning:
  Note: setting offline via environment variable is no longer supported. (#2389
  by @vmaerten)
- Added a `--nested` flag when outputting tasks using `--list --json`. This will
  output tasks in a nested structure when tasks are namespaced (#2415 by @pd93).
- Enhanced support for tasks with wildcards: they are now logged correctly, and
  wildcard parameters are fully considered during fingerprinting (#1808, #1795
  by @vmaerten).
- Fixed panic when a variable was declared as an empty hash (`{}`) (#2416, #2417
  by @trulede).

#### Package API

- Bumped the minimum version of Go to 1.24 (#2358 by @vmaerten).

#### Other news

We recently released our
[official GitHub Action](https://github.com/go-task/setup-task). This is based
on the fantastic work by the Arduino team who created and maintained the
community version. Now that this is officially adopted, fixes/updates should be
more timely. We have already merged a couple of longstanding PRs in our
[first release](https://github.com/go-task/setup-task/releases/tag/v1.0.0) (by
@pd93, @shrink, @trim21 and all the previous contributors to
[arduino/setup-task](https://github.com/arduino/setup-task/)).

## v3.45.0-v3.45.2 - 2025-09-15

Failed due to an issue with our release process.

## v3.44.1 - 2025-07-23

- Internal tasks will no longer be shown as suggestions since they cannot be
  called (#2309, #2323 by @maxmzkrcensys)
- Fixed install script for some ARM platforms (#1516, #2291 by @trulede).
- Fixed a regression where fingerprinting was not working correctly if the path
  to you Taskfile contained a space (#2321, #2322 by @pd93).
- Reverted a breaking change to `randInt` (#2312, #2316 by @pd93).
- Made new variables `TEST_NAME` and `TEST_DIR` available in fixture tests
  (#2265 by @pd93).

## v3.44.0 - 2025-06-08

- Added `uuid`, `randInt` and `randIntN` template functions (#1346, #2225 by
  @pd93).
- Added new `CLI_ARGS_LIST` array variable which contains the arguments passed
  to Task after the `--` (the same as `CLI_ARGS`, but an array instead of a
  string). (#2138, #2139, #2140 by @pd93).
- Added `toYaml` and `fromYaml` templating functions (#2217, #2219 by @pd93).
- Added `task` field the `--list --json` output (#2256 by @aleksandersh).
- Added the ability to
  [pin included taskfiles](https://taskfile.dev/next/experiments/remote-taskfiles/#manual-checksum-pinning)
  by specifying a checksum. This works with both local and remote Taskfiles
  (#2222, #2223 by @pd93).
- When using the
  [Remote Taskfiles experiment](https://github.com/go-task/task/issues/1317),
  any credentials used in the URL will now be redacted in Task's output (#2100,
  #2220 by @pd93).
- Fixed fuzzy suggestions not working when misspelling a task name (#2192, #2200
  by @vmaerten).
- Fixed a bug where taskfiles in directories containing spaces created
  directories in the wrong location (#2208, #2216 by @pd93).
- Added support for dual JSON schema files, allowing changes without affecting
  the current schema. The current schemas will only be updated during releases.
  (#2211 by @vmaerten).
- Improved fingerprint documentation by specifying that the method can be set at
  the root level to apply to all tasks (#2233 by @vmaerten).
- Fixed some watcher regressions after #2048 (#2199, #2202, #2241, #2196 by
  @wazazaby, #2271 by @andreynering).

## v3.43.3 - 2025-04-27

Reverted the changes made in #2113 and #2186 that affected the
`USER_WORKING_DIR` and built-in variables. This fixes #2206, #2195, #2207 and
#2208.

## v3.43.2 - 2025-04-21

- Fixed regresion of `CLI_ARGS` being exposed as the wrong type (#2190, #2191 by
  @vmaerten).

## v3.43.1 - 2025-04-21

- Significant improvements were made to the watcher. We migrated from
  [watcher](https://github.com/radovskyb/watcher) to
  [fsnotify](https://github.com/fsnotify/fsnotify). The former library used
  polling, which means Task had a high CPU usage when watching too many files.
  `fsnotify` uses proper the APIs from each operating system to watch files,
  which means a much better performance. The default interval changed from 5
  seconds to 100 milliseconds, because now it configures the wait time for
  duplicated events, instead of the polling time (#2048 by @andreynering, #1508,
  #985, #1179).
- The [Map Variables experiment](https://github.com/go-task/task/issues/1585)
  was made generally available so you can now
  [define map variables in your Taskfiles!](https://taskfile.dev/usage/#variables)
  (#1585, #1547, #2081 by @pd93).
- Wildcards can now
  [match multiple tasks](https://taskfile.dev/usage/#wildcard-arguments) (#2072,
  #2121 by @pd93).
- Added the ability to
  [loop over the files specified by the `generates` keyword](https://taskfile.dev/usage/#looping-over-your-tasks-sources-or-generated-files).
  This works the same way as looping over sources (#2151 by @sedyh).
- Added the ability to resolve variables when defining an include variable
  (#2108, #2113 by @pd93).
- A few changes have been made to the
  [Remote Taskfiles experiment](https://github.com/go-task/task/issues/1317)
  (#1402, #2176 by @pd93):
  - Cached files are now prioritized over remote ones.
  - Added an `--expiry` flag which sets the TTL for a remote file cache. By
    default the value will be 0 (caching disabled). If Task is running in
    offline mode or fails to make a connection, it will fallback on the cache.
- `.taskrc` files can now be used from subdirectories and will be searched for
  recursively up the file tree in the same way that Taskfiles are (#2159, #2166
  by @pd93).
- The default taskfile (output when using the `--init` flag) is now an embedded
  file in the binary instead of being stored in the code (#2112 by @pd93).
- Improved the way we report the Task version when using the `--version` flag or
  `{{.TASK_VERSION}}` variable. This should now be more consistent and easier
  for package maintainers to use (#2131 by @pd93).
- Fixed a bug where globstar (`**`) matching in `sources` only resolved the
  first result (#2073, #2075 by @pd93).
- Fixed a bug where sorting tasks by "none" would use the default sorting
  instead of leaving tasks in the order they were defined (#2124, #2125 by
  @trulede).
- Fixed Fish completion on newer Fish versions (#2130 by @atusy).
- Fixed a bug where undefined/null variables resolved to an empty string instead
  of `nil` (#1911, #2144 by @pd93).
- The `USER_WORKING_DIR` special now will now properly account for the `--dir`
  (`-d`) flag, if given (#2102, #2103 by @jaynis, #2186 by @andreynering).
- Fix Fish completions when `--global` (`-g`) is given (#2134 by @atusy).
- Fixed variables not available when using `defer:` (#1909, #2173 by @vmaerten).

#### Package API

- The [`Executor`](https://pkg.go.dev/github.com/go-task/task/v3#Executor) now
  uses the functional options pattern (#2085, #2147, #2148 by @pd93).
- The functional options for the
  [`taskfile.Reader`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#Reader)
  and
  [`taskfile.Snippet`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#Snippet)
  types no longer have the `Reader`/`Snippet` respective prefixes (#2148 by
  @pd93).
- [`taskfile.Reader`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#Reader)
  no longer accepts a
  [`taskfile.Node`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#Node).
  Instead nodes are passed directly into the
  [`Reader.Read`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#Reader.Read)
  method (#2169 by @pd93).
- [`Reader.Read`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#Reader.Read)
  also now accepts a [`context.Context`](https://pkg.go.dev/context#Context)
  (#2176 by @pd93).

## v3.42.1 - 2025-03-10

- Fixed a bug where some special variables caused a type error when used global
  variables (#2106, #2107 by @pd93).

## v3.42.0 - 2025-03-08

- Made `--init` less verbose by default and respect `--silent` and `--verbose`
  flags (#2009, #2011 by @HeCorr).
- `--init` now accepts a file name or directory as an argument (#2008, #2018 by
  @HeCorr).
- Fix a bug where an HTTP node's location was being mutated incorrectly (#2007
  by @jeongukjae).
- Fixed a bug where allowed values didn't work with dynamic var (#2032, #2033 by
  @vmaerten).
- Use only the relevant checker (timestamp or checksum) to improve performance
  (#2029, #2031 by @vmaerten).
- Print warnings when attempting to enable an inactive experiment or an active
  experiment with an invalid value (#1979, #2049 by @pd93).
- Refactored the experiments package and added tests (#2049 by @pd93).
- Show allowed values when a variable with an enum is missing (#2027, #2052 by
  @vmaerten).
- Refactored how snippets in error work and added tests (#2068 by @pd93).
- Fixed a bug where errors decoding commands were sometimes unhelpful (#2068 by
  @pd93).
- Fixed a bug in the Taskfile schema where `defer` statements in the shorthand
  `cmds` syntax were not considered valid (#2068 by @pd93).
- Refactored how task sorting functions work (#1798 by @pd93).
- Added a new `.taskrc.yml` (or `.taskrc.yaml`) file to let users enable
  experiments (similar to `.env`) (#1982 by @vmaerten).
- Added new [Getting Started docs](https://taskfile.dev/getting-started) (#2086
  by @pd93).
- Allow `matrix` to use references to other variables (#2065, #2069 by @pd93).
- Fixed a bug where, when a dynamic variable is provided, even if it is not
  used, all other variables become unavailable in the templating system within
  the include (#2092 by @vmaerten).

#### Package API

Unlike our CLI tool,
[Task's package API is not currently stable](https://taskfile.dev/reference/package).
In an effort to ease the pain of breaking changes for our users, we will be
providing changelogs for our package API going forwards. The hope is that these
changes will provide a better long-term experience for our users and allow to
stabilize the API in the future. #121 now tracks this piece of work.

- Bumped the minimum required Go version to 1.23 (#2059 by @pd93).
- [`task.InitTaskfile`](https://pkg.go.dev/github.com/go-task/task/v3#InitTaskfile)
  (#2011, ff8c913 by @HeCorr and @pd93)
  - No longer accepts an `io.Writer` (output is now the caller's
    responsibility).
  - The path argument can now be a filename OR a directory.
  - The function now returns the full path of the generated file.
- [`TaskfileDecodeError.WithFileInfo`](https://pkg.go.dev/github.com/go-task/task/v3/errors#TaskfileDecodeError.WithFileInfo)
  now accepts a string instead of the arguments required to generate a snippet
  (#2068 by @pd93).
  - The caller is now expected to create the snippet themselves (see below).
- [`TaskfileSnippet`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#Snippet)
  and related code moved from the `errors` package to the `taskfile` package
  (#2068 by @pd93).
- Renamed `TaskMissingRequiredVars` to
  [`TaskMissingRequiredVarsError`](https://pkg.go.dev/github.com/go-task/task/v3/errors#TaskMissingRequiredVarsError)
  (#2052 by @vmaerten).
- Renamed `TaskNotAllowedVars` to
  [`TaskNotAllowedVarsError`](https://pkg.go.dev/github.com/go-task/task/v3/errors#TaskNotAllowedVarsError)
  (#2052 by @vmaerten).
- The
  [`taskfile.Reader`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#Reader)
  is now constructed using the functional options pattern (#2082 by @pd93).
- Removed our internal `logger.Logger` from the entire `taskfile` package (#2082
  by @pd93).
  - Users are now expected to pass a custom debug/prompt functions into
    [`taskfile.Reader`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#Reader)
    if they want this functionality by using the new
    [`WithDebugFunc`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#WithDebugFunc)
    and
    [`WithPromptFunc`](https://pkg.go.dev/github.com/go-task/task/v3/taskfile#WithPromptFunc)
    functional options.
- Remove `Range` functions in the `taskfile/ast` package in favour of new
  iterator functions (#1798 by @pd93).
- `ast.Call` was moved from the `taskfile/ast` package to the main `task`
  package (#2084 by @pd93).
- `ast.Tasks.FindMatchingTasks` was moved from the `taskfile/ast` package to the
  `task.Executor.FindMatchingTasks` in the main `task` package (#2084 by @pd93).
- The `Compiler` and its `GetVariables` and `FastGetVariables` methods were
  moved from the `internal/compiler` package to the main `task` package (#2084
  by @pd93).

## v3.41.0 - 2025-01-18

- Fixed an issue where dynamic variables were not properly logged in verbose
  mode (#1920, #1921 by @mgbowman).
- Support `silent` for defer statements (#1877, #1879 by @danilobuerger).
- Added an option to exclude some tasks from being included (#1859 by
  @vmaerten).
- Fixed an issue where a required variable was incorrectly handled in a template
  function (#1950, #1962 by @vmaerten).
- Expose a new `TASK_DIR` special variable, which will contain the absolute path
  of task directory. (#1959, #1961 by @vmaerten).
- Fixed fatal bugs that caused concurrent map writes (#1605, #1972, #1974 by
  @pd93, @GrahamDennis and @trim21).
- Refactored internal ordered map implementation to use
  [github.com/elliotchance/orderedmap](https://github.com/elliotchance/orderedmap)
  (#1797 by @pd93).
- Fixed a bug where variables defined at the task level were being ignored in
  the `requires` section. (#1960, #1955, #1768 by @vmaerten and @mokeko)
- The `CHECKSUM` and `TIMESTAMP` variables are now accessible within `cmds`
  (#1872 by @niklasr22).
- Updated [installation docs](https://taskfile.dev/installation) and added pip
  installation method (#935, #1989 by @pd93).
- Fixed a bug where dynamic variables could not access environment variables
  (#630, #1869 by @rohm1 and @pd93).
- Disable version check for use as an external library (#1938 by @leaanthony).

## v3.40.1 - 2024-12-06

- Fixed a security issue in `git-urls` by switching to the maintained fork
  `chainguard-dev/git-urls` (#1917 by @AlekSi).
- Added missing `platforms` property to `cmds` that use `for` (#1915 by
  @dkarter).
- Added misspell linter to check for misspelled English words (#1883 by
  @christiandins).

## v3.40.0 - 2024-11-05

- Fixed output of some functions (e.g. `splitArgs`/`splitLines`) not working in
  for loops (#1822, #1823 by @stawii).
- Added a new `TASK_OFFLINE` environment variable to configure the `--offline`
  flag and expose it as a special variable in the templating system (#1470,
  #1716 by @vmaerten and @pd93).
- Fixed a bug where multiple remote includes caused all prompts to display
  without waiting for user input (#1832, #1833 by @vmaerten and @pd93).
- When using the
  "[Remote Taskfiles](https://taskfile.dev/experiments/remote-taskfiles/)".
  experiment, you can now include Taskfiles from Git repositories (#1652 by
  @vmaerten).
- Improved the error message when a dotenv file cannot be parsed (#1842 by
  @pbitty).
- Fix issue with directory when using the remote experiment (#1757 by @pbitty).
- Fixed an issue where a special variable was used in combination with a dotenv
  file (#1232, #1810 by @vmaerten).
- Refactor the way Task reads Taskfiles to improve readability (#1771 by
  @pbitty).
- Added a new option to ensure variable is within the list of values (#1827 by
  @vmaerten).
- Allow multiple prompts to be specified for a task (#1861, #1866 by @mfbmina).
- Added new template function: `numCPU`, which returns the number of logical
  CPUs usable (#1890, #1887 by @Amoghrd).
- Fixed a bug where non-nil, empty dynamic variables are returned as an empty
  interface (#1903, #1904 by @pd93).

## v3.39.2 - 2024-09-19

- Fix dynamic variables not working properly for a defer: statement (#1803,
  #1818 by @vmaerten).

## v3.39.1 - 2024-09-18

- Added Renovate configuration to automatically create PRs to keep dependencies
  up to date (#1783 by @vmaerten).
- Fixed a bug where the help was displayed twice (#1805, #1806 by @vmaerten).
- Fixed a bug where ZSH and PowerShell completions did not work when using the
  recommended method. (#1813, #1809 by @vmaerten and @shirayu)
- Fix variables not working properly for a `defer:` statement (#1803, #1814 by
  @vmaerten and @andreynering).

## v3.39.0 - 2024-09-07

- Added
  [Env Precedence Experiment](https://taskfile.dev/experiments/env-precedence)
  (#1038, #1633 by @vmaerten).
- Added a CI lint job to ensure that the docs are updated correctly (#1719 by
  @vmaerten).
- Updated minimum required Go version to 1.22 (#1758 by @pd93).
- Expose a new `EXIT_CODE` special variable on `defer:` when a command finishes
  with a non-zero exit code (#1484, #1762 by @dorimon-1 and @andreynering).
- Expose a new `ALIAS` special variable, which will contain the alias used to
  call the current task. Falls back to the task name. (#1764 by @DanStory).
- Fixed `TASK_REMOTE_DIR` environment variable not working when the path was
  absolute. (#1715 by @vmaerten).
- Added an option to declare an included Taskfile as flattened (#1704 by
  @vmaerten).
- Added a new
  [`--completion` flag](https://taskfile.dev/installation/#setup-completions) to
  output completion scripts for various shells (#293, #1157 by @pd93).
  - This is now the preferred way to install completions.
  - The completion scripts in the `completion` directory
    [are now deprecated](https://taskfile.dev/deprecations/completion-scripts/).
- Added the ability to
  [loop over a matrix of values](https://taskfile.dev/usage/#looping-over-a-matrix)
  (#1766, #1767, #1784 by @pd93).
- Fixed a bug in fish completion where aliases were not displayed (#1781, #1782
  by @vmaerten).
- Fixed panic when having a flattened included Taskfile that contains a
  `default` task (#1777, #1778 by @vmaerten).
- Optimized file existence checks for remote Taskfiles (#1713 by @vmaerten).

## v3.38.0 - 2024-06-30

- Added `TASK_EXE` special variable (#1616, #1624 by @pd93 and @andreynering).
- Some YAML parsing errors will now show in a more user friendly way (#1619 by
  @pd93).
- Prefixed outputs will now be colorized by default (#1572 by
  @AlexanderArvidsson)
- [References](https://taskfile.dev/usage/#referencing-other-variables) are now
  generally available (no experiments required) (#1654 by @pd93).
- Templating functions can now be used in references (#1645, #1654 by @pd93).
- Added a new
  [templating reference page](https://taskfile.dev/reference/templating/) to the
  documentation (#1614, #1653 by @pd93).
- If using the
  [Map Variables experiment (1)](https://taskfile.dev/experiments/map-variables/?proposal=1),
  references are available by
  [prefixing a string with a `#`](https://taskfile.dev/experiments/map-variables/?proposal=1#references)
  (#1654 by @pd93).
- If using the
  [Map Variables experiment (2)](https://taskfile.dev/experiments/map-variables/?proposal=2),
  the `yaml` and `json` keys are no longer available (#1654 by @pd93).
- Added a new `TASK_REMOTE_DIR` environment variable to configure where cached
  remote Taskfiles are stored (#1661 by @vmaerten).
- Added a new `--clear-cache` flag to clear the cache of remote Taskfiles (#1639
  by @vmaerten).
- Improved the readability of cached remote Taskfile filenames (#1636 by
  @vmaerten).
- Starting releasing a binary for the `riscv64` architecture on Linux (#1699 by
  @mengzhuo).
- Added `CLI_SILENT` and `CLI_VERBOSE` variables (#1480, #1669 by @Vince-Smith).
- Fixed a couple of bugs with the `prompt:` feature (#1657 by @pd93).
- Fixed JSON Schema to disallow invalid properties (#1657 by @pd93).
- Fixed version checks not working as intended (#872, #1663 by @vmaerten).
- Fixed a bug where included tasks were run multiple times even if `run: once`
  was set (#852, #1655 by @pd93).
- Fixed some bugs related to column formatting in the terminal (#1350, #1637,
  #1656 by @vmaerten).

## v3.37.2 - 2024-05-12

- Fixed a bug where an empty Taskfile would cause a panic (#1648 by @pd93).
- Fixed a bug where includes Taskfile variable were not being merged correctly
  (#1643, #1649 by @pd93).

## v3.37.1 - 2024-05-09

- Fix bug where non-string values (numbers, bools) added to `env:` weren't been
  correctly exported (#1640, #1641 by @vmaerten and @andreynering).

## v3.37.0 - 2024-05-08

- Released the
  [Any Variables experiment](https://taskfile.dev/blog/any-variables), but
  [_without support for maps_](https://github.com/go-task/task/issues/1415#issuecomment-2044756925)
  (#1415, #1547 by @pd93).
- Refactored how Task reads, parses and merges Taskfiles using a DAG (#1563,
  #1607 by @pd93).
- Fix a bug which stopped tasks from using `stdin` as input (#1593, #1623 by
  @pd93).
- Fix error when a file or directory in the project contained a special char
  like `&`, `(` or `)` (#1551, #1584 by @andreynering).
- Added alias `q` for template function `shellQuote` (#1601, #1603 by @vergenzt)
- Added support for `~` on ZSH completions (#1613 by @jwater7).
- Added the ability to pass variables by reference using Go template syntax when
  the
  [Map Variables experiment](https://taskfile.dev/experiments/map-variables/) is
  enabled (#1612 by @pd93).
- Added support for environment variables in the templating engine in `includes`
  (#1610 by @vmaerten).

## v3.36.0 - 2024-04-08

- Added support for
  [looping over dependencies](https://taskfile.dev/usage/#looping-over-dependencies)
  (#1299, #1541 by @pd93).
- When using the
  "[Remote Taskfiles](https://taskfile.dev/experiments/remote-taskfiles/)"
  experiment, you are now able to use
  [remote Taskfiles as your entrypoint](https://taskfile.dev/experiments/remote-taskfiles/#root-remote-taskfiles).
  - `includes` in remote Taskfiles will now also resolve correctly (#1347 by
    @pd93).
- When using the
  "[Any Variables](https://taskfile.dev/experiments/any-variables/)"
  experiments, templating is now supported in collection-type variables (#1477,
  #1511, #1526 by @pd93).
- Fixed a bug where variables being passed to an included Taskfile were not
  available when defining global variables (#1503, #1533 by @pd93).
- Improved support to customized colors by allowing 8-bit colors and multiple
  ANSI attributes (#1576 by @pd93).

## v3.35.1 - 2024-03-04

- Fixed a bug where the `TASKFILE_DIR` variable was sometimes incorrect (#1522,
  #1523 by @pd93).
- Added a new `TASKFILE` special variable that holds the root Taskfile path
  (#1523 by @pd93).
- Fixed various issues related to running a Taskfile from a subdirectory (#1529,
  #1530 by @pd93).

## v3.35.0 - 2024-02-28

- Added support for
  [wildcards in task names](https://taskfile.dev/usage/#wildcard-arguments)
  (#836, #1489 by @pd93).
- Added the ability to
  [run Taskfiles via stdin](https://taskfile.dev/usage/#reading-a-taskfile-from-stdin)
  (#655, #1483 by @pd93).
- Bumped minimum Go version to 1.21 (#1500 by @pd93).
- Fixed bug related to the `--list` flag (#1509, #1512 by @pd93, #1514, #1520 by
  @pd93).
- Add mention on the documentation to the fact that the variable declaration
  order is respected (#1510 by @kirkrodrigues).
- Improved style guide docs (#1495 by @iwittkau).
- Removed duplicated entry for `requires` on the API docs (#1491 by
  @teatimeguest).

## v3.34.1 - 2024-01-27

- Fixed prompt regression on
  [Remote Taskfiles experiment](https://taskfile.dev/experiments/remote-taskfiles/)
  (#1486, #1487 by @pd93).

## v3.34.0 - 2024-01-25

- Removed support for `version: 2` schemas. See the
  [deprecation notice on our website](https://taskfile.dev/deprecations/version-2-schema)
  (#1197, #1447 by @pd93).
- Fixed a couple of issues in the JSON Schema + added a CI step to ensure it's
  correct (#1471, #1474, #1476 by @sirosen).
- Added
  [Any Variables experiment proposal 2](https://taskfile.dev/experiments/any-variables/?proposal=2)
  (#1415, #1444 by @pd93).
- Updated the experiments and deprecations documentation format (#1445 by
  @pd93).
- Added new template function: `spew`, which can be used to print variables for
  debugging purposes (#1452 by @pd93).
- Added new template function: `merge`, which can be used to merge any number of
  map variables (#1438, #1464 by @pd93).
- Small change on the API when using as a library: `call.Direct` became
  `call.Indirect` (#1459 by @pd93).
- Refactored the public `read` and `taskfile` packages and introduced
  `taskfile/ast` (#1450 by @pd93).
- `ast.IncludedTaskfiles` renamed to `ast.Includes` and `orderedmap` package
  renamed to `omap` plus some internal refactor work (#1456 by @pd93).
- Fix zsh completion script to allow lowercase `taskfile` file names (#1482 by
  @xontab).
- Improvements on how we check the Taskfile version (#1465 by @pd93).
- Added a new `ROOT_TASKFILE` special variable (#1468, #1469 by @pd93).
- Fix experiment flags in `.env` when the `--dir` or `--taskfile` flags were
  used (#1478 by @pd93).

## v3.33.1 - 2023-12-21

- Added support for looping over map variables with the
  [Any Variables experiment](https://taskfile.dev/experiments/any-variables)
  enabled (#1435, #1437 by @pd93).
- Fixed a bug where dynamic variables were causing errors during fast
  compilation (#1435, #1437 by @pd93)

## v3.33.0 - 2023-12-20

- Added
  [Any Variables experiment](https://taskfile.dev/experiments/any-variables)
  (#1415, #1421 by @pd93).
- Updated Docusaurus to v3 (#1432 by @pd93).
- Added `aliases` to `--json` flag output (#1430, #1431 by @pd93).
- Added new `CLI_FORCE` special variable containing whether the `--force` or
  `--force-all` flags were set (#1412, #1434 by @pd93).

## v3.32.0 - 2023-11-29

- Added ability to exclude some files from `sources:` by using `exclude:` (#225,
  #1324 by @pd93 and @andreynering).
- The
  [Remote Taskfiles experiment](https://taskfile.dev/experiments/remote-taskfiles)
  now prefers remote files over cached ones by default (#1317, #1345 by @pd93).
- Added `--timeout` flag to the
  [Remote Taskfiles experiment](https://taskfile.dev/experiments/remote-taskfiles)
  (#1317, #1345 by @pd93).
- Fix bug where dynamic `vars:` and `env:` were being executed when they should
  actually be skipped by `platforms:` (#1273, #1377 by @andreynering).
- Fix `schema.json` to make `silent` valid in `cmds` that use `for` (#1385,
  #1386 by @iainvm).
- Add new `--no-status` flag to skip expensive status checks when running
  `task --list --json` (#1348, #1368 by @amancevice).

## v3.31.0 - 2023-10-07

- Enabled the `--yes` flag for the
  [Remote Taskfiles experiment](https://taskfile.dev/experiments/remote-taskfiles)
  (#1317, #1344 by @pd93).
- Add ability to set `watch: true` in a task to automatically run it in watch
  mode (#231, #1361 by @andreynering).
- Fixed a bug on the watch mode where paths that contained `.git` (like
  `.github`), for example, were also being ignored (#1356 by @butuzov).
- Fixed a nil pointer error when running a Taskfile with no contents (#1341,
  #1342 by @pd93).
- Added a new [exit code](https://taskfile.dev/api/#exit-codes) (107) for when a
  Taskfile does not contain a schema version (#1342 by @pd93).
- Increased limit of maximum task calls from 100 to 1000 for now, as some people
  have been reaching this limit organically now that we have loops. This check
  exists to detect recursive calls, but will be removed in favor of a better
  algorithm soon (#1321, #1332).
- Fixed templating on descriptions on `task --list` (#1343 by @blackjid).
- Fixed a bug where precondition errors were incorrectly being printed when task
  execution was aborted (#1337, #1338 by @sylv-io).

## v3.30.1 - 2023-09-14

- Fixed a regression where some special variables weren't being set correctly
  (#1331, #1334 by @pd93).

## v3.30.0 - 2023-09-13

- Prep work for Remote Taskfiles (#1316 by @pd93).
- Added the
  [Remote Taskfiles experiment](https://taskfile.dev/experiments/remote-taskfiles)
  as a draft (#1152, #1317 by @pd93).
- Improve performance of content checksumming on `sources:` by replacing md5
  with [XXH3](https://xxhash.com/) which is much faster. This is a soft breaking
  change because checksums will be invalidated when upgrading to this release
  (#1325 by @ReillyBrogan).

## v3.29.1 - 2023-08-26

- Update to Go 1.21 (bump minimum version to 1.20) (#1302 by @pd93)
- Fix a missing a line break on log when using `--watch` mode (#1285, #1297 by
  @FilipSolich).
- Fix `defer` on JSON Schema (#1288 by @calvinmclean and @andreynering).
- Fix bug in usage of special variables like `{{.USER_WORKING_DIR}}` in
  combination with `includes` (#1046, #1205, #1250, #1293, #1312, #1274 by
  @andarto, #1309 by @andreynering).
- Fix bug on `--status` flag. Running this flag should not have side-effects: it
  should not update the checksum on `.task`, only report its status (#1305,
  #1307 by @visciang, #1313 by @andreynering).

## v3.28.0 - 2023-07-24

- Added the ability to
  [loop over commands and tasks](https://taskfile.dev/usage/#looping-over-values)
  using `for` (#82, #1220 by @pd93).
- Fixed variable propagation in multi-level includes (#778, #996, #1256 by
  @hudclark).
- Fixed a bug where the `--exit-code` code flag was not returning the correct
  exit code when calling commands indirectly (#1266, #1270 by @pd93).
- Fixed a `nil` panic when a dependency was commented out or left empty (#1263
  by @neomantra).

## v3.27.1 - 2023-06-30

- Fix panic when a `.env` directory (not file) is present on current directory
  (#1244, #1245 by @pd93).

## v3.27.0 - 2023-06-29

- Allow Taskfiles starting with lowercase characters (#947, #1221 by @pd93).
  - e.g. `taskfile.yml`, `taskfile.yaml`, `taskfile.dist.yml` &
    `taskfile.dist.yaml`
- Bug fixes were made to the
  [npm installation method](https://taskfile.dev/installation/#npm). (#1190, by
  @sounisi5011).
- Added the
  [gentle force experiment](https://taskfile.dev/experiments/gentle-force) as a
  draft (#1200, #1216 by @pd93).
- Added an `--experiments` flag to allow you to see which experiments are
  enabled (#1242 by @pd93).
- Added ability to specify which variables are required in a task (#1203, #1204
  by @benc-uk).

## v3.26.0 - 2023-06-10

- Only rewrite checksum files in `.task` if the checksum has changed (#1185,
  #1194 by @deviantintegral).
- Added [experiments documentation](https://taskfile.dev/experiments) to the
  website (#1198 by @pd93).
- Deprecated `version: 2` schema. This will be removed in the next major release
  (#1197, #1198, #1199 by @pd93).
- Added a new `prompt:` prop to set a warning prompt to be shown before running
  a potential dangerous task (#100, #1163 by @MaxCheetham,
  [Documentation](https://taskfile.dev/usage/#warning-prompts)).
- Added support for single command task syntax. With this change, it's now
  possible to declare just `cmd:` in a task, avoiding the more complex
  `cmds: []` when you have only a single command for that task (#1130, #1131 by
  @timdp).

## v3.25.0 - 2023-05-22

- Support `silent:` when calling another tasks (#680, #1142 by @danquah).
- Improve PowerShell completion script (#1168 by @trim21).
- Add more languages to the website menu and show translation progress
  percentage (#1173 by @misitebao).
- Starting on this release, official binaries for FreeBSD will be available to
  download (#1068 by @andreynering).
- Fix some errors being unintendedly suppressed (#1134 by @clintmod).
- Fix a nil pointer error when `version` is omitted from a Taskfile (#1148,
  #1149 by @pd93).
- Fix duplicate error message when a task does not exists (#1141, #1144 by
  @pd93).

## v3.24.0 - 2023-04-15

- Fix Fish shell completion for tasks with aliases (#1113 by @patricksjackson).
- The default branch was renamed from `master` to `main` (#1049, #1048 by
  @pd93).
- Fix bug where "up-to-date" logs were not being omitted for silent tasks (#546,
  #1107 by @danquah).
- Add `.hg` (Mercurial) to the list of ignored directories when using `--watch`
  (#1098 by @misery).
- More improvements to the release tool (#1096 by @pd93).
- Enforce [gofumpt](https://github.com/mvdan/gofumpt) linter (#1099 by @pd93)
- Add `--sort` flag for use with `--list` and `--list-all` (#946, #1105 by
  @pd93).
- Task now has [custom exit codes](https://taskfile.dev/api/#exit-codes)
  depending on the error (#1114 by @pd93).

## v3.23.0 - 2023-03-26

Task now has an
[official extension for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=task.vscode-task)
contributed by @pd93! :tada: The extension is maintained in a
[new repository](https://github.com/go-task/vscode-task) under the `go-task`
organization. We're looking to gather feedback from the community so please give
it a go and let us know what you think via a
[discussion](https://github.com/go-task/vscode-task/discussions),
[issue](https://github.com/go-task/vscode-task/issues) or on our
[Discord](https://discord.gg/6TY36E39UK)!

> **NOTE:** The extension _requires_ v3.23.0 to be installed in order to work.

- The website was integrated with
  [Crowdin](https://crowdin.com/project/taskfile) to allow the community to
  contribute with translations! [Chinese](https://taskfile.dev/zh-Hans/) is the
  first language available (#1057, #1058 by @misitebao).
- Added task location data to the `--json` flag output (#1056 by @pd93)
- Change the name of the file generated by `task --init` from `Taskfile.yaml` to
  `Taskfile.yml` (#1062 by @misitebao).
- Added new `splitArgs` template function
  (`{{splitArgs "foo bar 'foo bar baz'"}}`) to ensure string is split as
  arguments (#1040, #1059 by @dhanusaputra).
- Fix the value of `{{.CHECKSUM}}` variable in status (#1076, #1080 by @pd93).
- Fixed deep copy implementation (#1072 by @pd93)
- Created a tool to assist with releases (#1086 by @pd93).

## v3.22.0 - 2023-03-10

- Add a brand new `--global` (`-g`) flag that will run a Taskfile from your
  `$HOME` directory. This is useful to have automation that you can run from
  anywhere in your system!
  ([Documentation](https://taskfile.dev/usage/#running-a-global-taskfile), #1029
  by @andreynering).
- Add ability to set `error_only: true` on the `group` output mode. This will
  instruct Task to only print a command output if it returned with a non-zero
  exit code (#664, #1022 by @jaedle).
- Fixed bug where `.task/checksum` file was sometimes not being created when
  task also declares a `status:` (#840, #1035 by @harelwa, #1037 by @pd93).
- Refactored and decoupled fingerprinting from the main Task executor (#1039 by
  @pd93).
- Fixed deadlock issue when using `run: once` (#715, #1025 by
  @theunrepentantgeek).

## v3.21.0 - 2023-02-22

- Added new `TASK_VERSION` special variable (#990, #1014 by @ja1code).
- Fixed a bug where tasks were sometimes incorrectly marked as internal (#1007
  by @pd93).
- Update to Go 1.20 (bump minimum version to 1.19) (#1010 by @pd93)
- Added environment variable `FORCE_COLOR` support to force color output. Useful
  for environments without TTY (#1003 by @automation-stack)

## v3.20.0 - 2023-01-14

- Improve behavior and performance of status checking when using the `timestamp`
  mode (#976, #977 by @aminya).
- Performance optimizations were made for large Taskfiles (#982 by @pd93).
- Add ability to configure options for the
  [`set`](https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html)
  and
  [`shopt`](https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html)
  builtins (#908, #929 by @pd93,
  [Documentation](http://taskfile.dev/usage/#set-and-shopt)).
- Add new `platforms:` attribute to `task` and `cmd`, so it's now possible to
  choose in which platforms that given task or command will be run on. Possible
  values are operating system (GOOS), architecture (GOARCH) or a combination of
  the two. Example: `platforms: [linux]`, `platforms: [amd64]` or
  `platforms: [linux/amd64]`. Other platforms will be skipped (#978, #980 by
  @leaanthony).

## v3.19.1 - 2022-12-31

- Small bug fix: closing `Taskfile.yml` once we're done reading it (#963, #964
  by @HeCorr).
- Fixes a bug in v2 that caused a panic when using a `Taskfile_{{OS}}.yml` file
  (#961, #971 by @pd93).
- Fixed a bug where watch intervals set in the Taskfile were not being respected
  (#969, #970 by @pd93)
- Add `--json` flag (alias `-j`) with the intent to improve support for code
  editors and add room to other possible integrations. This is basic for now,
  but we plan to add more info in the near future (#936 by @davidalpert, #764).

## v3.19.0 - 2022-12-05

- Installation via npm now supports [pnpm](https://pnpm.io/) as well
  ([go-task/go-npm#2](https://github.com/go-task/go-npm/issues/2),
  [go-task/go-npm#3](https://github.com/go-task/go-npm/pull/3)).
- It's now possible to run Taskfiles from subdirectories! A new
  `USER_WORKING_DIR` special variable was added to add even more flexibility for
  monorepos (#289, #920).
- Add task-level `dotenv` support (#389, #904).
- It's now possible to use global level variables on `includes` (#942, #943).
- The website got a brand new
  [translation to Chinese](https://task-zh.readthedocs.io/zh_CN/latest/) by
  [@DeronW](https://github.com/DeronW). Thanks!

## v3.18.0 - 2022-11-12

- Show aliases on `task --list --silent` (`task --ls`). This means that aliases
  will be completed by the completion scripts (#919).
- Tasks in the root Taskfile will now be displayed first in
  `--list`/`--list-all` output (#806, #890).
- It's now possible to call a `default` task in an included Taskfile by using
  just the namespace. For example: `docs:default` is now automatically aliased
  to `docs` (#661, #815).

## v3.17.0 - 2022-10-14

- Add a "Did you mean ...?" suggestion when a task does not exits another one
  with a similar name is found (#867, #880).
- Now YAML parse errors will print which Taskfile failed to parse (#885, #887).
- Add ability to set `aliases` for tasks and namespaces (#268, #340, #879).
- Improvements to Fish shell completion (#897).
- Added ability to set a different watch interval by setting `interval: '500ms'`
  or using the `--interval=500ms` flag (#813, #865).
- Add colored output to `--list`, `--list-all` and `--summary` flags (#845,
  #874).
- Fix unexpected behavior where `label:` was being shown instead of the task
  name on `--list` (#603, #877).

## v3.16.0 - 2022-09-29

- Add `npm` as new installation method: `npm i -g @go-task/cli` (#870, #871,
  [npm package](https://www.npmjs.com/package/@go-task/cli)).
- Add support to marking tasks and includes as internal, which will hide them
  from `--list` and `--list-all` (#818).

## v3.15.2 - 2022-09-08

- Fix error when using variable in `env:` introduced in the previous release
  (#858, #866).
- Fix handling of `CLI_ARGS` (`--`) in Bash completion (#863).
- On zsh completion, add ability to replace `--list-all` with `--list` as
  already possible on the Bash completion (#861).

## v3.15.0 - 2022-09-03

- Add new special variables `ROOT_DIR` and `TASKFILE_DIR`. This was a highly
  requested feature (#215, #857,
  [Documentation](https://taskfile.dev/api/#special-variables)).
- Follow symlinks on `sources` (#826, #831).
- Improvements and fixes to Bash completion (#835, #844).

## v3.14.1 - 2022-08-03

- Always resolve relative include paths relative to the including Taskfile
  (#822, #823).
- Fix ZSH and PowerShell completions to consider all tasks instead of just the
  public ones (those with descriptions) (#803).

## v3.14.0 - 2022-07-08

- Add ability to override the `.task` directory location with the
  `TASK_TEMP_DIR` environment variable.
- Allow to override Task colors using environment variables: `TASK_COLOR_RESET`,
  `TASK_COLOR_BLUE`, `TASK_COLOR_GREEN`, `TASK_COLOR_CYAN`, `TASK_COLOR_YELLOW`,
  `TASK_COLOR_MAGENTA` and `TASK_COLOR_RED` (#568, #792).
- Fixed bug when using the `output: group` mode where STDOUT and STDERR were
  being print in separated blocks instead of in the right order (#779).
- Starting on this release, ARM architecture binaries are been released to Snap
  as well (#795).
- i386 binaries won't be available anymore on Snap because Ubuntu removed the
  support for this architecture.
- Upgrade mvdan.cc/sh, which fixes a bug with associative arrays (#785,
  [mvdan/sh#884](https://github.com/mvdan/sh/issues/884),
  [mvdan/sh#893](https://github.com/mvdan/sh/pull/893)).

## v3.13.0 - 2022-06-13

- Added `-n` as an alias to `--dry` (#776, #777).
- Fix behavior of interrupt (SIGINT, SIGTERM) signals. Task will now give time
  for the processes running to do cleanup work (#458, #479, #728, #769).
- Add new `--exit-code` (`-x`) flag that will pass-through the exit form the
  command being ran (#755).

## v3.12.1 - 2022-05-10

- Fixed bug where, on Windows, variables were ending with `\r` because we were
  only removing the final `\n` but not `\r\n` (#717).

## v3.12.0 - 2022-03-31

- The `--list` and `--list-all` flags can now be combined with the `--silent`
  flag to print the task names only, without their description (#691).
- Added support for multi-level inclusion of Taskfiles. This means that included
  Taskfiles can also include other Taskfiles. Before this was limited to one
  level (#390, #623, #656).
- Add ability to specify vars when including a Taskfile.
  [Check out the documentation](https://taskfile.dev/#/usage?id=vars-of-included-taskfiles)
  for more information (#677).

## v3.11.0 - 2022-02-19

- Task now supports printing begin and end messages when using the `group`
  output mode, useful for grouping tasks in CI systems.
  [Check out the documentation](http://taskfile.dev/#/usage?id=output-syntax)
  for more information (#647, #651).
- Add `Taskfile.dist.yml` and `Taskfile.dist.yaml` to the supported file name
  list.
  [Check out the documentation](https://taskfile.dev/#/usage?id=supported-file-names)
  for more information (#498, #666).

## v3.10.0 - 2022-01-04

- A new `--list-all` (alias `-a`) flag is now available. It's similar to the
  exiting `--list` (`-l`) but prints all tasks, even those without a description
  (#383, #401).
- It's now possible to schedule cleanup commands to run once a task finishes
  with the `defer:` keyword
  ([Documentation](https://taskfile.dev/#/usage?id=doing-task-cleanup-with-defer),
  #475, #626).
- Remove long deprecated and undocumented `$` variable prefix and `^` command
  prefix (#642, #644, #645).
- Add support for `.yaml` extension (as an alternative to `.yml`). This was
  requested multiple times throughout the years. Enjoy! (#183, #184, #369, #584,
  #621).
- Fixed error when computing a variable when the task directory do not exist yet
  (#481, #579).

## v3.9.2 - 2021-12-02

- Upgrade [mvdan/sh](https://github.com/mvdan/sh) which contains a fix a for a
  important regression on Windows (#619,
  [mvdan/sh#768](https://github.com/mvdan/sh/issues/768),
  [mvdan/sh#769](https://github.com/mvdan/sh/pull/769)).

## v3.9.1 - 2021-11-28

- Add logging in verbose mode for when a task starts and finishes (#533, #588).
- Fix an issue with preconditions and context errors (#597, #598).
- Quote each `{{.CLI_ARGS}}` argument to prevent one with spaces to become many
  (#613).
- Fix nil pointer when `cmd:` was left empty (#612, #614).
- Upgrade [mvdan/sh](https://github.com/mvdan/sh) which contains two relevant
  fixes:
  - Fix quote of empty strings in `shellQuote` (#609,
    [mvdan/sh#763](https://github.com/mvdan/sh/issues/763)).
  - Fix issue of wrong environment variable being picked when there's another
    very similar one (#586,
    [mvdan/sh#745](https://github.com/mvdan/sh/pull/745)).
- Install shell completions automatically when installing via Homebrew (#264,
  #592,
  [go-task/homebrew-tap#2](https://github.com/go-task/homebrew-tap/pull/2)).

## v3.9.0 - 2021-10-02

- A new `shellQuote` function was added to the template system
  (`{{shellQuote "a string"}}`) to ensure a string is safe for use in shell
  ([mvdan/sh#727](https://github.com/mvdan/sh/pull/727),
  [mvdan/sh#737](https://github.com/mvdan/sh/pull/737),
  [Documentation](https://pkg.go.dev/mvdan.cc/sh/v3@v3.4.0/syntax#Quote))
- In this version [mvdan.cc/sh](https://github.com/mvdan/sh) was upgraded with
  some small fixes and features
  - The `read -p` flag is now supported (#314,
    [mvdan/sh#551](https://github.com/mvdan/sh/issues/551),
    [mvdan/sh#772](https://github.com/mvdan/sh/pull/722))
  - The `pwd -P` and `pwd -L` flags are now supported (#553,
    [mvdan/sh#724](https://github.com/mvdan/sh/issues/724),
    [mvdan/sh#728](https://github.com/mvdan/sh/pull/728))
  - The `$GID` environment variable is now correctly being set (#561,
    [mvdan/sh#723](https://github.com/mvdan/sh/pull/723))

## v3.8.0 - 2021-09-26

- Add `interactive: true` setting to improve support for interactive CLI apps
  (#217, #563).
- Fix some `nil` errors (#534, #573).
- Add ability to declare an included Taskfile as optional (#519, #552).
- Add support for including Taskfiles in the home directory by using `~` (#539,
  #557).

## v3.7.3 - 2021-09-04

- Add official support to Apple M1 (#564, #567).
- Our [official Homebrew tap](https://github.com/go-task/homebrew-tap) will
  support more platforms, including Apple M1

## v3.7.0 - 2021-07-31

- Add `run:` setting to control if tasks should run multiple times or not.
  Available options are `always` (the default), `when_changed` (if a variable
  modified the task) and `once` (run only once no matter what). This is a long
  time requested feature. Enjoy! (#53, #359).

## v3.6.0 - 2021-07-10

- Allow using both `sources:` and `status:` in the same task (#411, #427, #477).
- Small optimization and bug fix: don't compute variables if not needed for
  `dotenv:` (#517).

## v3.5.0 - 2021-07-04

- Add support for interpolation in `dotenv:` (#433, #434, #453).

## v3.4.3 - 2021-05-30

- Add support for the `NO_COLOR` environment variable. (#459,
  [fatih/color#137](https://github.com/fatih/color/pull/137)).
- Fix bug where sources were not considering the right directory in `--watch`
  mode (#484, #485).

## v3.4.2 - 2021-04-23

- On watch, report which file failed to read (#472).
- Do not try to catch SIGKILL signal, which are not actually possible (#476).
- Improve version reporting when building Task from source using Go Modules
  (#462, #473).

## v3.4.1 - 2021-04-17

- Improve error reporting when parsing YAML: in some situations where you would
  just see an generic error, you'll now see the actual error with more detail:
  the YAML line the failed to parse, for example (#467).
- A JSON Schema was published [here](https://json.schemastore.org/taskfile.json)
  and is automatically being used by some editors like Visual Studio Code
  (#135).
- Print task name before the command in the log output (#398).

## v3.3.0 - 2021-03-20

- Add support for delegating CLI arguments to commands with `--` and a special
  `CLI_ARGS` variable (#327).
- Add a `--concurrency` (alias `-C`) flag, to limit the number of tasks that run
  concurrently. This is useful for heavy workloads. (#345).

## v3.2.2 - 2021-01-12

- Improve performance of `--list` and `--summary` by skipping running shell
  variables for these flags (#332).
- Fixed a bug where an environment in a Taskfile was not always overridable by
  the system environment (#425).
- Fixed environment from .env files not being available as variables (#379).
- The install script is now working for ARM platforms (#428).

## v3.2.1 - 2021-01-09

- Fixed some bugs and regressions regarding dynamic variables and directories
  (#426).
- The [slim-sprig](https://github.com/go-task/slim-sprig) package was updated
  with the upstream [sprig](https://github.com/Masterminds/sprig).

## v3.2.0 - 2021-01-07

- Fix the `.task` directory being created in the task directory instead of the
  Taskfile directory (#247).
- Fix a bug where dynamic variables (those declared with `sh:`) were not running
  in the task directory when the task has a custom dir or it was in an included
  Taskfile (#384).
- The watch feature (via the `--watch` flag) got a few different bug fixes and
  should be more stable now (#423, #365).

## v3.1.0 - 2021-01-03

- Fix a bug when the checksum up-to-date resolution is used by a task with a
  custom `label:` attribute (#412).
- Starting from this release, we're releasing official ARMv6 and ARM64 binaries
  for Linux (#375, #418).
- Task now respects the order of declaration of included Taskfiles when
  evaluating variables declaring by them (#393).
- `set -e` is now automatically set on every command. This was done to fix an
  issue where multiline string commands wouldn't really fail unless the sentence
  was in the last line (#403).

## v3.0.1 - 2020-12-26

- Allow use as a library by moving the required packages out of the `internal`
  directory (#358).
- Do not error if a specified dotenv file does not exist (#378, #385).
- Fix panic when you have empty tasks in your Taskfile (#338, #362).

## v3.0.0 - 2020-08-16

- On `v3`, all CLI variables will be considered global variables (#336, #341)
- Add support to `.env` like files (#324, #356).
- Add `label:` to task so you can override the task name in the logs (#321,
  #337).
- Refactor how variables work on version 3 (#311).
- Disallow `expansions` on v3 since it has no effect.
- `Taskvars.yml` is not automatically included anymore.
- `Taskfile_{{OS}}.yml` is not automatically included anymore.
- Allow interpolation on `includes`, so you can manually include a Taskfile
  based on operation system, for example.
- Expose `.TASK` variable in templates with the task name (#252).
- Implement short task syntax (#194, #240).
- Added option to make included Taskfile run commands on its own directory
  (#260, #144)
- Taskfiles in version 1 are not supported anymore (#237).
- Added global `method:` option. With this option, you can set a default method
  to all tasks in a Taskfile (#246).
- Changed default method from `timestamp` to `checksum` (#246).
- New magic variables are now available when using `status:`: `.TIMESTAMP` which
  contains the greatest modification date from the files listed in `sources:`,
  and `.CHECKSUM`, which contains a checksum of all files listed in `status:`.
  This is useful for manual checking when using external, or even remote,
  artifacts when using `status:` (#216).
- We're now using [slim-sprig](https://github.com/go-task/slim-sprig) instead of
  [sprig](https://github.com/Masterminds/sprig), which allowed a file size
  reduction of about 22% (#219).
- We now use some colors on Task output to better distinguish message types -
  commands are green, errors are red, etc (#207).

## v2.8.1 - 2020-05-20

- Fix error code for the `--help` flag (#300, #330).
- Print version to stdout instead of stderr (#299, #329).
- Suppress `context` errors when using the `--watch` flag (#313, #317).
- Support templating on description (#276, #283).

## v2.8.0 - 2019-12-07

- Add `--parallel` flag (alias `-p`) to run tasks given by the command line in
  parallel (#266).
- Fixed bug where calling the `task` CLI only informing global vars would not
  execute the `default` task.
- Add ability to silent all tasks by adding `silent: true` a the root of the
  Taskfile.

## v2.7.1 - 2019-11-10

- Fix error being raised when `exit 0` was called (#251).

## v2.7.0 - 2019-09-22

- Fixed panic bug when assigning a global variable (#229, #243).
- A task with `method: checksum` will now re-run if generated files are deleted
  (#228, #238).

## v2.6.0 - 2019-07-21

- Fixed some bugs regarding minor version checks on `version:`.
- Add `preconditions:` to task (#205).
- Create directory informed on `dir:` if it doesn't exist (#209, #211).
- We now have a `--taskfile` flag (alias `-t`), which can be used to run another
  Taskfile (other than the default `Taskfile.yml`) (#221).
- It's now possible to install Task using Homebrew on Linux
  ([go-task/homebrew-tap#1](https://github.com/go-task/homebrew-tap/pull/1)).

## v2.5.2 - 2019-05-11

- Reverted YAML upgrade due issues with CRLF on Windows (#201,
  [go-yaml/yaml#450](https://github.com/go-yaml/yaml/issues/450)).
- Allow setting global variables through the CLI (#192).

## 2.5.1 - 2019-04-27

- Fixed some issues with interactive command line tools, where sometimes the
  output were not being shown, and similar issues (#114, #190, #200).
- Upgraded [go-yaml/yaml](https://github.com/go-yaml/yaml) from v2 to v3.

## v2.5.0 - 2019-03-16

- We moved from the taskfile.org domain to the new fancy taskfile.dev domain.
  While stuff is being redirected, we strongly recommend to everyone that use
  [this install script](https://taskfile.dev/#/installation?id=install-script)
  to use the new taskfile.dev domain on scripts from now on.
- Fixed to the ZSH completion (#182).
- Add
  [`--summary` flag along with `summary:` task attribute](https://taskfile.org/#/usage?id=display-summary-of-task)
  (#180).

## v2.4.0 - 2019-02-21

- Allow calling a task of the root Taskfile from an included Taskfile by
  prefixing it with `:` (#161, #172).
- Add flag to override the `output` option (#173).
- Fix bug where Task was persisting the new checksum on the disk when the Dry
  Mode is enabled (#166).
- Fix file timestamp issue when the file name has spaces (#176).
- Mitigating path expanding issues on Windows (#170).

## v2.3.0 - 2019-01-02

- On Windows, Task can now be installed using [Scoop](https://scoop.sh/) (#152).
- Fixed issue with file/directory globing (#153).
- Added ability to globally set environment variables (#138, #159).

## v2.2.1 - 2018-12-09

- This repository now uses Go Modules (#143). We'll still keep the `vendor`
  directory in sync for some time, though;
- Fixing a bug when the Taskfile has no tasks but includes another Taskfile
  (#150);
- Fix a bug when calling another task or a dependency in an included Taskfile
  (#151).

## v2.2.0 - 2018-10-25

- Added support for
  [including other Taskfiles](https://taskfile.org/#/usage?id=including-other-taskfiles)
  (#98)
  - This should be considered experimental. For now, only including local files
    is supported, but support for including remote Taskfiles is being discussed.
    If you have any feedback, please comment on #98.
- Task now have a dedicated documentation site: https://taskfile.org
  - Thanks to [Docsify](https://docsify.js.org/) for making this pretty easy. To
    check the source code, just take a look at the
    [docs](https://github.com/go-task/task/tree/main/docs) directory of this
    repository. Contributions to the documentation is really appreciated.

## v2.1.1 - 2018-09-17

- Fix suggestion to use `task --init` not being shown anymore (when a
  `Taskfile.yml` is not found)
- Fix error when using checksum method and no file exists for a source glob
  (#131)
- Fix signal handling when the `--watch` flag is given (#132)

## v2.1.0 - 2018-08-19

- Add a `ignore_error` option to task and command (#123)
- Add a dry run mode (`--dry` flag) (#126)

## v2.0.3 - 2018-06-24

- Expand environment variables on "dir", "sources" and "generates" (#116)
- Fix YAML merging syntax (#112)
- Add ZSH completion (#111)
- Implement new `output` option. Please check out the
  [documentation](https://github.com/go-task/task#output-syntax)

## v2.0.2 - 2018-05-01

- Fix merging of YAML anchors (#112)

## v2.0.1 - 2018-03-11

- Fixes panic on `task --list`

## v2.0.0 - 2018-03-08

Version 2.0.0 is here, with a new Taskfile format.

Please, make sure to read the
[Taskfile versions](https://github.com/go-task/task/blob/main/TASKFILE_VERSIONS.md)
document, since it describes in depth what changed for this version.

- New Taskfile version 2 (#77)
- Possibility to have global variables in the `Taskfile.yml` instead of
  `Taskvars.yml` (#66)
- Small improvements and fixes

## v1.4.4 - 2017-11-19

- Handle SIGINT and SIGTERM (#75);
- List: print message with there's no task with description;
- Expand home dir ("~" symbol) on paths (#74);
- Add Snap as an installation method;
- Move examples to its own repo;
- Watch: also walk on tasks called on on "cmds", and not only on "deps";
- Print logs to stderr instead of stdout (#68);
- Remove deprecated `set` keyword;
- Add checksum based status check, alternative to timestamp based.

## v1.4.3 - 2017-09-07

- Allow assigning variables to tasks at run time via CLI (#33)
- Added support for multiline variables from sh (#64)
- Fixes env: remove square braces and evaluate shell (#62)
- Watch: change watch library and few fixes and improvements
- When use watching, cancel and restart long running process on file change (#59
  and #60)

## v1.4.2 - 2017-07-30

- Flag to set directory of execution
- Always echo command if is verbose mode
- Add silent mode to disable echoing of commands
- Fixes and improvements of variables (#56)

## v1.4.1 - 2017-07-15

- Allow use of YAML for dynamic variables instead of $ prefix
  - `VAR: {sh: echo Hello}` instead of `VAR: $echo Hello`
- Add `--list` (or `-l`) flag to print existing tasks
- OS specific Taskvars file (e.g. `Taskvars_windows.yml`, `Taskvars_linux.yml`,
  etc)
- Consider task up-to-date on equal timestamps (#49)
- Allow absolute path in generates section (#48)
- Bugfix: allow templating when calling deps (#42)
- Fix panic for invalid task in cyclic dep detection
- Better error output for dynamic variables in Taskvars.yml (#41)
- Allow template evaluation in parameters

## v1.4.0 - 2017-07-06

- Cache dynamic variables
- Add verbose mode (`-v` flag)
- Support to task parameters (overriding vars) (#31) (#32)
- Print command, also when "set:" is specified (#35)
- Improve task command help text (#35)

## v1.3.1 - 2017-06-14

- Fix glob not working on commands (#28)
- Add ExeExt template function
- Add `--init` flag to create a new Taskfile
- Add status option to prevent task from running (#27)
- Allow interpolation on `generates` and `sources` attributes (#26)

## v1.3.0 - 2017-04-24

- Migrate from os/exec.Cmd to a native Go sh/bash interpreter
  - This is a potentially breaking change if you use Windows.
  - Now, `cmd` is not used anymore on Windows. Always use Bash-like syntax for
    your commands, even on Windows.
- Add "ToSlash" and "FromSlash" to template functions
- Use functions defined on github.com/Masterminds/sprig
- Do not redirect stdin while running variables commands
- Using `context` and `errgroup` packages (this will make other tasks to be
  cancelled, if one returned an error)

## v1.2.0 - 2017-04-02

- More tests and Travis integration
- Watch a task (experimental)
- Possibility to call another task
- Fix "=" not being recognized in variables/environment variables
- Tasks can now have a description, and help will print them (#10)
- Task dependencies now run concurrently
- Support for a default task (#16)

## v1.1.0 - 2017-03-08

- Support for YAML, TOML and JSON (#1)
- Support running command in another directory (#4)
- `--force` or `-f` flag to force execution of task even when it's up-to-date
- Detection of cyclic dependencies (#5)
- Support for variables (#6, #9, #14)
- Operation System specific commands and variables (#13)

## v1.0.0 - 2017-02-28

- Add LICENSE file


================================================
FILE: LICENSE
================================================
The MIT License (MIT)

Copyright (c) 2016 Andrey Nering

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
<div align="center">
  <a href="https://taskfile.dev">
    <img src="website/src/public/img/logo.svg" width="200px" height="200px" />
  </a>

  <h1>Task: The Modern Task Runner</h1>

  <p>
    A fast, cross-platform build tool inspired by Make, designed for modern workflows.
  </p>

  <p>
    <a href="https://taskfile.dev/docs/installation">Installation</a> &bullet; <a href="https://taskfile.dev/docs/getting-started">Getting Started</a> &bullet; <a href="https://taskfile.dev/docs/guide">Docs</a> &bullet; <a href="https://twitter.com/taskfiledev">Twitter</a> &bullet; <a href="https://bsky.app/profile/taskfile.dev">Bluesky</a> &bullet; <a href="https://fosstodon.org/@task">Mastodon</a> &bullet; <a href="https://discord.gg/6TY36E39UK">Discord</a>
  </p>

  <h1>Gold Sponsors</h1>

  <table>
    <tr>
      <td align="center" valign="middle">
        <a target="_blank" href="https://devowl.io">
          <img src="website/src/public/img/devowl.io.svg" height="100px" width="200px" title="devowl.io" />
        </a>
      </td>
      <td align="center" valign="middle">
        <a target="_blank" href="https://goodx.international/">
          <img src="website/src/public/img/goodx.svg" height="80px" width="200px" title="GoodX" />
        </a>
      </td>
      <td align="center" valign="middle">
        <a target="_blank" href="https://magic.dev/">
          <img src="website/src/public/img/magic.png" height="100px" width="200px" title="Magic" />
        </a>
      </td>
    </tr>
  </table>

  <h2>Community Sponsors</h2>

  <table>
    <tr>
      <td align="center" valign="middle">
        <a target="_blank" href="https://cloudsmith.com/">
          <img src="website/src/public/img/cloudsmith.svg" height="100px" width="200px" title="Cloudsmith" />
        </a>
      </td>
    </tr>
  </table>
</div>


================================================
FILE: Taskfile.yml
================================================
version: '3'

includes:
  website:
    aliases: [w, docs, d]
    taskfile: ./website
    dir: ./website

vars:
  BIN: "{{.ROOT_DIR}}/bin"
  GOTESTSUM_FORMAT: '{{if .CI}}github-actions{{else}}pkgname{{end}}'

env:
  CGO_ENABLED: '0'

tasks:
  default:
    cmds:
      - task: lint
      - task: test

  run:
    desc: Runs Task
    cmds:
      - go run ./cmd/task {{.CLI_ARGS}}

  install:
    desc: Installs Task
    aliases: [i]
    sources:
      - './**/*.go'
      - go.mod
    cmds:
      - go install -v ./cmd/task

  generate:
    aliases: [gen, g]
    desc: Runs all generate tasks
    cmds:
      - task: generate:mocks
      - task: generate:fixtures

  generate:mocks:
    desc: Runs Mockery to create mocks
    aliases: [gen:mocks, g:mocks]
    deps: [install:mockery]
    sources:
      - "internal/fingerprint/checker.go"
    generates:
      - "internal/mocks/*.go"
    cmds:
      - find . -type f -name *_mock.go -delete
      - "{{.BIN}}/mockery"

  generate:fixtures:
    desc: Runs tests and generates golden fixture files
    aliases: [gen:fixtures, g:fixtures]
    env:
      GOLDIE_UPDATE: 'true'
      GOLDIE_TEMPLATE: 'true'
    cmds:
      - find ./testdata -name '*.golden' -delete
      - go test ./...

  install:mockery:
    desc: Installs mockgen; a tool to generate mock files
    vars:
      MOCKERY_VERSION: v3.2.2
    env:
      GOBIN: "{{.BIN}}"
    status:
      - go version -m {{.BIN}}/mockery | grep github.com/vektra/mockery | grep {{.MOCKERY_VERSION}}
    cmds:
      - GOBIN="{{.BIN}}" go install github.com/vektra/mockery/v3@{{.MOCKERY_VERSION}}

  mod:
    desc: Downloads and tidy Go modules
    cmds:
      - go mod download
      - go mod tidy

  clean:
    desc: Cleans temp files and folders
    aliases: [clear]
    cmds:
      - rm -rf dist/
      - rm -rf tmp/

  lint:
    desc: Runs golangci-lint
    aliases: [l]
    sources:
      - './**/*.go'
      - .golangci.yml
      - go.mod
    cmds:
      - golangci-lint run

  lint:fix:
    desc: Runs golangci-lint and fixes any issues
    sources:
      - './**/*.go'
      - .golangci.yml
      - go.mod
    cmds:
      - golangci-lint run --fix

  format:
    desc: Runs golangci-lint and formats any Go files
    aliases: [fmt, f]
    sources:
      - './**/*.go'
      - .golangci.yml
    cmds:
      - golangci-lint fmt

  sleepit:build:
    desc: Builds the sleepit test helper
    sources:
      - ./cmd/sleepit/**/*.go
    generates:
      - "{{.BIN}}/sleepit"
    cmds:
      - go build -o {{.BIN}}/sleepit{{exeExt}} ./cmd/sleepit

  sleepit:run:
    desc: Builds the sleepit test helper
    deps: [sleepit:build]
    cmds:
      - "{{.BIN}}/sleepit {{.CLI_ARGS}}"
    silent: true

  test:
    desc: Runs test suite
    aliases: [t]
    deps: [gotestsum:install]
    sources:
      - "**/*.go"
      - "testdata/**/*"
    cmds:
      - gotestsum -f '{{.GOTESTSUM_FORMAT}}' ./...

  test:watch:
    desc: Runs test suite with watch tests included
    deps: [sleepit:build, gotestsum:install]
    cmds:
      - gotestsum -f '{{.GOTESTSUM_FORMAT}}' ./... -tags 'watch'

  test:all:
    desc: Runs test suite with signals and watch tests included
    deps: [sleepit:build, gotestsum:install]
    cmds:
      - gotestsum -f '{{.GOTESTSUM_FORMAT}}' -tags 'signals watch' ./...

  goreleaser:test:
    desc: Tests release process without publishing
    cmds:
      - goreleaser --snapshot --clean

  gotestsum:install:
    desc: Installs gotestsum
    status:
      - command -v gotestsum
    cmds:
      - go install gotest.tools/gotestsum@latest

  goreleaser:install:
    desc: Installs goreleaser
    cmds:
      - go install github.com/goreleaser/goreleaser/v2@latest

  gorelease:install:
    desc: "Installs gorelease: https://pkg.go.dev/golang.org/x/exp/cmd/gorelease"
    status:
      - command -v gorelease
    cmds:
      - go install golang.org/x/exp/cmd/gorelease@latest

  api:check:
    desc: Checks what changes have been made to the public API
    deps: [gorelease:install]
    vars:
      LATEST:
        sh: git describe --tags --abbrev=0
    cmds:
      - gorelease -base={{.LATEST}}

  release:*:
    desc: Prepare the project for a new release
    summary: |
      This task will do the following:

      - Update the version and date in the CHANGELOG.md file
      - Update the version in the package.json and package-lock.json files
      - Copy the latest docs to the "current" version on the website
      - Commit the changes
      - Create a new tag
      - Push the commit/tag to the repository
      - Create a GitHub release

      To use the task, run "task release:<version>" where "<version>" is is one of:

      - "major" - Bumps the major number
      - "minor" - Bumps the minor number
      - "patch" - Bumps the patch number
      - A semver compatible version number (e.g. "1.2.3")
    vars:
      VERSION:
        sh: "go run ./cmd/release --version {{index .MATCH 0}}"
      COMPLETE_MESSAGE: |
        Creating release with GoReleaser: https://github.com/go-task/task/actions/workflows/release.yml

        Please wait for the CI to finish and then do the following:

        - Copy the changelog for v{{.VERSION}} to the GitHub release
        - Update and push the snapcraft manifest in https://github.com/go-task/snap/blob/main/snap/snapcraft.yaml
    preconditions:
      - sh: test $(git rev-parse --abbrev-ref HEAD) = "main"
        msg: "You must be on the main branch to release"
      - sh: "[[ -z $(git diff --shortstat main) ]]"
        msg: "You must have a clean working tree to release"
    prompt: "Are you sure you want to release version {{.VERSION}}?"
    cmds:
      - cmd: echo "Releasing v{{.VERSION}}"
        silent: true
      - "go run ./cmd/release {{.VERSION}}"
      - "git add --all"
      - "git commit -m v{{.VERSION}}"
      - "git push"
      - "git tag -a v{{.VERSION}} -m v{{.VERSION}}"
      - "git push origin tag v{{.VERSION}}"
      - cmd: printf "%s" '{{.COMPLETE_MESSAGE}}'
        silent: true


================================================
FILE: args/args.go
================================================
package args

import (
	"strings"

	"github.com/spf13/pflag"
	"mvdan.cc/sh/v3/syntax"

	"github.com/go-task/task/v3"
	"github.com/go-task/task/v3/taskfile/ast"
)

// Get fetches the remaining arguments after CLI parsing and splits them into
// two groups: the arguments before the double dash (--) and the arguments after
// the double dash.
func Get() ([]string, []string, error) {
	args := pflag.Args()
	doubleDashPos := pflag.CommandLine.ArgsLenAtDash()

	if doubleDashPos == -1 {
		return args, nil, nil
	}
	return args[:doubleDashPos], args[doubleDashPos:], nil
}

// Parse parses command line argument: tasks and global variables
func Parse(args ...string) ([]*task.Call, *ast.Vars) {
	calls := []*task.Call{}
	globals := ast.NewVars()

	for _, arg := range args {
		if !strings.Contains(arg, "=") {
			calls = append(calls, &task.Call{Task: arg})
			continue
		}

		name, value := splitVar(arg)
		globals.Set(name, ast.Var{Value: value})
	}

	return calls, globals
}

func ToQuotedString(args []string) (string, error) {
	var quotedCliArgs []string
	for _, arg := range args {
		quotedCliArg, err := syntax.Quote(arg, syntax.LangBash)
		if err != nil {
			return "", err
		}
		quotedCliArgs = append(quotedCliArgs, quotedCliArg)
	}
	return strings.Join(quotedCliArgs, " "), nil
}

func splitVar(s string) (string, string) {
	pair := strings.SplitN(s, "=", 2)
	return pair[0], pair[1]
}


================================================
FILE: args/args_test.go
================================================
package args_test

import (
	"fmt"
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/go-task/task/v3"
	"github.com/go-task/task/v3/args"
	"github.com/go-task/task/v3/taskfile/ast"
)

func TestArgs(t *testing.T) {
	t.Parallel()

	tests := []struct {
		Args            []string
		ExpectedCalls   []*task.Call
		ExpectedGlobals *ast.Vars
	}{
		{
			Args: []string{"task-a", "task-b", "task-c"},
			ExpectedCalls: []*task.Call{
				{Task: "task-a"},
				{Task: "task-b"},
				{Task: "task-c"},
			},
		},
		{
			Args: []string{"task-a", "FOO=bar", "task-b", "task-c", "BAR=baz", "BAZ=foo"},
			ExpectedCalls: []*task.Call{
				{Task: "task-a"},
				{Task: "task-b"},
				{Task: "task-c"},
			},
			ExpectedGlobals: ast.NewVars(
				&ast.VarElement{
					Key: "FOO",
					Value: ast.Var{
						Value: "bar",
					},
				},
				&ast.VarElement{
					Key: "BAR",
					Value: ast.Var{
						Value: "baz",
					},
				},
				&ast.VarElement{
					Key: "BAZ",
					Value: ast.Var{
						Value: "foo",
					},
				},
			),
		},
		{
			Args: []string{"task-a", "CONTENT=with some spaces"},
			ExpectedCalls: []*task.Call{
				{Task: "task-a"},
			},
			ExpectedGlobals: ast.NewVars(
				&ast.VarElement{
					Key: "CONTENT",
					Value: ast.Var{
						Value: "with some spaces",
					},
				},
			),
		},
		{
			Args: []string{"FOO=bar", "task-a", "task-b"},
			ExpectedCalls: []*task.Call{
				{Task: "task-a"},
				{Task: "task-b"},
			},
			ExpectedGlobals: ast.NewVars(
				&ast.VarElement{
					Key: "FOO",
					Value: ast.Var{
						Value: "bar",
					},
				},
			),
		},
		{
			Args:          nil,
			ExpectedCalls: []*task.Call{},
		},
		{
			Args:          []string{},
			ExpectedCalls: []*task.Call{},
		},
		{
			Args:          []string{"FOO=bar", "BAR=baz"},
			ExpectedCalls: []*task.Call{},
			ExpectedGlobals: ast.NewVars(
				&ast.VarElement{
					Key: "FOO",
					Value: ast.Var{
						Value: "bar",
					},
				},
				&ast.VarElement{
					Key: "BAR",
					Value: ast.Var{
						Value: "baz",
					},
				},
			),
		},
	}

	for i, test := range tests {
		t.Run(fmt.Sprintf("TestArgs%d", i+1), func(t *testing.T) {
			t.Parallel()

			calls, globals := args.Parse(test.Args...)
			assert.Equal(t, test.ExpectedCalls, calls)
			if test.ExpectedGlobals.Len() > 0 || globals.Len() > 0 {
				assert.Equal(t, test.ExpectedGlobals, globals)
				assert.Equal(t, test.ExpectedGlobals, globals)
			}
		})
	}
}


================================================
FILE: bin/.keep
================================================


================================================
FILE: call.go
================================================
package task

import "github.com/go-task/task/v3/taskfile/ast"

// Call is the parameters to a task call
type Call struct {
	Task     string
	Vars     *ast.Vars
	Silent   bool
	Indirect bool // True if the task was called by another task
}


================================================
FILE: cmd/release/main.go
================================================
package main

import (
	"fmt"
	"os"
	"regexp"
	"strings"
	"time"

	"github.com/Masterminds/semver/v3"
	"github.com/spf13/pflag"

	"github.com/go-task/task/v3/errors"
)

const (
	changelogSource = "CHANGELOG.md"
	changelogTarget = "website/src/docs/changelog.md"
	versionFile     = "internal/version/version.txt"
)

var changelogReleaseRegex = regexp.MustCompile(`## Unreleased`)

// Flags
var (
	versionFlag bool
)

func init() {
	pflag.BoolVarP(&versionFlag, "version", "v", false, "resolved version number")
	pflag.Parse()
}

func main() {
	if err := release(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func release() error {
	if len(pflag.Args()) != 1 {
		return errors.New("error: expected version number")
	}

	version, err := getVersion(versionFile)
	if err != nil {
		return err
	}

	if err := bumpVersion(version, pflag.Arg(0)); err != nil {
		return err
	}

	if versionFlag {
		fmt.Println(version)
		return nil
	}

	if err := changelog(version); err != nil {
		return err
	}

	if err := setVersionFile(versionFile, version); err != nil {
		return err
	}

	return nil
}

func getVersion(filename string) (*semver.Version, error) {
	b, err := os.ReadFile(filename)
	if err != nil {
		return nil, err
	}
	return semver.NewVersion(strings.TrimSpace(string(b)))
}

func bumpVersion(version *semver.Version, verb string) error {
	switch verb {
	case "major":
		*version = version.IncMajor()
	case "minor":
		*version = version.IncMinor()
	case "patch":
		*version = version.IncPatch()
	default:
		*version = *semver.MustParse(verb)
	}
	return nil
}

func changelog(version *semver.Version) error {
	// Open changelog target file
	b, err := os.ReadFile(changelogTarget)
	if err != nil {
		return err
	}

	// Get the current frontmatter
	currentChangelog := string(b)
	sections := strings.SplitN(currentChangelog, "---", 3)
	if len(sections) != 3 {
		return errors.New("error: invalid frontmatter")
	}
	frontmatter := strings.TrimSpace(sections[1])

	// Open changelog source file
	b, err = os.ReadFile(changelogSource)
	if err != nil {
		return err
	}
	changelog := string(b)
	date := time.Now().Format("2006-01-02")

	// Replace "Unreleased" with the new version and date
	changelog = changelogReleaseRegex.ReplaceAllString(changelog, fmt.Sprintf("## v%s - %s", version, date))

	// Write the changelog to the source file
	if err := os.WriteFile(changelogSource, []byte(changelog), 0o644); err != nil {
		return err
	}

	// Wrap the changelog content with v-pre directive for VitePress to prevent
	// Vue from interpreting template syntax like {{.TASK_VERSION}}
	changelogWithVPre := strings.Replace(changelog, "# Changelog\n\n", "# Changelog\n\n::: v-pre\n\n", 1) + "\n:::"

	// Add the frontmatter to the changelog
	changelogWithFrontmatter := fmt.Sprintf("---\n%s\n---\n\n%s", frontmatter, changelogWithVPre)

	// Write the changelog to the target file
	return os.WriteFile(changelogTarget, []byte(changelogWithFrontmatter), 0o644)
}

func setVersionFile(fileName string, version *semver.Version) error {
	return os.WriteFile(fileName, []byte(version.String()+"\n"), 0o644)
}


================================================
FILE: cmd/sleepit/sleepit.go
================================================
// This code is released under the MIT License
// Copyright (c) 2020 Marco Molteni and the timeit contributors.

package main

import (
	"flag"
	"fmt"
	"os"
	"os/signal"
	"time"
)

const usage = `sleepit: sleep for the specified duration, optionally handling signals
When the line "sleepit: ready" is printed, it means that it is safe to send signals to it
Usage: sleepit <command> [<args>]
Commands
  default     Use default action: on reception of SIGINT terminate abruptly
  handle      Handle signals: on reception of SIGINT perform cleanup before exiting
  version     Show the sleepit version`

// Filled by the linker.
var fullVersion = "unknown" // example: v0.0.9-8-g941583d027-dirty

func main() {
	os.Exit(run(os.Args[1:]))
}

func run(args []string) int {
	if len(args) < 1 {
		fmt.Fprintln(os.Stderr, usage)
		return 2
	}

	defaultCmd := flag.NewFlagSet("default", flag.ExitOnError)
	defaultSleep := defaultCmd.Duration("sleep", 5*time.Second, "Sleep duration")

	handleCmd := flag.NewFlagSet("handle", flag.ExitOnError)
	handleSleep := handleCmd.Duration("sleep", 5*time.Second, "Sleep duration")
	handleCleanup := handleCmd.Duration("cleanup", 5*time.Second, "Cleanup duration")
	handleTermAfter := handleCmd.Int("term-after", 0,
		"Terminate immediately after `N` signals.\n"+
			"Default is to terminate only when the cleanup phase has completed.")

	versionCmd := flag.NewFlagSet("version", flag.ExitOnError)

	switch args[0] {

	case "default":
		_ = defaultCmd.Parse(args[1:])
		if len(defaultCmd.Args()) > 0 {
			fmt.Fprintf(os.Stderr, "default: unexpected arguments: %v\n", defaultCmd.Args())
			return 2
		}
		return supervisor(*defaultSleep, 0, 0, nil)

	case "handle":
		_ = handleCmd.Parse(args[1:])
		if *handleTermAfter == 1 {
			fmt.Fprintf(os.Stderr, "handle: term-after cannot be 1\n")
			return 2
		}
		if len(handleCmd.Args()) > 0 {
			fmt.Fprintf(os.Stderr, "handle: unexpected arguments: %v\n", handleCmd.Args())
			return 2
		}
		sigCh := make(chan os.Signal, 1)
		signal.Notify(sigCh, os.Interrupt) // Ctrl-C -> SIGINT
		return supervisor(*handleSleep, *handleCleanup, *handleTermAfter, sigCh)

	case "version":
		_ = versionCmd.Parse(args[1:])
		if len(versionCmd.Args()) > 0 {
			fmt.Fprintf(os.Stderr, "version: unexpected arguments: %v\n", versionCmd.Args())
			return 2
		}
		fmt.Printf("sleepit version %s\n", fullVersion)
		return 0

	default:
		fmt.Fprintln(os.Stderr, usage)
		return 2
	}
}

func supervisor(
	sleep time.Duration,
	cleanup time.Duration,
	termAfter int,
	sigCh <-chan os.Signal,
) int {
	fmt.Printf("sleepit: ready\n")
	fmt.Printf("sleepit: PID=%d sleep=%v cleanup=%v\n",
		os.Getpid(), sleep, cleanup)

	cancelWork := make(chan struct{})
	workerDone := worker(cancelWork, sleep, "work")

	cancelCleaner := make(chan struct{})
	var cleanerDone <-chan struct{}

	sigCount := 0
	for {
		select {
		case sig := <-sigCh:
			sigCount++
			fmt.Printf("sleepit: got signal=%s count=%d\n", sig, sigCount)
			if sigCount == 1 {
				// since `cancelWork` is unbuffered, sending will be synchronous:
				// we are ensured that the worker has terminated before starting cleanup.
				// This is important in some real-life situations.
				cancelWork <- struct{}{}
				cleanerDone = worker(cancelCleaner, cleanup, "cleanup")
			}
			if sigCount == termAfter {
				cancelCleaner <- struct{}{}
				return 4
			}
		case <-workerDone:
			return 0
		case <-cleanerDone:
			return 3
		}
	}
}

// Start a worker goroutine and return immediately a `workerDone` channel.
// The goroutine will prepend its prints with the prefix `name`.
// The goroutine will simulate some work and will terminate when one of the following
// conditions happens:
//  1. When `howlong` is elapsed. This case will be signaled on the `workerDone` channel.
//  2. When something happens on channel `canceled`. Note that this simulates real-life,
//     so cancellation is not instantaneous: if the caller wants a synchronous cancel,
//     it should send a message; if instead it wants an asynchronous cancel, it should
//     close the channel.
func worker(
	canceled <-chan struct{},
	howlong time.Duration,
	name string,
) <-chan struct{} {
	workerDone := make(chan struct{})
	deadline := time.Now().Add(howlong)
	go func() {
		fmt.Printf("sleepit: %s started\n", name)
		for {
			select {
			case <-canceled:
				fmt.Printf("sleepit: %s canceled\n", name)
				return
			default:
				if doSomeWork(deadline) {
					fmt.Printf("sleepit: %s done\n", name) // <== NOTE THIS LINE
					workerDone <- struct{}{}
					return
				}
			}
		}
	}()
	return workerDone
}

// Do some work and then return, so that the caller can decide whether to continue or not.
// Return true when all work is done.
func doSomeWork(deadline time.Time) bool {
	if time.Now().After(deadline) {
		return true
	}
	timeout := 100 * time.Millisecond
	time.Sleep(timeout)
	return false
}


================================================
FILE: cmd/task/task.go
================================================
package main

import (
	"context"
	"fmt"
	"os"
	"path/filepath"
	"strconv"

	"github.com/spf13/pflag"

	"github.com/go-task/task/v3"
	"github.com/go-task/task/v3/args"
	"github.com/go-task/task/v3/errors"
	"github.com/go-task/task/v3/experiments"
	"github.com/go-task/task/v3/internal/filepathext"
	"github.com/go-task/task/v3/internal/flags"
	"github.com/go-task/task/v3/internal/logger"
	"github.com/go-task/task/v3/internal/version"
	"github.com/go-task/task/v3/taskfile/ast"
)

func main() {
	if err := run(); err != nil {
		l := &logger.Logger{
			Stdout:  os.Stdout,
			Stderr:  os.Stderr,
			Verbose: flags.Verbose,
			Color:   flags.Color,
		}
		if err, ok := err.(*errors.TaskRunError); ok && flags.ExitCode {
			emitCIErrorAnnotation(err)
			l.Errf(logger.Red, "%v\n", err)
			os.Exit(err.TaskExitCode())
		}
		if err, ok := err.(errors.TaskError); ok {
			emitCIErrorAnnotation(err)
			l.Errf(logger.Red, "%v\n", err)
			os.Exit(err.Code())
		}
		emitCIErrorAnnotation(err)
		l.Errf(logger.Red, "%v\n", err)
		os.Exit(errors.CodeUnknown)
	}
	os.Exit(errors.CodeOk)
}

// emitCIErrorAnnotation emits an error annotation for supported CI providers.
func emitCIErrorAnnotation(err error) {
	if isGA, _ := strconv.ParseBool(os.Getenv("GITHUB_ACTIONS")); !isGA {
		return
	}
	if e, ok := err.(*errors.TaskRunError); ok {
		fmt.Fprintf(os.Stdout, "::error title=Task '%s' failed::%v\n", e.TaskName, e.Err)
		return
	}
	fmt.Fprintf(os.Stdout, "::error title=Task failed::%v\n", err)
}

func run() error {
	log := &logger.Logger{
		Stdout:  os.Stdout,
		Stderr:  os.Stderr,
		Verbose: flags.Verbose,
		Color:   flags.Color,
	}

	if err := flags.Validate(); err != nil {
		return err
	}

	if err := experiments.Validate(); err != nil {
		log.Warnf("%s\n", err.Error())
	}

	if flags.Version {
		fmt.Println(version.GetVersionWithBuildInfo())
		return nil
	}

	if flags.Help {
		pflag.Usage()
		return nil
	}

	if flags.Experiments {
		return log.PrintExperiments()
	}

	if flags.Init {
		wd, err := os.Getwd()
		if err != nil {
			return err
		}
		args, _, err := args.Get()
		if err != nil {
			return err
		}
		path := wd
		if len(args) > 0 {
			name := args[0]
			if filepathext.IsExtOnly(name) {
				name = filepathext.SmartJoin(filepath.Dir(name), "Taskfile"+filepath.Ext(name))
			}
			path = filepathext.SmartJoin(wd, name)
		}
		finalPath, err := task.InitTaskfile(path)
		if err != nil {
			return err
		}
		if !flags.Silent {
			if flags.Verbose {
				log.Outf(logger.Default, "%s\n", task.DefaultTaskfile)
			}
			log.Outf(logger.Green, "Taskfile created: %s\n", filepathext.TryAbsToRel(finalPath))
		}
		return nil
	}

	if flags.Completion != "" {
		script, err := task.Completion(flags.Completion)
		if err != nil {
			return err
		}
		fmt.Println(script)
		return nil
	}

	e := task.NewExecutor(
		flags.WithFlags(),
		task.WithVersionCheck(true),
	)
	if err := e.Setup(); err != nil {
		return err
	}

	if flags.ClearCache {
		cachePath := filepath.Join(e.TempDir.Remote, "remote")
		return os.RemoveAll(cachePath)
	}

	listOptions := task.NewListOptions(
		flags.List,
		flags.ListAll,
		flags.ListJson,
		flags.NoStatus,
		flags.Nested,
	)
	if listOptions.ShouldListTasks() {
		if flags.Silent {
			return e.ListTaskNames(flags.ListAll)
		}
		foundTasks, err := e.ListTasks(listOptions)
		if err != nil {
			return err
		}
		if !foundTasks {
			os.Exit(errors.CodeUnknown)
		}
		return nil
	}

	// Parse the remaining arguments
	cliArgsPreDash, cliArgsPostDash, err := args.Get()
	if err != nil {
		return err
	}
	calls, globals := args.Parse(cliArgsPreDash...)

	// If there are no calls, run the default task instead
	if len(calls) == 0 {
		calls = append(calls, &task.Call{Task: "default"})
	}

	// Merge CLI variables first (e.g. FOO=bar) so they take priority over Taskfile defaults
	e.Taskfile.Vars.Merge(globals, nil)

	// Then ReverseMerge special variables so they're available for templating
	cliArgsPostDashQuoted, err := args.ToQuotedString(cliArgsPostDash)
	if err != nil {
		return err
	}
	specialVars := ast.NewVars()
	specialVars.Set("CLI_ARGS", ast.Var{Value: cliArgsPostDashQuoted})
	specialVars.Set("CLI_ARGS_LIST", ast.Var{Value: cliArgsPostDash})
	specialVars.Set("CLI_FORCE", ast.Var{Value: flags.Force || flags.ForceAll})
	specialVars.Set("CLI_SILENT", ast.Var{Value: flags.Silent})
	specialVars.Set("CLI_VERBOSE", ast.Var{Value: flags.Verbose})
	specialVars.Set("CLI_OFFLINE", ast.Var{Value: flags.Offline})
	specialVars.Set("CLI_ASSUME_YES", ast.Var{Value: flags.AssumeYes})
	e.Taskfile.Vars.ReverseMerge(specialVars, nil)
	if !flags.Watch {
		e.InterceptInterruptSignals()
	}

	ctx := context.Background()

	if flags.Status {
		return e.Status(ctx, calls...)
	}

	return e.Run(ctx, calls...)
}


================================================
FILE: compiler.go
================================================
package task

import (
	"bytes"
	"context"
	"fmt"
	"os"
	"path/filepath"
	"strings"
	"sync"

	"github.com/go-task/task/v3/internal/env"
	"github.com/go-task/task/v3/internal/execext"
	"github.com/go-task/task/v3/internal/filepathext"
	"github.com/go-task/task/v3/internal/logger"
	"github.com/go-task/task/v3/internal/templater"
	"github.com/go-task/task/v3/internal/version"
	"github.com/go-task/task/v3/taskfile/ast"
)

type Compiler struct {
	Dir            string
	Entrypoint     string
	UserWorkingDir string

	TaskfileEnv  *ast.Vars
	TaskfileVars *ast.Vars

	Logger *logger.Logger

	dynamicCache   map[string]string
	muDynamicCache sync.Mutex
}

func (c *Compiler) GetTaskfileVariables() (*ast.Vars, error) {
	return c.getVariables(nil, nil, true)
}

func (c *Compiler) GetVariables(t *ast.Task, call *Call) (*ast.Vars, error) {
	return c.getVariables(t, call, true)
}

func (c *Compiler) FastGetVariables(t *ast.Task, call *Call) (*ast.Vars, error) {
	return c.getVariables(t, call, false)
}

func (c *Compiler) getVariables(t *ast.Task, call *Call, evaluateShVars bool) (*ast.Vars, error) {
	result := env.GetEnviron()
	specialVars, err := c.getSpecialVars(t, call)
	if err != nil {
		return nil, err
	}
	for k, v := range specialVars {
		result.Set(k, ast.Var{Value: v})
	}

	getRangeFunc := func(dir string) func(k string, v ast.Var) error {
		return func(k string, v ast.Var) error {
			cache := &templater.Cache{Vars: result}
			// Replace values
			newVar := templater.ReplaceVar(v, cache)
			// If the variable should not be evaluated, but is nil, set it to an empty string
			// This stops empty interface errors when using the templater to replace values later
			// Preserve the Sh field so it can be displayed in summary
			if !evaluateShVars && newVar.Value == nil {
				result.Set(k, ast.Var{Value: "", Sh: newVar.Sh})
				return nil
			}
			// If the variable should not be evaluated and it is set, we can set it and return
			if !evaluateShVars {
				result.Set(k, ast.Var{Value: newVar.Value, Sh: newVar.Sh})
				return nil
			}
			// Now we can check for errors since we've handled all the cases when we don't want to evaluate
			if err := cache.Err(); err != nil {
				return err
			}
			// If the variable is already set, we can set it and return
			if newVar.Value != nil || newVar.Sh == nil {
				result.Set(k, ast.Var{Value: newVar.Value})
				return nil
			}
			// If the variable is dynamic, we need to resolve it first
			static, err := c.HandleDynamicVar(newVar, dir, env.GetFromVars(result))
			if err != nil {
				return err
			}
			result.Set(k, ast.Var{Value: static})
			return nil
		}
	}
	rangeFunc := getRangeFunc(c.Dir)

	var taskRangeFunc func(k string, v ast.Var) error
	if t != nil {
		// NOTE(@andreynering): We're manually joining these paths here because
		// this is the raw task, not the compiled one.
		cache := &templater.Cache{Vars: result}
		dir := templater.Replace(t.Dir, cache)
		if err := cache.Err(); err != nil {
			return nil, err
		}
		dir = filepathext.SmartJoin(c.Dir, dir)
		taskRangeFunc = getRangeFunc(dir)
	}

	for k, v := range c.TaskfileEnv.All() {
		if err := rangeFunc(k, v); err != nil {
			return nil, err
		}
	}
	for k, v := range c.TaskfileVars.All() {
		if err := rangeFunc(k, v); err != nil {
			return nil, err
		}
	}
	if t != nil {
		for k, v := range t.IncludeVars.All() {
			if err := rangeFunc(k, v); err != nil {
				return nil, err
			}
		}
		for k, v := range t.IncludedTaskfileVars.All() {
			if err := taskRangeFunc(k, v); err != nil {
				return nil, err
			}
		}
	}

	if t == nil || call == nil {
		return result, nil
	}

	for k, v := range call.Vars.All() {
		if err := rangeFunc(k, v); err != nil {
			return nil, err
		}
	}
	for k, v := range t.Vars.All() {
		if err := taskRangeFunc(k, v); err != nil {
			return nil, err
		}
	}

	return result, nil
}

func (c *Compiler) HandleDynamicVar(v ast.Var, dir string, e []string) (string, error) {
	c.muDynamicCache.Lock()
	defer c.muDynamicCache.Unlock()

	// If the variable is not dynamic or it is empty, return an empty string
	if v.Sh == nil || *v.Sh == "" {
		return "", nil
	}

	if c.dynamicCache == nil {
		c.dynamicCache = make(map[string]string, 30)
	}
	if result, ok := c.dynamicCache[*v.Sh]; ok {
		return result, nil
	}

	// NOTE(@andreynering): If a var have a specific dir, use this instead
	if v.Dir != "" {
		dir = v.Dir
	}

	var stdout bytes.Buffer
	opts := &execext.RunCommandOptions{
		Command: *v.Sh,
		Dir:     dir,
		Stdout:  &stdout,
		Stderr:  c.Logger.Stderr,
		Env:     e,
	}
	if err := execext.RunCommand(context.Background(), opts); err != nil {
		return "", fmt.Errorf(`task: Command "%s" failed: %s`, opts.Command, err)
	}

	// Trim a single trailing newline from the result to make most command
	// output easier to use in shell commands.
	result := strings.TrimSuffix(stdout.String(), "\r\n")
	result = strings.TrimSuffix(result, "\n")

	c.dynamicCache[*v.Sh] = result
	c.Logger.VerboseErrf(logger.Magenta, "task: dynamic variable: %q result: %q\n", *v.Sh, result)

	return result, nil
}

// ResetCache clear the dynamic variables cache
func (c *Compiler) ResetCache() {
	c.muDynamicCache.Lock()
	defer c.muDynamicCache.Unlock()

	c.dynamicCache = nil
}

func (c *Compiler) getSpecialVars(t *ast.Task, call *Call) (map[string]string, error) {
	allVars := map[string]string{
		"TASK_EXE":         filepath.ToSlash(os.Args[0]),
		"ROOT_TASKFILE":    filepathext.SmartJoin(c.Dir, c.Entrypoint),
		"ROOT_DIR":         c.Dir,
		"USER_WORKING_DIR": c.UserWorkingDir,
		"TASK_VERSION":     version.GetVersion(),
	}
	if t != nil {
		allVars["TASK"] = t.Task
		allVars["TASK_DIR"] = filepathext.SmartJoin(c.Dir, t.Dir)
		allVars["TASKFILE"] = t.Location.Taskfile
		allVars["TASKFILE_DIR"] = filepath.Dir(t.Location.Taskfile)
	} else {
		allVars["TASK"] = ""
		allVars["TASK_DIR"] = ""
		allVars["TASKFILE"] = ""
		allVars["TASKFILE_DIR"] = ""
	}
	if call != nil {
		allVars["ALIAS"] = call.Task
	} else {
		allVars["ALIAS"] = ""
	}

	return allVars, nil
}


================================================
FILE: completion/bash/task.bash
================================================
# vim: set tabstop=2 shiftwidth=2 expandtab:

_GO_TASK_COMPLETION_LIST_OPTION='--list-all'
TASK_CMD="${TASK_EXE:-task}"

function _task()
{
  local cur prev words cword
  _init_completion -n : || return

  # Check for `--` within command-line and quit or strip suffix.
  local i
  for i in "${!words[@]}"; do
    if [ "${words[$i]}" == "--" ]; then
      # Do not complete words following `--` passed to CLI_ARGS.
      [ $cword -gt $i ] && return
      # Remove the words following `--` to not put --list in CLI_ARGS.
      words=( "${words[@]:0:$i}" )
      break
    fi
  done

  # Handle special arguments of options.
  case "$prev" in
    -d|--dir|--remote-cache-dir)
      _filedir -d
      return $?
    ;;
    --cacert|--cert|--cert-key)
      _filedir
      return $?
    ;;
    -t|--taskfile)
      _filedir yaml || return $?
      _filedir yml
      return $?
    ;;
    -o|--output)
      COMPREPLY=( $( compgen -W "interleaved group prefixed" -- $cur ) )
      return 0
    ;;
  esac

  # Handle normal options.
  case "$cur" in
    -*)
      COMPREPLY=( $( compgen -W "$(_parse_help $1)" -- $cur ) )
      return 0
    ;;
  esac

  # Prepare task name completions.
  local tasks=( $( "${words[@]}" --silent $_GO_TASK_COMPLETION_LIST_OPTION 2> /dev/null ) )
  COMPREPLY=( $( compgen -W "${tasks[*]}" -- "$cur" ) )

  # Post-process because task names might contain colons.
  __ltrim_colon_completions "$cur"
}

complete -F _task "$TASK_CMD"


================================================
FILE: completion/fish/task.fish
================================================
set -l GO_TASK_PROGNAME (if set -q GO_TASK_PROGNAME; echo $GO_TASK_PROGNAME; else if set -q TASK_EXE; echo $TASK_EXE; else; echo task; end)

# Cache variables for experiments (global)
set -g __task_experiments_cache ""
set -g __task_experiments_cache_time 0

# Helper function to get experiments with 1-second cache
function __task_get_experiments
    set -l now (date +%s)
    set -l ttl 1  # Cache for 1 second only

    # Return cached value if still valid
    if test (math "$now - $__task_experiments_cache_time") -lt $ttl
        printf '%s\n' $__task_experiments_cache
        return
    end

    # Refresh cache
    set -g __task_experiments_cache (task --experiments 2>/dev/null)
    set -g __task_experiments_cache_time $now
    printf '%s\n' $__task_experiments_cache
end

# Helper function to check if an experiment is enabled
function __task_is_experiment_enabled
    set -l experiment $argv[1]
    __task_get_experiments | string match -qr "^\* $experiment:.*on"
end

function __task_get_tasks --description "Prints all available tasks with their description" --inherit-variable GO_TASK_PROGNAME
  # Check if the global task is requested
  set -l global_task false
  commandline --current-process | read --tokenize --list --local cmd_args
  for arg in $cmd_args
    if test "_$arg" = "_--"
      break # ignore arguments to be passed to the task
    end
    if test "_$arg" = "_--global" -o "_$arg" = "_-g"
      set global_task true
      break
    end
  end

  # Read the list of tasks (and potential errors)
  if $global_task
    $GO_TASK_PROGNAME --global --list-all
  else
    $GO_TASK_PROGNAME --list-all
  end 2>&1 | read -lz rawOutput

  # Return on non-zero exit code (for cases when there is no Taskfile found or etc.)
  if test $status -ne 0
    return
  end

  # Grab names and descriptions (if any) of the tasks
  set -l output (echo $rawOutput | sed -e '1d; s/\* \(.*\):[[:space:]]\{2,\}\(.*\)[[:space:]]\{2,\}(\(aliases.*\))/\1\t\2\t\3/' -e 's/\* \(.*\):[[:space:]]\{2,\}\(.*\)/\1\t\2/'| string split0)
  if test $output
    echo $output
  end
end

complete -c $GO_TASK_PROGNAME \
  -d 'Runs the specified task(s). Falls back to the "default" task if no task name was specified, or lists all tasks if an unknown task name was specified.' \
  -xa "(__task_get_tasks)" \
  -n "not __fish_seen_subcommand_from --"

# Standard flags
complete -c $GO_TASK_PROGNAME -s a -l list-all                  -d 'list all tasks'
complete -c $GO_TASK_PROGNAME -s c -l color                     -d 'colored output (default true)'
complete -c $GO_TASK_PROGNAME -s C -l concurrency               -d 'limit number of concurrent tasks'
complete -c $GO_TASK_PROGNAME      -l completion                -d 'generate shell completion script' -xa "bash zsh fish powershell"
complete -c $GO_TASK_PROGNAME -s d -l dir                       -d 'set directory of execution'
complete -c $GO_TASK_PROGNAME      -l disable-fuzzy             -d 'disable fuzzy matching for task names'
complete -c $GO_TASK_PROGNAME -s n -l dry                       -d 'compile and print tasks without executing'
complete -c $GO_TASK_PROGNAME -s x -l exit-code                 -d 'pass-through exit code of task command'
complete -c $GO_TASK_PROGNAME      -l experiments               -d 'list available experiments'
complete -c $GO_TASK_PROGNAME -s F -l failfast                  -d 'when running tasks in parallel, stop all tasks if one fails'
complete -c $GO_TASK_PROGNAME -s f -l force                     -d 'force execution even when up-to-date'
complete -c $GO_TASK_PROGNAME -s g -l global                    -d 'run global Taskfile from home directory'
complete -c $GO_TASK_PROGNAME -s h -l help                      -d 'show help'
complete -c $GO_TASK_PROGNAME -s i -l init                      -d 'create new Taskfile'
complete -c $GO_TASK_PROGNAME      -l insecure                  -d 'allow insecure Taskfile downloads'
complete -c $GO_TASK_PROGNAME -s I -l interval                  -d 'interval to watch for changes'
complete -c $GO_TASK_PROGNAME -s j -l json                      -d 'format task list as JSON'
complete -c $GO_TASK_PROGNAME -s l -l list                      -d 'list tasks with descriptions'
complete -c $GO_TASK_PROGNAME      -l nested                    -d 'nest namespaces when listing as JSON'
complete -c $GO_TASK_PROGNAME      -l no-status                 -d 'ignore status when listing as JSON'
complete -c $GO_TASK_PROGNAME      -l interactive               -d 'prompt for missing required variables'
complete -c $GO_TASK_PROGNAME -s o -l output                    -d 'set output style' -xa "interleaved group prefixed"
complete -c $GO_TASK_PROGNAME      -l output-group-begin        -d 'message template before grouped output'
complete -c $GO_TASK_PROGNAME      -l output-group-end          -d 'message template after grouped output'
complete -c $GO_TASK_PROGNAME      -l output-group-error-only   -d 'hide output from successful tasks'
complete -c $GO_TASK_PROGNAME -s p -l parallel                  -d 'execute tasks in parallel'
complete -c $GO_TASK_PROGNAME -s s -l silent                    -d 'disable echoing'
complete -c $GO_TASK_PROGNAME      -l sort                      -d 'set task sorting order' -xa "default alphanumeric none"
complete -c $GO_TASK_PROGNAME      -l status                    -d 'exit non-zero if tasks not up-to-date'
complete -c $GO_TASK_PROGNAME      -l summary                   -d 'show task summary'
complete -c $GO_TASK_PROGNAME -s t -l taskfile                  -d 'choose Taskfile to run'
complete -c $GO_TASK_PROGNAME -s v -l verbose                   -d 'verbose output'
complete -c $GO_TASK_PROGNAME      -l version                   -d 'show version'
complete -c $GO_TASK_PROGNAME -s w -l watch                     -d 'watch mode, re-run on changes'
complete -c $GO_TASK_PROGNAME -s y -l yes                       -d 'assume yes to all prompts'

# Experimental flags (dynamically checked at completion time via -n condition)
# GentleForce experiment
complete -c $GO_TASK_PROGNAME -n "__task_is_experiment_enabled GENTLE_FORCE" -l force-all -d 'force execution of task and all dependencies'

# RemoteTaskfiles experiment - Options
complete -c $GO_TASK_PROGNAME -n "__task_is_experiment_enabled REMOTE_TASKFILES" -l offline          -d 'use only local or cached Taskfiles'
complete -c $GO_TASK_PROGNAME -n "__task_is_experiment_enabled REMOTE_TASKFILES" -l timeout          -d 'timeout for remote Taskfile downloads'
complete -c $GO_TASK_PROGNAME -n "__task_is_experiment_enabled REMOTE_TASKFILES" -l expiry           -d 'cache expiry duration'
complete -c $GO_TASK_PROGNAME -n "__task_is_experiment_enabled REMOTE_TASKFILES" -l remote-cache-dir -d 'directory to cache remote Taskfiles' -xa "(__fish_complete_directories)"
complete -c $GO_TASK_PROGNAME -n "__task_is_experiment_enabled REMOTE_TASKFILES" -l cacert           -d 'custom CA certificate for TLS' -r
complete -c $GO_TASK_PROGNAME -n "__task_is_experiment_enabled REMOTE_TASKFILES" -l cert             -d 'client certificate for mTLS' -r
complete -c $GO_TASK_PROGNAME -n "__task_is_experiment_enabled REMOTE_TASKFILES" -l cert-key         -d 'client certificate private key' -r

# RemoteTaskfiles experiment - Operations
complete -c $GO_TASK_PROGNAME -n "__task_is_experiment_enabled REMOTE_TASKFILES" -l download    -d 'download remote Taskfile'
complete -c $GO_TASK_PROGNAME -n "__task_is_experiment_enabled REMOTE_TASKFILES" -l clear-cache -d 'clear remote Taskfile cache'


================================================
FILE: completion/ps/task.ps1
================================================
using namespace System.Management.Automation

Register-ArgumentCompleter -CommandName task -ScriptBlock {
	param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)

	if ($commandName.StartsWith('-')) {
		$completions = @(
			# Standard flags (alphabetical order)
			[CompletionResult]::new('-a', '-a', [CompletionResultType]::ParameterName, 'list all tasks'),
			[CompletionResult]::new('--list-all', '--list-all', [CompletionResultType]::ParameterName, 'list all tasks'),
			[CompletionResult]::new('-c', '-c', [CompletionResultType]::ParameterName, 'colored output'),
			[CompletionResult]::new('--color', '--color', [CompletionResultType]::ParameterName, 'colored output'),
			[CompletionResult]::new('-C', '-C', [CompletionResultType]::ParameterName, 'limit concurrent tasks'),
			[CompletionResult]::new('--concurrency', '--concurrency', [CompletionResultType]::ParameterName, 'limit concurrent tasks'),
			[CompletionResult]::new('--completion', '--completion', [CompletionResultType]::ParameterName, 'generate shell completion'),
			[CompletionResult]::new('-d', '-d', [CompletionResultType]::ParameterName, 'set directory'),
			[CompletionResult]::new('--dir', '--dir', [CompletionResultType]::ParameterName, 'set directory'),
			[CompletionResult]::new('--disable-fuzzy', '--disable-fuzzy', [CompletionResultType]::ParameterName, 'disable fuzzy matching'),
			[CompletionResult]::new('-n', '-n', [CompletionResultType]::ParameterName, 'dry run'),
			[CompletionResult]::new('--dry', '--dry', [CompletionResultType]::ParameterName, 'dry run'),
			[CompletionResult]::new('-x', '-x', [CompletionResultType]::ParameterName, 'pass-through exit code'),
			[CompletionResult]::new('--exit-code', '--exit-code', [CompletionResultType]::ParameterName, 'pass-through exit code'),
			[CompletionResult]::new('--experiments', '--experiments', [CompletionResultType]::ParameterName, 'list experiments'),
			[CompletionResult]::new('-F', '-F', [CompletionResultType]::ParameterName, 'fail fast on pallalel tasks'),
			[CompletionResult]::new('--failfast', '--failfast', [CompletionResultType]::ParameterName, 'force execution'),
			[CompletionResult]::new('-f', '-f', [CompletionResultType]::ParameterName, 'force execution'),
			[CompletionResult]::new('--force', '--force', [CompletionResultType]::ParameterName, 'force execution'),
			[CompletionResult]::new('-g', '-g', [CompletionResultType]::ParameterName, 'run global Taskfile'),
			[CompletionResult]::new('--global', '--global', [CompletionResultType]::ParameterName, 'run global Taskfile'),
			[CompletionResult]::new('-h', '-h', [CompletionResultType]::ParameterName, 'show help'),
			[CompletionResult]::new('--help', '--help', [CompletionResultType]::ParameterName, 'show help'),
			[CompletionResult]::new('-i', '-i', [CompletionResultType]::ParameterName, 'create new Taskfile'),
			[CompletionResult]::new('--init', '--init', [CompletionResultType]::ParameterName, 'create new Taskfile'),
			[CompletionResult]::new('--insecure', '--insecure', [CompletionResultType]::ParameterName, 'allow insecure downloads'),
			[CompletionResult]::new('-I', '-I', [CompletionResultType]::ParameterName, 'watch interval'),
			[CompletionResult]::new('--interval', '--interval', [CompletionResultType]::ParameterName, 'watch interval'),
			[CompletionResult]::new('-j', '-j', [CompletionResultType]::ParameterName, 'format as JSON'),
			[CompletionResult]::new('--json', '--json', [CompletionResultType]::ParameterName, 'format as JSON'),
			[CompletionResult]::new('-l', '-l', [CompletionResultType]::ParameterName, 'list tasks'),
			[CompletionResult]::new('--list', '--list', [CompletionResultType]::ParameterName, 'list tasks'),
			[CompletionResult]::new('--nested', '--nested', [CompletionResultType]::ParameterName, 'nest namespaces in JSON'),
			[CompletionResult]::new('--no-status', '--no-status', [CompletionResultType]::ParameterName, 'ignore status in JSON'),
			[CompletionResult]::new('--interactive', '--interactive', [CompletionResultType]::ParameterName, 'prompt for missing required variables'),
			[CompletionResult]::new('-o', '-o', [CompletionResultType]::ParameterName, 'set output style'),
			[CompletionResult]::new('--output', '--output', [CompletionResultType]::ParameterName, 'set output style'),
			[CompletionResult]::new('--output-group-begin', '--output-group-begin', [CompletionResultType]::ParameterName, 'template before group'),
			[CompletionResult]::new('--output-group-end', '--output-group-end', [CompletionResultType]::ParameterName, 'template after group'),
			[CompletionResult]::new('--output-group-error-only', '--output-group-error-only', [CompletionResultType]::ParameterName, 'hide successful output'),
			[CompletionResult]::new('-p', '-p', [CompletionResultType]::ParameterName, 'execute in parallel'),
			[CompletionResult]::new('--parallel', '--parallel', [CompletionResultType]::ParameterName, 'execute in parallel'),
			[CompletionResult]::new('-s', '-s', [CompletionResultType]::ParameterName, 'silent mode'),
			[CompletionResult]::new('--silent', '--silent', [CompletionResultType]::ParameterName, 'silent mode'),
			[CompletionResult]::new('--sort', '--sort', [CompletionResultType]::ParameterName, 'task sorting order'),
			[CompletionResult]::new('--status', '--status', [CompletionResultType]::ParameterName, 'check task status'),
			[CompletionResult]::new('--summary', '--summary', [CompletionResultType]::ParameterName, 'show task summary'),
			[CompletionResult]::new('-t', '-t', [CompletionResultType]::ParameterName, 'choose Taskfile'),
			[CompletionResult]::new('--taskfile', '--taskfile', [CompletionResultType]::ParameterName, 'choose Taskfile'),
			[CompletionResult]::new('-v', '-v', [CompletionResultType]::ParameterName, 'verbose output'),
			[CompletionResult]::new('--verbose', '--verbose', [CompletionResultType]::ParameterName, 'verbose output'),
			[CompletionResult]::new('--version', '--version', [CompletionResultType]::ParameterName, 'show version'),
			[CompletionResult]::new('-w', '-w', [CompletionResultType]::ParameterName, 'watch mode'),
			[CompletionResult]::new('--watch', '--watch', [CompletionResultType]::ParameterName, 'watch mode'),
			[CompletionResult]::new('-y', '-y', [CompletionResultType]::ParameterName, 'assume yes'),
			[CompletionResult]::new('--yes', '--yes', [CompletionResultType]::ParameterName, 'assume yes')
		)

		# Experimental flags (dynamically added based on enabled experiments)
		$experiments = & task --experiments 2>$null | Out-String

		if ($experiments -match '\* GENTLE_FORCE:.*on') {
			$completions += [CompletionResult]::new('--force-all', '--force-all', [CompletionResultType]::ParameterName, 'force all dependencies')
		}

		if ($experiments -match '\* REMOTE_TASKFILES:.*on') {
			# Options
			$completions += [CompletionResult]::new('--offline', '--offline', [CompletionResultType]::ParameterName, 'use cached Taskfiles')
			$completions += [CompletionResult]::new('--timeout', '--timeout', [CompletionResultType]::ParameterName, 'download timeout')
			$completions += [CompletionResult]::new('--expiry', '--expiry', [CompletionResultType]::ParameterName, 'cache expiry')
			$completions += [CompletionResult]::new('--remote-cache-dir', '--remote-cache-dir', [CompletionResultType]::ParameterName, 'cache directory')
			$completions += [CompletionResult]::new('--cacert', '--cacert', [CompletionResultType]::ParameterName, 'custom CA certificate')
			$completions += [CompletionResult]::new('--cert', '--cert', [CompletionResultType]::ParameterName, 'client certificate')
			$completions += [CompletionResult]::new('--cert-key', '--cert-key', [CompletionResultType]::ParameterName, 'client private key')
			# Operations
			$completions += [CompletionResult]::new('--download', '--download', [CompletionResultType]::ParameterName, 'download remote Taskfile')
			$completions += [CompletionResult]::new('--clear-cache', '--clear-cache', [CompletionResultType]::ParameterName, 'clear cache')
		}

		return $completions.Where{ $_.CompletionText.StartsWith($commandName) }
	}

	return 	$(task --list-all --silent) | Where-Object { $_.StartsWith($commandName) } | ForEach-Object { return $_ + " " }
}


================================================
FILE: completion/zsh/_task
================================================
#compdef task
typeset -A opt_args
TASK_CMD="${TASK_EXE:-task}"
compdef _task "$TASK_CMD"

_GO_TASK_COMPLETION_LIST_OPTION="${GO_TASK_COMPLETION_LIST_OPTION:---list-all}"

# Check if an experiment is enabled
function __task_is_experiment_enabled() {
    local experiment=$1
    task --experiments 2>/dev/null | grep -q "^\* ${experiment}:.*on"
}

# Listing commands from Taskfile.yml
function __task_list() {
    local -a scripts cmd
    local -i enabled=0
    local taskfile item task desc

    cmd=($TASK_CMD)
    taskfile=${(Qv)opt_args[(i)-t|--taskfile]}
    taskfile=${taskfile//\~/$HOME}

    for arg in "${words[@]:0:$CURRENT}"; do
        if [[ "$arg" = "--" ]]; then
            # Use default completion for words after `--` as they are CLI_ARGS.
            _default
            return 0
        fi
    done

    if [[ -n "$taskfile" && -f "$taskfile" ]]; then
        cmd+=(--taskfile "$taskfile")
    fi

    # Check if global flag is set
    if (( ${+opt_args[-g]} || ${+opt_args[--global]} )); then
        cmd+=(--global)
    fi

    if output=$("${cmd[@]}" $_GO_TASK_COMPLETION_LIST_OPTION 2>/dev/null); then
        enabled=1
    fi

    (( enabled )) || return 0

    scripts=()

    # Read zstyle verbose option (default = true via -T)
    local show_desc
    zstyle -T ":completion:${curcontext}:" verbose && show_desc=true || show_desc=false

    for item in "${(@)${(f)output}[2,-1]#\* }"; do
        task="${item%%:[[:space:]]*}"

        if [[ "$show_desc" == "true" ]]; then
            local desc="${item##[^[:space:]]##[[:space:]]##}"
            scripts+=( "${task//:/\\:}:$desc" )
        else
            scripts+=( "$task" )
        fi
    done

    if [[ "$show_desc" == "true" ]]; then
        _describe 'Task to run' scripts
    else
        compadd -Q -a scripts
    fi
}

_task() {
    local -a standard_args operation_args

    standard_args=(
        '(-C --concurrency)'{-C,--concurrency}'[limit number of concurrent tasks]: '
        '(-p --parallel)'{-p,--parallel}'[run command-line tasks in parallel]'
        '(-F --failfast)'{-F,--failfast}'[when running tasks in parallel, stop all tasks if one fails]'
        '(-f --force)'{-f,--force}'[run even if task is up-to-date]'
        '(-c --color)'{-c,--color}'[colored output]'
        '(--completion)--completion[generate shell completion script]:shell:(bash zsh fish powershell)'
        '(-d --dir)'{-d,--dir}'[dir to run in]:execution dir:_dirs'
        '(--disable-fuzzy)--disable-fuzzy[disable fuzzy matching for task names]'
        '(-n --dry)'{-n,--dry}'[compiles and prints tasks without executing]'
        '(--dry)--dry[dry-run mode, compile and print tasks only]'
        '(-x --exit-code)'{-x,--exit-code}'[pass-through exit code of task command]'
        '(--experiments)--experiments[list available experiments]'
        '(-g --global)'{-g,--global}'[run global Taskfile from home directory]'
        '(--insecure)--insecure[allow insecure Taskfile downloads]'
        '(-I --interval)'{-I,--interval}'[interval to watch for changes]:duration: '
        '(-j --json)'{-j,--json}'[format task list as JSON]'
        '(--nested)--nested[nest namespaces when listing as JSON]'
        '(--no-status)--no-status[ignore status when listing as JSON]'
        '(--interactive)--interactive[prompt for missing required variables]'
        '(-o --output)'{-o,--output}'[set output style]:style:(interleaved group prefixed)'
        '(--output-group-begin)--output-group-begin[message template before grouped output]:template text: '
        '(--output-group-end)--output-group-end[message template after grouped output]:template text: '
        '(--output-group-error-only)--output-group-error-only[hide output from successful tasks]'
        '(-s --silent)'{-s,--silent}'[disable echoing]'
        '(--sort)--sort[set task sorting order]:order:(default alphanumeric none)'
        '(--status)--status[exit non-zero if supplied tasks not up-to-date]'
        '(--summary)--summary[show summary\: field from tasks instead of running them]'
        '(-t --taskfile)'{-t,--taskfile}'[specify a different taskfile]:taskfile:_files'
        '(-v --verbose)'{-v,--verbose}'[verbose mode]'
        '(-w --watch)'{-w,--watch}'[watch-mode for given tasks, re-run when inputs change]'
        '(-y --yes)'{-y,--yes}'[assume yes to all prompts]'
    )

    # Experimental flags (dynamically added based on enabled experiments)
    # Options (modify behavior)
    if __task_is_experiment_enabled "GENTLE_FORCE"; then
        standard_args+=('(--force-all)--force-all[force execution of task and all dependencies]')
    fi

    if __task_is_experiment_enabled "REMOTE_TASKFILES"; then
        standard_args+=(
            '(--offline --download)--offline[use only local or cached Taskfiles]'
            '(--timeout)--timeout[timeout for remote Taskfile downloads]:duration: '
            '(--expiry)--expiry[cache expiry duration]:duration: '
            '(--remote-cache-dir)--remote-cache-dir[directory to cache remote Taskfiles]:cache dir:_dirs'
            '(--cacert)--cacert[custom CA certificate for TLS]:file:_files'
            '(--cert)--cert[client certificate for mTLS]:file:_files'
            '(--cert-key)--cert-key[client certificate private key]:file:_files'
        )
    fi

    operation_args=(
        # Task names completion (can be specified multiple times)
        '(operation)*: :__task_list'
        # Operational args completion (mutually exclusive)
        + '(operation)'
            '(*)'{-l,--list}'[list describable tasks]'
            '(*)'{-a,--list-all}'[list all tasks]'
            '(*)'{-i,--init}'[create new Taskfile.yml]'
            '(- *)'{-h,--help}'[show help]'
            '(- *)--version[show version and exit]'
    )

    # Experimental operations (dynamically added based on enabled experiments)
    if __task_is_experiment_enabled "REMOTE_TASKFILES"; then
        standard_args+=(
            '(--offline --clear-cache)--download[download remote Taskfile]'
        )
        operation_args+=(
            '(* --download)--clear-cache[clear remote Taskfile cache]'
        )
    fi

    _arguments -S $standard_args $operation_args
}

# don't run the completion function when being source-ed or eval-ed
if [ "$funcstack[1]" = "_task" ]; then
    _task "$@"
fi


================================================
FILE: completion.go
================================================
package task

import (
	_ "embed"
	"fmt"
)

//go:embed completion/bash/task.bash
var completionBash string

//go:embed completion/fish/task.fish
var completionFish string

//go:embed completion/ps/task.ps1
var completionPowershell string

//go:embed completion/zsh/_task
var completionZsh string

func Completion(completion string) (string, error) {
	// Get the file extension for the selected shell
	switch completion {
	case "bash":
		return completionBash, nil
	case "fish":
		return completionFish, nil
	case "powershell":
		return completionPowershell, nil
	case "zsh":
		return completionZsh, nil
	default:
		return "", fmt.Errorf("unknown shell: %s", completion)
	}
}


================================================
FILE: concurrency.go
================================================
package task

func (e *Executor) acquireConcurrencyLimit() func() {
	if e.concurrencySemaphore == nil {
		return emptyFunc
	}

	e.concurrencySemaphore <- struct{}{}
	return func() {
		<-e.concurrencySemaphore
	}
}

func (e *Executor) releaseConcurrencyLimit() func() {
	if e.concurrencySemaphore == nil {
		return emptyFunc
	}

	<-e.concurrencySemaphore
	return func() {
		e.concurrencySemaphore <- struct{}{}
	}
}

func emptyFunc() {}


================================================
FILE: errors/error_taskfile_decode.go
================================================
package errors

import (
	"bytes"
	"cmp"
	"errors"
	"fmt"
	"strings"

	"github.com/fatih/color"
	"go.yaml.in/yaml/v3"
)

type (
	TaskfileDecodeError struct {
		Message  string
		Location string
		Line     int
		Column   int
		Tag      string
		Snippet  string
		Err      error
	}
)

func NewTaskfileDecodeError(err error, node *yaml.Node) *TaskfileDecodeError {
	// If the error is already a DecodeError, return it
	taskfileInvalidErr := &TaskfileDecodeError{}
	if errors.As(err, &taskfileInvalidErr) {
		return taskfileInvalidErr
	}
	return &TaskfileDecodeError{
		Line:   node.Line,
		Column: node.Column,
		Tag:    node.ShortTag(),
		Err:    err,
	}
}

func (err *TaskfileDecodeError) Error() string {
	buf := &bytes.Buffer{}

	// Print the error message
	if err.Message != "" {
		fmt.Fprintln(buf, color.RedString("err:  %s", err.Message))
	} else {
		// Extract the errors from the TypeError
		te := &yaml.TypeError{}
		if errors.As(err.Err, &te) {
			if len(te.Errors) > 1 {
				fmt.Fprintln(buf, color.RedString("errs:"))
				for _, message := range te.Errors {
					fmt.Fprintln(buf, color.RedString("- %s", message))
				}
			} else {
				fmt.Fprintln(buf, color.RedString("err:  %s", te.Errors[0]))
			}
		} else {
			// Otherwise print the error message normally
			fmt.Fprintln(buf, color.RedString("err:  %s", err.Err))
		}
	}
	fmt.Fprintln(buf, color.RedString("file: %s:%d:%d", err.Location, err.Line, err.Column))
	fmt.Fprint(buf, err.Snippet)
	return buf.String()
}

func (err *TaskfileDecodeError) Debug() string {
	const indentWidth = 2
	buf := &bytes.Buffer{}
	fmt.Fprintln(buf, "TaskfileDecodeError:")

	// Recursively loop through the error chain and print any details
	var debug func(error, int)
	debug = func(err error, indent int) {
		indentStr := strings.Repeat(" ", indent*indentWidth)

		// Nothing left to unwrap
		if err == nil {
			fmt.Fprintf(buf, "%sEnd of chain\n", indentStr)
			return
		}

		// Taskfile decode error
		decodeErr := &TaskfileDecodeError{}
		if errors.As(err, &decodeErr) {
			fmt.Fprintf(buf, "%s%s (%s:%d:%d)\n",
				indentStr,
				cmp.Or(decodeErr.Message, "<no_message>"),
				decodeErr.Location,
				decodeErr.Line,
				decodeErr.Column,
			)
			debug(errors.Unwrap(err), indent+1)
			return
		}

		fmt.Fprintf(buf, "%s%s\n", indentStr, err)
		debug(errors.Unwrap(err), indent+1)
	}
	debug(err, 0)
	return buf.String()
}

func (err *TaskfileDecodeError) Unwrap() error {
	return err.Err
}

func (err *TaskfileDecodeError) Code() int {
	return CodeTaskfileDecode
}

func (err *TaskfileDecodeError) WithMessage(format string, a ...any) *TaskfileDecodeError {
	err.Message = fmt.Sprintf(format, a...)
	return err
}

func (err *TaskfileDecodeError) WithTypeMessage(t string) *TaskfileDecodeError {
	err.Message = fmt.Sprintf("cannot unmarshal %s into %s", err.Tag, t)
	return err
}

func (err *TaskfileDecodeError) WithFileInfo(location string, snippet string) *TaskfileDecodeError {
	err.Location = location
	err.Snippet = snippet
	return err
}


================================================
FILE: errors/errors.go
================================================
package errors

import "errors"

// General exit codes
const (
	CodeOk      int = iota // Used when the program exits without errors
	CodeUnknown            // Used when no other exit code is appropriate
)

// TaskRC related exit codes
const (
	CodeTaskRCNotFoundError int = iota + 50
)

// Taskfile related exit codes
const (
	CodeTaskfileNotFound int = iota + 100
	CodeTaskfileAlreadyExists
	CodeTaskfileDecode
	CodeTaskfileFetchFailed
	CodeTaskfileNotTrusted
	CodeTaskfileNotSecure
	CodeTaskfileCacheNotFound
	CodeTaskfileVersionCheckError
	CodeTaskfileNetworkTimeout
	CodeTaskfileInvalid
	CodeTaskfileCycle
	CodeTaskfileDoesNotMatchChecksum
)

// Task related exit codes
const (
	CodeTaskNotFound int = iota + 200
	CodeTaskRunError
	CodeTaskInternal
	CodeTaskNameConflict
	CodeTaskCalledTooManyTimes
	CodeTaskCancelled
	CodeTaskMissingRequiredVars
	CodeTaskNotAllowedVars
)

// TaskError extends the standard error interface with a Code method. This code will
// be used as the exit code of the program which allows the user to distinguish
// between different types of errors.
type TaskError interface {
	error
	Code() int
}

// New returns an error that formats as the given text. Each call to New returns
// a distinct error value even if the text is identical. This wraps the standard
// errors.New function so that we don't need to alias that package.
func New(text string) error {
	return errors.New(text)
}

// Is wraps the standard errors.Is function so that we don't need to alias that package.
func Is(err, target error) bool {
	return errors.Is(err, target)
}

// As wraps the standard errors.As function so that we don't need to alias that package.
func As(err error, target any) bool {
	return errors.As(err, target)
}

// Unwrap wraps the standard errors.Unwrap function so that we don't need to alias that package.
func Unwrap(err error) error {
	return errors.Unwrap(err)
}


================================================
FILE: errors/errors_task.go
================================================
package errors

import (
	"errors"
	"fmt"
	"strings"

	"mvdan.cc/sh/v3/interp"
)

// TaskNotFoundError is returned when the specified task is not found in the
// Taskfile.
type TaskNotFoundError struct {
	TaskName   string
	DidYouMean string
}

func (err *TaskNotFoundError) Error() string {
	if err.DidYouMean != "" {
		return fmt.Sprintf(
			`task: Task %q does not exist. Did you mean %q?`,
			err.TaskName,
			err.DidYouMean,
		)
	}

	return fmt.Sprintf(`task: Task %q does not exist`, err.TaskName)
}

func (err *TaskNotFoundError) Code() int {
	return CodeTaskNotFound
}

// TaskRunError is returned when a command in a task returns a non-zero exit
// code.
type TaskRunError struct {
	TaskName string
	Err      error
}

func (err *TaskRunError) Error() string {
	return fmt.Sprintf(`task: Failed to run task %q: %v`, err.TaskName, err.Err)
}

func (err *TaskRunError) Code() int {
	return CodeTaskRunError
}

func (err *TaskRunError) TaskExitCode() int {
	var exit interp.ExitStatus
	if errors.As(err.Err, &exit) {
		return int(exit)
	}
	return err.Code()
}

func (err *TaskRunError) Unwrap() error {
	return err.Err
}

// TaskInternalError when the user attempts to invoke a task that is internal.
type TaskInternalError struct {
	TaskName string
}

func (err *TaskInternalError) Error() string {
	return fmt.Sprintf(`task: Task "%s" is internal`, err.TaskName)
}

func (err *TaskInternalError) Code() int {
	return CodeTaskInternal
}

// TaskNameConflictError is returned when multiple tasks with a matching name or
// alias are found.
type TaskNameConflictError struct {
	Call      string
	TaskNames []string
}

func (err *TaskNameConflictError) Error() string {
	return fmt.Sprintf(`task: Found multiple tasks (%s) that match %q`, strings.Join(err.TaskNames, ", "), err.Call)
}

func (err *TaskNameConflictError) Code() int {
	return CodeTaskNameConflict
}

type TaskNameFlattenConflictError struct {
	TaskName string
	Include  string
}

func (err *TaskNameFlattenConflictError) Error() string {
	return fmt.Sprintf(`task: Found multiple tasks (%s) included by "%s""`, err.TaskName, err.Include)
}

func (err *TaskNameFlattenConflictError) Code() int {
	return CodeTaskNameConflict
}

// TaskCalledTooManyTimesError is returned when the maximum task call limit is
// exceeded. This is to prevent infinite loops and cyclic dependencies.
type TaskCalledTooManyTimesError struct {
	TaskName        string
	MaximumTaskCall int
}

func (err *TaskCalledTooManyTimesError) Error() string {
	return fmt.Sprintf(
		`task: Maximum task call exceeded (%d) for task %q: probably an cyclic dep or infinite loop`,
		err.MaximumTaskCall,
		err.TaskName,
	)
}

func (err *TaskCalledTooManyTimesError) Code() int {
	return CodeTaskCalledTooManyTimes
}

// TaskCancelledByUserError is returned when the user does not accept an optional prompt to continue.
type TaskCancelledByUserError struct {
	TaskName string
}

func (err *TaskCancelledByUserError) Error() string {
	return fmt.Sprintf(`task: Task %q cancelled by user`, err.TaskName)
}

func (err *TaskCancelledByUserError) Code() int {
	return CodeTaskCancelled
}

// TaskCancelledNoTerminalError is returned when trying to run a task with a prompt in a non-terminal environment.
type TaskCancelledNoTerminalError struct {
	TaskName string
}

func (err *TaskCancelledNoTerminalError) Error() string {
	return fmt.Sprintf(
		`task: Task %q cancelled because it has a prompt and the environment is not a terminal. Use --yes (-y) to run anyway.`,
		err.TaskName,
	)
}

func (err *TaskCancelledNoTerminalError) Code() int {
	return CodeTaskCancelled
}

// TaskMissingRequiredVarsError is returned when a task is missing required variables.

type MissingVar struct {
	Name          string
	AllowedValues []string
}
type TaskMissingRequiredVarsError struct {
	TaskName    string
	MissingVars []MissingVar
}

func (v MissingVar) String() string {
	if len(v.AllowedValues) == 0 {
		return v.Name
	}
	return fmt.Sprintf("%s (allowed values: %v)", v.Name, v.AllowedValues)
}

func (err *TaskMissingRequiredVarsError) Error() string {
	vars := make([]string, 0, len(err.MissingVars))
	for _, v := range err.MissingVars {
		vars = append(vars, v.String())
	}

	return fmt.Sprintf(
		`task: Task %q cancelled because it is missing required variables: %s`,
		err.TaskName,
		strings.Join(vars, ", "))
}

func (err *TaskMissingRequiredVarsError) Code() int {
	return CodeTaskMissingRequiredVars
}

type NotAllowedVar struct {
	Value string
	Enum  []string
	Name  string
}

type TaskNotAllowedVarsError struct {
	TaskName       string
	NotAllowedVars []NotAllowedVar
}

func (err *TaskNotAllowedVarsError) Error() string {
	var builder strings.Builder

	builder.WriteString(fmt.Sprintf("task: Task %q cancelled because it is missing required variables:\n", err.TaskName)) //nolint:staticcheck
	for _, s := range err.NotAllowedVars {
		builder.WriteString(fmt.Sprintf("  - %s has an invalid value : '%s' (allowed values : %v)\n", s.Name, s.Value, s.Enum)) //nolint:staticcheck
	}

	return builder.String()
}

func (err *TaskNotAllowedVarsError) Code() int {
	return CodeTaskNotAllowedVars
}


================================================
FILE: errors/errors_taskfile.go
================================================
package errors

import (
	"fmt"
	"net/http"
	"time"

	"github.com/Masterminds/semver/v3"
)

// TaskfileNotFoundError is returned when no appropriate Taskfile is found when
// searching the filesystem.
type TaskfileNotFoundError struct {
	URI         string
	Walk        bool
	AskInit     bool
	OwnerChange bool
}

func (err TaskfileNotFoundError) Error() string {
	var walkText string
	if err.OwnerChange {
		walkText = " (or any of the parent directories until ownership changed)."
	} else if err.Walk {
		walkText = " (or any of the parent directories)."
	}
	if err.AskInit {
		walkText += " Run `task --init` to create a new Taskfile."
	}
	return fmt.Sprintf(`task: No Taskfile found at %q%s`, err.URI, walkText)
}

func (err TaskfileNotFoundError) Code() int {
	return CodeTaskfileNotFound
}

// TaskfileAlreadyExistsError is returned on creating a Taskfile if one already
// exists.
type TaskfileAlreadyExistsError struct{}

func (err TaskfileAlreadyExistsError) Error() string {
	return "task: A Taskfile already exists"
}

func (err TaskfileAlreadyExistsError) Code() int {
	return CodeTaskfileAlreadyExists
}

// TaskfileInvalidError is returned when the Taskfile contains syntax errors or
// cannot be parsed for some reason.
type TaskfileInvalidError struct {
	URI string
	Err error
}

func (err TaskfileInvalidError) Error() string {
	return fmt.Sprintf("task: Failed to parse %s:\n%v", err.URI, err.Err)
}

func (err TaskfileInvalidError) Code() int {
	return CodeTaskfileInvalid
}

// TaskfileFetchFailedError is returned when no appropriate Taskfile is found when
// searching the filesystem.
type TaskfileFetchFailedError struct {
	URI            string
	HTTPStatusCode int
}

func (err TaskfileFetchFailedError) Error() string {
	var statusText string
	if err.HTTPStatusCode != 0 {
		statusText = fmt.Sprintf(" with status code %d (%s)", err.HTTPStatusCode, http.StatusText(err.HTTPStatusCode))
	}
	return fmt.Sprintf(`task: Download of %q failed%s`, err.URI, statusText)
}

func (err TaskfileFetchFailedError) Code() int {
	return CodeTaskfileFetchFailed
}

// TaskfileNotTrustedError is returned when the user does not accept the trust
// prompt when downloading a remote Taskfile.
type TaskfileNotTrustedError struct {
	URI string
}

func (err *TaskfileNotTrustedError) Error() string {
	return fmt.Sprintf(
		`task: Taskfile %q not trusted by user`,
		err.URI,
	)
}

func (err *TaskfileNotTrustedError) Code() int {
	return CodeTaskfileNotTrusted
}

// TaskfileNotSecureError is returned when the user attempts to download a
// remote Taskfile over an insecure connection.
type TaskfileNotSecureError struct {
	URI string
}

func (err *TaskfileNotSecureError) Error() string {
	return fmt.Sprintf(
		`task: Taskfile %q cannot be downloaded over an insecure connection. You can override this by using the --insecure flag`,
		err.URI,
	)
}

func (err *TaskfileNotSecureError) Code() int {
	return CodeTaskfileNotSecure
}

// TaskfileCacheNotFoundError is returned when the user attempts to use an offline
// (cached) Taskfile but the files does not exist in the cache.
type TaskfileCacheNotFoundError struct {
	URI string
}

func (err *TaskfileCacheNotFoundError) Error() string {
	return fmt.Sprintf(
		`task: Taskfile %q was not found in the cache. Remove the --offline flag to use a remote copy or download it using the --download flag`,
		err.URI,
	)
}

func (err *TaskfileCacheNotFoundError) Code() int {
	return CodeTaskfileCacheNotFound
}

// TaskfileVersionCheckError is returned when the user attempts to run a
// Taskfile that does not contain a Taskfile schema version key or if they try
// to use a feature that is not supported by the schema version.
type TaskfileVersionCheckError struct {
	URI           string
	SchemaVersion *semver.Version
	Message       string
}

func (err *TaskfileVersionCheckError) Error() string {
	if err.SchemaVersion == nil {
		return fmt.Sprintf(
			`task: Missing schema version in Taskfile %q`,
			err.URI,
		)
	}
	return fmt.Sprintf(
		"task: Invalid schema version in Taskfile %q:\nSchema version (%s) %s",
		err.URI,
		err.SchemaVersion.String(),
		err.Message,
	)
}

func (err *TaskfileVersionCheckError) Code() int {
	return CodeTaskfileVersionCheckError
}

// TaskfileNetworkTimeoutError is returned when the user attempts to use a remote
// Taskfile but a network connection could not be established within the timeout.
type TaskfileNetworkTimeoutError struct {
	URI     string
	Timeout time.Duration
}

func (err *TaskfileNetworkTimeoutError) Error() string {
	return fmt.Sprintf(
		`task: Network connection timed out after %s while attempting to download Taskfile %q`,
		err.Timeout, err.URI,
	)
}

func (err *TaskfileNetworkTimeoutError) Code() int {
	return CodeTaskfileNetworkTimeout
}

// TaskfileCycleError is returned when we detect that a Taskfile includes a
// set of Taskfiles that include each other in a cycle.
type TaskfileCycleError struct {
	Source      string
	Destination string
}

func (err TaskfileCycleError) Error() string {
	return fmt.Sprintf("task: include cycle detected between %s <--> %s",
		err.Source,
		err.Destination,
	)
}

func (err TaskfileCycleError) Code() int {
	return CodeTaskfileCycle
}

// TaskfileDoesNotMatchChecksum is returned when a Taskfile's checksum does not
// match the one pinned in the parent Taskfile.
type TaskfileDoesNotMatchChecksum struct {
	URI              string
	ExpectedChecksum string
	ActualChecksum   string
}

func (err *TaskfileDoesNotMatchChecksum) Error() string {
	return fmt.Sprintf(
		"task: The checksum of the Taskfile at %q does not match!\ngot: %q\nwant: %q",
		err.URI,
		err.ActualChecksum,
		err.ExpectedChecksum,
	)
}

func (err *TaskfileDoesNotMatchChecksum) Code() int {
	return CodeTaskfileDoesNotMatchChecksum
}


================================================
FILE: errors/errors_taskrc.go
================================================
package errors

import "fmt"

type TaskRCNotFoundError struct {
	URI  string
	Walk bool
}

func (err TaskRCNotFoundError) Error() string {
	var walkText string
	if err.Walk {
		walkText = " (or any of the parent directories)"
	}
	return fmt.Sprintf(`task: No Task config file found at %q%s`, err.URI, walkText)
}

func (err TaskRCNotFoundError) Code() int {
	return CodeTaskRCNotFoundError
}


================================================
FILE: executor.go
================================================
package task

import (
	"context"
	"io"
	"os"
	"sync"
	"time"

	"github.com/puzpuzpuz/xsync/v4"
	"github.com/sajari/fuzzy"

	"github.com/go-task/task/v3/internal/logger"
	"github.com/go-task/task/v3/internal/output"
	"github.com/go-task/task/v3/internal/sort"
	"github.com/go-task/task/v3/taskfile/ast"
)

type (
	// An ExecutorOption is any type that can apply a configuration to an
	// [Executor].
	ExecutorOption interface {
		ApplyToExecutor(*Executor)
	}
	// An Executor is used for processing Taskfile(s) and executing the task(s)
	// within them.
	Executor struct {
		// Flags
		Dir                 string
		Entrypoint          string
		TempDir             TempDir
		Force               bool
		ForceAll            bool
		Insecure            bool
		Download            bool
		Offline             bool
		TrustedHosts        []string
		Timeout             time.Duration
		CacheExpiryDuration time.Duration
		RemoteCacheDir      string
		CACert              string
		Cert                string
		CertKey             string
		Watch               bool
		Verbose             bool
		Silent              bool
		DisableFuzzy        bool
		AssumeYes           bool
		AssumeTerm          bool // Used for testing
		Interactive         bool
		Dry                 bool
		Summary             bool
		Parallel            bool
		Color               bool
		Concurrency         int
		Interval            time.Duration
		Failfast            bool

		// I/O
		Stdin  io.Reader
		Stdout io.Writer
		Stderr io.Writer

		// Internal
		Taskfile           *ast.Taskfile
		Logger             *logger.Logger
		Compiler           *Compiler
		Output             output.Output
		OutputStyle        ast.Output
		TaskSorter         sort.Sorter
		UserWorkingDir     string
		EnableVersionCheck bool

		fuzzyModel     *fuzzy.Model
		fuzzyModelOnce sync.Once

		promptedVars         *ast.Vars // vars collected via interactive prompts
		concurrencySemaphore chan struct{}
		taskCallCount        map[string]*int32
		mkdirMutexMap        map[string]*sync.Mutex
		executionHashes      map[string]context.Context
		executionHashesMutex sync.Mutex
		watchedDirs          *xsync.Map[string, bool]
	}
	TempDir struct {
		Remote      string
		Fingerprint string
	}
)

// NewExecutor creates a new [Executor] and applies the given functional options
// to it.
func NewExecutor(opts ...ExecutorOption) *Executor {
	e := &Executor{
		Timeout:              time.Second * 10,
		Stdin:                os.Stdin,
		Stdout:               os.Stdout,
		Stderr:               os.Stderr,
		Logger:               nil,
		Compiler:             nil,
		Output:               nil,
		OutputStyle:          ast.Output{},
		TaskSorter:           sort.AlphaNumericWithRootTasksFirst,
		UserWorkingDir:       "",
		fuzzyModel:           nil,
		concurrencySemaphore: nil,
		taskCallCount:        map[string]*int32{},
		mkdirMutexMap:        map[string]*sync.Mutex{},
		executionHashes:      map[string]context.Context{},
		executionHashesMutex: sync.Mutex{},
	}
	e.Options(opts...)
	return e
}

// Options loops through the given [ExecutorOption] functions and applies them
// to the [Executor].
func (e *Executor) Options(opts ...ExecutorOption) {
	for _, opt := range opts {
		opt.ApplyToExecutor(e)
	}
}

// WithDir sets the working directory of the [Executor]. By default, the
// directory is set to the user's current working directory.
func WithDir(dir string) ExecutorOption {
	return &dirOption{dir}
}

type dirOption struct {
	dir string
}

func (o *dirOption) ApplyToExecutor(e *Executor) {
	e.Dir = o.dir
}

// WithEntrypoint sets the entrypoint (main Taskfile) of the [Executor]. By
// default, Task will search for one of the default Taskfiles in the given
// directory.
func WithEntrypoint(entrypoint string) ExecutorOption {
	return &entrypointOption{entrypoint}
}

type entrypointOption struct {
	entrypoint string
}

func (o *entrypointOption) ApplyToExecutor(e *Executor) {
	e.Entrypoint = o.entrypoint
}

// WithTempDir sets the temporary directory that will be used by [Executor] for
// storing temporary files like checksums and cached remote files. By default,
// the temporary directory is set to the user's temporary directory.
func WithTempDir(tempDir TempDir) ExecutorOption {
	return &tempDirOption{tempDir}
}

type tempDirOption struct {
	tempDir TempDir
}

func (o *tempDirOption) ApplyToExecutor(e *Executor) {
	e.TempDir = o.tempDir
}

// WithForce ensures that the [Executor] always runs a task, even when
// fingerprinting or prompts would normally stop it.
func WithForce(force bool) ExecutorOption {
	return &forceOption{force}
}

type forceOption struct {
	force bool
}

func (o *forceOption) ApplyToExecutor(e *Executor) {
	e.Force = o.force
}

// WithForceAll ensures that the [Executor] always runs all tasks (including
// subtasks), even when fingerprinting or prompts would normally stop them.
func WithForceAll(forceAll bool) ExecutorOption {
	return &forceAllOption{forceAll}
}

type forceAllOption struct {
	forceAll bool
}

func (o *forceAllOption) ApplyToExecutor(e *Executor) {
	e.ForceAll = o.forceAll
}

// WithInsecure allows the [Executor] to make insecure connections when reading
// remote taskfiles. By default, insecure connections are rejected.
func WithInsecure(insecure bool) ExecutorOption {
	return &insecureOption{insecure}
}

type insecureOption struct {
	insecure bool
}

func (o *insecureOption) ApplyToExecutor(e *Executor) {
	e.Insecure = o.insecure
}

// WithDownload forces the [Executor] to download a fresh copy of the taskfile
// from the remote source.
func WithDownload(download bool) ExecutorOption {
	return &downloadOption{download}
}

type downloadOption struct {
	download bool
}

func (o *downloadOption) ApplyToExecutor(e *Executor) {
	e.Download = o.download
}

// WithOffline stops the [Executor] from being able to make network connections.
// It will still be able to read local files and cached copies of remote files.
func WithOffline(offline bool) ExecutorOption {
	return &offlineOption{offline}
}

type offlineOption struct {
	offline bool
}

func (o *offlineOption) ApplyToExecutor(e *Executor) {
	e.Offline = o.offline
}

// WithTrustedHosts configures the [Executor] with a list of trusted hosts for remote
// Taskfiles. Hosts in this list will not prompt for user confirmation.
func WithTrustedHosts(trustedHosts []string) ExecutorOption {
	return &trustedHostsOption{trustedHosts}
}

type trustedHostsOption struct {
	trustedHosts []string
}

func (o *trustedHostsOption) ApplyToExecutor(e *Executor) {
	e.TrustedHosts = o.trustedHosts
}

// WithTimeout sets the [Executor]'s timeout for fetching remote taskfiles. By
// default, the timeout is set to 10 seconds.
func WithTimeout(timeout time.Duration) ExecutorOption {
	return &timeoutOption{timeout}
}

type timeoutOption struct {
	timeout time.Duration
}

func (o *timeoutOption) ApplyToExecutor(e *Executor) {
	e.Timeout = o.timeout
}

// WithCacheExpiryDuration sets the duration after which the cache is considered
// expired. By default, the cache is 0 (disabled).
func WithCacheExpiryDuration(duration time.Duration) ExecutorOption {
	return &cacheExpiryDurationOption{duration: duration}
}

type cacheExpiryDurationOption struct {
	duration time.Duration
}

func (o *cacheExpiryDurationOption) ApplyToExecutor(r *Executor) {
	r.CacheExpiryDuration = o.duration
}

// WithRemoteCacheDir sets the directory where remote taskfiles are cached.
func WithRemoteCacheDir(dir string) ExecutorOption {
	return &remoteCacheDirOption{dir: dir}
}

type remoteCacheDirOption struct {
	dir string
}

func (o *remoteCacheDirOption) ApplyToExecutor(e *Executor) {
	e.RemoteCacheDir = o.dir
}

// WithCACert sets the path to a custom CA certificate for TLS connections.
func WithCACert(caCert string) ExecutorOption {
	return &caCertOption{caCert: caCert}
}

type caCertOption struct {
	caCert string
}

func (o *caCertOption) ApplyToExecutor(e *Executor) {
	e.CACert = o.caCert
}

// WithCert sets the path to a client certificate for TLS connections.
func WithCert(cert string) ExecutorOption {
	return &certOption{cert: cert}
}

type certOption struct {
	cert string
}

func (o *certOption) ApplyToExecutor(e *Executor) {
	e.Cert = o.cert
}

// WithCertKey sets the path to a client certificate key for TLS connections.
func WithCertKey(certKey string) ExecutorOption {
	return &certKeyOption{certKey: certKey}
}

type certKeyOption struct {
	certKey string
}

func (o *certKeyOption) ApplyToExecutor(e *Executor) {
	e.CertKey = o.certKey
}

// WithWatch tells the [Executor] to keep running in the background and watch
// for changes to the fingerprint of the tasks that are run. When changes are
// detected, a new task run is triggered.
func WithWatch(watch bool) ExecutorOption {
	return &watchOption{watch}
}

type watchOption struct {
	watch bool
}

func (o *watchOption) ApplyToExecutor(e *Executor) {
	e.Watch = o.watch
}

// WithVerbose tells the [Executor] to output more information about the tasks
// that are run.
func WithVerbose(verbose bool) ExecutorOption {
	return &verboseOption{verbose}
}

type verboseOption struct {
	verbose bool
}

func (o *verboseOption) ApplyToExecutor(e *Executor) {
	e.Verbose = o.verbose
}

// WithSilent tells the [Executor] to suppress all output except for the output
// of the tasks that are run.
func WithSilent(silent bool) ExecutorOption {
	return &silentOption{silent}
}

type silentOption struct {
	silent bool
}

func (o *silentOption) ApplyToExecutor(e *Executor) {
	e.Silent = o.silent
}

// WithDisableFuzzy tells the [Executor] to disable fuzzy matching for task names.
func WithDisableFuzzy(disableFuzzy bool) ExecutorOption {
	return &disableFuzzyOption{disableFuzzy}
}

type disableFuzzyOption struct {
	disableFuzzy bool
}

func (o *disableFuzzyOption) ApplyToExecutor(e *Executor) {
	e.DisableFuzzy = o.disableFuzzy
}

// WithAssumeYes tells the [Executor] to assume "yes" for all prompts.
func WithAssumeYes(assumeYes bool) ExecutorOption {
	return &assumeYesOption{assumeYes}
}

type assumeYesOption struct {
	assumeYes bool
}

func (o *assumeYesOption) ApplyToExecutor(e *Executor) {
	e.AssumeYes = o.assumeYes
}

// WithAssumeTerm is used for testing purposes to simulate a terminal.
func WithAssumeTerm(assumeTerm bool) ExecutorOption {
	return &assumeTermOption{assumeTerm}
}

type assumeTermOption struct {
	assumeTerm bool
}

func (o *assumeTermOption) ApplyToExecutor(e *Executor) {
	e.AssumeTerm = o.assumeTerm
}

// WithInteractive tells the [Executor] to prompt for missing required variables.
func WithInteractive(interactive bool) ExecutorOption {
	return &interactiveOption{interactive}
}

type interactiveOption struct {
	interactive bool
}

func (o *interactiveOption) ApplyToExecutor(e *Executor) {
	e.Interactive = o.interactive
}

// WithDry tells the [Executor] to output the commands that would be run without
// actually running them.
func WithDry(dry bool) ExecutorOption {
	return &dryOption{dry}
}

type dryOption struct {
	dry bool
}

func (o *dryOption) ApplyToExecutor(e *Executor) {
	e.Dry = o.dry
}

// WithSummary tells the [Executor] to output a summary of the given tasks
// instead of running them.
func WithSummary(summary bool) ExecutorOption {
	return &summaryOption{summary}
}

type summaryOption struct {
	summary bool
}

func (o *summaryOption) ApplyToExecutor(e *Executor) {
	e.Summary = o.summary
}

// WithParallel tells the [Executor] to run tasks given in the same call in
// parallel.
func WithParallel(parallel bool) ExecutorOption {
	return &parallelOption{parallel}
}

type parallelOption struct {
	parallel bool
}

func (o *parallelOption) ApplyToExecutor(e *Executor) {
	e.Parallel = o.parallel
}

// WithColor tells the [Executor] whether or not to output using colorized
// strings.
func WithColor(color bool) ExecutorOption {
	return &colorOption{color}
}

type colorOption struct {
	color bool
}

func (o *colorOption) ApplyToExecutor(e *Executor) {
	e.Color = o.color
}

// WithConcurrency sets the maximum number of tasks that the [Executor] can run
// in parallel.
func WithConcurrency(concurrency int) ExecutorOption {
	return &concurrencyOption{concurrency}
}

type concurrencyOption struct {
	concurrency int
}

func (o *concurrencyOption) ApplyToExecutor(e *Executor) {
	e.Concurrency = o.concurrency
}

// WithInterval sets the interval at which the [Executor] will wait for
// duplicated events before running a task.
func WithInterval(interval time.Duration) ExecutorOption {
	return &intervalOption{interval}
}

type intervalOption struct {
	interval time.Duration
}

func (o *intervalOption) ApplyToExecutor(e *Executor) {
	e.Interval = o.interval
}

// WithOutputStyle sets the output style of the [Executor]. By default, the
// output style is set to the style defined in the Taskfile.
func WithOutputStyle(outputStyle ast.Output) ExecutorOption {
	return &outputStyleOption{outputStyle}
}

type outputStyleOption struct {
	outputStyle ast.Output
}

func (o *outputStyleOption) ApplyToExecutor(e *Executor) {
	e.OutputStyle = o.outputStyle
}

// WithTaskSorter sets the sorter that the [Executor] will use to sort tasks. By
// default, the sorter is set to sort tasks alphabetically, but with tasks with
// no namespace (in the root Taskfile) first.
func WithTaskSorter(sorter sort.Sorter) ExecutorOption {
	return &taskSorterOption{sorter}
}

type taskSorterOption struct {
	sorter sort.Sorter
}

func (o *taskSorterOption) ApplyToExecutor(e *Executor) {
	e.TaskSorter = o.sorter
}

// WithStdin sets the [Executor]'s standard input [io.Reader].
func WithStdin(stdin io.Reader) ExecutorOption {
	return &stdinOption{stdin}
}

type stdinOption struct {
	stdin io.Reader
}

func (o *stdinOption) ApplyToExecutor(e *Executor) {
	e.Stdin = o.stdin
}

// WithStdout sets the [Executor]'s standard output [io.Writer].
func WithStdout(stdout io.Writer) ExecutorOption {
	return &stdoutOption{stdout}
}

type stdoutOption struct {
	stdout io.Writer
}

func (o *stdoutOption) ApplyToExecutor(e *Executor) {
	e.Stdout = o.stdout
}

// WithStderr sets the [Executor]'s standard error [io.Writer].
func WithStderr(stderr io.Writer) ExecutorOption {
	return &stderrOption{stderr}
}

type stderrOption struct {
	stderr io.Writer
}

func (o *stderrOption) ApplyToExecutor(e *Executor) {
	e.Stderr = o.stderr
}

// WithIO sets the [Executor]'s standard input, output, and error to the same
// [io.ReadWriter].
func WithIO(rw io.ReadWriter) ExecutorOption {
	return &ioOption{rw}
}

type ioOption struct {
	rw io.ReadWriter
}

func (o *ioOption) ApplyToExecutor(e *Executor) {
	e.Stdin = o.rw
	e.Stdout = o.rw
	e.Stderr = o.rw
}

// WithVersionCheck tells the [Executor] whether or not to check the version of
func WithVersionCheck(enableVersionCheck bool) ExecutorOption {
	return &versionCheckOption{enableVersionCheck}
}

type versionCheckOption struct {
	enableVersionCheck bool
}

func (o *versionCheckOption) ApplyToExecutor(e *Executor) {
	e.EnableVersionCheck = o.enableVersionCheck
}

// WithFailfast tells the [Executor] whether or not to check the version of
func WithFailfast(failfast bool) ExecutorOption {
	return &failfastOption{failfast}
}

type failfastOption struct {
	failfast bool
}

func (o *failfastOption) ApplyToExecutor(e *Executor) {
	e.Failfast = o.failfast
}


================================================
FILE: executor_test.go
================================================
package task_test

import (
	"bytes"
	"cmp"
	"fmt"
	"os"
	"path/filepath"
	"testing"

	"github.com/sebdah/goldie/v2"
	"github.com/stretchr/testify/require"

	"github.com/go-task/task/v3"
	"github.com/go-task/task/v3/experiments"
	"github.com/go-task/task/v3/internal/filepathext"
	"github.com/go-task/task/v3/taskfile/ast"
)

type (
	// A ExecutorTestOption is a function that configures an [ExecutorTest].
	ExecutorTestOption interface {
		applyToExecutorTest(*ExecutorTest)
	}
	// A ExecutorTest is a test wrapper around a [task.Executor] to make it easy
	// to write tests for tasks. See [NewExecutorTest] for information on
	// creating and running ExecutorTests. These tests use fixture files to
	// assert whether the result of a task is correct. If Task's behavior has
	// been changed, the fixture files can be updated by running `task
	// gen:fixtures`.
	ExecutorTest struct {
		TaskTest
		task            string
		vars            map[string]any
		input           string
		executorOpts    []task.ExecutorOption
		wantSetupError  bool
		wantRunError    bool
		wantStatusError bool
	}
)

// NewExecutorTest sets up a new [task.Executor] with the given options and runs
// a task with the given [ExecutorTestOption]s. The output of the task is
// written to a set of fixture files depending on the configuration of the test.
func NewExecutorTest(t *testing.T, opts ...ExecutorTestOption) {
	t.Helper()
	tt := &ExecutorTest{
		task: "default",
		vars: map[string]any{},
		TaskTest: TaskTest{
			experiments:         map[*experiments.Experiment]int{},
			fixtureTemplateData: map[string]any{},
		},
	}
	// Apply the functional options
	for _, opt := range opts {
		opt.applyToExecutorTest(tt)
	}
	// Enable any experiments that have been set
	for x, v := range tt.experiments {
		prev := *x
		*x = experiments.Experiment{
			Name:          prev.Name,
			AllowedValues: []int{v},
			Value:         v,
		}
		t.Cleanup(func() {
			*x = prev
		})
	}
	tt.run(t)
}

// Functional options

// WithInput tells the test to create a reader with the given input. This can be
// used to simulate user input when a task requires it.
func WithInput(input string) ExecutorTestOption {
	return &inputTestOption{input}
}

type inputTestOption struct {
	input string
}

func (opt *inputTestOption) applyToExecutorTest(t *ExecutorTest) {
	t.input = opt.input
}

// WithRunError tells the test to expect an error during the run phase of the
// task execution. A fixture will be created with the output of any errors.
func WithRunError() ExecutorTestOption {
	return &runErrorTestOption{}
}

type runErrorTestOption struct{}

func (opt *runErrorTestOption) applyToExecutorTest(t *ExecutorTest) {
	t.wantRunError = true
}

// WithStatusError tells the test to make an additional call to
// [task.Executor.Status] after the task has been run. A fixture will be created
// with the output of any errors.
func WithStatusError() ExecutorTestOption {
	return &statusErrorTestOption{}
}

type statusErrorTestOption struct{}

func (opt *statusErrorTestOption) applyToExecutorTest(t *ExecutorTest) {
	t.wantStatusError = true
}

// Helpers

// writeFixtureErrRun is a wrapper for writing the output of an error during the
// run phase of the task to a fixture file.
func (tt *ExecutorTest) writeFixtureErrRun(
	t *testing.T,
	g *goldie.Goldie,
	err error,
) {
	t.Helper()
	tt.writeFixture(t, g, "err-run", []byte(err.Error()))
}

// writeFixtureStatus is a wrapper for writing the output of an error when
// making an additional call to [task.Executor.Status] to a fixture file.
func (tt *ExecutorTest) writeFixtureStatus(
	t *testing.T,
	g *goldie.Goldie,
	status string,
) {
	t.Helper()
	tt.writeFixture(t, g, "err-status", []byte(status))
}

// run is the main function for running the test. It sets up the task executor,
// runs the task, and writes the output to a fixture file.
func (tt *ExecutorTest) run(t *testing.T) {
	t.Helper()
	f := func(t *testing.T) {
		t.Helper()
		var buffer SyncBuffer

		opts := append(
			tt.executorOpts,
			task.WithStdout(&buffer),
			task.WithStderr(&buffer),
		)

		// If the test has input, create a reader for it and add it to the
		// executor options
		if tt.input != "" {
			var reader bytes.Buffer
			reader.WriteString(tt.input)
			opts = append(opts, task.WithStdin(&reader))
		}

		// Set up the task executor
		e := task.NewExecutor(opts...)

		// Create a golden fixture file for the output
		g := goldie.New(t,
			goldie.WithFixtureDir(filepath.Join(e.Dir, "testdata")),
		)

		// Call setup and check for errors
		if err := e.Setup(); tt.wantSetupError {
			require.Error(t, err)
			tt.writeFixtureErrSetup(t, g, err)
			tt.writeFixtureBuffer(t, g, buffer.buf)
			return
		} else {
			require.NoError(t, err)
		}

		// Create the task call
		vars := ast.NewVars()
		for key, value := range tt.vars {
			vars.Set(key, ast.Var{Value: value})
		}
		call := &task.Call{
			Task: tt.task,
			Vars: vars,
		}

		// Run the task and check for errors
		ctx := t.Context()
		if err := e.Run(ctx, call); tt.wantRunError {
			require.Error(t, err)
			tt.writeFixtureErrRun(t, g, err)
			tt.writeFixtureBuffer(t, g, buffer.buf)
			return
		} else {
			require.NoError(t, err)
		}

		// If the status flag is set, run the status check
		if tt.wantStatusError {
			if err := e.Status(ctx, call); err != nil {
				tt.writeFixtureStatus(t, g, err.Error())
			}
		}

		tt.writeFixtureBuffer(t, g, buffer.buf)
	}

	// Run the test (with a name if it has one)
	if tt.name != "" {
		t.Run(tt.name, f)
	} else {
		f(t)
	}
}

func TestEmptyTask(t *testing.T) {
	t.Parallel()
	NewExecutorTest(t,
		WithExecutorOptions(
			task.WithDir("testdata/empty_task"),
		),
	)
}

func TestEmptyTaskfile(t *testing.T) {
	t.Parallel()
	NewExecutorTest(t,
		WithExecutorOptions(
			task.WithDir("testdata/empty_taskfile"),
		),
		WithSetupError(),
		WithFixtureTemplating(),
	)
}

func TestEnv(t *testing.T) {
	t.Setenv("QUX", "from_os")
	NewExecutorTest(t,
		WithName("env precedence disabled"),
		WithExecutorOptions(
			task.WithDir("testdata/env"),
			task.WithSilent(true),
		),
	)
	NewExecutorTest(t,
		WithName("env precedence enabled"),
		WithExecutorOptions(
			task.WithDir("testdata/env"),
			task.WithSilent(true),
		),
		WithExperiment(&experiments.EnvPrecedence, 1),
	)
}

func TestVars(t *testing.T) {
	t.Parallel()
	NewExecutorTest(t,
		WithExecutorOptions(
			task.WithDir("testdata/vars"),
			task.WithSilent(true),
		),
	)
	NewExecutorTest(t,
		WithName("cli-var-priority-default"),
		WithExecutorOptions(
			task.WithDir("testdata/vars"),
			task.WithSilent(true),
		),
		WithTask("cli-var-priority"),
	)
	NewExecutorTest(t,
		WithName("cli-var-priority-override"),
		WithExecutorOptions(
			task.WithDir("testdata/vars"),
			task.WithSilent(true),
		),
		WithTask("cli-var-priority"),
		WithVar("CLI_VAR", "from_cli"),
	)
}

func TestRequires(t *testing
Download .txt
gitextract_c5f3ar5r/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   └── feature_request.yml
│   ├── pull_request_template.md
│   ├── renovate.json
│   └── workflows/
│       ├── issue-awaiting-response.yml
│       ├── issue-closed.yml
│       ├── issue-experiment.yml
│       ├── issue-needs-triage.yml
│       ├── lint.yml
│       ├── pr-build.yml
│       ├── release-nightly.yml
│       ├── release.yml
│       └── test.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser-nightly.yml
├── .goreleaser-pr.yml
├── .goreleaser.yml
├── .mockery.yaml
├── .prettierrc.yml
├── .taskrc.yml
├── .vscode/
│   ├── extensions.json
│   └── settings-sample.json
├── CHANGELOG.md
├── LICENSE
├── README.md
├── Taskfile.yml
├── args/
│   ├── args.go
│   └── args_test.go
├── bin/
│   └── .keep
├── call.go
├── cmd/
│   ├── release/
│   │   └── main.go
│   ├── sleepit/
│   │   └── sleepit.go
│   └── task/
│       └── task.go
├── compiler.go
├── completion/
│   ├── bash/
│   │   └── task.bash
│   ├── fish/
│   │   └── task.fish
│   ├── ps/
│   │   └── task.ps1
│   └── zsh/
│       └── _task
├── completion.go
├── concurrency.go
├── errors/
│   ├── error_taskfile_decode.go
│   ├── errors.go
│   ├── errors_task.go
│   ├── errors_taskfile.go
│   └── errors_taskrc.go
├── executor.go
├── executor_test.go
├── experiments/
│   ├── errors.go
│   ├── experiment.go
│   ├── experiment_test.go
│   └── experiments.go
├── formatter_test.go
├── go.mod
├── go.sum
├── hash.go
├── help.go
├── init.go
├── init_test.go
├── install-task.sh
├── internal/
│   ├── deepcopy/
│   │   └── deepcopy.go
│   ├── editors/
│   │   └── output.go
│   ├── env/
│   │   └── env.go
│   ├── execext/
│   │   ├── coreutils.go
│   │   ├── devnull.go
│   │   └── exec.go
│   ├── filepathext/
│   │   └── filepathext.go
│   ├── fingerprint/
│   │   ├── checker.go
│   │   ├── checker_mock.go
│   │   ├── glob.go
│   │   ├── sources.go
│   │   ├── sources_checksum.go
│   │   ├── sources_checksum_test.go
│   │   ├── sources_none.go
│   │   ├── sources_timestamp.go
│   │   ├── status.go
│   │   ├── task.go
│   │   └── task_test.go
│   ├── flags/
│   │   └── flags.go
│   ├── fsext/
│   │   ├── fs.go
│   │   ├── fs_test.go
│   │   └── testdata/
│   │       ├── bar.txt
│   │       └── foo.txt
│   ├── fsnotifyext/
│   │   └── fsnotify_dedup.go
│   ├── goext/
│   │   └── meta.go
│   ├── hash/
│   │   └── hash.go
│   ├── input/
│   │   └── input.go
│   ├── logger/
│   │   └── logger.go
│   ├── output/
│   │   ├── group.go
│   │   ├── interleaved.go
│   │   ├── output.go
│   │   ├── output_test.go
│   │   └── prefixed.go
│   ├── slicesext/
│   │   ├── slicesext.go
│   │   └── slicesext_test.go
│   ├── sort/
│   │   ├── sorter.go
│   │   └── sorter_test.go
│   ├── summary/
│   │   ├── summary.go
│   │   └── summary_test.go
│   ├── sysinfo/
│   │   ├── uid.go
│   │   └── uid_win.go
│   ├── templater/
│   │   ├── funcs.go
│   │   └── templater.go
│   ├── term/
│   │   └── term.go
│   └── version/
│       ├── version.go
│       └── version.txt
├── precondition.go
├── requires.go
├── setup.go
├── signals.go
├── signals_test.go
├── status.go
├── task.go
├── task_test.go
├── taskfile/
│   ├── ast/
│   │   ├── cmd.go
│   │   ├── defer.go
│   │   ├── dep.go
│   │   ├── for.go
│   │   ├── glob.go
│   │   ├── graph.go
│   │   ├── include.go
│   │   ├── location.go
│   │   ├── matrix.go
│   │   ├── output.go
│   │   ├── platforms.go
│   │   ├── platforms_test.go
│   │   ├── precondition.go
│   │   ├── precondition_test.go
│   │   ├── prompt.go
│   │   ├── requires.go
│   │   ├── task.go
│   │   ├── taskfile.go
│   │   ├── taskfile_test.go
│   │   ├── tasks.go
│   │   ├── var.go
│   │   └── vars.go
│   ├── dotenv.go
│   ├── node.go
│   ├── node_base.go
│   ├── node_cache.go
│   ├── node_file.go
│   ├── node_git.go
│   ├── node_git_test.go
│   ├── node_http.go
│   ├── node_http_test.go
│   ├── node_stdin.go
│   ├── node_test.go
│   ├── reader.go
│   ├── snippet.go
│   ├── snippet_test.go
│   ├── taskfile.go
│   ├── templates/
│   │   └── default.yml
│   └── themes/
│       └── task.xml
├── taskrc/
│   ├── ast/
│   │   └── taskrc.go
│   ├── node.go
│   ├── reader.go
│   ├── taskrc.go
│   └── taskrc_test.go
├── testdata/
│   ├── alias/
│   │   ├── Taskfile.yml
│   │   ├── Taskfile2.yml
│   │   └── testdata/
│   │       ├── TestAlias-alias.golden
│   │       ├── TestAlias-alias_summary.golden
│   │       ├── TestAlias-duplicate_alias-err-run.golden
│   │       └── TestAlias-duplicate_alias.golden
│   ├── checksum/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   ├── generated-wildcard.txt
│   │   ├── ignore_me.txt
│   │   └── source.txt
│   ├── cmds_vars/
│   │   ├── Taskfile.yml
│   │   └── source.txt
│   ├── concurrency/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestConcurrency.golden
│   ├── cyclic/
│   │   └── Taskfile.yml
│   ├── deferred/
│   │   └── Taskfile.yml
│   ├── deps/
│   │   ├── Taskfile.yml
│   │   ├── d1.txt
│   │   ├── d11.txt
│   │   ├── d12.txt
│   │   ├── d13.txt
│   │   ├── d2.txt
│   │   ├── d21.txt
│   │   ├── d22.txt
│   │   ├── d23.txt
│   │   ├── d3.txt
│   │   ├── d31.txt
│   │   ├── d32.txt
│   │   ├── d33.txt
│   │   └── testdata/
│   │       └── TestDeps.golden
│   ├── desc/
│   │   └── Taskfile.yml
│   ├── dir/
│   │   ├── Taskfile.yml
│   │   ├── dynamic_var/
│   │   │   ├── .gitignore
│   │   │   ├── Taskfile.yml
│   │   │   └── subdirectory/
│   │   │       └── Taskfile.yml
│   │   ├── dynamic_var_on_created_dir/
│   │   │   └── Taskfile.yml
│   │   ├── explicit_doesnt_exist/
│   │   │   └── Taskfile.yml
│   │   └── explicit_exists/
│   │       ├── Taskfile.yml
│   │       └── exists/
│   │           └── .keep
│   ├── dotenv/
│   │   ├── .gitignore
│   │   ├── default/
│   │   │   └── Taskfile.yml
│   │   ├── env_var_in_path/
│   │   │   └── Taskfile.yml
│   │   ├── error_included_envs/
│   │   │   └── Taskfile.yml
│   │   ├── include1/
│   │   │   └── Taskfile.yml
│   │   ├── local_env_in_path/
│   │   │   └── Taskfile.yml
│   │   ├── local_var_in_path/
│   │   │   └── Taskfile.yml
│   │   ├── missing_env/
│   │   │   └── Taskfile.yml
│   │   └── parse_error/
│   │       ├── .env-with-error
│   │       └── Taskfile.yml
│   ├── dotenv_task/
│   │   └── default/
│   │       ├── .gitignore
│   │       └── Taskfile.yml
│   ├── dry/
│   │   └── Taskfile.yml
│   ├── dry_checksum/
│   │   ├── Taskfile.yml
│   │   └── source.txt
│   ├── empty_task/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestEmptyTask.golden
│   ├── empty_taskfile/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestEmptyTaskfile-err-setup.golden
│   │       └── TestEmptyTaskfile.golden
│   ├── env/
│   │   ├── Taskfile.yml
│   │   ├── dynamic.txt
│   │   ├── global.txt
│   │   ├── local.txt
│   │   ├── multiple_type.txt
│   │   ├── not-overridden.txt
│   │   ├── overridden.txt
│   │   └── testdata/
│   │       ├── TestEnv-env_precedence_disabled.golden
│   │       └── TestEnv-env_precedence_enabled.golden
│   ├── error_code/
│   │   └── Taskfile.yml
│   ├── evaluate_symlinks_in_paths/
│   │   ├── Taskfile.yaml
│   │   ├── shared/
│   │   │   ├── b
│   │   │   └── inner_shared/
│   │   │       └── c
│   │   └── src/
│   │       └── a
│   ├── exit_code/
│   │   └── Taskfile.yml
│   ├── exit_immediately/
│   │   └── Taskfile.yml
│   ├── expand/
│   │   └── Taskfile.yml
│   ├── failfast/
│   │   ├── default/
│   │   │   ├── Taskfile.yaml
│   │   │   └── testdata/
│   │   │       ├── TestFailfast-Default-default-err-run.golden
│   │   │       ├── TestFailfast-Default-default.golden
│   │   │       ├── TestFailfast-Option-default-err-run.golden
│   │   │       └── TestFailfast-Option-default.golden
│   │   └── task/
│   │       ├── Taskfile.yaml
│   │       └── testdata/
│   │           ├── TestFailfast-Task-task-err-run.golden
│   │           └── TestFailfast-Task-task.golden
│   ├── file_names/
│   │   ├── .gitignore
│   │   ├── Taskfile.dist.yaml/
│   │   │   └── Taskfile.dist.yaml
│   │   ├── Taskfile.dist.yml/
│   │   │   └── Taskfile.dist.yml
│   │   ├── Taskfile.yaml/
│   │   │   └── Taskfile.yaml
│   │   └── Taskfile.yml/
│   │       └── Taskfile.yml
│   ├── for/
│   │   ├── cmds/
│   │   │   ├── Taskfile.yml
│   │   │   ├── bar.txt
│   │   │   ├── foo.txt
│   │   │   └── testdata/
│   │   │       ├── TestForCmds-loop-different-tasks.golden
│   │   │       ├── TestForCmds-loop-explicit.golden
│   │   │       ├── TestForCmds-loop-generates-glob.golden
│   │   │       ├── TestForCmds-loop-generates.golden
│   │   │       ├── TestForCmds-loop-matrix-ref-error-err-run.golden
│   │   │       ├── TestForCmds-loop-matrix-ref-error.golden
│   │   │       ├── TestForCmds-loop-matrix-ref.golden
│   │   │       ├── TestForCmds-loop-matrix.golden
│   │   │       ├── TestForCmds-loop-sources-glob.golden
│   │   │       ├── TestForCmds-loop-sources.golden
│   │   │       ├── TestForCmds-loop-task-as.golden
│   │   │       ├── TestForCmds-loop-task.golden
│   │   │       ├── TestForCmds-loop-vars-sh.golden
│   │   │       └── TestForCmds-loop-vars.golden
│   │   └── deps/
│   │       ├── Taskfile.yml
│   │       ├── bar.txt
│   │       ├── foo.txt
│   │       └── testdata/
│   │           ├── TestForDeps-loop-different-tasks.golden
│   │           ├── TestForDeps-loop-explicit.golden
│   │           ├── TestForDeps-loop-generates-glob.golden
│   │           ├── TestForDeps-loop-generates.golden
│   │           ├── TestForDeps-loop-matrix-ref-error-err-run.golden
│   │           ├── TestForDeps-loop-matrix-ref-error.golden
│   │           ├── TestForDeps-loop-matrix-ref.golden
│   │           ├── TestForDeps-loop-matrix.golden
│   │           ├── TestForDeps-loop-sources-glob.golden
│   │           ├── TestForDeps-loop-sources.golden
│   │           ├── TestForDeps-loop-task-as.golden
│   │           ├── TestForDeps-loop-task.golden
│   │           ├── TestForDeps-loop-vars-sh.golden
│   │           └── TestForDeps-loop-vars.golden
│   ├── force/
│   │   └── Taskfile.yml
│   ├── fuzzy/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestFuzzyModel-fuzzy-err-run.golden
│   │       ├── TestFuzzyModel-fuzzy.golden
│   │       ├── TestFuzzyModel-intern-err-run.golden
│   │       ├── TestFuzzyModel-intern.golden
│   │       └── TestFuzzyModel-not-fuzzy.golden
│   ├── generates/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── sub/
│   │       └── .keep
│   ├── if/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestIf-cmd-if-false.golden
│   │       ├── TestIf-cmd-if-true.golden
│   │       ├── TestIf-if-in-for-loop.golden
│   │       ├── TestIf-task-call-if-false.golden
│   │       ├── TestIf-task-call-if-true.golden
│   │       ├── TestIf-task-if-dynamic-false.golden
│   │       ├── TestIf-task-if-dynamic-true.golden
│   │       ├── TestIf-task-if-false.golden
│   │       ├── TestIf-task-if-true.golden
│   │       ├── TestIf-task-level-template-false.golden
│   │       ├── TestIf-task-level-template.golden
│   │       ├── TestIf-template-and.golden
│   │       ├── TestIf-template-bool-false.golden
│   │       ├── TestIf-template-bool-true.golden
│   │       ├── TestIf-template-cli-var.golden
│   │       ├── TestIf-template-direct-false.golden
│   │       ├── TestIf-template-direct-true.golden
│   │       ├── TestIf-template-eq-false.golden
│   │       ├── TestIf-template-eq-true.golden
│   │       ├── TestIf-template-ne.golden
│   │       └── TestIf-template-or.golden
│   ├── ignore_errors/
│   │   └── Taskfile.yml
│   ├── ignore_nil_elements/
│   │   ├── cmds/
│   │   │   └── Taskfile.yml
│   │   ├── deps/
│   │   │   └── Taskfile.yml
│   │   ├── includes/
│   │   │   ├── Taskfile.yml
│   │   │   └── inc.yml
│   │   └── preconditions/
│   │       └── Taskfile.yml
│   ├── ignore_signals/
│   │   └── Taskfile.yml
│   ├── include_with_vars/
│   │   ├── Taskfile.yml
│   │   └── include/
│   │       ├── Taskfile.include1.yml
│   │       ├── Taskfile.include2.yml
│   │       └── Taskfile.include3.yml
│   ├── include_with_vars_inside_include/
│   │   ├── Taskfile.yml
│   │   └── include/
│   │       └── Taskfile.include.yml
│   ├── include_with_vars_multi_level/
│   │   ├── Taskfile.yml
│   │   ├── bar/
│   │   │   └── Taskfile.yml
│   │   ├── foo/
│   │   │   └── Taskfile.yml
│   │   └── lib/
│   │       └── Taskfile.yml
│   ├── included_taskfile_var_merging/
│   │   ├── Taskfile.yaml
│   │   ├── bar/
│   │   │   └── Taskfile.yaml
│   │   └── foo/
│   │       └── Taskfile.yaml
│   ├── includes/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   ├── Taskfile2.yml
│   │   ├── Taskfile_darwin.yml
│   │   ├── Taskfile_linux.yml
│   │   ├── Taskfile_windows.yml
│   │   ├── included/
│   │   │   └── Taskfile.yml
│   │   ├── module1/
│   │   │   └── Taskfile.yml
│   │   └── module2/
│   │       └── Taskfile.yml
│   ├── includes_call_root_task/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── Taskfile2.yml
│   ├── includes_checksum/
│   │   ├── correct/
│   │   │   ├── Taskfile.yml
│   │   │   └── testdata/
│   │   │       └── TestIncludeChecksum-correct.golden
│   │   ├── correct_remote/
│   │   │   └── Taskfile.yml
│   │   ├── included.yml
│   │   └── incorrect/
│   │       ├── Taskfile.yml
│   │       └── testdata/
│   │           ├── TestIncludeChecksum-incorrect-err-setup.golden
│   │           └── TestIncludeChecksum-incorrect.golden
│   ├── includes_cycle/
│   │   ├── Taskfile.yml
│   │   └── one/
│   │       ├── Taskfile.yml
│   │       └── two/
│   │           └── Taskfile.yml
│   ├── includes_deps/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── Taskfile2.yml
│   ├── includes_empty/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── Taskfile2.yml
│   ├── includes_flatten/
│   │   ├── .gitignore
│   │   ├── Taskfile.multiple.yml
│   │   ├── Taskfile.with_default.yml
│   │   ├── Taskfile.yml
│   │   ├── included/
│   │   │   └── Taskfile.yml
│   │   └── nested/
│   │       └── Taskfile.yml
│   ├── includes_http/
│   │   ├── child-taskfile2.yml
│   │   ├── child-taskfile3.yml
│   │   ├── root-taskfile-remotefile-empty-dir-1st.yml
│   │   └── root-taskfile-remotefile-empty-dir-2nd.yml
│   ├── includes_incorrect/
│   │   ├── Taskfile.yml
│   │   └── incomplete.yml
│   ├── includes_internal/
│   │   ├── Taskfile.yml
│   │   └── Taskfile2.yml
│   ├── includes_interpolation/
│   │   ├── include/
│   │   │   └── Taskfile.yml
│   │   ├── include_with_dir/
│   │   │   └── Taskfile.yml
│   │   ├── include_with_env_variable/
│   │   │   └── Taskfile.yml
│   │   └── included/
│   │       └── Taskfile.yml
│   ├── includes_multi_level/
│   │   ├── Taskfile.yml
│   │   ├── called_one.txt
│   │   ├── called_three.txt
│   │   ├── called_two.txt
│   │   └── one/
│   │       ├── Taskfile.yml
│   │       └── two/
│   │           ├── Taskfile.yml
│   │           └── three/
│   │               └── Taskfile.yml
│   ├── includes_optional/
│   │   ├── .gitignore
│   │   └── Taskfile.yml
│   ├── includes_optional_explicit_false/
│   │   └── Taskfile.yml
│   ├── includes_optional_implicit_false/
│   │   └── Taskfile.yml
│   ├── includes_rel_path/
│   │   ├── Taskfile.yml
│   │   ├── common/
│   │   │   └── Taskfile.yml
│   │   └── included/
│   │       └── Taskfile.yml
│   ├── includes_remote/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── first/
│   │       ├── Taskfile.yml
│   │       └── second/
│   │           └── Taskfile.yml
│   ├── includes_shadowed_default/
│   │   ├── Taskfile.yml
│   │   ├── Taskfile2.yml
│   │   └── file.txt
│   ├── includes_silent/
│   │   ├── Taskfile-inc.yml
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestIncludeSilent-include-taskfile-silent.golden
│   ├── includes_unshadowed_default/
│   │   ├── Taskfile.yml
│   │   ├── Taskfile2.yml
│   │   └── file.txt
│   ├── includes_with_excludes/
│   │   ├── Taskfile.yml
│   │   └── included/
│   │       └── Taskfile.yml
│   ├── includes_yaml/
│   │   ├── .gitignore
│   │   ├── Custom.ext
│   │   └── included/
│   │       ├── Taskfile.yaml
│   │       └── custom.yaml
│   ├── init/
│   │   └── .gitignore
│   ├── interactive_vars/
│   │   ├── .taskrc.yml
│   │   └── Taskfile.yml
│   ├── internal_task/
│   │   └── Taskfile.yml
│   ├── json_list_format/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestJsonListFormat.golden
│   ├── label_error/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestLabel-label_in_error-err-run.golden
│   │       └── TestLabel-label_in_error.golden
│   ├── label_list/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestNoLabelInList.golden
│   ├── label_status/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestLabel-status-err-status.golden
│   │       └── TestLabel-status.golden
│   ├── label_summary/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestLabel-label_in_summary.golden
│   │       └── TestLabel-summary.golden
│   ├── label_uptodate/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestLabel-up_to_date.golden
│   ├── label_var/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestLabel-var.golden
│   ├── list_desc_interpolation/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       └── TestListDescInterpolation.golden
│   ├── list_mixed_desc/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestListAllShowsNoDesc.golden
│   │       └── TestListCanListDescOnly.golden
│   ├── output_group/
│   │   └── Taskfile.yml
│   ├── output_group_error_only/
│   │   └── Taskfile.yml
│   ├── params/
│   │   ├── Taskfile.yml
│   │   ├── dep1.txt
│   │   ├── dep2.txt
│   │   ├── exclamation.txt
│   │   ├── german.txt
│   │   ├── hello.txt
│   │   ├── portuguese.txt
│   │   ├── portuguese2.txt
│   │   ├── spanish-dep.txt
│   │   ├── spanish.txt
│   │   ├── testdata/
│   │   │   └── TestParams.golden
│   │   └── world.txt
│   ├── platforms/
│   │   └── Taskfile.yml
│   ├── precondition/
│   │   ├── Taskfile.yml
│   │   ├── foo.txt
│   │   └── testdata/
│   │       ├── TestPrecondition-a_precondition_has_been_met.golden
│   │       ├── TestPrecondition-a_precondition_was_not_met-err-run.golden
│   │       ├── TestPrecondition-a_precondition_was_not_met.golden
│   │       ├── TestPrecondition-precondition_in_cmd_fails_the_task-err-run.golden
│   │       ├── TestPrecondition-precondition_in_cmd_fails_the_task.golden
│   │       ├── TestPrecondition-precondition_in_dependency_fails_the_task-err-run.golden
│   │       └── TestPrecondition-precondition_in_dependency_fails_the_task.golden
│   ├── prefix_uptodate/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestPrefix-up_to_dat_with_no_output_style.golden
│   │       └── TestPrefix-up_to_date.golden
│   ├── prompt/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestPromptAssumeYes---yes_flag_should_skip_prompt.golden
│   │       ├── TestPromptAssumeYes-task_should_raise_errors.TaskCancelledError-err-run.golden
│   │       ├── TestPromptAssumeYes-task_should_raise_errors.TaskCancelledError.golden
│   │       ├── TestPromptInSummary-test_Enter_stops_task-test_Enter_stops_task-err-run.golden
│   │       ├── TestPromptInSummary-test_Enter_stops_task-test_Enter_stops_task.golden
│   │       ├── TestPromptInSummary-test_junk_value_stops_task-test_junk_value_stops_task-err-run.golden
│   │       ├── TestPromptInSummary-test_junk_value_stops_task-test_junk_value_stops_task.golden
│   │       ├── TestPromptInSummary-test_long_approval-test_long_approval.golden
│   │       ├── TestPromptInSummary-test_short_approval-test_short_approval.golden
│   │       ├── TestPromptInSummary-test_stops_task-test_stops_task-err-run.golden
│   │       ├── TestPromptInSummary-test_stops_task-test_stops_task.golden
│   │       ├── TestPromptInSummary-test_uppercase_approval-test_uppercase_approval.golden
│   │       └── TestPromptWithIndirectTask.golden
│   ├── requires/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestRequires-fails_validation-err-run.golden
│   │       ├── TestRequires-fails_validation.golden
│   │       ├── TestRequires-passes_validation.golden
│   │       ├── TestRequires-require_before_compile-err-run.golden
│   │       ├── TestRequires-require_before_compile.golden
│   │       ├── TestRequires-required_var_missing-err-run.golden
│   │       ├── TestRequires-required_var_missing.golden
│   │       ├── TestRequires-required_var_missing_+_fails_validation#01.golden
│   │       ├── TestRequires-required_var_missing_+_fails_validation-err-run.golden
│   │       ├── TestRequires-required_var_missing_+_fails_validation.golden
│   │       ├── TestRequires-required_var_ok.golden
│   │       └── TestRequires-var_defined_in_task.golden
│   ├── run/
│   │   ├── .gitignore
│   │   └── Taskfile.yml
│   ├── run_once_shared_deps/
│   │   ├── Taskfile.yml
│   │   ├── library/
│   │   │   └── Taskfile.yml
│   │   ├── service-a/
│   │   │   ├── Taskfile.yml
│   │   │   └── src/
│   │   │       └── imasource.go
│   │   └── service-b/
│   │       ├── Taskfile.yml
│   │       └── src/
│   │           └── imasource.go
│   ├── run_when_changed/
│   │   ├── Taskfile.yml
│   │   ├── library/
│   │   │   └── Taskfile.yml
│   │   ├── service-a/
│   │   │   └── Taskfile.yml
│   │   └── service-b/
│   │       └── Taskfile.yml
│   ├── shopts/
│   │   ├── command_level/
│   │   │   └── Taskfile.yml
│   │   ├── global_level/
│   │   │   └── Taskfile.yml
│   │   └── task_level/
│   │       └── Taskfile.yml
│   ├── short_task_notation/
│   │   └── Taskfile.yml
│   ├── silent/
│   │   └── Taskfile.yml
│   ├── single_cmd_dep/
│   │   ├── .gitignore
│   │   └── Taskfile.yml
│   ├── special_vars/
│   │   ├── Taskfile.yml
│   │   ├── included/
│   │   │   └── Taskfile.yml
│   │   ├── subdir/
│   │   │   ├── .gitkeep
│   │   │   └── testdata/
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-included-print-root-dir.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-included-print-task.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-included-print-taskfile-dir.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-included-print-taskfile.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-print-root-dir.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-print-root-taskfile.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-print-task-dir.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-print-task.golden
│   │   │       ├── TestSpecialVars-testdata-special_vars-subdir-print-taskfile-dir.golden
│   │   │       └── TestSpecialVars-testdata-special_vars-subdir-print-taskfile.golden
│   │   └── testdata/
│   │       ├── TestSpecialVars-testdata-special_vars-included-print-root-dir.golden
│   │       ├── TestSpecialVars-testdata-special_vars-included-print-task.golden
│   │       ├── TestSpecialVars-testdata-special_vars-included-print-taskfile-dir.golden
│   │       ├── TestSpecialVars-testdata-special_vars-included-print-taskfile.golden
│   │       ├── TestSpecialVars-testdata-special_vars-print-root-dir.golden
│   │       ├── TestSpecialVars-testdata-special_vars-print-root-taskfile.golden
│   │       ├── TestSpecialVars-testdata-special_vars-print-task-dir.golden
│   │       ├── TestSpecialVars-testdata-special_vars-print-task.golden
│   │       ├── TestSpecialVars-testdata-special_vars-print-taskfile-dir.golden
│   │       └── TestSpecialVars-testdata-special_vars-print-taskfile.golden
│   ├── split_args/
│   │   └── Taskfile.yml
│   ├── status/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestStatus-run_gen-bar_1_silent.golden
│   │       ├── TestStatus-run_gen-bar_2_silent.golden
│   │       ├── TestStatus-run_gen-bar_3_silent.golden
│   │       ├── TestStatus-run_gen-bar_4_silent.golden
│   │       ├── TestStatus-run_gen-bar_5.golden
│   │       ├── TestStatus-run_gen-bar_6.golden
│   │       ├── TestStatus-run_gen-baz_2.golden
│   │       ├── TestStatus-run_gen-baz_3.golden
│   │       ├── TestStatus-run_gen-baz_4_verbose.golden
│   │       ├── TestStatus-run_gen-baz_silent.golden
│   │       ├── TestStatus-run_gen-foo_1_silent.golden
│   │       ├── TestStatus-run_gen-foo_2.golden
│   │       └── TestStatus-run_gen-foo_3.golden
│   ├── status_vars/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   └── source.txt
│   ├── summary/
│   │   ├── Taskfile.yml
│   │   └── task-with-summary.txt
│   ├── summary-vars-requires/
│   │   ├── Taskfile-with-env.yml
│   │   ├── Taskfile-with-globals.yml
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestSummaryWithVarsAndRequires-shell-vars.golden
│   │       └── TestSummaryWithVarsAndRequires-vars-and-requires.golden
│   ├── taskfile_walk/
│   │   ├── Taskfile.yml
│   │   └── foo/
│   │       └── bar/
│   │           └── .gitkeep
│   ├── user_working_dir/
│   │   └── Taskfile.yml
│   ├── user_working_dir_with_includes/
│   │   ├── Taskfile.yml
│   │   ├── included/
│   │   │   └── Taskfile.yml
│   │   └── somedir/
│   │       └── .keep
│   ├── var_inheritance/
│   │   └── v3/
│   │       ├── entrypoint-global-dotenv/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-global-dotenv.golden
│   │       ├── entrypoint-global-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-global-vars.golden
│   │       ├── entrypoint-task-call-dotenv/
│   │       │   ├── Taskfile.yml
│   │       │   ├── called-task.env
│   │       │   ├── global.env
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-task-call-dotenv.golden
│   │       ├── entrypoint-task-call-task-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-task-call-task-vars.golden
│   │       ├── entrypoint-task-call-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-task-call-vars.golden
│   │       ├── entrypoint-task-dotenv/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-task-dotenv.golden
│   │       ├── entrypoint-task-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-entrypoint-task-vars.golden
│   │       ├── included-global-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-global-vars.golden
│   │       ├── included-task/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   └── task.env
│   │       ├── included-task-call-dotenv/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-task-call-dotenv.golden
│   │       ├── included-task-call-task-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-task-call-task-vars.golden
│   │       ├── included-task-call-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-task-call-vars.golden
│   │       ├── included-task-dotenv/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-task-dotenv.golden
│   │       ├── included-task-vars/
│   │       │   ├── Taskfile.yml
│   │       │   ├── global.env
│   │       │   ├── included.yml
│   │       │   ├── task.env
│   │       │   └── testdata/
│   │       │       └── TestVarInheritance-included-task-vars.golden
│   │       └── shell/
│   │           ├── Taskfile.yml
│   │           └── testdata/
│   │               └── TestVarInheritance-shell.golden
│   ├── var_references/
│   │   ├── Taskfile.yml
│   │   └── testdata/
│   │       ├── TestReference-reference_in_command.golden
│   │       ├── TestReference-reference_in_dependency.golden
│   │       ├── TestReference-reference_using_templating_resolver.golden
│   │       └── TestReference-reference_using_templating_resolver_and_dynamic_var.golden
│   ├── vars/
│   │   ├── .gitignore
│   │   ├── Taskfile.yml
│   │   ├── any/
│   │   │   ├── Taskfile.yml
│   │   │   ├── example.json
│   │   │   └── example.yaml
│   │   └── testdata/
│   │       ├── TestVars-cli-var-priority-default.golden
│   │       ├── TestVars-cli-var-priority-override.golden
│   │       └── TestVars.golden
│   ├── version/
│   │   ├── v1/
│   │   │   └── Taskfile.yml
│   │   ├── v2/
│   │   │   └── Taskfile.yml
│   │   └── v3/
│   │       └── Taskfile.yml
│   ├── watch/
│   │   ├── .gitignore
│   │   └── Taskfile.yaml
│   └── wildcards/
│       └── Taskfile.yml
├── variables.go
├── watch.go
├── watch_test.go
└── website/
    ├── .gitignore
    ├── .prettierignore
    ├── .vitepress/
    │   ├── components/
    │   │   ├── AuthorCard.vue
    │   │   ├── BlogPost.vue
    │   │   ├── HomePage.vue
    │   │   ├── VPTeamMembersItem.vue
    │   │   └── Version.vue
    │   ├── components.d.ts
    │   ├── config.ts
    │   ├── meta.ts
    │   ├── plugins/
    │   │   └── github-links.ts
    │   ├── sponsors.ts
    │   ├── team.ts
    │   └── theme/
    │       ├── custom.css
    │       └── index.ts
    ├── Taskfile.yml
    ├── netlify.toml
    ├── package.json
    ├── prettier.config.js
    ├── src/
    │   ├── blog/
    │   │   ├── any-variables.md
    │   │   ├── if-and-variable-prompt.md
    │   │   ├── index.md
    │   │   ├── task-in-2023.md
    │   │   └── windows-core-utils.md
    │   ├── docs/
    │   │   ├── changelog.md
    │   │   ├── community.md
    │   │   ├── contributing.md
    │   │   ├── deprecations/
    │   │   │   ├── completion-scripts.md
    │   │   │   ├── index.md
    │   │   │   ├── template-functions.md
    │   │   │   ├── template.md
    │   │   │   └── version-2-schema.md
    │   │   ├── experiments/
    │   │   │   ├── env-precedence.md
    │   │   │   ├── gentle-force.md
    │   │   │   ├── index.md
    │   │   │   ├── remote-taskfiles.md
    │   │   │   └── template.md
    │   │   ├── faq.md
    │   │   ├── getting-started.md
    │   │   ├── guide.md
    │   │   ├── installation.md
    │   │   ├── integrations.md
    │   │   ├── reference/
    │   │   │   ├── cli.md
    │   │   │   ├── config.md
    │   │   │   ├── environment.md
    │   │   │   ├── package.md
    │   │   │   ├── schema.md
    │   │   │   └── templating.md
    │   │   ├── releasing.md
    │   │   ├── styleguide.md
    │   │   └── taskfile-versions.md
    │   ├── donate.md
    │   ├── index.md
    │   ├── public/
    │   │   ├── CNAME
    │   │   ├── _redirects
    │   │   ├── install.sh
    │   │   ├── robots.txt
    │   │   ├── schema-taskrc.json
    │   │   └── schema.json
    │   └── team.md
    └── tsconfig.json
Download .txt
SYMBOL INDEX (1160 symbols across 124 files)

FILE: args/args.go
  function Get (line 16) | func Get() ([]string, []string, error) {
  function Parse (line 27) | func Parse(args ...string) ([]*task.Call, *ast.Vars) {
  function ToQuotedString (line 44) | func ToQuotedString(args []string) (string, error) {
  function splitVar (line 56) | func splitVar(s string) (string, string) {

FILE: args/args_test.go
  function TestArgs (line 14) | func TestArgs(t *testing.T) {

FILE: call.go
  type Call (line 6) | type Call struct

FILE: cmd/release/main.go
  constant changelogSource (line 17) | changelogSource = "CHANGELOG.md"
  constant changelogTarget (line 18) | changelogTarget = "website/src/docs/changelog.md"
  constant versionFile (line 19) | versionFile     = "internal/version/version.txt"
  function init (line 29) | func init() {
  function main (line 34) | func main() {
  function release (line 41) | func release() error {
  function getVersion (line 71) | func getVersion(filename string) (*semver.Version, error) {
  function bumpVersion (line 79) | func bumpVersion(version *semver.Version, verb string) error {
  function changelog (line 93) | func changelog(version *semver.Version) error {
  function setVersionFile (line 135) | func setVersionFile(fileName string, version *semver.Version) error {

FILE: cmd/sleepit/sleepit.go
  constant usage (line 14) | usage = `sleepit: sleep for the specified duration, optionally handling ...
  function main (line 25) | func main() {
  function run (line 29) | func run(args []string) int {
  function supervisor (line 86) | func supervisor(
  function worker (line 136) | func worker(
  function doSomeWork (line 164) | func doSomeWork(deadline time.Time) bool {

FILE: cmd/task/task.go
  function main (line 23) | func main() {
  function emitCIErrorAnnotation (line 49) | func emitCIErrorAnnotation(err error) {
  function run (line 60) | func run() error {

FILE: compiler.go
  type Compiler (line 21) | type Compiler struct
    method GetTaskfileVariables (line 35) | func (c *Compiler) GetTaskfileVariables() (*ast.Vars, error) {
    method GetVariables (line 39) | func (c *Compiler) GetVariables(t *ast.Task, call *Call) (*ast.Vars, e...
    method FastGetVariables (line 43) | func (c *Compiler) FastGetVariables(t *ast.Task, call *Call) (*ast.Var...
    method getVariables (line 47) | func (c *Compiler) getVariables(t *ast.Task, call *Call, evaluateShVar...
    method HandleDynamicVar (line 148) | func (c *Compiler) HandleDynamicVar(v ast.Var, dir string, e []string)...
    method ResetCache (line 193) | func (c *Compiler) ResetCache() {
    method getSpecialVars (line 200) | func (c *Compiler) getSpecialVars(t *ast.Task, call *Call) (map[string...

FILE: completion.go
  function Completion (line 20) | func Completion(completion string) (string, error) {

FILE: concurrency.go
  method acquireConcurrencyLimit (line 3) | func (e *Executor) acquireConcurrencyLimit() func() {
  method releaseConcurrencyLimit (line 14) | func (e *Executor) releaseConcurrencyLimit() func() {
  function emptyFunc (line 25) | func emptyFunc() {}

FILE: errors/error_taskfile_decode.go
  type TaskfileDecodeError (line 15) | type TaskfileDecodeError struct
    method Error (line 40) | func (err *TaskfileDecodeError) Error() string {
    method Debug (line 68) | func (err *TaskfileDecodeError) Debug() string {
    method Unwrap (line 105) | func (err *TaskfileDecodeError) Unwrap() error {
    method Code (line 109) | func (err *TaskfileDecodeError) Code() int {
    method WithMessage (line 113) | func (err *TaskfileDecodeError) WithMessage(format string, a ...any) *...
    method WithTypeMessage (line 118) | func (err *TaskfileDecodeError) WithTypeMessage(t string) *TaskfileDec...
    method WithFileInfo (line 123) | func (err *TaskfileDecodeError) WithFileInfo(location string, snippet ...
  function NewTaskfileDecodeError (line 26) | func NewTaskfileDecodeError(err error, node *yaml.Node) *TaskfileDecodeE...

FILE: errors/errors.go
  constant CodeOk (line 7) | CodeOk      int = iota
  constant CodeUnknown (line 8) | CodeUnknown
  constant CodeTaskRCNotFoundError (line 13) | CodeTaskRCNotFoundError int = iota + 50
  constant CodeTaskfileNotFound (line 18) | CodeTaskfileNotFound int = iota + 100
  constant CodeTaskfileAlreadyExists (line 19) | CodeTaskfileAlreadyExists
  constant CodeTaskfileDecode (line 20) | CodeTaskfileDecode
  constant CodeTaskfileFetchFailed (line 21) | CodeTaskfileFetchFailed
  constant CodeTaskfileNotTrusted (line 22) | CodeTaskfileNotTrusted
  constant CodeTaskfileNotSecure (line 23) | CodeTaskfileNotSecure
  constant CodeTaskfileCacheNotFound (line 24) | CodeTaskfileCacheNotFound
  constant CodeTaskfileVersionCheckError (line 25) | CodeTaskfileVersionCheckError
  constant CodeTaskfileNetworkTimeout (line 26) | CodeTaskfileNetworkTimeout
  constant CodeTaskfileInvalid (line 27) | CodeTaskfileInvalid
  constant CodeTaskfileCycle (line 28) | CodeTaskfileCycle
  constant CodeTaskfileDoesNotMatchChecksum (line 29) | CodeTaskfileDoesNotMatchChecksum
  constant CodeTaskNotFound (line 34) | CodeTaskNotFound int = iota + 200
  constant CodeTaskRunError (line 35) | CodeTaskRunError
  constant CodeTaskInternal (line 36) | CodeTaskInternal
  constant CodeTaskNameConflict (line 37) | CodeTaskNameConflict
  constant CodeTaskCalledTooManyTimes (line 38) | CodeTaskCalledTooManyTimes
  constant CodeTaskCancelled (line 39) | CodeTaskCancelled
  constant CodeTaskMissingRequiredVars (line 40) | CodeTaskMissingRequiredVars
  constant CodeTaskNotAllowedVars (line 41) | CodeTaskNotAllowedVars
  type TaskError (line 47) | type TaskError interface
  function New (line 55) | func New(text string) error {
  function Is (line 60) | func Is(err, target error) bool {
  function As (line 65) | func As(err error, target any) bool {
  function Unwrap (line 70) | func Unwrap(err error) error {

FILE: errors/errors_task.go
  type TaskNotFoundError (line 13) | type TaskNotFoundError struct
    method Error (line 18) | func (err *TaskNotFoundError) Error() string {
    method Code (line 30) | func (err *TaskNotFoundError) Code() int {
  type TaskRunError (line 36) | type TaskRunError struct
    method Error (line 41) | func (err *TaskRunError) Error() string {
    method Code (line 45) | func (err *TaskRunError) Code() int {
    method TaskExitCode (line 49) | func (err *TaskRunError) TaskExitCode() int {
    method Unwrap (line 57) | func (err *TaskRunError) Unwrap() error {
  type TaskInternalError (line 62) | type TaskInternalError struct
    method Error (line 66) | func (err *TaskInternalError) Error() string {
    method Code (line 70) | func (err *TaskInternalError) Code() int {
  type TaskNameConflictError (line 76) | type TaskNameConflictError struct
    method Error (line 81) | func (err *TaskNameConflictError) Error() string {
    method Code (line 85) | func (err *TaskNameConflictError) Code() int {
  type TaskNameFlattenConflictError (line 89) | type TaskNameFlattenConflictError struct
    method Error (line 94) | func (err *TaskNameFlattenConflictError) Error() string {
    method Code (line 98) | func (err *TaskNameFlattenConflictError) Code() int {
  type TaskCalledTooManyTimesError (line 104) | type TaskCalledTooManyTimesError struct
    method Error (line 109) | func (err *TaskCalledTooManyTimesError) Error() string {
    method Code (line 117) | func (err *TaskCalledTooManyTimesError) Code() int {
  type TaskCancelledByUserError (line 122) | type TaskCancelledByUserError struct
    method Error (line 126) | func (err *TaskCancelledByUserError) Error() string {
    method Code (line 130) | func (err *TaskCancelledByUserError) Code() int {
  type TaskCancelledNoTerminalError (line 135) | type TaskCancelledNoTerminalError struct
    method Error (line 139) | func (err *TaskCancelledNoTerminalError) Error() string {
    method Code (line 146) | func (err *TaskCancelledNoTerminalError) Code() int {
  type MissingVar (line 152) | type MissingVar struct
    method String (line 161) | func (v MissingVar) String() string {
  type TaskMissingRequiredVarsError (line 156) | type TaskMissingRequiredVarsError struct
    method Error (line 168) | func (err *TaskMissingRequiredVarsError) Error() string {
    method Code (line 180) | func (err *TaskMissingRequiredVarsError) Code() int {
  type NotAllowedVar (line 184) | type NotAllowedVar struct
  type TaskNotAllowedVarsError (line 190) | type TaskNotAllowedVarsError struct
    method Error (line 195) | func (err *TaskNotAllowedVarsError) Error() string {
    method Code (line 206) | func (err *TaskNotAllowedVarsError) Code() int {

FILE: errors/errors_taskfile.go
  type TaskfileNotFoundError (line 13) | type TaskfileNotFoundError struct
    method Error (line 20) | func (err TaskfileNotFoundError) Error() string {
    method Code (line 33) | func (err TaskfileNotFoundError) Code() int {
  type TaskfileAlreadyExistsError (line 39) | type TaskfileAlreadyExistsError struct
    method Error (line 41) | func (err TaskfileAlreadyExistsError) Error() string {
    method Code (line 45) | func (err TaskfileAlreadyExistsError) Code() int {
  type TaskfileInvalidError (line 51) | type TaskfileInvalidError struct
    method Error (line 56) | func (err TaskfileInvalidError) Error() string {
    method Code (line 60) | func (err TaskfileInvalidError) Code() int {
  type TaskfileFetchFailedError (line 66) | type TaskfileFetchFailedError struct
    method Error (line 71) | func (err TaskfileFetchFailedError) Error() string {
    method Code (line 79) | func (err TaskfileFetchFailedError) Code() int {
  type TaskfileNotTrustedError (line 85) | type TaskfileNotTrustedError struct
    method Error (line 89) | func (err *TaskfileNotTrustedError) Error() string {
    method Code (line 96) | func (err *TaskfileNotTrustedError) Code() int {
  type TaskfileNotSecureError (line 102) | type TaskfileNotSecureError struct
    method Error (line 106) | func (err *TaskfileNotSecureError) Error() string {
    method Code (line 113) | func (err *TaskfileNotSecureError) Code() int {
  type TaskfileCacheNotFoundError (line 119) | type TaskfileCacheNotFoundError struct
    method Error (line 123) | func (err *TaskfileCacheNotFoundError) Error() string {
    method Code (line 130) | func (err *TaskfileCacheNotFoundError) Code() int {
  type TaskfileVersionCheckError (line 137) | type TaskfileVersionCheckError struct
    method Error (line 143) | func (err *TaskfileVersionCheckError) Error() string {
    method Code (line 158) | func (err *TaskfileVersionCheckError) Code() int {
  type TaskfileNetworkTimeoutError (line 164) | type TaskfileNetworkTimeoutError struct
    method Error (line 169) | func (err *TaskfileNetworkTimeoutError) Error() string {
    method Code (line 176) | func (err *TaskfileNetworkTimeoutError) Code() int {
  type TaskfileCycleError (line 182) | type TaskfileCycleError struct
    method Error (line 187) | func (err TaskfileCycleError) Error() string {
    method Code (line 194) | func (err TaskfileCycleError) Code() int {
  type TaskfileDoesNotMatchChecksum (line 200) | type TaskfileDoesNotMatchChecksum struct
    method Error (line 206) | func (err *TaskfileDoesNotMatchChecksum) Error() string {
    method Code (line 215) | func (err *TaskfileDoesNotMatchChecksum) Code() int {

FILE: errors/errors_taskrc.go
  type TaskRCNotFoundError (line 5) | type TaskRCNotFoundError struct
    method Error (line 10) | func (err TaskRCNotFoundError) Error() string {
    method Code (line 18) | func (err TaskRCNotFoundError) Code() int {

FILE: executor.go
  type ExecutorOption (line 22) | type ExecutorOption interface
  type Executor (line 27) | type Executor struct
    method Options (line 118) | func (e *Executor) Options(opts ...ExecutorOption) {
  type TempDir (line 85) | type TempDir struct
  function NewExecutor (line 93) | func NewExecutor(opts ...ExecutorOption) *Executor {
  function WithDir (line 126) | func WithDir(dir string) ExecutorOption {
  type dirOption (line 130) | type dirOption struct
    method ApplyToExecutor (line 134) | func (o *dirOption) ApplyToExecutor(e *Executor) {
  function WithEntrypoint (line 141) | func WithEntrypoint(entrypoint string) ExecutorOption {
  type entrypointOption (line 145) | type entrypointOption struct
    method ApplyToExecutor (line 149) | func (o *entrypointOption) ApplyToExecutor(e *Executor) {
  function WithTempDir (line 156) | func WithTempDir(tempDir TempDir) ExecutorOption {
  type tempDirOption (line 160) | type tempDirOption struct
    method ApplyToExecutor (line 164) | func (o *tempDirOption) ApplyToExecutor(e *Executor) {
  function WithForce (line 170) | func WithForce(force bool) ExecutorOption {
  type forceOption (line 174) | type forceOption struct
    method ApplyToExecutor (line 178) | func (o *forceOption) ApplyToExecutor(e *Executor) {
  function WithForceAll (line 184) | func WithForceAll(forceAll bool) ExecutorOption {
  type forceAllOption (line 188) | type forceAllOption struct
    method ApplyToExecutor (line 192) | func (o *forceAllOption) ApplyToExecutor(e *Executor) {
  function WithInsecure (line 198) | func WithInsecure(insecure bool) ExecutorOption {
  type insecureOption (line 202) | type insecureOption struct
    method ApplyToExecutor (line 206) | func (o *insecureOption) ApplyToExecutor(e *Executor) {
  function WithDownload (line 212) | func WithDownload(download bool) ExecutorOption {
  type downloadOption (line 216) | type downloadOption struct
    method ApplyToExecutor (line 220) | func (o *downloadOption) ApplyToExecutor(e *Executor) {
  function WithOffline (line 226) | func WithOffline(offline bool) ExecutorOption {
  type offlineOption (line 230) | type offlineOption struct
    method ApplyToExecutor (line 234) | func (o *offlineOption) ApplyToExecutor(e *Executor) {
  function WithTrustedHosts (line 240) | func WithTrustedHosts(trustedHosts []string) ExecutorOption {
  type trustedHostsOption (line 244) | type trustedHostsOption struct
    method ApplyToExecutor (line 248) | func (o *trustedHostsOption) ApplyToExecutor(e *Executor) {
  function WithTimeout (line 254) | func WithTimeout(timeout time.Duration) ExecutorOption {
  type timeoutOption (line 258) | type timeoutOption struct
    method ApplyToExecutor (line 262) | func (o *timeoutOption) ApplyToExecutor(e *Executor) {
  function WithCacheExpiryDuration (line 268) | func WithCacheExpiryDuration(duration time.Duration) ExecutorOption {
  type cacheExpiryDurationOption (line 272) | type cacheExpiryDurationOption struct
    method ApplyToExecutor (line 276) | func (o *cacheExpiryDurationOption) ApplyToExecutor(r *Executor) {
  function WithRemoteCacheDir (line 281) | func WithRemoteCacheDir(dir string) ExecutorOption {
  type remoteCacheDirOption (line 285) | type remoteCacheDirOption struct
    method ApplyToExecutor (line 289) | func (o *remoteCacheDirOption) ApplyToExecutor(e *Executor) {
  function WithCACert (line 294) | func WithCACert(caCert string) ExecutorOption {
  type caCertOption (line 298) | type caCertOption struct
    method ApplyToExecutor (line 302) | func (o *caCertOption) ApplyToExecutor(e *Executor) {
  function WithCert (line 307) | func WithCert(cert string) ExecutorOption {
  type certOption (line 311) | type certOption struct
    method ApplyToExecutor (line 315) | func (o *certOption) ApplyToExecutor(e *Executor) {
  function WithCertKey (line 320) | func WithCertKey(certKey string) ExecutorOption {
  type certKeyOption (line 324) | type certKeyOption struct
    method ApplyToExecutor (line 328) | func (o *certKeyOption) ApplyToExecutor(e *Executor) {
  function WithWatch (line 335) | func WithWatch(watch bool) ExecutorOption {
  type watchOption (line 339) | type watchOption struct
    method ApplyToExecutor (line 343) | func (o *watchOption) ApplyToExecutor(e *Executor) {
  function WithVerbose (line 349) | func WithVerbose(verbose bool) ExecutorOption {
  type verboseOption (line 353) | type verboseOption struct
    method ApplyToExecutor (line 357) | func (o *verboseOption) ApplyToExecutor(e *Executor) {
  function WithSilent (line 363) | func WithSilent(silent bool) ExecutorOption {
  type silentOption (line 367) | type silentOption struct
    method ApplyToExecutor (line 371) | func (o *silentOption) ApplyToExecutor(e *Executor) {
  function WithDisableFuzzy (line 376) | func WithDisableFuzzy(disableFuzzy bool) ExecutorOption {
  type disableFuzzyOption (line 380) | type disableFuzzyOption struct
    method ApplyToExecutor (line 384) | func (o *disableFuzzyOption) ApplyToExecutor(e *Executor) {
  function WithAssumeYes (line 389) | func WithAssumeYes(assumeYes bool) ExecutorOption {
  type assumeYesOption (line 393) | type assumeYesOption struct
    method ApplyToExecutor (line 397) | func (o *assumeYesOption) ApplyToExecutor(e *Executor) {
  function WithAssumeTerm (line 402) | func WithAssumeTerm(assumeTerm bool) ExecutorOption {
  type assumeTermOption (line 406) | type assumeTermOption struct
    method ApplyToExecutor (line 410) | func (o *assumeTermOption) ApplyToExecutor(e *Executor) {
  function WithInteractive (line 415) | func WithInteractive(interactive bool) ExecutorOption {
  type interactiveOption (line 419) | type interactiveOption struct
    method ApplyToExecutor (line 423) | func (o *interactiveOption) ApplyToExecutor(e *Executor) {
  function WithDry (line 429) | func WithDry(dry bool) ExecutorOption {
  type dryOption (line 433) | type dryOption struct
    method ApplyToExecutor (line 437) | func (o *dryOption) ApplyToExecutor(e *Executor) {
  function WithSummary (line 443) | func WithSummary(summary bool) ExecutorOption {
  type summaryOption (line 447) | type summaryOption struct
    method ApplyToExecutor (line 451) | func (o *summaryOption) ApplyToExecutor(e *Executor) {
  function WithParallel (line 457) | func WithParallel(parallel bool) ExecutorOption {
  type parallelOption (line 461) | type parallelOption struct
    method ApplyToExecutor (line 465) | func (o *parallelOption) ApplyToExecutor(e *Executor) {
  function WithColor (line 471) | func WithColor(color bool) ExecutorOption {
  type colorOption (line 475) | type colorOption struct
    method ApplyToExecutor (line 479) | func (o *colorOption) ApplyToExecutor(e *Executor) {
  function WithConcurrency (line 485) | func WithConcurrency(concurrency int) ExecutorOption {
  type concurrencyOption (line 489) | type concurrencyOption struct
    method ApplyToExecutor (line 493) | func (o *concurrencyOption) ApplyToExecutor(e *Executor) {
  function WithInterval (line 499) | func WithInterval(interval time.Duration) ExecutorOption {
  type intervalOption (line 503) | type intervalOption struct
    method ApplyToExecutor (line 507) | func (o *intervalOption) ApplyToExecutor(e *Executor) {
  function WithOutputStyle (line 513) | func WithOutputStyle(outputStyle ast.Output) ExecutorOption {
  type outputStyleOption (line 517) | type outputStyleOption struct
    method ApplyToExecutor (line 521) | func (o *outputStyleOption) ApplyToExecutor(e *Executor) {
  function WithTaskSorter (line 528) | func WithTaskSorter(sorter sort.Sorter) ExecutorOption {
  type taskSorterOption (line 532) | type taskSorterOption struct
    method ApplyToExecutor (line 536) | func (o *taskSorterOption) ApplyToExecutor(e *Executor) {
  function WithStdin (line 541) | func WithStdin(stdin io.Reader) ExecutorOption {
  type stdinOption (line 545) | type stdinOption struct
    method ApplyToExecutor (line 549) | func (o *stdinOption) ApplyToExecutor(e *Executor) {
  function WithStdout (line 554) | func WithStdout(stdout io.Writer) ExecutorOption {
  type stdoutOption (line 558) | type stdoutOption struct
    method ApplyToExecutor (line 562) | func (o *stdoutOption) ApplyToExecutor(e *Executor) {
  function WithStderr (line 567) | func WithStderr(stderr io.Writer) ExecutorOption {
  type stderrOption (line 571) | type stderrOption struct
    method ApplyToExecutor (line 575) | func (o *stderrOption) ApplyToExecutor(e *Executor) {
  function WithIO (line 581) | func WithIO(rw io.ReadWriter) ExecutorOption {
  type ioOption (line 585) | type ioOption struct
    method ApplyToExecutor (line 589) | func (o *ioOption) ApplyToExecutor(e *Executor) {
  function WithVersionCheck (line 596) | func WithVersionCheck(enableVersionCheck bool) ExecutorOption {
  type versionCheckOption (line 600) | type versionCheckOption struct
    method ApplyToExecutor (line 604) | func (o *versionCheckOption) ApplyToExecutor(e *Executor) {
  function WithFailfast (line 609) | func WithFailfast(failfast bool) ExecutorOption {
  type failfastOption (line 613) | type failfastOption struct
    method ApplyToExecutor (line 617) | func (o *failfastOption) ApplyToExecutor(e *Executor) {

FILE: executor_test.go
  type ExecutorTestOption (line 22) | type ExecutorTestOption interface
  type ExecutorTest (line 31) | type ExecutorTest struct
    method writeFixtureErrRun (line 120) | func (tt *ExecutorTest) writeFixtureErrRun(
    method writeFixtureStatus (line 131) | func (tt *ExecutorTest) writeFixtureStatus(
    method run (line 142) | func (tt *ExecutorTest) run(t *testing.T) {
  function NewExecutorTest (line 46) | func NewExecutorTest(t *testing.T, opts ...ExecutorTestOption) {
  function WithInput (line 79) | func WithInput(input string) ExecutorTestOption {
  type inputTestOption (line 83) | type inputTestOption struct
    method applyToExecutorTest (line 87) | func (opt *inputTestOption) applyToExecutorTest(t *ExecutorTest) {
  function WithRunError (line 93) | func WithRunError() ExecutorTestOption {
  type runErrorTestOption (line 97) | type runErrorTestOption struct
    method applyToExecutorTest (line 99) | func (opt *runErrorTestOption) applyToExecutorTest(t *ExecutorTest) {
  function WithStatusError (line 106) | func WithStatusError() ExecutorTestOption {
  type statusErrorTestOption (line 110) | type statusErrorTestOption struct
    method applyToExecutorTest (line 112) | func (opt *statusErrorTestOption) applyToExecutorTest(t *ExecutorTest) {
  function TestEmptyTask (line 219) | func TestEmptyTask(t *testing.T) {
  function TestEmptyTaskfile (line 228) | func TestEmptyTaskfile(t *testing.T) {
  function TestEnv (line 239) | func TestEnv(t *testing.T) {
  function TestVars (line 258) | func TestVars(t *testing.T) {
  function TestRequires (line 285) | func TestRequires(t *testing.T) {
  function TestSpecialVars (line 357) | func TestSpecialVars(t *testing.T) {
  function TestConcurrency (line 394) | func TestConcurrency(t *testing.T) {
  function TestParams (line 405) | func TestParams(t *testing.T) {
  function TestDeps (line 416) | func TestDeps(t *testing.T) {
  function TestStatus (line 428) | func TestStatus(t *testing.T) {
  function TestPrecondition (line 576) | func TestPrecondition(t *testing.T) {
  function TestAlias (line 612) | func TestAlias(t *testing.T) {
  function TestSummaryWithVarsAndRequires (line 642) | func TestSummaryWithVarsAndRequires(t *testing.T) {
  function TestLabel (line 666) | func TestLabel(t *testing.T) {
  function TestPrefix (line 721) | func TestPrefix(t *testing.T) {
  function TestPromptInSummary (line 742) | func TestPromptInSummary(t *testing.T) {
  function TestPromptWithIndirectTask (line 779) | func TestPromptWithIndirectTask(t *testing.T) {
  function TestPromptAssumeYes (line 792) | func TestPromptAssumeYes(t *testing.T) {
  function TestForCmds (line 818) | func TestForCmds(t *testing.T) {
  function TestForDeps (line 861) | func TestForDeps(t *testing.T) {
  function TestReference (line 907) | func TestReference(t *testing.T) {
  function TestVarInheritance (line 945) | func TestVarInheritance(t *testing.T) {
  function TestFuzzyModel (line 1013) | func TestFuzzyModel(t *testing.T) {
  function TestIncludeChecksum (line 1043) | func TestIncludeChecksum(t *testing.T) {
  function TestIncludeSilent (line 1063) | func TestIncludeSilent(t *testing.T) {
  function TestFailfast (line 1075) | func TestFailfast(t *testing.T) {
  function TestIf (line 1122) | func TestIf(t *testing.T) {

FILE: experiments/errors.go
  type InvalidValueError (line 11) | type InvalidValueError struct
    method Error (line 17) | func (err InvalidValueError) Error() string {
  type InactiveError (line 26) | type InactiveError struct
    method Error (line 30) | func (err InactiveError) Error() string {

FILE: experiments/experiment.go
  type Experiment (line 11) | type Experiment struct
    method Enabled (line 38) | func (x Experiment) Enabled() bool {
    method Active (line 42) | func (x Experiment) Active() bool {
    method Valid (line 46) | func (x Experiment) Valid() error {
    method String (line 62) | func (x Experiment) String() string {
  function New (line 19) | func New(xName string, config *ast.TaskRC, allowedValues ...int) Experim...

FILE: experiments/experiment_test.go
  function TestNew (line 13) | func TestNew(t *testing.T) {

FILE: experiments/experiments.go
  constant envPrefix (line 15) | envPrefix = "TASK_X_"
  function Parse (line 34) | func Parse(dir string) {
  function ParseWithConfig (line 39) | func ParseWithConfig(dir string, config *ast.TaskRC) {
  function Validate (line 52) | func Validate() error {
  function List (line 61) | func List() []Experiment {
  function getEnv (line 65) | func getEnv(xName string) string {
  function getFilePath (line 70) | func getFilePath(filename, dir string) string {
  function readDotEnv (line 77) | func readDotEnv(dir string) {

FILE: formatter_test.go
  type FormatterTestOption (line 18) | type FormatterTestOption interface
  type FormatterTest (line 27) | type FormatterTest struct
    method writeFixtureErrList (line 101) | func (tt *FormatterTest) writeFixtureErrList(
    method run (line 112) | func (tt *FormatterTest) run(t *testing.T) {
  function NewFormatterTest (line 41) | func NewFormatterTest(t *testing.T, opts ...FormatterTestOption) {
  function WithListOptions (line 73) | func WithListOptions(opts task.ListOptions) FormatterTestOption {
  type listOptionsTestOption (line 77) | type listOptionsTestOption struct
    method applyToFormatterTest (line 81) | func (opt *listOptionsTestOption) applyToFormatterTest(t *FormatterTes...
  function WithListError (line 87) | func WithListError() FormatterTestOption {
  type listErrorTestOption (line 91) | type listErrorTestOption struct
    method applyToFormatterTest (line 93) | func (opt *listErrorTestOption) applyToFormatterTest(t *FormatterTest) {
  function TestNoLabelInList (line 169) | func TestNoLabelInList(t *testing.T) {
  function TestListAllShowsNoDesc (line 183) | func TestListAllShowsNoDesc(t *testing.T) {
  function TestListCanListDescOnly (line 197) | func TestListCanListDescOnly(t *testing.T) {
  function TestListDescInterpolation (line 210) | func TestListDescInterpolation(t *testing.T) {
  function TestJsonListFormat (line 223) | func TestJsonListFormat(t *testing.T) {

FILE: hash.go
  method GetHash (line 11) | func (e *Executor) GetHash(t *ast.Task) (string, error) {

FILE: help.go
  type ListOptions (line 22) | type ListOptions struct
    method ShouldListTasks (line 42) | func (o ListOptions) ShouldListTasks() bool {
    method Filters (line 48) | func (o ListOptions) Filters() []FilterFunc {
  function NewListOptions (line 31) | func NewListOptions(list, listAll, listAsJson, noStatus, nested bool) Li...
  method ListTasks (line 62) | func (e *Executor) ListTasks(o ListOptions) (bool, error) {
  method ListTaskNames (line 112) | func (e *Executor) ListTaskNames(allTasks bool) error {
  method ToEditorOutput (line 140) | func (e *Executor) ToEditorOutput(tasks []*ast.Task, noStatus bool, nest...

FILE: init.go
  constant defaultFilename (line 12) | defaultFilename = "Taskfile.yml"
  function InitTaskfile (line 23) | func InitTaskfile(path string) (string, error) {
  function hasDefaultTaskfile (line 43) | func hasDefaultTaskfile(dir string) bool {

FILE: init_test.go
  function TestInitDir (line 11) | func TestInitDir(t *testing.T) {
  function TestInitFile (line 33) | func TestInitFile(t *testing.T) {

FILE: internal/deepcopy/deepcopy.go
  type Copier (line 9) | type Copier interface
  function Scalar (line 13) | func Scalar[T any](orig *T) *T {
  function Slice (line 22) | func Slice[T any](orig []T) []T {
  function Map (line 37) | func Map[K comparable, V any](orig map[K]V) map[K]V {
  function OrderedMap (line 52) | func OrderedMap[K comparable, V any](orig *orderedmap.OrderedMap[K, V]) ...
  function TraverseStringsFunc (line 73) | func TraverseStringsFunc[T any](v T, fn func(v string) (string, error)) ...

FILE: internal/editors/output.go
  type Namespace (line 9) | type Namespace struct
    method AddNamespace (line 51) | func (parent *Namespace) AddNamespace(namespacePath []string, task Tas...
  type Task (line 15) | type Task struct
  type Location (line 25) | type Location struct
  function NewTask (line 32) | func NewTask(task *ast.Task) Task {

FILE: internal/env/env.go
  constant taskVarPrefix (line 14) | taskVarPrefix = "TASK_"
  function GetEnviron (line 18) | func GetEnviron() *ast.Vars {
  function Get (line 28) | func Get(t *ast.Task) []string {
  function GetFromVars (line 36) | func GetFromVars(env *ast.Vars) []string {
  function isTypeAllowed (line 54) | func isTypeAllowed(v any) bool {
  function GetTaskEnv (line 63) | func GetTaskEnv(key string) string {
  function GetTaskEnvBool (line 69) | func GetTaskEnvBool(key string) (bool, bool) {
  function GetTaskEnvInt (line 80) | func GetTaskEnvInt(key string) (int, bool) {
  function GetTaskEnvDuration (line 91) | func GetTaskEnvDuration(key string) (time.Duration, bool) {
  function GetTaskEnvString (line 102) | func GetTaskEnvString(key string) (string, bool) {
  function GetTaskEnvStringSlice (line 109) | func GetTaskEnvStringSlice(key string) ([]string, bool) {

FILE: internal/execext/coreutils.go
  function init (line 12) | func init() {

FILE: internal/execext/devnull.go
  type devNull (line 9) | type devNull struct
    method Read (line 11) | func (devNull) Read(p []byte) (int, error)  { return 0, io.EOF }
    method Write (line 12) | func (devNull) Write(p []byte) (int, error) { return len(p), nil }
    method Close (line 13) | func (devNull) Close() error                { return nil }

FILE: internal/execext/exec.go
  type RunCommandOptions (line 23) | type RunCommandOptions struct
  function RunCommand (line 35) | func RunCommand(ctx context.Context, opts *RunCommandOptions) error {
  function escape (line 93) | func escape(s string) string {
  function ExpandLiteral (line 105) | func ExpandLiteral(s string) (string, error) {
  function ExpandFields (line 126) | func ExpandFields(s string) ([]string, error) {
  function execHandlers (line 142) | func execHandlers() (handlers []func(next interp.ExecHandlerFunc) interp...
  function openHandler (line 149) | func openHandler(ctx context.Context, path string, flag int, perm os.Fil...
  function dirOption (line 156) | func dirOption(path string) interp.RunnerOption {

FILE: internal/filepathext/filepathext.go
  function SmartJoin (line 11) | func SmartJoin(a, b string) string {
  function IsAbs (line 18) | func IsAbs(path string) bool {
  function isSpecialDir (line 34) | func isSpecialDir(dir string) bool {
  function TryAbsToRel (line 45) | func TryAbsToRel(abs string) string {
  function IsExtOnly (line 61) | func IsExtOnly(path string) bool {

FILE: internal/fingerprint/checker.go
  type StatusCheckable (line 10) | type StatusCheckable interface
  type SourcesCheckable (line 15) | type SourcesCheckable interface

FILE: internal/fingerprint/checker_mock.go
  function NewMockStatusCheckable (line 16) | func NewMockStatusCheckable(t interface {
  type MockStatusCheckable (line 29) | type MockStatusCheckable struct
    method EXPECT (line 37) | func (_m *MockStatusCheckable) EXPECT() *MockStatusCheckable_Expecter {
    method IsUpToDate (line 42) | func (_mock *MockStatusCheckable) IsUpToDate(ctx context.Context, t *a...
  type MockStatusCheckable_Expecter (line 33) | type MockStatusCheckable_Expecter struct
    method IsUpToDate (line 75) | func (_e *MockStatusCheckable_Expecter) IsUpToDate(ctx interface{}, t ...
  type MockStatusCheckable_IsUpToDate_Call (line 68) | type MockStatusCheckable_IsUpToDate_Call struct
    method Run (line 79) | func (_c *MockStatusCheckable_IsUpToDate_Call) Run(run func(ctx contex...
    method Return (line 86) | func (_c *MockStatusCheckable_IsUpToDate_Call) Return(b bool, err erro...
    method RunAndReturn (line 91) | func (_c *MockStatusCheckable_IsUpToDate_Call) RunAndReturn(run func(c...
  function NewMockSourcesCheckable (line 98) | func NewMockSourcesCheckable(t interface {
  type MockSourcesCheckable (line 111) | type MockSourcesCheckable struct
    method EXPECT (line 119) | func (_m *MockSourcesCheckable) EXPECT() *MockSourcesCheckable_Expecter {
    method IsUpToDate (line 124) | func (_mock *MockSourcesCheckable) IsUpToDate(t *ast.Task) (bool, erro...
    method Kind (line 178) | func (_mock *MockSourcesCheckable) Kind() string {
    method OnError (line 222) | func (_mock *MockSourcesCheckable) OnError(t *ast.Task) error {
    method Value (line 267) | func (_mock *MockSourcesCheckable) Value(t *ast.Task) (any, error) {
  type MockSourcesCheckable_Expecter (line 115) | type MockSourcesCheckable_Expecter struct
    method IsUpToDate (line 156) | func (_e *MockSourcesCheckable_Expecter) IsUpToDate(t interface{}) *Mo...
    method Kind (line 200) | func (_e *MockSourcesCheckable_Expecter) Kind() *MockSourcesCheckable_...
    method OnError (line 245) | func (_e *MockSourcesCheckable_Expecter) OnError(t interface{}) *MockS...
    method Value (line 301) | func (_e *MockSourcesCheckable_Expecter) Value(t interface{}) *MockSou...
  type MockSourcesCheckable_IsUpToDate_Call (line 150) | type MockSourcesCheckable_IsUpToDate_Call struct
    method Run (line 160) | func (_c *MockSourcesCheckable_IsUpToDate_Call) Run(run func(t *ast.Ta...
    method Return (line 167) | func (_c *MockSourcesCheckable_IsUpToDate_Call) Return(b bool, err err...
    method RunAndReturn (line 172) | func (_c *MockSourcesCheckable_IsUpToDate_Call) RunAndReturn(run func(...
  type MockSourcesCheckable_Kind_Call (line 195) | type MockSourcesCheckable_Kind_Call struct
    method Run (line 204) | func (_c *MockSourcesCheckable_Kind_Call) Run(run func()) *MockSources...
    method Return (line 211) | func (_c *MockSourcesCheckable_Kind_Call) Return(s string) *MockSource...
    method RunAndReturn (line 216) | func (_c *MockSourcesCheckable_Kind_Call) RunAndReturn(run func() stri...
  type MockSourcesCheckable_OnError_Call (line 239) | type MockSourcesCheckable_OnError_Call struct
    method Run (line 249) | func (_c *MockSourcesCheckable_OnError_Call) Run(run func(t *ast.Task)...
    method Return (line 256) | func (_c *MockSourcesCheckable_OnError_Call) Return(err error) *MockSo...
    method RunAndReturn (line 261) | func (_c *MockSourcesCheckable_OnError_Call) RunAndReturn(run func(t *...
  type MockSourcesCheckable_Value_Call (line 295) | type MockSourcesCheckable_Value_Call struct
    method Run (line 305) | func (_c *MockSourcesCheckable_Value_Call) Run(run func(t *ast.Task)) ...
    method Return (line 312) | func (_c *MockSourcesCheckable_Value_Call) Return(v any, err error) *M...
    method RunAndReturn (line 317) | func (_c *MockSourcesCheckable_Value_Call) RunAndReturn(run func(t *as...

FILE: internal/fingerprint/glob.go
  function Globs (line 12) | func Globs(dir string, globs []*ast.Glob) ([]string, error) {
  function glob (line 26) | func glob(dir string, g string) ([]string, error) {
  function collectKeys (line 49) | func collectKeys(m map[string]bool) []string {

FILE: internal/fingerprint/sources.go
  function NewSourcesChecker (line 5) | func NewSourcesChecker(method, tempDir string, dry bool) (SourcesCheckab...

FILE: internal/fingerprint/sources_checksum.go
  type ChecksumChecker (line 19) | type ChecksumChecker struct
    method IsUpToDate (line 31) | func (checker *ChecksumChecker) IsUpToDate(t *ast.Task) (bool, error) {
    method Value (line 75) | func (checker *ChecksumChecker) Value(t *ast.Task) (any, error) {
    method OnError (line 79) | func (checker *ChecksumChecker) OnError(t *ast.Task) error {
    method Kind (line 86) | func (*ChecksumChecker) Kind() string {
    method checksum (line 90) | func (c *ChecksumChecker) checksum(t *ast.Task) (string, error) {
    method checksumFilePath (line 117) | func (checker *ChecksumChecker) checksumFilePath(t *ast.Task) string {
  function NewChecksumChecker (line 24) | func NewChecksumChecker(tempDir string, dry bool) *ChecksumChecker {
  function normalizeFilename (line 124) | func normalizeFilename(f string) string {

FILE: internal/fingerprint/sources_checksum_test.go
  function TestNormalizeFilename (line 9) | func TestNormalizeFilename(t *testing.T) {

FILE: internal/fingerprint/sources_none.go
  type NoneChecker (line 7) | type NoneChecker struct
    method IsUpToDate (line 9) | func (NoneChecker) IsUpToDate(t *ast.Task) (bool, error) {
    method Value (line 13) | func (NoneChecker) Value(t *ast.Task) (any, error) {
    method OnError (line 17) | func (NoneChecker) OnError(t *ast.Task) error {
    method Kind (line 21) | func (NoneChecker) Kind() string {

FILE: internal/fingerprint/sources_timestamp.go
  type TimestampChecker (line 13) | type TimestampChecker struct
    method IsUpToDate (line 26) | func (checker *TimestampChecker) IsUpToDate(t *ast.Task) (bool, error) {
    method Kind (line 87) | func (checker *TimestampChecker) Kind() string {
    method Value (line 92) | func (checker *TimestampChecker) Value(t *ast.Task) (any, error) {
    method OnError (line 145) | func (*TimestampChecker) OnError(t *ast.Task) error {
    method timestampFilePath (line 149) | func (checker *TimestampChecker) timestampFilePath(t *ast.Task) string {
  function NewTimestampChecker (line 18) | func NewTimestampChecker(tempDir string, dry bool) *TimestampChecker {
  function getMaxTime (line 110) | func getMaxTime(files ...string) (time.Time, error) {
  function maxTime (line 122) | func maxTime(a, b time.Time) time.Time {
  function anyFileNewerThan (line 131) | func anyFileNewerThan(files []string, givenTime time.Time) (bool, error) {

FILE: internal/fingerprint/status.go
  type StatusChecker (line 12) | type StatusChecker struct
    method IsUpToDate (line 22) | func (checker *StatusChecker) IsUpToDate(ctx context.Context, t *ast.T...
  function NewStatusChecker (line 16) | func NewStatusChecker(logger *logger.Logger) StatusCheckable {

FILE: internal/fingerprint/task.go
  type CheckerOption (line 11) | type CheckerOption
  type CheckerConfig (line 12) | type CheckerConfig struct
  function WithMethod (line 22) | func WithMethod(method string) CheckerOption {
  function WithDry (line 28) | func WithDry(dry bool) CheckerOption {
  function WithTempDir (line 34) | func WithTempDir(tempDir string) CheckerOption {
  function WithLogger (line 40) | func WithLogger(logger *logger.Logger) CheckerOption {
  function WithStatusChecker (line 46) | func WithStatusChecker(checker StatusCheckable) CheckerOption {
  function WithSourcesChecker (line 52) | func WithSourcesChecker(checker SourcesCheckable) CheckerOption {
  function IsTaskUpToDate (line 58) | func IsTaskUpToDate(

FILE: internal/fingerprint/task_test.go
  function TestIsTaskUpToDate (line 26) | func TestIsTaskUpToDate(t *testing.T) {

FILE: internal/flags/flags.go
  constant usage (line 24) | usage = `Usage: task [flags...] [task...]
  function init (line 92) | func init() {
  function isCI (line 199) | func isCI() bool {
  function Validate (line 204) | func Validate() error {
  function WithFlags (line 255) | func WithFlags() task.ExecutorOption {
  type flagsOption (line 259) | type flagsOption struct
    method ApplyToExecutor (line 261) | func (o *flagsOption) ApplyToExecutor(e *task.Executor) {
  function getConfig (line 315) | func getConfig[T any](config *taskrcast.TaskRC, envKey string, fieldFunc...
  function getEnvAs (line 330) | func getEnvAs[T any](envKey string) (T, bool) {

FILE: internal/fsext/fs.go
  function DefaultDir (line 16) | func DefaultDir(entrypoint, dir string) string {
  function ResolveDir (line 45) | func ResolveDir(entrypoint, resolvedEntrypoint, dir string) (string, err...
  function Search (line 62) | func Search(entrypoint, dir string, possibleFilenames []string) (string,...
  function SearchAll (line 94) | func SearchAll(entrypoint, dir string, possibleFilenames []string) ([]st...
  function SearchPath (line 122) | func SearchPath(path string, possibleFilenames []string) (string, error) {
  function SearchPathRecursively (line 154) | func SearchPathRecursively(path string, possibleFilenames []string) (str...
  function SearchNPathRecursively (line 173) | func SearchNPathRecursively(path string, possibleFilenames []string, n i...

FILE: internal/fsext/fs_test.go
  function TestDefaultDir (line 11) | func TestDefaultDir(t *testing.T) {
  function TestSearch (line 62) | func TestSearch(t *testing.T) {
  function TestResolveDir (line 144) | func TestResolveDir(t *testing.T) {

FILE: internal/fsnotifyext/fsnotify_dedup.go
  type Deduper (line 10) | type Deduper struct
    method GetChan (line 25) | func (d *Deduper) GetChan() <-chan fsnotify.Event {
  function NewDeduper (line 15) | func NewDeduper(w *fsnotify.Watcher, waitTime time.Duration) *Deduper {

FILE: internal/goext/meta.go
  function IsKnownOS (line 7) | func IsKnownOS(str string) bool {
  function IsKnownArch (line 12) | func IsKnownArch(str string) bool {

FILE: internal/hash/hash.go
  type HashFunc (line 11) | type HashFunc
  function Empty (line 13) | func Empty(*ast.Task) (string, error) {
  function Name (line 17) | func Name(t *ast.Task) (string, error) {
  function Hash (line 21) | func Hash(t *ast.Task) (string, error) {

FILE: internal/input/input.go
  type Prompter (line 25) | type Prompter struct
    method Text (line 32) | func (p *Prompter) Text(varName string) (string, error) {
    method Select (line 54) | func (p *Prompter) Select(varName string, options []string) (string, e...
    method Prompt (line 80) | func (p *Prompter) Prompt(varName string, enum []string) (string, erro...
  type textModel (line 88) | type textModel struct
    method Init (line 109) | func (m textModel) Init() tea.Cmd {
    method Update (line 113) | func (m textModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
    method View (line 133) | func (m textModel) View() tea.View {
  function newTextModel (line 96) | func newTextModel(varName string) textModel {
  type selectModel (line 143) | type selectModel struct
    method Init (line 159) | func (m selectModel) Init() tea.Cmd {
    method Update (line 163) | func (m selectModel) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
    method View (line 188) | func (m selectModel) View() tea.View {
  function newSelectModel (line 151) | func newSelectModel(varName string, options []string) selectModel {

FILE: internal/logger/logger.go
  type Color (line 41) | type Color
  type PrintFunc (line 42) | type PrintFunc
  function None (line 45) | func None() PrintFunc {
  function Default (line 51) | func Default() PrintFunc {
  function Blue (line 55) | func Blue() PrintFunc {
  function Green (line 59) | func Green() PrintFunc {
  function Cyan (line 63) | func Cyan() PrintFunc {
  function Yellow (line 67) | func Yellow() PrintFunc {
  function Magenta (line 71) | func Magenta() PrintFunc {
  function Red (line 75) | func Red() PrintFunc {
  function BrightBlue (line 79) | func BrightBlue() PrintFunc {
  function BrightGreen (line 83) | func BrightGreen() PrintFunc {
  function BrightCyan (line 87) | func BrightCyan() PrintFunc {
  function BrightYellow (line 91) | func BrightYellow() PrintFunc {
  function BrightMagenta (line 95) | func BrightMagenta() PrintFunc {
  function BrightRed (line 99) | func BrightRed() PrintFunc {
  function envColor (line 103) | func envColor(name string, defaultColor color.Attribute) []color.Attribu...
  type Logger (line 132) | type Logger struct
    method Outf (line 143) | func (l *Logger) Outf(color Color, s string, args ...any) {
    method FOutf (line 148) | func (l *Logger) FOutf(w io.Writer, color Color, s string, args ...any) {
    method VerboseOutf (line 160) | func (l *Logger) VerboseOutf(color Color, s string, args ...any) {
    method Errf (line 167) | func (l *Logger) Errf(color Color, s string, args ...any) {
    method VerboseErrf (line 179) | func (l *Logger) VerboseErrf(color Color, s string, args ...any) {
    method Warnf (line 185) | func (l *Logger) Warnf(message string, args ...any) {
    method Prompt (line 189) | func (l *Logger) Prompt(color Color, prompt string, defaultValue strin...
    method PrintExperiments (line 219) | func (l *Logger) PrintExperiments() error {

FILE: internal/output/group.go
  type Group (line 10) | type Group struct
    method WrapWriter (line 15) | func (g Group) WrapWriter(stdOut, _ io.Writer, _ string, cache *templa...
  type groupWriter (line 31) | type groupWriter struct
    method Write (line 37) | func (gw *groupWriter) Write(p []byte) (int, error) {
    method close (line 41) | func (gw *groupWriter) close() error {
    method combinedBuff (line 54) | func (gw *groupWriter) combinedBuff() io.Reader {

FILE: internal/output/interleaved.go
  type Interleaved (line 9) | type Interleaved struct
    method WrapWriter (line 11) | func (Interleaved) WrapWriter(stdOut, stdErr io.Writer, _ string, _ *t...

FILE: internal/output/output.go
  type Output (line 12) | type Output interface
  type CloseFunc (line 16) | type CloseFunc
  function BuildFor (line 19) | func BuildFor(o *ast.Output, logger *logger.Logger) (Output, error) {
  function checkOutputGroupUnset (line 42) | func checkOutputGroupUnset(o *ast.Output) error {

FILE: internal/output/output_test.go
  function TestInterleaved (line 20) | func TestInterleaved(t *testing.T) {
  function TestGroup (line 33) | func TestGroup(t *testing.T) {
  function TestGroupWithBeginEnd (line 53) | func TestGroupWithBeginEnd(t *testing.T) {
  function TestGroupErrorOnlySwallowsOutputOnNoError (line 92) | func TestGroupErrorOnlySwallowsOutputOnNoError(t *testing.T) {
  function TestGroupErrorOnlyShowsOutputOnError (line 108) | func TestGroupErrorOnlyShowsOutputOnError(t *testing.T) {
  function TestPrefixed (line 124) | func TestPrefixed(t *testing.T) { //nolint:paralleltest // cannot run in...
  function TestPrefixedWithColor (line 156) | func TestPrefixedWithColor(t *testing.T) {

FILE: internal/output/prefixed.go
  type Prefixed (line 14) | type Prefixed struct
    method WrapWriter (line 31) | func (p *Prefixed) WrapWriter(stdOut, _ io.Writer, prefix string, _ *t...
  function NewPrefixed (line 21) | func NewPrefixed(logger *logger.Logger) *Prefixed {
  type prefixWriter (line 36) | type prefixWriter struct
    method Write (line 43) | func (pw *prefixWriter) Write(p []byte) (int, error) {
    method close (line 52) | func (pw *prefixWriter) close() error {
    method writeOutputLines (line 56) | func (pw *prefixWriter) writeOutputLines(force bool) error {
    method writeLine (line 82) | func (pw *prefixWriter) writeLine(line string) error {

FILE: internal/slicesext/slicesext.go
  function UniqueJoin (line 8) | func UniqueJoin[T cmp.Ordered](ss ...[]T) []T {
  function Convert (line 22) | func Convert[T, U any](s []T, f func(T) U) []U {

FILE: internal/slicesext/slicesext_test.go
  function TestConvertIntToString (line 9) | func TestConvertIntToString(t *testing.T) {
  function TestConvertStringToInt (line 26) | func TestConvertStringToInt(t *testing.T) {
  function TestConvertFloatToInt (line 46) | func TestConvertFloatToInt(t *testing.T) {
  function TestConvertEmptySlice (line 65) | func TestConvertEmptySlice(t *testing.T) {
  function TestConvertNilSlice (line 75) | func TestConvertNilSlice(t *testing.T) {

FILE: internal/sort/sorter.go
  type Sorter (line 10) | type Sorter
  function NoSort (line 13) | func NoSort(items []string, namespaces []string) []string {
  function AlphaNumeric (line 19) | func AlphaNumeric(items []string, namespaces []string) []string {
  function AlphaNumericWithRootTasksFirst (line 28) | func AlphaNumericWithRootTasksFirst(items []string, namespaces []string)...

FILE: internal/sort/sorter_test.go
  function TestAlphaNumericWithRootTasksFirst_Sort (line 9) | func TestAlphaNumericWithRootTasksFirst_Sort(t *testing.T) {
  function TestAlphaNumeric_Sort (line 51) | func TestAlphaNumeric_Sort(t *testing.T) {
  function TestNoSort_Sort (line 83) | func TestNoSort_Sort(t *testing.T) {

FILE: internal/summary/summary.go
  function PrintTasks (line 12) | func PrintTasks(l *logger.Logger, t *ast.Taskfile, c []string) {
  function PrintSpaceBetweenSummaries (line 21) | func PrintSpaceBetweenSummaries(l *logger.Logger, i int) {
  function PrintTask (line 31) | func PrintTask(l *logger.Logger, t *ast.Task) {
  function printTaskDescribingText (line 42) | func printTaskDescribingText(t *ast.Task, l *logger.Logger) {
  function hasSummary (line 52) | func hasSummary(t *ast.Task) bool {
  function printTaskSummary (line 56) | func printTaskSummary(l *logger.Logger, t *ast.Task) {
  function printTaskName (line 66) | func printTaskName(l *logger.Logger, t *ast.Task) {
  function printTaskAliases (line 72) | func printTaskAliases(l *logger.Logger, t *ast.Task) {
  function hasDescription (line 84) | func hasDescription(t *ast.Task) bool {
  function printTaskDescription (line 88) | func printTaskDescription(l *logger.Logger, t *ast.Task) {
  function printNoDescriptionOrSummary (line 92) | func printNoDescriptionOrSummary(l *logger.Logger) {
  function printTaskDependencies (line 96) | func printTaskDependencies(l *logger.Logger, t *ast.Task) {
  function printTaskCommands (line 109) | func printTaskCommands(l *logger.Logger, t *ast.Task) {
  function printTaskVars (line 127) | func printTaskVars(l *logger.Logger, t *ast.Task) {
  function printTaskEnv (line 165) | func printTaskEnv(l *logger.Logger, t *ast.Task) {
  function formatVarValue (line 198) | func formatVarValue(v ast.Var) string {
  function formatMap (line 224) | func formatMap(m map[string]any, indent int) string {
  function printTaskRequires (line 240) | func printTaskRequires(l *logger.Logger, t *ast.Task) {
  function getEnvVarNames (line 264) | func getEnvVarNames() map[string]bool {
  function isEnvVar (line 276) | func isEnvVar(key string, envVars map[string]bool) bool {

FILE: internal/summary/summary_test.go
  function TestPrintsDependenciesIfPresent (line 15) | func TestPrintsDependenciesIfPresent(t *testing.T) {
  function createDummyLogger (line 32) | func createDummyLogger() (*bytes.Buffer, logger.Logger) {
  function TestDoesNotPrintDependenciesIfMissing (line 42) | func TestDoesNotPrintDependenciesIfMissing(t *testing.T) {
  function TestPrintTaskName (line 55) | func TestPrintTaskName(t *testing.T) {
  function TestPrintTaskCommandsIfPresent (line 68) | func TestPrintTaskCommandsIfPresent(t *testing.T) {
  function TestDoesNotPrintCommandIfMissing (line 88) | func TestDoesNotPrintCommandIfMissing(t *testing.T) {
  function TestLayout (line 101) | func TestLayout(t *testing.T) {
  function expectedOutput (line 121) | func expectedOutput() string {
  function TestPrintDescriptionAsFallback (line 137) | func TestPrintDescriptionAsFallback(t *testing.T) {
  function TestPrintAllWithSpaces (line 166) | func TestPrintAllWithSpaces(t *testing.T) {

FILE: internal/sysinfo/uid.go
  function Owner (line 10) | func Owner(path string) (int, error) {

FILE: internal/sysinfo/uid_win.go
  function Owner (line 7) | func Owner(path string) (int, error) {

FILE: internal/templater/funcs.go
  function init (line 22) | func init() {
  function os (line 59) | func os() string {
  function arch (line 63) | func arch() string {
  function catLines (line 67) | func catLines(s string) string {
  function splitLines (line 72) | func splitLines(s string) []string {
  function exeExt (line 77) | func exeExt() string {
  function shellQuote (line 84) | func shellQuote(str string) (string, error) {
  function splitArgs (line 88) | func splitArgs(s string) ([]string, error) {
  function IsSH (line 93) | func IsSH() bool {
  function merge (line 97) | func merge(base map[string]any, v ...map[string]any) map[string]any {
  function fromYaml (line 110) | func fromYaml(v string) any {
  function mustFromYaml (line 115) | func mustFromYaml(v string) (any, error) {
  function toYaml (line 121) | func toYaml(v any) string {
  function mustToYaml (line 126) | func mustToYaml(v any) (string, error) {

FILE: internal/templater/templater.go
  type Cache (line 19) | type Cache struct
    method ResetCache (line 26) | func (r *Cache) ResetCache() {
    method Err (line 30) | func (r *Cache) Err() error {
  function ResolveRef (line 34) | func ResolveRef(ref string, cache *Cache) any {
  function Replace (line 61) | func Replace[T any](v T, cache *Cache) T {
  function ReplaceWithExtra (line 65) | func ReplaceWithExtra[T any](v T, cache *Cache, extra map[string]any) T {
  function ReplaceGlobs (line 103) | func ReplaceGlobs(globs []*ast.Glob, cache *Cache) []*ast.Glob {
  function ReplaceVar (line 118) | func ReplaceVar(v ast.Var, cache *Cache) ast.Var {
  function ReplaceVarWithExtra (line 122) | func ReplaceVarWithExtra(v ast.Var, cache *Cache, extra map[string]any) ...
  function ReplaceVars (line 135) | func ReplaceVars(vars *ast.Vars, cache *Cache) *ast.Vars {
  function ReplaceVarsWithExtra (line 139) | func ReplaceVarsWithExtra(vars *ast.Vars, cache *Cache, extra map[string...

FILE: internal/term/term.go
  function IsTerminal (line 9) | func IsTerminal() bool {

FILE: internal/version/version.go
  function init (line 16) | func init() {
  function getDirty (line 26) | func getDirty(info *debug.BuildInfo) bool {
  function getCommit (line 35) | func getCommit(info *debug.BuildInfo) string {
  function GetVersion (line 48) | func GetVersion() string {
  function GetVersionWithBuildInfo (line 55) | func GetVersionWithBuildInfo() string {

FILE: precondition.go
  method areTaskPreconditionsMet (line 16) | func (e *Executor) areTaskPreconditionsMet(ctx context.Context, t *ast.T...

FILE: requires.go
  method canPrompt (line 12) | func (e *Executor) canPrompt() bool {
  method newPrompter (line 16) | func (e *Executor) newPrompter() *input.Prompter {
  method promptDepsVars (line 28) | func (e *Executor) promptDepsVars(calls []*Call) error {
  method promptTaskVars (line 100) | func (e *Executor) promptTaskVars(t *ast.Task, call *Call) (bool, error) {
  function getMissingRequiredVars (line 148) | func getMissingRequiredVars(t *ast.Task) []*ast.VarsWithValidation {
  method areTaskRequiredVarsSet (line 161) | func (e *Executor) areTaskRequiredVarsSet(t *ast.Task) error {
  method areTaskRequiredVarsAllowedValuesSet (line 181) | func (e *Executor) areTaskRequiredVarsAllowedValuesSet(t *ast.Task) error {

FILE: setup.go
  method Setup (line 26) | func (e *Executor) Setup() error {
  method getRootNode (line 56) | func (e *Executor) getRootNode() (taskfile.Node, error) {
  method readTaskfile (line 75) | func (e *Executor) readTaskfile(node taskfile.Node) error {
  method setupFuzzyModel (line 110) | func (e *Executor) setupFuzzyModel() {
  method setupTempDir (line 131) | func (e *Executor) setupTempDir() error {
  method setupStdFiles (line 177) | func (e *Executor) setupStdFiles() {
  method setupLogger (line 189) | func (e *Executor) setupLogger() {
  method setupOutput (line 201) | func (e *Executor) setupOutput() error {
  method setupCompiler (line 211) | func (e *Executor) setupCompiler() error {
  method readDotEnvFiles (line 231) | func (e *Executor) readDotEnvFiles() error {
  method setupDefaults (line 258) | func (e *Executor) setupDefaults() {
  method setupConcurrencyState (line 267) | func (e *Executor) setupConcurrencyState() {
  method doVersionChecks (line 282) | func (e *Executor) doVersionChecks() error {

FILE: signals.go
  constant maxInterruptSignals (line 11) | maxInterruptSignals = 3
  method InterceptInterruptSignals (line 16) | func (e *Executor) InterceptInterruptSignals() {

FILE: signals_test.go
  function TestSignalSentToProcessGroup (line 25) | func TestSignalSentToProcessGroup(t *testing.T) {
  function getTaskPath (line 190) | func getTaskPath() (string, error) {
  function listDifference (line 206) | func listDifference(lines1, lines2 []string) []string {
  function listIntersection (line 227) | func listIntersection(lines1, lines2 []string) []string {

FILE: status.go
  method Status (line 12) | func (e *Executor) Status(ctx context.Context, calls ...*Call) error {
  method statusOnError (line 44) | func (e *Executor) statusOnError(t *ast.Task) error {

FILE: task.go
  constant MaximumTaskCall (line 31) | MaximumTaskCall = 1000
  type MatchingTask (line 36) | type MatchingTask struct
  method Run (line 42) | func (e *Executor) Run(ctx context.Context, calls ...*Call) error {
  method splitRegularAndWatchCalls (line 111) | func (e *Executor) splitRegularAndWatchCalls(calls ...*Call) (regularCal...
  method RunTask (line 128) | func (e *Executor) RunTask(ctx context.Context, call *Call) error {
  method mkdir (line 301) | func (e *Executor) mkdir(t *ast.Task) error {
  method runDeps (line 318) | func (e *Executor) runDeps(ctx context.Context, t *ast.Task) error {
  method runDeferred (line 340) | func (e *Executor) runDeferred(t *ast.Task, call *Call, i int, vars *ast...
  method runCommand (line 362) | func (e *Executor) runCommand(ctx context.Context, t *ast.Task, call *Ca...
  method startExecution (line 438) | func (e *Executor) startExecution(ctx context.Context, t *ast.Task, exec...
  method FindMatchingTasks (line 476) | func (e *Executor) FindMatchingTasks(call *Call) ([]*MatchingTask, error) {
  method GetTask (line 521) | func (e *Executor) GetTask(call *Call) (*ast.Task, error) {
  type FilterFunc (line 550) | type FilterFunc
  method GetTaskList (line 552) | func (e *Executor) GetTaskList(filters ...FilterFunc) ([]*ast.Task, erro...
  function FilterOutNoDesc (line 597) | func FilterOutNoDesc(task *ast.Task) bool {
  function FilterOutInternal (line 602) | func FilterOutInternal(task *ast.Task) bool {
  function shouldRunOnCurrentPlatform (line 606) | func shouldRunOnCurrentPlatform(platforms []*ast.Platform) bool {

FILE: task_test.go
  function init (line 36) | func init() {
  type TestOption (line 41) | type TestOption interface
  type TaskTest (line 45) | type TaskTest struct
    method writeFixture (line 69) | func (tt *TaskTest) writeFixture(
    method writeFixtureBuffer (line 105) | func (tt *TaskTest) writeFixtureBuffer(
    method writeFixtureErrSetup (line 116) | func (tt *TaskTest) writeFixtureErrSetup(
  function goldenFileName (line 57) | func goldenFileName(t *testing.T) string {
  function WithName (line 129) | func WithName(name string) TestOption {
  type nameTestOption (line 133) | type nameTestOption struct
    method applyToExecutorTest (line 137) | func (opt *nameTestOption) applyToExecutorTest(t *ExecutorTest) {
    method applyToFormatterTest (line 141) | func (opt *nameTestOption) applyToFormatterTest(t *FormatterTest) {
  function WithTask (line 147) | func WithTask(task string) TestOption {
  type taskTestOption (line 151) | type taskTestOption struct
    method applyToExecutorTest (line 155) | func (opt *taskTestOption) applyToExecutorTest(t *ExecutorTest) {
    method applyToFormatterTest (line 159) | func (opt *taskTestOption) applyToFormatterTest(t *FormatterTest) {
  function WithVar (line 165) | func WithVar(key string, value any) TestOption {
  type varTestOption (line 169) | type varTestOption struct
    method applyToExecutorTest (line 174) | func (opt *varTestOption) applyToExecutorTest(t *ExecutorTest) {
    method applyToFormatterTest (line 178) | func (opt *varTestOption) applyToFormatterTest(t *FormatterTest) {
  function WithExecutorOptions (line 184) | func WithExecutorOptions(executorOpts ...task.ExecutorOption) TestOption {
  type executorOptionsTestOption (line 188) | type executorOptionsTestOption struct
    method applyToExecutorTest (line 192) | func (opt *executorOptionsTestOption) applyToExecutorTest(t *ExecutorT...
    method applyToFormatterTest (line 196) | func (opt *executorOptionsTestOption) applyToFormatterTest(t *Formatte...
  function WithExperiment (line 202) | func WithExperiment(experiment *experiments.Experiment, value int) TestO...
  type experimentTestOption (line 206) | type experimentTestOption struct
    method applyToExecutorTest (line 211) | func (opt *experimentTestOption) applyToExecutorTest(t *ExecutorTest) {
    method applyToFormatterTest (line 215) | func (opt *experimentTestOption) applyToFormatterTest(t *FormatterTest) {
  function WithPostProcessFn (line 223) | func WithPostProcessFn(fn PostProcessFn) TestOption {
  type postProcessFnTestOption (line 227) | type postProcessFnTestOption struct
    method applyToExecutorTest (line 231) | func (opt *postProcessFnTestOption) applyToExecutorTest(t *ExecutorTes...
    method applyToFormatterTest (line 235) | func (opt *postProcessFnTestOption) applyToFormatterTest(t *FormatterT...
  function WithSetupError (line 241) | func WithSetupError() TestOption {
  type setupErrorTestOption (line 245) | type setupErrorTestOption struct
    method applyToExecutorTest (line 247) | func (opt *setupErrorTestOption) applyToExecutorTest(t *ExecutorTest) {
    method applyToFormatterTest (line 251) | func (opt *setupErrorTestOption) applyToFormatterTest(t *FormatterTest) {
  function WithFixtureTemplating (line 259) | func WithFixtureTemplating() TestOption {
  type fixtureTemplatingTestOption (line 263) | type fixtureTemplatingTestOption struct
    method applyToExecutorTest (line 265) | func (opt *fixtureTemplatingTestOption) applyToExecutorTest(t *Executo...
    method applyToFormatterTest (line 269) | func (opt *fixtureTemplatingTestOption) applyToFormatterTest(t *Format...
  function WithFixtureTemplateData (line 276) | func WithFixtureTemplateData(key string, value any) TestOption {
  type fixtureTemplateDataTestOption (line 280) | type fixtureTemplateDataTestOption struct
    method applyToExecutorTest (line 285) | func (opt *fixtureTemplateDataTestOption) applyToExecutorTest(t *Execu...
    method applyToFormatterTest (line 290) | func (opt *fixtureTemplateDataTestOption) applyToFormatterTest(t *Form...
  type PostProcessFn (line 299) | type PostProcessFn
  function PPSortedLines (line 304) | func PPSortedLines(t *testing.T, b []byte) []byte {
  type SyncBuffer (line 315) | type SyncBuffer struct
    method Write (line 320) | func (sb *SyncBuffer) Write(p []byte) (n int, err error) {
  type fileContentTest (line 328) | type fileContentTest struct
    method name (line 336) | func (fct fileContentTest) name(file string) string {
    method Run (line 340) | func (fct fileContentTest) Run(t *testing.T) {
  function TestGenerates (line 374) | func TestGenerates(t *testing.T) {
  function TestStatusChecksum (line 433) | func TestStatusChecksum(t *testing.T) { // nolint:paralleltest // cannot...
  function TestStatusVariables (line 490) | func TestStatusVariables(t *testing.T) {
  function TestCmdsVariables (line 527) | func TestCmdsVariables(t *testing.T) {
  function TestCyclicDep (line 562) | func TestCyclicDep(t *testing.T) {
  function TestTaskVersion (line 578) | func TestTaskVersion(t *testing.T) {
  function TestTaskIgnoreErrors (line 613) | func TestTaskIgnoreErrors(t *testing.T) {
  function TestExpand (line 631) | func TestExpand(t *testing.T) {
  function TestDry (line 652) | func TestDry(t *testing.T) {
  function TestDryChecksum (line 679) | func TestDryChecksum(t *testing.T) {
  function TestIncludes (line 709) | func TestIncludes(t *testing.T) {
  function TestIncludesMultiLevel (line 732) | func TestIncludesMultiLevel(t *testing.T) {
  function TestIncludesRemote (line 751) | func TestIncludesRemote(t *testing.T) {
  function TestIncludeCycle (line 883) | func TestIncludeCycle(t *testing.T) {
  function TestIncludesIncorrect (line 901) | func TestIncludesIncorrect(t *testing.T) {
  function TestIncludesEmptyMain (line 919) | func TestIncludesEmptyMain(t *testing.T) {
  function TestIncludesHttp (line 936) | func TestIncludesHttp(t *testing.T) {
  function TestIncludesDependencies (line 1021) | func TestIncludesDependencies(t *testing.T) {
  function TestIncludesCallingRoot (line 1040) | func TestIncludesCallingRoot(t *testing.T) {
  function TestIncludesOptional (line 1057) | func TestIncludesOptional(t *testing.T) {
  function TestIncludesOptionalImplicitFalse (line 1074) | func TestIncludesOptionalImplicitFalse(t *testing.T) {
  function TestIncludesOptionalExplicitFalse (line 1094) | func TestIncludesOptionalExplicitFalse(t *testing.T) {
  function TestIncludesFromCustomTaskfile (line 1114) | func TestIncludesFromCustomTaskfile(t *testing.T) {
  function TestIncludesRelativePath (line 1134) | func TestIncludesRelativePath(t *testing.T) {
  function TestIncludesInternal (line 1156) | func TestIncludesInternal(t *testing.T) {
  function TestIncludesFlatten (line 1195) | func TestIncludesFlatten(t *testing.T) {
  function TestIncludesInterpolation (line 1238) | func TestIncludesInterpolation(t *testing.T) { // nolint:paralleltest //...
  function TestIncludesWithExclude (line 1274) | func TestIncludesWithExclude(t *testing.T) {
  function TestIncludedTaskfileVarMerging (line 1304) | func TestIncludedTaskfileVarMerging(t *testing.T) {
  function TestInternalTask (line 1336) | func TestInternalTask(t *testing.T) {
  function TestIncludesShadowedDefault (line 1375) | func TestIncludesShadowedDefault(t *testing.T) {
  function TestIncludesUnshadowedDefault (line 1392) | func TestIncludesUnshadowedDefault(t *testing.T) {
  function TestSupportedFileNames (line 1409) | func TestSupportedFileNames(t *testing.T) {
  function TestSummary (line 1435) | func TestSummary(t *testing.T) {
  function TestWhenNoDirAttributeItRunsInSameDirAsTaskfile (line 1462) | func TestWhenNoDirAttributeItRunsInSameDirAsTaskfile(t *testing.T) {
  function TestWhenDirAttributeAndDirExistsItRunsInThatDir (line 1482) | func TestWhenDirAttributeAndDirExistsItRunsInThatDir(t *testing.T) {
  function TestWhenDirAttributeItCreatesMissingAndRunsInThatDir (line 1501) | func TestWhenDirAttributeItCreatesMissingAndRunsInThatDir(t *testing.T) {
  function TestDynamicVariablesRunOnTheNewCreatedDir (line 1530) | func TestDynamicVariablesRunOnTheNewCreatedDir(t *testing.T) {
  function TestDynamicVariablesShouldRunOnTheTaskDir (line 1559) | func TestDynamicVariablesShouldRunOnTheTaskDir(t *testing.T) {
  function TestDisplaysErrorOnVersion1Schema (line 1579) | func TestDisplaysErrorOnVersion1Schema(t *testing.T) {
  function TestDisplaysErrorOnVersion2Schema (line 1593) | func TestDisplaysErrorOnVersion2Schema(t *testing.T) {
  function TestShortTaskNotation (line 1608) | func TestShortTaskNotation(t *testing.T) {
  function TestDotenvShouldIncludeAllEnvFiles (line 1625) | func TestDotenvShouldIncludeAllEnvFiles(t *testing.T) {
  function TestDotenvShouldErrorWhenIncludingDependantDotenvs (line 1642) | func TestDotenvShouldErrorWhenIncludingDependantDotenvs(t *testing.T) {
  function TestDotenvShouldAllowMissingEnv (line 1658) | func TestDotenvShouldAllowMissingEnv(t *testing.T) {
  function TestDotenvHasLocalEnvInPath (line 1675) | func TestDotenvHasLocalEnvInPath(t *testing.T) {
  function TestDotenvHasLocalVarInPath (line 1692) | func TestDotenvHasLocalVarInPath(t *testing.T) {
  function TestDotenvHasEnvVarInPath (line 1709) | func TestDotenvHasEnvVarInPath(t *testing.T) { // nolint:paralleltest //...
  function TestTaskDotenvParseErrorMessage (line 1723) | func TestTaskDotenvParseErrorMessage(t *testing.T) {
  function TestTaskDotenv (line 1737) | func TestTaskDotenv(t *testing.T) {
  function TestTaskDotenvFail (line 1754) | func TestTaskDotenvFail(t *testing.T) {
  function TestTaskDotenvOverriddenByEnv (line 1771) | func TestTaskDotenvOverriddenByEnv(t *testing.T) {
  function TestTaskDotenvWithVarName (line 1788) | func TestTaskDotenvWithVarName(t *testing.T) {
  function TestExitImmediately (line 1805) | func TestExitImmediately(t *testing.T) {
  function TestRunOnlyRunsJobsHashOnce (line 1823) | func TestRunOnlyRunsJobsHashOnce(t *testing.T) {
  function TestRunOnlyRunsJobsHashOnceWithWildcard (line 1839) | func TestRunOnlyRunsJobsHashOnceWithWildcard(t *testing.T) {
  function TestRunOnceSharedDeps (line 1855) | func TestRunOnceSharedDeps(t *testing.T) {
  function TestRunWhenChanged (line 1877) | func TestRunWhenChanged(t *testing.T) {
  function TestDeferredCmds (line 1900) | func TestDeferredCmds(t *testing.T) {
  function TestExitCodeZero (line 1930) | func TestExitCodeZero(t *testing.T) {
  function TestExitCodeOne (line 1946) | func TestExitCodeOne(t *testing.T) {
  function TestIgnoreNilElements (line 1962) | func TestIgnoreNilElements(t *testing.T) {
  function TestOutputGroup (line 1993) | func TestOutputGroup(t *testing.T) {
  function TestOutputGroupErrorOnlySwallowsOutputOnSuccess (line 2020) | func TestOutputGroupErrorOnlySwallowsOutputOnSuccess(t *testing.T) {
  function TestOutputGroupErrorOnlyShowsOutputOnFailure (line 2037) | func TestOutputGroupErrorOnlyShowsOutputOnFailure(t *testing.T) {
  function TestIncludedVars (line 2055) | func TestIncludedVars(t *testing.T) {
  function TestIncludeWithVarsInInclude (line 2086) | func TestIncludeWithVarsInInclude(t *testing.T) {
  function TestIncludedVarsMultiLevel (line 2099) | func TestIncludedVarsMultiLevel(t *testing.T) {
  function TestErrorCode (line 2124) | func TestErrorCode(t *testing.T) {
  function TestEvaluateSymlinksInPaths (line 2166) | func TestEvaluateSymlinksInPaths(t *testing.T) { // nolint:paralleltest ...
  function TestTaskfileWalk (line 2219) | func TestTaskfileWalk(t *testing.T) {
  function TestUserWorkingDirectory (line 2258) | func TestUserWorkingDirectory(t *testing.T) {
  function TestUserWorkingDirectoryWithIncluded (line 2274) | func TestUserWorkingDirectoryWithIncluded(t *testing.T) {
  function TestPlatforms (line 2296) | func TestPlatforms(t *testing.T) {
  function TestPOSIXShellOptsGlobalLevel (line 2310) | func TestPOSIXShellOptsGlobalLevel(t *testing.T) {
  function TestPOSIXShellOptsTaskLevel (line 2326) | func TestPOSIXShellOptsTaskLevel(t *testing.T) {
  function TestPOSIXShellOptsCommandLevel (line 2342) | func TestPOSIXShellOptsCommandLevel(t *testing.T) {
  function TestBashShellOptsGlobalLevel (line 2358) | func TestBashShellOptsGlobalLevel(t *testing.T) {
  function TestBashShellOptsTaskLevel (line 2374) | func TestBashShellOptsTaskLevel(t *testing.T) {
  function TestBashShellOptsCommandLevel (line 2390) | func TestBashShellOptsCommandLevel(t *testing.T) {
  function TestSplitArgs (line 2406) | func TestSplitArgs(t *testing.T) {
  function TestSingleCmdDep (line 2426) | func TestSingleCmdDep(t *testing.T) {
  function TestSilence (line 2443) | func TestSilence(t *testing.T) {
  function TestForce (line 2541) | func TestForce(t *testing.T) {
  function TestWildcard (line 2591) | func TestWildcard(t *testing.T) {
  function enableExperimentForTest (line 2665) | func enableExperimentForTest(t *testing.T, e *experiments.Experiment, va...

FILE: taskfile/ast/cmd.go
  type Cmd (line 11) | type Cmd struct
    method DeepCopy (line 25) | func (c *Cmd) DeepCopy() *Cmd {
    method UnmarshalYAML (line 44) | func (c *Cmd) UnmarshalYAML(node *yaml.Node) error {

FILE: taskfile/ast/defer.go
  type Defer (line 9) | type Defer struct
    method UnmarshalYAML (line 16) | func (d *Defer) UnmarshalYAML(node *yaml.Node) error {

FILE: taskfile/ast/dep.go
  type Dep (line 10) | type Dep struct
    method DeepCopy (line 17) | func (d *Dep) DeepCopy() *Dep {
    method UnmarshalYAML (line 29) | func (d *Dep) UnmarshalYAML(node *yaml.Node) error {

FILE: taskfile/ast/for.go
  type For (line 10) | type For struct
    method UnmarshalYAML (line 19) | func (f *For) UnmarshalYAML(node *yaml.Node) error {
    method DeepCopy (line 64) | func (f *For) DeepCopy() *For {

FILE: taskfile/ast/glob.go
  type Glob (line 9) | type Glob struct
    method UnmarshalYAML (line 14) | func (g *Glob) UnmarshalYAML(node *yaml.Node) error {

FILE: taskfile/ast/graph.go
  type TaskfileGraph (line 13) | type TaskfileGraph struct
    method Visualize (line 39) | func (tfg *TaskfileGraph) Visualize(filename string) error {
    method Merge (line 48) | func (tfg *TaskfileGraph) Merge() (*Taskfile, error) {
  type TaskfileVertex (line 19) | type TaskfileVertex struct
  function taskfileHash (line 24) | func taskfileHash(vertex *TaskfileVertex) string {
  function NewTaskfileGraph (line 28) | func NewTaskfileGraph() *TaskfileGraph {

FILE: taskfile/ast/include.go
  type Include (line 16) | type Include struct
    method UnmarshalYAML (line 148) | func (include *Include) UnmarshalYAML(node *yaml.Node) error {
    method DeepCopy (line 192) | func (include *Include) DeepCopy() *Include {
  type Includes (line 30) | type Includes struct
    method Len (line 53) | func (includes *Includes) Len() int {
    method Get (line 65) | func (includes *Includes) Get(key string) (*Include, bool) {
    method Set (line 77) | func (includes *Includes) Set(key string, value *Include) bool {
    method All (line 93) | func (includes *Includes) All() iter.Seq2[string, *Include] {
    method Keys (line 101) | func (includes *Includes) Keys() iter.Seq[string] {
    method Values (line 109) | func (includes *Includes) Values() iter.Seq[*Include] {
    method UnmarshalYAML (line 117) | func (includes *Includes) UnmarshalYAML(node *yaml.Node) error {
  type IncludeElement (line 36) | type IncludeElement
  function NewIncludes (line 42) | func NewIncludes(els ...*IncludeElement) *Includes {

FILE: taskfile/ast/location.go
  type Location (line 3) | type Location struct
    method DeepCopy (line 9) | func (l *Location) DeepCopy() *Location {

FILE: taskfile/ast/matrix.go
  type Matrix (line 15) | type Matrix struct
    method Len (line 39) | func (matrix *Matrix) Len() int {
    method Get (line 46) | func (matrix *Matrix) Get(key string) (*MatrixRow, bool) {
    method Set (line 53) | func (matrix *Matrix) Set(key string, value *MatrixRow) bool {
    method All (line 64) | func (matrix *Matrix) All() iter.Seq2[string, *MatrixRow] {
    method Keys (line 72) | func (matrix *Matrix) Keys() iter.Seq[string] {
    method Values (line 80) | func (matrix *Matrix) Values() iter.Seq[*MatrixRow] {
    method DeepCopy (line 87) | func (matrix *Matrix) DeepCopy() *Matrix {
    method UnmarshalYAML (line 96) | func (matrix *Matrix) UnmarshalYAML(node *yaml.Node) error {
  type MatrixElement (line 20) | type MatrixElement
  type MatrixRow (line 23) | type MatrixRow struct
  function NewMatrix (line 29) | func NewMatrix(els ...*MatrixElement) *Matrix {

FILE: taskfile/ast/output.go
  type Output (line 10) | type Output struct
    method IsSet (line 18) | func (s *Output) IsSet() bool {
    method UnmarshalYAML (line 22) | func (s *Output) UnmarshalYAML(node *yaml.Node) error {
  type OutputGroup (line 54) | type OutputGroup struct
    method IsSet (line 60) | func (g *OutputGroup) IsSet() bool {

FILE: taskfile/ast/platforms.go
  type Platform (line 14) | type Platform struct
    method DeepCopy (line 19) | func (p *Platform) DeepCopy() *Platform {
    method UnmarshalYAML (line 38) | func (p *Platform) UnmarshalYAML(node *yaml.Node) error {
    method parsePlatform (line 56) | func (p *Platform) parsePlatform(input string) error {
    method parseOsOrArch (line 74) | func (p *Platform) parseOsOrArch(osOrArch string) error {
    method parseArch (line 89) | func (p *Platform) parseArch(arch string) error {
  type ErrInvalidPlatform (line 29) | type ErrInvalidPlatform struct
    method Error (line 33) | func (err *ErrInvalidPlatform) Error() string {

FILE: taskfile/ast/platforms_test.go
  function TestPlatformParsing (line 10) | func TestPlatformParsing(t *testing.T) {

FILE: taskfile/ast/precondition.go
  type Precondition (line 12) | type Precondition struct
    method DeepCopy (line 17) | func (p *Precondition) DeepCopy() *Precondition {
    method UnmarshalYAML (line 28) | func (p *Precondition) UnmarshalYAML(node *yaml.Node) error {

FILE: taskfile/ast/precondition_test.go
  function TestPreconditionParse (line 13) | func TestPreconditionParse(t *testing.T) {

FILE: taskfile/ast/prompt.go
  type Prompt (line 9) | type Prompt
    method UnmarshalYAML (line 11) | func (p *Prompt) UnmarshalYAML(node *yaml.Node) error {

FILE: taskfile/ast/requires.go
  type Requires (line 11) | type Requires struct
    method DeepCopy (line 15) | func (r *Requires) DeepCopy() *Requires {
  type VarsWithValidation (line 25) | type VarsWithValidation struct
    method DeepCopy (line 30) | func (v *VarsWithValidation) DeepCopy() *VarsWithValidation {
    method UnmarshalYAML (line 41) | func (v *VarsWithValidation) UnmarshalYAML(node *yaml.Node) error {

FILE: taskfile/ast/task.go
  type Task (line 15) | type Task struct
    method Name (line 55) | func (t *Task) Name() string {
    method LocalName (line 65) | func (t *Task) LocalName() string {
    method IsSilent (line 74) | func (t *Task) IsSilent() bool {
    method WildcardMatch (line 79) | func (t *Task) WildcardMatch(name string) (bool, []string) {
    method UnmarshalYAML (line 105) | func (t *Task) UnmarshalYAML(node *yaml.Node) error {
    method DeepCopy (line 207) | func (t *Task) DeepCopy() *Task {

FILE: taskfile/ast/taskfile.go
  constant NamespaceSeparator (line 14) | NamespaceSeparator = ":"
  type Taskfile (line 22) | type Taskfile struct
    method Merge (line 40) | func (t1 *Taskfile) Merge(t2 *Taskfile, include *Include) error {
    method UnmarshalYAML (line 75) | func (tf *Taskfile) UnmarshalYAML(node *yaml.Node) error {

FILE: taskfile/ast/taskfile_test.go
  function TestCmdParse (line 13) | func TestCmdParse(t *testing.T) {

FILE: taskfile/ast/tasks.go
  type Tasks (line 20) | type Tasks struct
    method Len (line 42) | func (tasks *Tasks) Len() int {
    method Get (line 54) | func (tasks *Tasks) Get(key string) (*Task, bool) {
    method Set (line 66) | func (tasks *Tasks) Set(key string, value *Task) bool {
    method All (line 80) | func (t *Tasks) All(sorter sort.Sorter) iter.Seq2[string, *Task] {
    method Keys (line 99) | func (t *Tasks) Keys(sorter sort.Sorter) iter.Seq[string] {
    method Values (line 111) | func (t *Tasks) Values(sorter sort.Sorter) iter.Seq[*Task] {
    method Merge (line 121) | func (t1 *Tasks) Merge(t2 *Tasks, include *Include, includedTaskfileVa...
    method UnmarshalYAML (line 211) | func (t *Tasks) UnmarshalYAML(node *yaml.Node) error {
  type TaskElement (line 26) | type TaskElement
  function NewTasks (line 31) | func NewTasks(els ...*TaskElement) *Tasks {
  function taskNameWithNamespace (line 246) | func taskNameWithNamespace(taskName string, namespace string) string {

FILE: taskfile/ast/var.go
  type Var (line 10) | type Var struct
    method UnmarshalYAML (line 18) | func (v *Var) UnmarshalYAML(node *yaml.Node) error {

FILE: taskfile/ast/vars.go
  type Vars (line 16) | type Vars struct
    method Len (line 38) | func (vars *Vars) Len() int {
    method Get (line 50) | func (vars *Vars) Get(key string) (Var, bool) {
    method Set (line 62) | func (vars *Vars) Set(key string, value Var) bool {
    method All (line 75) | func (vars *Vars) All() iter.Seq2[string, Var] {
    method Keys (line 83) | func (vars *Vars) Keys() iter.Seq[string] {
    method Values (line 91) | func (vars *Vars) Values() iter.Seq[Var] {
    method ToCacheMap (line 100) | func (vars *Vars) ToCacheMap() (m map[string]any) {
    method Merge (line 122) | func (vars *Vars) Merge(other *Vars, include *Include) {
    method ReverseMerge (line 140) | func (vars *Vars) ReverseMerge(other *Vars, include *Include) {
    method DeepCopy (line 165) | func (vs *Vars) DeepCopy() *Vars {
    method UnmarshalYAML (line 176) | func (vs *Vars) UnmarshalYAML(node *yaml.Node) error {
  type VarElement (line 22) | type VarElement
  function NewVars (line 27) | func NewVars(els ...*VarElement) *Vars {

FILE: taskfile/dotenv.go
  function Dotenv (line 14) | func Dotenv(vars *ast.Vars, tf *ast.Taskfile, dir string) (*ast.Vars, er...

FILE: taskfile/node.go
  type Node (line 15) | type Node interface
  type RemoteNode (line 26) | type RemoteNode interface
  function NewRootNode (line 32) | func NewRootNode(
  function NewNode (line 47) | func NewNode(
  function isRemoteEntrypoint (line 76) | func isRemoteEntrypoint(entrypoint string) bool {
  function getScheme (line 86) | func getScheme(uri string) (string, error) {

FILE: taskfile/node_base.go
  type NodeOption (line 4) | type NodeOption
  type baseNode (line 9) | type baseNode struct
    method Parent (line 45) | func (node *baseNode) Parent() Node {
    method Dir (line 49) | func (node *baseNode) Dir() string {
    method Checksum (line 53) | func (node *baseNode) Checksum() string {
    method Verify (line 57) | func (node *baseNode) Verify(checksum string) bool {
  function NewBaseNode (line 19) | func NewBaseNode(dir string, opts ...NodeOption) *baseNode {
  function WithParent (line 33) | func WithParent(parent Node) NodeOption {
  function WithChecksum (line 39) | func WithChecksum(checksum string) NodeOption {
  function WithCACert (line 61) | func WithCACert(caCert string) NodeOption {
  function WithCert (line 67) | func WithCert(cert string) NodeOption {
  function WithCertKey (line 73) | func WithCertKey(certKey string) NodeOption {

FILE: taskfile/node_cache.go
  constant remoteCacheDir (line 11) | remoteCacheDir = "remote"
  type CacheNode (line 13) | type CacheNode struct
    method Read (line 27) | func (node *CacheNode) Read() ([]byte, error) {
    method Write (line 31) | func (node *CacheNode) Write(data []byte) error {
    method ReadTimestamp (line 38) | func (node *CacheNode) ReadTimestamp() time.Time {
    method WriteTimestamp (line 50) | func (node *CacheNode) WriteTimestamp(t time.Time) error {
    method ReadChecksum (line 57) | func (node *CacheNode) ReadChecksum() string {
    method WriteChecksum (line 62) | func (node *CacheNode) WriteChecksum(checksum string) error {
    method CreateCacheDir (line 69) | func (node *CacheNode) CreateCacheDir() error {
    method ChecksumPrompt (line 76) | func (node *CacheNode) ChecksumPrompt(checksum string) string {
    method Location (line 93) | func (node *CacheNode) Location() string {
    method checksumPath (line 97) | func (node *CacheNode) checksumPath() string {
    method timestampPath (line 101) | func (node *CacheNode) timestampPath() string {
    method filePath (line 105) | func (node *CacheNode) filePath(suffix string) string {
  function NewCacheNode (line 18) | func NewCacheNode(source RemoteNode, dir string) *CacheNode {
  function checksum (line 109) | func checksum(b []byte) string {

FILE: taskfile/node_file.go
  type FileNode (line 15) | type FileNode struct
    method Location (line 48) | func (node *FileNode) Location() string {
    method Read (line 52) | func (node *FileNode) Read() ([]byte, error) {
    method ResolveEntrypoint (line 61) | func (node *FileNode) ResolveEntrypoint(entrypoint string) (string, er...
    method ResolveDir (line 82) | func (node *FileNode) ResolveDir(dir string) (string, error) {
  function NewFileNode (line 20) | func NewFileNode(entrypoint, dir string, opts ...NodeOption) (*FileNode,...

FILE: taskfile/node_git.go
  type GitNode (line 23) | type GitNode struct
    method Location (line 93) | func (node *GitNode) Location() string {
    method Remote (line 97) | func (node *GitNode) Remote() bool {
    method Read (line 101) | func (node *GitNode) Read() ([]byte, error) {
    method buildURL (line 105) | func (node *GitNode) buildURL() string {
    method getOrCloneRepo (line 124) | func (node *GitNode) getOrCloneRepo(ctx context.Context) (string, erro...
    method ReadContext (line 161) | func (node *GitNode) ReadContext(ctx context.Context) ([]byte, error) {
    method ResolveEntrypoint (line 189) | func (node *GitNode) ResolveEntrypoint(entrypoint string) (string, err...
    method ResolveDir (line 203) | func (node *GitNode) ResolveDir(dir string) (string, error) {
    method CacheKey (line 219) | func (node *GitNode) CacheKey() string {
    method repoCacheKey (line 235) | func (node *GitNode) repoCacheKey() string {
  type gitRepoCache (line 31) | type gitRepoCache struct
    method getLockForRepo (line 36) | func (c *gitRepoCache) getLockForRepo(cacheKey string) *sync.Mutex {
  function CleanGitCache (line 51) | func CleanGitCache() error {
  function NewGitNode (line 61) | func NewGitNode(
  function splitURLOnDoubleSlash (line 246) | func splitURLOnDoubleSlash(u *url.URL) (string, string) {

FILE: taskfile/node_git_test.go
  function TestGitNode_ssh (line 10) | func TestGitNode_ssh(t *testing.T) {
  function TestGitNode_sshWithAltRepo (line 24) | func TestGitNode_sshWithAltRepo(t *testing.T) {
  function TestGitNode_sshWithDir (line 35) | func TestGitNode_sshWithDir(t *testing.T) {
  function TestGitNode_https (line 49) | func TestGitNode_https(t *testing.T) {
  function TestGitNode_httpsWithDir (line 63) | func TestGitNode_httpsWithDir(t *testing.T) {
  function TestGitNode_CacheKey (line 77) | func TestGitNode_CacheKey(t *testing.T) {
  function TestGitNode_buildURL (line 106) | func TestGitNode_buildURL(t *testing.T) {
  function TestRepoCacheKey_SameRepoSameRef (line 153) | func TestRepoCacheKey_SameRepoSameRef(t *testing.T) {
  function TestRepoCacheKey_SameRepoDifferentRef (line 169) | func TestRepoCacheKey_SameRepoDifferentRef(t *testing.T) {
  function TestRepoCacheKey_DifferentRepos (line 185) | func TestRepoCacheKey_DifferentRepos(t *testing.T) {
  function TestRepoCacheKey_NoRefVsExplicitRef (line 201) | func TestRepoCacheKey_NoRefVsExplicitRef(t *testing.T) {
  function TestRepoCacheKey_SSHvsHTTPS (line 217) | func TestRepoCacheKey_SSHvsHTTPS(t *testing.T) {
  function TestRepoCacheKey_Consistency (line 234) | func TestRepoCacheKey_Consistency(t *testing.T) {

FILE: taskfile/node_http.go
  type HTTPNode (line 21) | type HTTPNode struct
    method Location (line 100) | func (node *HTTPNode) Location() string {
    method Read (line 104) | func (node *HTTPNode) Read() ([]byte, error) {
    method ReadContext (line 108) | func (node *HTTPNode) ReadContext(ctx context.Context) ([]byte, error) {
    method ResolveEntrypoint (line 142) | func (node *HTTPNode) ResolveEntrypoint(entrypoint string) (string, er...
    method ResolveDir (line 150) | func (node *HTTPNode) ResolveDir(dir string) (string, error) {
    method CacheKey (line 170) | func (node *HTTPNode) CacheKey() string {
  function buildHTTPClient (line 29) | func buildHTTPClient(insecure bool, caCert, cert, certKey string) (*http...
  function NewHTTPNode (line 73) | func NewHTTPNode(

FILE: taskfile/node_http_test.go
  function TestHTTPNode_CacheKey (line 21) | func TestHTTPNode_CacheKey(t *testing.T) {
  function TestBuildHTTPClient_Default (line 62) | func TestBuildHTTPClient_Default(t *testing.T) {
  function TestBuildHTTPClient_Insecure (line 71) | func TestBuildHTTPClient_Insecure(t *testing.T) {
  function TestBuildHTTPClient_CACert (line 86) | func TestBuildHTTPClient_CACert(t *testing.T) {
  function TestBuildHTTPClient_CACertNotFound (line 110) | func TestBuildHTTPClient_CACertNotFound(t *testing.T) {
  function TestBuildHTTPClient_CACertInvalid (line 119) | func TestBuildHTTPClient_CACertInvalid(t *testing.T) {
  function TestBuildHTTPClient_CertWithoutKey (line 134) | func TestBuildHTTPClient_CertWithoutKey(t *testing.T) {
  function TestBuildHTTPClient_KeyWithoutCert (line 143) | func TestBuildHTTPClient_KeyWithoutCert(t *testing.T) {
  function TestBuildHTTPClient_CertAndKey (line 152) | func TestBuildHTTPClient_CertAndKey(t *testing.T) {
  function TestBuildHTTPClient_CertNotFound (line 179) | func TestBuildHTTPClient_CertNotFound(t *testing.T) {
  function TestBuildHTTPClient_InsecureWithCACert (line 188) | func TestBuildHTTPClient_InsecureWithCACert(t *testing.T) {
  function generateTestCertAndKey (line 213) | func generateTestCertAndKey(t *testing.T) (certPEM, keyPEM []byte) {
  function generateTestCACert (line 255) | func generateTestCACert(t *testing.T) []byte {

FILE: taskfile/node_stdin.go
  type StdinNode (line 13) | type StdinNode struct
    method Location (line 23) | func (node *StdinNode) Location() string {
    method Remote (line 27) | func (node *StdinNode) Remote() bool {
    method Read (line 31) | func (node *StdinNode) Read() ([]byte, error) {
    method ResolveEntrypoint (line 43) | func (node *StdinNode) ResolveEntrypoint(entrypoint string) (string, e...
    method ResolveDir (line 61) | func (node *StdinNode) ResolveDir(dir string) (string, error) {
  function NewStdinNode (line 17) | func NewStdinNode(dir string) (*StdinNode, error) {

FILE: taskfile/node_test.go
  function TestScheme (line 9) | func TestScheme(t *testing.T) {

FILE: taskfile/reader.go
  constant taskfileUntrustedPrompt (line 23) | taskfileUntrustedPrompt = `The task you are attempting to run depends on...
  constant taskfileChangedPrompt (line 26) | taskfileChangedPrompt = `The Taskfile at %q has changed since you last u...
  type DebugFunc (line 33) | type DebugFunc
  type PromptFunc (line 35) | type PromptFunc
  type ReaderOption (line 37) | type ReaderOption interface
  type Reader (line 42) | type Reader struct
    method Options (line 80) | func (r *Reader) Options(opts ...ReaderOption) {
    method Read (line 248) | func (r *Reader) Read(ctx context.Context, node Node) (*ast.TaskfileGr...
    method debugf (line 261) | func (r *Reader) debugf(format string, a ...any) {
    method promptf (line 267) | func (r *Reader) promptf(format string, a ...any) error {
    method isTrusted (line 275) | func (r *Reader) isTrusted(uri string) bool {
    method include (line 296) | func (r *Reader) include(ctx context.Context, node Node) error {
    method readNode (line 411) | func (r *Reader) readNode(ctx context.Context, node Node) (*ast.Taskfi...
    method readNodeContent (line 453) | func (r *Reader) readNodeContent(ctx context.Context, node Node) ([]by...
    method readRemoteNodeContent (line 477) | func (r *Reader) readRemoteNodeContent(ctx context.Context, node Remot...
  function NewReader (line 61) | func NewReader(opts ...ReaderOption) *Reader {
  function WithInsecure (line 88) | func WithInsecure(insecure bool) ReaderOption {
  type insecureOption (line 92) | type insecureOption struct
    method ApplyToReader (line 96) | func (o *insecureOption) ApplyToReader(r *Reader) {
  function WithDownload (line 102) | func WithDownload(download bool) ReaderOption {
  type downloadOption (line 106) | type downloadOption struct
    method ApplyToReader (line 110) | func (o *downloadOption) ApplyToReader(r *Reader) {
  function WithOffline (line 116) | func WithOffline(offline bool) ReaderOption {
  type offlineOption (line 120) | type offlineOption struct
    method ApplyToReader (line 124) | func (o *offlineOption) ApplyToReader(r *Reader) {
  function WithTrustedHosts (line 130) | func WithTrustedHosts(trustedHosts []string) ReaderOption {
  type trustedHostsOption (line 134) | type trustedHostsOption struct
    method ApplyToReader (line 138) | func (o *trustedHostsOption) ApplyToReader(r *Reader) {
  function WithTempDir (line 144) | func WithTempDir(tempDir string) ReaderOption {
  type tempDirOption (line 148) | type tempDirOption struct
    method ApplyToReader (line 152) | func (o *tempDirOption) ApplyToReader(r *Reader) {
  function WithCacheExpiryDuration (line 158) | func WithCacheExpiryDuration(duration time.Duration) ReaderOption {
  type cacheExpiryDurationOption (line 162) | type cacheExpiryDurationOption struct
    method ApplyToReader (line 166) | func (o *cacheExpiryDurationOption) ApplyToReader(r *Reader) {
  function WithDebugFunc (line 174) | func WithDebugFunc(debugFunc DebugFunc) ReaderOption {
  type debugFuncOption (line 178) | type debugFuncOption struct
    method ApplyToReader (line 182) | func (o *debugFuncOption) ApplyToReader(r *Reader) {
  function WithPromptFunc (line 193) | func WithPromptFunc(promptFunc PromptFunc) ReaderOption {
  type promptFuncOption (line 197) | type promptFuncOption struct
    method ApplyToReader (line 201) | func (o *promptFuncOption) ApplyToReader(r *Reader) {
  function WithReaderCACert (line 206) | func WithReaderCACert(caCert string) ReaderOption {
  type readerCACertOption (line 210) | type readerCACertOption struct
    method ApplyToReader (line 214) | func (o *readerCACertOption) ApplyToReader(r *Reader) {
  function WithReaderCert (line 219) | func WithReaderCert(cert string) ReaderOption {
  type readerCertOption (line 223) | type readerCertOption struct
    method ApplyToReader (line 227) | func (o *readerCertOption) ApplyToReader(r *Reader) {
  function WithReaderCertKey (line 232) | func WithReaderCertKey(certKey string) ReaderOption {
  type readerCertKeyOption (line 236) | type readerCertKeyOption struct
    method ApplyToReader (line 240) | func (o *readerCertKeyOption) ApplyToReader(r *Reader) {

FILE: taskfile/snippet.go
  constant lineIndicator (line 19) | lineIndicator   = ">"
  constant columnIndicator (line 20) | columnIndicator = "^"
  function init (line 23) | func init() {
  type SnippetOption (line 37) | type SnippetOption interface
  type Snippet (line 42) | type Snippet struct
    method Options (line 81) | func (s *Snippet) Options(opts ...SnippetOption) {
    method String (line 140) | func (s *Snippet) String() string {
  function NewSnippet (line 58) | func NewSnippet(b []byte, opts ...SnippetOption) *Snippet {
  function WithLine (line 89) | func WithLine(line int) SnippetOption {
  type lineOption (line 93) | type lineOption struct
    method ApplyToSnippet (line 97) | func (o *lineOption) ApplyToSnippet(s *Snippet) {
  function WithColumn (line 102) | func WithColumn(column int) SnippetOption {
  type columnOption (line 106) | type columnOption struct
    method ApplyToSnippet (line 110) | func (o *columnOption) ApplyToSnippet(s *Snippet) {
  function WithPadding (line 116) | func WithPadding(padding int) SnippetOption {
  type paddingOption (line 120) | type paddingOption struct
    method ApplyToSnippet (line 124) | func (o *paddingOption) ApplyToSnippet(s *Snippet) {
  function WithNoIndicators (line 130) | func WithNoIndicators() SnippetOption {
  type noIndicatorsOption (line 134) | type noIndicatorsOption struct
    method ApplyToSnippet (line 136) | func (o *noIndicatorsOption) ApplyToSnippet(s *Snippet) {
  function digits (line 181) | func digits(number int) int {

FILE: taskfile/snippet_test.go
  constant sample (line 10) | sample = `version: 3
  function TestNewSnippet (line 22) | func TestNewSnippet(t *testing.T) {
  function TestSnippetString (line 87) | func TestSnippetString(t *testing.T) {

FILE: taskfile/taskfile.go
  function RemoteExists (line 41) | func RemoteExists(ctx context.Context, u url.URL, client *http.Client) (...

FILE: taskrc/ast/taskrc.go
  type TaskRC (line 12) | type TaskRC struct
    method Merge (line 38) | func (t *TaskRC) Merge(other *TaskRC) {
  type Remote (line 25) | type Remote struct

FILE: taskrc/node.go
  type Node (line 7) | type Node struct
  function NewNode (line 11) | func NewNode(

FILE: taskrc/reader.go
  type DebugFunc (line 13) | type DebugFunc
  type ReaderOption (line 15) | type ReaderOption interface
  type Reader (line 20) | type Reader struct
    method Options (line 37) | func (r *Reader) Options(opts ...ReaderOption) {
    method Read (line 60) | func (r *Reader) Read(node *Node) (*ast.TaskRC, error) {
  function NewReader (line 27) | func NewReader(opts ...ReaderOption) *Reader {
  function WithDebugFunc (line 47) | func WithDebugFunc(debugFunc DebugFunc) ReaderOption {
  type debugFuncOption (line 51) | type debugFuncOption struct
    method ApplyToReader (line 55) | func (o *debugFuncOption) ApplyToReader(r *Reader) {

FILE: taskrc/taskrc.go
  function GetConfig (line 26) | func GetConfig(dir string) (*ast.TaskRC, error) {

FILE: taskrc/taskrc_test.go
  constant xdgConfigYAML (line 16) | xdgConfigYAML = `
  constant homeConfigYAML (line 23) | homeConfigYAML = `
  constant localConfigYAML (line 29) | localConfigYAML = `
  function setupDirs (line 35) | func setupDirs(t *testing.T) (string, string, string) {
  function writeFile (line 53) | func writeFile(t *testing.T, dir, filename, content string) {
  function TestGetConfig_NoConfigFiles (line 59) | func TestGetConfig_NoConfigFiles(t *testing.T) { //nolint:paralleltest /...
  function TestGetConfig_OnlyXDG (line 67) | func TestGetConfig_OnlyXDG(t *testing.T) { //nolint:paralleltest // cann...
  function TestGetConfig_OnlyHome (line 84) | func TestGetConfig_OnlyHome(t *testing.T) { //nolint:paralleltest // can...
  function TestGetConfig_OnlyLocal (line 100) | func TestGetConfig_OnlyLocal(t *testing.T) { //nolint:paralleltest // ca...
  function TestGetConfig_All (line 115) | func TestGetConfig_All(t *testing.T) { //nolint:paralleltest // cannot r...
  function TestGetConfig_RemoteTrustedHosts (line 140) | func TestGetConfig_RemoteTrustedHosts(t *testing.T) { //nolint:parallelt...
  function TestGetConfig_RemoteTrustedHostsMerge (line 172) | func TestGetConfig_RemoteTrustedHostsMerge(t *testing.T) { //nolint:para...

FILE: variables.go
  method CompiledTask (line 24) | func (e *Executor) CompiledTask(call *Call) (*ast.Task, error) {
  method FastCompiledTask (line 29) | func (e *Executor) FastCompiledTask(call *Call) (*ast.Task, error) {
  method CompiledTaskForTaskList (line 33) | func (e *Executor) CompiledTaskForTaskList(call *Call) (*ast.Task, error) {
  method compiledTask (line 79) | func (e *Executor) compiledTask(call *Call, evaluateShVars bool) (*ast.T...
  function asAnySlice (line 318) | func asAnySlice[T any](slice []T) []any {
  function itemsFromFor (line 326) | func itemsFromFor(
  function resolveMatrixRefs (line 417) | func resolveMatrixRefs(matrix *ast.Matrix, cache *templater.Cache) error {
  function product (line 436) | func product(matrix *ast.Matrix) []map[string]any {

FILE: watch.go
  constant defaultWaitTime (line 26) | defaultWaitTime = 100 * time.Millisecond
  method watchTasks (line 29) | func (e *Executor) watchTasks(calls ...*Call) error {
  function isContextError (line 147) | func isContextError(err error) bool {
  function closeOnInterrupt (line 155) | func closeOnInterrupt(w *fsnotify.Watcher) {
  method registerWatchedDirs (line 165) | func (e *Executor) registerWatchedDirs(w *fsnotify.Watcher, calls ...*Ca...
  function ShouldIgnore (line 195) | func ShouldIgnore(path string) bool {
  method collectSources (line 204) | func (e *Executor) collectSources(calls []*Call) ([]string, error) {
  type traverseFunc (line 219) | type traverseFunc
  method traverse (line 221) | func (e *Executor) traverse(calls []*Call, yield traverseFunc) error {

FILE: watch_test.go
  function TestFileWatch (line 22) | func TestFileWatch(t *testing.T) {
  function TestShouldIgnore (line 84) | func TestShouldIgnore(t *testing.T) {

FILE: website/.vitepress/config.ts
  method transformHead (line 83) | transformHead({ pageData }) {

FILE: website/.vitepress/plugins/github-links.ts
  type PluginOptions (line 3) | interface PluginOptions {
  function githubLinksPlugin (line 7) | function githubLinksPlugin(

FILE: website/.vitepress/theme/index.ts
  method Layout (line 15) | Layout() {
  method enhanceApp (line 20) | enhanceApp({ app }) {
Condensed preview — 715 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,229K chars).
[
  {
    "path": ".editorconfig",
    "chars": 242,
    "preview": "# editorconfig.org\n\nroot = true\n\n[*]\ninsert_final_newline = true\ncharset = utf-8\ntrim_trailing_whitespace = true\nindent_"
  },
  {
    "path": ".gitattributes",
    "chars": 39,
    "preview": "* text=auto\n*.mdx -linguist-detectable\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 1838,
    "preview": "name: '🐞 Bug Report'\ndescription: Report a bug in Task.\nlabels: ['state: needs-triage']\nbody:\n  - type: markdown\n    att"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 608,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: '🔌 Task for Visual Studio Code'\n    url: https://github.com/go-task"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 946,
    "preview": "name: '✨ Feature Request'\ndescription: Suggest a new feature or enhancement for Task.\nlabels: ['state: needs-triage']\nbo"
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 228,
    "preview": "<!--\n\nThanks for your pull request, we really appreciate contributions!\n\nPlease understand that it may take some time to"
  },
  {
    "path": ".github/renovate.json",
    "chars": 914,
    "preview": "{\n  \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n  \"extends\": [\n    \"config:recommended\",\n    \"group:"
  },
  {
    "path": ".github/workflows/issue-awaiting-response.yml",
    "chars": 1510,
    "preview": "name: issue awaiting response\n\non:\n  issue_comment:\n    types: [created]\n\njobs:\n  issue-awaiting-response:\n    runs-on: "
  },
  {
    "path": ".github/workflows/issue-closed.yml",
    "chars": 885,
    "preview": "name: issue closed\n\non:\n  issues:\n    types: [closed]\n\njobs:\n  issue-closed:\n    runs-on: ubuntu-latest\n    steps:\n     "
  },
  {
    "path": ".github/workflows/issue-experiment.yml",
    "chars": 6866,
    "preview": "name: issue experiment\n\non:\n  issues:\n    types: [labeled]\n\njobs:\n  issue-experiment-proposed:\n    if: github.event.labe"
  },
  {
    "path": ".github/workflows/issue-needs-triage.yml",
    "chars": 860,
    "preview": "name: issue needs triage\n\non:\n  issues:\n    types: [opened]\n\njobs:\n  issue-needs-triage:\n    runs-on: ubuntu-latest\n    "
  },
  {
    "path": ".github/workflows/lint.yml",
    "chars": 1104,
    "preview": "name: Lint\n\non:\n  pull_request:\n  push:\n    tags:\n      - v*\n    branches:\n      - main\n\njobs:\n  lint:\n    name: Lint\n  "
  },
  {
    "path": ".github/workflows/pr-build.yml",
    "chars": 2757,
    "preview": "name: PR Build\n\non:\n  pull_request_target:\n    types: [labeled, synchronize]\n\npermissions:\n  contents: read\n  pull-reque"
  },
  {
    "path": ".github/workflows/release-nightly.yml",
    "chars": 868,
    "preview": "name: Release nightly\n\non:\n  workflow_dispatch:\n  schedule:\n    - cron: 0 0 * * *\njobs:\n  goreleaser:\n    runs-on: ubunt"
  },
  {
    "path": ".github/workflows/release.yml",
    "chars": 1612,
    "preview": "name: goreleaser\n\non:\n  push:\n    tags:\n      - 'v*'\n\npermissions:\n  id-token: write  # Required for OIDC\n  contents: re"
  },
  {
    "path": ".github/workflows/test.yml",
    "chars": 966,
    "preview": "name: Test\n\non:\n  pull_request:\n  push:\n    tags:\n      - v*\n    branches:\n      - main\n\njobs:\n  test:\n    name: Test\n  "
  },
  {
    "path": ".gitignore",
    "chars": 475,
    "preview": "# Binaries for programs and plugins\n*.exe\n*.dll\n*.so\n*.dylib\n\n# Test binary, build with `go test -c`\n*.test\n\n# Output of"
  },
  {
    "path": ".golangci.yml",
    "chars": 1153,
    "preview": "version: \"2\"\n\nformatters:\n  enable:\n    - gofmt\n    - gofumpt\n    - goimports\n    - gci\n  settings:\n    gofmt:\n      sim"
  },
  {
    "path": ".goreleaser-nightly.yml",
    "chars": 308,
    "preview": "# yaml-language-server: $schema=https://goreleaser.com/static/schema.json\nversion: 2\npro: true\n\nrelease:\n  name_template"
  },
  {
    "path": ".goreleaser-pr.yml",
    "chars": 629,
    "preview": "# yaml-language-server: $schema=https://goreleaser.com/static/schema.json\nversion: 2\n\nbuilds:\n  - binary: task\n    main:"
  },
  {
    "path": ".goreleaser.yml",
    "chars": 4339,
    "preview": "# yaml-language-server: $schema=https://goreleaser.com/static/schema.json\nversion: 2\n\nbuilds:\n  - binary: task\n    main:"
  },
  {
    "path": ".mockery.yaml",
    "chars": 216,
    "preview": "all: False\ntemplate: testify\nfilename: '{{base (trimSuffix \".go\" .InterfaceFile)}}_mock.go'\npackages:\n  github.com/go-ta"
  },
  {
    "path": ".prettierrc.yml",
    "chars": 125,
    "preview": "trailingComma: none\nsingleQuote: true\noverrides:\n  - files: \"*.md\"\n    options:\n      printWidth: 80\n      proseWrap: al"
  },
  {
    "path": ".taskrc.yml",
    "chars": 73,
    "preview": "experiments:\n  GENTLE_FORCE: 0\n  REMOTE_TASKFILES: 0\n  ENV_PRECEDENCE: 0\n"
  },
  {
    "path": ".vscode/extensions.json",
    "chars": 104,
    "preview": "{\n  \"recommendations\": [\n    \"editorconfig.editorconfig\",\n    \"golang.go\",\n    \"task.vscode-task\"\n  ]\n}\n"
  },
  {
    "path": ".vscode/settings-sample.json",
    "chars": 268,
    "preview": "{\n  \"yaml.schemas\": {\n    \"./website/src/public/schema.json\": [\n        \"Taskfile.yml\",\n        \"Taskfile.yaml\",\n       "
  },
  {
    "path": "CHANGELOG.md",
    "chars": 68980,
    "preview": "# Changelog\n\n## v3.49.1 - 2026-03-08\n\n* Reverted #2632 for now, which caused some regressions. That change will be\n  rew"
  },
  {
    "path": "LICENSE",
    "chars": 1080,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2016 Andrey Nering\n\nPermission is hereby granted, free of charge, to any person obt"
  },
  {
    "path": "README.md",
    "chars": 1822,
    "preview": "<div align=\"center\">\n  <a href=\"https://taskfile.dev\">\n    <img src=\"website/src/public/img/logo.svg\" width=\"200px\" heig"
  },
  {
    "path": "Taskfile.yml",
    "chars": 5987,
    "preview": "version: '3'\n\nincludes:\n  website:\n    aliases: [w, docs, d]\n    taskfile: ./website\n    dir: ./website\n\nvars:\n  BIN: \"{"
  },
  {
    "path": "args/args.go",
    "chars": 1393,
    "preview": "package args\n\nimport (\n\t\"strings\"\n\n\t\"github.com/spf13/pflag\"\n\t\"mvdan.cc/sh/v3/syntax\"\n\n\t\"github.com/go-task/task/v3\"\n\t\"g"
  },
  {
    "path": "args/args_test.go",
    "chars": 2421,
    "preview": "package args_test\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/go-task/task/v3\"\n\t\"gi"
  },
  {
    "path": "bin/.keep",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "call.go",
    "chars": 240,
    "preview": "package task\n\nimport \"github.com/go-task/task/v3/taskfile/ast\"\n\n// Call is the parameters to a task call\ntype Call struc"
  },
  {
    "path": "cmd/release/main.go",
    "chars": 3093,
    "preview": "package main\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/Masterminds/semver/v3\"\n\t\"github.com/spf13"
  },
  {
    "path": "cmd/sleepit/sleepit.go",
    "chars": 4875,
    "preview": "// This code is released under the MIT License\n// Copyright (c) 2020 Marco Molteni and the timeit contributors.\n\npackage"
  },
  {
    "path": "cmd/task/task.go",
    "chars": 4739,
    "preview": "package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\n\t\"github.com/spf13/pflag\"\n\n\t\"github.com/go-t"
  },
  {
    "path": "compiler.go",
    "chars": 6017,
    "preview": "package task\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/go-task/task/v"
  },
  {
    "path": "completion/bash/task.bash",
    "chars": 1454,
    "preview": "# vim: set tabstop=2 shiftwidth=2 expandtab:\n\n_GO_TASK_COMPLETION_LIST_OPTION='--list-all'\nTASK_CMD=\"${TASK_EXE:-task}\"\n"
  },
  {
    "path": "completion/fish/task.fish",
    "chars": 7494,
    "preview": "set -l GO_TASK_PROGNAME (if set -q GO_TASK_PROGNAME; echo $GO_TASK_PROGNAME; else if set -q TASK_EXE; echo $TASK_EXE; el"
  },
  {
    "path": "completion/ps/task.ps1",
    "chars": 8206,
    "preview": "using namespace System.Management.Automation\n\nRegister-ArgumentCompleter -CommandName task -ScriptBlock {\n\tparam($comman"
  },
  {
    "path": "completion/zsh/_task",
    "chars": 6296,
    "preview": "#compdef task\ntypeset -A opt_args\nTASK_CMD=\"${TASK_EXE:-task}\"\ncompdef _task \"$TASK_CMD\"\n\n_GO_TASK_COMPLETION_LIST_OPTIO"
  },
  {
    "path": "completion.go",
    "chars": 675,
    "preview": "package task\n\nimport (\n\t_ \"embed\"\n\t\"fmt\"\n)\n\n//go:embed completion/bash/task.bash\nvar completionBash string\n\n//go:embed c"
  },
  {
    "path": "concurrency.go",
    "chars": 436,
    "preview": "package task\n\nfunc (e *Executor) acquireConcurrencyLimit() func() {\n\tif e.concurrencySemaphore == nil {\n\t\treturn emptyFu"
  },
  {
    "path": "errors/error_taskfile_decode.go",
    "chars": 2998,
    "preview": "package errors\n\nimport (\n\t\"bytes\"\n\t\"cmp\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/fatih/color\"\n\t\"go.yaml.in/yaml/v3\"\n)\n"
  },
  {
    "path": "errors/errors.go",
    "chars": 1894,
    "preview": "package errors\n\nimport \"errors\"\n\n// General exit codes\nconst (\n\tCodeOk      int = iota // Used when the program exits wi"
  },
  {
    "path": "errors/errors_task.go",
    "chars": 5122,
    "preview": "package errors\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"mvdan.cc/sh/v3/interp\"\n)\n\n// TaskNotFoundError is returned when "
  },
  {
    "path": "errors/errors_taskfile.go",
    "chars": 5769,
    "preview": "package errors\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/Masterminds/semver/v3\"\n)\n\n// TaskfileNotFoundError is "
  },
  {
    "path": "errors/errors_taskrc.go",
    "chars": 392,
    "preview": "package errors\n\nimport \"fmt\"\n\ntype TaskRCNotFoundError struct {\n\tURI  string\n\tWalk bool\n}\n\nfunc (err TaskRCNotFoundError"
  },
  {
    "path": "executor.go",
    "chars": 15281,
    "preview": "package task\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/puzpuzpuz/xsync/v4\"\n\t\"github.com/sajari/fuzz"
  },
  {
    "path": "executor_test.go",
    "chars": 26244,
    "preview": "package task_test\n\nimport (\n\t\"bytes\"\n\t\"cmp\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/sebdah/goldie/v2\"\n\t\"g"
  },
  {
    "path": "experiments/errors.go",
    "chars": 634,
    "preview": "package experiments\n\nimport (\n\t\"fmt\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/go-task/task/v3/internal/slicesext\"\n)\n\ntype Inv"
  },
  {
    "path": "experiments/experiment.go",
    "chars": 1346,
    "preview": "package experiments\n\nimport (\n\t\"fmt\"\n\t\"slices\"\n\t\"strconv\"\n\n\t\"github.com/go-task/task/v3/taskrc/ast\"\n)\n\ntype Experiment s"
  },
  {
    "path": "experiments/experiment_test.go",
    "chars": 3083,
    "preview": "package experiments_test\n\nimport (\n\t\"strconv\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/go-task/ta"
  },
  {
    "path": "experiments/experiments.go",
    "chars": 1862,
    "preview": "package experiments\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/joho/godotenv\"\n\n\t\"github.com/go-tas"
  },
  {
    "path": "formatter_test.go",
    "chars": 5562,
    "preview": "package task_test\n\nimport (\n\t\"bytes\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/sebdah/goldie/v2\"\n\t\"github.com/stretchr/t"
  },
  {
    "path": "go.mod",
    "chars": 6974,
    "preview": "module github.com/go-task/task/v3\n\ngo 1.25\n\nrequire (\n\tcharm.land/bubbles/v2 v2.0.0\n\tcharm.land/bubbletea/v2 v2.0.1\n\tcha"
  },
  {
    "path": "go.sum",
    "chars": 30343,
    "preview": "cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=\ncel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX"
  },
  {
    "path": "hash.go",
    "chars": 437,
    "preview": "package task\n\nimport (\n\t\"cmp\"\n\t\"fmt\"\n\n\t\"github.com/go-task/task/v3/internal/hash\"\n\t\"github.com/go-task/task/v3/taskfile/"
  },
  {
    "path": "help.go",
    "chars": 5614,
    "preview": "package task\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/Ladicle/tabwriter\"\n\t\"gola"
  },
  {
    "path": "init.go",
    "chars": 1267,
    "preview": "package task\n\nimport (\n\t_ \"embed\"\n\t\"os\"\n\n\t\"github.com/go-task/task/v3/errors\"\n\t\"github.com/go-task/task/v3/internal/file"
  },
  {
    "path": "init_test.go",
    "chars": 963,
    "preview": "package task_test\n\nimport (\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/go-task/task/v3\"\n\t\"github.com/go-task/task/v3/internal/filepa"
  },
  {
    "path": "install-task.sh",
    "chars": 9406,
    "preview": "#!/bin/sh\nset -e\n# Code generated by godownloader on 2021-01-12T13:40:40Z. DO NOT EDIT.\n#\n\nusage() {\n  this=$1\n  cat <<E"
  },
  {
    "path": "internal/deepcopy/deepcopy.go",
    "chars": 4177,
    "preview": "package deepcopy\n\nimport (\n\t\"reflect\"\n\n\t\"github.com/elliotchance/orderedmap/v3\"\n)\n\ntype Copier[T any] interface {\n\tDeepC"
  },
  {
    "path": "internal/editors/output.go",
    "chars": 2404,
    "preview": "package editors\n\nimport (\n\t\"github.com/go-task/task/v3/taskfile/ast\"\n)\n\ntype (\n\t// Namespace wraps task list output for "
  },
  {
    "path": "internal/env/env.go",
    "chars": 2926,
    "preview": "package env\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/go-task/task/v3/experiments\"\n\t\"github.com"
  },
  {
    "path": "internal/execext/coreutils.go",
    "chars": 400,
    "preview": "package execext\n\nimport (\n\t\"runtime\"\n\t\"strconv\"\n\n\t\"github.com/go-task/task/v3/internal/env\"\n)\n\nvar useGoCoreUtils bool\n\n"
  },
  {
    "path": "internal/execext/devnull.go",
    "chars": 287,
    "preview": "package execext\n\nimport (\n\t\"io\"\n)\n\nvar _ io.ReadWriteCloser = devNull{}\n\ntype devNull struct{}\n\nfunc (devNull) Read(p []"
  },
  {
    "path": "internal/execext/exec.go",
    "chars": 4309,
    "preview": "package execext\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"mvdan.cc/sh/moreinterp/coreutils\""
  },
  {
    "path": "internal/filepathext/filepathext.go",
    "chars": 1221,
    "preview": "package filepathext\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n)\n\n// SmartJoin joins two paths, but only if the second "
  },
  {
    "path": "internal/fingerprint/checker.go",
    "chars": 518,
    "preview": "package fingerprint\n\nimport (\n\t\"context\"\n\n\t\"github.com/go-task/task/v3/taskfile/ast\"\n)\n\n// StatusCheckable defines any t"
  },
  {
    "path": "internal/fingerprint/checker_mock.go",
    "chars": 9228,
    "preview": "// Code generated by mockery; DO NOT EDIT.\n// github.com/vektra/mockery\n// template: testify\n\npackage fingerprint\n\nimpor"
  },
  {
    "path": "internal/fingerprint/glob.go",
    "chars": 1072,
    "preview": "package fingerprint\n\nimport (\n\t\"os\"\n\t\"sort\"\n\n\t\"github.com/go-task/task/v3/internal/execext\"\n\t\"github.com/go-task/task/v3"
  },
  {
    "path": "internal/fingerprint/sources.go",
    "chars": 388,
    "preview": "package fingerprint\n\nimport \"fmt\"\n\nfunc NewSourcesChecker(method, tempDir string, dry bool) (SourcesCheckable, error) {\n"
  },
  {
    "path": "internal/fingerprint/sources_checksum.go",
    "chars": 2791,
    "preview": "package fingerprint\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/zeebo/xxh3\"\n\n\t\"gith"
  },
  {
    "path": "internal/fingerprint/sources_checksum_test.go",
    "chars": 411,
    "preview": "package fingerprint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestNormalizeFilename(t *testing"
  },
  {
    "path": "internal/fingerprint/sources_none.go",
    "chars": 459,
    "preview": "package fingerprint\n\nimport \"github.com/go-task/task/v3/taskfile/ast\"\n\n// NoneChecker is a no-op Checker.\n// It will alw"
  },
  {
    "path": "internal/fingerprint/sources_timestamp.go",
    "chars": 3521,
    "preview": "package fingerprint\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n\n\t\"github.com/go-task/task/v3/taskfile/ast\"\n)\n\n// Timestamp"
  },
  {
    "path": "internal/fingerprint/status.go",
    "chars": 890,
    "preview": "package fingerprint\n\nimport (\n\t\"context\"\n\n\t\"github.com/go-task/task/v3/internal/env\"\n\t\"github.com/go-task/task/v3/intern"
  },
  {
    "path": "internal/fingerprint/task.go",
    "chars": 2938,
    "preview": "package fingerprint\n\nimport (\n\t\"context\"\n\n\t\"github.com/go-task/task/v3/internal/logger\"\n\t\"github.com/go-task/task/v3/tas"
  },
  {
    "path": "internal/fingerprint/task_test.go",
    "chars": 5435,
    "preview": "package fingerprint\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/mock\"\n\t\"gi"
  },
  {
    "path": "internal/flags/flags.go",
    "chars": 14554,
    "preview": "package flags\n\nimport (\n\t\"cmp\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/"
  },
  {
    "path": "internal/fsext/fs.go",
    "chars": 7224,
    "preview": "package fsext\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/go-task/task/v3/internal/filepathext\"\n\t\"github.com/go-task/"
  },
  {
    "path": "internal/fsext/fs_test.go",
    "chars": 6783,
    "preview": "package fsext\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc TestDefaultDir"
  },
  {
    "path": "internal/fsext/testdata/bar.txt",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "internal/fsext/testdata/foo.txt",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "internal/fsnotifyext/fsnotify_dedup.go",
    "chars": 910,
    "preview": "package fsnotifyext\n\nimport (\n\t\"math\"\n\t\"time\"\n\n\t\"github.com/fsnotify/fsnotify\"\n)\n\ntype Deduper struct {\n\tw        *fsnot"
  },
  {
    "path": "internal/goext/meta.go",
    "chars": 1191,
    "preview": "package goext\n\n// NOTE(@andreynering): The lists in this file were copied from:\n//\n// https://github.com/golang/go/blob/"
  },
  {
    "path": "internal/hash/hash.go",
    "chars": 520,
    "preview": "package hash\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/mitchellh/hashstructure/v2\"\n\n\t\"github.com/go-task/task/v3/taskfile/ast\"\n)\n\nt"
  },
  {
    "path": "internal/input/input.go",
    "chars": 4376,
    "preview": "package input\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\n\t\"charm.land/bubbles/v2/textinput\"\n\ttea \"charm.land/bubbletea/v2\"\n\t\"cha"
  },
  {
    "path": "internal/logger/logger.go",
    "chars": 5695,
    "preview": "package logger\n\nimport (\n\t\"bufio\"\n\t\"io\"\n\t\"slices\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/Ladicle/tabwriter\"\n\t\"github.com/fa"
  },
  {
    "path": "internal/output/group.go",
    "chars": 1181,
    "preview": "package output\n\nimport (\n\t\"bytes\"\n\t\"io\"\n\n\t\"github.com/go-task/task/v3/internal/templater\"\n)\n\ntype Group struct {\n\tBegin,"
  },
  {
    "path": "internal/output/interleaved.go",
    "chars": 292,
    "preview": "package output\n\nimport (\n\t\"io\"\n\n\t\"github.com/go-task/task/v3/internal/templater\"\n)\n\ntype Interleaved struct{}\n\nfunc (Int"
  },
  {
    "path": "internal/output/output.go",
    "chars": 1153,
    "preview": "package output\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/go-task/task/v3/internal/logger\"\n\t\"github.com/go-task/task/v3/intern"
  },
  {
    "path": "internal/output/output_test.go",
    "chars": 4587,
    "preview": "package output_test\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"testing\"\n\n\t\"github.com/fatih/color\"\n\t\"github.com/stretch"
  },
  {
    "path": "internal/output/prefixed.go",
    "chars": 2412,
    "preview": "package output\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/go-task/task/v3/internal/logger\"\n\t\"githu"
  },
  {
    "path": "internal/slicesext/slicesext.go",
    "chars": 545,
    "preview": "package slicesext\n\nimport (\n\t\"cmp\"\n\t\"slices\"\n)\n\nfunc UniqueJoin[T cmp.Ordered](ss ...[]T) []T {\n\tvar length int\n\tfor _, "
  },
  {
    "path": "internal/slicesext/slicesext_test.go",
    "chars": 1922,
    "preview": "package slicesext\n\nimport (\n\t\"math\"\n\t\"strconv\"\n\t\"testing\"\n)\n\nfunc TestConvertIntToString(t *testing.T) {\n\tt.Parallel()\n\t"
  },
  {
    "path": "internal/sort/sorter.go",
    "chars": 1245,
    "preview": "package sort\n\nimport (\n\t\"slices\"\n\t\"sort\"\n\t\"strings\"\n)\n\n// A Sorter is any function that sorts a set of tasks.\ntype Sorte"
  },
  {
    "path": "internal/sort/sorter_test.go",
    "chars": 2254,
    "preview": "package sort\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestAlphaNumericWithRootTasksFirst_Sort"
  },
  {
    "path": "internal/summary/summary.go",
    "chars": 6442,
    "preview": "package summary\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/go-task/task/v3/internal/logger\"\n\t\"github.com/go-task/ta"
  },
  {
    "path": "internal/summary/summary_test.go",
    "chars": 3735,
    "preview": "package summary_test\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\n\t\"github.com/go-ta"
  },
  {
    "path": "internal/sysinfo/uid.go",
    "chars": 308,
    "preview": "//go:build !windows\n\npackage sysinfo\n\nimport (\n\t\"os\"\n\t\"syscall\"\n)\n\nfunc Owner(path string) (int, error) {\n\tinfo, err := "
  },
  {
    "path": "internal/sysinfo/uid_win.go",
    "chars": 208,
    "preview": "//go:build windows\n\npackage sysinfo\n\n// NOTE: This always returns -1 since there is currently no easy way to get\n// file"
  },
  {
    "path": "internal/templater/funcs.go",
    "chars": 2681,
    "preview": "package templater\n\nimport (\n\t\"maps\"\n\t\"math/rand/v2\"\n\t\"path/filepath\"\n\t\"runtime\"\n\t\"strings\"\n\n\t\"github.com/davecgh/go-spew"
  },
  {
    "path": "internal/templater/templater.go",
    "chars": 3343,
    "preview": "package templater\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"maps\"\n\t\"strings\"\n\n\t\"github.com/go-task/template\"\n\n\t\"github.com/go-task/tas"
  },
  {
    "path": "internal/term/term.go",
    "chars": 165,
    "preview": "package term\n\nimport (\n\t\"os\"\n\n\t\"golang.org/x/term\"\n)\n\nfunc IsTerminal() bool {\n\treturn term.IsTerminal(int(os.Stdin.Fd()"
  },
  {
    "path": "internal/version/version.go",
    "chars": 1644,
    "preview": "package version\n\nimport (\n\t_ \"embed\"\n\t\"runtime/debug\"\n\t\"strings\"\n)\n\nvar (\n\t//go:embed version.txt\n\tversion string\n\tcommi"
  },
  {
    "path": "internal/version/version.txt",
    "chars": 7,
    "preview": "3.49.1\n"
  },
  {
    "path": "precondition.go",
    "chars": 831,
    "preview": "package task\n\nimport (\n\t\"context\"\n\n\t\"github.com/go-task/task/v3/errors\"\n\t\"github.com/go-task/task/v3/internal/env\"\n\t\"git"
  },
  {
    "path": "requires.go",
    "chars": 5067,
    "preview": "package task\n\nimport (\n\t\"slices\"\n\n\t\"github.com/go-task/task/v3/errors\"\n\t\"github.com/go-task/task/v3/internal/input\"\n\t\"gi"
  },
  {
    "path": "setup.go",
    "chars": 7569,
    "preview": "package task\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/Masterminds/s"
  },
  {
    "path": "signals.go",
    "chars": 769,
    "preview": "package task\n\nimport (\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\n\t\"github.com/go-task/task/v3/internal/logger\"\n)\n\nconst maxInterrup"
  },
  {
    "path": "signals_test.go",
    "chars": 7592,
    "preview": "//go:build signals\n// +build signals\n\n// This file contains tests for signal handling on Unix.\n// Based on code from htt"
  },
  {
    "path": "status.go",
    "chars": 1192,
    "preview": "package task\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/go-task/task/v3/internal/fingerprint\"\n\t\"github.com/go-task/task/v"
  },
  {
    "path": "task.go",
    "chars": 16188,
    "preview": "package task\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"runtime\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync/atomic\"\n\n\t\"golang.org/x/sync/errgr"
  },
  {
    "path": "task_test.go",
    "chars": 70291,
    "preview": "package task_test\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io\"\n\t\"io/fs\"\n\t\"maps\"\n\trand \"math/rand/v2\"\n\t\"net/http\"\n\t\"net/http/httptest\""
  },
  {
    "path": "taskfile/ast/cmd.go",
    "chars": 2631,
    "preview": "package ast\n\nimport (\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n\t\"github.com/go-task/task/v3/internal/"
  },
  {
    "path": "taskfile/ast/defer.go",
    "chars": 844,
    "preview": "package ast\n\nimport (\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n)\n\ntype Defer struct {\n\tCmd    string\n"
  },
  {
    "path": "taskfile/ast/dep.go",
    "chars": 1031,
    "preview": "package ast\n\nimport (\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n)\n\n// Dep is a task dependency\ntype De"
  },
  {
    "path": "taskfile/ast/for.go",
    "chars": 1615,
    "preview": "package ast\n\nimport (\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n\t\"github.com/go-task/task/v3/internal/"
  },
  {
    "path": "taskfile/ast/glob.go",
    "chars": 569,
    "preview": "package ast\n\nimport (\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n)\n\ntype Glob struct {\n\tGlob   string\n\t"
  },
  {
    "path": "taskfile/ast/graph.go",
    "chars": 2531,
    "preview": "package ast\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"sync\"\n\n\t\"github.com/dominikbraun/graph\"\n\t\"github.com/dominikbraun/graph/draw\"\n\t\"gol"
  },
  {
    "path": "taskfile/ast/include.go",
    "chars": 6075,
    "preview": "package ast\n\nimport (\n\t\"iter\"\n\t\"sync\"\n\n\t\"github.com/elliotchance/orderedmap/v3\"\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-t"
  },
  {
    "path": "taskfile/ast/location.go",
    "chars": 247,
    "preview": "package ast\n\ntype Location struct {\n\tLine     int\n\tColumn   int\n\tTaskfile string\n}\n\nfunc (l *Location) DeepCopy() *Locat"
  },
  {
    "path": "taskfile/ast/matrix.go",
    "chars": 3490,
    "preview": "package ast\n\nimport (\n\t\"iter\"\n\n\t\"github.com/elliotchance/orderedmap/v3\"\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task"
  },
  {
    "path": "taskfile/ast/output.go",
    "chars": 1404,
    "preview": "package ast\n\nimport (\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n)\n\n// Output of the Task output\ntype O"
  },
  {
    "path": "taskfile/ast/platforms.go",
    "chars": 2516,
    "preview": "package ast\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n\t\"github.com/go-tas"
  },
  {
    "path": "taskfile/ast/platforms_test.go",
    "chars": 1530,
    "preview": "package ast\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nfunc T"
  },
  {
    "path": "taskfile/ast/precondition.go",
    "chars": 1071,
    "preview": "package ast\n\nimport (\n\t\"fmt\"\n\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n)\n\n// Precondition represents "
  },
  {
    "path": "taskfile/ast/precondition_test.go",
    "chars": 993,
    "preview": "package ast_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\t\"go"
  },
  {
    "path": "taskfile/ast/prompt.go",
    "chars": 606,
    "preview": "package ast\n\nimport (\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n)\n\ntype Prompt []string\n\nfunc (p *Prom"
  },
  {
    "path": "taskfile/ast/requires.go",
    "chars": 1259,
    "preview": "package ast\n\nimport (\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n\t\"github.com/go-task/task/v3/internal/"
  },
  {
    "path": "taskfile/ast/task.go",
    "chars": 6524,
    "preview": "package ast\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n\t\"github."
  },
  {
    "path": "taskfile/ast/taskfile.go",
    "chars": 2896,
    "preview": "package ast\n\nimport (\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/Masterminds/semver/v3\"\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/ta"
  },
  {
    "path": "taskfile/ast/taskfile_test.go",
    "chars": 1881,
    "preview": "package ast_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n\t\"go"
  },
  {
    "path": "taskfile/ast/tasks.go",
    "chars": 7168,
    "preview": "package ast\n\nimport (\n\t\"fmt\"\n\t\"iter\"\n\t\"slices\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/elliotchance/orderedmap/v3\"\n\t\"go.yaml.in"
  },
  {
    "path": "taskfile/ast/var.go",
    "chars": 1007,
    "preview": "package ast\n\nimport (\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/errors\"\n)\n\n// Var represents either a static o"
  },
  {
    "path": "taskfile/ast/vars.go",
    "chars": 5423,
    "preview": "package ast\n\nimport (\n\t\"iter\"\n\t\"sync\"\n\n\t\"github.com/elliotchance/orderedmap/v3\"\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-t"
  },
  {
    "path": "taskfile/dotenv.go",
    "chars": 897,
    "preview": "package taskfile\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/joho/godotenv\"\n\n\t\"github.com/go-task/task/v3/internal/filepathext\""
  },
  {
    "path": "taskfile/node.go",
    "chars": 2212,
    "preview": "package taskfile\n\nimport (\n\t\"context\"\n\t\"strings\"\n\t\"time\"\n\n\tgiturls \"github.com/chainguard-dev/git-urls\"\n\n\t\"github.com/go"
  },
  {
    "path": "taskfile/node_base.go",
    "chars": 1456,
    "preview": "package taskfile\n\ntype (\n\tNodeOption func(*baseNode)\n\t// baseNode is a generic node that implements the Parent() methods"
  },
  {
    "path": "taskfile/node_cache.go",
    "chars": 2452,
    "preview": "package taskfile\n\nimport (\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"time\"\n)\n\nconst remoteCacheDir = \"remote\"\n\nty"
  },
  {
    "path": "taskfile/node_file.go",
    "chars": 2515,
    "preview": "package taskfile\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/go-task/task/v3/errors\"\n\t\"github.com/go-task/task/"
  },
  {
    "path": "taskfile/node_git.go",
    "chars": 6627,
    "preview": "package taskfile\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"sync\"\n\n\tgiturls \"git"
  },
  {
    "path": "taskfile/node_git_test.go",
    "chars": 8283,
    "preview": "package taskfile\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/stretchr/testify/require\"\n)\n\nf"
  },
  {
    "path": "taskfile/node_http.go",
    "chars": 4631,
    "preview": "package taskfile\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"crypto/x509\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"path/file"
  },
  {
    "path": "taskfile/node_http_test.go",
    "chars": 8274,
    "preview": "package taskfile\n\nimport (\n\t\"crypto/ecdsa\"\n\t\"crypto/elliptic\"\n\t\"crypto/rand\"\n\t\"crypto/x509\"\n\t\"crypto/x509/pkix\"\n\t\"encodi"
  },
  {
    "path": "taskfile/node_stdin.go",
    "chars": 1412,
    "preview": "package taskfile\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/go-task/task/v3/internal/execext\"\n\t\"github.com/go-task/ta"
  },
  {
    "path": "taskfile/node_test.go",
    "chars": 642,
    "preview": "package taskfile\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestScheme(t *testing.T) {\n\tt.Paral"
  },
  {
    "path": "taskfile/reader.go",
    "chars": 16127,
    "preview": "package taskfile\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\t\"github.com/dominikbraun/graph\"\n\t\"go.yam"
  },
  {
    "path": "taskfile/snippet.go",
    "chars": 5002,
    "preview": "package taskfile\n\nimport (\n\t\"bytes\"\n\t\"embed\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/alecthomas/chroma/v2\"\n\t\"github.com/alecthom"
  },
  {
    "path": "taskfile/snippet_test.go",
    "chars": 9631,
    "preview": "package taskfile\n\nimport (\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/require\"\n)\n\nconst sample = `version: 3\n\n"
  },
  {
    "path": "taskfile/taskfile.go",
    "chars": 2740,
    "preview": "package taskfile\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/go-task/task/v3/e"
  },
  {
    "path": "taskfile/templates/default.yml",
    "chars": 222,
    "preview": "# yaml-language-server: $schema=https://taskfile.dev/schema.json\n\nversion: '3'\n\nvars:\n  GREETING: Hello, world!\n\ntasks:\n"
  },
  {
    "path": "taskfile/themes/task.xml",
    "chars": 676,
    "preview": "<style name=\"task\">\n  <entry type=\"Background\" style=\"bg:#eee8d5\"/>\n  <entry type=\"Keyword\" style=\"#859900\"/>\n  <entry t"
  },
  {
    "path": "taskrc/ast/taskrc.go",
    "chars": 2599,
    "preview": "package ast\n\nimport (\n\t\"cmp\"\n\t\"maps\"\n\t\"slices\"\n\t\"time\"\n\n\t\"github.com/Masterminds/semver/v3\"\n)\n\ntype TaskRC struct {\n\tVer"
  },
  {
    "path": "taskrc/node.go",
    "chars": 416,
    "preview": "package taskrc\n\nimport (\n\t\"github.com/go-task/task/v3/internal/fsext\"\n)\n\ntype Node struct {\n\tentrypoint string\n}\n\nfunc N"
  },
  {
    "path": "taskrc/reader.go",
    "chars": 1825,
    "preview": "package taskrc\n\nimport (\n\t\"os\"\n\n\t\"go.yaml.in/yaml/v3\"\n\n\t\"github.com/go-task/task/v3/taskrc/ast\"\n)\n\ntype (\n\t// DebugFunc "
  },
  {
    "path": "taskrc/taskrc.go",
    "chars": 2208,
    "preview": "package taskrc\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"slices\"\n\t\"strings\"\n\n\t\"github.com/go-task/task/v3/errors\"\n\t\"github.com/"
  },
  {
    "path": "taskrc/taskrc_test.go",
    "chars": 7275,
    "preview": "package taskrc\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"github.com/s"
  },
  {
    "path": "testdata/alias/Taskfile.yml",
    "chars": 243,
    "preview": "version: '3'\n\nincludes:\n  included:\n    taskfile: Taskfile2.yml\n    aliases: [inc, i]\n\ntasks:\n  foo:\n    aliases: [f, x]"
  },
  {
    "path": "testdata/alias/Taskfile2.yml",
    "chars": 77,
    "preview": "version: '3'\n\ntasks:\n  qux:\n    aliases: [q, x]\n    cmds:\n      - echo \"qux\"\n"
  },
  {
    "path": "testdata/alias/testdata/TestAlias-alias.golden",
    "chars": 90,
    "preview": "task: [foo] echo \"foo\"\nfoo\ntask: [bar] echo \"bar\"\nbar\ntask: [included:qux] echo \"qux\"\nqux\n"
  },
  {
    "path": "testdata/alias/testdata/TestAlias-alias_summary.golden",
    "chars": 111,
    "preview": "task: foo\n\n(task does not have description or summary)\n\naliases:\n - f\n - x\n\ncommands:\n - echo \"foo\"\n - Task: b\n"
  },
  {
    "path": "testdata/alias/testdata/TestAlias-duplicate_alias-err-run.golden",
    "chars": 52,
    "preview": "task: Found multiple tasks (foo, bar) that match \"x\""
  },
  {
    "path": "testdata/alias/testdata/TestAlias-duplicate_alias.golden",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "testdata/checksum/.gitignore",
    "chars": 21,
    "preview": ".task/\ngenerated.txt\n"
  },
  {
    "path": "testdata/checksum/Taskfile.yml",
    "chars": 619,
    "preview": "version: '3'\n\ntasks:\n  build:\n    cmds:\n      - cp ./source.txt ./generated.txt\n    sources:\n      - ./**/glob-with-inex"
  },
  {
    "path": "testdata/checksum/generated-wildcard.txt",
    "chars": 14,
    "preview": "Hello, World!\n"
  },
  {
    "path": "testdata/checksum/ignore_me.txt",
    "chars": 14,
    "preview": "plz ignore me\n"
  },
  {
    "path": "testdata/checksum/source.txt",
    "chars": 14,
    "preview": "Hello, World!\n"
  },
  {
    "path": "testdata/cmds_vars/Taskfile.yml",
    "chars": 256,
    "preview": "version: '3'\n\ntasks:\n  build-checksum:\n    sources:\n      - ./source.txt\n    cmds:\n      - echo \"{{.CHECKSUM}}\"\n\n  build"
  },
  {
    "path": "testdata/cmds_vars/source.txt",
    "chars": 14,
    "preview": "Hello, World!\n"
  },
  {
    "path": "testdata/concurrency/Taskfile.yml",
    "chars": 351,
    "preview": "version: \"3\"\n\ntasks:\n  default:\n    deps:\n      - t1\n\n  t1:\n    deps:\n      - t3\n      - t4\n    cmds:\n      - task: t2\n "
  },
  {
    "path": "testdata/concurrency/testdata/TestConcurrency.golden",
    "chars": 180,
    "preview": "done 1\ndone 2\ndone 3\ndone 4\ndone 5\ndone 6\ntask: [t1] echo done 1\ntask: [t2] echo done 2\ntask: [t3] echo done 3\ntask: [t4"
  },
  {
    "path": "testdata/cyclic/Taskfile.yml",
    "chars": 104,
    "preview": "version: '3'\n\ntasks:\n  task-1:\n    deps:\n      - task: task-2\n\n  task-2:\n    deps:\n      - task: task-1\n"
  },
  {
    "path": "testdata/deferred/Taskfile.yml",
    "chars": 631,
    "preview": "version: '3'\n\ntasks:\n  task-1:\n    - echo 'task-1 ran {{.PARAM}}'\n\n  task-2:\n    - defer: { task: 'task-1', vars: { PARA"
  },
  {
    "path": "testdata/deps/Taskfile.yml",
    "chars": 571,
    "preview": "version: '3'\n\ntasks:\n  default:\n    deps: [d1, d2, d3]\n\n  d1:\n    deps: [d11, d12, d13]\n    cmds:\n      - echo 'd1'\n\n  d"
  },
  {
    "path": "testdata/deps/d1.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d11.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d12.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d13.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d2.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d21.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d22.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d23.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d3.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d31.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d32.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/d33.txt",
    "chars": 5,
    "preview": "Text\n"
  },
  {
    "path": "testdata/deps/testdata/TestDeps.golden",
    "chars": 45,
    "preview": "d1\nd11\nd12\nd13\nd2\nd21\nd22\nd23\nd3\nd31\nd32\nd33\n"
  },
  {
    "path": "testdata/desc/Taskfile.yml",
    "chars": 298,
    "preview": "version: 3\ntasks:\n  build:\n    aliases:\n      - b\n    desc: |\n      Multi-line escription with alias which is super long"
  },
  {
    "path": "testdata/dir/Taskfile.yml",
    "chars": 72,
    "preview": "version: '3'\n\ntasks:\n  whereami:\n    cmds:\n      - pwd\n    silent: true\n"
  },
  {
    "path": "testdata/dir/dynamic_var/.gitignore",
    "chars": 6,
    "preview": "*.txt\n"
  },
  {
    "path": "testdata/dir/dynamic_var/Taskfile.yml",
    "chars": 649,
    "preview": "version: '3'\n\nincludes:\n  sub:\n    taskfile: subdirectory\n    dir: subdirectory\n\nvars:\n  DIRECTORY: subdirectory\n\ntasks:"
  },
  {
    "path": "testdata/dir/dynamic_var/subdirectory/Taskfile.yml",
    "chars": 377,
    "preview": "version: '3'\n\nvars:\n  TASKFILE_DIR:\n    sh: basename $(pwd)\n\ntasks:\n  from-included-taskfile:\n    cmds:\n      - echo '{{"
  },
  {
    "path": "testdata/dir/dynamic_var_on_created_dir/Taskfile.yml",
    "chars": 136,
    "preview": "version: '3'\n\ntasks:\n  default:\n    dir: created\n    cmds:\n      - echo {{.TASK_DIR}}\n    vars:\n      TASK_DIR:\n        "
  },
  {
    "path": "testdata/dir/explicit_doesnt_exist/Taskfile.yml",
    "chars": 90,
    "preview": "version: '3'\n\ntasks:\n  whereami:\n    dir: createme\n    cmds:\n      - pwd\n    silent: true\n"
  },
  {
    "path": "testdata/dir/explicit_exists/Taskfile.yml",
    "chars": 88,
    "preview": "version: '3'\n\ntasks:\n  whereami:\n    dir: exists\n    cmds:\n      - pwd\n    silent: true\n"
  }
]

// ... and 515 more files (download for full content)

About this extraction

This page contains the full source code of the go-task/task GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 715 files (1.0 MB), approximately 337.6k tokens, and a symbol index with 1160 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!