fix: allow gh pr numbers after options

This commit is contained in:
Codex
2026-05-29 09:36:50 +00:00
parent 93d305b0f6
commit a6b185354f
3 changed files with 44 additions and 8 deletions
+21 -8
View File
@@ -801,6 +801,19 @@ function parseNumberForCommand(repo: string, raw: string | undefined, label: str
}
}
function parsePositionalNumberForCommand(repo: string, args: string[], startIndex: number, label: string): number | GitHubCommandResult {
const targets = positionalArgs(args.slice(startIndex));
if (targets.length !== 1) {
return validationError(label, repo, `${label} requires exactly one positive integer positional argument`, {
supportedCommands: [
`bun scripts/cli.ts gh ${label} <number> --repo ${repo}`,
`bun scripts/cli.ts gh ${label} --repo ${repo} <number>`,
],
});
}
return parseNumberForCommand(repo, targets[0], label);
}
function parseOwnerRepoNumberShorthand(raw: string | undefined): GitHubShorthandReference | null {
if (raw === undefined) return null;
const match = /^([^/#\s]+)\/([^/#\s]+)#([1-9]\d*)$/u.exec(raw);
@@ -5900,12 +5913,12 @@ export function ghHelp(): unknown {
"bun scripts/cli.ts gh issue board-row delete <issueNumber> [--repo owner/name] --board-issue 20 [--dry-run] [--expect-body-sha sha256]",
"bun scripts/cli.ts gh preflight <prNumber> [--repo owner/name] [--full|--raw] [compatibility alias for gh pr preflight]",
"bun scripts/cli.ts gh pr list [owner/repo] [--repo owner/name] [--state open|closed|all] [--limit N] [--json number,title,state,url,updatedAt,createdAt,author,head,base,draft]",
"bun scripts/cli.ts gh pr files <number> [--repo owner/name] [--limit N]",
"bun scripts/cli.ts gh pr diff <number> --stat [--repo owner/name] [--limit N] [compatibility alias for pr files; no raw diff]",
"bun scripts/cli.ts gh pr files <number> [--repo owner/name] [--limit N] [number may appear before or after options]",
"bun scripts/cli.ts gh pr diff <number> --stat [--repo owner/name] [--limit N] [number may appear before or after options; compatibility alias for pr files; no raw diff]",
"bun scripts/cli.ts gh pr read <number|owner/repo#number> [--repo owner/name] [--number N] [--json body,title,state,stateDetail,closed,closedAt,merged,mergedAt,mergeCommit,head,base,draft,headRefName,baseRefName,mergeable,mergeStateStatus,statusCheckRollup] [--raw|--full]",
"bun scripts/cli.ts gh pr view <number|owner/repo#number> [--repo owner/name] [--raw|--full] [compatibility alias for pr read]",
"bun scripts/cli.ts gh pr preflight <number> [--repo owner/name] [--full|--raw]",
"bun scripts/cli.ts gh pr closeout <number> [--repo owner/name] [--full|--raw] [compatibility alias for pr preflight]",
"bun scripts/cli.ts gh pr preflight <number> [--repo owner/name] [--full|--raw] [number may appear before or after options]",
"bun scripts/cli.ts gh pr closeout <number> [--repo owner/name] [--full|--raw] [number may appear before or after options; compatibility alias for pr preflight]",
"bun scripts/cli.ts gh pr create --title <title> --body-file <file>|--body <text> --base <branch> --head <branch> [--repo owner/name] [--draft] [--dry-run]",
"bun scripts/cli.ts gh pr edit <number> [--title title] [--body-file <file>|--body-file -|--body <text>] [--repo owner/name] [--dry-run]",
"bun scripts/cli.ts gh pr update <number> --mode replace|append [--body-file <file>|--body-file -|--body <text>] [--title title] [--repo owner/name] [--dry-run]",
@@ -6060,7 +6073,7 @@ export async function runGhCommand(args: string[]): Promise<GitHubCommandResult
if (top === "auth" && sub === "status") return authStatus(options.repo);
if (top === "preflight") {
const number = parseNumberForCommand(options.repo, sub, "preflight");
const number = parsePositionalNumberForCommand(options.repo, args, 1, "preflight");
if (typeof number !== "number") return number;
return prPreflight(options.repo, number, "preflight", options.full || options.raw);
}
@@ -6158,7 +6171,7 @@ export async function runGhCommand(args: string[]): Promise<GitHubCommandResult
if (top === "pr") {
if (sub === "diff") {
const number = parseNumberForCommand(options.repo, third, "pr diff");
const number = parsePositionalNumberForCommand(options.repo, args, 2, "pr diff");
if (typeof number !== "number") return number;
if (!optionWasProvided(args, "--stat")) {
return unsupportedCommand("pr diff", options.repo, "Raw PR diff output is intentionally unsupported by UniDesk CLI; use gh pr diff <number> --stat or gh pr files for a bounded REST file/stat summary.", {
@@ -6175,7 +6188,7 @@ export async function runGhCommand(args: string[]): Promise<GitHubCommandResult
return prFiles(options.repo, token, number, options.limit, "pr diff --stat");
}
if (sub === "files") {
const number = parseNumberForCommand(options.repo, third, "pr files");
const number = parsePositionalNumberForCommand(options.repo, args, 2, "pr files");
if (typeof number !== "number") return number;
const { token, probe } = resolveToken(true);
const missing = authRequired(options.repo, "pr files", probe);
@@ -6184,7 +6197,7 @@ export async function runGhCommand(args: string[]): Promise<GitHubCommandResult
}
if (sub === "delete") return unsupportedCommand("pr delete", options.repo, "GitHub REST does not support hard-deleting pull requests; use gh pr close for lifecycle deletion semantics.");
if (sub === "preflight" || sub === "closeout") {
const number = parseNumberForCommand(options.repo, third, `pr ${sub}`);
const number = parsePositionalNumberForCommand(options.repo, args, 2, `pr ${sub}`);
if (typeof number !== "number") return number;
return prPreflight(options.repo, number, sub === "closeout" ? "pr closeout" : "pr preflight", options.full || options.raw);
}