Skip to content

Milestone

Source: src/GitHub/Milestone.ts

A GitHub milestone.

Milestone manages repository milestones for tracking issues and pull requests. Milestones are created on first deploy and updated in place on subsequent deploys when properties change.

Authentication is resolved via the GitHubCredentials service supplied by GitHub.providers() (env, stored PAT, gh CLI, or OAuth). The token needs repo scope for private repositories or public_repo for public ones.

Basic Milestone

const v1 = yield* GitHub.Milestone("v1", {
owner: "my-org",
repository: "my-repo",
title: "v1.0.0",
description: "First stable release",
});

Milestone with Due Date

yield* GitHub.Milestone("sprint-1", {
owner: "my-org",
repository: "my-repo",
title: "Sprint 1",
description: "Complete user authentication",
dueOn: "2026-12-31",
});

Deploy with the same logical ID and different properties to update the existing milestone in place.

yield* GitHub.Milestone("v2", {
owner: "my-org",
repository: "my-repo",
title: "v2.0.0",
description: "Updated: API redesign and performance improvements",
dueOn: "2027-06-30",
});

Close a Milestone

yield* GitHub.Milestone("v1", {
owner: "my-org",
repository: "my-repo",
title: "v1.0.0",
state: "closed",
});

Reopen a Milestone

yield* GitHub.Milestone("v1", {
owner: "my-org",
repository: "my-repo",
title: "v1.0.0",
state: "open",
});

Changing the title creates a new milestone and deletes the old one.

// First deploy creates "Q1 2026"
const milestone = yield* GitHub.Milestone("q1", {
owner: "my-org",
repository: "my-repo",
title: "Q1 2026",
});
// Later deploy with same logical ID but different title replaces it
const milestone = yield* GitHub.Milestone("q1", {
owner: "my-org",
repository: "my-repo",
title: "Q1 2027",
});
import * as Output from "alchemy/Output";
const repo = yield* GitHub.Repository("api", {
owner: "my-org",
name: "api",
autoInit: true,
});
yield* GitHub.Milestone("launch", {
owner: repo.owner!,
repository: Output.map(repo.fullName, (fullName) => fullName.split("/")[1]!),
title: "Initial Launch",
dueOn: "2026-12-31",
});