@motivation-labs/crosscheck 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +24 -7
  2. package/crosscheck.config.example.yml +90 -4
  3. package/dist/__tests__/backtrace.test.d.ts +2 -0
  4. package/dist/__tests__/backtrace.test.d.ts.map +1 -0
  5. package/dist/__tests__/backtrace.test.js +158 -0
  6. package/dist/__tests__/backtrace.test.js.map +1 -0
  7. package/dist/__tests__/optimize.test.js +16 -3
  8. package/dist/__tests__/optimize.test.js.map +1 -1
  9. package/dist/cli.js +8 -2
  10. package/dist/cli.js.map +1 -1
  11. package/dist/commands/diagnose.d.ts +1 -0
  12. package/dist/commands/diagnose.d.ts.map +1 -1
  13. package/dist/commands/diagnose.js +14 -0
  14. package/dist/commands/diagnose.js.map +1 -1
  15. package/dist/commands/init.d.ts.map +1 -1
  16. package/dist/commands/init.js +55 -18
  17. package/dist/commands/init.js.map +1 -1
  18. package/dist/commands/review.d.ts.map +1 -1
  19. package/dist/commands/review.js +11 -5
  20. package/dist/commands/review.js.map +1 -1
  21. package/dist/commands/serve.d.ts +7 -1
  22. package/dist/commands/serve.d.ts.map +1 -1
  23. package/dist/commands/serve.js +109 -16
  24. package/dist/commands/serve.js.map +1 -1
  25. package/dist/commands/status.d.ts.map +1 -1
  26. package/dist/commands/status.js +1 -0
  27. package/dist/commands/status.js.map +1 -1
  28. package/dist/commands/watch.d.ts +7 -1
  29. package/dist/commands/watch.d.ts.map +1 -1
  30. package/dist/commands/watch.js +349 -143
  31. package/dist/commands/watch.js.map +1 -1
  32. package/dist/config/loader.d.ts +8 -0
  33. package/dist/config/loader.d.ts.map +1 -1
  34. package/dist/config/loader.js +143 -0
  35. package/dist/config/loader.js.map +1 -1
  36. package/dist/config/schema.d.ts +445 -27
  37. package/dist/config/schema.d.ts.map +1 -1
  38. package/dist/config/schema.js +70 -7
  39. package/dist/config/schema.js.map +1 -1
  40. package/dist/github/client.d.ts +26 -0
  41. package/dist/github/client.d.ts.map +1 -1
  42. package/dist/github/client.js +153 -0
  43. package/dist/github/client.js.map +1 -1
  44. package/dist/github/detector.d.ts +8 -1
  45. package/dist/github/detector.d.ts.map +1 -1
  46. package/dist/github/detector.js +84 -12
  47. package/dist/github/detector.js.map +1 -1
  48. package/dist/lib/backtrace.d.ts +20 -0
  49. package/dist/lib/backtrace.d.ts.map +1 -0
  50. package/dist/lib/backtrace.js +75 -0
  51. package/dist/lib/backtrace.js.map +1 -0
  52. package/dist/lib/board.d.ts +52 -0
  53. package/dist/lib/board.d.ts.map +1 -0
  54. package/dist/lib/board.js +394 -0
  55. package/dist/lib/board.js.map +1 -0
  56. package/dist/lib/runner.d.ts +10 -1
  57. package/dist/lib/runner.d.ts.map +1 -1
  58. package/dist/lib/runner.js +129 -51
  59. package/dist/lib/runner.js.map +1 -1
  60. package/dist/lib/verdict.d.ts +1 -0
  61. package/dist/lib/verdict.d.ts.map +1 -1
  62. package/dist/lib/verdict.js +27 -7
  63. package/dist/lib/verdict.js.map +1 -1
  64. package/dist/lib/workflow.d.ts +8 -8
  65. package/dist/lib/workflow.d.ts.map +1 -1
  66. package/dist/lib/workflow.js +22 -5
  67. package/dist/lib/workflow.js.map +1 -1
  68. package/dist/reviewers/claude.d.ts +1 -1
  69. package/dist/reviewers/claude.d.ts.map +1 -1
  70. package/dist/reviewers/claude.js +4 -6
  71. package/dist/reviewers/claude.js.map +1 -1
  72. package/dist/reviewers/codex.d.ts +2 -2
  73. package/dist/reviewers/codex.d.ts.map +1 -1
  74. package/dist/reviewers/codex.js +6 -6
  75. package/dist/reviewers/codex.js.map +1 -1
  76. package/dist/reviewers/fix.d.ts +5 -0
  77. package/dist/reviewers/fix.d.ts.map +1 -0
  78. package/dist/reviewers/fix.js +87 -0
  79. package/dist/reviewers/fix.js.map +1 -0
  80. package/get-started.md +190 -21
  81. package/package.json +1 -1
@@ -1,10 +1,15 @@
1
1
  import { z } from 'zod';
2
2
  export const VendorConfigSchema = z.object({
3
3
  enabled: z.boolean().default(true),
4
- model: z.string().optional(),
4
+ model: z.string().nullable().default(null),
5
5
  auth: z.enum(['subscription', 'api-key']).default('subscription'),
6
6
  effort: z.enum(['low', 'medium', 'high', 'max']).default('medium'),
7
7
  });
8
+ // Codex-specific vendor config. The `quality` field is retained for
9
+ // backwards compat but is no longer passed as --quality (removed from codex CLI).
10
+ export const CodexVendorConfigSchema = VendorConfigSchema.extend({
11
+ quality: z.enum(['low', 'medium', 'high']).default('medium'),
12
+ });
8
13
  export const QualityConfigSchema = z.object({
9
14
  tier: z.enum(['fast', 'balanced', 'thorough']).default('balanced'),
10
15
  focus: z.array(z.string()).default([]),
@@ -20,20 +25,32 @@ export const RepoConfigSchema = z.object({
20
25
  });
21
26
  export const RoutingConfigSchema = z.object({
22
27
  codex_reviews_patterns: z.array(z.string()).default([
23
- 'Generated with \\[Claude Code\\]',
28
+ 'Generated with \\[Claude Code\\]', // PR body attribution footer
29
+ 'Co-Authored-By: Claude', // commit trailer added by Claude Code
24
30
  ]),
25
31
  claude_reviews_patterns: z.array(z.string()).default([
26
- 'Generated with \\[OpenAI Codex\\]',
27
- 'Co-Authored-By: codex',
32
+ 'Generated with \\[OpenAI Codex\\]', // PR body attribution footer
33
+ 'Co-Authored-By: codex', // commit trailer added by Codex
28
34
  ]),
35
+ // Branch prefix routing — checked when body and commit patterns don't match.
36
+ // Agents should branch with these prefixes so crosscheck can identify origin
37
+ // even without attribution text in the PR body.
38
+ claude_branch_prefixes: z.array(z.string()).default(['claude/']),
39
+ codex_branch_prefixes: z.array(z.string()).default(['codex/']),
29
40
  // Only review PRs opened by these GitHub logins.
30
41
  // Empty list = no restriction (reviews all AI-authored PRs in cross-vendor mode,
31
42
  // or all PRs in single-vendor mode). Recommended: set to the logins of your AI agents.
32
43
  allowed_authors: z.array(z.string()).default([]),
33
- // Fallback origin when no body pattern matches. Maps GitHub login → vendor origin.
44
+ // Last-resort fallback when body, commit, and branch checks all fail.
45
+ // Maps GitHub login → vendor origin.
34
46
  // e.g. { beingzy: 'claude' } means PRs from beingzy are treated as Claude-authored
35
- // and will be reviewed by Codex, even without the attribution footer in the PR body.
47
+ // and will be reviewed by Codex, even without any other attribution signal.
36
48
  author_routes: z.record(z.enum(['claude', 'codex'])).default({}),
49
+ // When origin detection cannot determine a vendor (origin: human), use this reviewer
50
+ // instead of skipping the PR.
51
+ // 'auto' = pick whichever vendor is currently enabled (codex first, then claude).
52
+ // null = skip the PR (legacy behaviour, cross-vendor mode only).
53
+ fallback_reviewer: z.enum(['auto', 'codex', 'claude']).nullable().default('auto'),
37
54
  });
38
55
  export const ServerConfigSchema = z.object({
39
56
  port: z.number().default(7891),
@@ -55,20 +72,66 @@ export const ImpactConfigSchema = z.object({
55
72
  hourly_rate_usd: z.number().min(0).default(150),
56
73
  defect_cost_usd: z.number().min(0).default(150),
57
74
  });
75
+ export const BacktraceConfigSchema = z.object({
76
+ // Scan for open PRs without a [crosscheck] comment on startup.
77
+ enabled: z.boolean().default(true),
78
+ });
79
+ export const PostReviewDeliverySchema = z.object({
80
+ // pull_request → opens a fix PR targeting the original branch (human approves before merge)
81
+ // commit → pushes fixes directly onto the original PR branch
82
+ // comment → posts suggested changes as review comments only (no code push)
83
+ mode: z.enum(['pull_request', 'commit', 'comment']).default('pull_request'),
84
+ pr_title: z.string().default('fix: address CR issues in #{original_pr_title}'),
85
+ label: z.string().default('cr-autofix'),
86
+ });
87
+ export const PostReviewFixSchema = z.object({
88
+ enabled: z.boolean().default(false),
89
+ // on_issues → only run when the reviewer found actionable issues
90
+ // always → always run after every review
91
+ // never → disable (same as enabled: false)
92
+ trigger: z.enum(['on_issues', 'always', 'never']).default('on_issues'),
93
+ // minimum severity level that qualifies as "actionable"
94
+ min_severity: z.enum(['error', 'warning', 'info']).default('warning'),
95
+ // same-as-author → the vendor that wrote the PR also fixes it (recommended)
96
+ // same-as-reviewer → the reviewing vendor also proposes fixes
97
+ // codex / claude → always use a specific vendor
98
+ fixer: z.enum(['same-as-author', 'same-as-reviewer', 'codex', 'claude']).default('same-as-author'),
99
+ delivery: PostReviewDeliverySchema.default({}),
100
+ });
101
+ export const PostReviewConfigSchema = z.object({
102
+ auto_fix: PostReviewFixSchema.default({}),
103
+ });
104
+ export const DisplayThemeSchema = z.object({
105
+ bar_fill: z.string().default('blue'),
106
+ bar_empty: z.string().default('dim'),
107
+ cr_approve: z.string().default('green'),
108
+ cr_needs_work: z.string().default('yellow'),
109
+ cr_block: z.string().default('red'),
110
+ fix_fill: z.string().default('cyan'),
111
+ });
112
+ export const DisplayConfigSchema = z.object({
113
+ theme: DisplayThemeSchema.default({}),
114
+ });
58
115
  export const ConfigSchema = z.object({
116
+ // Absent = not yet configured; watch/serve will prompt on first run.
117
+ deployment: z.enum(['personal', 'team']).optional(),
59
118
  mode: z.enum(['single-vendor', 'cross-vendor']).default('cross-vendor'),
60
119
  vendors: z.object({
61
- codex: VendorConfigSchema.default({}),
120
+ codex: CodexVendorConfigSchema.default({}),
62
121
  claude: VendorConfigSchema.default({}),
63
122
  }).default({}),
64
123
  quality: QualityConfigSchema.default({}),
65
124
  budget: BudgetConfigSchema.default({}),
66
125
  orgs: z.array(z.string()).default([]),
126
+ users: z.array(z.string()).default([]),
67
127
  repos: z.array(RepoConfigSchema).default([]),
68
128
  routing: RoutingConfigSchema.default({}),
69
129
  server: ServerConfigSchema.default({}),
70
130
  tunnel: TunnelConfigSchema.default({}),
71
131
  logs: LogsConfigSchema.default({}),
72
132
  impact: ImpactConfigSchema.default({}),
133
+ backtrace: BacktraceConfigSchema.default({}),
134
+ post_review: PostReviewConfigSchema.default({}),
135
+ display: DisplayConfigSchema.default({}),
73
136
  });
74
137
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
@@ -12,5 +12,31 @@ export declare function registerRepoWebhook(owner: string, repo: string, webhook
12
12
  export declare function deleteRepoWebhook(owner: string, repo: string, hookId: number, token: string): Promise<void>;
13
13
  export declare function registerOrgWebhook(org: string, webhookUrl: string, secret: string, token: string): Promise<number>;
14
14
  export declare function deleteOrgWebhook(org: string, hookId: number, token: string): Promise<void>;
15
+ export declare function listUserOrgs(token: string): Promise<string[]>;
16
+ export declare function checkRepoAccessible(owner: string, repo: string, token: string): Promise<boolean>;
17
+ export declare function listUserRepos(username: string, token: string, isSelf?: boolean): Promise<Array<{
18
+ owner: string;
19
+ name: string;
20
+ }>>;
21
+ export declare function listOrgRepos(org: string, token: string): Promise<Array<{
22
+ owner: string;
23
+ name: string;
24
+ }>>;
25
+ export interface OpenPR {
26
+ number: number;
27
+ title: string;
28
+ author: string;
29
+ headSha: string;
30
+ headRef: string;
31
+ headRepo: string | null;
32
+ baseRef: string;
33
+ body: string | null;
34
+ createdAt: string;
35
+ }
36
+ export declare function listOpenPRs(owner: string, repo: string, token: string): Promise<OpenPR[]>;
37
+ export declare function prHasCrossCheckComment(owner: string, repo: string, prNumber: number, token: string): Promise<boolean>;
38
+ export declare function getPRCommits(owner: string, repo: string, prNumber: number, token: string): Promise<string[]>;
39
+ export declare function findOrgWebhook(org: string, url: string, token: string): Promise<number | null>;
40
+ export declare function findRepoWebhook(owner: string, repo: string, url: string, token: string): Promise<number | null>;
15
41
  export declare function postReviewComment(octokit: Octokit, owner: string, repo: string, pullNumber: number, body: string, reviewer: string): Promise<void>;
16
42
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/github/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAGjC,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM;;;;;;EAE/C;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAOlG;AAED,wBAAsB,SAAS,CAC7B,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAYf"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/github/client.ts"],"names":[],"mappings":"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"}
@@ -77,6 +77,159 @@ export async function deleteOrgWebhook(org, hookId, token) {
77
77
  headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' },
78
78
  });
79
79
  }
80
+ export async function listUserOrgs(token) {
81
+ const results = [];
82
+ let page = 1;
83
+ while (true) {
84
+ const res = await fetch(`https://api.github.com/user/memberships/orgs?state=active&per_page=100&page=${page}`, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' } });
85
+ if (!res.ok)
86
+ break;
87
+ const data = await res.json();
88
+ if (data.length === 0)
89
+ break;
90
+ for (const m of data)
91
+ results.push(m.organization.login);
92
+ if (data.length < 100)
93
+ break;
94
+ page++;
95
+ }
96
+ return results;
97
+ }
98
+ export async function checkRepoAccessible(owner, repo, token) {
99
+ const res = await fetch(`https://api.github.com/repos/${owner}/${repo}`, {
100
+ headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' },
101
+ });
102
+ return res.ok;
103
+ }
104
+ export async function listUserRepos(username, token, isSelf = false) {
105
+ const results = [];
106
+ let page = 1;
107
+ while (true) {
108
+ const url = isSelf
109
+ ? `https://api.github.com/user/repos?affiliation=owner&visibility=all&per_page=100&page=${page}`
110
+ : `https://api.github.com/users/${username}/repos?per_page=100&page=${page}&type=owner`;
111
+ const res = await fetch(url, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' } });
112
+ if (!res.ok)
113
+ break;
114
+ const data = await res.json();
115
+ if (data.length === 0)
116
+ break;
117
+ for (const repo of data) {
118
+ if (!repo.archived && repo.owner.login === username)
119
+ results.push({ owner: repo.owner.login, name: repo.name });
120
+ }
121
+ if (data.length < 100)
122
+ break;
123
+ page++;
124
+ }
125
+ return results;
126
+ }
127
+ export async function listOrgRepos(org, token) {
128
+ const results = [];
129
+ let page = 1;
130
+ while (true) {
131
+ const res = await fetch(`https://api.github.com/orgs/${org}/repos?per_page=100&page=${page}&type=all`, { headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' } });
132
+ if (!res.ok)
133
+ break;
134
+ const data = await res.json();
135
+ if (data.length === 0)
136
+ break;
137
+ for (const repo of data) {
138
+ if (!repo.archived)
139
+ results.push({ owner: org, name: repo.name });
140
+ }
141
+ if (data.length < 100)
142
+ break;
143
+ page++;
144
+ }
145
+ return results;
146
+ }
147
+ export async function listOpenPRs(owner, repo, token) {
148
+ const results = [];
149
+ let page = 1;
150
+ while (true) {
151
+ 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' } });
152
+ if (!res.ok)
153
+ break;
154
+ const data = await res.json();
155
+ if (data.length === 0)
156
+ break;
157
+ for (const pr of data) {
158
+ results.push({
159
+ number: pr.number,
160
+ title: pr.title,
161
+ author: pr.user.login,
162
+ headSha: pr.head.sha,
163
+ headRef: pr.head.ref,
164
+ headRepo: pr.head.repo?.full_name ?? null,
165
+ baseRef: pr.base.ref,
166
+ body: pr.body,
167
+ createdAt: pr.created_at,
168
+ });
169
+ }
170
+ if (data.length < 100)
171
+ break;
172
+ page++;
173
+ }
174
+ return results;
175
+ }
176
+ // Returns true if any comment on the PR contains '[crosscheck]' — meaning it
177
+ // has already been reviewed by this tool.
178
+ export async function prHasCrossCheckComment(owner, repo, prNumber, token) {
179
+ let page = 1;
180
+ while (true) {
181
+ 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' } });
182
+ if (!res.ok)
183
+ return false;
184
+ const data = await res.json();
185
+ if (data.length === 0)
186
+ break;
187
+ for (const comment of data) {
188
+ if (comment.body.includes('[crosscheck]'))
189
+ return true;
190
+ }
191
+ if (data.length < 100)
192
+ break;
193
+ page++;
194
+ }
195
+ return false;
196
+ }
197
+ export async function getPRCommits(owner, repo, prNumber, token) {
198
+ const results = [];
199
+ let page = 1;
200
+ while (true) {
201
+ 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' } });
202
+ if (!res.ok)
203
+ break;
204
+ const data = await res.json();
205
+ if (data.length === 0)
206
+ break;
207
+ for (const c of data)
208
+ results.push(c.commit.message);
209
+ if (data.length < 100)
210
+ break;
211
+ page++;
212
+ }
213
+ return results;
214
+ }
215
+ export async function findOrgWebhook(org, url, token) {
216
+ const res = await fetch(`https://api.github.com/orgs/${org}/hooks?per_page=100`, {
217
+ headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' },
218
+ });
219
+ if (!res.ok)
220
+ return null;
221
+ const hooks = await res.json();
222
+ return hooks.find(h => h.config.url === url)?.id ?? null;
223
+ }
224
+ export async function findRepoWebhook(owner, repo, url, token) {
225
+ const res = await fetch(`https://api.github.com/repos/${owner}/${repo}/hooks?per_page=100`, {
226
+ headers: { Authorization: `Bearer ${token}`, Accept: 'application/vnd.github+json' },
227
+ });
228
+ if (!res.ok)
229
+ return null;
230
+ const hooks = await res.json();
231
+ return hooks.find(h => h.config.url === url)?.id ?? null;
232
+ }
80
233
  export async function postReviewComment(octokit, owner, repo, pullNumber, body, reviewer) {
81
234
  const isClaude = reviewer === 'claude';
82
235
  const header = `### Code Review by ${isClaude ? '🤖 Claude Code' : '⚡ Codex'}\n\n`;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/github/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/github/client.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,13 @@
1
1
  import type { Config } from '../config/schema.js';
2
2
  export type PROrigin = 'claude' | 'codex' | 'human';
3
+ export declare function detectOriginFromBody(prBody: string, config: Config): PROrigin | null;
4
+ export declare function detectOriginFromCommits(messages: string[], config: Config): PROrigin | null;
5
+ export declare function detectOriginFromBranch(headRef: string, config: Config): PROrigin | null;
6
+ export declare function detectOriginFull(prBody: string, headRef: string, owner: string, repo: string, prNumber: number, config: Config, token: string, author?: string): Promise<{
7
+ origin: PROrigin;
8
+ method: string;
9
+ }>;
3
10
  export declare function detectPROrigin(prBody: string, config: Config, author?: string): PROrigin;
4
11
  export declare function shouldReview(origin: PROrigin, config: Config): boolean;
5
- export declare function assignReviewer(origin: PROrigin, config: Config): 'claude' | 'codex' | null;
12
+ export declare function assignReviewer(origin: PROrigin, config: Config): Promise<'claude' | 'codex' | null>;
6
13
  //# sourceMappingURL=detector.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/github/detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEjD,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;AAEnD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAiBxF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKtE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,IAAI,CAY1F"}
1
+ {"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../../src/github/detector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAKjD,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAA;AAenD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAEpF;AAGD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAM3F;AAGD,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAQvF;AAID,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,MAAM,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAkB/C;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,CAIxF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAKtE;AAeD,wBAAsB,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAC,CAUzG"}
@@ -1,39 +1,111 @@
1
- export function detectPROrigin(prBody, config, author) {
2
- const body = prBody ?? '';
1
+ import { getPRCommits } from './client.js';
2
+ import { checkCodexAuth } from '../reviewers/codex.js';
3
+ import { checkClaudeAuth } from '../reviewers/claude.js';
4
+ // Applies codex_reviews_patterns / claude_reviews_patterns against a single text block.
5
+ // Returns the detected origin or null if nothing matched.
6
+ function matchPatterns(text, config) {
3
7
  for (const pattern of config.routing.codex_reviews_patterns) {
4
- if (new RegExp(pattern, 'i').test(body))
8
+ if (new RegExp(pattern, 'i').test(text))
5
9
  return 'claude';
6
10
  }
7
11
  for (const pattern of config.routing.claude_reviews_patterns) {
8
- if (new RegExp(pattern, 'i').test(body))
12
+ if (new RegExp(pattern, 'i').test(text))
13
+ return 'codex';
14
+ }
15
+ return null;
16
+ }
17
+ // Step 1 — PR body patterns
18
+ export function detectOriginFromBody(prBody, config) {
19
+ return matchPatterns(prBody ?? '', config);
20
+ }
21
+ // Step 2 — commit Co-Authored-By trailers (fetched separately, passed in)
22
+ export function detectOriginFromCommits(messages, config) {
23
+ for (const msg of messages) {
24
+ const result = matchPatterns(msg, config);
25
+ if (result !== null)
26
+ return result;
27
+ }
28
+ return null;
29
+ }
30
+ // Step 3 — branch name prefix
31
+ export function detectOriginFromBranch(headRef, config) {
32
+ for (const prefix of config.routing.claude_branch_prefixes) {
33
+ if (headRef.startsWith(prefix))
34
+ return 'claude';
35
+ }
36
+ for (const prefix of config.routing.codex_branch_prefixes) {
37
+ if (headRef.startsWith(prefix))
9
38
  return 'codex';
10
39
  }
11
- // Author-based fallback: use explicit route when body patterns don't match
40
+ return null;
41
+ }
42
+ // Full detection chain: body → commits → branch → author_routes → human
43
+ // API failure on the commits fetch is non-fatal; falls through to branch check.
44
+ export async function detectOriginFull(prBody, headRef, owner, repo, prNumber, config, token, author) {
45
+ const fromBody = detectOriginFromBody(prBody, config);
46
+ if (fromBody !== null)
47
+ return { origin: fromBody, method: 'body' };
48
+ try {
49
+ const messages = await getPRCommits(owner, repo, prNumber, token);
50
+ const fromCommits = detectOriginFromCommits(messages, config);
51
+ if (fromCommits !== null)
52
+ return { origin: fromCommits, method: 'commits' };
53
+ }
54
+ catch { /* API failure — fall through */ }
55
+ const fromBranch = detectOriginFromBranch(headRef, config);
56
+ if (fromBranch !== null)
57
+ return { origin: fromBranch, method: 'branch' };
12
58
  if (author && config.routing.author_routes[author]) {
13
- return config.routing.author_routes[author];
59
+ return { origin: config.routing.author_routes[author], method: 'author_routes' };
14
60
  }
15
- return 'human';
61
+ return { origin: 'human', method: 'none' };
62
+ }
63
+ // Backward-compatible sync variant (body + author_routes only).
64
+ // Use detectOriginFull for the full async chain.
65
+ export function detectPROrigin(prBody, config, author) {
66
+ return detectOriginFromBody(prBody, config)
67
+ ?? (author ? (config.routing.author_routes[author] ?? null) : null)
68
+ ?? 'human';
16
69
  }
17
70
  export function shouldReview(origin, config) {
18
71
  if (config.mode === 'single-vendor')
19
72
  return true;
20
- // cross-vendor: only review PRs from the other AI
21
- return origin === 'claude' || origin === 'codex';
73
+ if (origin === 'claude' || origin === 'codex')
74
+ return true;
75
+ // human origin: reviewable when fallback_reviewer is configured
76
+ return config.routing.fallback_reviewer !== null;
77
+ }
78
+ async function resolveFallback(config) {
79
+ const fb = config.routing.fallback_reviewer;
80
+ if (fb === null)
81
+ return null;
82
+ if (fb === 'codex')
83
+ return config.vendors.codex.enabled ? 'codex' : null;
84
+ if (fb === 'claude')
85
+ return config.vendors.claude.enabled ? 'claude' : null;
86
+ // 'auto': use runtime capability checks so a Claude-only install doesn't
87
+ // attempt Codex just because both vendors are enabled in config by default.
88
+ const [codexAuth, claudeAuth] = await Promise.all([checkCodexAuth(), checkClaudeAuth()]);
89
+ if (codexAuth.ok)
90
+ return 'codex';
91
+ if (claudeAuth.ok)
92
+ return 'claude';
93
+ return null;
22
94
  }
23
- export function assignReviewer(origin, config) {
95
+ export async function assignReviewer(origin, config) {
24
96
  if (config.mode === 'single-vendor') {
25
- // use whichever vendor is enabled
26
97
  if (config.vendors.codex.enabled)
27
98
  return 'codex';
28
99
  if (config.vendors.claude.enabled)
29
100
  return 'claude';
30
101
  return null;
31
102
  }
32
- // cross-vendor: opposite vendor reviews
33
103
  if (origin === 'claude' && config.vendors.codex.enabled)
34
104
  return 'codex';
35
105
  if (origin === 'codex' && config.vendors.claude.enabled)
36
106
  return 'claude';
107
+ if (origin === 'human')
108
+ return resolveFallback(config);
37
109
  return null;
38
110
  }
39
111
  //# sourceMappingURL=detector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/github/detector.ts"],"names":[],"mappings":"AAIA,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,MAAc,EAAE,MAAe;IAC5E,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAA;IAEzB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;QAC5D,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAA;IAC1D,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE,CAAC;QAC7D,IAAI,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,OAAO,OAAO,CAAA;IACzD,CAAC;IAED,2EAA2E;IAC3E,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,OAAO,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;IAC7C,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAgB,EAAE,MAAc;IAC3D,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,IAAI,CAAA;IAEhD,kDAAkD;IAClD,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAgB,EAAE,MAAc;IAC7D,IAAI,MAAM,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACpC,kCAAkC;QAClC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,OAAO,CAAA;QAChD,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;YAAE,OAAO,QAAQ,CAAA;QAClD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,wCAAwC;IACxC,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,OAAO,CAAA;IACvE,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,QAAQ,CAAA;IACxE,OAAO,IAAI,CAAA;AACb,CAAC"}
1
+ {"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/github/detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { Config } from '../config/schema.js';
2
+ import { type OpenPR } from '../github/client.js';
3
+ export type BacktraceScope = {
4
+ org: string;
5
+ } | {
6
+ owner: string;
7
+ repo: string;
8
+ };
9
+ export interface BacktracePR extends OpenPR {
10
+ owner: string;
11
+ repo: string;
12
+ }
13
+ export interface BacktraceResult {
14
+ queued: BacktracePR[];
15
+ alreadyReviewed: number;
16
+ skippedAuthor: number;
17
+ }
18
+ export declare function buildScopesFromConfig(config: Config, token: string): Promise<BacktraceScope[]>;
19
+ export declare function scanUnreviewedPRs(scopes: BacktraceScope[], config: Config, token: string): Promise<BacktraceResult>;
20
+ //# sourceMappingURL=backtrace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backtrace.d.ts","sourceRoot":"","sources":["../../src/lib/backtrace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEjD,OAAO,EAKL,KAAK,MAAM,EACZ,MAAM,qBAAqB,CAAA;AAE5B,MAAM,MAAM,cAAc,GAAG;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9E,MAAM,WAAW,WAAY,SAAQ,MAAM;IACzC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,eAAe,EAAE,MAAM,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;CACtB;AAwBD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,cAAc,EAAE,CAAC,CAc3B;AAMD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,cAAc,EAAE,EACxB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,CAAC,CAwC1B"}
@@ -0,0 +1,75 @@
1
+ import { isAuthorAllowed } from './filter.js';
2
+ import { listOpenPRs, listOrgRepos, listUserRepos, prHasCrossCheckComment, } from '../github/client.js';
3
+ async function expandToRepos(scopes, token) {
4
+ const repos = [];
5
+ await Promise.all(scopes.map(async (scope) => {
6
+ if ('org' in scope) {
7
+ try {
8
+ const orgRepos = await listOrgRepos(scope.org, token);
9
+ for (const { owner, name } of orgRepos)
10
+ repos.push({ owner, repo: name });
11
+ }
12
+ catch { /* skip org on API error */ }
13
+ }
14
+ else {
15
+ repos.push({ owner: scope.owner, repo: scope.repo });
16
+ }
17
+ }));
18
+ return repos;
19
+ }
20
+ // Build backtrace scopes from config (used by serve mode; watch mode passes
21
+ // its already-resolved scopes array directly).
22
+ export async function buildScopesFromConfig(config, token) {
23
+ const scopes = [
24
+ ...config.orgs.map(org => ({ org })),
25
+ ...config.repos.map(r => ({ owner: r.owner, repo: r.name })),
26
+ ];
27
+ await Promise.all(config.users.map(async (user) => {
28
+ try {
29
+ const repos = await listUserRepos(user, token);
30
+ for (const { owner, name } of repos)
31
+ scopes.push({ owner, repo: name });
32
+ }
33
+ catch { /* skip user on API error */ }
34
+ }));
35
+ return scopes;
36
+ }
37
+ // Scan all open PRs in the given scopes and return those that have never
38
+ // received a [crosscheck] review comment and pass the allowed_authors filter.
39
+ // Results are sorted oldest-first. API errors for individual PRs or repos
40
+ // are silently skipped so one bad repo never blocks the rest.
41
+ export async function scanUnreviewedPRs(scopes, config, token) {
42
+ if (scopes.length === 0) {
43
+ return { queued: [], alreadyReviewed: 0, skippedAuthor: 0 };
44
+ }
45
+ const repoScopes = await expandToRepos(scopes, token);
46
+ const perRepoResults = await Promise.all(repoScopes.map(async ({ owner, repo }) => {
47
+ try {
48
+ const prs = await listOpenPRs(owner, repo, token);
49
+ return prs.map(pr => ({ ...pr, owner, repo }));
50
+ }
51
+ catch {
52
+ return [];
53
+ }
54
+ }));
55
+ const allPRs = perRepoResults.flat();
56
+ const result = { queued: [], alreadyReviewed: 0, skippedAuthor: 0 };
57
+ await Promise.all(allPRs.map(async (pr) => {
58
+ if (!isAuthorAllowed(config.routing.allowed_authors, pr.author)) {
59
+ result.skippedAuthor++;
60
+ return;
61
+ }
62
+ try {
63
+ if (await prHasCrossCheckComment(pr.owner, pr.repo, pr.number, token)) {
64
+ result.alreadyReviewed++;
65
+ }
66
+ else {
67
+ result.queued.push(pr);
68
+ }
69
+ }
70
+ catch { /* skip PR on API error */ }
71
+ }));
72
+ result.queued.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
73
+ return result;
74
+ }
75
+ //# sourceMappingURL=backtrace.js.map