{"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":3589,"sourceCode":"        }\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(\"/...\")\n            .map(|base| if base == \"/\" { \"//\" } else { base });","sourceCodeStart":3571,"sourceCodeEnd":3607,"githubUrl":"https://github.com/jdx/mise/blob/533346cc374382b41ec5ff70536252b2e96e725c/src/task/mod.rs#L3571-L3607","documentation":"A monorepo pattern of the form '//path/...' without a ':task' portion doesn't say which task to run. During pattern parsing, mise splits on ':' and bails when a '//'-prefixed pattern has no task part, telling the user to add ':<task>' or ':*' for all tasks in that path.","triggerScenarios":"Running `mise run //pkg/util` or depending on `//pkg/util` with no ':' and task name — the path part alone is not a runnable pattern.","commonSituations":"Users expecting a directory-only pattern to run all tasks by default, or truncating a copied '//pkg/util:build' reference.","solutions":["Append a task name: '//pkg/util:build'","Append ':*' to run every task in that path: '//pkg/util:*'","If you meant a plain task name, remove the leading '//' and slashes"],"exampleFix":"// before\nmise run //pkg/util\n\n// after\nmise run //pkg/util:*","handlingStrategy":"validation","validationCode":"function isCompleteMonorepoPattern(pat) {\n  if (!pat.startsWith('//')) return true;\n  return pat.includes(':');\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always include a ':task' or ':*' suffix after a '//path' pattern","Use ':*' deliberately when you want every task in a directory","Lint task depends entries for '//' patterns lacking a colon"],"tags":["tasks","monorepo","cli","syntax"],"backgroundTag":"invalid-argument-format","analyzedSha":"533346cc374382b41ec5ff70536252b2e96e725c","analyzedAt":"2026-09-17T13:35:38.149Z","contentChangedAt":"2026-09-17T13:35:38.149Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}