@renaiss-shipflow/cli 0.2.1 โ 0.6.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.
- package/dist/client.d.ts +41 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +57 -8
- package/dist/client.js.map +1 -1
- package/dist/commands/claims.js +2 -2
- package/dist/commands/claims.js.map +1 -1
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +86 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/features.d.ts +3 -0
- package/dist/commands/features.d.ts.map +1 -0
- package/dist/commands/features.js +50 -0
- package/dist/commands/features.js.map +1 -0
- package/dist/commands/inbox.d.ts +4 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +72 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/init.js +2 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/issue.d.ts.map +1 -1
- package/dist/commands/issue.js +140 -32
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/issues.js +2 -2
- package/dist/commands/issues.js.map +1 -1
- package/dist/commands/pr.d.ts +4 -0
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +234 -12
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/regression.js +2 -2
- package/dist/commands/regression.js.map +1 -1
- package/dist/commands/release.js +2 -2
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/status.js +2 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/config.d.ts +49 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +99 -0
- package/dist/config.js.map +1 -1
- package/dist/gh.d.ts +70 -1
- package/dist/gh.d.ts.map +1 -1
- package/dist/gh.js +88 -4
- package/dist/gh.js.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/issue-order.d.ts +8 -0
- package/dist/issue-order.d.ts.map +1 -0
- package/dist/issue-order.js +33 -0
- package/dist/issue-order.js.map +1 -0
- package/dist/pr-state.d.ts +57 -0
- package/dist/pr-state.d.ts.map +1 -0
- package/dist/pr-state.js +140 -0
- package/dist/pr-state.js.map +1 -0
- package/package.json +1 -1
- package/dist/__tests__/gh.test.d.ts +0 -2
- package/dist/__tests__/gh.test.d.ts.map +0 -1
- package/dist/__tests__/gh.test.js +0 -46
- package/dist/__tests__/gh.test.js.map +0 -1
- package/dist/__tests__/login.test.d.ts +0 -2
- package/dist/__tests__/login.test.d.ts.map +0 -1
- package/dist/__tests__/login.test.js +0 -25
- package/dist/__tests__/login.test.js.map +0 -1
- package/dist/__tests__/project.test.d.ts +0 -2
- package/dist/__tests__/project.test.d.ts.map +0 -1
- package/dist/__tests__/project.test.js +0 -17
- package/dist/__tests__/project.test.js.map +0 -1
package/dist/commands/issue.js
CHANGED
|
@@ -2,10 +2,13 @@ import { hostname } from "node:os";
|
|
|
2
2
|
import { readFileSync } from "node:fs";
|
|
3
3
|
import { basename } from "node:path";
|
|
4
4
|
import { ShipFlowClient, ClaimConflictError } from "../client.js";
|
|
5
|
-
import { resolveApiUrl, resolveAuthToken, loadCredentials } from "../config.js";
|
|
5
|
+
import { resolveApiUrl, resolveAuthToken, loadCredentials, refreshOpts } from "../config.js";
|
|
6
6
|
import { resolveProject } from "../project.js";
|
|
7
|
-
import { ghIssueView, ghIssueCreate } from "../gh.js";
|
|
7
|
+
import { ghIssueView, ghIssueCreate, ghIssueList, ghEnsureLabel, ghIssueAddLabels, ghIssueRemoveLabel, ghIssueComment } from "../gh.js";
|
|
8
|
+
import { sortIssuesForPickup } from "../issue-order.js";
|
|
8
9
|
import { promptText } from "../prompts.js";
|
|
10
|
+
const IN_PROGRESS_LABEL = "๐ค in-progress";
|
|
11
|
+
const NEEDS_HUMAN_LABEL = "needs-human";
|
|
9
12
|
export function registerIssueCommand(program) {
|
|
10
13
|
const issue = program.command("issue").description("Issue actions");
|
|
11
14
|
issue
|
|
@@ -14,14 +17,23 @@ export function registerIssueCommand(program) {
|
|
|
14
17
|
.option("--repo <fullname>", "Override target repo")
|
|
15
18
|
.option("--title <title>", "Issue title")
|
|
16
19
|
.option("--body <body>", "Issue body (- for stdin)")
|
|
20
|
+
.option("--label <name...>", "Label(s) to apply (created if missing) โ e.g. bug auto-qa")
|
|
21
|
+
.option("--json", "Output JSON")
|
|
17
22
|
.action(async (opts) => {
|
|
18
23
|
const ctx = await loadCtx(program);
|
|
19
24
|
const repo = opts.repo ?? ctx.project.repoFullName;
|
|
20
25
|
const title = opts.title ?? await promptText("Title: ");
|
|
21
26
|
const body = opts.body === "-" ? await readStdin() : (opts.body ?? "");
|
|
22
|
-
const
|
|
27
|
+
const labels = opts.label ?? [];
|
|
28
|
+
for (const l of labels)
|
|
29
|
+
ghEnsureLabel(repo, l); // so --label can't fail on a missing label
|
|
30
|
+
const created = ghIssueCreate(repo, title, body, labels);
|
|
23
31
|
// Note: creating an issue does NOT claim it โ claims are exclusive
|
|
24
32
|
// work locks now; run `issue work <n>` to pick it up.
|
|
33
|
+
if (opts.json) {
|
|
34
|
+
console.log(JSON.stringify({ number: created.number, url: created.url, labels }));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
25
37
|
console.log(created.url);
|
|
26
38
|
});
|
|
27
39
|
issue
|
|
@@ -52,30 +64,62 @@ export function registerIssueCommand(program) {
|
|
|
52
64
|
}
|
|
53
65
|
const issueData = ghIssueView(repo, number);
|
|
54
66
|
const triage = await ctx.client.getTriage(ctx.creds.org, ctx.project.projectId, repo, number).catch(() => null);
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
67
|
+
printIssueContext(issueData, triage, repo, ctx.project, opts.json);
|
|
68
|
+
});
|
|
69
|
+
issue
|
|
70
|
+
.command("next")
|
|
71
|
+
.description("Pick & claim the next open, unclaimed issue (for the work loop); exits 4 when none remain")
|
|
72
|
+
.option("--repo <fullname>", "Override target repo")
|
|
73
|
+
.option("--label <label>", "Only consider issues with this label")
|
|
74
|
+
.option("--assignee <login>", "Only consider issues assigned to this user")
|
|
75
|
+
.option("--agent <name>", "Agent label recorded on the claim (default: $SHIPFLOW_AGENT or hostname)")
|
|
76
|
+
.option("--ttl <minutes>", "Claim lifetime in minutes (default 120)")
|
|
77
|
+
.option("--json", "Output JSON")
|
|
78
|
+
.action(async (opts) => {
|
|
79
|
+
const ctx = await loadCtx(program);
|
|
80
|
+
const repo = opts.repo ?? ctx.project.repoFullName;
|
|
81
|
+
const agent = opts.agent ?? process.env.SHIPFLOW_AGENT ?? hostname();
|
|
82
|
+
const open = ghIssueList(repo, "open", 50);
|
|
83
|
+
const claims = await ctx.client.listClaims(ctx.creds.org, ctx.project.projectId).catch(() => []);
|
|
84
|
+
const claimed = new Set(claims.filter((c) => c.repo === repo).map((c) => c.issueNumber));
|
|
85
|
+
const matching = open.filter((i) => {
|
|
86
|
+
if (claimed.has(i.number))
|
|
87
|
+
return false;
|
|
88
|
+
if (opts.label && !i.labels.some((l) => l.name === opts.label))
|
|
89
|
+
return false;
|
|
90
|
+
if (opts.assignee && !i.assignees.some((a) => a.login === opts.assignee))
|
|
91
|
+
return false;
|
|
92
|
+
return true;
|
|
93
|
+
});
|
|
94
|
+
// Work the most important issues first: highest priority, then highest
|
|
95
|
+
// severity, then the newest when those tie.
|
|
96
|
+
const candidates = sortIssuesForPickup(matching);
|
|
97
|
+
// Claim the first candidate that's still free โ handles the race where
|
|
98
|
+
// another agent grabbed one between our list and our claim.
|
|
99
|
+
for (const cand of candidates) {
|
|
100
|
+
try {
|
|
101
|
+
await ctx.client.claimIssue(ctx.creds.org, ctx.project.projectId, cand.number, {
|
|
102
|
+
repo, agent, ttlMinutes: opts.ttl ? parseInt(opts.ttl, 10) : undefined,
|
|
103
|
+
});
|
|
73
104
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
105
|
+
catch (e) {
|
|
106
|
+
if (e instanceof ClaimConflictError)
|
|
107
|
+
continue; // taken meanwhile โ try next
|
|
108
|
+
console.warn(`Claim failed for #${cand.number} (skipping): ${e.message}`);
|
|
109
|
+
continue;
|
|
77
110
|
}
|
|
111
|
+
const issueData = ghIssueView(repo, cand.number);
|
|
112
|
+
const triage = await ctx.client.getTriage(ctx.creds.org, ctx.project.projectId, repo, cand.number).catch(() => null);
|
|
113
|
+
printIssueContext(issueData, triage, repo, ctx.project, opts.json);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (opts.json) {
|
|
117
|
+
console.log(JSON.stringify({ issue: null, reason: "no_actionable_issues" }, null, 2));
|
|
78
118
|
}
|
|
119
|
+
else {
|
|
120
|
+
console.log("โ
No actionable issues โ every open issue is claimed or filtered out.");
|
|
121
|
+
}
|
|
122
|
+
process.exit(4);
|
|
79
123
|
});
|
|
80
124
|
issue
|
|
81
125
|
.command("done <number>")
|
|
@@ -89,24 +133,60 @@ export function registerIssueCommand(program) {
|
|
|
89
133
|
await ctx.client.signal(ctx.creds.org, ctx.project.projectId, "issues", number, "release-claim", { repo, reason: opts.reason ?? "" });
|
|
90
134
|
console.log(`Released #${number}.`);
|
|
91
135
|
});
|
|
136
|
+
issue
|
|
137
|
+
.command("escalate <number>")
|
|
138
|
+
.description("Hand an issue to a human: label needs-human + comment why. Keeps the work lock so the loop skips it this run.")
|
|
139
|
+
.option("--reason <reason>", "Why it's blocked / what a human must decide", "")
|
|
140
|
+
.option("--repo <fullname>", "Override target repo")
|
|
141
|
+
.option("--keep-in-progress", "Keep the ๐ค in-progress label (default: swap it for needs-human)")
|
|
142
|
+
.option("--release", "Also release the ShipFlow claim (default: keep it so the loop won't re-pick it this run)")
|
|
143
|
+
.option("--json", "Output JSON")
|
|
144
|
+
.action(async (numberStr, opts) => {
|
|
145
|
+
const ctx = await loadCtx(program);
|
|
146
|
+
const number = parseInt(numberStr, 10);
|
|
147
|
+
const repo = opts.repo ?? ctx.project.repoFullName;
|
|
148
|
+
const reason = (opts.reason ?? "").trim();
|
|
149
|
+
ghEnsureLabel(repo, NEEDS_HUMAN_LABEL, "d93f0b", "ShipFlow loop needs a human to decide");
|
|
150
|
+
ghIssueAddLabels(repo, number, [NEEDS_HUMAN_LABEL]);
|
|
151
|
+
if (!opts.keepInProgress)
|
|
152
|
+
ghIssueRemoveLabel(repo, number, IN_PROGRESS_LABEL);
|
|
153
|
+
ghIssueComment(repo, number, `๐ง **Needs a human** โ the ShipFlow loop escalated this.\n\n${reason || "_No reason given._"}`);
|
|
154
|
+
let released = false;
|
|
155
|
+
if (opts.release) {
|
|
156
|
+
try {
|
|
157
|
+
await ctx.client.signal(ctx.creds.org, ctx.project.projectId, "issues", number, "release-claim", { repo, reason: `escalated: ${reason}` });
|
|
158
|
+
released = true;
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
console.warn(`Escalated, but the release signal failed: ${e.message}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (opts.json) {
|
|
165
|
+
console.log(JSON.stringify({ number, escalated: true, label: NEEDS_HUMAN_LABEL, released, reason }));
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
console.log(`๐ง #${number} escalated โ labelled "${NEEDS_HUMAN_LABEL}"${released ? " and claim released" : " (claim kept โ loop skips it this run)"}.`);
|
|
169
|
+
});
|
|
92
170
|
issue
|
|
93
171
|
.command("evidence <number>")
|
|
94
|
-
.description("Attach testing screenshots
|
|
95
|
-
.option("--image <path...>", "Screenshot file(s)
|
|
96
|
-
.option("--
|
|
172
|
+
.description("Attach testing screenshots/video (reporter thread + a comment on the PR, or the issue if no --pr)")
|
|
173
|
+
.option("--image <path...>", "Screenshot file(s)")
|
|
174
|
+
.option("--file <path...>", "Any media file(s) โ screenshots or video (mp4/mov/webm)")
|
|
175
|
+
.option("--pr <n>", "Related PR number โ when set, the evidence comment lands on the PR instead of the issue")
|
|
97
176
|
.option("--preview-url <url>", "Testing site URL")
|
|
98
|
-
.option("--caption <text>", "Short note shown with the
|
|
177
|
+
.option("--caption <text>", "Short note shown with the evidence")
|
|
99
178
|
.option("--repo <fullname>", "Override target repo")
|
|
100
179
|
.option("--json", "Output JSON")
|
|
101
180
|
.action(async (numberStr, opts) => {
|
|
102
|
-
|
|
103
|
-
|
|
181
|
+
const paths = [...(opts.file ?? []), ...(opts.image ?? [])];
|
|
182
|
+
if (!paths.length) {
|
|
183
|
+
console.error("At least one --file (or --image) is required.");
|
|
104
184
|
process.exit(1);
|
|
105
185
|
}
|
|
106
186
|
const ctx = await loadCtx(program);
|
|
107
187
|
const number = parseInt(numberStr, 10);
|
|
108
188
|
const repo = opts.repo ?? ctx.project.repoFullName;
|
|
109
|
-
const images =
|
|
189
|
+
const images = paths.slice(0, 4).map((p) => ({
|
|
110
190
|
filename: basename(p),
|
|
111
191
|
data: new Uint8Array(readFileSync(p)),
|
|
112
192
|
}));
|
|
@@ -124,6 +204,8 @@ export function registerIssueCommand(program) {
|
|
|
124
204
|
const where = [];
|
|
125
205
|
if (res.threadNotified)
|
|
126
206
|
where.push("reporter thread");
|
|
207
|
+
if (res.prCommented)
|
|
208
|
+
where.push("PR comment");
|
|
127
209
|
if (res.githubCommented)
|
|
128
210
|
where.push("GitHub issue comment");
|
|
129
211
|
console.log(`๐งช Evidence delivered to: ${where.join(" + ") || "nowhere (check server logs)"}`);
|
|
@@ -131,6 +213,32 @@ export function registerIssueCommand(program) {
|
|
|
131
213
|
console.log(` ${u}`);
|
|
132
214
|
});
|
|
133
215
|
}
|
|
216
|
+
function printIssueContext(issueData, triage, repo, project, json) {
|
|
217
|
+
if (json) {
|
|
218
|
+
console.log(JSON.stringify({ issue: issueData, triage, project }, null, 2));
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
console.log(`Issue #${issueData.number} โ "${issueData.title}"`);
|
|
222
|
+
console.log(`Repo: ${repo}`);
|
|
223
|
+
console.log(`State: ${issueData.state} โข Labels: ${issueData.labels.map((l) => l.name).join(", ") || "(none)"}`);
|
|
224
|
+
console.log("");
|
|
225
|
+
console.log(issueData.body || "(no body)");
|
|
226
|
+
if (triage) {
|
|
227
|
+
console.log("\nโโ ShipFlow context โโ");
|
|
228
|
+
if (triage.priority)
|
|
229
|
+
console.log(`Priority: ${triage.priority}`);
|
|
230
|
+
if (triage.relatedFeatures?.length)
|
|
231
|
+
console.log(`Features touched: ${triage.relatedFeatures.join(", ")}`);
|
|
232
|
+
if (triage.relatedFiles?.length) {
|
|
233
|
+
console.log("Files likely involved:");
|
|
234
|
+
triage.relatedFiles.slice(0, 10).forEach((f) => console.log(` ${f}`));
|
|
235
|
+
}
|
|
236
|
+
if (triage.relatedCommits?.length) {
|
|
237
|
+
console.log("Recent commits in same area:");
|
|
238
|
+
triage.relatedCommits.slice(0, 5).forEach((c) => console.log(` ${c}`));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
134
242
|
async function loadCtx(program) {
|
|
135
243
|
const auth = resolveAuthToken();
|
|
136
244
|
const creds = loadCredentials();
|
|
@@ -138,7 +246,7 @@ async function loadCtx(program) {
|
|
|
138
246
|
console.error("Not signed in. Run: renaiss-shipflow login");
|
|
139
247
|
process.exit(1);
|
|
140
248
|
}
|
|
141
|
-
const client = new ShipFlowClient({ baseUrl: resolveApiUrl(program.opts().apiUrl), jwt: auth.token });
|
|
249
|
+
const client = new ShipFlowClient({ baseUrl: resolveApiUrl(program.opts().apiUrl), jwt: auth.token, ...refreshOpts(creds) });
|
|
142
250
|
const project = await resolveProject(client, creds);
|
|
143
251
|
return { auth, creds, client, project };
|
|
144
252
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/commands/issue.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IAEpE,KAAK;SACF,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,wCAAwC,CAAC;SACrD,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,iBAAiB,EAAE,aAAa,CAAC;SACxC,MAAM,CAAC,eAAe,EAAE,0BAA0B,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,IAAsD,EAAE,EAAE;QACvE,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACjD,mEAAmE;QACnE,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,uFAAuF,CAAC;SACpG,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,gBAAgB,EAAE,0EAA0E,CAAC;SACpG,MAAM,CAAC,iBAAiB,EAAE,yCAAyC,CAAC;SACpE,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,IAAqE,EAAE,EAAE;QACzG,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,QAAQ,EAAE,CAAC;QAErE,qEAAqE;QACrE,kCAAkC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE;gBACxE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;aACvE,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,YAAY,kBAAkB,EAAE,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,MAAM,MAAM,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,uCAAwC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAEhH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACpH,OAAO,CAAC,GAAG,CAAC,UAAU,SAAS,CAAC,MAAM,OAAO,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,UAAU,SAAS,CAAC,KAAK,cAAc,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;QACjH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC;QAC3C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjE,IAAI,MAAM,CAAC,eAAe,EAAE,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC1G,IAAI,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBACtC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,CAAC;YACD,IAAI,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;gBAClC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;gBAC5C,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC1E,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,gCAAgC,CAAC;SAC7C,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,IAAwC,EAAE,EAAE;QAC5E,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QACnD,MAAM,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;QACtI,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,GAAG,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CAAC,2EAA2E,CAAC;SACxF,MAAM,CAAC,mBAAmB,EAAE,6BAA6B,CAAC;SAC1D,MAAM,CAAC,UAAU,EAAE,mBAAmB,CAAC;SACvC,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;SACjD,MAAM,CAAC,kBAAkB,EAAE,uCAAuC,CAAC;SACnE,MAAM,CAAC,mBAAmB,EAAE,sBAAsB,CAAC;SACnD,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,IAA6G,EAAE,EAAE;QACjJ,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACjG,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChD,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;YACrB,IAAI,EAAE,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;SACtC,CAAC,CAAC,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE;YACxF,IAAI;YACJ,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;YAC/C,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;SACP,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACrE,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,GAAG,CAAC,cAAc;YAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtD,IAAI,GAAG,CAAC,eAAe;YAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,6BAA6B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,6BAA6B,EAAE,CAAC,CAAC;QAC/F,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,eAAe,IAAI,EAAE;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAAgB;IACrC,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;IAChC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAC,CAAC;IACtG,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACtG,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACpD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,SAAS;IACtB,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK;QAAE,MAAM,CAAC,IAAI,CAAC,CAAW,CAAC,CAAC;IAC9D,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AACjD,CAAC"}
|
|
1
|
+
{"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/commands/issue.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/issues.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ShipFlowClient } from "../client.js";
|
|
2
|
-
import { resolveApiUrl, resolveAuthToken, loadCredentials } from "../config.js";
|
|
2
|
+
import { resolveApiUrl, resolveAuthToken, loadCredentials, refreshOpts } from "../config.js";
|
|
3
3
|
import { resolveProject } from "../project.js";
|
|
4
4
|
import { ghIssueList } from "../gh.js";
|
|
5
5
|
export function registerIssuesCommand(program) {
|
|
@@ -17,7 +17,7 @@ export function registerIssuesCommand(program) {
|
|
|
17
17
|
console.error("Not signed in. Run: renaiss-shipflow login");
|
|
18
18
|
process.exit(1);
|
|
19
19
|
}
|
|
20
|
-
const client = new ShipFlowClient({ baseUrl: resolveApiUrl(program.opts().apiUrl), jwt: auth.token });
|
|
20
|
+
const client = new ShipFlowClient({ baseUrl: resolveApiUrl(program.opts().apiUrl), jwt: auth.token, ...refreshOpts(creds) });
|
|
21
21
|
const project = await resolveProject(client, creds);
|
|
22
22
|
const list = ghIssueList(project.repoFullName, opts.state, parseInt(opts.limit, 10));
|
|
23
23
|
if (opts.json) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/commands/issues.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/commands/issues.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAG,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;IACtE,MAAM;SACH,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qEAAqE,CAAC;SAClF,MAAM,CAAC,iBAAiB,EAAE,aAAa,EAAE,MAAM,CAAC;SAChD,MAAM,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,CAAC;SAC1C,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,IAAsD,EAAE,EAAE;QACvE,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACtG,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7H,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QACrF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC3F,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;YACxC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/commands/pr.d.ts
CHANGED
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { Command } from "commander";
|
|
2
2
|
export declare function registerPRCommand(program: Command): void;
|
|
3
|
+
/** ShipFlow header for a PR body: reference the issue with a link (`Closes #N`),
|
|
4
|
+
* not a copy of its detail โ GitHub renders the linked issue, and the keyword
|
|
5
|
+
* auto-closes it on merge. Pure + testable. */
|
|
6
|
+
export declare function buildShipFlowHeader(project: string, issueNumber?: number, issueUrl?: string): string;
|
|
3
7
|
//# sourceMappingURL=pr.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pr.d.ts","sourceRoot":"","sources":["../../src/commands/pr.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiPxD;AAwBD;;+CAE+C;AAC/C,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAIpG"}
|
package/dist/commands/pr.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { execSync } from "node:child_process";
|
|
2
2
|
import { ShipFlowClient } from "../client.js";
|
|
3
|
-
import { resolveApiUrl, resolveAuthToken, loadCredentials } from "../config.js";
|
|
3
|
+
import { resolveApiUrl, resolveAuthToken, loadCredentials, refreshOpts, resolveMergePolicy, resolveRequireCi, resolveStalePrHours, } from "../config.js";
|
|
4
4
|
import { resolveProject } from "../project.js";
|
|
5
|
-
import { ghPRCreate, ghPRMerge } from "../gh.js";
|
|
5
|
+
import { ghPRCreate, ghPRMerge, ghPRView, ghCurrentLogin, ghEnsureLabel, ghIssueAddLabels, ghIssueRemoveLabel, ghReviewThreads, ghResolveReviewThread } from "../gh.js";
|
|
6
|
+
import { classifyPR, mergeDecision } from "../pr-state.js";
|
|
7
|
+
const APPROVED_LABEL = "shipflow-approved";
|
|
6
8
|
export function registerPRCommand(program) {
|
|
7
9
|
const pr = program.command("pr").description("Pull request actions");
|
|
8
10
|
pr
|
|
@@ -19,8 +21,10 @@ export function registerPRCommand(program) {
|
|
|
19
21
|
const ctx = await loadCtx(program);
|
|
20
22
|
const branch = currentBranch();
|
|
21
23
|
const issueNumber = opts.issue ? parseInt(opts.issue, 10) : detectIssueFromBranch(branch);
|
|
22
|
-
|
|
23
|
-
|
|
24
|
+
// Reference the issue with a link (Closes #N) โ don't copy its detail into
|
|
25
|
+
// the PR; GitHub renders the linked issue.
|
|
26
|
+
const issueUrl = issueNumber ? `https://github.com/${ctx.project.repoFullName}/issues/${issueNumber}` : undefined;
|
|
27
|
+
const header = buildShipFlowHeader(ctx.project.projectName, issueNumber, issueUrl);
|
|
24
28
|
const body = `${header}\n\n${opts.body ?? ""}`;
|
|
25
29
|
const created = ghPRCreate({ repo: ctx.project.repoFullName, body, title: opts.title, base: opts.base, head: branch, draft: opts.draft });
|
|
26
30
|
try {
|
|
@@ -61,6 +65,222 @@ export function registerPRCommand(program) {
|
|
|
61
65
|
}
|
|
62
66
|
console.log(`merged: ${result.mergedSha}`);
|
|
63
67
|
});
|
|
68
|
+
pr
|
|
69
|
+
.command("ready <number>")
|
|
70
|
+
.description("Report whether a PR is mergeable under the active merge policy (read-only โ used by the loop)")
|
|
71
|
+
.option("--policy <p>", "Override merge policy: manual | auto-on-green | auto-timeout")
|
|
72
|
+
.option("--repo <fullname>", "Override target repo")
|
|
73
|
+
.option("--json", "Output JSON")
|
|
74
|
+
.action(async (numberStr, opts) => {
|
|
75
|
+
const ctx = await loadCtx(program);
|
|
76
|
+
const number = parseInt(numberStr, 10);
|
|
77
|
+
const repo = opts.repo ?? ctx.project.repoFullName;
|
|
78
|
+
const policy = opts.policy ?? resolveMergePolicy();
|
|
79
|
+
const staleHours = resolveStalePrHours();
|
|
80
|
+
const me = ghCurrentLogin();
|
|
81
|
+
const prView = ghPRView(repo, number);
|
|
82
|
+
const cl = classifyPR(prView, me, { staleHours });
|
|
83
|
+
const unresolvedThreads = ghReviewThreads(repo, number).filter((t) => !t.isResolved).length;
|
|
84
|
+
const decision = mergeDecision(prView, me, { policy, requireCi: resolveRequireCi(), staleHours, unresolvedThreads });
|
|
85
|
+
const out = {
|
|
86
|
+
number, state: cl.state, ciState: cl.ciState, approved: cl.approved, unresolvedThreads,
|
|
87
|
+
ageHours: Math.round(cl.ageHours), policy, wouldMerge: decision.wouldMerge, blockers: decision.blockers,
|
|
88
|
+
};
|
|
89
|
+
if (opts.json) {
|
|
90
|
+
console.log(JSON.stringify(out, null, 2));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
console.log(`PR #${number}: ${cl.state} ยท ci=${cl.ciState} ยท approved=${cl.approved} ยท policy=${policy} โ ${decision.wouldMerge ? "READY TO MERGE" : `not ready (${decision.blockers.join("; ")})`}`);
|
|
94
|
+
});
|
|
95
|
+
pr
|
|
96
|
+
.command("automerge <number>")
|
|
97
|
+
.description("Merge a PR only if policy + CI + approval allow it; otherwise no-op and exit 5. The loop's safe auto-merge.")
|
|
98
|
+
.option("--policy <p>", "Override merge policy: manual | auto-on-green | auto-timeout")
|
|
99
|
+
.option("--mode <mode>", "squash | merge | rebase", "squash")
|
|
100
|
+
.option("--repo <fullname>", "Override target repo")
|
|
101
|
+
.option("--json", "Output JSON")
|
|
102
|
+
.action(async (numberStr, opts) => {
|
|
103
|
+
const ctx = await loadCtx(program);
|
|
104
|
+
const number = parseInt(numberStr, 10);
|
|
105
|
+
const repo = opts.repo ?? ctx.project.repoFullName;
|
|
106
|
+
const policy = opts.policy ?? resolveMergePolicy();
|
|
107
|
+
const staleHours = resolveStalePrHours();
|
|
108
|
+
const me = ghCurrentLogin();
|
|
109
|
+
const prView = ghPRView(repo, number);
|
|
110
|
+
const unresolvedThreads = ghReviewThreads(repo, number).filter((t) => !t.isResolved).length;
|
|
111
|
+
const decision = mergeDecision(prView, me, { policy, requireCi: resolveRequireCi(), staleHours, unresolvedThreads });
|
|
112
|
+
if (!decision.wouldMerge) {
|
|
113
|
+
if (opts.json) {
|
|
114
|
+
console.log(JSON.stringify({ number, merged: false, policy, blockers: decision.blockers }));
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
console.log(`โธ๏ธ PR #${number} not auto-merged: ${decision.blockers.join("; ")}`);
|
|
118
|
+
}
|
|
119
|
+
process.exit(5);
|
|
120
|
+
}
|
|
121
|
+
const result = ghPRMerge(repo, number, opts.mode ?? "squash", true);
|
|
122
|
+
try {
|
|
123
|
+
await ctx.client.signal(ctx.creds.org, ctx.project.projectId, "prs", number, "merged", { repo, mergedSha: result.mergedSha });
|
|
124
|
+
}
|
|
125
|
+
catch (e) {
|
|
126
|
+
console.warn(`Merged but ShipFlow signal failed: ${e.message}`);
|
|
127
|
+
}
|
|
128
|
+
const closed = (prView.closingIssuesReferences ?? []).map((i) => i.number);
|
|
129
|
+
for (const n of closed) {
|
|
130
|
+
try {
|
|
131
|
+
await ctx.client.signal(ctx.creds.org, ctx.project.projectId, "issues", n, "release-claim", { repo, reason: `merged via PR #${number}` });
|
|
132
|
+
}
|
|
133
|
+
catch { /* best-effort */ }
|
|
134
|
+
}
|
|
135
|
+
if (opts.json) {
|
|
136
|
+
console.log(JSON.stringify({ number, merged: true, mergedSha: result.mergedSha, policy, closedIssues: closed }));
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
console.log(`โ
Merged PR #${number} (${result.mergedSha}) under policy=${policy}${closed.length ? ` โ closes #${closed.join(", #")}` : ""}.`);
|
|
140
|
+
});
|
|
141
|
+
pr
|
|
142
|
+
.command("sync <number>")
|
|
143
|
+
.description("Rebase the PR's branch onto its (moved) base; aborts cleanly on conflict so the loop can escalate. Run on the PR's checked-out branch.")
|
|
144
|
+
.option("--repo <fullname>", "Override target repo")
|
|
145
|
+
.option("--no-push", "Don't force-with-lease push after a clean rebase")
|
|
146
|
+
.option("--json", "Output JSON")
|
|
147
|
+
.action(async (numberStr, opts) => {
|
|
148
|
+
const ctx = await loadCtx(program);
|
|
149
|
+
const number = parseInt(numberStr, 10);
|
|
150
|
+
const repo = opts.repo ?? ctx.project.repoFullName;
|
|
151
|
+
const prView = ghPRView(repo, number);
|
|
152
|
+
const base = prView.baseRefName;
|
|
153
|
+
const head = prView.headRefName;
|
|
154
|
+
if (!base) {
|
|
155
|
+
console.error(`PR #${number} has no base branch.`);
|
|
156
|
+
process.exit(1);
|
|
157
|
+
}
|
|
158
|
+
const cur = execSync("git rev-parse --abbrev-ref HEAD").toString().trim();
|
|
159
|
+
if (cur !== head) {
|
|
160
|
+
console.error(`On branch "${cur}" but PR #${number} is "${head}". Check it out first: git checkout ${head}`);
|
|
161
|
+
process.exit(1);
|
|
162
|
+
}
|
|
163
|
+
execSync(`git fetch origin ${base}`, { stdio: "ignore" });
|
|
164
|
+
let conflicted = false;
|
|
165
|
+
try {
|
|
166
|
+
execSync(`git rebase origin/${base}`, { stdio: "pipe" });
|
|
167
|
+
}
|
|
168
|
+
catch {
|
|
169
|
+
try {
|
|
170
|
+
execSync("git rebase --abort", { stdio: "ignore" });
|
|
171
|
+
}
|
|
172
|
+
catch { /* nothing to abort */ }
|
|
173
|
+
conflicted = true;
|
|
174
|
+
}
|
|
175
|
+
if (conflicted) {
|
|
176
|
+
if (opts.json) {
|
|
177
|
+
console.log(JSON.stringify({ number, rebased: false, conflict: true, base }));
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
console.log(`๐ PR #${number}: rebase onto ${base} conflicts โ aborted. Resolve manually or escalate.`);
|
|
181
|
+
}
|
|
182
|
+
process.exit(6);
|
|
183
|
+
}
|
|
184
|
+
let pushed = false;
|
|
185
|
+
if (opts.push !== false) {
|
|
186
|
+
execSync("git push --force-with-lease", { stdio: "ignore" });
|
|
187
|
+
pushed = true;
|
|
188
|
+
}
|
|
189
|
+
if (opts.json) {
|
|
190
|
+
console.log(JSON.stringify({ number, rebased: true, conflict: false, base, pushed }));
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
console.log(`๐ PR #${number}: rebased "${head}" onto ${base}${pushed ? " and pushed" : ""}.`);
|
|
194
|
+
});
|
|
195
|
+
pr
|
|
196
|
+
.command("approve <number>")
|
|
197
|
+
.description("Record the loop reviewer's approval: adds the shipflow-approved label (the automerge approval source) + an optional comment")
|
|
198
|
+
.option("--comment <text>", "Reviewer summary to post on the PR")
|
|
199
|
+
.option("--repo <fullname>", "Override target repo")
|
|
200
|
+
.option("--force", "Approve even with unresolved review threads (not recommended)")
|
|
201
|
+
.option("--json", "Output JSON")
|
|
202
|
+
.action(async (numberStr, opts) => {
|
|
203
|
+
const ctx = await loadCtx(program);
|
|
204
|
+
const number = parseInt(numberStr, 10);
|
|
205
|
+
const repo = opts.repo ?? ctx.project.repoFullName;
|
|
206
|
+
// Gate: don't approve while external review threads (e.g. gemini-code-assist)
|
|
207
|
+
// are still open โ address + resolve them first.
|
|
208
|
+
const unresolved = ghReviewThreads(repo, number).filter((t) => !t.isResolved);
|
|
209
|
+
if (unresolved.length && !opts.force) {
|
|
210
|
+
const list = unresolved.map((t) => ` โข ${t.author} ${t.path}:${t.line ?? "?"} โ ${t.body.split("\n")[0].slice(0, 80)}`).join("\n");
|
|
211
|
+
if (opts.json) {
|
|
212
|
+
console.log(JSON.stringify({ number, approved: false, unresolvedThreads: unresolved.length }));
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
console.error(`โ Not approving PR #${number}: ${unresolved.length} unresolved review thread(s):\n${list}\nAddress + resolve them (pr resolve), then approve (or --force).`);
|
|
216
|
+
}
|
|
217
|
+
process.exit(7);
|
|
218
|
+
}
|
|
219
|
+
ghEnsureLabel(repo, APPROVED_LABEL, "0e8a16", "Reviewed and approved by the ShipFlow loop reviewer");
|
|
220
|
+
ghIssueAddLabels(repo, number, [APPROVED_LABEL]);
|
|
221
|
+
ghIssueRemoveLabel(repo, number, "needs-human"); // approval clears a prior escalation
|
|
222
|
+
if (opts.comment) {
|
|
223
|
+
execSync(`gh pr comment ${number} --repo ${shellArg(repo)} --body ${shellArg(`โ
**Reviewer approved**\n\n${opts.comment}`)}`, { stdio: "ignore" });
|
|
224
|
+
}
|
|
225
|
+
if (opts.json) {
|
|
226
|
+
console.log(JSON.stringify({ number, approved: true, label: APPROVED_LABEL }));
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
console.log(`โ
PR #${number} approved โ labelled "${APPROVED_LABEL}" (automerge can proceed under an auto-* policy).`);
|
|
230
|
+
});
|
|
231
|
+
pr
|
|
232
|
+
.command("reviews <number>")
|
|
233
|
+
.description("External review state: unresolved review threads (incl. bot reviewers) the loop must fix before approving")
|
|
234
|
+
.option("--repo <fullname>", "Override target repo")
|
|
235
|
+
.option("--json", "Output JSON")
|
|
236
|
+
.action(async (numberStr, opts) => {
|
|
237
|
+
const ctx = await loadCtx(program);
|
|
238
|
+
const number = parseInt(numberStr, 10);
|
|
239
|
+
const repo = opts.repo ?? ctx.project.repoFullName;
|
|
240
|
+
const me = ghCurrentLogin();
|
|
241
|
+
const threads = ghReviewThreads(repo, number);
|
|
242
|
+
const unresolved = threads.filter((t) => !t.isResolved);
|
|
243
|
+
const externalUnresolved = unresolved.filter((t) => t.author && t.author !== me);
|
|
244
|
+
const out = {
|
|
245
|
+
number,
|
|
246
|
+
blocking: externalUnresolved.length > 0,
|
|
247
|
+
unresolvedThreads: unresolved.length,
|
|
248
|
+
externalUnresolved: externalUnresolved.length,
|
|
249
|
+
reviewers: [...new Set(threads.map((t) => t.author).filter(Boolean))],
|
|
250
|
+
threads: unresolved.map((t) => ({ id: t.id, author: t.author, path: t.path, line: t.line, body: t.body })),
|
|
251
|
+
};
|
|
252
|
+
if (opts.json) {
|
|
253
|
+
console.log(JSON.stringify(out, null, 2));
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
if (!unresolved.length) {
|
|
257
|
+
console.log(`โ
PR #${number}: no unresolved review threads.`);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
console.log(`PR #${number}: ${unresolved.length} unresolved thread(s)${out.blocking ? " โ BLOCKS approval/merge" : ""}`);
|
|
261
|
+
for (const t of unresolved)
|
|
262
|
+
console.log(` โข ${t.author} ${t.path}:${t.line ?? "?"} โ ${t.body.split("\n")[0].slice(0, 90)}`);
|
|
263
|
+
});
|
|
264
|
+
pr
|
|
265
|
+
.command("resolve <number>")
|
|
266
|
+
.description("Resolve review threads the loop has addressed (all unresolved, or specific --thread ids)")
|
|
267
|
+
.option("--thread <id...>", "Specific thread node-id(s) to resolve (default: all unresolved)")
|
|
268
|
+
.option("--repo <fullname>", "Override target repo")
|
|
269
|
+
.option("--json", "Output JSON")
|
|
270
|
+
.action(async (numberStr, opts) => {
|
|
271
|
+
const ctx = await loadCtx(program);
|
|
272
|
+
const number = parseInt(numberStr, 10);
|
|
273
|
+
const repo = opts.repo ?? ctx.project.repoFullName;
|
|
274
|
+
const unresolved = ghReviewThreads(repo, number).filter((t) => !t.isResolved);
|
|
275
|
+
const targets = opts.thread?.length ? unresolved.filter((t) => opts.thread.includes(t.id)) : unresolved;
|
|
276
|
+
for (const t of targets)
|
|
277
|
+
ghResolveReviewThread(t.id);
|
|
278
|
+
if (opts.json) {
|
|
279
|
+
console.log(JSON.stringify({ number, resolved: targets.length }));
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
console.log(`๐งต Resolved ${targets.length} review thread(s) on PR #${number}.`);
|
|
283
|
+
});
|
|
64
284
|
}
|
|
65
285
|
async function loadCtx(program) {
|
|
66
286
|
const auth = resolveAuthToken();
|
|
@@ -69,7 +289,7 @@ async function loadCtx(program) {
|
|
|
69
289
|
console.error("Not signed in. Run: renaiss-shipflow login");
|
|
70
290
|
process.exit(1);
|
|
71
291
|
}
|
|
72
|
-
const client = new ShipFlowClient({ baseUrl: resolveApiUrl(program.opts().apiUrl), jwt: auth.token });
|
|
292
|
+
const client = new ShipFlowClient({ baseUrl: resolveApiUrl(program.opts().apiUrl), jwt: auth.token, ...refreshOpts(creds) });
|
|
73
293
|
const project = await resolveProject(client, creds);
|
|
74
294
|
return { auth, creds, client, project };
|
|
75
295
|
}
|
|
@@ -80,14 +300,16 @@ function detectIssueFromBranch(branch) {
|
|
|
80
300
|
const m = branch.match(/^(?:issue|fix|feat)\/(\d+)/);
|
|
81
301
|
return m ? parseInt(m[1], 10) : undefined;
|
|
82
302
|
}
|
|
83
|
-
function
|
|
303
|
+
function shellArg(s) {
|
|
304
|
+
return `'${s.replace(/'/g, `'\\''`)}'`;
|
|
305
|
+
}
|
|
306
|
+
/** ShipFlow header for a PR body: reference the issue with a link (`Closes #N`),
|
|
307
|
+
* not a copy of its detail โ GitHub renders the linked issue, and the keyword
|
|
308
|
+
* auto-closes it on merge. Pure + testable. */
|
|
309
|
+
export function buildShipFlowHeader(project, issueNumber, issueUrl) {
|
|
84
310
|
const lines = ["## ShipFlow context", `- Project: ${project}`];
|
|
85
|
-
if (
|
|
86
|
-
lines.push(`- Closes #${
|
|
87
|
-
if (triage?.priority)
|
|
88
|
-
lines.push(`- Triage priority: ${triage.priority}`);
|
|
89
|
-
if (triage?.relatedFeatures?.length)
|
|
90
|
-
lines.push(`- Features: ${triage.relatedFeatures.join(", ")}`);
|
|
311
|
+
if (issueNumber)
|
|
312
|
+
lines.push(issueUrl ? `- Closes #${issueNumber} โ ${issueUrl}` : `- Closes #${issueNumber}`);
|
|
91
313
|
return lines.join("\n");
|
|
92
314
|
}
|
|
93
315
|
//# sourceMappingURL=pr.js.map
|