jdx/mise · error

missing task name in monorepo path '{}', use '{}:<task>' or

Error message

missing task name in monorepo path '{}', use '{}:<task>' or '{}:*' to run all tasks in that path

What it means

A monorepo pattern starting with '//' must have a task part after a colon (format //path...:task or //path:*). The matcher splits the normalized pattern on ':' with splitn(2) and, when no colon is found for a '//' pattern, bails with this message telling you to append ':<task>' or ':*'.

Source

Thrown at src/task/mod.rs:3417

            return Ok(vec![]);
        }

        // === Parse monorepo pattern ===
        let normalized_pat = if pat.starts_with("//") {
            pat.to_string()
        } else if pat.starts_with(':') {
            // Special case: :task should have been expanded before calling get_matching
            // If we reach here, it means the expansion didn't happen properly
            bail!("':task' pattern should be expanded before matching")
        } else {
            pat.to_string()
        };

        // Split pattern into path and task parts
        // Pattern format: //path/...:task* or //path:task*
        let parts: Vec<&str> = normalized_pat.splitn(2, ':').collect();
        if pat.starts_with("//") && parts.len() == 1 {
            bail!(
                "missing task name in monorepo path '{}', use '{}:<task>' or '{}:*' to run all tasks in that path",
                pat,
                pat,
                pat
            );
        }
        let (path_pattern, task_pattern) = match parts.as_slice() {
            [path, task] => (*path, *task),
            [path] => (*path, "*"),
            _ => (normalized_pat.as_str(), "*"),
        };

        // === Convert ellipsis to glob syntax ===
        // Convert ellipsis (...) to glob pattern (**)
        // //... matches everything, //foo/... matches foo and all subdirs
        let path_glob = path_pattern.replace("...", "**");
        let trailing_ellipsis_base = path_pattern
            .strip_suffix("/...")

View on GitHub (pinned to 6f52dcdf99)

Solutions

  1. Name the task explicitly: '//web:build'
  2. Or run every task in that path: '//web:*'
  3. Or use the ellipsis form for recursive matching: '//web/**:build'

Example fix

# before
[tasks.ci]
depends = ["//web"]

# after
[tasks.ci]
depends = ["//web:build"]
Defensive patterns

Strategy: validation

Validate before calling

# every '//' pattern must contain a colon
python3 - <<'EOF'
import tomllib, sys
cfg = tomllib.load(open('mise.toml','rb'))
for name, t in cfg.get('tasks', {}).items():
    for d in map(str, t.get('depends', [])):
        if d.startswith('//') and ':' not in d:
            sys.exit(f"{name}: '{d}' needs ':<task>' or ':*'")
print('ok')
EOF

Prevention

When it happens

Trigger: Running `mise run '//web'` or declaring depends = ["//libs"] — the pattern is only a workspace path with no task selector, so parts.len() == 1 and the bail fires before path/task decomposition.

Common situations: Assuming '//path' runs a default task in that project; converting from nx-style implicit defaults; autocompleting a directory path and forgetting the task suffix.

Related errors


AI-assisted analysis of jdx/mise@6f52dcdf99 (2026-08-22). Data as JSON: /api/errors/889eb026454fec14. Report an issue: GitHub.