Skip to Content
Milestones

Milestones

Milestones group issues toward a goal. Like issues, each milestone is a markdown file with YAML frontmatter.

Frontmatter Fields

FieldTypeDefaultDescription
idstringAuto-generatedUnique identifier (e.g., M-1)
titlestringMilestone title
statusstringFirst status in configWorkflow stage (validated against config)
prioritystring | nullnullUrgency level (validated against config when provided)
labelsstring[][]Tags for filtering (validated against config)
startDatestring | nullnullISO 8601 date
dueDatestring | nullnullISO 8601 date
checklistobject[][]Milestone goals ({text, done})
logobject[][]Activity log ({timestamp, author, body})
createdAtstringAuto-generatedISO 8601 timestamp
updatedAtstringAuto-generatedISO 8601 timestamp

Example Milestone File

--- id: M-1 title: "v1.0 — Core features" status: Active priority: High labels: [] startDate: 2025-03-01 dueDate: 2025-04-01 checklist: - text: Authentication module done: true - text: API endpoints done: false log: - timestamp: "2025-03-01T10:00:00.000Z" author: agent-1 body: Milestone created. Target is end of Q1. createdAt: 2025-03-01T10:00:00.000Z updatedAt: 2025-03-15T08:00:00.000Z --- ## Goals Ship the core feature set: authentication, API, and basic UI.

File naming follows the same convention as issues — see Issues > File Naming for details.

Create Milestone

mdp milestone create -t "Milestone title"

Create a new milestone.

FlagShortDefaultDescription
--title-trequiredMilestone title
--status-sFirst status in configInitial status
--prioritynullPriority level
--labels-l[]Comma-separated labels
--start-datenullStart date (YYYY-MM-DD)
--due-datenullDue date (YYYY-MM-DD)
--checklist[]Comma-separated goals/deliverables (all start unchecked)
--description-d""Short description
--content-c""Full markdown body (or - for stdin)
--templatenullTemplate name
--dry-runfalsePreview without creating
{ "ok": true, "data": { "id": "M-1", "title": "v1.0 — Core features", "status": "Planning", "priority": "High", "labels": [], "startDate": "2025-03-01", "dueDate": "2025-04-01", "checklist": [], "log": [], "createdAt": "2025-03-01T10:00:00.000Z", "updatedAt": "2025-03-01T10:00:00.000Z", "filePath": ".mdp/milestones/M-1-v1-core-features/M-1-v1-core-features.md" } }

The actual .md file written to disk:

--- id: M-1 title: "v1.0 — Core features" status: Planning priority: High labels: [] startDate: 2025-03-01 dueDate: 2025-04-01 checklist: [] log: [] createdAt: 2025-03-01T10:00:00.000Z updatedAt: 2025-03-01T10:00:00.000Z ---

List Milestones

mdp milestone list

List milestones with filtering and sorting.

FlagShortDefaultDescription
--status-sallComma-separated status filter
--priorityallPriority filter
--labels-lallComma-separated labels filter
--overdue <bool>alltrue for overdue only, false for not overdue
--sort"id"Sort field: id, title, status, priority, created, updated, dueDate, completion
--order"asc"Sort order: asc, desc

Get Milestone

mdp milestone get --id M-1

Get a single milestone by ID with full details.

FlagShortDefaultDescription
--idrequiredMilestone ID
--include-contenttrueInclude markdown body
--include-issuesfalseInclude list of assigned issues

Returns all frontmatter fields plus content, log, filePath, and optionally issues.

Additionally, the following computed fields are calculated at read time (not stored in the file):

FieldTypeDescription
totalIssuesnumberCount of assigned issues
completedIssuesnumberCount of issues in a “done” status
completionPercentagenumberPercentage (0-100)
statusBreakdownRecord<string, number>Count of issues per status
estimateTotalnumberSum of estimate across all issues
estimateCompletednumberSum of estimate across completed issues
spentTotalnumberSum of spent across all issues
isOverduebooleantrue if past due and not 100% complete
checklistTotalnumberCount of checklist items
checklistCheckednumberCount of checked items
checklistProgressnumber | nullPercentage (0-100), null if empty

Update Milestone

mdp milestone update --id M-1 --status "Active"

Update a milestone.

FlagShortDefaultDescription
--idrequiredMilestone ID
--title-tNew title
--status-sNew status
--priorityNew priority
--labels-lReplace all labels
--add-labelsAdd labels
--remove-labelsRemove labels
--start-dateSet start date (none to clear)
--due-dateSet due date (none to clear)
--add-checklistAdd checklist items (comma-separated)
--remove-checklistRemove checklist items by text (comma-separated)
--checkMark items done by text (comma-separated)
--uncheckMark items not done by text (comma-separated)
--content-cReplace markdown body (or - for stdin)
--dry-runfalsePreview changes

Delete Milestone

mdp milestone delete --id M-1

Permanently delete a milestone.

FlagShortDefaultDescription
--idrequiredMilestone ID
--dry-runfalsePreview without deleting

Behavior:

  • Removes the milestone folder
  • Automatically unassigns all issues from this milestone (sets milestone: null)
  • Does not reclaim the ID

Milestone Progress

mdp milestone progress --id M-1

Show detailed progress report for a milestone.

FlagShortDefaultDescription
--idrequiredMilestone ID
{ "ok": true, "data": { "milestones": [ { "id": "M-1", "title": "v1.0 — Core features", "status": "Active", "dueDate": "2025-04-01", "totalIssues": 8, "completedIssues": 3, "completionPercentage": 37.5, "statusBreakdown": { "Backlog": 2, "In Progress": 3, "Done": 3 }, "estimateTotal": 34, "estimateCompleted": 13, "spentTotal": 22, "isOverdue": false, "checklistTotal": 2, "checklistChecked": 1, "checklistProgress": 50 } ] } }

This progress is computed from the milestone file and all linked issues. For example, a milestone file:

# In M-1-v1-core-features.md checklist: - text: Authentication module done: true - text: API endpoints done: false

With a linked issue ISS-1 having milestone: M-1 and status: Done, the system counts it toward completedIssues.

Milestone Log

Manage log entries on a milestone. Five subcommands: add, list, get, update, delete.

Add Log Entry

mdp milestone log add --id M-1 -b "Auth module complete"

Append a log entry to a milestone’s log frontmatter array.

FlagShortDefaultDescription
--idrequiredMilestone ID
--body-brequiredEntry body text
--author"cli"Author identifier
--dry-runfalsePreview without writing
{ "ok": true, "data": { "id": "M-1", "entry": { "author": "agent-1", "timestamp": "2025-03-15T08:00:00.000Z", "body": "Auth module complete. Moving to API endpoints." }, "totalEntries": 1, "filePath": ".mdp/milestones/M-1-v1-core-features/M-1-v1-core-features.md" } }

List Log Entries

mdp milestone log list --id M-1
FlagShortDefaultDescription
--idrequiredMilestone ID

Get Log Entry

mdp milestone log get --id M-1 --index 0
FlagShortDefaultDescription
--idrequiredMilestone ID
--indexrequiredLog entry index (0-based)

Update Log Entry

mdp milestone log update --id M-1 --index 0 -b "Updated message"
FlagShortDefaultDescription
--idrequiredMilestone ID
--indexrequiredLog entry index (0-based)
--authorNew author
--body-bNew body text
--dry-runfalsePreview without writing

Delete Log Entry

mdp milestone log delete --id M-1 --index 0
FlagShortDefaultDescription
--idrequiredMilestone ID
--indexrequiredLog entry index (0-based)
--dry-runfalsePreview without writing
Last updated on