@on-par/factory-core 0.9.28-next.2 → 0.9.28-next.21

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 (215) hide show
  1. package/dist/blockers/declared-prerequisites.d.ts +4 -1
  2. package/dist/blockers/declared-prerequisites.d.ts.map +1 -1
  3. package/dist/blockers/declared-prerequisites.js +10 -5
  4. package/dist/blockers/declared-prerequisites.js.map +1 -1
  5. package/dist/checkers/app-smoke.d.ts.map +1 -1
  6. package/dist/checkers/app-smoke.js +4 -1
  7. package/dist/checkers/app-smoke.js.map +1 -1
  8. package/dist/checkers/evidence-plan.d.ts +2 -0
  9. package/dist/checkers/evidence-plan.d.ts.map +1 -1
  10. package/dist/checkers/evidence-plan.js +13 -6
  11. package/dist/checkers/evidence-plan.js.map +1 -1
  12. package/dist/checkers/evidence-selector.d.ts +2 -0
  13. package/dist/checkers/evidence-selector.d.ts.map +1 -1
  14. package/dist/checkers/evidence-selector.js +13 -10
  15. package/dist/checkers/evidence-selector.js.map +1 -1
  16. package/dist/checkers/evidence-workspace.d.ts +21 -0
  17. package/dist/checkers/evidence-workspace.d.ts.map +1 -0
  18. package/dist/checkers/evidence-workspace.js +118 -0
  19. package/dist/checkers/evidence-workspace.js.map +1 -0
  20. package/dist/checkers/index.js +1 -1
  21. package/dist/checkers/index.js.map +1 -1
  22. package/dist/checkers/internal-exports.d.ts +1 -0
  23. package/dist/checkers/internal-exports.d.ts.map +1 -1
  24. package/dist/checkers/internal-exports.js +1 -0
  25. package/dist/checkers/internal-exports.js.map +1 -1
  26. package/dist/checkers/resolve-commands.d.ts.map +1 -1
  27. package/dist/checkers/resolve-commands.js +5 -1
  28. package/dist/checkers/resolve-commands.js.map +1 -1
  29. package/dist/config/example.d.ts.map +1 -1
  30. package/dist/config/example.js +11 -2
  31. package/dist/config/example.js.map +1 -1
  32. package/dist/config/index.d.ts +20 -32
  33. package/dist/config/index.d.ts.map +1 -1
  34. package/dist/config/index.js +11 -30
  35. package/dist/config/index.js.map +1 -1
  36. package/dist/config/merge-policy.d.ts +36 -0
  37. package/dist/config/merge-policy.d.ts.map +1 -0
  38. package/dist/config/merge-policy.js +31 -0
  39. package/dist/config/merge-policy.js.map +1 -0
  40. package/dist/config/runtime-config-keys.d.ts.map +1 -1
  41. package/dist/config/runtime-config-keys.js +1 -0
  42. package/dist/config/runtime-config-keys.js.map +1 -1
  43. package/dist/config/tracker-section.d.ts +39 -0
  44. package/dist/config/tracker-section.d.ts.map +1 -0
  45. package/dist/config/tracker-section.js +31 -0
  46. package/dist/config/tracker-section.js.map +1 -0
  47. package/dist/environment/process-groups.d.ts +5 -0
  48. package/dist/environment/process-groups.d.ts.map +1 -1
  49. package/dist/environment/process-groups.js +19 -0
  50. package/dist/environment/process-groups.js.map +1 -1
  51. package/dist/events/queue-traits.d.ts +1 -1
  52. package/dist/events/queue-traits.d.ts.map +1 -1
  53. package/dist/events/queue-traits.js +5 -1
  54. package/dist/events/queue-traits.js.map +1 -1
  55. package/dist/filing/redact.d.ts +1 -0
  56. package/dist/filing/redact.d.ts.map +1 -1
  57. package/dist/filing/redact.js +1 -1
  58. package/dist/filing/redact.js.map +1 -1
  59. package/dist/harness/opencode-version.d.ts +2 -2
  60. package/dist/harness/opencode-version.d.ts.map +1 -1
  61. package/dist/harness/opencode-version.js +3 -3
  62. package/dist/harness/opencode-version.js.map +1 -1
  63. package/dist/internal.d.ts +11 -1
  64. package/dist/internal.d.ts.map +1 -1
  65. package/dist/internal.js +11 -0
  66. package/dist/internal.js.map +1 -1
  67. package/dist/phases/check-evidence.d.ts.map +1 -1
  68. package/dist/phases/check-evidence.js +5 -1
  69. package/dist/phases/check-evidence.js.map +1 -1
  70. package/dist/phases/ship-approval.d.ts +17 -0
  71. package/dist/phases/ship-approval.d.ts.map +1 -0
  72. package/dist/phases/ship-approval.js +21 -0
  73. package/dist/phases/ship-approval.js.map +1 -0
  74. package/dist/phases/ship-branch-push.d.ts +17 -0
  75. package/dist/phases/ship-branch-push.d.ts.map +1 -0
  76. package/dist/phases/ship-branch-push.js +77 -0
  77. package/dist/phases/ship-branch-push.js.map +1 -0
  78. package/dist/phases/ship-ci-watch.d.ts +25 -0
  79. package/dist/phases/ship-ci-watch.d.ts.map +1 -0
  80. package/dist/phases/ship-ci-watch.js +53 -0
  81. package/dist/phases/ship-ci-watch.js.map +1 -0
  82. package/dist/phases/ship-evidence-comment.d.ts +12 -0
  83. package/dist/phases/ship-evidence-comment.d.ts.map +1 -0
  84. package/dist/phases/ship-evidence-comment.js +30 -0
  85. package/dist/phases/ship-evidence-comment.js.map +1 -0
  86. package/dist/phases/ship-existing-pr.d.ts +11 -0
  87. package/dist/phases/ship-existing-pr.d.ts.map +1 -0
  88. package/dist/phases/ship-existing-pr.js +36 -0
  89. package/dist/phases/ship-existing-pr.js.map +1 -0
  90. package/dist/phases/ship-finish.d.ts +15 -0
  91. package/dist/phases/ship-finish.d.ts.map +1 -0
  92. package/dist/phases/ship-finish.js +69 -0
  93. package/dist/phases/ship-finish.js.map +1 -0
  94. package/dist/phases/ship-git-detail.d.ts +31 -0
  95. package/dist/phases/ship-git-detail.d.ts.map +1 -0
  96. package/dist/phases/ship-git-detail.js +71 -0
  97. package/dist/phases/ship-git-detail.js.map +1 -0
  98. package/dist/phases/ship-git-remote.d.ts +51 -0
  99. package/dist/phases/ship-git-remote.d.ts.map +1 -0
  100. package/dist/phases/ship-git-remote.js +70 -0
  101. package/dist/phases/ship-git-remote.js.map +1 -0
  102. package/dist/phases/ship-git.d.ts +4 -79
  103. package/dist/phases/ship-git.d.ts.map +1 -1
  104. package/dist/phases/ship-git.js +2 -135
  105. package/dist/phases/ship-git.js.map +1 -1
  106. package/dist/phases/ship-open-pr.d.ts +19 -0
  107. package/dist/phases/ship-open-pr.d.ts.map +1 -0
  108. package/dist/phases/ship-open-pr.js +71 -0
  109. package/dist/phases/ship-open-pr.js.map +1 -0
  110. package/dist/phases/ship-options.d.ts +76 -0
  111. package/dist/phases/ship-options.d.ts.map +1 -0
  112. package/dist/phases/ship-options.js +4 -0
  113. package/dist/phases/ship-options.js.map +1 -0
  114. package/dist/phases/ship-pr-lookup.d.ts +8 -0
  115. package/dist/phases/ship-pr-lookup.d.ts.map +1 -0
  116. package/dist/phases/ship-pr-lookup.js +41 -0
  117. package/dist/phases/ship-pr-lookup.js.map +1 -0
  118. package/dist/phases/ship-recovery.d.ts +16 -0
  119. package/dist/phases/ship-recovery.d.ts.map +1 -0
  120. package/dist/phases/ship-recovery.js +81 -0
  121. package/dist/phases/ship-recovery.js.map +1 -0
  122. package/dist/phases/ship-reentry.d.ts +20 -0
  123. package/dist/phases/ship-reentry.d.ts.map +1 -0
  124. package/dist/phases/ship-reentry.js +47 -0
  125. package/dist/phases/ship-reentry.js.map +1 -0
  126. package/dist/phases/ship-types.d.ts +36 -0
  127. package/dist/phases/ship-types.d.ts.map +1 -0
  128. package/dist/phases/ship-types.js +2 -0
  129. package/dist/phases/ship-types.js.map +1 -0
  130. package/dist/phases/ship.d.ts +6 -113
  131. package/dist/phases/ship.d.ts.map +1 -1
  132. package/dist/phases/ship.js +55 -458
  133. package/dist/phases/ship.js.map +1 -1
  134. package/dist/queue/comment-rework-trigger.d.ts +24 -0
  135. package/dist/queue/comment-rework-trigger.d.ts.map +1 -0
  136. package/dist/queue/comment-rework-trigger.js +128 -0
  137. package/dist/queue/comment-rework-trigger.js.map +1 -0
  138. package/dist/queue/internal-exports.d.ts +2 -0
  139. package/dist/queue/internal-exports.d.ts.map +1 -1
  140. package/dist/queue/internal-exports.js +1 -0
  141. package/dist/queue/internal-exports.js.map +1 -1
  142. package/dist/queue/lane-discovery-interval.d.ts +6 -0
  143. package/dist/queue/lane-discovery-interval.d.ts.map +1 -0
  144. package/dist/queue/lane-discovery-interval.js +9 -0
  145. package/dist/queue/lane-discovery-interval.js.map +1 -0
  146. package/dist/queue/linear-queue-backend.d.ts +17 -0
  147. package/dist/queue/linear-queue-backend.d.ts.map +1 -0
  148. package/dist/queue/linear-queue-backend.js +42 -0
  149. package/dist/queue/linear-queue-backend.js.map +1 -0
  150. package/dist/queue/linear-queue-lifecycle.d.ts +62 -0
  151. package/dist/queue/linear-queue-lifecycle.d.ts.map +1 -0
  152. package/dist/queue/linear-queue-lifecycle.js +139 -0
  153. package/dist/queue/linear-queue-lifecycle.js.map +1 -0
  154. package/dist/queue/linear-queue.d.ts +51 -0
  155. package/dist/queue/linear-queue.d.ts.map +1 -0
  156. package/dist/queue/linear-queue.js +335 -0
  157. package/dist/queue/linear-queue.js.map +1 -0
  158. package/dist/queue/queue-backend.d.ts +11 -5
  159. package/dist/queue/queue-backend.d.ts.map +1 -1
  160. package/dist/queue/queue-backend.js +8 -3
  161. package/dist/queue/queue-backend.js.map +1 -1
  162. package/dist/queue/review-rework-trigger.d.ts +7 -2
  163. package/dist/queue/review-rework-trigger.d.ts.map +1 -1
  164. package/dist/queue/review-rework-trigger.js +12 -8
  165. package/dist/queue/review-rework-trigger.js.map +1 -1
  166. package/dist/reports/pr-body.d.ts.map +1 -1
  167. package/dist/reports/pr-body.js +18 -8
  168. package/dist/reports/pr-body.js.map +1 -1
  169. package/dist/run/ports.d.ts +10 -0
  170. package/dist/run/ports.d.ts.map +1 -1
  171. package/dist/run/ports.js +12 -0
  172. package/dist/run/ports.js.map +1 -1
  173. package/dist/run/pr-run-state.d.ts +99 -0
  174. package/dist/run/pr-run-state.d.ts.map +1 -0
  175. package/dist/run/pr-run-state.js +235 -0
  176. package/dist/run/pr-run-state.js.map +1 -0
  177. package/dist/run/review-rework-cap.d.ts +3 -1
  178. package/dist/run/review-rework-cap.d.ts.map +1 -1
  179. package/dist/run/review-rework-cap.js +2 -1
  180. package/dist/run/review-rework-cap.js.map +1 -1
  181. package/dist/run/review-rework.d.ts +10 -0
  182. package/dist/run/review-rework.d.ts.map +1 -1
  183. package/dist/run/review-rework.js +45 -15
  184. package/dist/run/review-rework.js.map +1 -1
  185. package/dist/run/state.d.ts +6 -4
  186. package/dist/run/state.d.ts.map +1 -1
  187. package/dist/run/state.js +8 -5
  188. package/dist/run/state.js.map +1 -1
  189. package/dist/utils/command-runner.d.ts.map +1 -1
  190. package/dist/utils/command-runner.js +4 -1
  191. package/dist/utils/command-runner.js.map +1 -1
  192. package/dist/utils/exec.d.ts.map +1 -1
  193. package/dist/utils/exec.js +4 -1
  194. package/dist/utils/exec.js.map +1 -1
  195. package/dist/utils/in-place.d.ts +24 -0
  196. package/dist/utils/in-place.d.ts.map +1 -0
  197. package/dist/utils/in-place.js +105 -0
  198. package/dist/utils/in-place.js.map +1 -0
  199. package/dist/work/index.d.ts +2 -2
  200. package/dist/work/index.d.ts.map +1 -1
  201. package/dist/work/index.js +4 -2
  202. package/dist/work/index.js.map +1 -1
  203. package/dist/work/linear-client.d.ts +21 -0
  204. package/dist/work/linear-client.d.ts.map +1 -0
  205. package/dist/work/linear-client.js +69 -0
  206. package/dist/work/linear-client.js.map +1 -0
  207. package/dist/work/linear-issue.d.ts +11 -0
  208. package/dist/work/linear-issue.d.ts.map +1 -0
  209. package/dist/work/linear-issue.js +69 -0
  210. package/dist/work/linear-issue.js.map +1 -0
  211. package/dist/work/linear-preflight.d.ts +21 -0
  212. package/dist/work/linear-preflight.d.ts.map +1 -0
  213. package/dist/work/linear-preflight.js +67 -0
  214. package/dist/work/linear-preflight.js.map +1 -0
  215. package/package.json +5 -5
@@ -0,0 +1,71 @@
1
+ // packages/core/src/phases/ship-open-pr.ts — SHIP draft PR creation and already-exists recovery
2
+ import { briefSummaryLine, renderPrBody, stripBriefIds } from '../reports/pr-body.js';
3
+ import { issueNumberOf } from '../work/work-key.js';
4
+ import { SHIP_BASE_BRANCH } from './ship-options.js';
5
+ import { findOpenPR, isPullAlreadyExistsError } from './ship-pr-lookup.js';
6
+ import { readRisk, readSpecBody } from './ship-spec.js';
7
+ import { renderStackOrderLine } from './stack-order.js';
8
+ export async function openOrFindPr(ctx) {
9
+ const { opts, inlineWork, stack, base, owner, repoName, walkthrough } = ctx;
10
+ const { octokit, issue, branch, checkSummary, log } = opts;
11
+ let prNumber;
12
+ // Get title from issue (skipped for a non-github work source — no such issue exists)
13
+ const title = inlineWork
14
+ ? inlineWork.title
15
+ : (await octokit.rest.issues.get({ owner, repo: repoName, issue_number: issueNumberOf(issue) })).data.title;
16
+ const slice = inlineWork ? undefined : opts.slice;
17
+ const finalSlice = !slice || slice.index >= slice.count;
18
+ // A brief is a local file reviewers cannot open, so the body describes it by its title and links the
19
+ // open PR it builds on (a --stack or --base-branch base), never its id, digest or path.
20
+ const basePr = inlineWork && base !== SHIP_BASE_BRANCH ? await findOpenPR(octokit, owner, repoName, base) : undefined;
21
+ const summaryLine = inlineWork
22
+ ? briefSummaryLine(title, basePr?.status === 'found' ? basePr.prNumber : undefined)
23
+ : slice
24
+ ? `Implements slice ${slice.index}/${slice.count} of #${issue}.`
25
+ : `Implements #${issue}.`;
26
+ const prTitle = inlineWork
27
+ ? stripBriefIds(title)
28
+ : slice
29
+ ? `${title} — slice ${slice.index}/${slice.count} (#${issue})`
30
+ : `${title} (#${issue})`;
31
+ // Create PR
32
+ try {
33
+ const { data: pr } = await octokit.rest.pulls.create({
34
+ owner,
35
+ repo: repoName,
36
+ head: branch,
37
+ base,
38
+ title: prTitle,
39
+ draft: true,
40
+ body: renderPrBody({
41
+ summaryLine,
42
+ footer: opts.footer,
43
+ stackOrder: stack ? renderStackOrderLine(stack) : undefined,
44
+ specBody: await readSpecBody(opts.specPath),
45
+ checkSummary,
46
+ reworkRounds: opts.reworkRounds,
47
+ risk: await readRisk(opts.specPath),
48
+ walkthrough: await walkthrough.walkthrough(),
49
+ typescriptLines: await walkthrough.counts(),
50
+ closes: inlineWork || !finalSlice ? undefined : issue,
51
+ partOf: !inlineWork && !finalSlice ? issue : undefined,
52
+ }),
53
+ });
54
+ prNumber = pr.number;
55
+ log('pr_opened', `opened PR #${prNumber} for committed work on ${branch} (base ${base})`);
56
+ }
57
+ catch (err) {
58
+ if (!isPullAlreadyExistsError(err))
59
+ throw err;
60
+ const existing = await findOpenPR(octokit, owner, repoName, branch);
61
+ if (existing.status !== 'found') {
62
+ const reason = `pulls.create reported an existing PR for ${branch} but re-querying did not find it (${existing.status === 'error' ? existing.detail : 'no open PR listed'})`;
63
+ log('ship', `${reason} — aborting`);
64
+ return { stop: { ok: false, reason } };
65
+ }
66
+ prNumber = existing.prNumber;
67
+ log('recovered', `PR #${prNumber} already existed for ${branch}; reusing it`);
68
+ }
69
+ return { prNumber };
70
+ }
71
+ //# sourceMappingURL=ship-open-pr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-open-pr.js","sourceRoot":"","sources":["../../src/phases/ship-open-pr.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ import type { Octokit } from '@octokit/rest';
2
+ import type { ApprovalGate } from '../approvals/index.js';
3
+ import type { LifecycleBus } from '../bus/index.js';
4
+ import type { EventKind } from '../events/kinds.js';
5
+ import type { ReviewRouting } from '../review/routing.js';
6
+ import type { CheckSummary } from '../types/index.js';
7
+ import type { watchChecksWithInfraRerun } from '../utils/ci-watch.js';
8
+ import type { WorkRequest } from '../work/index.js';
9
+ import type { WorkKey } from '../work/work-key.js';
10
+ import type { CommandRunner } from './ship-git.js';
11
+ import type { PreviewGate } from './ship-preview.js';
12
+ import type { WalkthroughShipOpts } from './ship-walkthrough.js';
13
+ import type { StackPosition } from './stack-order.js';
14
+ /** Ship opens PRs against, and watches required checks of, this branch. */
15
+ export declare const SHIP_BASE_BRANCH = "main";
16
+ export interface ShipPhaseOptions {
17
+ issue: WorkKey;
18
+ repo: string;
19
+ worktree: string;
20
+ branch: string;
21
+ octokit: Octokit;
22
+ watchCI?: boolean;
23
+ /** Resolved pr.footer; undefined uses the default, empty string omits it. */
24
+ footer?: string;
25
+ /** Stop at the draft PR: skip mark-ready (#3449). */
26
+ draft?: boolean;
27
+ /** Post the evidence pack as a PR comment (pr.evidenceComment); default off. */
28
+ evidenceComment?: boolean;
29
+ log: (type: EventKind, msg: string) => void;
30
+ run?: CommandRunner;
31
+ /** Runs the gh rerun argv for the CI infra rescue (#2365); default runCommand. */
32
+ rerun?: (argv: readonly string[]) => Promise<{
33
+ ok: boolean;
34
+ }>;
35
+ approvalGate?: ApprovalGate;
36
+ checkSummary?: CheckSummary;
37
+ specPath?: string;
38
+ eventsFile?: string;
39
+ startedAt?: string;
40
+ logsDir?: string;
41
+ reworkRounds?: number;
42
+ /** PR classifier decision (#1724), rendered into the evidence pack. */
43
+ reviewRouting?: ReviewRouting;
44
+ /** Model pins that were not honored (#2511), rendered into the evidence pack. */
45
+ pinNotes?: string[];
46
+ /** The run's resolved work request; when its kind is not 'github-issue', the PR
47
+ * title/body come from it instead of fetching the (nonexistent) issue (#507). */
48
+ work?: Pick<WorkRequest, 'id' | 'kind' | 'title' | 'reference'>;
49
+ /** The ADR-0147 slice this run ships; titles the PR `slice k/n` and only the final slice closes the issue. */
50
+ slice?: {
51
+ index: number;
52
+ count: number;
53
+ };
54
+ /** Stack-mode (ADR-0161) position: the PR opens on `stack.base` and its body names the stack order. Ignored for inline work. */
55
+ stack?: StackPosition;
56
+ /** PR base for a non-stack run started from another branch (#3764); default main. */
57
+ baseBranch?: string;
58
+ /** Lane id stamped onto emitted lifecycle events; defaults to `issue-<issue>` (#591). */
59
+ laneId?: string;
60
+ /** Lifecycle bus to emit onto; defaults to the process-wide `lifecycleBus` (#591). */
61
+ bus?: LifecycleBus;
62
+ /** origin/<branch> SHA recorded at worktree creation (#1868). When set, the new-PR push
63
+ * replaces that stale head under a lease on this SHA, and fails closed if the remote moved (#1869). */
64
+ recordedRemoteSha?: string;
65
+ /** SHIP re-entry after a CI rework round (#2816): same open PR, plain push, watch the pushed SHA. */
66
+ reentry?: {
67
+ prNumber: number;
68
+ previousHeadSha?: string;
69
+ };
70
+ /** CI watch deadline (#3569); default DEFAULT_CI_DEADLINE_MS. */
71
+ ciDeadlineMs?: number;
72
+ walkthrough?: WalkthroughShipOpts['walkthrough'];
73
+ previewGate?: PreviewGate;
74
+ ciWatch?: typeof watchChecksWithInfraRerun;
75
+ }
76
+ //# sourceMappingURL=ship-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-options.d.ts","sourceRoot":"","sources":["../../src/phases/ship-options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ // packages/core/src/phases/ship-options.ts — SHIP phase options and the base branch it ships against
2
+ /** Ship opens PRs against, and watches required checks of, this branch. */
3
+ export const SHIP_BASE_BRANCH = 'main';
4
+ //# sourceMappingURL=ship-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-options.js","sourceRoot":"","sources":["../../src/phases/ship-options.ts"],"names":[],"mappings":"AAAA,qGAAqG;AAiBrG,2EAA2E;AAC3E,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Octokit } from '@octokit/rest';
2
+ import type { PrLookup } from './ship-types.js';
3
+ export declare function findOpenPR(octokit: Octokit, owner: string, repo: string, branch: string): Promise<PrLookup>;
4
+ export declare function findMergedPR(octokit: Octokit, owner: string, repo: string, branch: string): Promise<PrLookup>;
5
+ /** A `pulls.create` 422 whose message says the PR already exists — recoverable by re-querying,
6
+ * unlike every other 422 (e.g. "No commits between ..."), which still propagates (#641). */
7
+ export declare function isPullAlreadyExistsError(err: unknown): boolean;
8
+ //# sourceMappingURL=ship-pr-lookup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-pr-lookup.d.ts","sourceRoot":"","sources":["../../src/phases/ship-pr-lookup.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEhD,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAajH;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAanH;AAED;6FAC6F;AAC7F,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAS9D"}
@@ -0,0 +1,41 @@
1
+ import { shortDetail } from './ship-git.js';
2
+ export async function findOpenPR(octokit, owner, repo, branch) {
3
+ try {
4
+ const { data: prs } = await octokit.rest.pulls.list({
5
+ owner,
6
+ repo,
7
+ state: 'open',
8
+ head: `${owner}:${branch}`,
9
+ });
10
+ const prNumber = prs[0]?.number;
11
+ return prNumber === undefined ? { status: 'absent' } : { status: 'found', prNumber };
12
+ }
13
+ catch (err) {
14
+ return { status: 'error', detail: shortDetail(err) };
15
+ }
16
+ }
17
+ export async function findMergedPR(octokit, owner, repo, branch) {
18
+ try {
19
+ const { data: prs } = await octokit.rest.pulls.list({
20
+ owner,
21
+ repo,
22
+ state: 'closed',
23
+ head: `${owner}:${branch}`,
24
+ });
25
+ const prNumber = prs.find((pr) => pr.merged_at != null)?.number;
26
+ return prNumber === undefined ? { status: 'absent' } : { status: 'found', prNumber };
27
+ }
28
+ catch (err) {
29
+ return { status: 'error', detail: shortDetail(err) };
30
+ }
31
+ }
32
+ /** A `pulls.create` 422 whose message says the PR already exists — recoverable by re-querying,
33
+ * unlike every other 422 (e.g. "No commits between ..."), which still propagates (#641). */
34
+ export function isPullAlreadyExistsError(err) {
35
+ const e = err;
36
+ if (e?.status !== 422)
37
+ return false;
38
+ const messages = [e.message ?? '', ...(e.response?.data?.errors ?? []).map((x) => x?.message ?? '')];
39
+ return messages.some((m) => /already exists/i.test(m));
40
+ }
41
+ //# sourceMappingURL=ship-pr-lookup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-pr-lookup.js","sourceRoot":"","sources":["../../src/phases/ship-pr-lookup.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG5C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAgB,EAAE,KAAa,EAAE,IAAY,EAAE,MAAc;IAC5F,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAClD,KAAK;YACL,IAAI;YACJ,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE;SAC3B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;QAChC,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACvF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAgB,EAAE,KAAa,EAAE,IAAY,EAAE,MAAc;IAC9F,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;YAClD,KAAK;YACL,IAAI;YACJ,KAAK,EAAE,QAAQ;YACf,IAAI,EAAE,GAAG,KAAK,IAAI,MAAM,EAAE;SAC3B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC,EAAE,MAAM,CAAC;QAChE,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IACvF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC;IACvD,CAAC;AACH,CAAC;AAED;6FAC6F;AAC7F,MAAM,UAAU,wBAAwB,CAAC,GAAY;IACnD,MAAM,CAAC,GAAG,GAIF,CAAC;IACT,IAAI,CAAC,EAAE,MAAM,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IACrG,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Octokit } from '@octokit/rest';
2
+ import type { EventKind } from '../events/kinds.js';
3
+ import type { WorkKey } from '../work/work-key.js';
4
+ import type { CommandRunner } from './ship-git.js';
5
+ import type { ShipResult } from './ship-types.js';
6
+ export declare function recoverOrStop(ctx: {
7
+ run: CommandRunner;
8
+ worktree: string;
9
+ branch: string;
10
+ issue: WorkKey | undefined;
11
+ octokit: Octokit;
12
+ owner: string;
13
+ repoName: string;
14
+ log: (type: EventKind, msg: string) => void;
15
+ }): Promise<ShipResult | undefined>;
16
+ //# sourceMappingURL=ship-recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-recovery.d.ts","sourceRoot":"","sources":["../../src/phases/ship-recovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,wBAAsB,aAAa,CAAC,GAAG,EAAE;IACvC,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAyDlC"}
@@ -0,0 +1,81 @@
1
+ import { commitLeftoverBuildOutput } from './ship-leftover.js';
2
+ import { findMergedPR } from './ship-pr-lookup.js';
3
+ export async function recoverOrStop(ctx) {
4
+ const { run, worktree, branch, octokit, owner, repoName, log } = ctx;
5
+ try {
6
+ await run('git fetch origin main', { cwd: worktree });
7
+ }
8
+ catch {
9
+ log('ship', 'git fetch origin main failed — recovery may compare against a stale origin/main');
10
+ }
11
+ let recoveryState = await inspectRecoveryState(worktree, run);
12
+ if (!recoveryState.clean) {
13
+ const conflicts = conflictedPaths(recoveryState.statusLines);
14
+ if (conflicts.length > 0) {
15
+ const listed = conflicts.slice(0, 5).join(', ') + (conflicts.length > 5 ? ` (+${conflicts.length - 5} more)` : '');
16
+ const reason = `worktree has merge conflicts in ${listed}`;
17
+ log('ship', `not recovering ${branch}: ${reason} — worktree preserved`);
18
+ return { ok: false, reason };
19
+ }
20
+ const committed = await commitLeftoverBuildOutput({
21
+ run,
22
+ worktree,
23
+ branch,
24
+ issue: ctx.issue,
25
+ statusLines: recoveryState.statusLines,
26
+ log,
27
+ });
28
+ if (!committed.ok) {
29
+ log('ship', `not recovering ${branch}: ${committed.reason} — worktree preserved`);
30
+ return { ok: false, reason: committed.reason };
31
+ }
32
+ recoveryState = await inspectRecoveryState(worktree, run);
33
+ if (!recoveryState.clean) {
34
+ const reason = 'worktree still dirty after committing leftover build output';
35
+ log('ship', `not recovering ${branch}: ${reason} — worktree preserved`);
36
+ return { ok: false, reason };
37
+ }
38
+ }
39
+ if (recoveryState.landed || !recoveryState.ahead) {
40
+ const mergedLookup = await findMergedPR(octokit, owner, repoName, branch);
41
+ if (mergedLookup.status === 'error' && !recoveryState.landed) {
42
+ const reason = `could not determine whether ${branch} was already merged (${mergedLookup.detail})`;
43
+ log('ship', `not recovering ${branch}: ${reason}`);
44
+ return { ok: false, reason };
45
+ }
46
+ const mergedPr = mergedLookup.status === 'found' ? mergedLookup.prNumber : undefined;
47
+ if (mergedPr !== undefined || recoveryState.landed) {
48
+ log('ship', `not recovering ${branch}: already delivered${mergedPr !== undefined ? ` by merged PR #${mergedPr}` : ' (HEAD tree matches origin/main)'}`);
49
+ return { ok: true, prNumber: mergedPr, alreadyDelivered: true };
50
+ }
51
+ const reason = 'no commits ahead of origin/main';
52
+ log('ship', `not recovering ${branch}: ${reason}`);
53
+ return { ok: false, reason };
54
+ }
55
+ return undefined;
56
+ }
57
+ async function inspectRecoveryState(worktree, run) {
58
+ const [{ stdout: status }, { stdout: ahead }, landed] = await Promise.all([
59
+ run('git status --porcelain', { cwd: worktree }),
60
+ run('git rev-list --count origin/main..HEAD', { cwd: worktree }),
61
+ run('git diff --quiet origin/main..HEAD', { cwd: worktree }).then(() => true, () => false),
62
+ ]);
63
+ return {
64
+ clean: status.trim() === '',
65
+ ahead: Number.parseInt(ahead.trim(), 10) > 0,
66
+ landed,
67
+ statusLines: status
68
+ .split('\n')
69
+ .map((l) => l.trimEnd())
70
+ .filter((l) => l.trim() !== ''),
71
+ };
72
+ }
73
+ function conflictedPaths(statusLines) {
74
+ return statusLines
75
+ .filter((line) => {
76
+ const xy = line.slice(0, 2);
77
+ return xy.includes('U') || xy === 'AA' || xy === 'DD';
78
+ })
79
+ .map((line) => line.slice(3));
80
+ }
81
+ //# sourceMappingURL=ship-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-recovery.js","sourceRoot":"","sources":["../../src/phases/ship-recovery.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GASnC;IACC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC;IACrE,IAAI,CAAC;QACH,MAAM,GAAG,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,MAAM,EAAE,iFAAiF,CAAC,CAAC;IACjG,CAAC;IAED,IAAI,aAAa,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC9D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,SAAS,GAAG,eAAe,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;QAC7D,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,MAAM,GACV,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,SAAS,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtG,MAAM,MAAM,GAAG,mCAAmC,MAAM,EAAE,CAAC;YAC3D,GAAG,CAAC,MAAM,EAAE,kBAAkB,MAAM,KAAK,MAAM,uBAAuB,CAAC,CAAC;YACxE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC/B,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,yBAAyB,CAAC;YAChD,GAAG;YACH,QAAQ;YACR,MAAM;YACN,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,aAAa,CAAC,WAAW;YACtC,GAAG;SACJ,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,EAAE,kBAAkB,MAAM,KAAK,SAAS,CAAC,MAAM,uBAAuB,CAAC,CAAC;YAClF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;QACjD,CAAC;QACD,aAAa,GAAG,MAAM,oBAAoB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,6DAA6D,CAAC;YAC7E,GAAG,CAAC,MAAM,EAAE,kBAAkB,MAAM,KAAK,MAAM,uBAAuB,CAAC,CAAC;YACxE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;IACD,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC1E,IAAI,YAAY,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;YAC7D,MAAM,MAAM,GAAG,+BAA+B,MAAM,wBAAwB,YAAY,CAAC,MAAM,GAAG,CAAC;YACnG,GAAG,CAAC,MAAM,EAAE,kBAAkB,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;YACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC/B,CAAC;QACD,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,IAAI,QAAQ,KAAK,SAAS,IAAI,aAAa,CAAC,MAAM,EAAE,CAAC;YACnD,GAAG,CACD,MAAM,EACN,kBAAkB,MAAM,sBAAsB,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,QAAQ,EAAE,CAAC,CAAC,CAAC,kCAAkC,EAAE,CAC3I,CAAC;YACF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAClE,CAAC;QACD,MAAM,MAAM,GAAG,iCAAiC,CAAC;QACjD,GAAG,CAAC,MAAM,EAAE,kBAAkB,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,QAAgB,EAChB,GAAkB;IAElB,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACxE,GAAG,CAAC,wBAAwB,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;QAChD,GAAG,CAAC,wCAAwC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;QAChE,GAAG,CAAC,oCAAoC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,CAC/D,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACZ;KACF,CAAC,CAAC;IACH,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE;QAC3B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;QAC5C,MAAM;QACN,WAAW,EAAE,MAAM;aAChB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,WAAqB;IAC5C,OAAO,WAAW;SACf,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;QACf,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,OAAO,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;IACxD,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type CommandRunner } from './ship-git.js';
2
+ import type { ShipPhaseOptions } from './ship-options.js';
3
+ import type { ShipResult } from './ship-types.js';
4
+ export declare function pushReentry(ctx: {
5
+ run: CommandRunner;
6
+ worktree: string;
7
+ branch: string;
8
+ prNumber: number | undefined;
9
+ reentry: {
10
+ prNumber: number;
11
+ previousHeadSha?: string;
12
+ };
13
+ log: ShipPhaseOptions['log'];
14
+ }): Promise<{
15
+ stop: ShipResult;
16
+ } | {
17
+ watchRef: string;
18
+ headSha: string;
19
+ }>;
20
+ //# sourceMappingURL=ship-reentry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-reentry.d.ts","sourceRoot":"","sources":["../../src/phases/ship-reentry.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAsD,MAAM,eAAe,CAAC;AACvG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,wBAAsB,WAAW,CAAC,GAAG,EAAE;IACrC,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACxD,GAAG,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAyCxE"}
@@ -0,0 +1,47 @@
1
+ // packages/core/src/phases/ship-reentry.ts — SHIP re-entry push after a CI rework round
2
+ import { shellEscape } from '../utils/index.js';
3
+ import { describePushFailure, shortDetail, verifyRemoteHead } from './ship-git.js';
4
+ export async function pushReentry(ctx) {
5
+ const { run, worktree, branch, prNumber, reentry, log } = ctx;
6
+ if (prNumber !== reentry.prNumber) {
7
+ const reason = `re-entry expected open PR #${reentry.prNumber} for ${branch} but found ${prNumber === undefined ? 'none' : `#${prNumber}`}`;
8
+ log('ship', reason);
9
+ return { stop: { ok: false, reason } };
10
+ }
11
+ let localSha;
12
+ try {
13
+ localSha = (await run('git rev-parse HEAD', { cwd: worktree })).stdout.trim();
14
+ }
15
+ catch (err) {
16
+ const reason = `could not read local HEAD on re-entry (${shortDetail(err)})`;
17
+ log('ship', reason);
18
+ return { stop: { ok: false, prNumber, reason } };
19
+ }
20
+ if (localSha && localSha === reentry.previousHeadSha) {
21
+ const reason = `CI rework produced no new commit on ${branch}`;
22
+ log('ship', reason);
23
+ return { stop: { ok: false, prNumber, ciOutcome: 'failure', reason, headSha: localSha } };
24
+ }
25
+ try {
26
+ await run(`git push origin ${shellEscape(branch)}`, { cwd: worktree });
27
+ }
28
+ catch (err) {
29
+ const { kind, detail } = describePushFailure(err);
30
+ const reason = `re-entry push of ${branch} failed (${kind}): ${detail}`;
31
+ log('ship', reason);
32
+ return { stop: { ok: false, prNumber, reason } };
33
+ }
34
+ const remoteHead = await verifyRemoteHead(run, worktree, branch);
35
+ if (remoteHead.status !== 'match') {
36
+ const reason = remoteHead.status === 'mismatch'
37
+ ? `remote head ${remoteHead.remoteSha} does not match local HEAD ${remoteHead.localSha} for ${branch} after re-entry push`
38
+ : `could not verify the remote head for ${branch} after re-entry push (${remoteHead.detail})`;
39
+ log('ship', reason);
40
+ return { stop: { ok: false, prNumber, reason } };
41
+ }
42
+ const watchRef = remoteHead.remoteSha;
43
+ const headSha = remoteHead.remoteSha;
44
+ log('ship', `re-entry pushed ${branch} @ ${headSha}`);
45
+ return { watchRef, headSha };
46
+ }
47
+ //# sourceMappingURL=ship-reentry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-reentry.js","sourceRoot":"","sources":["../../src/phases/ship-reentry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { PreviewCheckResult } from '../checkers/preview-check.js';
2
+ import type { CiFailureEvidence } from '../types/index.js';
3
+ import type { InfraRerunOutcome } from '../utils/ci-watch.js';
4
+ export interface ShipResult {
5
+ ok: boolean;
6
+ prNumber?: number;
7
+ denied?: boolean;
8
+ deniedReason?: string;
9
+ reason?: string;
10
+ ciOutcome?: InfraRerunOutcome;
11
+ /** Bounded evidence for a CI-watch 'failure' (#2814). */
12
+ ciFailure?: CiFailureEvidence;
13
+ /** True when the branch's content had already landed on main (e.g. a retry after a
14
+ * squash merge) — nothing was pushed and no PR was created (#520). */
15
+ alreadyDelivered?: boolean;
16
+ /** The head SHA watched on a CI rework re-entry (#2816). */
17
+ headSha?: string;
18
+ /** Draft mode (#3449): mark-ready skipped; callers must not merge. */
19
+ draft?: boolean;
20
+ /** CI watch timed out before a verdict (#3569): the PR was left as draft. */
21
+ ciPending?: boolean;
22
+ previewCheck?: PreviewCheckResult;
23
+ }
24
+ /** The result of asking GitHub whether a PR exists for a branch. `error` is never collapsed
25
+ * into `absent` — an unanswered lookup makes ship fail closed rather than open a duplicate
26
+ * PR (#641). */
27
+ export type PrLookup = {
28
+ status: 'found';
29
+ prNumber: number;
30
+ } | {
31
+ status: 'absent';
32
+ } | {
33
+ status: 'error';
34
+ detail: string;
35
+ };
36
+ //# sourceMappingURL=ship-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-types.d.ts","sourceRoot":"","sources":["../../src/phases/ship-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE9D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,yDAAyD;IACzD,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B;2EACuE;IACvE,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6EAA6E;IAC7E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,kBAAkB,CAAC;CACnC;AAED;;iBAEiB;AACjB,MAAM,MAAM,QAAQ,GAClB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ship-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ship-types.js","sourceRoot":"","sources":["../../src/phases/ship-types.ts"],"names":[],"mappings":""}
@@ -1,114 +1,7 @@
1
- import { type WorkKey } from '../work/work-key.js';
2
- import type { Octokit } from '@octokit/rest';
3
- import type { ApprovalGate } from '../approvals/index.js';
4
- import { type LifecycleBus } from '../bus/index.js';
5
- import type { EventKind } from '../events/kinds.js';
6
- import { type WalkthroughShipOpts } from './ship-walkthrough.js';
7
- import { type StackPosition } from './stack-order.js';
8
- import type { ReviewRouting } from '../review/routing.js';
9
- import { type CommandRunner } from './ship-git.js';
10
- import type { PreviewCheckResult } from '../checkers/preview-check.js';
11
- import { type PreviewGate } from './ship-preview.js';
12
- import type { CheckSummary, CiFailureEvidence } from '../types/index.js';
13
- import { type InfraRerunOutcome, watchChecksWithInfraRerun } from '../utils/ci-watch.js';
14
- import type { WorkRequest } from '../work/index.js';
15
- export interface ShipResult {
16
- ok: boolean;
17
- prNumber?: number;
18
- denied?: boolean;
19
- deniedReason?: string;
20
- reason?: string;
21
- ciOutcome?: InfraRerunOutcome;
22
- /** Bounded evidence for a CI-watch 'failure' (#2814). */
23
- ciFailure?: CiFailureEvidence;
24
- /** True when the branch's content had already landed on main (e.g. a retry after a
25
- * squash merge) — nothing was pushed and no PR was created (#520). */
26
- alreadyDelivered?: boolean;
27
- /** The head SHA watched on a CI rework re-entry (#2816). */
28
- headSha?: string;
29
- /** Draft mode (#3449): mark-ready skipped; callers must not merge. */
30
- draft?: boolean;
31
- /** CI watch timed out before a verdict (#3569): the PR was left as draft. */
32
- ciPending?: boolean;
33
- previewCheck?: PreviewCheckResult;
34
- }
35
- export declare function shipPhase(opts: Parameters<typeof shipPhaseImpl>[0]): Promise<ShipResult>;
36
- declare function shipPhaseImpl(opts: {
37
- issue: WorkKey;
38
- repo: string;
39
- worktree: string;
40
- branch: string;
41
- octokit: Octokit;
42
- watchCI?: boolean;
43
- /** Resolved pr.footer; undefined uses the default, empty string omits it. */
44
- footer?: string;
45
- /** Stop at the draft PR: skip mark-ready (#3449). */
46
- draft?: boolean;
47
- /** Post the evidence pack as a PR comment (pr.evidenceComment); default off. */
48
- evidenceComment?: boolean;
49
- log: (type: EventKind, msg: string) => void;
50
- run?: CommandRunner;
51
- /** Runs the gh rerun argv for the CI infra rescue (#2365); default runCommand. */
52
- rerun?: (argv: readonly string[]) => Promise<{
53
- ok: boolean;
54
- }>;
55
- approvalGate?: ApprovalGate;
56
- checkSummary?: CheckSummary;
57
- specPath?: string;
58
- eventsFile?: string;
59
- startedAt?: string;
60
- logsDir?: string;
61
- reworkRounds?: number;
62
- /** PR classifier decision (#1724), rendered into the evidence pack. */
63
- reviewRouting?: ReviewRouting;
64
- /** Model pins that were not honored (#2511), rendered into the evidence pack. */
65
- pinNotes?: string[];
66
- /** The run's resolved work request; when its kind is not 'github-issue', the PR
67
- * title/body come from it instead of fetching the (nonexistent) issue (#507). */
68
- work?: Pick<WorkRequest, 'id' | 'kind' | 'title' | 'reference'>;
69
- /** The ADR-0147 slice this run ships; titles the PR `slice k/n` and only the final slice closes the issue. */
70
- slice?: {
71
- index: number;
72
- count: number;
73
- };
74
- /** Stack-mode (ADR-0161) position: the PR opens on `stack.base` and its body names the stack order. Ignored for inline work. */
75
- stack?: StackPosition;
76
- /** PR base for a non-stack run started from another branch (#3764); default main. */
77
- baseBranch?: string;
78
- /** Lane id stamped onto emitted lifecycle events; defaults to `issue-<issue>` (#591). */
79
- laneId?: string;
80
- /** Lifecycle bus to emit onto; defaults to the process-wide `lifecycleBus` (#591). */
81
- bus?: LifecycleBus;
82
- /** origin/<branch> SHA recorded at worktree creation (#1868). When set, the new-PR push
83
- * replaces that stale head under a lease on this SHA, and fails closed if the remote moved (#1869). */
84
- recordedRemoteSha?: string;
85
- /** SHIP re-entry after a CI rework round (#2816): same open PR, plain push, watch the pushed SHA. */
86
- reentry?: {
87
- prNumber: number;
88
- previousHeadSha?: string;
89
- };
90
- /** CI watch deadline (#3569); default DEFAULT_CI_DEADLINE_MS. */
91
- ciDeadlineMs?: number;
92
- walkthrough?: WalkthroughShipOpts['walkthrough'];
93
- previewGate?: PreviewGate;
94
- ciWatch?: typeof watchChecksWithInfraRerun;
95
- }): Promise<ShipResult>;
96
- export declare function findOpenPR(octokit: Octokit, owner: string, repo: string, branch: string): Promise<PrLookup>;
97
- export declare function findMergedPR(octokit: Octokit, owner: string, repo: string, branch: string): Promise<PrLookup>;
98
- /** A `pulls.create` 422 whose message says the PR already exists — recoverable by re-querying,
99
- * unlike every other 422 (e.g. "No commits between ..."), which still propagates (#641). */
100
- export declare function isPullAlreadyExistsError(err: unknown): boolean;
101
- /** The result of asking GitHub whether a PR exists for a branch. `error` is never collapsed
102
- * into `absent` — an unanswered lookup makes ship fail closed rather than open a duplicate
103
- * PR (#641). */
104
- export type PrLookup = {
105
- status: 'found';
106
- prNumber: number;
107
- } | {
108
- status: 'absent';
109
- } | {
110
- status: 'error';
111
- detail: string;
112
- };
113
- export {};
1
+ import { type ShipPhaseOptions } from './ship-options.js';
2
+ import { findMergedPR, findOpenPR } from './ship-pr-lookup.js';
3
+ import type { PrLookup, ShipResult } from './ship-types.js';
4
+ export { findMergedPR, findOpenPR };
5
+ export type { PrLookup, ShipResult };
6
+ export declare function shipPhase(opts: ShipPhaseOptions): Promise<ShipResult>;
114
7
  //# sourceMappingURL=ship.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ship.d.ts","sourceRoot":"","sources":["../../src/phases/ship.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ship.d.ts","sourceRoot":"","sources":["../../src/phases/ship.ts"],"names":[],"mappings":"AAeA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/D,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG5D,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;AACpC,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;AAIrC,wBAAsB,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC,CAiB3E"}