@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.
- package/README.md +24 -7
- package/crosscheck.config.example.yml +90 -4
- package/dist/__tests__/backtrace.test.d.ts +2 -0
- package/dist/__tests__/backtrace.test.d.ts.map +1 -0
- package/dist/__tests__/backtrace.test.js +158 -0
- package/dist/__tests__/backtrace.test.js.map +1 -0
- package/dist/__tests__/optimize.test.js +16 -3
- package/dist/__tests__/optimize.test.js.map +1 -1
- package/dist/cli.js +8 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/diagnose.d.ts +1 -0
- package/dist/commands/diagnose.d.ts.map +1 -1
- package/dist/commands/diagnose.js +14 -0
- package/dist/commands/diagnose.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +55 -18
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +11 -5
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/serve.d.ts +7 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +109 -16
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +1 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/watch.d.ts +7 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +349 -143
- package/dist/commands/watch.js.map +1 -1
- package/dist/config/loader.d.ts +8 -0
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +143 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/schema.d.ts +445 -27
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +70 -7
- package/dist/config/schema.js.map +1 -1
- package/dist/github/client.d.ts +26 -0
- package/dist/github/client.d.ts.map +1 -1
- package/dist/github/client.js +153 -0
- package/dist/github/client.js.map +1 -1
- package/dist/github/detector.d.ts +8 -1
- package/dist/github/detector.d.ts.map +1 -1
- package/dist/github/detector.js +84 -12
- package/dist/github/detector.js.map +1 -1
- package/dist/lib/backtrace.d.ts +20 -0
- package/dist/lib/backtrace.d.ts.map +1 -0
- package/dist/lib/backtrace.js +75 -0
- package/dist/lib/backtrace.js.map +1 -0
- package/dist/lib/board.d.ts +52 -0
- package/dist/lib/board.d.ts.map +1 -0
- package/dist/lib/board.js +394 -0
- package/dist/lib/board.js.map +1 -0
- package/dist/lib/runner.d.ts +10 -1
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +129 -51
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/verdict.d.ts +1 -0
- package/dist/lib/verdict.d.ts.map +1 -1
- package/dist/lib/verdict.js +27 -7
- package/dist/lib/verdict.js.map +1 -1
- package/dist/lib/workflow.d.ts +8 -8
- package/dist/lib/workflow.d.ts.map +1 -1
- package/dist/lib/workflow.js +22 -5
- package/dist/lib/workflow.js.map +1 -1
- package/dist/reviewers/claude.d.ts +1 -1
- package/dist/reviewers/claude.d.ts.map +1 -1
- package/dist/reviewers/claude.js +4 -6
- package/dist/reviewers/claude.js.map +1 -1
- package/dist/reviewers/codex.d.ts +2 -2
- package/dist/reviewers/codex.d.ts.map +1 -1
- package/dist/reviewers/codex.js +6 -6
- package/dist/reviewers/codex.js.map +1 -1
- package/dist/reviewers/fix.d.ts +5 -0
- package/dist/reviewers/fix.d.ts.map +1 -0
- package/dist/reviewers/fix.js +87 -0
- package/dist/reviewers/fix.js.map +1 -0
- package/get-started.md +190 -21
- package/package.json +1 -1
package/dist/config/schema.js
CHANGED
|
@@ -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().
|
|
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
|
-
//
|
|
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
|
|
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:
|
|
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/config/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/github/client.d.ts
CHANGED
|
@@ -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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"}
|
package/dist/github/client.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/github/detector.js
CHANGED
|
@@ -1,39 +1,111 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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(
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
21
|
-
|
|
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":"
|
|
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
|