{"record":{"id":"889eb026454fec14","repo":"jdx/mise","slug":"missing-task-name-in-monorepo-path-use","errorCode":null,"errorMessage":"missing task name in monorepo path '{}', use '{}:<task>' or '{}:*' to run all tasks in that path","messagePattern":"missing task name in monorepo path '(.+?)', use '(.+?):<task>' or '(.+?):\\*' to run all tasks in that path","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/task/mod.rs","lineNumber":3417,"sourceCode":"            return Ok(vec![]);\n        }\n\n        // === Parse monorepo pattern ===\n        let normalized_pat = if pat.starts_with(\"//\") {\n            pat.to_string()\n        } else if pat.starts_with(':') {\n            // Special case: :task should have been expanded before calling get_matching\n            // If we reach here, it means the expansion didn't happen properly\n            bail!(\"':task' pattern should be expanded before matching\")\n        } else {\n            pat.to_string()\n        };\n\n        // Split pattern into path and task parts\n        // Pattern format: //path/...:task* or //path:task*\n        let parts: Vec<&str> = normalized_pat.splitn(2, ':').collect();\n        if pat.starts_with(\"//\") && parts.len() == 1 {\n            bail!(\n                \"missing task name in monorepo path '{}', use '{}:<task>' or '{}:*' to run all tasks in that path\",\n                pat,\n                pat,\n                pat\n            );\n        }\n        let (path_pattern, task_pattern) = match parts.as_slice() {\n            [path, task] => (*path, *task),\n            [path] => (*path, \"*\"),\n            _ => (normalized_pat.as_str(), \"*\"),\n        };\n\n        // === Convert ellipsis to glob syntax ===\n        // Convert ellipsis (...) to glob pattern (**)\n        // //... matches everything, //foo/... matches foo and all subdirs\n        let path_glob = path_pattern.replace(\"...\", \"**\");\n        let trailing_ellipsis_base = path_pattern\n            .strip_suffix(\"/...\")","sourceCodeStart":3399,"sourceCodeEnd":3435,"githubUrl":"https://github.com/jdx/mise/blob/6f52dcdf99e282ef7a7db68c81301fa4618d0f79/src/task/mod.rs#L3399-L3435","documentation":"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 ':*'.","triggerScenarios":"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.","commonSituations":"Assuming '//path' runs a default task in that project; converting from nx-style implicit defaults; autocompleting a directory path and forgetting the task suffix.","solutions":["Name the task explicitly: '//web:build'","Or run every task in that path: '//web:*'","Or use the ellipsis form for recursive matching: '//web/**:build'"],"exampleFix":"# before\n[tasks.ci]\ndepends = [\"//web\"]\n\n# after\n[tasks.ci]\ndepends = [\"//web:build\"]","handlingStrategy":"validation","validationCode":"# every '//' pattern must contain a colon\npython3 - <<'EOF'\nimport tomllib, sys\ncfg = tomllib.load(open('mise.toml','rb'))\nfor name, t in cfg.get('tasks', {}).items():\n    for d in map(str, t.get('depends', [])):\n        if d.startswith('//') and ':' not in d:\n            sys.exit(f\"{name}: '{d}' needs ':<task>' or ':*'\")\nprint('ok')\nEOF","typeGuard":null,"tryCatchPattern":null,"preventionTips":["There is no default task for a path — always append ':task' or ':*'","Use '//path/**:task' for recursive matches"],"tags":["mise","tasks","pattern-matching","monorepo","configuration"],"backgroundTag":"monorepo-task-path-syntax","analyzedSha":"6f52dcdf99e282ef7a7db68c81301fa4618d0f79","analyzedAt":"2026-08-22T10:14:23.840Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T15:18:49.778Z"}