ghostrail 0.21.0 → 0.23.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/board/page.d.ts.map +1 -1
- package/dist/board/page.js +71 -13
- package/dist/board/page.js.map +1 -1
- package/dist/board/server.d.ts +10 -0
- package/dist/board/server.d.ts.map +1 -1
- package/dist/board/server.js +24 -0
- package/dist/board/server.js.map +1 -1
- package/dist/cli/commands.d.ts +74 -2
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +183 -18
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +11 -2
- package/dist/commands/help.js.map +1 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +19 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +13 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/dashboard/page.d.ts +0 -14
- package/dist/dashboard/page.d.ts.map +1 -1
- package/dist/dashboard/page.js +107 -9
- package/dist/dashboard/page.js.map +1 -1
- package/dist/dashboard/routes.d.ts +4 -0
- package/dist/dashboard/routes.d.ts.map +1 -1
- package/dist/dashboard/routes.js +4 -0
- package/dist/dashboard/routes.js.map +1 -1
- package/dist/dashboard/server.d.ts +29 -0
- package/dist/dashboard/server.d.ts.map +1 -1
- package/dist/dashboard/server.js +75 -4
- package/dist/dashboard/server.js.map +1 -1
- package/dist/factory/build.d.ts +6 -0
- package/dist/factory/build.d.ts.map +1 -1
- package/dist/factory/build.js +23 -0
- package/dist/factory/build.js.map +1 -1
- package/dist/loop/branch.d.ts +8 -1
- package/dist/loop/branch.d.ts.map +1 -1
- package/dist/loop/branch.js +14 -2
- package/dist/loop/branch.js.map +1 -1
- package/dist/loop/engine.d.ts.map +1 -1
- package/dist/loop/engine.js +57 -5
- package/dist/loop/engine.js.map +1 -1
- package/dist/loop/next-tick.d.ts +43 -5
- package/dist/loop/next-tick.d.ts.map +1 -1
- package/dist/loop/next-tick.js +68 -18
- package/dist/loop/next-tick.js.map +1 -1
- package/dist/loop/ports.d.ts +4 -1
- package/dist/loop/ports.d.ts.map +1 -1
- package/dist/loop/recurrence.d.ts +43 -0
- package/dist/loop/recurrence.d.ts.map +1 -0
- package/dist/loop/recurrence.js +92 -0
- package/dist/loop/recurrence.js.map +1 -0
- package/dist/loop/schedule.d.ts +11 -2
- package/dist/loop/schedule.d.ts.map +1 -1
- package/dist/loop/schedule.js +3 -1
- package/dist/loop/schedule.js.map +1 -1
- package/dist/publish/gh.d.ts +43 -2
- package/dist/publish/gh.d.ts.map +1 -1
- package/dist/publish/gh.js +80 -2
- package/dist/publish/gh.js.map +1 -1
- package/dist/publish/githost.d.ts +18 -1
- package/dist/publish/githost.d.ts.map +1 -1
- package/dist/publish/githost.js +13 -0
- package/dist/publish/githost.js.map +1 -1
- package/dist/publish/index.d.ts +1 -1
- package/dist/publish/index.d.ts.map +1 -1
- package/dist/publish/index.js +1 -1
- package/dist/publish/index.js.map +1 -1
- package/dist/release/index.d.ts +2 -0
- package/dist/release/index.d.ts.map +1 -0
- package/dist/release/index.js +2 -0
- package/dist/release/index.js.map +1 -0
- package/dist/release/release.d.ts +67 -0
- package/dist/release/release.d.ts.map +1 -0
- package/dist/release/release.js +193 -0
- package/dist/release/release.js.map +1 -0
- package/dist/respond/ci-fix-queue.d.ts +40 -0
- package/dist/respond/ci-fix-queue.d.ts.map +1 -0
- package/dist/respond/ci-fix-queue.js +74 -0
- package/dist/respond/ci-fix-queue.js.map +1 -0
- package/dist/respond/index.d.ts +2 -1
- package/dist/respond/index.d.ts.map +1 -1
- package/dist/respond/index.js +2 -1
- package/dist/respond/index.js.map +1 -1
- package/dist/respond/merge.d.ts.map +1 -1
- package/dist/respond/merge.js +14 -1
- package/dist/respond/merge.js.map +1 -1
- package/dist/respond/respond.d.ts +26 -1
- package/dist/respond/respond.d.ts.map +1 -1
- package/dist/respond/respond.js +154 -9
- package/dist/respond/respond.js.map +1 -1
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/skill/ghostrail/SKILL.md +15 -4
- package/templates/code/ghostrail.toml +3 -0
- package/templates/code/prompts/release.md +40 -0
- package/templates/code/prompts/respond.md +2 -1
- package/templates/content/prompts/respond.md +3 -1
package/dist/loop/ports.d.ts
CHANGED
|
@@ -43,7 +43,10 @@ export interface Source {
|
|
|
43
43
|
listComments(item: WorkItem): Promise<Comment[]>;
|
|
44
44
|
/** Hand the item back to a human (reassign) when a decision is needed. */
|
|
45
45
|
reassignToHuman(item: WorkItem): Promise<void>;
|
|
46
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* Return the item to the eligible pool (e.g. after a failure, or after a
|
|
48
|
+
* recurring item's `done` outcome so it can run again on its schedule).
|
|
49
|
+
*/
|
|
47
50
|
reset(item: WorkItem): Promise<void>;
|
|
48
51
|
}
|
|
49
52
|
/** A sub-issue to create under a parent during triage. */
|
package/dist/loop/ports.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/loop/ports.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEnE;;;;;;GAMG;AAEH,2CAA2C;AAC3C,MAAM,WAAW,QAAQ;IACvB,yCAAyC;IACzC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,mEAAmE;AACnE,MAAM,WAAW,OAAO;IACtB,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,4DAA4D;AAC5D,MAAM,WAAW,MAAM;IACrB,kEAAkE;IAClE,YAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACpC;;;OAGG;IACH,KAAK,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,2EAA2E;IAC3E,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,0EAA0E;IAC1E,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../src/loop/ports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Comment, WorkItem } from "./ports.js";
|
|
2
|
+
/** A parsed recurrence: how often a recurring item should be re-run. */
|
|
3
|
+
export interface Recurrence {
|
|
4
|
+
/** Human-readable label for logs and tracker comments, e.g. "weekly" or "every-3d". */
|
|
5
|
+
label: string;
|
|
6
|
+
intervalMs: number;
|
|
7
|
+
}
|
|
8
|
+
/** The title and description text a recurrence tag is looked for in. */
|
|
9
|
+
export declare function issueText(item: Pick<WorkItem, "title" | "description">): string;
|
|
10
|
+
/**
|
|
11
|
+
* Find a recurrence hashtag anywhere in `text` and parse it into an interval.
|
|
12
|
+
* Returns undefined when no recurrence tag is present, or an `every-<n><unit>`
|
|
13
|
+
* tag whose amount is not a positive integer.
|
|
14
|
+
*/
|
|
15
|
+
export declare function parseRecurrence(text: string): Recurrence | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* The branch tag for the cycle a recurring item is currently in, derived from
|
|
18
|
+
* the "next eligible" timestamp that made it due, as `YYYYMMDD-HHMM`.
|
|
19
|
+
*
|
|
20
|
+
* A new timestamp is only recorded on a `done` outcome, so this is stable for
|
|
21
|
+
* a whole cycle: every attempt at that cycle, retries included, builds the
|
|
22
|
+
* same branch and keeps the publisher's force-push recovery. The next cycle
|
|
23
|
+
* carries a later timestamp and so gets a branch of its own, which is what
|
|
24
|
+
* stops it colliding with the PR the previous cycle left open (TJ-1689).
|
|
25
|
+
*
|
|
26
|
+
* Minute resolution is enough to keep two cycles apart: the shortest interval
|
|
27
|
+
* a tag can ask for is an hour.
|
|
28
|
+
*/
|
|
29
|
+
export declare function cycleTag(scheduledAt: Date): string;
|
|
30
|
+
/** The timestamp a recurring item next becomes eligible, `interval` after `from`. */
|
|
31
|
+
export declare function nextDueAt(recurrence: Recurrence, from: Date): Date;
|
|
32
|
+
/** Whether an item scheduled for `scheduledAt` is due to run as of `now`. Undefined means "never scheduled", i.e. due. */
|
|
33
|
+
export declare function isDue(scheduledAt: Date | undefined, now: Date): boolean;
|
|
34
|
+
/** The hidden marker embedding a recurring item's next-eligible timestamp in a comment. */
|
|
35
|
+
export declare function recurrenceMarker(scheduledAt: Date): string;
|
|
36
|
+
/** The tracker comment body recording that a recurring item ran and when it is next due. */
|
|
37
|
+
export declare function recurrenceComment(recurrence: Recurrence, scheduledAt: Date): string;
|
|
38
|
+
/**
|
|
39
|
+
* The most recent "next eligible" timestamp recorded across `comments`, or
|
|
40
|
+
* undefined if none carry the marker (or none parse as a valid date).
|
|
41
|
+
*/
|
|
42
|
+
export declare function lastScheduledAt(comments: readonly Comment[]): Date | undefined;
|
|
43
|
+
//# sourceMappingURL=recurrence.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurrence.d.ts","sourceRoot":"","sources":["../../src/loop/recurrence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEpD,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,uFAAuF;IACvF,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAkBD,wEAAwE;AACxE,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,aAAa,CAAC,GAAG,MAAM,CAE/E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAapE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,CAGlD;AAED,qFAAqF;AACrF,wBAAgB,SAAS,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,CAElE;AAED,0HAA0H;AAC1H,wBAAgB,KAAK,CAAC,WAAW,EAAE,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAEvE;AAID,2FAA2F;AAC3F,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,IAAI,GAAG,MAAM,CAE1D;AAED,4FAA4F;AAC5F,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,GAAG,MAAM,CAEnF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,IAAI,GAAG,SAAS,CAY9E"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
const CANNED_INTERVALS_MS = {
|
|
2
|
+
daily: 24 * 3_600_000,
|
|
3
|
+
weekly: 7 * 24 * 3_600_000,
|
|
4
|
+
monthly: 30 * 24 * 3_600_000,
|
|
5
|
+
};
|
|
6
|
+
const UNIT_MS = {
|
|
7
|
+
h: 3_600_000,
|
|
8
|
+
d: 24 * 3_600_000,
|
|
9
|
+
w: 7 * 24 * 3_600_000,
|
|
10
|
+
};
|
|
11
|
+
// #daily, #weekly, #monthly, or #every-<n><h|d|w> (e.g. #every-3d), case
|
|
12
|
+
// insensitive. The trailing \b keeps "#dailymeeting" from matching "#daily".
|
|
13
|
+
const RECURRENCE_TAG = /#(daily|weekly|monthly|every-(\d+)(h|d|w))\b/i;
|
|
14
|
+
/** The title and description text a recurrence tag is looked for in. */
|
|
15
|
+
export function issueText(item) {
|
|
16
|
+
return `${item.title}\n${item.description ?? ""}`;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Find a recurrence hashtag anywhere in `text` and parse it into an interval.
|
|
20
|
+
* Returns undefined when no recurrence tag is present, or an `every-<n><unit>`
|
|
21
|
+
* tag whose amount is not a positive integer.
|
|
22
|
+
*/
|
|
23
|
+
export function parseRecurrence(text) {
|
|
24
|
+
const match = RECURRENCE_TAG.exec(text);
|
|
25
|
+
if (match === null)
|
|
26
|
+
return undefined;
|
|
27
|
+
const canned = match[1]?.toLowerCase();
|
|
28
|
+
if (canned !== undefined && canned in CANNED_INTERVALS_MS) {
|
|
29
|
+
return { label: canned, intervalMs: CANNED_INTERVALS_MS[canned] };
|
|
30
|
+
}
|
|
31
|
+
const amount = Number(match[2]);
|
|
32
|
+
const unit = match[3]?.toLowerCase();
|
|
33
|
+
if (!Number.isSafeInteger(amount) || amount <= 0 || unit === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
return { label: `every-${amount}${unit}`, intervalMs: amount * UNIT_MS[unit] };
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The branch tag for the cycle a recurring item is currently in, derived from
|
|
39
|
+
* the "next eligible" timestamp that made it due, as `YYYYMMDD-HHMM`.
|
|
40
|
+
*
|
|
41
|
+
* A new timestamp is only recorded on a `done` outcome, so this is stable for
|
|
42
|
+
* a whole cycle: every attempt at that cycle, retries included, builds the
|
|
43
|
+
* same branch and keeps the publisher's force-push recovery. The next cycle
|
|
44
|
+
* carries a later timestamp and so gets a branch of its own, which is what
|
|
45
|
+
* stops it colliding with the PR the previous cycle left open (TJ-1689).
|
|
46
|
+
*
|
|
47
|
+
* Minute resolution is enough to keep two cycles apart: the shortest interval
|
|
48
|
+
* a tag can ask for is an hour.
|
|
49
|
+
*/
|
|
50
|
+
export function cycleTag(scheduledAt) {
|
|
51
|
+
const iso = scheduledAt.toISOString();
|
|
52
|
+
return `${iso.slice(0, 10).replace(/-/g, "")}-${iso.slice(11, 16).replace(":", "")}`;
|
|
53
|
+
}
|
|
54
|
+
/** The timestamp a recurring item next becomes eligible, `interval` after `from`. */
|
|
55
|
+
export function nextDueAt(recurrence, from) {
|
|
56
|
+
return new Date(from.getTime() + recurrence.intervalMs);
|
|
57
|
+
}
|
|
58
|
+
/** Whether an item scheduled for `scheduledAt` is due to run as of `now`. Undefined means "never scheduled", i.e. due. */
|
|
59
|
+
export function isDue(scheduledAt, now) {
|
|
60
|
+
return scheduledAt === undefined || now.getTime() >= scheduledAt.getTime();
|
|
61
|
+
}
|
|
62
|
+
const RECUR_MARKER_RE = /<!-- ghostrail:recur next=([^ >]+) -->/;
|
|
63
|
+
/** The hidden marker embedding a recurring item's next-eligible timestamp in a comment. */
|
|
64
|
+
export function recurrenceMarker(scheduledAt) {
|
|
65
|
+
return `<!-- ghostrail:recur next=${scheduledAt.toISOString()} -->`;
|
|
66
|
+
}
|
|
67
|
+
/** The tracker comment body recording that a recurring item ran and when it is next due. */
|
|
68
|
+
export function recurrenceComment(recurrence, scheduledAt) {
|
|
69
|
+
return `Recurring item (${recurrence.label}): done for now, next eligible around ${scheduledAt.toISOString()}.\n\n${recurrenceMarker(scheduledAt)}`;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The most recent "next eligible" timestamp recorded across `comments`, or
|
|
73
|
+
* undefined if none carry the marker (or none parse as a valid date).
|
|
74
|
+
*/
|
|
75
|
+
export function lastScheduledAt(comments) {
|
|
76
|
+
let latest;
|
|
77
|
+
for (const comment of comments) {
|
|
78
|
+
const match = RECUR_MARKER_RE.exec(comment.body);
|
|
79
|
+
if (match === null)
|
|
80
|
+
continue;
|
|
81
|
+
const iso = match[1];
|
|
82
|
+
if (iso === undefined)
|
|
83
|
+
continue;
|
|
84
|
+
const parsed = new Date(iso);
|
|
85
|
+
if (Number.isNaN(parsed.getTime()))
|
|
86
|
+
continue;
|
|
87
|
+
if (latest === undefined || parsed.getTime() > latest.getTime())
|
|
88
|
+
latest = parsed;
|
|
89
|
+
}
|
|
90
|
+
return latest;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=recurrence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurrence.js","sourceRoot":"","sources":["../../src/loop/recurrence.ts"],"names":[],"mappings":"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"}
|
package/dist/loop/schedule.d.ts
CHANGED
|
@@ -3,12 +3,21 @@
|
|
|
3
3
|
* without a clock, a tracker, or a daemon. See specs/watch-all-passes.spec.md.
|
|
4
4
|
*/
|
|
5
5
|
/** The passes `watch` can run, in the order a tick runs them. */
|
|
6
|
-
export declare const PASS_ORDER: readonly ["fix", "respond", "triage"];
|
|
6
|
+
export declare const PASS_ORDER: readonly ["fix", "respond", "triage", "release"];
|
|
7
7
|
export type PassName = (typeof PASS_ORDER)[number];
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* A schedulable pass's interval, in ms. Absent means the pass is not scheduled.
|
|
10
|
+
*
|
|
11
|
+
* `release` has no interval of its own: it is `true` when wired up (a
|
|
12
|
+
* `[release]` section is configured) and, unlike `respond`/`triage`, runs on
|
|
13
|
+
* every tick once wired, since it only ever does real work in response to an
|
|
14
|
+
* explicit request and checking for one costs nothing on the ticks that have
|
|
15
|
+
* none.
|
|
16
|
+
*/
|
|
9
17
|
export interface PassIntervals {
|
|
10
18
|
respond?: number;
|
|
11
19
|
triage?: number;
|
|
20
|
+
release?: true;
|
|
12
21
|
}
|
|
13
22
|
/** When each pass last finished, in epoch millis. Absent means it has never run. */
|
|
14
23
|
export interface PassLastRun {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/loop/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iEAAiE;AACjE,eAAO,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/loop/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iEAAiE;AACjE,eAAO,MAAM,UAAU,kDAAmD,CAAC;AAC3E,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnD;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,IAAI,CAAC;CAChB;AAED,oFAAoF;AACpF,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,aAAa,CAAC;IACzB,SAAS,EAAE,WAAW,CAAC;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,QAAQ,EAAE,CAU3D"}
|
package/dist/loop/schedule.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* without a clock, a tracker, or a daemon. See specs/watch-all-passes.spec.md.
|
|
4
4
|
*/
|
|
5
5
|
/** The passes `watch` can run, in the order a tick runs them. */
|
|
6
|
-
export const PASS_ORDER = ["fix", "respond", "triage"];
|
|
6
|
+
export const PASS_ORDER = ["fix", "respond", "triage", "release"];
|
|
7
7
|
/**
|
|
8
8
|
* The passes due on this tick, in `PASS_ORDER`.
|
|
9
9
|
*
|
|
@@ -23,6 +23,8 @@ export function duePasses(input) {
|
|
|
23
23
|
if (last === undefined || input.now - last >= interval)
|
|
24
24
|
due.push(pass);
|
|
25
25
|
}
|
|
26
|
+
if (input.intervals.release === true)
|
|
27
|
+
due.push("release");
|
|
26
28
|
return due;
|
|
27
29
|
}
|
|
28
30
|
//# sourceMappingURL=schedule.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/loop/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iEAAiE;AACjE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../src/loop/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,iEAAiE;AACjE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AA8B3E;;;;;;;;GAQG;AACH,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,GAAG,GAAe,CAAC,KAAK,CAAC,CAAC;IAChC,KAAK,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAU,EAAE,CAAC;QAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,QAAQ,KAAK,SAAS;YAAE,SAAS;QACrC,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,GAAG,IAAI,IAAI,QAAQ;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,CAAC,OAAO,KAAK,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/publish/gh.d.ts
CHANGED
|
@@ -32,6 +32,29 @@ export declare function ghCreateLabelArgs(label: string): string[];
|
|
|
32
32
|
* the head branch, rather than rewriting either branch's history).
|
|
33
33
|
*/
|
|
34
34
|
export declare function ghMergePrArgs(prNumber: number): string[];
|
|
35
|
+
/**
|
|
36
|
+
* How long to wait for GitHub to report the head we just pushed, and how often
|
|
37
|
+
* to ask. GitHub recomputes a PR's mergeability asynchronously; until it does,
|
|
38
|
+
* it answers with whatever it worked out for the previous head, which for the
|
|
39
|
+
* resolve-conflicts flow is the conflicted state that flow just fixed
|
|
40
|
+
* (TJ-1684). Seconds in practice, so the cap is generous rather than tuned.
|
|
41
|
+
*/
|
|
42
|
+
export declare const MERGE_HEAD_TIMEOUT_MS = 60000;
|
|
43
|
+
export declare const MERGE_HEAD_POLL_MS = 2000;
|
|
44
|
+
/** What `gh pr view --json headRefOid,mergeable` reports, as far as we use it. */
|
|
45
|
+
export interface PrHead {
|
|
46
|
+
headRefOid?: string;
|
|
47
|
+
mergeable?: string;
|
|
48
|
+
}
|
|
49
|
+
/** Parse `gh pr view --json headRefOid,mergeable`, tolerating anything unexpected. */
|
|
50
|
+
export declare function parsePrHead(stdout: string): PrHead;
|
|
51
|
+
/**
|
|
52
|
+
* Whether the forge has caught up with `expectedHeadSha`: it reports that exact
|
|
53
|
+
* commit as the PR's head, and has finished working out what merging it would
|
|
54
|
+
* do. `UNKNOWN` is GitHub still computing, which is a different answer from
|
|
55
|
+
* "conflicting" and must not be mistaken for one.
|
|
56
|
+
*/
|
|
57
|
+
export declare function hasCaughtUp(head: PrHead, expectedHeadSha: string): boolean;
|
|
35
58
|
/** Build `gh pr create` args from a PR spec (one `--label` per label, in order). */
|
|
36
59
|
export declare function ghOpenPrArgs(spec: PrSpec): string[];
|
|
37
60
|
/** Parse `gh pr list --json number,url,headRefName` output into open PRs. */
|
|
@@ -44,14 +67,21 @@ export declare function parsePrStatus(stdout: string): PrStatus;
|
|
|
44
67
|
export declare class GhHost implements GitHost {
|
|
45
68
|
private readonly run;
|
|
46
69
|
private readonly repoSlug?;
|
|
70
|
+
private readonly sleep;
|
|
71
|
+
private readonly now;
|
|
47
72
|
/**
|
|
48
73
|
* @param run The `gh` runner.
|
|
49
74
|
* @param repoSlug Optional `owner/repo`. When set, every `gh` invocation is
|
|
50
75
|
* scoped to it with `--repo`, so commands resolve the target repo from the
|
|
51
76
|
* GitHub API rather than a local checkout. Required for the fully-ephemeral
|
|
52
77
|
* flow, where the host has no clone.
|
|
78
|
+
* @param clock Injected only so the merge wait (TJ-1684) can be tested
|
|
79
|
+
* without real time passing.
|
|
53
80
|
*/
|
|
54
|
-
constructor(run: GhRunner, repoSlug?: string
|
|
81
|
+
constructor(run: GhRunner, repoSlug?: string, clock?: {
|
|
82
|
+
sleep?: (ms: number) => Promise<void>;
|
|
83
|
+
now?: () => number;
|
|
84
|
+
});
|
|
55
85
|
openPr(spec: PrSpec): Promise<PrRef>;
|
|
56
86
|
/**
|
|
57
87
|
* Create `label` when the repo does not have it yet.
|
|
@@ -81,7 +111,18 @@ export declare class GhHost implements GitHost {
|
|
|
81
111
|
listComments(prNumber: number): Promise<PrComment[]>;
|
|
82
112
|
postComment(prNumber: number, body: string): Promise<void>;
|
|
83
113
|
getPrStatus(prNumber: number): Promise<PrStatus>;
|
|
84
|
-
mergePr(prNumber: number): Promise<void>;
|
|
114
|
+
mergePr(prNumber: number, expectedHeadSha?: string): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* Block until GitHub reports `expectedHeadSha` as the PR's head with a
|
|
117
|
+
* settled mergeability, or the timeout runs out.
|
|
118
|
+
*
|
|
119
|
+
* A timeout does not throw. Everything this guards against is GitHub being
|
|
120
|
+
* slow, and the merge that follows reports its own failure perfectly well;
|
|
121
|
+
* refusing to even attempt it would turn a slow answer into a worse outcome
|
|
122
|
+
* than the bug this fixes. A read that fails is treated the same way: keep
|
|
123
|
+
* waiting, then merge and let the merge speak.
|
|
124
|
+
*/
|
|
125
|
+
private waitForHead;
|
|
85
126
|
private exec;
|
|
86
127
|
}
|
|
87
128
|
//# sourceMappingURL=gh.d.ts.map
|
package/dist/publish/gh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gh.d.ts","sourceRoot":"","sources":["../../src/publish/gh.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAGlG,2EAA2E;AAC3E,MAAM,MAAM,QAAQ,GAAG,CACrB,IAAI,EAAE,SAAS,MAAM,EAAE,KACpB,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAEnE;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAUhE;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,WAAW,CAAC;AAC9C,eAAO,MAAM,2BAA2B,oCAAoC,CAAC;AAE7E,iFAAiF;AACjF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAUzD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAExD;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBnD;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAYxD;AAED,+DAA+D;AAC/D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,CAqB5D;AAqCD,qGAAqG;AACrG,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CActD;AAWD,sEAAsE;AACtE,qBAAa,MAAO,YAAW,OAAO;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAW;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IAEnC
|
|
1
|
+
{"version":3,"file":"gh.d.ts","sourceRoot":"","sources":["../../src/publish/gh.ts"],"names":[],"mappings":"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"}
|
package/dist/publish/gh.js
CHANGED
|
@@ -51,6 +51,42 @@ export function ghCreateLabelArgs(label) {
|
|
|
51
51
|
export function ghMergePrArgs(prNumber) {
|
|
52
52
|
return ["pr", "merge", String(prNumber), "--merge"];
|
|
53
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* How long to wait for GitHub to report the head we just pushed, and how often
|
|
56
|
+
* to ask. GitHub recomputes a PR's mergeability asynchronously; until it does,
|
|
57
|
+
* it answers with whatever it worked out for the previous head, which for the
|
|
58
|
+
* resolve-conflicts flow is the conflicted state that flow just fixed
|
|
59
|
+
* (TJ-1684). Seconds in practice, so the cap is generous rather than tuned.
|
|
60
|
+
*/
|
|
61
|
+
export const MERGE_HEAD_TIMEOUT_MS = 60_000;
|
|
62
|
+
export const MERGE_HEAD_POLL_MS = 2_000;
|
|
63
|
+
/** Parse `gh pr view --json headRefOid,mergeable`, tolerating anything unexpected. */
|
|
64
|
+
export function parsePrHead(stdout) {
|
|
65
|
+
try {
|
|
66
|
+
const parsed = JSON.parse(stdout);
|
|
67
|
+
if (typeof parsed !== "object" || parsed === null)
|
|
68
|
+
return {};
|
|
69
|
+
const record = parsed;
|
|
70
|
+
const headRefOid = record.headRefOid;
|
|
71
|
+
const mergeable = record.mergeable;
|
|
72
|
+
return {
|
|
73
|
+
...(typeof headRefOid === "string" ? { headRefOid } : {}),
|
|
74
|
+
...(typeof mergeable === "string" ? { mergeable } : {}),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
return {};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Whether the forge has caught up with `expectedHeadSha`: it reports that exact
|
|
83
|
+
* commit as the PR's head, and has finished working out what merging it would
|
|
84
|
+
* do. `UNKNOWN` is GitHub still computing, which is a different answer from
|
|
85
|
+
* "conflicting" and must not be mistaken for one.
|
|
86
|
+
*/
|
|
87
|
+
export function hasCaughtUp(head, expectedHeadSha) {
|
|
88
|
+
return head.headRefOid === expectedHeadSha && head.mergeable !== "UNKNOWN";
|
|
89
|
+
}
|
|
54
90
|
/** Build `gh pr create` args from a PR spec (one `--label` per label, in order). */
|
|
55
91
|
export function ghOpenPrArgs(spec) {
|
|
56
92
|
const args = [
|
|
@@ -172,16 +208,22 @@ function safeJsonArray(text) {
|
|
|
172
208
|
export class GhHost {
|
|
173
209
|
run;
|
|
174
210
|
repoSlug;
|
|
211
|
+
sleep;
|
|
212
|
+
now;
|
|
175
213
|
/**
|
|
176
214
|
* @param run The `gh` runner.
|
|
177
215
|
* @param repoSlug Optional `owner/repo`. When set, every `gh` invocation is
|
|
178
216
|
* scoped to it with `--repo`, so commands resolve the target repo from the
|
|
179
217
|
* GitHub API rather than a local checkout. Required for the fully-ephemeral
|
|
180
218
|
* flow, where the host has no clone.
|
|
219
|
+
* @param clock Injected only so the merge wait (TJ-1684) can be tested
|
|
220
|
+
* without real time passing.
|
|
181
221
|
*/
|
|
182
|
-
constructor(run, repoSlug) {
|
|
222
|
+
constructor(run, repoSlug, clock = {}) {
|
|
183
223
|
this.run = run;
|
|
184
224
|
this.repoSlug = repoSlug;
|
|
225
|
+
this.sleep = clock.sleep ?? ((ms) => new Promise((resolve) => setTimeout(resolve, ms)));
|
|
226
|
+
this.now = clock.now ?? (() => Date.now());
|
|
185
227
|
}
|
|
186
228
|
async openPr(spec) {
|
|
187
229
|
for (const label of spec.labels)
|
|
@@ -259,9 +301,45 @@ export class GhHost {
|
|
|
259
301
|
]);
|
|
260
302
|
return parsePrStatus(result.stdout);
|
|
261
303
|
}
|
|
262
|
-
async mergePr(prNumber) {
|
|
304
|
+
async mergePr(prNumber, expectedHeadSha) {
|
|
305
|
+
if (expectedHeadSha !== undefined)
|
|
306
|
+
await this.waitForHead(prNumber, expectedHeadSha);
|
|
263
307
|
await this.exec(ghMergePrArgs(prNumber));
|
|
264
308
|
}
|
|
309
|
+
/**
|
|
310
|
+
* Block until GitHub reports `expectedHeadSha` as the PR's head with a
|
|
311
|
+
* settled mergeability, or the timeout runs out.
|
|
312
|
+
*
|
|
313
|
+
* A timeout does not throw. Everything this guards against is GitHub being
|
|
314
|
+
* slow, and the merge that follows reports its own failure perfectly well;
|
|
315
|
+
* refusing to even attempt it would turn a slow answer into a worse outcome
|
|
316
|
+
* than the bug this fixes. A read that fails is treated the same way: keep
|
|
317
|
+
* waiting, then merge and let the merge speak.
|
|
318
|
+
*/
|
|
319
|
+
async waitForHead(prNumber, expectedHeadSha) {
|
|
320
|
+
const deadline = this.now() + MERGE_HEAD_TIMEOUT_MS;
|
|
321
|
+
for (;;) {
|
|
322
|
+
let head = {};
|
|
323
|
+
try {
|
|
324
|
+
const result = await this.exec([
|
|
325
|
+
"pr",
|
|
326
|
+
"view",
|
|
327
|
+
String(prNumber),
|
|
328
|
+
"--json",
|
|
329
|
+
"headRefOid,mergeable",
|
|
330
|
+
]);
|
|
331
|
+
head = parsePrHead(result.stdout);
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
// A failed read is not an answer. Fall through to the deadline check.
|
|
335
|
+
}
|
|
336
|
+
if (hasCaughtUp(head, expectedHeadSha))
|
|
337
|
+
return;
|
|
338
|
+
if (this.now() >= deadline)
|
|
339
|
+
return;
|
|
340
|
+
await this.sleep(MERGE_HEAD_POLL_MS);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
265
343
|
async exec(args) {
|
|
266
344
|
const scoped = this.repoSlug === undefined ? args : [...args, "--repo", this.repoSlug];
|
|
267
345
|
const result = await this.run(scoped);
|
package/dist/publish/gh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gh.js","sourceRoot":"","sources":["../../src/publish/gh.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"gh.js","sourceRoot":"","sources":["../../src/publish/gh.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAO1C;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,+CAA+C;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAChF,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1C,6EAA6E;IAC7E,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAChG,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AAC9C,MAAM,CAAC,MAAM,2BAA2B,GAAG,iCAAiC,CAAC;AAE7E,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO;QACL,OAAO;QACP,QAAQ;QACR,KAAK;QACL,SAAS;QACT,qBAAqB;QACrB,eAAe;QACf,2BAA2B;KAC5B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;AACtD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAQxC,sFAAsF;AACtF,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC3C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAiC,CAAC;QACjD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;QACrC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QACnC,OAAO;YACL,GAAG,CAAC,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,GAAG,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,eAAuB;IAC/D,OAAO,IAAI,CAAC,UAAU,KAAK,eAAe,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;AAC7E,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,QAAQ;QACR,QAAQ;QACR,IAAI,CAAC,UAAU;QACf,QAAQ;QACR,IAAI,CAAC,UAAU;QACf,SAAS;QACT,IAAI,CAAC,KAAK;QACV,QAAQ;QACR,IAAI,CAAC,IAAI;KACV,CAAC;IACF,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;QACtD,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;QAC5C,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YAC7F,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,QAAQ,GAAI,MAAwC,EAAE,QAAQ,CAAC;IACrE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IAExC,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,SAAS;QACtD,MAAM,MAAM,GAAG,GAA8B,CAAC;QAC9C,MAAM,MAAM,GAAI,MAAM,CAAC,MAA0C,EAAE,KAAK,CAAC;QACzE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;QACnC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE,CAAC;YAC5F,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,6FAA6F;AAC7F,SAAS,gBAAgB,CAAC,KAAc;IACtC,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACxC,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IACxC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wGAAwG;AACxG,SAAS,aAAa,CAAC,GAAY;IACjC,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC9D,MAAM,MAAM,GAAG,GAA8B,CAAC;IAE9C,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACzE,MAAM,UAAU,GAAG,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;YACnC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1E,GAAG,CAAC,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC7E,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC3E,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC;QACzD,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,OAAO;YACpB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW;YAC7C,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9D,GAAG,CAAC,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E,CAAC;IACJ,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC;IAC7C,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3E,MAAM,IAAI,KAAK,CAAC,gDAAgD,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvF,OAAO;QACL,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;QACrC,GAAG,CAAC,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,GAAG,EAAE,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACrD,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAqB,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;KAC5F,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,sEAAsE;AACtE,MAAM,OAAO,MAAM;IACA,GAAG,CAAW;IACd,QAAQ,CAAU;IAClB,KAAK,CAAgC;IACrC,GAAG,CAAe;IAEnC;;;;;;;;OAQG;IACH,YACE,GAAa,EACb,QAAiB,EACjB,QAAuE,EAAE;QAEzE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9F,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QACnD,OAAO,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACK,KAAK,CAAC,WAAW,CAAC,KAAa;QACrC,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvF,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;YAC7B,IAAI;YACJ,MAAM;YACN,SAAS;YACT,KAAK;YACL,SAAS;YACT,MAAM;YACN,QAAQ;YACR,wBAAwB;SACzB,CAAC,CAAC;QACH,OAAO,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAkB;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;YAC7B,IAAI;YACJ,MAAM;YACN,QAAQ;YACR,UAAU;YACV,SAAS;YACT,MAAM;YACN,QAAQ;YACR,wBAAwB;SACzB,CAAC,CAAC;QACH,OAAO,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;QACvF,OAAO,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,IAAY;QAC9C,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,QAAgB;QAChC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;YAC7B,IAAI;YACJ,MAAM;YACN,MAAM,CAAC,QAAQ,CAAC;YAChB,QAAQ;YACR,sCAAsC;SACvC,CAAC,CAAC;QACH,OAAO,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB,EAAE,eAAwB;QACtD,IAAI,eAAe,KAAK,SAAS;YAAE,MAAM,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACrF,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;;;OASG;IACK,KAAK,CAAC,WAAW,CAAC,QAAgB,EAAE,eAAuB;QACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,qBAAqB,CAAC;QACpD,SAAS,CAAC;YACR,IAAI,IAAI,GAAW,EAAE,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;oBAC7B,IAAI;oBACJ,MAAM;oBACN,MAAM,CAAC,QAAQ,CAAC;oBAChB,QAAQ;oBACR,sBAAsB;iBACvB,CAAC,CAAC;gBACH,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpC,CAAC;YAAC,MAAM,CAAC;gBACP,sEAAsE;YACxE,CAAC;YACD,IAAI,WAAW,CAAC,IAAI,EAAE,eAAe,CAAC;gBAAE,OAAO;YAC/C,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ;gBAAE,OAAO;YACnC,MAAM,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,IAAuB;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CACb,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CACjF,CAAC;QACJ,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -77,6 +77,17 @@ export interface PrStatus {
|
|
|
77
77
|
url: string;
|
|
78
78
|
checks: CheckRun[];
|
|
79
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* True when at least one check has concluded and did not succeed.
|
|
82
|
+
*
|
|
83
|
+
* The one shared definition of "CI failed": a check still queued or in
|
|
84
|
+
* progress (no `conclusion` yet) never counts on its own. The board and
|
|
85
|
+
* dashboard pages restate this as a one-line inline check (they cannot import
|
|
86
|
+
* a server module into their inline `<script>`), but every other caller —
|
|
87
|
+
* including the respond pass deciding whether a queued fix request still needs
|
|
88
|
+
* an attempt — uses this.
|
|
89
|
+
*/
|
|
90
|
+
export declare function hasFailingCheck(checks: readonly CheckRun[]): boolean;
|
|
80
91
|
/** A code-hosting provider (GitHub today), abstracted so the flows are testable. */
|
|
81
92
|
export interface GitHost {
|
|
82
93
|
openPr(spec: PrSpec): Promise<PrRef>;
|
|
@@ -93,8 +104,14 @@ export interface GitHost {
|
|
|
93
104
|
* (the resolve-conflicts-and-merge flow gets it there first); this is the
|
|
94
105
|
* one place ghostrail merges anything, and it only runs because a human
|
|
95
106
|
* asked for that specific PR.
|
|
107
|
+
*
|
|
108
|
+
* `expectedHeadSha`, when given, is the commit the caller just pushed. The
|
|
109
|
+
* host waits until the forge reports that commit as the PR's head before
|
|
110
|
+
* merging: mergeability is computed asynchronously, and asking too soon gets
|
|
111
|
+
* the answer for the *previous* head, which is the state the caller has just
|
|
112
|
+
* finished fixing (TJ-1684).
|
|
96
113
|
*/
|
|
97
|
-
mergePr(prNumber: number): Promise<void>;
|
|
114
|
+
mergePr(prNumber: number, expectedHeadSha?: string): Promise<void>;
|
|
98
115
|
}
|
|
99
116
|
/**
|
|
100
117
|
* Extract the PR number and URL from `gh pr create` output, which prints the PR
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"githost.d.ts","sourceRoot":"","sources":["../../src/publish/githost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AAErD;;;;GAIG;AACH,eAAO,MAAM,WAAW,eAAe,CAAC;AAExC;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,EAAE,CAK5C;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAOxD;AAED,MAAM,WAAW,MAAM;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,KAAK;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wCAAwC;AACxC,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,yBAAyB;AACzB,MAAM,WAAW,SAAS;IACxB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,2FAA2F;AAC3F,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,MAAM,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,oEAAoE;AACpE,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACpC,+CAA+C;IAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,QAAQ,EAAE,CAAC;CACpB;AAED,oFAAoF;AACpF,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,+EAA+E;IAC/E,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACpE,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACrD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,4DAA4D;IAC5D,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjD
|
|
1
|
+
{"version":3,"file":"githost.d.ts","sourceRoot":"","sources":["../../src/publish/githost.ts"],"names":[],"mappings":"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"}
|
package/dist/publish/githost.js
CHANGED
|
@@ -42,6 +42,19 @@ export function isNonFastForward(output) {
|
|
|
42
42
|
/fetch first/i.test(output) ||
|
|
43
43
|
/updates were rejected/i.test(output));
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* True when at least one check has concluded and did not succeed.
|
|
47
|
+
*
|
|
48
|
+
* The one shared definition of "CI failed": a check still queued or in
|
|
49
|
+
* progress (no `conclusion` yet) never counts on its own. The board and
|
|
50
|
+
* dashboard pages restate this as a one-line inline check (they cannot import
|
|
51
|
+
* a server module into their inline `<script>`), but every other caller —
|
|
52
|
+
* including the respond pass deciding whether a queued fix request still needs
|
|
53
|
+
* an attempt — uses this.
|
|
54
|
+
*/
|
|
55
|
+
export function hasFailingCheck(checks) {
|
|
56
|
+
return checks.some((check) => check.conclusion !== undefined && check.conclusion !== "success");
|
|
57
|
+
}
|
|
45
58
|
/**
|
|
46
59
|
* Extract the PR number and URL from `gh pr create` output, which prints the PR
|
|
47
60
|
* URL (e.g. `https://github.com/owner/repo/pull/42`) on its own line. Throws if
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"githost.js","sourceRoot":"","sources":["../../src/publish/githost.ts"],"names":[],"mappings":"AAEA,4FAA4F;AAC5F,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAErD;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AAExC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;QACxB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,CACL,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3B,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CACtC,CAAC;AACJ,CAAC;
|
|
1
|
+
{"version":3,"file":"githost.js","sourceRoot":"","sources":["../../src/publish/githost.ts"],"names":[],"mappings":"AAEA,4FAA4F;AAC5F,MAAM,CAAC,MAAM,gBAAgB,GAAG,oBAAoB,CAAC;AAErD;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AAExC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO;QACL,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC;QACxB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC;KACnC,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAc;IAC7C,OAAO,CACL,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC;QAChC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3B,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CACtC,CAAC;AACJ,CAAC;AAoDD;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,MAA2B;IACzD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC;AAClG,CAAC;AA4BD;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC1D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,IAAI,KAAK,CAAC,sCAAsC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,EAAU,EAAE,KAAa,EAAE,IAAI,GAAG,KAAK;IACnE,OAAO,GAAG,IAAI,KAAK,KAAK,KAAK,EAAE,GAAG,CAAC;AACrC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,MAAM,CAAC,IAAc,EAAE,OAAe,EAAE,QAAiB;IACvE,MAAM,KAAK,GAAG,CAAC,iBAAiB,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAEtD,2EAA2E;IAC3E,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,yEAAyE;IACzE,kEAAkE;IAClE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,mBAAmB,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
package/dist/publish/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { GhHost, type GhRunner, ghMergePrArgs, ghOpenPrArgs, parseCommentList, parseOpenPrList, parsePrStatus, } from "./gh.js";
|
|
2
|
-
export { type CheckRun, type GitHost, GHOSTRAIL_MARKER, commitMessage, type OpenPr, type PrComment, type PrRef, type PrSpec, type PrStatus, parsePrUrl, prBody, } from "./githost.js";
|
|
2
|
+
export { type CheckRun, type GitHost, GHOSTRAIL_MARKER, commitMessage, hasFailingCheck, type OpenPr, type PrComment, type PrRef, type PrSpec, type PrStatus, parsePrUrl, prBody, } from "./githost.js";
|
|
3
3
|
export { GitHubPublisher, type PublisherOptions } from "./github-publisher.js";
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/publish/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,QAAQ,EACb,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,gBAAgB,EAChB,aAAa,EACb,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,UAAU,EACV,MAAM,GACP,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/publish/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,KAAK,QAAQ,EACb,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,KAAK,MAAM,EACX,KAAK,SAAS,EACd,KAAK,KAAK,EACV,KAAK,MAAM,EACX,KAAK,QAAQ,EACb,UAAU,EACV,MAAM,GACP,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
|
package/dist/publish/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { GhHost, ghMergePrArgs, ghOpenPrArgs, parseCommentList, parseOpenPrList, parsePrStatus, } from "./gh.js";
|
|
2
|
-
export { GHOSTRAIL_MARKER, commitMessage, parsePrUrl, prBody, } from "./githost.js";
|
|
2
|
+
export { GHOSTRAIL_MARKER, commitMessage, hasFailingCheck, parsePrUrl, prBody, } from "./githost.js";
|
|
3
3
|
export { GitHubPublisher } from "./github-publisher.js";
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/publish/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAEN,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAGL,gBAAgB,EAChB,aAAa,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/publish/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EAEN,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAGL,gBAAgB,EAChB,aAAa,EACb,eAAe,EAMf,UAAU,EACV,MAAM,GACP,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,eAAe,EAAyB,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { RELEASE_REQUEST_FILE, clearReleaseRequest, readReleaseRequest, releaseNow, releaseTick, requestRelease, writeReleaseRequest, type ReleaseDeps, type ReleaseRequest, type ReleaseResult, type ReleaseRunConfig, type ReleaseState, } from "./release.js";
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,cAAc,EACd,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/release/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,UAAU,EACV,WAAW,EACX,cAAc,EACd,mBAAmB,GAMpB,MAAM,cAAc,CAAC"}
|