Add dueDate field and sort tasks by deadline then project

Parse due_date/dueDate/deadline from task frontmatter. Sort API
output with due-date tasks first (soonest at top), then group
remaining tasks by project name.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jeff Emmett 2026-02-26 00:45:36 +00:00
parent af5fb23b28
commit e39e6fc398
3 changed files with 19 additions and 1 deletions

View File

@ -511,8 +511,17 @@ export class BacklogAggregator {
tasks = tasks.filter((t) => (t.priority ?? "").toLowerCase() === priority.toLowerCase());
}
// Sort by project then by task ID
// Sort: due-date tasks first (soonest/overdue at top), then by project, then by task ID
const now = new Date().toISOString().slice(0, 10);
tasks = tasks.sort((a, b) => {
const aDue = a.dueDate || "";
const bDue = b.dueDate || "";
// Tasks with due dates come before tasks without
if (aDue && !bDue) return -1;
if (!aDue && bDue) return 1;
// Both have due dates: sort soonest first
if (aDue && bDue) return aDue.localeCompare(bDue);
// Neither has due date: group by project, then by task ID
const projectCompare = a.projectName.localeCompare(b.projectName);
if (projectCompare !== 0) return projectCompare;
return sortByTaskId([a, b])[0] === a ? -1 : 1;

View File

@ -176,6 +176,13 @@ export function parseTask(content: string): Task {
: frontmatter.estimatedHours !== undefined
? Number(frontmatter.estimatedHours)
: undefined,
dueDate: frontmatter.due_date
? normalizeDate(frontmatter.due_date)
: frontmatter.dueDate
? normalizeDate(frontmatter.dueDate)
: frontmatter.deadline
? normalizeDate(frontmatter.deadline)
: undefined,
};
}

View File

@ -52,6 +52,8 @@ export interface Task {
doToday?: boolean;
/** Estimated hours to complete the task (for time tracking and invoicing) */
estimatedHours?: number;
/** Due date / deadline for the task (YYYY-MM-DD or YYYY-MM-DD HH:mm) */
dueDate?: string;
}
/**