@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.
Files changed (66) hide show
  1. package/dist/client.d.ts +41 -2
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +57 -8
  4. package/dist/client.js.map +1 -1
  5. package/dist/commands/claims.js +2 -2
  6. package/dist/commands/claims.js.map +1 -1
  7. package/dist/commands/config.d.ts +3 -0
  8. package/dist/commands/config.d.ts.map +1 -0
  9. package/dist/commands/config.js +86 -0
  10. package/dist/commands/config.js.map +1 -0
  11. package/dist/commands/features.d.ts +3 -0
  12. package/dist/commands/features.d.ts.map +1 -0
  13. package/dist/commands/features.js +50 -0
  14. package/dist/commands/features.js.map +1 -0
  15. package/dist/commands/inbox.d.ts +4 -0
  16. package/dist/commands/inbox.d.ts.map +1 -0
  17. package/dist/commands/inbox.js +72 -0
  18. package/dist/commands/inbox.js.map +1 -0
  19. package/dist/commands/init.js +2 -2
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/issue.d.ts.map +1 -1
  22. package/dist/commands/issue.js +140 -32
  23. package/dist/commands/issue.js.map +1 -1
  24. package/dist/commands/issues.js +2 -2
  25. package/dist/commands/issues.js.map +1 -1
  26. package/dist/commands/pr.d.ts +4 -0
  27. package/dist/commands/pr.d.ts.map +1 -1
  28. package/dist/commands/pr.js +234 -12
  29. package/dist/commands/pr.js.map +1 -1
  30. package/dist/commands/regression.js +2 -2
  31. package/dist/commands/regression.js.map +1 -1
  32. package/dist/commands/release.js +2 -2
  33. package/dist/commands/release.js.map +1 -1
  34. package/dist/commands/status.js +2 -2
  35. package/dist/commands/status.js.map +1 -1
  36. package/dist/config.d.ts +49 -0
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +99 -0
  39. package/dist/config.js.map +1 -1
  40. package/dist/gh.d.ts +70 -1
  41. package/dist/gh.d.ts.map +1 -1
  42. package/dist/gh.js +88 -4
  43. package/dist/gh.js.map +1 -1
  44. package/dist/index.js +10 -1
  45. package/dist/index.js.map +1 -1
  46. package/dist/issue-order.d.ts +8 -0
  47. package/dist/issue-order.d.ts.map +1 -0
  48. package/dist/issue-order.js +33 -0
  49. package/dist/issue-order.js.map +1 -0
  50. package/dist/pr-state.d.ts +57 -0
  51. package/dist/pr-state.d.ts.map +1 -0
  52. package/dist/pr-state.js +140 -0
  53. package/dist/pr-state.js.map +1 -0
  54. package/package.json +1 -1
  55. package/dist/__tests__/gh.test.d.ts +0 -2
  56. package/dist/__tests__/gh.test.d.ts.map +0 -1
  57. package/dist/__tests__/gh.test.js +0 -46
  58. package/dist/__tests__/gh.test.js.map +0 -1
  59. package/dist/__tests__/login.test.d.ts +0 -2
  60. package/dist/__tests__/login.test.d.ts.map +0 -1
  61. package/dist/__tests__/login.test.js +0 -25
  62. package/dist/__tests__/login.test.js.map +0 -1
  63. package/dist/__tests__/project.test.d.ts +0 -2
  64. package/dist/__tests__/project.test.d.ts.map +0 -1
  65. package/dist/__tests__/project.test.js +0 -17
  66. package/dist/__tests__/project.test.js.map +0 -1
@@ -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 created = ghIssueCreate(repo, title, body);
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
- if (opts.json) {
56
- console.log(JSON.stringify({ issue: issueData, triage, project: ctx.project }, null, 2));
57
- return;
58
- }
59
- console.log(`Issue #${issueData.number} โ€” "${issueData.title}"`);
60
- console.log(`Repo: ${repo}`);
61
- console.log(`State: ${issueData.state} โ€ข Labels: ${issueData.labels.map((l) => l.name).join(", ") || "(none)"}`);
62
- console.log("");
63
- console.log(issueData.body || "(no body)");
64
- if (triage) {
65
- console.log("\nโ”€โ”€ ShipFlow context โ”€โ”€");
66
- if (triage.priority)
67
- console.log(`Priority: ${triage.priority}`);
68
- if (triage.relatedFeatures?.length)
69
- console.log(`Features touched: ${triage.relatedFeatures.join(", ")}`);
70
- if (triage.relatedFiles?.length) {
71
- console.log("Files likely involved:");
72
- triage.relatedFiles.slice(0, 10).forEach((f) => console.log(` ${f}`));
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
- if (triage.relatedCommits?.length) {
75
- console.log("Recent commits in same area:");
76
- triage.relatedCommits.slice(0, 5).forEach((c) => console.log(` ${c}`));
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 to an issue (reporter thread + GitHub comment)")
95
- .option("--image <path...>", "Screenshot file(s), up to 4")
96
- .option("--pr <n>", "Related PR number")
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 screenshots")
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
- if (!opts.image?.length) {
103
- console.error("At least one --image is required.");
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 = opts.image.slice(0, 4).map((p) => ({
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":"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"}
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/commands/issue.ts"],"names":[],"mappings":"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"}
@@ -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;AAChF,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,CAAC,CAAC;QACtG,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"}
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"}
@@ -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;AAOzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuDxD"}
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"}
@@ -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
- const triage = issueNumber ? await ctx.client.getTriage(ctx.creds.org, ctx.project.projectId, ctx.project.repoFullName, issueNumber).catch(() => null) : null;
23
- const header = buildShipFlowHeader(ctx.project.projectName, issueNumber, triage);
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 buildShipFlowHeader(project, issue, triage) {
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 (issue)
86
- lines.push(`- Closes #${issue}`);
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