@paretools/github 0.8.5 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/index.js.map +1 -1
  3. package/dist/lib/formatters.d.ts +10 -2
  4. package/dist/lib/formatters.d.ts.map +1 -1
  5. package/dist/lib/formatters.js +144 -16
  6. package/dist/lib/formatters.js.map +1 -1
  7. package/dist/lib/gh-runner.d.ts.map +1 -1
  8. package/dist/lib/gh-runner.js +2 -1
  9. package/dist/lib/gh-runner.js.map +1 -1
  10. package/dist/lib/parsers.d.ts +54 -18
  11. package/dist/lib/parsers.d.ts.map +1 -1
  12. package/dist/lib/parsers.js +426 -38
  13. package/dist/lib/parsers.js.map +1 -1
  14. package/dist/lib/path-validation.d.ts +13 -0
  15. package/dist/lib/path-validation.d.ts.map +1 -0
  16. package/dist/lib/path-validation.js +54 -0
  17. package/dist/lib/path-validation.js.map +1 -0
  18. package/dist/schemas/index.d.ts +267 -4
  19. package/dist/schemas/index.d.ts.map +1 -1
  20. package/dist/schemas/index.js +195 -4
  21. package/dist/schemas/index.js.map +1 -1
  22. package/dist/tools/api.d.ts.map +1 -1
  23. package/dist/tools/api.js +134 -8
  24. package/dist/tools/api.js.map +1 -1
  25. package/dist/tools/gist-create.d.ts.map +1 -1
  26. package/dist/tools/gist-create.js +91 -21
  27. package/dist/tools/gist-create.js.map +1 -1
  28. package/dist/tools/index.d.ts.map +1 -1
  29. package/dist/tools/index.js +6 -0
  30. package/dist/tools/index.js.map +1 -1
  31. package/dist/tools/issue-close.d.ts.map +1 -1
  32. package/dist/tools/issue-close.js +56 -9
  33. package/dist/tools/issue-close.js.map +1 -1
  34. package/dist/tools/issue-comment.d.ts.map +1 -1
  35. package/dist/tools/issue-comment.js +60 -9
  36. package/dist/tools/issue-comment.js.map +1 -1
  37. package/dist/tools/issue-create.d.ts.map +1 -1
  38. package/dist/tools/issue-create.js +95 -9
  39. package/dist/tools/issue-create.js.map +1 -1
  40. package/dist/tools/issue-list.d.ts.map +1 -1
  41. package/dist/tools/issue-list.js +139 -11
  42. package/dist/tools/issue-list.js.map +1 -1
  43. package/dist/tools/issue-update.d.ts.map +1 -1
  44. package/dist/tools/issue-update.js +142 -15
  45. package/dist/tools/issue-update.js.map +1 -1
  46. package/dist/tools/issue-view.d.ts.map +1 -1
  47. package/dist/tools/issue-view.js +26 -14
  48. package/dist/tools/issue-view.js.map +1 -1
  49. package/dist/tools/label-create.d.ts +4 -0
  50. package/dist/tools/label-create.d.ts.map +1 -0
  51. package/dist/tools/label-create.js +73 -0
  52. package/dist/tools/label-create.js.map +1 -0
  53. package/dist/tools/label-list.d.ts +4 -0
  54. package/dist/tools/label-list.d.ts.map +1 -0
  55. package/dist/tools/label-list.js +71 -0
  56. package/dist/tools/label-list.js.map +1 -0
  57. package/dist/tools/pr-checks.d.ts.map +1 -1
  58. package/dist/tools/pr-checks.js +57 -11
  59. package/dist/tools/pr-checks.js.map +1 -1
  60. package/dist/tools/pr-comment.d.ts.map +1 -1
  61. package/dist/tools/pr-comment.js +60 -9
  62. package/dist/tools/pr-comment.js.map +1 -1
  63. package/dist/tools/pr-create.d.ts.map +1 -1
  64. package/dist/tools/pr-create.js +154 -9
  65. package/dist/tools/pr-create.js.map +1 -1
  66. package/dist/tools/pr-diff.d.ts.map +1 -1
  67. package/dist/tools/pr-diff.js +63 -16
  68. package/dist/tools/pr-diff.js.map +1 -1
  69. package/dist/tools/pr-list.d.ts.map +1 -1
  70. package/dist/tools/pr-list.js +115 -11
  71. package/dist/tools/pr-list.js.map +1 -1
  72. package/dist/tools/pr-merge.d.ts.map +1 -1
  73. package/dist/tools/pr-merge.js +104 -15
  74. package/dist/tools/pr-merge.js.map +1 -1
  75. package/dist/tools/pr-review.d.ts.map +1 -1
  76. package/dist/tools/pr-review.js +41 -8
  77. package/dist/tools/pr-review.js.map +1 -1
  78. package/dist/tools/pr-update.d.ts.map +1 -1
  79. package/dist/tools/pr-update.js +157 -10
  80. package/dist/tools/pr-update.js.map +1 -1
  81. package/dist/tools/pr-view.d.ts.map +1 -1
  82. package/dist/tools/pr-view.js +27 -14
  83. package/dist/tools/pr-view.js.map +1 -1
  84. package/dist/tools/release-create.d.ts.map +1 -1
  85. package/dist/tools/release-create.js +106 -9
  86. package/dist/tools/release-create.js.map +1 -1
  87. package/dist/tools/release-list.d.ts.map +1 -1
  88. package/dist/tools/release-list.js +39 -13
  89. package/dist/tools/release-list.js.map +1 -1
  90. package/dist/tools/run-list.d.ts.map +1 -1
  91. package/dist/tools/run-list.js +111 -12
  92. package/dist/tools/run-list.js.map +1 -1
  93. package/dist/tools/run-rerun.d.ts.map +1 -1
  94. package/dist/tools/run-rerun.js +38 -8
  95. package/dist/tools/run-rerun.js.map +1 -1
  96. package/dist/tools/run-view.d.ts.map +1 -1
  97. package/dist/tools/run-view.js +64 -13
  98. package/dist/tools/run-view.js.map +1 -1
  99. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"pr-review.js","sourceRoot":"","sources":["../../src/tools/pr-review.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,8DAA8D;AAC9D,MAAM,UAAU,oBAAoB,CAAC,MAAiB;IACpD,MAAM,CAAC,YAAY,CACjB,WAAW,EACX;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,0LAA0L;QAC5L,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAClD,KAAK,EAAE,CAAC;iBACL,IAAI,CAAC,CAAC,SAAS,EAAE,iBAAiB,EAAE,SAAS,CAAC,CAAC;iBAC/C,QAAQ,CAAC,mDAAmD,CAAC;YAChE,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;iBAC5B,QAAQ,EAAE;iBACV,QAAQ,CAAC,wDAAwD,CAAC;YACrE,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,gCAAgC,CAAC;SAC9C;QACD,YAAY,EAAE,oBAAoB;KACnC,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;QACtC,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,IAAI,EAAE,CAAC;YACT,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtC,CAAC;QAED,6CAA6C;QAC7C,IAAI,CAAC,KAAK,KAAK,iBAAiB,IAAI,KAAK,KAAK,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAClE,MAAM,IAAI,KAAK,CAAC,gCAAgC,KAAK,YAAY,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC;QAE5D,qEAAqE;QACrE,IAAI,KAAyB,CAAC;QAC9B,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;YAC9B,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QAEjD,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,CAAC;QAED,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,UAAU,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;IAC1C,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"pr-review.js","sourceRoot":"","sources":["../../src/tools/pr-review.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pr-update.d.ts","sourceRoot":"","sources":["../../src/tools/pr-update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QAqHrD"}
1
+ {"version":3,"file":"pr-update.d.ts","sourceRoot":"","sources":["../../src/tools/pr-update.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,8DAA8D;AAC9D,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,QAkQrD"}
@@ -4,18 +4,27 @@ import { ghCmd } from "../lib/gh-runner.js";
4
4
  import { parsePrUpdate } from "../lib/parsers.js";
5
5
  import { formatPrUpdate } from "../lib/formatters.js";
6
6
  import { EditResultSchema } from "../schemas/index.js";
7
+ function classifyPrUpdateError(stderr) {
8
+ const lower = stderr.toLowerCase();
9
+ if (/not found|could not resolve|no pull request/.test(lower))
10
+ return "not-found";
11
+ if (/forbidden|permission|403/.test(lower))
12
+ return "permission-denied";
13
+ if (/validation|invalid|required|unprocessable/.test(lower))
14
+ return "validation";
15
+ return "unknown";
16
+ }
7
17
  /** Registers the `pr-update` tool on the given MCP server. */
8
18
  export function registerPrUpdateTool(server) {
9
19
  server.registerTool("pr-update", {
10
20
  title: "PR Update",
11
- description: "Updates pull request metadata (title, body, labels, assignees). Returns structured data with PR number and URL. Use instead of running `gh pr edit` in the terminal.",
21
+ description: "Updates pull request metadata (title, body, labels, assignees, reviewers, milestone, base branch, projects). Returns structured data with PR number and URL.",
12
22
  inputSchema: {
13
- number: z.number().describe("Pull request number"),
14
- path: z
23
+ number: z
15
24
  .string()
16
- .max(INPUT_LIMITS.PATH_MAX)
17
- .optional()
18
- .describe("Repository path (default: cwd)"),
25
+ .max(INPUT_LIMITS.STRING_MAX)
26
+ .describe("Pull request number, URL, or branch name"),
27
+ path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Repository path"),
19
28
  title: z
20
29
  .string()
21
30
  .max(INPUT_LIMITS.SHORT_STRING_MAX)
@@ -46,12 +55,60 @@ export function registerPrUpdateTool(server) {
46
55
  .max(INPUT_LIMITS.ARRAY_MAX)
47
56
  .optional()
48
57
  .describe("Assignees to remove"),
58
+ addProjects: z
59
+ .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
60
+ .max(INPUT_LIMITS.ARRAY_MAX)
61
+ .optional()
62
+ .describe("Projects to add (--add-project)"),
63
+ removeProjects: z
64
+ .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
65
+ .max(INPUT_LIMITS.ARRAY_MAX)
66
+ .optional()
67
+ .describe("Projects to remove (--remove-project)"),
68
+ // S-gap P0: Add reviewer management
69
+ addReviewers: z
70
+ .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
71
+ .max(INPUT_LIMITS.ARRAY_MAX)
72
+ .optional()
73
+ .describe("Add reviewers (--add-reviewer)"),
74
+ removeReviewers: z
75
+ .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
76
+ .max(INPUT_LIMITS.ARRAY_MAX)
77
+ .optional()
78
+ .describe("Remove reviewers (--remove-reviewer)"),
79
+ // S-gap P0: Add base branch change
80
+ base: z
81
+ .string()
82
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
83
+ .optional()
84
+ .describe("Change base branch (-B/--base)"),
85
+ // S-gap P1: Add milestone management
86
+ milestone: z
87
+ .string()
88
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
89
+ .optional()
90
+ .describe("Set milestone (--milestone)"),
91
+ removeMilestone: z.boolean().optional().describe("Remove milestone (--remove-milestone)"),
92
+ // S-gap P1: Add repo for cross-repo updates
93
+ repo: z
94
+ .string()
95
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
96
+ .optional()
97
+ .describe("Repository in OWNER/REPO format (--repo). Default: current repo."),
49
98
  },
50
99
  outputSchema: EditResultSchema,
51
- }, async ({ number, path, title, body, addLabels, removeLabels, addAssignees, removeAssignees, }) => {
100
+ }, async ({ number, path, title, body, addLabels, removeLabels, addAssignees, removeAssignees, addProjects, removeProjects, addReviewers, removeReviewers, base, milestone, removeMilestone, repo, }) => {
52
101
  const cwd = path || process.cwd();
53
102
  if (title)
54
103
  assertNoFlagInjection(title, "title");
104
+ if (typeof number === "string")
105
+ assertNoFlagInjection(number, "number");
106
+ if (base)
107
+ assertNoFlagInjection(base, "base");
108
+ if (milestone)
109
+ assertNoFlagInjection(milestone, "milestone");
110
+ if (repo)
111
+ assertNoFlagInjection(repo, "repo");
55
112
  if (addLabels) {
56
113
  for (const label of addLabels) {
57
114
  assertNoFlagInjection(label, "addLabels");
@@ -72,7 +129,57 @@ export function registerPrUpdateTool(server) {
72
129
  assertNoFlagInjection(assignee, "removeAssignees");
73
130
  }
74
131
  }
75
- const args = ["pr", "edit", String(number)];
132
+ if (addProjects) {
133
+ for (const project of addProjects) {
134
+ assertNoFlagInjection(project, "addProjects");
135
+ }
136
+ }
137
+ if (removeProjects) {
138
+ for (const project of removeProjects) {
139
+ assertNoFlagInjection(project, "removeProjects");
140
+ }
141
+ }
142
+ if (addReviewers) {
143
+ for (const reviewer of addReviewers) {
144
+ assertNoFlagInjection(reviewer, "addReviewers");
145
+ }
146
+ }
147
+ if (removeReviewers) {
148
+ for (const reviewer of removeReviewers) {
149
+ assertNoFlagInjection(reviewer, "removeReviewers");
150
+ }
151
+ }
152
+ const selector = String(number);
153
+ const prNum = typeof number === "number" ? number : 0;
154
+ const updatedFields = [
155
+ title ? "title" : undefined,
156
+ body ? "body" : undefined,
157
+ addLabels && addLabels.length > 0 ? "labels" : undefined,
158
+ removeLabels && removeLabels.length > 0 ? "labels" : undefined,
159
+ addAssignees && addAssignees.length > 0 ? "assignees" : undefined,
160
+ removeAssignees && removeAssignees.length > 0 ? "assignees" : undefined,
161
+ addProjects && addProjects.length > 0 ? "projects" : undefined,
162
+ removeProjects && removeProjects.length > 0 ? "projects" : undefined,
163
+ addReviewers && addReviewers.length > 0 ? "reviewers" : undefined,
164
+ removeReviewers && removeReviewers.length > 0 ? "reviewers" : undefined,
165
+ base ? "base" : undefined,
166
+ milestone ? "milestone" : undefined,
167
+ removeMilestone ? "milestone" : undefined,
168
+ ].filter(Boolean);
169
+ const operations = [
170
+ addLabels && addLabels.length > 0 ? "add-label" : undefined,
171
+ removeLabels && removeLabels.length > 0 ? "remove-label" : undefined,
172
+ addAssignees && addAssignees.length > 0 ? "add-assignee" : undefined,
173
+ removeAssignees && removeAssignees.length > 0 ? "remove-assignee" : undefined,
174
+ addProjects && addProjects.length > 0 ? "add-project" : undefined,
175
+ removeProjects && removeProjects.length > 0 ? "remove-project" : undefined,
176
+ addReviewers && addReviewers.length > 0 ? "add-reviewer" : undefined,
177
+ removeReviewers && removeReviewers.length > 0 ? "remove-reviewer" : undefined,
178
+ base ? "set-base" : undefined,
179
+ milestone ? "set-milestone" : undefined,
180
+ removeMilestone ? "remove-milestone" : undefined,
181
+ ].filter(Boolean);
182
+ const args = ["pr", "edit", selector];
76
183
  if (title)
77
184
  args.push("--title", title);
78
185
  if (addLabels && addLabels.length > 0) {
@@ -95,14 +202,54 @@ export function registerPrUpdateTool(server) {
95
202
  args.push("--remove-assignee", assignee);
96
203
  }
97
204
  }
205
+ if (addProjects && addProjects.length > 0) {
206
+ for (const project of addProjects) {
207
+ args.push("--add-project", project);
208
+ }
209
+ }
210
+ if (removeProjects && removeProjects.length > 0) {
211
+ for (const project of removeProjects) {
212
+ args.push("--remove-project", project);
213
+ }
214
+ }
215
+ // S-gap P0: Map reviewers
216
+ if (addReviewers && addReviewers.length > 0) {
217
+ for (const reviewer of addReviewers) {
218
+ args.push("--add-reviewer", reviewer);
219
+ }
220
+ }
221
+ if (removeReviewers && removeReviewers.length > 0) {
222
+ for (const reviewer of removeReviewers) {
223
+ args.push("--remove-reviewer", reviewer);
224
+ }
225
+ }
226
+ // S-gap P0: Map base branch
227
+ if (base)
228
+ args.push("--base", base);
229
+ // S-gap P1: Map milestone
230
+ if (milestone)
231
+ args.push("--milestone", milestone);
232
+ if (removeMilestone)
233
+ args.push("--remove-milestone");
234
+ // S-gap P1: Map repo
235
+ if (repo)
236
+ args.push("--repo", repo);
98
237
  if (body) {
99
238
  args.push("--body-file", "-");
100
239
  }
101
240
  const result = await ghCmd(args, body ? { cwd, stdin: body } : { cwd });
102
241
  if (result.exitCode !== 0) {
103
- throw new Error(`gh pr edit failed: ${result.stderr}`);
242
+ const combined = `${result.stdout}\n${result.stderr}`.trim();
243
+ return dualOutput({
244
+ number: prNum,
245
+ url: "",
246
+ updatedFields,
247
+ operations,
248
+ errorType: classifyPrUpdateError(combined),
249
+ errorMessage: combined || "gh pr edit failed",
250
+ }, formatPrUpdate);
104
251
  }
105
- const data = parsePrUpdate(result.stdout, number);
252
+ const data = parsePrUpdate(result.stdout, prNum, updatedFields, operations);
106
253
  return dualOutput(data, formatPrUpdate);
107
254
  });
108
255
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pr-update.js","sourceRoot":"","sources":["../../src/tools/pr-update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pr-update.js","sourceRoot":"","sources":["../../src/tools/pr-update.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"pr-view.d.ts","sourceRoot":"","sources":["../../src/tools/pr-view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUzE,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QA6CnD"}
1
+ {"version":3,"file":"pr-view.d.ts","sourceRoot":"","sources":["../../src/tools/pr-view.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAYzE,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QAoDnD"}
@@ -1,32 +1,45 @@
1
1
  import { z } from "zod";
2
- import { compactDualOutput, INPUT_LIMITS } from "@paretools/shared";
2
+ import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
3
  import { ghCmd } from "../lib/gh-runner.js";
4
4
  import { parsePrView } from "../lib/parsers.js";
5
5
  import { formatPrView, compactPrViewMap, formatPrViewCompact } from "../lib/formatters.js";
6
6
  import { PrViewResultSchema } from "../schemas/index.js";
7
- const PR_VIEW_FIELDS = "number,state,title,body,mergeable,reviewDecision,statusCheckRollup,url,headRefName,baseRefName,additions,deletions,changedFiles";
7
+ // S-gap: Add author, labels, isDraft, assignees, createdAt, updatedAt, milestone, projectItems
8
+ // P1-gap #147: Added reviews to field list
9
+ const PR_VIEW_FIELDS = "number,state,title,body,mergeable,reviewDecision,statusCheckRollup,url,headRefName,baseRefName,additions,deletions,changedFiles,author,labels,isDraft,assignees,createdAt,updatedAt,milestone,projectItems,reviews,commits";
8
10
  /** Registers the `pr-view` tool on the given MCP server. */
9
11
  export function registerPrViewTool(server) {
10
12
  server.registerTool("pr-view", {
11
13
  title: "PR View",
12
- description: "Views a pull request by number. Returns structured data with state, checks, review decision, and diff stats. Use instead of running `gh pr view` in the terminal.",
14
+ description: "Views a pull request by number, URL, or branch. Returns structured data with state, checks, review decision, diff stats, author, labels, draft status, assignees, milestone, and timestamps.",
13
15
  inputSchema: {
14
- number: z.number().describe("Pull request number"),
15
- path: z
16
+ number: z
16
17
  .string()
17
- .max(INPUT_LIMITS.PATH_MAX)
18
- .optional()
19
- .describe("Repository path (default: cwd)"),
20
- compact: z
21
- .boolean()
18
+ .max(INPUT_LIMITS.STRING_MAX)
19
+ .describe("Pull request number, URL, or branch name"),
20
+ comments: z.boolean().optional().describe("Include PR comments in output (-c/--comments)"),
21
+ // S-gap P1: Add repo for cross-repo inspection
22
+ repo: z
23
+ .string()
24
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
22
25
  .optional()
23
- .default(true)
24
- .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
26
+ .describe("Repository in OWNER/REPO format (--repo). Default: current repo."),
27
+ path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Repository path"),
28
+ compact: z.boolean().optional().default(true).describe("Prefer compact output"),
25
29
  },
26
30
  outputSchema: PrViewResultSchema,
27
- }, async ({ number, path, compact }) => {
31
+ }, async ({ number, comments, repo, path, compact }) => {
28
32
  const cwd = path || process.cwd();
29
- const args = ["pr", "view", String(number), "--json", PR_VIEW_FIELDS];
33
+ if (repo)
34
+ assertNoFlagInjection(repo, "repo");
35
+ if (typeof number === "string")
36
+ assertNoFlagInjection(number, "number");
37
+ const selector = String(number);
38
+ const args = ["pr", "view", selector, "--json", PR_VIEW_FIELDS];
39
+ if (comments)
40
+ args.push("--comments");
41
+ if (repo)
42
+ args.push("--repo", repo);
30
43
  const result = await ghCmd(args, cwd);
31
44
  if (result.exitCode !== 0) {
32
45
  throw new Error(`gh pr view failed: ${result.stderr}`);
@@ -1 +1 @@
1
- {"version":3,"file":"pr-view.js","sourceRoot":"","sources":["../../src/tools/pr-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,cAAc,GAClB,iIAAiI,CAAC;AAEpI,4DAA4D;AAC5D,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;QACE,KAAK,EAAE,SAAS;QAChB,WAAW,EACT,mKAAmK;QACrK,WAAW,EAAE;YACX,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qBAAqB,CAAC;YAClD,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,gCAAgC,CAAC;YAC7C,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,kBAAkB;KACjC,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAClC,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAElC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEtC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"pr-view.js","sourceRoot":"","sources":["../../src/tools/pr-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,+FAA+F;AAC/F,2CAA2C;AAC3C,MAAM,cAAc,GAClB,4NAA4N,CAAC;AAE/N,4DAA4D;AAC5D,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,SAAS,EACT;QACE,KAAK,EAAE,SAAS;QAChB,WAAW,EACT,8LAA8L;QAChM,WAAW,EAAE;YACX,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC;iBAC5B,QAAQ,CAAC,0CAA0C,CAAC;YACvD,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+CAA+C,CAAC;YAC1F,+CAA+C;YAC/C,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,EAAE;iBACV,QAAQ,CAAC,kEAAkE,CAAC;YAC/E,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAClF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SAChF;QACD,YAAY,EAAE,kBAAkB;KACjC,EACD,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAClD,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAElC,IAAI,IAAI;YAAE,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAExE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAEhC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAChE,IAAI,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAEtC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,sBAAsB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACzD,CAAC;QAED,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"release-create.d.ts","sourceRoot":"","sources":["../../src/tools/release-create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,mEAAmE;AACnE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QA6D1D"}
1
+ {"version":3,"file":"release-create.d.ts","sourceRoot":"","sources":["../../src/tools/release-create.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAiBzE,mEAAmE;AACnE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,QAuK1D"}
@@ -4,11 +4,21 @@ import { ghCmd } from "../lib/gh-runner.js";
4
4
  import { parseReleaseCreate } from "../lib/parsers.js";
5
5
  import { formatReleaseCreate } from "../lib/formatters.js";
6
6
  import { ReleaseCreateResultSchema } from "../schemas/index.js";
7
+ function classifyReleaseCreateError(text) {
8
+ const lower = text.toLowerCase();
9
+ if (/already exists|tag .* exists|reference already exists/.test(lower))
10
+ return "tag-conflict";
11
+ if (/forbidden|permission|403/.test(lower))
12
+ return "permission-denied";
13
+ if (/no commits|no new commits/.test(lower))
14
+ return "no-new-commits";
15
+ return "unknown";
16
+ }
7
17
  /** Registers the `release-create` tool on the given MCP server. */
8
18
  export function registerReleaseCreateTool(server) {
9
19
  server.registerTool("release-create", {
10
20
  title: "Release Create",
11
- description: "Creates a new GitHub release. Returns structured data with tag, URL, draft, and prerelease status. Use instead of running `gh release create` in the terminal.",
21
+ description: "Creates a new GitHub release with optional asset uploads. Returns structured data with tag, URL, draft, prerelease status, and assets uploaded count.",
12
22
  inputSchema: {
13
23
  tag: z.string().max(INPUT_LIMITS.SHORT_STRING_MAX).describe("Tag name for the release"),
14
24
  title: z
@@ -29,14 +39,54 @@ export function registerReleaseCreateTool(server) {
29
39
  .max(INPUT_LIMITS.SHORT_STRING_MAX)
30
40
  .optional()
31
41
  .describe("Repository in owner/repo format (default: current repo)"),
32
- path: z
42
+ generateNotes: z
43
+ .boolean()
44
+ .optional()
45
+ .describe("Auto-generate release notes (--generate-notes)"),
46
+ verifyTag: z
47
+ .boolean()
48
+ .optional()
49
+ .describe("Verify the tag exists before creating release (--verify-tag)"),
50
+ notesFromTag: z
51
+ .boolean()
52
+ .optional()
53
+ .describe("Use the annotated tag message as release notes (--notes-from-tag)"),
54
+ latest: z
55
+ .boolean()
56
+ .optional()
57
+ .describe('Control the "Latest" badge on the release (--latest/--latest=false)'),
58
+ failOnNoCommits: z
59
+ .boolean()
60
+ .optional()
61
+ .describe("Fail if no commits since last release (--fail-on-no-commits)"),
62
+ // S-gap P0: Add assets for release asset uploads
63
+ assets: z
64
+ .array(z.string().max(INPUT_LIMITS.PATH_MAX))
65
+ .max(INPUT_LIMITS.ARRAY_MAX)
66
+ .optional()
67
+ .describe("File paths to upload as release assets (positional args after tag)"),
68
+ // S-gap P1: Add notesFile for reading notes from file
69
+ notesFile: z
33
70
  .string()
34
71
  .max(INPUT_LIMITS.PATH_MAX)
35
72
  .optional()
36
- .describe("Repository path (default: cwd)"),
73
+ .describe("Read release notes from file (--notes-file). Mutually exclusive with notes."),
74
+ // S-gap P1: Add notesStartTag
75
+ notesStartTag: z
76
+ .string()
77
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
78
+ .optional()
79
+ .describe("Scope auto-generated notes to commits since this tag (--notes-start-tag)"),
80
+ // S-gap P2: Add discussionCategory
81
+ discussionCategory: z
82
+ .string()
83
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
84
+ .optional()
85
+ .describe("Start a release discussion in this category (--discussion-category)"),
86
+ path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Repository path"),
37
87
  },
38
88
  outputSchema: ReleaseCreateResultSchema,
39
- }, async ({ tag, title, notes, draft, prerelease, target, repo, path }) => {
89
+ }, async ({ tag, title, notes, draft, prerelease, target, repo, generateNotes, verifyTag, notesFromTag, latest, failOnNoCommits, assets, notesFile, notesStartTag, discussionCategory, path, }) => {
40
90
  const cwd = path || process.cwd();
41
91
  assertNoFlagInjection(tag, "tag");
42
92
  if (title)
@@ -45,11 +95,27 @@ export function registerReleaseCreateTool(server) {
45
95
  assertNoFlagInjection(target, "target");
46
96
  if (repo)
47
97
  assertNoFlagInjection(repo, "repo");
98
+ if (notesFile)
99
+ assertNoFlagInjection(notesFile, "notesFile");
100
+ if (notesStartTag)
101
+ assertNoFlagInjection(notesStartTag, "notesStartTag");
102
+ if (discussionCategory)
103
+ assertNoFlagInjection(discussionCategory, "discussionCategory");
104
+ if (assets) {
105
+ for (const asset of assets) {
106
+ assertNoFlagInjection(asset, "assets");
107
+ }
108
+ }
48
109
  const args = ["release", "create", tag];
49
110
  if (title)
50
111
  args.push("--title", title);
51
- if (notes !== undefined)
52
- args.push("--notes", notes);
112
+ // Pass notes via stdin (--notes-file -) to avoid shell escaping issues
113
+ // with backticks, pipes, parentheses, and other special characters
114
+ let stdin;
115
+ if (notes !== undefined && !notesFile) {
116
+ args.push("--notes-file", "-");
117
+ stdin = notes;
118
+ }
53
119
  if (draft)
54
120
  args.push("--draft");
55
121
  if (prerelease)
@@ -58,11 +124,42 @@ export function registerReleaseCreateTool(server) {
58
124
  args.push("--target", target);
59
125
  if (repo)
60
126
  args.push("--repo", repo);
61
- const result = await ghCmd(args, cwd);
127
+ if (generateNotes)
128
+ args.push("--generate-notes");
129
+ if (verifyTag)
130
+ args.push("--verify-tag");
131
+ if (notesFromTag)
132
+ args.push("--notes-from-tag");
133
+ if (latest !== undefined)
134
+ args.push(`--latest=${String(latest)}`);
135
+ if (failOnNoCommits)
136
+ args.push("--fail-on-no-commits");
137
+ if (notesFile)
138
+ args.push("--notes-file", notesFile);
139
+ if (notesStartTag)
140
+ args.push("--notes-start-tag", notesStartTag);
141
+ if (discussionCategory)
142
+ args.push("--discussion-category", discussionCategory);
143
+ // S-gap P0: Assets are positional args after the tag
144
+ if (assets && assets.length > 0) {
145
+ args.push(...assets);
146
+ }
147
+ const result = await ghCmd(args, stdin ? { cwd, stdin } : { cwd });
62
148
  if (result.exitCode !== 0) {
63
- throw new Error(`gh release create failed: ${result.stderr}`);
149
+ const combined = `${result.stdout}\n${result.stderr}`.trim();
150
+ return dualOutput({
151
+ tag,
152
+ url: "",
153
+ draft: !!draft,
154
+ prerelease: !!prerelease,
155
+ title: title ?? undefined,
156
+ assetsUploaded: assets?.length ?? undefined,
157
+ errorType: classifyReleaseCreateError(combined),
158
+ errorMessage: combined || "gh release create failed",
159
+ }, formatReleaseCreate);
64
160
  }
65
- const data = parseReleaseCreate(result.stdout, tag, !!draft, !!prerelease);
161
+ // S-gap: Pass title and assets count for echo in output
162
+ const data = parseReleaseCreate(result.stdout, tag, !!draft, !!prerelease, title, assets?.length);
66
163
  return dualOutput(data, formatReleaseCreate);
67
164
  });
68
165
  }
@@ -1 +1 @@
1
- {"version":3,"file":"release-create.js","sourceRoot":"","sources":["../../src/tools/release-create.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"release-create.js","sourceRoot":"","sources":["../../src/tools/release-create.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"release-list.d.ts","sourceRoot":"","sources":["../../src/tools/release-list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAazE,iEAAiE;AACjE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QA0DxD"}
1
+ {"version":3,"file":"release-list.d.ts","sourceRoot":"","sources":["../../src/tools/release-list.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAczE,iEAAiE;AACjE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,QA2ExD"}
@@ -4,47 +4,73 @@ import { ghCmd } from "../lib/gh-runner.js";
4
4
  import { parseReleaseList } from "../lib/parsers.js";
5
5
  import { formatReleaseList, compactReleaseListMap, formatReleaseListCompact, } from "../lib/formatters.js";
6
6
  import { ReleaseListResultSchema } from "../schemas/index.js";
7
- const RELEASE_LIST_FIELDS = "tagName,name,isDraft,isPrerelease,publishedAt,url";
7
+ // S-gap: Add isLatest and createdAt to JSON fields
8
+ const RELEASE_LIST_FIELDS = "tagName,name,isDraft,isPrerelease,publishedAt,url,isLatest,createdAt";
8
9
  /** Registers the `release-list` tool on the given MCP server. */
9
10
  export function registerReleaseListTool(server) {
10
11
  server.registerTool("release-list", {
11
12
  title: "Release List",
12
- description: "Lists GitHub releases for a repository. Returns structured list with tag, name, draft/prerelease status, publish date, and URL. Use instead of running `gh release list` in the terminal.",
13
+ description: "Lists GitHub releases for a repository. Returns structured list with tag, name, draft/prerelease/latest status, publish date, creation date, and URL.",
13
14
  inputSchema: {
15
+ // S-gap P1: Align default limit to CLI default (30)
14
16
  limit: z
15
17
  .number()
16
18
  .optional()
17
- .default(10)
18
- .describe("Maximum number of releases to return (default: 10)"),
19
+ .default(30)
20
+ .describe("Maximum number of releases to return (default: 30)"),
19
21
  repo: z
20
22
  .string()
21
23
  .max(INPUT_LIMITS.SHORT_STRING_MAX)
22
24
  .optional()
23
25
  .describe("Repository in owner/repo format (default: current repo)"),
24
- path: z
25
- .string()
26
- .max(INPUT_LIMITS.PATH_MAX)
26
+ excludeDrafts: z
27
+ .boolean()
27
28
  .optional()
28
- .describe("Repository path (default: cwd)"),
29
- compact: z
29
+ .describe("Exclude draft releases from the list (--exclude-drafts)"),
30
+ excludePreReleases: z
30
31
  .boolean()
31
32
  .optional()
32
- .default(true)
33
- .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
33
+ .describe("Exclude pre-releases from the list (--exclude-pre-releases)"),
34
+ // S-gap P1: Add order param
35
+ order: z.enum(["asc", "desc"]).optional().describe("Sort order (--order). Default: desc."),
36
+ path: z.string().max(INPUT_LIMITS.PATH_MAX).optional().describe("Repository path"),
37
+ compact: z.boolean().optional().default(true).describe("Prefer compact output"),
34
38
  },
35
39
  outputSchema: ReleaseListResultSchema,
36
- }, async ({ limit, repo, path, compact }) => {
40
+ }, async ({ limit, repo, excludeDrafts, excludePreReleases, order, path, compact }) => {
37
41
  const cwd = path || process.cwd();
38
42
  if (repo)
39
43
  assertNoFlagInjection(repo, "repo");
40
44
  const args = ["release", "list", "--json", RELEASE_LIST_FIELDS, "--limit", String(limit)];
41
45
  if (repo)
42
46
  args.push("--repo", repo);
47
+ if (excludeDrafts)
48
+ args.push("--exclude-drafts");
49
+ if (excludePreReleases)
50
+ args.push("--exclude-pre-releases");
51
+ if (order)
52
+ args.push("--order", order);
43
53
  const result = await ghCmd(args, cwd);
44
54
  if (result.exitCode !== 0) {
45
55
  throw new Error(`gh release list failed: ${result.stderr}`);
46
56
  }
47
- const data = parseReleaseList(result.stdout);
57
+ let totalAvailable;
58
+ if (limit < 1000) {
59
+ const countArgs = ["release", "list", "--json", RELEASE_LIST_FIELDS, "--limit", "1000"];
60
+ if (repo)
61
+ countArgs.push("--repo", repo);
62
+ if (excludeDrafts)
63
+ countArgs.push("--exclude-drafts");
64
+ if (excludePreReleases)
65
+ countArgs.push("--exclude-pre-releases");
66
+ if (order)
67
+ countArgs.push("--order", order);
68
+ const countResult = await ghCmd(countArgs, cwd);
69
+ if (countResult.exitCode === 0) {
70
+ totalAvailable = parseReleaseList(countResult.stdout).total;
71
+ }
72
+ }
73
+ const data = parseReleaseList(result.stdout, totalAvailable);
48
74
  return compactDualOutput(data, result.stdout, formatReleaseList, compactReleaseListMap, formatReleaseListCompact, compact === false);
49
75
  });
50
76
  }