@renaiss-shipflow/cli 0.2.2 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client.d.ts +41 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +57 -8
- package/dist/client.js.map +1 -1
- package/dist/commands/claims.js +2 -2
- package/dist/commands/claims.js.map +1 -1
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +86 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/features.d.ts +3 -0
- package/dist/commands/features.d.ts.map +1 -0
- package/dist/commands/features.js +50 -0
- package/dist/commands/features.js.map +1 -0
- package/dist/commands/inbox.d.ts +4 -0
- package/dist/commands/inbox.d.ts.map +1 -0
- package/dist/commands/inbox.js +72 -0
- package/dist/commands/inbox.js.map +1 -0
- package/dist/commands/init.js +2 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/issue.d.ts.map +1 -1
- package/dist/commands/issue.js +58 -7
- package/dist/commands/issue.js.map +1 -1
- package/dist/commands/issues.js +2 -2
- package/dist/commands/issues.js.map +1 -1
- package/dist/commands/pr.d.ts +4 -0
- package/dist/commands/pr.d.ts.map +1 -1
- package/dist/commands/pr.js +236 -12
- package/dist/commands/pr.js.map +1 -1
- package/dist/commands/regression.js +2 -2
- package/dist/commands/regression.js.map +1 -1
- package/dist/commands/release.js +2 -2
- package/dist/commands/release.js.map +1 -1
- package/dist/commands/status.js +2 -2
- package/dist/commands/status.js.map +1 -1
- package/dist/config.d.ts +49 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +99 -0
- package/dist/config.js.map +1 -1
- package/dist/gh.d.ts +70 -1
- package/dist/gh.d.ts.map +1 -1
- package/dist/gh.js +88 -4
- package/dist/gh.js.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/issue-order.d.ts +8 -0
- package/dist/issue-order.d.ts.map +1 -0
- package/dist/issue-order.js +33 -0
- package/dist/issue-order.js.map +1 -0
- package/dist/pr-state.d.ts +57 -0
- package/dist/pr-state.d.ts.map +1 -0
- package/dist/pr-state.js +140 -0
- package/dist/pr-state.js.map +1 -0
- package/package.json +1 -1
- package/dist/__tests__/gh.test.d.ts +0 -2
- package/dist/__tests__/gh.test.d.ts.map +0 -1
- package/dist/__tests__/gh.test.js +0 -46
- package/dist/__tests__/gh.test.js.map +0 -1
- package/dist/__tests__/login.test.d.ts +0 -2
- package/dist/__tests__/login.test.d.ts.map +0 -1
- package/dist/__tests__/login.test.js +0 -25
- package/dist/__tests__/login.test.js.map +0 -1
- package/dist/__tests__/project.test.d.ts +0 -2
- package/dist/__tests__/project.test.d.ts.map +0 -1
- package/dist/__tests__/project.test.js +0 -17
- package/dist/__tests__/project.test.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,eAAe,EAAG,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9F,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,EAAE;QACzC,MAAM,IAAI,GAAG,gBAAgB,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAC,CAAC;QACtG,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC7H,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;QAC3E,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACvC,MAAM,MAAM,GAAI,MAAM,CAAC,eAAyB,IAAI,EAAE,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,qBAAqB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAClD,MAAM,SAAS,GAAI,MAAM,CAAC,eAA2C,IAAI,EAAE,CAAC;QAC5E,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAI,CAAS,EAAE,IAAI,EAAE,YAAY,IAAK,CAAS,EAAE,OAAO,IAAI,cAAc,CAAC;YACxF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
package/dist/config.d.ts
CHANGED
|
@@ -2,7 +2,19 @@ export interface StoredConfig {
|
|
|
2
2
|
apiUrl?: string;
|
|
3
3
|
defaultOrg?: string;
|
|
4
4
|
apiKey?: string;
|
|
5
|
+
autoIssue?: boolean;
|
|
6
|
+
liveReload?: boolean;
|
|
7
|
+
requireCi?: boolean;
|
|
8
|
+
mergePolicy?: MergePolicy;
|
|
9
|
+
maxFixAttempts?: number;
|
|
10
|
+
wipLimit?: number;
|
|
11
|
+
stalePrHours?: number;
|
|
12
|
+
bugHunt?: boolean;
|
|
13
|
+
bugHuntCap?: number;
|
|
14
|
+
requireReview?: boolean;
|
|
5
15
|
}
|
|
16
|
+
/** How far the loop may drive a PR toward merge without a human. */
|
|
17
|
+
export type MergePolicy = "manual" | "auto-on-green" | "auto-timeout";
|
|
6
18
|
export interface StoredCredentials {
|
|
7
19
|
jwt: string;
|
|
8
20
|
refreshToken: string;
|
|
@@ -23,10 +35,47 @@ export declare const clearConfig: () => void;
|
|
|
23
35
|
export declare const loadCredentials: () => StoredCredentials | null;
|
|
24
36
|
export declare const saveCredentials: (c: StoredCredentials) => void;
|
|
25
37
|
export declare const clearCredentials: () => void;
|
|
38
|
+
/** Auth options that wire transparent token refresh into a ShipFlowClient:
|
|
39
|
+
* the stored refresh token, plus a callback that persists rotated tokens back
|
|
40
|
+
* to credentials.json. Spread into `new ShipFlowClient({..., ...refreshOpts(creds)})`. */
|
|
41
|
+
export declare function refreshOpts(creds: StoredCredentials): {
|
|
42
|
+
refreshToken: string;
|
|
43
|
+
onRefreshed: (t: {
|
|
44
|
+
token: string;
|
|
45
|
+
refreshToken: string;
|
|
46
|
+
expiresAt: number;
|
|
47
|
+
}) => void;
|
|
48
|
+
};
|
|
26
49
|
export declare const loadProjectCache: () => ProjectCache;
|
|
27
50
|
export declare const saveProjectCache: (c: ProjectCache) => void;
|
|
28
51
|
/** Stable key for a repo path (resolves symlinks / paths to the git work tree). */
|
|
29
52
|
export declare function projectCacheKeyForRepoPath(absRepoRoot: string): string;
|
|
53
|
+
/** Parse a human boolean ("true"/"1"/"on"/"yes"). */
|
|
54
|
+
export declare function parseBool(v: string | undefined): boolean;
|
|
55
|
+
/** Whether to auto-create an issue for off-issue feature work (vs. asking).
|
|
56
|
+
* Env SHIPFLOW_AUTO_ISSUE wins over the stored config; defaults to false. */
|
|
57
|
+
export declare function resolveAutoIssue(): boolean;
|
|
58
|
+
/** Effective live-reload preference: env > stored config > undefined (undecided,
|
|
59
|
+
* so the SessionStart hook asks once). */
|
|
60
|
+
export declare function resolveLiveReload(): boolean | undefined;
|
|
61
|
+
/** Parse a non-negative integer; fall back when absent/invalid. */
|
|
62
|
+
export declare function parseIntOr(v: string | number | undefined, fallback: number): number;
|
|
63
|
+
/** Require CI green before a PR is "advanced" (env > config > true). */
|
|
64
|
+
export declare function resolveRequireCi(): boolean;
|
|
65
|
+
/** Effective merge policy (env > config > "manual"). Invalid values fall back. */
|
|
66
|
+
export declare function resolveMergePolicy(): MergePolicy;
|
|
67
|
+
/** Max CI-fix attempts on one PR before escalating (env > config > 3). */
|
|
68
|
+
export declare function resolveMaxFixAttempts(): number;
|
|
69
|
+
/** Max concurrent open PRs before the loop stops admitting work (env > config > 3). */
|
|
70
|
+
export declare function resolveWipLimit(): number;
|
|
71
|
+
/** Hours before a parked (green, unreviewed) PR is "stale" (env > config > 48). */
|
|
72
|
+
export declare function resolveStalePrHours(): number;
|
|
73
|
+
/** Run the empty-queue bug sweep + auto-file issues (env > config > true). */
|
|
74
|
+
export declare function resolveBugHunt(): boolean;
|
|
75
|
+
/** Max new issues the bug sweep may file per loop run (env > config > 5). */
|
|
76
|
+
export declare function resolveBugHuntCap(): number;
|
|
77
|
+
/** Route every issue + PR through the reviewer first (env > config > true). */
|
|
78
|
+
export declare function resolveRequireReview(): boolean;
|
|
30
79
|
export declare function resolveApiUrl(flagUrl?: string): string;
|
|
31
80
|
/** JWT first, API key fallback. */
|
|
32
81
|
export declare function resolveAuthToken(): {
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -6,6 +6,7 @@ const CONFIG_DIR = join(homedir(), ".config", "renaissshipflow");
|
|
|
6
6
|
const CONFIG_FILE = join(CONFIG_DIR, "config.json");
|
|
7
7
|
const CREDS_FILE = join(CONFIG_DIR, "credentials.json");
|
|
8
8
|
const PROJECTS_FILE = join(CONFIG_DIR, "projects.json");
|
|
9
|
+
const MERGE_POLICIES = ["manual", "auto-on-green", "auto-timeout"];
|
|
9
10
|
function ensureDir() {
|
|
10
11
|
if (!existsSync(CONFIG_DIR)) {
|
|
11
12
|
mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
@@ -40,6 +41,15 @@ export const clearCredentials = () => { try {
|
|
|
40
41
|
unlinkSync(CREDS_FILE);
|
|
41
42
|
}
|
|
42
43
|
catch { } };
|
|
44
|
+
/** Auth options that wire transparent token refresh into a ShipFlowClient:
|
|
45
|
+
* the stored refresh token, plus a callback that persists rotated tokens back
|
|
46
|
+
* to credentials.json. Spread into `new ShipFlowClient({..., ...refreshOpts(creds)})`. */
|
|
47
|
+
export function refreshOpts(creds) {
|
|
48
|
+
return {
|
|
49
|
+
refreshToken: creds.refreshToken,
|
|
50
|
+
onRefreshed: (t) => saveCredentials({ ...creds, jwt: t.token, refreshToken: t.refreshToken, expiresAt: t.expiresAt }),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
43
53
|
// ── project cache ──
|
|
44
54
|
export const loadProjectCache = () => readJsonOr(PROJECTS_FILE, {});
|
|
45
55
|
export const saveProjectCache = (c) => writeJson(PROJECTS_FILE, c);
|
|
@@ -47,6 +57,95 @@ export const saveProjectCache = (c) => writeJson(PROJECTS_FILE, c);
|
|
|
47
57
|
export function projectCacheKeyForRepoPath(absRepoRoot) {
|
|
48
58
|
return createHash("sha256").update(absRepoRoot).digest("hex").slice(0, 16);
|
|
49
59
|
}
|
|
60
|
+
// ── settings resolution ──
|
|
61
|
+
/** Parse a human boolean ("true"/"1"/"on"/"yes"). */
|
|
62
|
+
export function parseBool(v) {
|
|
63
|
+
if (v == null)
|
|
64
|
+
return false;
|
|
65
|
+
return ["true", "1", "on", "yes"].includes(v.trim().toLowerCase());
|
|
66
|
+
}
|
|
67
|
+
/** Whether to auto-create an issue for off-issue feature work (vs. asking).
|
|
68
|
+
* Env SHIPFLOW_AUTO_ISSUE wins over the stored config; defaults to false. */
|
|
69
|
+
export function resolveAutoIssue() {
|
|
70
|
+
if (process.env.SHIPFLOW_AUTO_ISSUE != null)
|
|
71
|
+
return parseBool(process.env.SHIPFLOW_AUTO_ISSUE);
|
|
72
|
+
return loadConfig().autoIssue === true;
|
|
73
|
+
}
|
|
74
|
+
/** Effective live-reload preference: env > stored config > undefined (undecided,
|
|
75
|
+
* so the SessionStart hook asks once). */
|
|
76
|
+
export function resolveLiveReload() {
|
|
77
|
+
const env = process.env.SHIPFLOW_LIVE_RELOAD;
|
|
78
|
+
if (env != null && env !== "")
|
|
79
|
+
return parseBool(env);
|
|
80
|
+
return loadConfig().liveReload;
|
|
81
|
+
}
|
|
82
|
+
/** Parse a non-negative integer; fall back when absent/invalid. */
|
|
83
|
+
export function parseIntOr(v, fallback) {
|
|
84
|
+
if (typeof v === "number")
|
|
85
|
+
return Number.isFinite(v) && v >= 0 ? v : fallback;
|
|
86
|
+
if (v == null || v.trim() === "")
|
|
87
|
+
return fallback;
|
|
88
|
+
const n = parseInt(v, 10);
|
|
89
|
+
return Number.isFinite(n) && n >= 0 ? n : fallback;
|
|
90
|
+
}
|
|
91
|
+
/** Require CI green before a PR is "advanced" (env > config > true). */
|
|
92
|
+
export function resolveRequireCi() {
|
|
93
|
+
const env = process.env.SHIPFLOW_REQUIRE_CI;
|
|
94
|
+
if (env != null && env !== "")
|
|
95
|
+
return parseBool(env);
|
|
96
|
+
const c = loadConfig().requireCi;
|
|
97
|
+
return c === undefined ? true : c;
|
|
98
|
+
}
|
|
99
|
+
/** Effective merge policy (env > config > "manual"). Invalid values fall back. */
|
|
100
|
+
export function resolveMergePolicy() {
|
|
101
|
+
const env = process.env.SHIPFLOW_MERGE_POLICY;
|
|
102
|
+
const raw = (env != null && env !== "" ? env : loadConfig().mergePolicy);
|
|
103
|
+
return raw && MERGE_POLICIES.includes(raw) ? raw : "manual";
|
|
104
|
+
}
|
|
105
|
+
/** Max CI-fix attempts on one PR before escalating (env > config > 3). */
|
|
106
|
+
export function resolveMaxFixAttempts() {
|
|
107
|
+
const env = process.env.SHIPFLOW_MAX_FIX_ATTEMPTS;
|
|
108
|
+
if (env != null && env !== "")
|
|
109
|
+
return parseIntOr(env, 3);
|
|
110
|
+
return parseIntOr(loadConfig().maxFixAttempts, 3);
|
|
111
|
+
}
|
|
112
|
+
/** Max concurrent open PRs before the loop stops admitting work (env > config > 3). */
|
|
113
|
+
export function resolveWipLimit() {
|
|
114
|
+
const env = process.env.SHIPFLOW_WIP_LIMIT;
|
|
115
|
+
if (env != null && env !== "")
|
|
116
|
+
return parseIntOr(env, 3);
|
|
117
|
+
return parseIntOr(loadConfig().wipLimit, 3);
|
|
118
|
+
}
|
|
119
|
+
/** Hours before a parked (green, unreviewed) PR is "stale" (env > config > 48). */
|
|
120
|
+
export function resolveStalePrHours() {
|
|
121
|
+
const env = process.env.SHIPFLOW_STALE_PR_HOURS;
|
|
122
|
+
if (env != null && env !== "")
|
|
123
|
+
return parseIntOr(env, 48);
|
|
124
|
+
return parseIntOr(loadConfig().stalePrHours, 48);
|
|
125
|
+
}
|
|
126
|
+
/** Run the empty-queue bug sweep + auto-file issues (env > config > true). */
|
|
127
|
+
export function resolveBugHunt() {
|
|
128
|
+
const env = process.env.SHIPFLOW_BUG_HUNT;
|
|
129
|
+
if (env != null && env !== "")
|
|
130
|
+
return parseBool(env);
|
|
131
|
+
const c = loadConfig().bugHunt;
|
|
132
|
+
return c === undefined ? true : c;
|
|
133
|
+
}
|
|
134
|
+
/** Max new issues the bug sweep may file per loop run (env > config > 5). */
|
|
135
|
+
export function resolveBugHuntCap() {
|
|
136
|
+
const env = process.env.SHIPFLOW_BUG_HUNT_CAP;
|
|
137
|
+
if (env != null && env !== "")
|
|
138
|
+
return parseIntOr(env, 5);
|
|
139
|
+
return parseIntOr(loadConfig().bugHuntCap, 5);
|
|
140
|
+
}
|
|
141
|
+
/** Route every issue + PR through the reviewer first (env > config > true). */
|
|
142
|
+
export function resolveRequireReview() {
|
|
143
|
+
const env = process.env.SHIPFLOW_REQUIRE_REVIEW;
|
|
144
|
+
if (env != null && env !== "")
|
|
145
|
+
return parseBool(env);
|
|
146
|
+
const c = loadConfig().requireReview;
|
|
147
|
+
return c === undefined ? true : c;
|
|
148
|
+
}
|
|
50
149
|
// ── url + auth resolution ──
|
|
51
150
|
export function resolveApiUrl(flagUrl) {
|
|
52
151
|
return flagUrl || process.env.SHIPFLOW_API_URL || loadConfig().apiUrl || "http://localhost:8080";
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;AACjE,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACpD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AACxD,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/gh.d.ts
CHANGED
|
@@ -20,9 +20,10 @@ export interface GhIssue {
|
|
|
20
20
|
login: string;
|
|
21
21
|
}[];
|
|
22
22
|
url: string;
|
|
23
|
+
createdAt: string;
|
|
23
24
|
}
|
|
24
25
|
export declare function ghIssueView(repo: string, number: number): GhIssue;
|
|
25
|
-
export declare function ghIssueCreate(repo: string, title: string, body: string): {
|
|
26
|
+
export declare function ghIssueCreate(repo: string, title: string, body: string, labels?: string[]): {
|
|
26
27
|
url: string;
|
|
27
28
|
number: number;
|
|
28
29
|
};
|
|
@@ -42,4 +43,72 @@ export declare function ghPRCreate(args: {
|
|
|
42
43
|
export declare function ghPRMerge(repo: string, number: number, mode?: "squash" | "merge" | "rebase", deleteBranch?: boolean): {
|
|
43
44
|
mergedSha: string;
|
|
44
45
|
};
|
|
46
|
+
export interface GhReview {
|
|
47
|
+
author: {
|
|
48
|
+
login: string;
|
|
49
|
+
} | null;
|
|
50
|
+
state: string;
|
|
51
|
+
submittedAt: string;
|
|
52
|
+
}
|
|
53
|
+
export interface GhComment {
|
|
54
|
+
author: {
|
|
55
|
+
login: string;
|
|
56
|
+
} | null;
|
|
57
|
+
createdAt: string;
|
|
58
|
+
body: string;
|
|
59
|
+
}
|
|
60
|
+
export interface GhCheck {
|
|
61
|
+
name?: string;
|
|
62
|
+
status?: string;
|
|
63
|
+
conclusion?: string;
|
|
64
|
+
state?: string;
|
|
65
|
+
}
|
|
66
|
+
export interface GhPR {
|
|
67
|
+
number: number;
|
|
68
|
+
title: string;
|
|
69
|
+
headRefName: string;
|
|
70
|
+
baseRefName?: string;
|
|
71
|
+
url: string;
|
|
72
|
+
isDraft: boolean;
|
|
73
|
+
reviewDecision: string;
|
|
74
|
+
mergeable?: string;
|
|
75
|
+
labels?: {
|
|
76
|
+
name: string;
|
|
77
|
+
}[];
|
|
78
|
+
reviews: GhReview[];
|
|
79
|
+
comments: GhComment[];
|
|
80
|
+
statusCheckRollup: GhCheck[];
|
|
81
|
+
closingIssuesReferences: {
|
|
82
|
+
number: number;
|
|
83
|
+
title: string;
|
|
84
|
+
}[];
|
|
85
|
+
createdAt?: string;
|
|
86
|
+
updatedAt: string;
|
|
87
|
+
}
|
|
88
|
+
/** Open PRs authored by the current gh user. */
|
|
89
|
+
export declare function ghPRListMine(repo: string, limit?: number): GhPR[];
|
|
90
|
+
/** The authenticated GitHub login (for "is this comment mine?" checks). */
|
|
91
|
+
export declare function ghCurrentLogin(): string;
|
|
92
|
+
/** Open issues carrying a given label, newest-updated first, with comments. */
|
|
93
|
+
export declare function ghIssueListByLabel(repo: string, label: string, limit?: number): (GhIssue & {
|
|
94
|
+
comments: GhComment[];
|
|
95
|
+
})[];
|
|
96
|
+
/** One PR with the full field set (CI, reviews, labels, mergeable, base). */
|
|
97
|
+
export declare function ghPRView(repo: string, number: number): GhPR;
|
|
98
|
+
/** Create-or-update a label so add-label can't fail on a missing label. Best-effort. */
|
|
99
|
+
export declare function ghEnsureLabel(repo: string, name: string, color?: string, description?: string): void;
|
|
100
|
+
export declare function ghIssueAddLabels(repo: string, number: number, labels: string[]): void;
|
|
101
|
+
export declare function ghIssueRemoveLabel(repo: string, number: number, label: string): void;
|
|
102
|
+
export declare function ghIssueComment(repo: string, number: number, body: string): void;
|
|
103
|
+
export interface GhReviewThread {
|
|
104
|
+
id: string;
|
|
105
|
+
isResolved: boolean;
|
|
106
|
+
path: string;
|
|
107
|
+
line: number | null;
|
|
108
|
+
author: string;
|
|
109
|
+
body: string;
|
|
110
|
+
}
|
|
111
|
+
export declare function ghReviewThreads(repo: string, number: number): GhReviewThread[];
|
|
112
|
+
/** Mark a review thread resolved (after the loop has addressed it). Best-effort. */
|
|
113
|
+
export declare function ghResolveReviewThread(threadId: string): void;
|
|
45
114
|
//# sourceMappingURL=gh.d.ts.map
|
package/dist/gh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gh.d.ts","sourceRoot":"","sources":["../src/gh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAQzD,6DAA6D;AAC7D,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,QAAQ,EAAE,CAAC,GAAE,OAAO,SAAqB,GAAG,IAAI,CAGlF;AAED,uDAAuD;AACvD,wBAAgB,UAAU,IAAI,IAAI,CAGjC;AAED,wBAAgB,WAAW,IAAI,OAAO,CAOrC;AAED,wBAAgB,YAAY,IAAI,WAAW,GAAG,YAAY,CAOzD;AAED,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED,sFAAsF;AACtF,wBAAgB,WAAW,IAAI,OAAO,CAGrC;AAED,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3B,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC/B,GAAG,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"gh.d.ts","sourceRoot":"","sources":["../src/gh.ts"],"names":[],"mappings":"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"}
|
package/dist/gh.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { execSync, spawnSync } from "node:child_process";
|
|
2
|
-
const FIELDS = "number,title,body,state,labels,assignees,url";
|
|
2
|
+
const FIELDS = "number,title,body,state,labels,assignees,url,createdAt";
|
|
3
3
|
// Injected executors — replaceable in tests without module mocking
|
|
4
4
|
let _exec = execSync;
|
|
5
5
|
let _spawn = spawnSync;
|
|
@@ -43,9 +43,14 @@ export function ghIssueView(repo, number) {
|
|
|
43
43
|
const out = _exec(`gh issue view ${number} --repo ${shellQuote(repo)} --json ${FIELDS}`).toString();
|
|
44
44
|
return JSON.parse(out);
|
|
45
45
|
}
|
|
46
|
-
export function ghIssueCreate(repo, title, body) {
|
|
47
|
-
const
|
|
48
|
-
|
|
46
|
+
export function ghIssueCreate(repo, title, body, labels = []) {
|
|
47
|
+
const labelFlags = labels.map((l) => `--label ${shellQuote(l)}`).join(" ");
|
|
48
|
+
// NB: `gh issue create` has NO --json flag (only list/view do) — passing it
|
|
49
|
+
// makes gh error out. It prints the new issue URL on stdout; parse that.
|
|
50
|
+
const out = _exec(`gh issue create --repo ${shellQuote(repo)} --title ${shellQuote(title)} --body ${shellQuote(body)} ${labelFlags}`).toString();
|
|
51
|
+
const url = out.split("\n").map((s) => s.trim()).filter(Boolean).reverse().find((l) => l.startsWith("http")) ?? out.trim();
|
|
52
|
+
const number = parseInt(url.split("/").pop() || "0", 10);
|
|
53
|
+
return { url, number };
|
|
49
54
|
}
|
|
50
55
|
export function ghIssueList(repo, state = "open", limit = 30) {
|
|
51
56
|
const out = _exec(`gh issue list --repo ${shellQuote(repo)} --state ${state} --limit ${limit} --json ${FIELDS}`).toString();
|
|
@@ -76,6 +81,85 @@ export function ghPRMerge(repo, number, mode = "squash", deleteBranch = true) {
|
|
|
76
81
|
const parsed = JSON.parse(view);
|
|
77
82
|
return { mergedSha: parsed.mergeCommit?.oid ?? "" };
|
|
78
83
|
}
|
|
84
|
+
const PR_FIELDS = "number,title,headRefName,baseRefName,url,isDraft,reviewDecision,mergeable,labels,reviews,comments,statusCheckRollup,closingIssuesReferences,createdAt,updatedAt";
|
|
85
|
+
/** Open PRs authored by the current gh user. */
|
|
86
|
+
export function ghPRListMine(repo, limit = 30) {
|
|
87
|
+
const out = _exec(`gh pr list --repo ${shellQuote(repo)} --author @me --state open --limit ${limit} --json ${PR_FIELDS}`).toString();
|
|
88
|
+
return JSON.parse(out);
|
|
89
|
+
}
|
|
90
|
+
/** The authenticated GitHub login (for "is this comment mine?" checks). */
|
|
91
|
+
export function ghCurrentLogin() {
|
|
92
|
+
try {
|
|
93
|
+
return _exec("gh api user --jq .login").toString().trim();
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return "";
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/** Open issues carrying a given label, newest-updated first, with comments. */
|
|
100
|
+
export function ghIssueListByLabel(repo, label, limit = 30) {
|
|
101
|
+
const out = _exec(`gh issue list --repo ${shellQuote(repo)} --state open --label ${shellQuote(label)} --limit ${limit} --json ${FIELDS},comments`).toString();
|
|
102
|
+
return JSON.parse(out);
|
|
103
|
+
}
|
|
104
|
+
/** One PR with the full field set (CI, reviews, labels, mergeable, base). */
|
|
105
|
+
export function ghPRView(repo, number) {
|
|
106
|
+
const out = _exec(`gh pr view ${number} --repo ${shellQuote(repo)} --json ${PR_FIELDS}`).toString();
|
|
107
|
+
return JSON.parse(out);
|
|
108
|
+
}
|
|
109
|
+
/** Create-or-update a label so add-label can't fail on a missing label. Best-effort. */
|
|
110
|
+
export function ghEnsureLabel(repo, name, color = "ededed", description = "") {
|
|
111
|
+
try {
|
|
112
|
+
_exec(`gh label create ${shellQuote(name)} --repo ${shellQuote(repo)} --color ${shellQuote(color)} --description ${shellQuote(description)} --force`, { stdio: "ignore" });
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
/* label already exists / no perms — add-label will still work if it exists */
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
export function ghIssueAddLabels(repo, number, labels) {
|
|
119
|
+
if (!labels.length)
|
|
120
|
+
return;
|
|
121
|
+
const flags = labels.map((l) => `--add-label ${shellQuote(l)}`).join(" ");
|
|
122
|
+
_exec(`gh issue edit ${number} --repo ${shellQuote(repo)} ${flags}`, { stdio: "ignore" });
|
|
123
|
+
}
|
|
124
|
+
export function ghIssueRemoveLabel(repo, number, label) {
|
|
125
|
+
try {
|
|
126
|
+
_exec(`gh issue edit ${number} --repo ${shellQuote(repo)} --remove-label ${shellQuote(label)}`, { stdio: "ignore" });
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
/* label wasn't present */
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
export function ghIssueComment(repo, number, body) {
|
|
133
|
+
_exec(`gh issue comment ${number} --repo ${shellQuote(repo)} --body ${shellQuote(body)}`, { stdio: "ignore" });
|
|
134
|
+
}
|
|
135
|
+
export function ghReviewThreads(repo, number) {
|
|
136
|
+
const [owner, name] = repo.split("/");
|
|
137
|
+
const q = "query($o:String!,$r:String!,$n:Int!){repository(owner:$o,name:$r){pullRequest(number:$n){" +
|
|
138
|
+
"reviewThreads(first:100){nodes{id isResolved comments(first:1){nodes{path line author{login} body}}}}}}}";
|
|
139
|
+
const out = _exec(`gh api graphql -f query=${shellQuote(q)} -f o=${shellQuote(owner)} -f r=${shellQuote(name)} -F n=${number}`).toString();
|
|
140
|
+
const nodes = (JSON.parse(out)?.data?.repository?.pullRequest?.reviewThreads?.nodes ?? []);
|
|
141
|
+
return nodes.map((t) => {
|
|
142
|
+
const c = t.comments?.nodes?.[0] ?? {};
|
|
143
|
+
return {
|
|
144
|
+
id: String(t.id),
|
|
145
|
+
isResolved: !!t.isResolved,
|
|
146
|
+
path: c.path ?? "",
|
|
147
|
+
line: c.line ?? null,
|
|
148
|
+
author: c.author?.login ?? "",
|
|
149
|
+
body: (c.body ?? "").slice(0, 240),
|
|
150
|
+
};
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
/** Mark a review thread resolved (after the loop has addressed it). Best-effort. */
|
|
154
|
+
export function ghResolveReviewThread(threadId) {
|
|
155
|
+
const m = "mutation($t:ID!){resolveReviewThread(input:{threadId:$t}){thread{isResolved}}}";
|
|
156
|
+
try {
|
|
157
|
+
_exec(`gh api graphql -f query=${shellQuote(m)} -f t=${shellQuote(threadId)}`, { stdio: "ignore" });
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
/* already resolved / no perms */
|
|
161
|
+
}
|
|
162
|
+
}
|
|
79
163
|
function shellQuote(s) {
|
|
80
164
|
return `'${s.replace(/'/g, `'\\''`)}'`;
|
|
81
165
|
}
|
package/dist/gh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gh.js","sourceRoot":"","sources":["../src/gh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"gh.js","sourceRoot":"","sources":["../src/gh.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,9 @@ import { registerInitCommand } from "./commands/init.js";
|
|
|
13
13
|
import { registerStatusCommand } from "./commands/status.js";
|
|
14
14
|
import { registerIssuesCommand } from "./commands/issues.js";
|
|
15
15
|
import { registerIssueCommand } from "./commands/issue.js";
|
|
16
|
+
import { registerInboxCommand } from "./commands/inbox.js";
|
|
17
|
+
import { registerFeaturesCommand } from "./commands/features.js";
|
|
18
|
+
import { registerConfigCommand } from "./commands/config.js";
|
|
16
19
|
import { registerClaimsCommand } from "./commands/claims.js";
|
|
17
20
|
import { registerPRCommand } from "./commands/pr.js";
|
|
18
21
|
import { registerTestCommand } from "./commands/test.js";
|
|
@@ -39,6 +42,9 @@ registerInitCommand(program);
|
|
|
39
42
|
registerStatusCommand(program);
|
|
40
43
|
registerIssuesCommand(program);
|
|
41
44
|
registerIssueCommand(program);
|
|
45
|
+
registerInboxCommand(program);
|
|
46
|
+
registerFeaturesCommand(program);
|
|
47
|
+
registerConfigCommand(program);
|
|
42
48
|
registerClaimsCommand(program);
|
|
43
49
|
registerPRCommand(program);
|
|
44
50
|
registerTestCommand(program);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,gFAAgF;AAChF,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAwB,CAAC;AAErF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,kBAAkB,CAAC;KACxB,WAAW,CAAC,oEAAoE,CAAC;KACjF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;KACpB,MAAM,CAAC,iBAAiB,EAAE,8BAA8B,CAAC;KACzD,MAAM,CAAC,aAAa,EAAE,0CAA0C,EAAE,SAAS,CAAC,CAAC;AAEhF,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,iBAAiB,CAAC,OAAO,CAAC,CAAC;AAC3B,mBAAmB,CAAC,OAAO,CAAC,CAAC;AAC7B,yBAAyB,CAAC,OAAO,CAAC,CAAC;AACnC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { GhIssue } from "./gh.js";
|
|
2
|
+
/**
|
|
3
|
+
* Orders issues for the work loop: highest `priority:*` first, then highest
|
|
4
|
+
* `severity:*`, then most recently created (latest wins on an otherwise-equal
|
|
5
|
+
* tie). Returns a new array; the input is not mutated.
|
|
6
|
+
*/
|
|
7
|
+
export declare function sortIssuesForPickup<T extends GhIssue>(issues: T[]): T[];
|
|
8
|
+
//# sourceMappingURL=issue-order.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-order.d.ts","sourceRoot":"","sources":["../src/issue-order.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAiBvC;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAYvE"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// Higher number = picked first. Issues without a priority/severity label rank 0,
|
|
2
|
+
// so they sort after any labeled issue.
|
|
3
|
+
const PRIORITY_RANK = { critical: 4, high: 3, medium: 2, low: 1 };
|
|
4
|
+
const SEVERITY_RANK = { blocking: 4, major: 3, minor: 2, cosmetic: 1 };
|
|
5
|
+
/** Best rank among an issue's labels matching `prefix` (e.g. "priority:"). */
|
|
6
|
+
function labelRank(labels, prefix, ranks) {
|
|
7
|
+
let best = 0;
|
|
8
|
+
for (const l of labels) {
|
|
9
|
+
const name = l.name.toLowerCase();
|
|
10
|
+
if (name.startsWith(prefix))
|
|
11
|
+
best = Math.max(best, ranks[name.slice(prefix.length)] ?? 0);
|
|
12
|
+
}
|
|
13
|
+
return best;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Orders issues for the work loop: highest `priority:*` first, then highest
|
|
17
|
+
* `severity:*`, then most recently created (latest wins on an otherwise-equal
|
|
18
|
+
* tie). Returns a new array; the input is not mutated.
|
|
19
|
+
*/
|
|
20
|
+
export function sortIssuesForPickup(issues) {
|
|
21
|
+
return [...issues].sort((a, b) => {
|
|
22
|
+
const byPriority = labelRank(b.labels, "priority:", PRIORITY_RANK) - labelRank(a.labels, "priority:", PRIORITY_RANK);
|
|
23
|
+
if (byPriority !== 0)
|
|
24
|
+
return byPriority;
|
|
25
|
+
const bySeverity = labelRank(b.labels, "severity:", SEVERITY_RANK) - labelRank(a.labels, "severity:", SEVERITY_RANK);
|
|
26
|
+
if (bySeverity !== 0)
|
|
27
|
+
return bySeverity;
|
|
28
|
+
// ISO 8601 strings compare lexicographically in chronological order, so
|
|
29
|
+
// this puts the newest issue first.
|
|
30
|
+
return (b.createdAt ?? "").localeCompare(a.createdAt ?? "");
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=issue-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issue-order.js","sourceRoot":"","sources":["../src/issue-order.ts"],"names":[],"mappings":"AAEA,iFAAiF;AACjF,wCAAwC;AACxC,MAAM,aAAa,GAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;AAC1F,MAAM,aAAa,GAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;AAE/F,8EAA8E;AAC9E,SAAS,SAAS,CAAC,MAA0B,EAAE,MAAc,EAAE,KAA6B;IAC1F,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YAAE,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAoB,MAAW;IAChE,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,UAAU,GACd,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QACpG,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QACxC,MAAM,UAAU,GACd,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QACpG,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QACxC,wEAAwE;QACxE,oCAAoC;QACpC,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import type { GhPR, GhCheck, GhComment } from "./gh.js";
|
|
2
|
+
import type { MergePolicy } from "./config.js";
|
|
3
|
+
export type CiState = "passing" | "failing" | "pending" | "none";
|
|
4
|
+
export type PRState = "ci_failing" | "changes_requested" | "review_comments" | "ci_pending" | "approved_ready" | "stale" | "awaiting_review";
|
|
5
|
+
/** Collapse the status-check rollup into one CI verdict. */
|
|
6
|
+
export declare function ciStateOf(checks: GhCheck[] | undefined): CiState;
|
|
7
|
+
/**
|
|
8
|
+
* Why an open PR may need follow-up. Empty = nothing to do. "review_comments" is
|
|
9
|
+
* advisory (the comment may already be addressed); "changes_requested" and
|
|
10
|
+
* "ci_failing" are definite.
|
|
11
|
+
*/
|
|
12
|
+
export declare function prAttentionReasons(pr: GhPR, me: string): string[];
|
|
13
|
+
/** The newest comment on an issue if it's from someone other than `me` (i.e. you
|
|
14
|
+
* may owe a reply); otherwise null. */
|
|
15
|
+
export declare function issueNeedsReply(comments: GhComment[], me: string): GhComment | null;
|
|
16
|
+
/** Approved via a native GitHub review or a `shipflow-approved`-style label. */
|
|
17
|
+
export declare function isApproved(pr: GhPR): boolean;
|
|
18
|
+
/** Whole hours since an ISO timestamp. */
|
|
19
|
+
export declare function hoursSince(iso: string | undefined, nowMs?: number): number;
|
|
20
|
+
export interface PRClassification {
|
|
21
|
+
number: number;
|
|
22
|
+
state: PRState;
|
|
23
|
+
ciState: CiState;
|
|
24
|
+
approved: boolean;
|
|
25
|
+
ageHours: number;
|
|
26
|
+
reasons: string[];
|
|
27
|
+
needsAction: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Reduce a PR to the single next action the loop should take. Priority: a red
|
|
31
|
+
* build and explicit change requests come before advisory comments; pending CI
|
|
32
|
+
* means wait; an approved+green PR is a merge candidate; otherwise it's parked
|
|
33
|
+
* (or stale once it ages past the threshold).
|
|
34
|
+
*/
|
|
35
|
+
export declare function classifyPR(pr: GhPR, me: string, opts?: {
|
|
36
|
+
staleHours?: number;
|
|
37
|
+
nowMs?: number;
|
|
38
|
+
}): PRClassification;
|
|
39
|
+
export interface MergeDecision {
|
|
40
|
+
policy: MergePolicy;
|
|
41
|
+
wouldMerge: boolean;
|
|
42
|
+
blockers: string[];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Decide whether the loop may merge this PR under the active policy. A red or
|
|
46
|
+
* pending build, a merge conflict, or requested changes always block. Approval
|
|
47
|
+
* is required for `auto-on-green`; `auto-timeout` also accepts a green PR that
|
|
48
|
+
* has aged past the stale threshold with no objection. `manual` never merges.
|
|
49
|
+
*/
|
|
50
|
+
export declare function mergeDecision(pr: GhPR, me: string, opts: {
|
|
51
|
+
policy: MergePolicy;
|
|
52
|
+
requireCi: boolean;
|
|
53
|
+
staleHours: number;
|
|
54
|
+
nowMs?: number;
|
|
55
|
+
unresolvedThreads?: number;
|
|
56
|
+
}): MergeDecision;
|
|
57
|
+
//# sourceMappingURL=pr-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pr-state.d.ts","sourceRoot":"","sources":["../src/pr-state.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;AAEjE,MAAM,MAAM,OAAO,GACf,YAAY,GACZ,mBAAmB,GACnB,iBAAiB,GACjB,YAAY,GACZ,gBAAgB,GAChB,OAAO,GACP,iBAAiB,CAAC;AAUtB,4DAA4D;AAC5D,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,SAAS,GAAG,OAAO,CAqBhE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAcjE;AAED;uCACuC;AACvC,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAInF;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,CAG5C;AAED,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,GAAE,MAAmB,GAAG,MAAM,CAKtF;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,MAAM,EACV,IAAI,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACjD,gBAAgB,CAkBlB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,EAAE,EAAE,IAAI,EACR,EAAE,EAAE,MAAM,EACV,IAAI,EAAE;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAAE,GAChH,aAAa,CAoBf"}
|