@motivation-labs/crosscheck 0.13.0-beta.18 → 0.13.0-beta.33
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/crosscheck.config.example.yml +6 -1
- package/dist/__tests__/board.test.js +115 -2
- package/dist/__tests__/board.test.js.map +1 -1
- package/dist/__tests__/conflict-resolve.test.d.ts +2 -0
- package/dist/__tests__/conflict-resolve.test.d.ts.map +1 -0
- package/dist/__tests__/conflict-resolve.test.js +106 -0
- package/dist/__tests__/conflict-resolve.test.js.map +1 -0
- package/dist/__tests__/detector.test.d.ts +2 -0
- package/dist/__tests__/detector.test.d.ts.map +1 -0
- package/dist/__tests__/detector.test.js +108 -0
- package/dist/__tests__/detector.test.js.map +1 -0
- package/dist/cli.js +4 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +11 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +15 -0
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +17 -0
- package/dist/commands/watch.js.map +1 -1
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +5 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/github/detector.d.ts.map +1 -1
- package/dist/github/detector.js +18 -1
- package/dist/github/detector.js.map +1 -1
- package/dist/lib/board.d.ts +5 -0
- package/dist/lib/board.d.ts.map +1 -1
- package/dist/lib/board.js +123 -131
- package/dist/lib/board.js.map +1 -1
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +72 -16
- package/dist/lib/runner.js.map +1 -1
- package/dist/reviewers/conflict-resolve.d.ts +8 -0
- package/dist/reviewers/conflict-resolve.d.ts.map +1 -1
- package/dist/reviewers/conflict-resolve.js +91 -20
- package/dist/reviewers/conflict-resolve.js.map +1 -1
- package/package.json +1 -1
|
@@ -101,9 +101,14 @@ routing:
|
|
|
101
101
|
# - my-org-bot # a dedicated bot account
|
|
102
102
|
|
|
103
103
|
# Author-based routing fallback — maps GitHub login → vendor origin.
|
|
104
|
-
# Used when no body pattern matches. Lets you skip the attribution
|
|
104
|
+
# Used when no body / commit / branch pattern matches. Lets you skip the attribution
|
|
105
|
+
# footer requirement when an author consistently uses a single agent.
|
|
105
106
|
# beingzy: claude → PRs from beingzy treated as Claude-authored → Codex reviews them
|
|
106
107
|
# my-bot: codex → PRs from my-bot treated as Codex-authored → Claude reviews them
|
|
108
|
+
# NOTE: in `mode: cross-vendor` with BOTH vendors enabled, this map is bypassed —
|
|
109
|
+
# if the same author commits via both agents, a static route is structurally wrong.
|
|
110
|
+
# In that case, rely on attribution detection (body / commits / branch) and
|
|
111
|
+
# `fallback_reviewer` below for PRs with no attribution markers.
|
|
107
112
|
# author_routes:
|
|
108
113
|
# beingzy: claude
|
|
109
114
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { fmtTokens } from '../lib/board.js';
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { PRBoard, fmtTokens } from '../lib/board.js';
|
|
3
3
|
describe('fmtTokens', () => {
|
|
4
4
|
it('returns empty string for undefined', () => {
|
|
5
5
|
expect(fmtTokens(undefined)).toBe('');
|
|
@@ -33,4 +33,117 @@ describe('fmtTokens', () => {
|
|
|
33
33
|
expect(fmtTokens(2_000_000)).toBe('(2M)');
|
|
34
34
|
});
|
|
35
35
|
});
|
|
36
|
+
// ── PRBoard rendering + retention ───────────────────────────────────────────
|
|
37
|
+
const baseConfig = {
|
|
38
|
+
mode: 'crosscheck',
|
|
39
|
+
quality: { tier: 'balanced' },
|
|
40
|
+
vendors: { claude: { enabled: true }, codex: { enabled: false } },
|
|
41
|
+
display: {
|
|
42
|
+
theme: {
|
|
43
|
+
bar_fill: 'blue',
|
|
44
|
+
bar_empty: 'dim',
|
|
45
|
+
cr_approve: 'green',
|
|
46
|
+
cr_needs_work: 'yellow',
|
|
47
|
+
cr_block: 'red',
|
|
48
|
+
fix_fill: 'cyan',
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
const stripAnsi = (s) => s.replace(/\x1B\[[0-9;]*m/g, '');
|
|
53
|
+
const reviewStep = {
|
|
54
|
+
type: 'review',
|
|
55
|
+
name: 'review',
|
|
56
|
+
reviewer: 'auto',
|
|
57
|
+
max_rounds: 1,
|
|
58
|
+
};
|
|
59
|
+
describe('PRBoard — TTY workspace retention', () => {
|
|
60
|
+
let board;
|
|
61
|
+
let originalIsTTY;
|
|
62
|
+
let originalWrite;
|
|
63
|
+
beforeEach(() => {
|
|
64
|
+
originalIsTTY = process.stdout.isTTY;
|
|
65
|
+
Object.defineProperty(process.stdout, 'isTTY', { value: true, configurable: true });
|
|
66
|
+
originalWrite = process.stdout.write.bind(process.stdout);
|
|
67
|
+
process.stdout.write = (() => true);
|
|
68
|
+
board = new PRBoard();
|
|
69
|
+
board.setConfig(baseConfig, [reviewStep]);
|
|
70
|
+
});
|
|
71
|
+
afterEach(() => {
|
|
72
|
+
board.stop();
|
|
73
|
+
process.stdout.write = originalWrite;
|
|
74
|
+
Object.defineProperty(process.stdout, 'isTTY', { value: originalIsTTY, configurable: true });
|
|
75
|
+
});
|
|
76
|
+
// Tests reach into private state because the relevant invariants live
|
|
77
|
+
// on the slots map and there is no public read API.
|
|
78
|
+
const slots = () => board.slots;
|
|
79
|
+
const invokeRender = () => board.render();
|
|
80
|
+
const invokeFolded = (key) => board.renderPRSlotFolded(slots().get(key));
|
|
81
|
+
it('keeps completed slot in the workspace (no auto-clear)', () => {
|
|
82
|
+
board.addPR('k1', 1, 'a/b', 'main');
|
|
83
|
+
board.completePR('k1', { elapsedMs: 1000, url: 'https://github.com/a/b/pull/1' });
|
|
84
|
+
expect(slots().size).toBe(1);
|
|
85
|
+
expect(slots().has('k1')).toBe(true);
|
|
86
|
+
});
|
|
87
|
+
it('evicts oldest completed slots when total exceeds workspace cap', () => {
|
|
88
|
+
for (let i = 0; i < 30; i++) {
|
|
89
|
+
board.addPR(`k${i}`, i, 'a/b', `branch-${i}`);
|
|
90
|
+
board.completePR(`k${i}`, { elapsedMs: 1000, url: `https://github.com/a/b/pull/${i}` });
|
|
91
|
+
}
|
|
92
|
+
invokeRender();
|
|
93
|
+
expect(slots().size).toBe(25);
|
|
94
|
+
// The 5 oldest should be evicted (0..4); 5..29 retained.
|
|
95
|
+
for (let i = 0; i < 5; i++)
|
|
96
|
+
expect(slots().has(`k${i}`)).toBe(false);
|
|
97
|
+
for (let i = 5; i < 30; i++)
|
|
98
|
+
expect(slots().has(`k${i}`)).toBe(true);
|
|
99
|
+
});
|
|
100
|
+
it('never evicts active slots even at overflow', () => {
|
|
101
|
+
for (let i = 0; i < 24; i++) {
|
|
102
|
+
board.addPR(`done-${i}`, i, 'a/b', `branch-${i}`);
|
|
103
|
+
board.completePR(`done-${i}`, { elapsedMs: 1000, url: `url-${i}` });
|
|
104
|
+
}
|
|
105
|
+
for (let i = 0; i < 5; i++) {
|
|
106
|
+
board.addPR(`active-${i}`, 100 + i, 'a/b', `active-${i}`);
|
|
107
|
+
}
|
|
108
|
+
expect(slots().size).toBe(29);
|
|
109
|
+
invokeRender();
|
|
110
|
+
expect(slots().size).toBe(25);
|
|
111
|
+
for (let i = 0; i < 5; i++) {
|
|
112
|
+
expect(slots().has(`active-${i}`)).toBe(true);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
it('renders a folded line with verdict, fix count, recheck and url', () => {
|
|
116
|
+
board.addPR('k1', 142, 'acme/api', 'chore/deps');
|
|
117
|
+
board.updatePR('k1', { verdict: 'APPROVE', commentCount: 0, fixCount: 3, recheckVerdict: 'APPROVE' });
|
|
118
|
+
board.completePR('k1', { elapsedMs: 45_000, url: 'https://github.com/acme/api/pull/142' });
|
|
119
|
+
const folded = stripAnsi(invokeFolded('k1'));
|
|
120
|
+
expect(folded).toContain('#142');
|
|
121
|
+
expect(folded).toContain('acme/api');
|
|
122
|
+
expect(folded).toContain('chore/deps');
|
|
123
|
+
expect(folded).toContain('CR: APPROVE');
|
|
124
|
+
expect(folded).toContain('fix 3');
|
|
125
|
+
expect(folded).toContain('recheck APPROVE');
|
|
126
|
+
expect(folded).toMatch(/\(\d+s\)/);
|
|
127
|
+
expect(folded).toContain('https://github.com/acme/api/pull/142');
|
|
128
|
+
});
|
|
129
|
+
it('renders the PR URL in the expanded completed slot (not just folded)', () => {
|
|
130
|
+
board.addPR('k1', 142, 'acme/api', 'chore/deps');
|
|
131
|
+
board.updatePR('k1', { verdict: 'APPROVE', commentCount: 0 });
|
|
132
|
+
board.completePR('k1', { elapsedMs: 45_000, url: 'https://github.com/acme/api/pull/142' });
|
|
133
|
+
const output = stripAnsi(invokeRender());
|
|
134
|
+
// With a single completed PR (below FOLD_THRESHOLD), the slot stays expanded
|
|
135
|
+
// via renderPRSlot. The URL must still surface so operators can click through.
|
|
136
|
+
expect(output).toContain('https://github.com/acme/api/pull/142');
|
|
137
|
+
});
|
|
138
|
+
it('orders sections top-to-bottom: config → stats → PR workspace', () => {
|
|
139
|
+
board.addPR('k1', 1, 'acme/api', 'feat/x');
|
|
140
|
+
const output = stripAnsi(invokeRender());
|
|
141
|
+
const idxBrand = output.indexOf('crosscheck');
|
|
142
|
+
const idxStats = output.indexOf('PRs:');
|
|
143
|
+
const idxPR = output.indexOf('#1');
|
|
144
|
+
expect(idxBrand).toBeGreaterThanOrEqual(0);
|
|
145
|
+
expect(idxStats).toBeGreaterThan(idxBrand);
|
|
146
|
+
expect(idxPR).toBeGreaterThan(idxStats);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
36
149
|
//# sourceMappingURL=board.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board.test.js","sourceRoot":"","sources":["../../src/__tests__/board.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"board.test.js","sourceRoot":"","sources":["../../src/__tests__/board.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolve.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/conflict-resolve.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { extractConflictWindows, parseResolverEdits } from '../reviewers/conflict-resolve.js';
|
|
3
|
+
describe('extractConflictWindows', () => {
|
|
4
|
+
it('returns empty string when no markers are present', () => {
|
|
5
|
+
expect(extractConflictWindows('line a\nline b\nline c\n')).toBe('');
|
|
6
|
+
});
|
|
7
|
+
it('extracts a single conflict region with surrounding context', () => {
|
|
8
|
+
const content = [
|
|
9
|
+
'top context 1',
|
|
10
|
+
'top context 2',
|
|
11
|
+
'<<<<<<< HEAD',
|
|
12
|
+
'ours',
|
|
13
|
+
'=======',
|
|
14
|
+
'theirs',
|
|
15
|
+
'>>>>>>> branch',
|
|
16
|
+
'bottom context 1',
|
|
17
|
+
'bottom context 2',
|
|
18
|
+
].join('\n');
|
|
19
|
+
const out = extractConflictWindows(content);
|
|
20
|
+
expect(out).toContain('<<<<<<< HEAD');
|
|
21
|
+
expect(out).toContain('=======');
|
|
22
|
+
expect(out).toContain('>>>>>>> branch');
|
|
23
|
+
expect(out).toContain('top context 1');
|
|
24
|
+
expect(out).toContain('bottom context 1');
|
|
25
|
+
});
|
|
26
|
+
it('surfaces conflicts that appear past the previous 4KB prefix cap', () => {
|
|
27
|
+
const filler = Array.from({ length: 200 }, (_, i) => `noise line ${i}`).join('\n');
|
|
28
|
+
const conflict = '<<<<<<< HEAD\nours\n=======\ntheirs\n>>>>>>> branch';
|
|
29
|
+
const content = `${filler}\n${conflict}\n${filler}`;
|
|
30
|
+
expect(content.length).toBeGreaterThan(4000);
|
|
31
|
+
const out = extractConflictWindows(content);
|
|
32
|
+
expect(out).toContain('<<<<<<< HEAD');
|
|
33
|
+
expect(out).toContain('>>>>>>> branch');
|
|
34
|
+
});
|
|
35
|
+
it('merges overlapping conflict windows instead of duplicating context', () => {
|
|
36
|
+
const lines = [];
|
|
37
|
+
for (let i = 0; i < 3; i++)
|
|
38
|
+
lines.push(`ctx ${i}`);
|
|
39
|
+
lines.push('<<<<<<< HEAD', 'a', '=======', 'b', '>>>>>>> branch');
|
|
40
|
+
lines.push('mid 1', 'mid 2');
|
|
41
|
+
lines.push('<<<<<<< HEAD', 'c', '=======', 'd', '>>>>>>> branch');
|
|
42
|
+
for (let i = 0; i < 3; i++)
|
|
43
|
+
lines.push(`tail ${i}`);
|
|
44
|
+
const out = extractConflictWindows(lines.join('\n'));
|
|
45
|
+
const startCount = (out.match(/<<<<<<< HEAD/g) ?? []).length;
|
|
46
|
+
expect(startCount).toBe(2);
|
|
47
|
+
// mid section between adjacent conflicts should appear exactly once (merged window)
|
|
48
|
+
expect((out.match(/mid 1/g) ?? []).length).toBe(1);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
// Used by runner.ts to detect remaining conflict markers in resolved files.
|
|
52
|
+
// Kept in sync with the regex literal there; this test guards the contract.
|
|
53
|
+
const MARKER_RE = /^(<<<<<<<|=======|>>>>>>>)( |$)/m;
|
|
54
|
+
describe('conflict marker regex (runner.ts)', () => {
|
|
55
|
+
it('matches all three marker variants on their own line', () => {
|
|
56
|
+
expect(MARKER_RE.test('foo\n<<<<<<< HEAD\nbar')).toBe(true);
|
|
57
|
+
expect(MARKER_RE.test('foo\n=======\nbar')).toBe(true);
|
|
58
|
+
expect(MARKER_RE.test('foo\n>>>>>>> branch\nbar')).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
it('matches a marker line with no trailing label (end of line)', () => {
|
|
61
|
+
expect(MARKER_RE.test('foo\n<<<<<<<\nbar')).toBe(true);
|
|
62
|
+
expect(MARKER_RE.test('foo\n=======\nbar')).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
it('does not match a Markdown setext-style separator inside docs', () => {
|
|
65
|
+
// "=======" is a legitimate H1 setext underline in Markdown; only flag when
|
|
66
|
+
// the resolver actually leaves a marker behind in the resolved file.
|
|
67
|
+
// The regex DOES match a bare "=======" line — the false-positive defense is
|
|
68
|
+
// that runner.ts scopes the check to originally-conflicted files, not the
|
|
69
|
+
// whole worktree. Verify the marker line itself still matches so the scope
|
|
70
|
+
// restriction is doing the real work.
|
|
71
|
+
expect(MARKER_RE.test('Heading\n=======\n')).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
it('does not match conflict markers appearing mid-line (e.g. in URLs or strings)', () => {
|
|
74
|
+
expect(MARKER_RE.test('see https://example.com/<<<<<<<-pin')).toBe(false);
|
|
75
|
+
expect(MARKER_RE.test('const s = "=======middle"')).toBe(false);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
describe('parseResolverEdits', () => {
|
|
79
|
+
const wrap = (path, oldText, newText) => `<edit path="${path}">\n<old>\n${oldText}\n</old>\n<new>\n${newText}\n</new>\n</edit>`;
|
|
80
|
+
it('parses a well-formed edit block', () => {
|
|
81
|
+
const out = wrap('src/a.ts', 'old line', 'new line');
|
|
82
|
+
const edits = parseResolverEdits(out, ['src/a.ts']);
|
|
83
|
+
expect(edits).toEqual([{ filePath: 'src/a.ts', oldText: 'old line', newText: 'new line' }]);
|
|
84
|
+
});
|
|
85
|
+
it('drops edits whose path is not in the conflicted set', () => {
|
|
86
|
+
// Defense against a buggy or prompt-injected resolver emitting <edit> blocks
|
|
87
|
+
// for tracked files that were never in U state. Those would otherwise be
|
|
88
|
+
// written + staged and could carry unresolved markers into the commit.
|
|
89
|
+
const out = wrap('src/legit.ts', 'a', 'b') + wrap('src/sneaky.ts', 'c', 'd');
|
|
90
|
+
const edits = parseResolverEdits(out, ['src/legit.ts']);
|
|
91
|
+
expect(edits.map(e => e.filePath)).toEqual(['src/legit.ts']);
|
|
92
|
+
});
|
|
93
|
+
it('drops path-escape attempts', () => {
|
|
94
|
+
const out = wrap('../etc/passwd', 'a', 'b') + wrap('/etc/passwd', 'c', 'd');
|
|
95
|
+
expect(parseResolverEdits(out, ['../etc/passwd', '/etc/passwd'])).toEqual([]);
|
|
96
|
+
});
|
|
97
|
+
it('drops edits with an empty <old> block', () => {
|
|
98
|
+
const out = wrap('src/a.ts', '', 'new');
|
|
99
|
+
expect(parseResolverEdits(out, ['src/a.ts'])).toEqual([]);
|
|
100
|
+
});
|
|
101
|
+
it('skips edits missing <old> or <new> tags', () => {
|
|
102
|
+
const broken = '<edit path="src/a.ts"><old>only old</old></edit>';
|
|
103
|
+
expect(parseResolverEdits(broken, ['src/a.ts'])).toEqual([]);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
//# sourceMappingURL=conflict-resolve.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolve.test.js","sourceRoot":"","sources":["../../src/__tests__/conflict-resolve.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/detector.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { detectOriginFromBody, detectOriginFromBranch, detectOriginFull, assignReviewer } from '../github/detector.js';
|
|
3
|
+
import { ConfigSchema } from '../config/schema.js';
|
|
4
|
+
function buildConfig(overrides = {}) {
|
|
5
|
+
return ConfigSchema.parse({
|
|
6
|
+
mode: 'cross-vendor',
|
|
7
|
+
vendors: { claude: { enabled: true }, codex: { enabled: true } },
|
|
8
|
+
...overrides,
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
vi.mock('../github/client.js', () => ({
|
|
12
|
+
getPRCommits: vi.fn(async () => []),
|
|
13
|
+
}));
|
|
14
|
+
describe('detectOriginFromBody', () => {
|
|
15
|
+
it('detects claude origin from PR body footer', () => {
|
|
16
|
+
expect(detectOriginFromBody('Generated with [Claude Code]', buildConfig())).toBe('claude');
|
|
17
|
+
});
|
|
18
|
+
it('detects codex origin from PR body footer', () => {
|
|
19
|
+
expect(detectOriginFromBody('Generated with [OpenAI Codex]', buildConfig())).toBe('codex');
|
|
20
|
+
});
|
|
21
|
+
it('returns null when no pattern matches', () => {
|
|
22
|
+
expect(detectOriginFromBody('just a normal PR body', buildConfig())).toBeNull();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
describe('detectOriginFromBranch', () => {
|
|
26
|
+
it('detects claude origin from claude/ branch prefix', () => {
|
|
27
|
+
expect(detectOriginFromBranch('claude/feat-foo', buildConfig())).toBe('claude');
|
|
28
|
+
});
|
|
29
|
+
it('detects codex origin from codex/ branch prefix', () => {
|
|
30
|
+
expect(detectOriginFromBranch('codex/feat-foo', buildConfig())).toBe('codex');
|
|
31
|
+
});
|
|
32
|
+
it('returns null when no prefix matches', () => {
|
|
33
|
+
expect(detectOriginFromBranch('feature/foo', buildConfig())).toBeNull();
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
describe('detectOriginFull — author_routes behavior', () => {
|
|
37
|
+
it('cross-vendor mode with both vendors enabled: bypasses author_routes', async () => {
|
|
38
|
+
const cfg = buildConfig({
|
|
39
|
+
mode: 'cross-vendor',
|
|
40
|
+
vendors: { claude: { enabled: true }, codex: { enabled: true } },
|
|
41
|
+
routing: { author_routes: { beingzy: 'claude' } },
|
|
42
|
+
});
|
|
43
|
+
const result = await detectOriginFull('', 'feature/foo', 'owner', 'repo', 1, cfg, 'token', 'beingzy');
|
|
44
|
+
expect(result.origin).toBe('human');
|
|
45
|
+
expect(result.method).toBe('author_routes_bypassed');
|
|
46
|
+
});
|
|
47
|
+
it('single-vendor mode: applies author_routes normally', async () => {
|
|
48
|
+
const cfg = buildConfig({
|
|
49
|
+
mode: 'single-vendor',
|
|
50
|
+
vendors: { claude: { enabled: true }, codex: { enabled: false } },
|
|
51
|
+
routing: { author_routes: { beingzy: 'claude' } },
|
|
52
|
+
});
|
|
53
|
+
const result = await detectOriginFull('', 'feature/foo', 'owner', 'repo', 1, cfg, 'token', 'beingzy');
|
|
54
|
+
expect(result.origin).toBe('claude');
|
|
55
|
+
expect(result.method).toBe('author_routes');
|
|
56
|
+
});
|
|
57
|
+
it('cross-vendor with only one vendor enabled: applies author_routes normally', async () => {
|
|
58
|
+
const cfg = buildConfig({
|
|
59
|
+
mode: 'cross-vendor',
|
|
60
|
+
vendors: { claude: { enabled: true }, codex: { enabled: false } },
|
|
61
|
+
routing: { author_routes: { beingzy: 'claude' } },
|
|
62
|
+
});
|
|
63
|
+
const result = await detectOriginFull('', 'feature/foo', 'owner', 'repo', 1, cfg, 'token', 'beingzy');
|
|
64
|
+
expect(result.origin).toBe('claude');
|
|
65
|
+
expect(result.method).toBe('author_routes');
|
|
66
|
+
});
|
|
67
|
+
it('cross-vendor with both enabled: attribution signals still win over author_routes', async () => {
|
|
68
|
+
const cfg = buildConfig({
|
|
69
|
+
mode: 'cross-vendor',
|
|
70
|
+
vendors: { claude: { enabled: true }, codex: { enabled: true } },
|
|
71
|
+
routing: { author_routes: { beingzy: 'claude' } },
|
|
72
|
+
});
|
|
73
|
+
const result = await detectOriginFull('', 'codex/feat', 'owner', 'repo', 1, cfg, 'token', 'beingzy');
|
|
74
|
+
expect(result.origin).toBe('codex');
|
|
75
|
+
expect(result.method).toBe('branch');
|
|
76
|
+
});
|
|
77
|
+
it('cross-vendor without author_routes: falls through to human', async () => {
|
|
78
|
+
const cfg = buildConfig({
|
|
79
|
+
mode: 'cross-vendor',
|
|
80
|
+
vendors: { claude: { enabled: true }, codex: { enabled: true } },
|
|
81
|
+
routing: { author_routes: {} },
|
|
82
|
+
});
|
|
83
|
+
const result = await detectOriginFull('', 'feature/foo', 'owner', 'repo', 1, cfg, 'token', 'beingzy');
|
|
84
|
+
expect(result.origin).toBe('human');
|
|
85
|
+
expect(result.method).toBe('none');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
describe('assignReviewer', () => {
|
|
89
|
+
it('cross-vendor: claude origin → codex reviewer', async () => {
|
|
90
|
+
expect(await assignReviewer('claude', buildConfig())).toBe('codex');
|
|
91
|
+
});
|
|
92
|
+
it('cross-vendor: codex origin → claude reviewer', async () => {
|
|
93
|
+
expect(await assignReviewer('codex', buildConfig())).toBe('claude');
|
|
94
|
+
});
|
|
95
|
+
it('cross-vendor: explicit fallback_reviewer is honored for human origin', async () => {
|
|
96
|
+
const cfg = buildConfig({
|
|
97
|
+
routing: { fallback_reviewer: 'claude' },
|
|
98
|
+
});
|
|
99
|
+
expect(await assignReviewer('human', cfg)).toBe('claude');
|
|
100
|
+
});
|
|
101
|
+
it('cross-vendor: fallback_reviewer=null skips human-origin PRs', async () => {
|
|
102
|
+
const cfg = buildConfig({
|
|
103
|
+
routing: { fallback_reviewer: null },
|
|
104
|
+
});
|
|
105
|
+
expect(await assignReviewer('human', cfg)).toBeNull();
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
//# sourceMappingURL=detector.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.test.js","sourceRoot":"","sources":["../../src/__tests__/detector.test.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -62,15 +62,17 @@ program
|
|
|
62
62
|
.description('Manually trigger a review for a single PR URL')
|
|
63
63
|
.option('-c, --config <path>', 'config file path')
|
|
64
64
|
.option('-r, --reviewer <vendor>', 'force a specific reviewer: codex | claude (bypasses auto-detection)')
|
|
65
|
-
.
|
|
65
|
+
.option('--vendor <vendor>', 'alias for --reviewer')
|
|
66
|
+
.action((prUrl, opts) => void runReview(prUrl, opts.config, opts.reviewer ?? opts.vendor));
|
|
66
67
|
program
|
|
67
68
|
.command('run <pr-url>')
|
|
68
69
|
.description('Execute the full configured workflow against a single PR (review → fix → recheck)')
|
|
69
70
|
.option('-c, --config <path>', 'config file path')
|
|
70
71
|
.option('-r, --reviewer <vendor>', 'force a specific reviewer: codex | claude (bypasses attribution detection)')
|
|
72
|
+
.option('--vendor <vendor>', 'alias for --reviewer')
|
|
71
73
|
.option('--steps <list>', 'run only these step types, comma-separated: review,fix,recheck')
|
|
72
74
|
.option('--dry-run', 'run the review but do not post a comment or apply fixes')
|
|
73
|
-
.action((prUrl, opts) => void runRun(prUrl, opts));
|
|
75
|
+
.action((prUrl, opts) => void runRun(prUrl, { ...opts, reviewer: opts.reviewer ?? opts.vendor }));
|
|
74
76
|
program
|
|
75
77
|
.command('status')
|
|
76
78
|
.description('Show auth state, config summary, and CLI versions')
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2EzF;AASD,wBAAsB,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,OAAO,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;CACb;AAED,wBAAsB,SAAS,IAAI,OAAO,CAAC;IAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CA2EzF;AASD,wBAAsB,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,iBAyFhD"}
|
package/dist/commands/init.js
CHANGED
|
@@ -5,7 +5,7 @@ import { homedir } from 'os';
|
|
|
5
5
|
import chalk from 'chalk';
|
|
6
6
|
import { checkCodexAuth } from '../reviewers/codex.js';
|
|
7
7
|
import { checkClaudeAuth } from '../reviewers/claude.js';
|
|
8
|
-
import { getWebhookSecret, getWebhookSecretPath, detectGitHubLogin, patchAllowedAuthors,
|
|
8
|
+
import { getWebhookSecret, getWebhookSecretPath, detectGitHubLogin, patchAllowedAuthors, loadConfig, resolveConfigPath } from '../config/loader.js';
|
|
9
9
|
export async function runChecks() {
|
|
10
10
|
const results = [];
|
|
11
11
|
let aiCliCount = 0;
|
|
@@ -137,17 +137,22 @@ export async function runInit(configPath) {
|
|
|
137
137
|
if (login) {
|
|
138
138
|
// Uncomment allowed_authors placeholder
|
|
139
139
|
content = content.replace(/ # allowed_authors:\n( #[^\n]*\n)+/, ` allowed_authors:\n - ${login} # auto-detected from gh auth\n`);
|
|
140
|
-
//
|
|
141
|
-
//
|
|
142
|
-
|
|
140
|
+
// author_routes is intentionally left commented out. In cross-vendor mode with
|
|
141
|
+
// both vendors enabled (the default), routes for an author who uses both
|
|
142
|
+
// agents are structurally wrong — attribution detection + fallback_reviewer
|
|
143
|
+
// are the correct path. `crosscheck onboard` writes the route only when the
|
|
144
|
+
// user picks a single authorVendor.
|
|
143
145
|
}
|
|
144
146
|
writeFileSync(dest, content);
|
|
145
|
-
const hint = login ? `allowed_authors
|
|
147
|
+
const hint = login ? `allowed_authors set to ${chalk.cyan(login)}` : 'edit to customize';
|
|
146
148
|
console.log(chalk.dim(`Config written to ${dest} — ${hint}.\n`));
|
|
147
149
|
}
|
|
148
150
|
}
|
|
149
151
|
else {
|
|
150
|
-
// Config exists — patch allowed_authors
|
|
152
|
+
// Config exists — patch allowed_authors if still empty.
|
|
153
|
+
// author_routes is intentionally not auto-patched: `crosscheck onboard` writes it
|
|
154
|
+
// only when the user picks a single authorVendor, since cross-vendor + both
|
|
155
|
+
// enabled bypasses the route (see detector.ts).
|
|
151
156
|
const existing = loadConfig(resolveConfigPath(configPath) ?? dest);
|
|
152
157
|
const login = detectGitHubLogin();
|
|
153
158
|
let patched = false;
|
|
@@ -155,9 +160,6 @@ export async function runInit(configPath) {
|
|
|
155
160
|
if (existing.routing.allowed_authors.length === 0) {
|
|
156
161
|
patched = patchAllowedAuthors(dest, login) || patched;
|
|
157
162
|
}
|
|
158
|
-
if (Object.keys(existing.routing.author_routes).length === 0) {
|
|
159
|
-
patched = patchAuthorRoutes(dest, login) || patched;
|
|
160
|
-
}
|
|
161
163
|
}
|
|
162
164
|
if (patched) {
|
|
163
165
|
console.log(chalk.green(` ✓ routing updated for ${chalk.cyan(login ?? 'unknown')} in ${dest}\n`));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAA;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AA2NA,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,SAAc,
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../src/commands/serve.ts"],"names":[],"mappings":"AA2NA,MAAM,WAAW,SAAS;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAED,wBAAsB,QAAQ,CAAC,IAAI,GAAE,SAAc,iBAqMlD"}
|
package/dist/commands/serve.js
CHANGED
|
@@ -272,6 +272,21 @@ export async function runServe(opts = {}) {
|
|
|
272
272
|
console.log(` ${chalk.yellow('⚠')} ${chalk.yellow('No author filter set — all PRs in monitored orgs/repos will be reviewed.')}`);
|
|
273
273
|
console.log(` ${chalk.dim('Run')} ${chalk.cyan('crosscheck serve --reconfigure')} ${chalk.dim('to set up a deployment mode.')}`);
|
|
274
274
|
}
|
|
275
|
+
// Warn when author_routes will be silently bypassed (cross-vendor + both vendors enabled).
|
|
276
|
+
const bothVendorsEnabled = config.mode === 'cross-vendor'
|
|
277
|
+
&& config.vendors.claude.enabled
|
|
278
|
+
&& config.vendors.codex.enabled;
|
|
279
|
+
const routedAllowedAuthors = bothVendorsEnabled
|
|
280
|
+
? Object.entries(config.routing.author_routes).filter(([login]) => config.routing.allowed_authors.length === 0 || config.routing.allowed_authors.includes(login))
|
|
281
|
+
: [];
|
|
282
|
+
if (routedAllowedAuthors.length > 0) {
|
|
283
|
+
console.log();
|
|
284
|
+
console.log(` ${chalk.yellow('⚠')} ${chalk.yellow('author_routes bypassed in cross-vendor mode (both vendors enabled).')}`);
|
|
285
|
+
for (const [login, vendor] of routedAllowedAuthors) {
|
|
286
|
+
console.log(` ${chalk.dim(`${login} → ${vendor}`)}`);
|
|
287
|
+
}
|
|
288
|
+
console.log(` ${chalk.dim('PRs without attribution markers fall through to')} ${chalk.cyan(`fallback_reviewer: ${config.routing.fallback_reviewer ?? 'skip'}`)} ${chalk.dim('instead.')}`);
|
|
289
|
+
}
|
|
275
290
|
console.log();
|
|
276
291
|
console.log(chalk.dim('Register the endpoint above as a GitHub webhook (content-type: application/json).'));
|
|
277
292
|
if (config.orgs.length > 0) {
|