Commits and CI
Commits
const page = await forge.commits.list("owner", "repo", {
ref: "main",
path: "src/",
since: "2026-08-01T00:00:00Z",
until: "2026-09-01T00:00:00Z",
perPage: 50,
});
const commit = await forge.commits.get("owner", "repo", page.items[0]!.sha);
list returns CommitSummary rows: sha, message, author and committer as { name, email, date }, parents as SHAs, and url. No files.
get adds the changed files:
interface Commit extends CommitSummary {
files: {
path: string;
status: ChangedFileStatus;
additions: number | null;
deletions: number | null;
}[];
filesComplete: boolean | null;
}
Still no patches. GitHub pages are collected up to its cap of 3 000 files and filesComplete is true when GitHub itself confirms the list is complete. GitLab reads at most 10 000 rows per call. When a provider or a safety limit makes completeness unknowable, filesComplete is null, not a hopeful true. Gitea does not report counts per file and GitLab withholds them for collapsed diffs, both come back as null.
Gitea rejects the path filter. Its API ignores pagination limits for it and would answer with the entire history, so the call fails early instead of downloading a repo. The other filters work.
CI runs
const runs = await forge.ciRuns.list("owner", "repo", { branch: "main", perPage: 10 });
interface CiRun {
id: string;
branch: string;
revision: string;
status: "queued" | "in_progress" | "waiting" | "completed";
conclusion:
| "success"
| "failure"
| "cancelled"
| "skipped"
| "neutral"
| "timed_out"
| "action_required"
| "stale"
| "startup_failure"
| null; // no outcome yet
url: string;
}
One row is a GitHub Actions run, a GitLab pipeline or a Gitea Actions run. Each platform's vocabulary lands on the two enums: a GitLab running pipeline is in_progress with a null conclusion, a GitHub completed run carries its conclusion, a Gitea waiting run is waiting. Three vocabularies, two fields, done.
Pull request checks use the same two enums for whatever the platform pins to a head SHA.
What is left out
Repository content, trees, branches, tags, webhooks and admin. On purpose. The scope is the review workflow: what is proposed, what was said about it, and whether it passed.