feat(task): support glob patterns in task_config.includes#7870
Conversation
Adds support for glob patterns like `tasks/*.toml` in the `task_config.includes` configuration option. Previously, each include path was treated as a literal path. Now patterns containing `*`, `?`, or `[` are expanded using glob matching. Example: ```toml [task_config] includes = ["tasks/*.toml"] ``` Fixes: #7860 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
This PR adds glob pattern support to task_config.includes, allowing users to include multiple task files using wildcard patterns like tasks/*.toml instead of listing each file individually.
Changes:
- Modified task include resolution to detect and expand glob patterns (containing
*,?, or[) - Changed from
filter_maptoflat_mapto handle one-to-many pattern-to-path mapping - Added e2e test validating glob pattern expansion and mixing glob with literal paths
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| src/config/mod.rs | Implements glob pattern detection and expansion for task includes |
| e2e/tasks/test_task_includes_glob | Tests glob pattern functionality with multiple task files and mixed path types |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
src/config/mod.rs
Outdated
| return vec![]; | ||
| } | ||
| // Check if pattern contains glob characters | ||
| if p.contains('*') || p.contains('?') || p.contains('[') { |
There was a problem hiding this comment.
The glob detection logic is incomplete. Glob patterns can also contain ] (closing bracket for character classes) and { or } (for brace expansion like {a,b}). Additionally, escaped glob characters (e.g., \*) would be incorrectly treated as glob patterns. Consider using a more robust detection method or checking if the glob function returns multiple results to determine if expansion occurred.
src/config/mod.rs
Outdated
| // Check if pattern contains glob characters | ||
| if p.contains('*') || p.contains('?') || p.contains('[') { | ||
| // Use glob expansion | ||
| glob(dir, &p).unwrap_or_default() |
There was a problem hiding this comment.
Using unwrap_or_default() silently ignores glob errors, making it difficult for users to debug invalid patterns. Consider logging the error or propagating it so users receive feedback when their glob pattern is malformed.
| glob(dir, &p).unwrap_or_default() | |
| glob(dir, &p).unwrap_or_else(|err| { | |
| eprintln!( | |
| "Failed to expand glob pattern '{}' in '{}': {}", | |
| p, | |
| dir.display(), | |
| err | |
| ); | |
| Vec::new() | |
| }) |
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.
- Extract helper functions `is_glob_pattern` and `expand_task_include`
to reduce code duplication
- Add `]`, `{`, `}` to glob metacharacter detection
- Log warnings for glob errors instead of silently ignoring them
- Apply glob expansion to `load_file_tasks` so globs work in global
config includes, not just local configs
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Hyperfine Performance
|
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.1.8 x -- echo |
20.7 ± 0.3 | 20.0 | 22.7 | 1.00 |
mise x -- echo |
21.5 ± 0.3 | 20.5 | 22.3 | 1.04 ± 0.02 |
mise env
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.1.8 env |
20.1 ± 0.5 | 19.4 | 25.4 | 1.00 |
mise env |
20.9 ± 0.3 | 20.1 | 22.2 | 1.04 ± 0.03 |
mise hook-env
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.1.8 hook-env |
20.4 ± 0.2 | 19.8 | 21.4 | 1.00 |
mise hook-env |
21.3 ± 0.4 | 20.5 | 26.9 | 1.05 ± 0.02 |
mise ls
| Command | Mean [ms] | Min [ms] | Max [ms] | Relative |
|---|---|---|---|---|
mise-2026.1.8 ls |
18.2 ± 0.2 | 17.5 | 19.6 | 1.00 |
mise ls |
19.1 ± 0.3 | 18.4 | 20.3 | 1.05 ± 0.02 |
xtasks/test/perf
| Command | mise-2026.1.8 | mise | Variance |
|---|---|---|---|
| install (cached) | 112ms | 113ms | +0% |
| ls (cached) | 68ms | 68ms | +0% |
| bin-paths (cached) | 73ms | 73ms | +0% |
| task-ls (cached) | 291ms | 292ms | +0% |
### 🚀 Features - **(doctor)** add backend mismatch warnings by @jdx in [#7847](#7847) - **(http)** add rename_exe support for archive extraction by @jdx in [#7874](#7874) - **(http)** send x-mise-ci header for CI environment tracking by @jdx in [#7875](#7875) - **(install)** auto-install plugins from [plugins] config section by @jdx in [#7856](#7856) - **(registry)** add vercel by @mikecurtis in [#7844](#7844) - **(task)** support glob patterns in task_config.includes by @jdx in [#7870](#7870) - **(task)** add task templates for reusable task definitions by @jdx in [#7873](#7873) ### 🐛 Bug Fixes - **(backend)** change registry mismatch log from info to debug by @jdx in [#7858](#7858) - **(ci)** use squash merge for auto-merge-release workflow by @jdx in [7e5e71e](7e5e71e) - **(ci)** remove --auto flag to merge immediately when CI passes by @jdx in [23ed2ed](23ed2ed) - **(github)** select platform-matching provenance file for SLSA verification by @jdx in [#7853](#7853) - **(go)** filter out version "1" from available versions by @jdx in [#7871](#7871) - **(install)** skip CurDir components when detecting archive structure by @jdx in [#7868](#7868) - **(pipx)** ensure Python minor version symlink exists for postinstall hooks by @jdx in [#7869](#7869) - **(registry)** prevent duplicate -stable suffix in Flutter download URLs by @jdx in [#7872](#7872) - **(task)** pass env to usage parser for env-backed arguments by @jdx in [#7848](#7848) - **(task)** propagate MISE_ENV to child tasks when using -E flag by @jdx in [06ee776](06ee776) - **(vfox-dotnet)** use os.execute() to fix Windows installation by @prodrigues1912 in [#7843](#7843) ### 📚 Documentation - update cache-behavior with env_cache information by @jdx in [#7849](#7849) ###◀️ Revert - remove task inheritance from parent configs in monorepos by @jdx in [#7851](#7851) - Revert "fix(ci): remove --auto flag to merge immediately when CI passes" by @jdx in [0606187](0606187) ### 📦 Registry - add mago ([aqua:carthage-software/mago](https://github.com/carthage-software/mago)) by @scop in [#7845](#7845) ### Chore - **(ci)** auto-merge release branch into main daily at 4am CST by @jdx in [#7852](#7852) ### New Contributors - @mikecurtis made their first contribution in [#7844](#7844) - @prodrigues1912 made their first contribution in [#7843](#7843)
Summary
task_config.includes*,?, or[are now expanded using glob matchingExample:
This allows users to include all task files from a directory without listing each one individually.
Fixes: #7860
Test plan
test_task_includes_globthat verifies:tasks/*.tomldiscover all matching files🤖 Generated with Claude Code
Note
Adds glob expansion for task includes, enabling patterns like
tasks/*.toml.is_glob_patternandexpand_task_includeto resolve includes to concrete pathsload_file_tasksandtask_includes_for_dirto expand globs (while keepinggit::URLs handled separately)test_task_includes_globvalidating discovery, execution, and mixing glob with literal pathsWritten by Cursor Bugbot for commit 4a0649c. This will update automatically on new commits. Configure here.