@motivation-labs/crosscheck 0.14.0-beta.61 → 0.14.0-beta.68

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.
@@ -1,17 +1,23 @@
1
1
  import { describe, it, expect, vi, beforeEach } from 'vitest';
2
- import { scanUnreviewedPRs, buildScopesFromConfig } from '../lib/backtrace.js';
2
+ import { scanUnreviewedPRs, scanOpenPRStatuses, buildScopesFromConfig } from '../lib/backtrace.js';
3
3
  import { ConfigSchema } from '../config/schema.js';
4
4
  vi.mock('../github/client.js', () => ({
5
5
  listOpenPRs: vi.fn(),
6
6
  listOrgRepos: vi.fn(),
7
7
  listUserRepos: vi.fn(),
8
8
  prHasCrossCheckComment: vi.fn(),
9
+ listPRComments: vi.fn(),
10
+ listPRCommitsDetailed: vi.fn(),
11
+ listCommitStatuses: vi.fn(),
9
12
  }));
10
- const { listOpenPRs, listOrgRepos, listUserRepos, prHasCrossCheckComment } = await import('../github/client.js');
13
+ const { listOpenPRs, listOrgRepos, listUserRepos, prHasCrossCheckComment, listPRComments, listPRCommitsDetailed, listCommitStatuses, } = await import('../github/client.js');
11
14
  const mockListOpenPRs = vi.mocked(listOpenPRs);
12
15
  const mockListOrgRepos = vi.mocked(listOrgRepos);
13
16
  const mockListUserRepos = vi.mocked(listUserRepos);
14
17
  const mockPrHasCrossCheckComment = vi.mocked(prHasCrossCheckComment);
18
+ const mockListPRComments = vi.mocked(listPRComments);
19
+ const mockListPRCommitsDetailed = vi.mocked(listPRCommitsDetailed);
20
+ const mockListCommitStatuses = vi.mocked(listCommitStatuses);
15
21
  const defaultConfig = ConfigSchema.parse({});
16
22
  function makePR(overrides = {}) {
17
23
  return {
@@ -24,6 +30,7 @@ function makePR(overrides = {}) {
24
30
  baseRef: 'main',
25
31
  body: null,
26
32
  createdAt: overrides.createdAt ?? '2025-01-01T00:00:00Z',
33
+ updatedAt: overrides.updatedAt ?? overrides.createdAt ?? '2025-01-01T00:00:00Z',
27
34
  };
28
35
  }
29
36
  beforeEach(() => {
@@ -155,4 +162,119 @@ describe('buildScopesFromConfig', () => {
155
162
  expect(scopes).not.toContainEqual(expect.objectContaining({ owner: 'alice' }));
156
163
  });
157
164
  });
165
+ describe('scanOpenPRStatuses', () => {
166
+ it('records org expansion failures as scope failures', async () => {
167
+ const scopes = [{ org: 'acme' }];
168
+ mockListOrgRepos.mockRejectedValue(new Error('org unavailable'));
169
+ const result = await scanOpenPRStatuses(scopes, defaultConfig, 'token');
170
+ expect(result.statuses).toEqual([]);
171
+ expect(result.failures).toEqual([
172
+ {
173
+ owner: 'acme',
174
+ stage: 'scope',
175
+ message: 'org unavailable',
176
+ },
177
+ ]);
178
+ expect(result.scannedRepos).toBe(0);
179
+ expect(result.scannedPRs).toBe(0);
180
+ expect(mockListOpenPRs).not.toHaveBeenCalled();
181
+ });
182
+ it('records repo listing failures and continues scanning other repos', async () => {
183
+ const scopes = [
184
+ { owner: 'acme', repo: 'broken' },
185
+ { owner: 'acme', repo: 'api' },
186
+ ];
187
+ mockListOpenPRs
188
+ .mockRejectedValueOnce(new Error('repo unavailable'))
189
+ .mockResolvedValueOnce([makePR({ number: 2 })]);
190
+ mockListPRComments.mockResolvedValue([]);
191
+ mockListPRCommitsDetailed.mockResolvedValue([]);
192
+ mockListCommitStatuses.mockResolvedValue([]);
193
+ const result = await scanOpenPRStatuses(scopes, defaultConfig, 'token');
194
+ expect(result.statuses.map(s => s.pr.number)).toEqual([2]);
195
+ expect(result.failures).toEqual([
196
+ {
197
+ owner: 'acme',
198
+ repo: 'broken',
199
+ stage: 'repo',
200
+ message: 'repo unavailable',
201
+ },
202
+ ]);
203
+ expect(result.scannedRepos).toBe(2);
204
+ expect(result.scannedPRs).toBe(1);
205
+ });
206
+ it('returns folded PR statuses for open PRs in scope', async () => {
207
+ const scopes = [{ owner: 'acme', repo: 'api' }];
208
+ mockListOpenPRs.mockResolvedValue([makePR({ number: 1 })]);
209
+ mockListPRComments.mockResolvedValue([
210
+ {
211
+ id: 11,
212
+ body: '### Code Review by ⚡ Codex\n\nok\n\n<!-- crosscheck: origin=claude reviewer=codex verdict=APPROVE type=review -->',
213
+ createdAt: '2026-01-01T01:00:00Z',
214
+ updatedAt: '2026-01-01T01:00:00Z',
215
+ },
216
+ ]);
217
+ mockListPRCommitsDetailed.mockResolvedValue([{ sha: 'abc123', committedAt: '2026-01-01T00:30:00Z' }]);
218
+ mockListCommitStatuses.mockResolvedValue([{ context: 'crosscheck/review', state: 'success', updatedAt: '2026-01-01T01:05:00Z' }]);
219
+ const result = await scanOpenPRStatuses(scopes, defaultConfig, 'token');
220
+ expect(result.statuses).toHaveLength(1);
221
+ expect(result.statuses[0].state).toBe('APPROVE');
222
+ expect(result.statuses[0].lastActive.toISOString()).toBe('2026-01-01T01:05:00.000Z');
223
+ expect(result.failures).toEqual([]);
224
+ expect(mockListPRComments).toHaveBeenCalledWith('acme', 'api', 1, 'token');
225
+ });
226
+ it('records partial failures and continues scanning other PRs', async () => {
227
+ const scopes = [{ owner: 'acme', repo: 'api' }];
228
+ mockListOpenPRs.mockResolvedValue([
229
+ makePR({ number: 1 }),
230
+ makePR({ number: 2 }),
231
+ ]);
232
+ mockListPRComments
233
+ .mockRejectedValueOnce(new Error('comments unavailable'))
234
+ .mockResolvedValueOnce([]);
235
+ mockListPRCommitsDetailed.mockResolvedValue([]);
236
+ mockListCommitStatuses.mockResolvedValue([]);
237
+ const result = await scanOpenPRStatuses(scopes, defaultConfig, 'token');
238
+ expect(result.statuses.map(s => s.pr.number)).toEqual([2]);
239
+ expect(result.failures).toEqual([
240
+ {
241
+ owner: 'acme',
242
+ repo: 'api',
243
+ pr: 1,
244
+ stage: 'pr',
245
+ message: 'comments unavailable',
246
+ },
247
+ ]);
248
+ });
249
+ it('honors allowed_authors before fetching per-PR details', async () => {
250
+ const config = ConfigSchema.parse({ routing: { allowed_authors: ['bob'] } });
251
+ const scopes = [{ owner: 'acme', repo: 'api' }];
252
+ mockListOpenPRs.mockResolvedValue([makePR({ number: 1, author: 'alice' })]);
253
+ const result = await scanOpenPRStatuses(scopes, config, 'token');
254
+ expect(result.statuses).toEqual([]);
255
+ expect(result.skippedAuthor).toBe(1);
256
+ expect(mockListPRComments).not.toHaveBeenCalled();
257
+ });
258
+ it('records org scope expansion failures and continues scanning other scopes', async () => {
259
+ const scopes = [
260
+ { org: 'broken-org' },
261
+ { owner: 'acme', repo: 'api' },
262
+ ];
263
+ mockListOrgRepos.mockRejectedValue(new Error('org unavailable'));
264
+ mockListOpenPRs.mockResolvedValue([makePR({ number: 1 })]);
265
+ mockListPRComments.mockResolvedValue([]);
266
+ mockListPRCommitsDetailed.mockResolvedValue([]);
267
+ mockListCommitStatuses.mockResolvedValue([]);
268
+ const result = await scanOpenPRStatuses(scopes, defaultConfig, 'token');
269
+ expect(result.statuses.map(status => status.pr.number)).toEqual([1]);
270
+ expect(result.failures).toEqual([
271
+ {
272
+ owner: 'broken-org',
273
+ stage: 'scope',
274
+ message: 'org unavailable',
275
+ },
276
+ ]);
277
+ expect(result.scannedRepos).toBe(1);
278
+ });
279
+ });
158
280
  //# sourceMappingURL=backtrace.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"backtrace.test.js","sourceRoot":"","sources":["../../src/__tests__/backtrace.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"backtrace.test.js","sourceRoot":"","sources":["../../src/__tests__/backtrace.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=github-client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-client.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/github-client.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import { listOpenPRs, listOrgRepos } from '../github/client.js';
3
+ afterEach(() => {
4
+ vi.unstubAllGlobals();
5
+ });
6
+ describe('github client listing failures', () => {
7
+ it('throws when listOpenPRs receives a non-OK response', async () => {
8
+ vi.stubGlobal('fetch', vi.fn().mockResolvedValue(new Response(JSON.stringify({ message: 'server error' }), {
9
+ status: 500,
10
+ statusText: 'Internal Server Error',
11
+ })));
12
+ await expect(listOpenPRs('acme', 'api', 'token')).rejects.toThrow('Failed to list open PRs [500]: Internal Server Error');
13
+ });
14
+ it('throws when listOrgRepos receives a non-OK response', async () => {
15
+ vi.stubGlobal('fetch', vi.fn().mockResolvedValue(new Response(JSON.stringify({ message: 'rate limited' }), {
16
+ status: 403,
17
+ statusText: 'Forbidden',
18
+ })));
19
+ await expect(listOrgRepos('acme', 'token')).rejects.toThrow('Failed to list org repos [403]: Forbidden');
20
+ });
21
+ });
22
+ //# sourceMappingURL=github-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-client.test.js","sourceRoot":"","sources":["../../src/__tests__/github-client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAE/D,SAAS,CAAC,GAAG,EAAE;IACb,EAAE,CAAC,gBAAgB,EAAE,CAAA;AACvB,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAC9C,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE;YACxD,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,uBAAuB;SACpC,CAAC,CACH,CAAC,CAAA;QAEF,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC/D,sDAAsD,CACvD,CAAA;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAC9C,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE;YACxD,MAAM,EAAE,GAAG;YACX,UAAU,EAAE,WAAW;SACxB,CAAC,CACH,CAAC,CAAA;QAEF,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACzD,2CAA2C,CAC5C,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pr-status.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-status.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/pr-status.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,137 @@
1
+ import { describe, expect, it, vi } from 'vitest';
2
+ import { buildProgressSummary, computeLastActive, computeTokenTotals, foldPRStatus, isStale, } from '../lib/pr-status.js';
3
+ const BASE_PR = {
4
+ owner: 'acme',
5
+ repo: 'api',
6
+ number: 42,
7
+ title: 'Add scanner',
8
+ author: 'alice',
9
+ headSha: 'abc123',
10
+ headRef: 'feat/scanner',
11
+ headRepo: 'acme/api',
12
+ baseRef: 'main',
13
+ body: null,
14
+ createdAt: '2026-01-01T00:00:00Z',
15
+ updatedAt: '2026-01-01T00:10:00Z',
16
+ };
17
+ function comment(body, createdAt) {
18
+ return { id: 1, body, createdAt, updatedAt: createdAt };
19
+ }
20
+ function reviewComment(verdict, createdAt, type = 'review') {
21
+ return comment(`### Code Review by ⚡ Codex\n\nBody\n\n<!-- crosscheck: origin=claude reviewer=codex verdict=${verdict} type=${type} -->`, createdAt);
22
+ }
23
+ describe('foldPRStatus', () => {
24
+ it('returns PR when there is no crosscheck comment', () => {
25
+ const status = foldPRStatus(BASE_PR, [], []);
26
+ expect(status.state).toBe('PR');
27
+ expect(status.nextAction).toBe('review');
28
+ expect(status.verdict).toBeNull();
29
+ });
30
+ it('returns APPROVE from the latest crosscheck annotation', () => {
31
+ const status = foldPRStatus(BASE_PR, [
32
+ reviewComment('NEEDS_WORK', '2026-01-01T01:00:00Z'),
33
+ reviewComment('APPROVE', '2026-01-01T02:00:00Z', 'recheck'),
34
+ ], []);
35
+ expect(status.state).toBe('APPROVE');
36
+ expect(status.nextAction).toBe('none');
37
+ expect(status.verdict).toBe('APPROVE');
38
+ });
39
+ it('returns RECHECK when NEEDS_WORK has a later fix but no later recheck', () => {
40
+ const logs = [
41
+ {
42
+ ts: '2026-01-01T03:00:00Z',
43
+ level: 'info',
44
+ event: 'fix_complete',
45
+ repo: 'acme/api',
46
+ pr: 42,
47
+ sha: 'def456',
48
+ applied_count: 3,
49
+ tokens_used: 8400,
50
+ },
51
+ ];
52
+ const status = foldPRStatus(BASE_PR, [
53
+ reviewComment('NEEDS_WORK', '2026-01-01T02:00:00Z'),
54
+ ], logs);
55
+ expect(status.state).toBe('RECHECK');
56
+ expect(status.nextAction).toBe('recheck');
57
+ expect(buildProgressSummary(status)).toBe('PR -> CR(NEEDS_WORK) -> Fix(3, 8.4K)');
58
+ });
59
+ it('maps BLOCK to next action fix', () => {
60
+ const status = foldPRStatus(BASE_PR, [
61
+ reviewComment('BLOCK', '2026-01-01T02:00:00Z'),
62
+ ], []);
63
+ expect(status.state).toBe('BLOCK');
64
+ expect(status.nextAction).toBe('fix');
65
+ });
66
+ it('ignores quoted annotations and uses the footer annotation', () => {
67
+ const status = foldPRStatus(BASE_PR, [
68
+ comment([
69
+ 'The review text mentions `<!-- crosscheck: origin=claude reviewer=codex verdict=APPROVE type=review -->` as an example.',
70
+ '> <!-- crosscheck: origin=claude reviewer=codex verdict=APPROVE type=review -->',
71
+ '',
72
+ '```',
73
+ '<!-- crosscheck: origin=claude reviewer=codex verdict=APPROVE type=review -->',
74
+ '```',
75
+ '',
76
+ '<!-- crosscheck: origin=claude reviewer=codex verdict=BLOCK type=review -->',
77
+ ].join('\n'), '2026-01-01T02:00:00Z'),
78
+ ], []);
79
+ expect(status.state).toBe('BLOCK');
80
+ expect(status.verdict).toBe('BLOCK');
81
+ });
82
+ it('builds a capped progress summary with two fix/recheck rounds', () => {
83
+ const status = foldPRStatus(BASE_PR, [
84
+ reviewComment('NEEDS_WORK', '2026-01-01T01:00:00Z'),
85
+ reviewComment('NEEDS_WORK', '2026-01-01T03:00:00Z', 'recheck'),
86
+ reviewComment('APPROVE', '2026-01-01T05:00:00Z', 'recheck'),
87
+ ], [
88
+ { ts: '2026-01-01T02:00:00Z', level: 'info', event: 'fix_complete', repo: 'acme/api', pr: 42, applied_count: 3, tokens_used: 8400 },
89
+ { ts: '2026-01-01T04:00:00Z', level: 'info', event: 'fix_complete', repo: 'acme/api', pr: 42, applied_count: 1, tokens_used: 1200 },
90
+ { ts: '2026-01-01T06:00:00Z', level: 'info', event: 'fix_complete', repo: 'acme/api', pr: 42, applied_count: 2, tokens_used: 2200 },
91
+ ]);
92
+ expect(buildProgressSummary(status)).toBe('PR -> CR(NEEDS_WORK) -> Fix(3, 8.4K) -> Recheck(NEEDS_WORK) -> Fix(1, 1.2K) -> Recheck(APPROVE)');
93
+ });
94
+ });
95
+ describe('stale activity', () => {
96
+ it('uses the latest activity instead of PR creation time', () => {
97
+ vi.useFakeTimers();
98
+ vi.setSystemTime(new Date('2026-01-10T00:00:00Z'));
99
+ try {
100
+ const pr = {
101
+ ...BASE_PR,
102
+ createdAt: '2025-01-01T00:00:00Z',
103
+ updatedAt: '2025-01-01T00:00:00Z',
104
+ commits: [{ sha: 'abc123', committedAt: '2026-01-09T23:00:00Z' }],
105
+ };
106
+ const status = foldPRStatus(pr, [], []);
107
+ expect(computeLastActive(pr, [], []).toISOString()).toBe('2026-01-09T23:00:00.000Z');
108
+ expect(isStale(status, 2 * 60 * 60 * 1000)).toBe(false);
109
+ expect(isStale(status, 30 * 60 * 1000)).toBe(true);
110
+ }
111
+ finally {
112
+ vi.useRealTimers();
113
+ }
114
+ });
115
+ });
116
+ describe('computeTokenTotals', () => {
117
+ it('aggregates review, fix, and recheck tokens per PR and head SHA', () => {
118
+ const totals = computeTokenTotals([
119
+ { ts: '2026-01-01T01:00:00Z', level: 'info', event: 'review_complete', repo: 'acme/api', pr: 42, sha: 'abc123', step_type: 'review', tokens_used: 1000 },
120
+ { ts: '2026-01-01T02:00:00Z', level: 'info', event: 'fix_complete', repo: 'acme/api', pr: 42, sha: 'abc123', tokens_used: 2500 },
121
+ { ts: '2026-01-01T03:00:00Z', level: 'info', event: 'review_complete', repo: 'acme/api', pr: 42, sha: 'abc123', step_type: 'recheck', tokens_used: 1500 },
122
+ { ts: '2026-01-01T04:00:00Z', level: 'info', event: 'review_complete', repo: 'acme/web', pr: 7, tokens_used: 500 },
123
+ { ts: '2026-01-01T05:00:00Z', level: 'info', event: 'fix_complete', repo: 'acme/api', pr: 42 },
124
+ ]);
125
+ expect(totals.byPR['acme/api#42']).toEqual({ review: 1000, fix: 2500, recheck: 1500, total: 5000 });
126
+ expect(totals.byPRHeadSha['acme/api#42@abc123']).toEqual({ review: 1000, fix: 2500, recheck: 1500, total: 5000 });
127
+ expect(totals.byPR['acme/web#7']).toEqual({ review: 500, fix: 0, recheck: 0, total: 500 });
128
+ });
129
+ it('counts legacy review_complete logs with type=recheck as recheck tokens', () => {
130
+ const totals = computeTokenTotals([
131
+ { ts: '2026-01-01T01:00:00Z', level: 'info', event: 'review_complete', repo: 'acme/api', pr: 42, sha: 'abc123', type: 'recheck', tokens_used: 700 },
132
+ ]);
133
+ expect(totals.byPR['acme/api#42']).toEqual({ review: 0, fix: 0, recheck: 700, total: 700 });
134
+ expect(totals.byPRHeadSha['acme/api#42@abc123']).toEqual({ review: 0, fix: 0, recheck: 700, total: 700 });
135
+ });
136
+ });
137
+ //# sourceMappingURL=pr-status.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-status.test.js","sourceRoot":"","sources":["../../src/__tests__/pr-status.test.ts"],"names":[],"mappings":"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"}
@@ -34,8 +34,27 @@ export interface OpenPR {
34
34
  baseRef: string;
35
35
  body: string | null;
36
36
  createdAt: string;
37
+ updatedAt: string;
37
38
  }
38
39
  export declare function listOpenPRs(owner: string, repo: string, token: string): Promise<OpenPR[]>;
40
+ export interface PRComment {
41
+ id: number;
42
+ body: string;
43
+ createdAt: string;
44
+ updatedAt: string;
45
+ }
46
+ export declare function listPRComments(owner: string, repo: string, prNumber: number, token: string): Promise<PRComment[]>;
47
+ export interface PRCommitDetail {
48
+ sha: string;
49
+ committedAt: string;
50
+ }
51
+ export declare function listPRCommitsDetailed(owner: string, repo: string, prNumber: number, token: string): Promise<PRCommitDetail[]>;
52
+ export interface CommitStatusDetail {
53
+ context: string;
54
+ state: string;
55
+ updatedAt: string;
56
+ }
57
+ export declare function listCommitStatuses(owner: string, repo: string, sha: string, token: string): Promise<CommitStatusDetail[]>;
39
58
  export declare function prHasCrossCheckComment(owner: string, repo: string, prNumber: number, token: string): Promise<boolean>;
40
59
  export declare function isFreshReviewComment(body: string): boolean;
41
60
  export declare function getLastCrossCheckCommentId(owner: string, repo: string, prNumber: number, token: string): Promise<number | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/github/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/github/client.ts"],"names":[],"mappings":"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"}
@@ -131,8 +131,11 @@ export async function listOrgRepos(org, token) {
131
131
  let page = 1;
132
132
  while (true) {
133
133
  const res = await fetch(`https://api.github.com/orgs/${org}/repos?per_page=100&page=${page}&sort=pushed&type=all`, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' } });
134
- if (!res.ok)
134
+ if (!res.ok) {
135
+ if (page === 1)
136
+ throw new Error(`Failed to list org repos [${res.status}]: ${res.statusText}`);
135
137
  break;
138
+ }
136
139
  const data = await res.json();
137
140
  if (data.length === 0)
138
141
  break;
@@ -152,8 +155,11 @@ export async function listOpenPRs(owner, repo, token) {
152
155
  let page = 1;
153
156
  while (true) {
154
157
  const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/pulls?state=open&per_page=100&page=${page}`, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' } });
155
- if (!res.ok)
158
+ if (!res.ok) {
159
+ if (page === 1)
160
+ throw new Error(`Failed to list open PRs [${res.status}]: ${res.statusText}`);
156
161
  break;
162
+ }
157
163
  const data = await res.json();
158
164
  if (data.length === 0)
159
165
  break;
@@ -168,6 +174,31 @@ export async function listOpenPRs(owner, repo, token) {
168
174
  baseRef: pr.base.ref,
169
175
  body: pr.body,
170
176
  createdAt: pr.created_at,
177
+ updatedAt: pr.updated_at,
178
+ });
179
+ }
180
+ if (data.length < 100)
181
+ break;
182
+ page++;
183
+ }
184
+ return results;
185
+ }
186
+ export async function listPRComments(owner, repo, prNumber, token) {
187
+ const results = [];
188
+ let page = 1;
189
+ while (true) {
190
+ const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/issues/${prNumber}/comments?per_page=100&page=${page}`, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' } });
191
+ if (!res.ok)
192
+ throw new Error(`Failed to list PR comments [${res.status}]: ${res.statusText}`);
193
+ const data = await res.json();
194
+ if (data.length === 0)
195
+ break;
196
+ for (const comment of data) {
197
+ results.push({
198
+ id: comment.id,
199
+ body: comment.body,
200
+ createdAt: comment.created_at,
201
+ updatedAt: comment.updated_at,
171
202
  });
172
203
  }
173
204
  if (data.length < 100)
@@ -176,6 +207,49 @@ export async function listOpenPRs(owner, repo, token) {
176
207
  }
177
208
  return results;
178
209
  }
210
+ export async function listPRCommitsDetailed(owner, repo, prNumber, token) {
211
+ const results = [];
212
+ let page = 1;
213
+ while (true) {
214
+ const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/pulls/${prNumber}/commits?per_page=100&page=${page}`, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' } });
215
+ if (!res.ok)
216
+ throw new Error(`Failed to list PR commits [${res.status}]: ${res.statusText}`);
217
+ const data = await res.json();
218
+ if (data.length === 0)
219
+ break;
220
+ for (const commit of data) {
221
+ const committedAt = commit.commit.committer.date ?? commit.commit.author.date;
222
+ if (committedAt)
223
+ results.push({ sha: commit.sha, committedAt });
224
+ }
225
+ if (data.length < 100)
226
+ break;
227
+ page++;
228
+ }
229
+ return results;
230
+ }
231
+ export async function listCommitStatuses(owner, repo, sha, token) {
232
+ const results = [];
233
+ let page = 1;
234
+ while (true) {
235
+ const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/commits/${sha}/statuses?per_page=100&page=${page}`, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' } });
236
+ if (!res.ok) {
237
+ if (page === 1)
238
+ throw new Error(`Failed to list commit statuses [${res.status}]: ${res.statusText}`);
239
+ break;
240
+ }
241
+ const data = await res.json();
242
+ if (data.length === 0)
243
+ break;
244
+ for (const status of data) {
245
+ results.push({ context: status.context, state: status.state, updatedAt: status.updated_at });
246
+ }
247
+ if (data.length < 100)
248
+ break;
249
+ page++;
250
+ }
251
+ return results;
252
+ }
179
253
  // Returns true if any comment on the PR contains '[crosscheck]' — meaning it
180
254
  // has already been reviewed by this tool.
181
255
  export async function prHasCrossCheckComment(owner, repo, prNumber, token) {