{"record":{"id":"ab40b68a3800da23","repo":"eyaltoledano/claude-task-master","slug":"invalid-task-id-format-invalidids-join","errorCode":null,"errorMessage":"Invalid task ID format: ${invalidIds.join(', ')}. Expected numeric (e.g., '15'), subtask (e.g., '15.2'), or display ID (e.g., 'HAM-123')","messagePattern":"Invalid task ID format: (.+?)\\. Expected numeric \\(e\\.g\\., '15'\\), subtask \\(e\\.g\\., '15\\.2'\\), or display ID \\(e\\.g\\., 'HAM-123'\\)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/tm-core/src/modules/tasks/validation/task-id.ts","lineNumber":132,"sourceCode":" * parseTaskIds(\"HAM-123\");     // [\"HAM-123\"]\n * parseTaskIds(\"ham1,ham2\");   // [\"HAM-1\", \"HAM-2\"] (normalized)\n * parseTaskIds(\"invalid\");     // throws Error\n * parseTaskIds(\"HAM-1.2\");     // throws Error (API subtasks not supported)\n * ```\n */\nexport function parseTaskIds(input: string): string[] {\n\tconst ids = input\n\t\t.split(',')\n\t\t.map((id) => id.trim())\n\t\t.filter((id) => id.length > 0);\n\n\tif (ids.length === 0) {\n\t\tthrow new Error('No valid task IDs provided');\n\t}\n\n\tconst invalidIds = ids.filter((id) => !isValidTaskIdFormat(id));\n\tif (invalidIds.length > 0) {\n\t\tthrow new Error(\n\t\t\t`Invalid task ID format: ${invalidIds.join(', ')}. Expected numeric (e.g., '15'), subtask (e.g., '15.2'), or display ID (e.g., 'HAM-123')`\n\t\t);\n\t}\n\n\t// Normalize all IDs (e.g., \"ham1\" → \"HAM-1\")\n\treturn ids.map(normalizeDisplayId);\n}\n\n/**\n * Extract parent task ID from a subtask ID\n *\n * @param taskId - Task ID (e.g., \"1.2.3\")\n * @returns Parent ID (e.g., \"1\") or the original ID if not a subtask\n *\n * @example\n * ```typescript\n * extractParentId(\"1.2.3\");  // \"1\"\n * extractParentId(\"1.2\");    // \"1\"","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/eyaltoledano/claude-task-master/blob/c0c98d367c55296bfe69e65680625b6db437af02/packages/tm-core/src/modules/tasks/validation/task-id.ts#L114-L150","documentation":"parseTaskIds() validates each comma-separated segment against isValidTaskIdFormat and throws `Invalid task ID format: <ids>` when any segment is not a numeric ID ('15'), subtask ID ('15.2'), or display ID ('HAM-123'). This prevents malformed IDs from reaching storage lookup.","triggerScenarios":"Calling `parseTaskIds('abc')`, `parseTaskIds('15..2')`, `parseTaskIds('HAM_12')`, or any segment with stray characters (quotes, brackets, trailing dots).","commonSituations":"Pasting IDs with surrounding whitespace is fine, but pasting 'Task #15', '[15]', or '15.' is not; users mixing underscore vs hyphen in display IDs (HAM_123); programmatic callers concatenating IDs with wrong separators (space instead of comma).","solutions":["Correct the ID string: numeric (15), subtask (15.2), or display ID (HAM-123) — comma-separated, no quotes/brackets","Normalize display-ID prefixes if needed (parser normalizes 'ham1' to 'HAM-1', but only after format validation)","Pre-validate each ID with isValidTaskIdFormat() and show the user which entries were rejected"],"exampleFix":"// before\nparseTaskIds('[15, 16]'); // Invalid task ID format: [15,  16]\n// after\nparseTaskIds('15,16'); // OK","handlingStrategy":"validation","validationCode":"const TASK_ID_RE = /^\\d+(\\.\\d+)?$|^[A-Za-z]+-\\d+$/;\nconst bad = input.split(',').map(s => s.trim()).filter(s => s && !TASK_ID_RE.test(s));\nif (bad.length) throw new Error(`Bad IDs: ${bad.join(', ')}`);\nparseTaskIds(input);","typeGuard":"const isTaskId = (s: string) => /^\\d+(\\.\\d+)?$|^[A-Z]+-\\d+$/.test(s.trim());","tryCatchPattern":"try {\n  ids = parseTaskIds(input);\n} catch (e) {\n  if (e.message.startsWith('Invalid task ID format')) {\n    console.error(e.message); // shows offending IDs and expected formats\n    process.exitCode = 1;\n    return;\n  }\n  throw e;\n}","preventionTips":["Use numeric (15), subtask (15.2), or display (HAM-123) formats only — no brackets, quotes, or '#'\n","Separate IDs with commas, not spaces","Strip user-pasted decorations ('Task #15', '[15]') before parsing","Pre-validate with isValidTaskIdFormat and surface which entries failed"],"tags":["validation","input","task-ids","parsing"],"backgroundTag":"invalid-task-id-format","analyzedSha":"c0c98d367c55296bfe69e65680625b6db437af02","analyzedAt":"2026-08-29T02:56:26.071Z","schemaVersion":2},"datasetVersion":"2026-08-29T07:17:48.351Z"}