eyaltoledano/claude-task-master · error
Invalid tasks data in ${tasksPath}
Error message
Invalid tasks data in ${tasksPath} What it means
expandTask() loads the tasks file and, before doing anything else, validates that readJSON returned an object with a tasks array. If the file is missing, unparseable, or lacks tasks, it throws this error naming the path, mirroring the same check as expand-all-tasks.
Source
Thrown at scripts/modules/task-manager/expand-task.js:99
projectRoot,
tag,
isMCP,
outputFormat,
report
});
// If remote handled it, return the result
if (remoteResult) {
return remoteResult;
}
// Otherwise fall through to file-based logic below
// --- End BRIDGE ---
// --- Task Loading/Filtering (Unchanged) ---
logger.info(`Reading tasks from ${tasksPath}`);
const data = readJSON(tasksPath, projectRoot, tag);
if (!data || !data.tasks)
throw new Error(`Invalid tasks data in ${tasksPath}`);
const taskIndex = data.tasks.findIndex(
(t) => t.id === parseInt(taskId, 10)
);
if (taskIndex === -1) throw new Error(`Task ${taskId} not found`);
const task = data.tasks[taskIndex];
logger.info(
`Expanding task ${taskId}: ${task.title}${useResearch ? ' with research' : ''}`
);
// --- End Task Loading/Filtering ---
// --- Handle Force Flag: Clear existing subtasks if force=true ---
if (force && Array.isArray(task.subtasks) && task.subtasks.length > 0) {
logger.info(
`Force flag set. Clearing existing ${task.subtasks.length} subtasks for task ${taskId}.`
);
task.subtasks = []; // Clear existing subtasks
}
// --- End Force Flag Handling ---View on GitHub (pinned to c0c98d367c)
Solutions
- Open the tasks file at the path in the message and fix any JSON syntax errors.
- Ensure you are running in the correct project root / tag so the correct tasks file is resolved.
- If the file is unrecoverable, regenerate it (parse-prd or init) and re-run expansion.
Example fix
// before
$ cat .taskmaster/tasks/tasks.json
{ "tasks": [ ... "truncated invalid json"
// after
$ task-master parse-prd prd.txt # regenerate valid tasks.json, then retry expand Defensive patterns
Strategy: type-guard
Validate before calling
const data = JSON.parse(fs.readFileSync(tasksPath, 'utf8'));
if (!Array.isArray(data.tasks)) throw new Error(`${tasksPath} has no tasks array`); Type guard
function isTasksData(v) {
return !!v && typeof v === 'object' && Array.isArray(v.tasks);
} Try / catch
try {
await expandTask(taskId, context);
} catch (err) {
if (err.message.startsWith('Invalid tasks data in')) {
console.error(`Repair or regenerate ${tasksPath}, then retry.`);
} else throw err;
} Prevention
- Keep tasks.json valid JSON — lint after edits and merge conflict resolution.
- Verify file existence before invoking expandTask in scripts.
- Use the correct project root and tag when resolving tasksPath.
When it happens
Trigger: Calling expandTask(taskId) when the tasks file at tasksPath cannot be read or parsed (readJSON → null), or its top-level JSON has no tasks field.
Common situations: Corrupted tasks.json after a failed write or merge conflict; running from a different project root so the resolved path points to a nonexistent file; wrong active tag resolving to an empty/absent per-tag file.
Related errors
- Invalid tasks data in ${tasksPath}
- No tasks found in the tasks file
- No valid tasks found in ${tasksPath}
- MFA_VERIFICATION_FAILED
- Failed to initialize services: ${(error as Error).message}
AI-assisted analysis of eyaltoledano/claude-task-master@c0c98d367c (2026-08-29).
Data as JSON: /api/errors/4e45a37a3068f8f5.
Report an issue: GitHub.