Skip to content

BACK-401 - Add dueDate support for tasks and milestones across CLI, TUI, Web, and MCP - #910

Open
MrLesk wants to merge 1 commit into
mainfrom
tasks/back-401-datetime-support
Open

BACK-401 - Add dueDate support for tasks and milestones across CLI, TUI, Web, and MCP#910
MrLesk wants to merge 1 commit into
mainfrom
tasks/back-401-datetime-support

Conversation

@MrLesk

@MrLesk MrLesk commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Summary

  • add optional UTC datetime dueDate persistence for tasks and milestones
  • support create, edit, clear, list, and detail flows across CLI/TUI, Web/server, and MCP
  • canonicalize ISO offsets to minute-precision UTC and reject date-only values
  • document the additive stable JSON field

Testing

  • 126 cross-surface due-date, CLI, JSON, MCP, server, and Web tests passed
  • 35 focused TUI tests passed
  • independent final diff review found no P1/P2 issues
  • bunx tsc --noEmit
  • bun run check .
  • bun run build
  • git diff --check

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for security reviews. Please try again later.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ac622fb8b7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/markdown/parser.ts
Comment on lines +51 to +52
if (value && !value.startsWith("'") && !value.startsWith('"')) {
return `${prefix}"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"${comment}`;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve YAML null as an absent due date

When a human represents the optional field as valid YAML with due_date: null (or ~), this preprocessing quotes the null token into the literal string "null". normalizeUtcDateTime then throws, and the task/milestone list loaders catch that parse failure and silently omit the entire record from CLI, TUI, and Web views. Exempt YAML null tokens from quoting or normalize them to an absent due date.

Useful? React with 👍 / 👎.

Comment on lines +865 to +867
{task.dueDate && (
<div className="mt-1 text-xs text-gray-500 dark:text-gray-400 whitespace-nowrap">
Due (UTC): {formatStoredUtcDateForDisplay(task.dueDate, dateFormat)}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Show due dates on the default Web board

When users remain on the default /board route, this new due-date rendering is never used because that route renders TaskCard through BoardPage; src/web/components/TaskCard.tsx still displays only the created date in its footer and never references task.dueDate. Consequently due dates are visible in the /tasks table and detail modal but absent from the primary Web task listing, so add an equivalent due-date indicator to the board card.

Useful? React with 👍 / 👎.

Comment on lines +926 to +928
const dueDateText = task.dueDate
? ` {gray-fg}(due ${formatDateForDisplay(task.dueDate, { dateFormat, appendUtcLabel: true })}){/}`
: "";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Show due dates on the TUI Kanban board

When backlog board opens its initial Kanban view, tasks are rendered by renderBoardTui and src/ui/board.ts, whose card content still contains only ID, type, title, assignee, labels, and branch. This due-date text was added only to the task-list renderer, so the canonical interactive board omits deadlines until the user switches views or opens a task; include the due date in the Kanban card renderer as well.

Useful? React with 👍 / 👎.

<h3 className="text-base font-semibold text-gray-900 dark:text-gray-100 truncate">{bucket.label}</h3>
{milestoneEntity?.dueDate && (
<p className="mt-1 text-xs text-gray-500 dark:text-gray-400">
Due (UTC): {formatStoredUtcDateForDisplay(milestoneEntity.dueDate)}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Honor the configured date format for milestone deadlines

When a project configures a non-default dateFormat, milestone cards still render due dates in canonical YYYY-MM-DD HH:mm form because MilestonesPage neither receives the configured format from App.tsx nor passes one to this formatter. Task lists, task details, drafts, documents, decisions, and statistics all receive config.dateFormat, so milestone deadlines are the lone Web date display that ignores the user's setting; thread the same setting into this page.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant