@motivation-labs/crosscheck 0.13.0-beta.7 → 0.13.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/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/__tests__/onboard-preservation.test.js +67 -1
- package/dist/__tests__/onboard-preservation.test.js.map +1 -1
- package/dist/__tests__/pr-lock.test.js +65 -3
- package/dist/__tests__/pr-lock.test.js.map +1 -1
- package/dist/__tests__/runner.test.js +72 -2
- package/dist/__tests__/runner.test.js.map +1 -1
- 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/onboard.d.ts +2 -0
- package/dist/commands/onboard.d.ts.map +1 -1
- package/dist/commands/onboard.js +53 -6
- package/dist/commands/onboard.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +104 -61
- package/dist/commands/run.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/client.d.ts +2 -1
- package/dist/github/client.d.ts.map +1 -1
- package/dist/github/client.js +55 -3
- package/dist/github/client.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 +128 -128
- package/dist/lib/board.js.map +1 -1
- package/dist/lib/pr-lock.d.ts +1 -0
- package/dist/lib/pr-lock.d.ts.map +1 -1
- package/dist/lib/pr-lock.js +28 -13
- package/dist/lib/pr-lock.js.map +1 -1
- package/dist/lib/runner.d.ts +1 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/runner.js +240 -11
- package/dist/lib/runner.js.map +1 -1
- package/dist/lib/workflow.d.ts +10 -8
- package/dist/lib/workflow.d.ts.map +1 -1
- package/dist/lib/workflow.js +7 -1
- package/dist/lib/workflow.js.map +1 -1
- package/dist/reviewers/conflict-resolve.d.ts +14 -0
- package/dist/reviewers/conflict-resolve.d.ts.map +1 -0
- package/dist/reviewers/conflict-resolve.js +213 -0
- package/dist/reviewers/conflict-resolve.js.map +1 -0
- package/package.json +1 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
-
import { writeFileSync, mkdirSync, utimesSync } from 'fs';
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { writeFileSync, mkdirSync, utimesSync, existsSync } from 'fs';
|
|
3
3
|
import { homedir } from 'os';
|
|
4
4
|
import { join } from 'path';
|
|
5
|
-
import { acquirePRLock, releasePRLock } from '../lib/pr-lock.js';
|
|
5
|
+
import { acquirePRLock, releasePRLock, handleLockSignal } from '../lib/pr-lock.js';
|
|
6
6
|
const OWNER = 'test-owner';
|
|
7
7
|
const REPO = 'test-repo';
|
|
8
8
|
const PR = 999;
|
|
@@ -50,4 +50,66 @@ describe('releasePRLock', () => {
|
|
|
50
50
|
expect(() => releasePRLock(OWNER, REPO, PR, SHA)).not.toThrow();
|
|
51
51
|
});
|
|
52
52
|
});
|
|
53
|
+
describe('handleLockSignal', () => {
|
|
54
|
+
// process.kill would actually deliver the signal to the test runner and
|
|
55
|
+
// terminate it. We stub it out and assert the call shape instead. Each
|
|
56
|
+
// test snapshots existing SIGINT listeners and restores them afterward so
|
|
57
|
+
// module-level state (acquirePRLock's one-shot register) doesn't bleed
|
|
58
|
+
// across tests.
|
|
59
|
+
let savedListeners = [];
|
|
60
|
+
beforeEach(() => {
|
|
61
|
+
savedListeners = process.listeners('SIGINT');
|
|
62
|
+
for (const l of savedListeners)
|
|
63
|
+
process.removeListener('SIGINT', l);
|
|
64
|
+
});
|
|
65
|
+
afterEach(() => {
|
|
66
|
+
for (const l of process.listeners('SIGINT'))
|
|
67
|
+
process.removeListener('SIGINT', l);
|
|
68
|
+
for (const l of savedListeners)
|
|
69
|
+
process.on('SIGINT', l);
|
|
70
|
+
});
|
|
71
|
+
it('removes active lock files when signal fires', () => {
|
|
72
|
+
acquirePRLock(OWNER, REPO, PR, SHA);
|
|
73
|
+
const lockFile = join(homedir(), '.crosscheck', 'locks', `${OWNER}-${REPO}-${PR}-${SHA.slice(0, 8)}.lock`);
|
|
74
|
+
expect(existsSync(lockFile)).toBe(true);
|
|
75
|
+
const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true);
|
|
76
|
+
try {
|
|
77
|
+
handleLockSignal('SIGINT');
|
|
78
|
+
expect(existsSync(lockFile)).toBe(false);
|
|
79
|
+
}
|
|
80
|
+
finally {
|
|
81
|
+
killSpy.mockRestore();
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
it('re-raises the signal to terminate the process when it is the sole listener', () => {
|
|
85
|
+
process.on('SIGINT', handleLockSignal);
|
|
86
|
+
expect(process.listenerCount('SIGINT')).toBe(1);
|
|
87
|
+
const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true);
|
|
88
|
+
try {
|
|
89
|
+
handleLockSignal('SIGINT');
|
|
90
|
+
expect(killSpy).toHaveBeenCalledWith(process.pid, 'SIGINT');
|
|
91
|
+
// Should have removed itself before re-raising so the default action takes over
|
|
92
|
+
expect(process.listenerCount('SIGINT')).toBe(0);
|
|
93
|
+
}
|
|
94
|
+
finally {
|
|
95
|
+
killSpy.mockRestore();
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
it('does not re-raise when another listener exists (lets graceful-shutdown handlers drive exit)', () => {
|
|
99
|
+
process.on('SIGINT', handleLockSignal);
|
|
100
|
+
const otherListener = () => { };
|
|
101
|
+
process.on('SIGINT', otherListener);
|
|
102
|
+
expect(process.listenerCount('SIGINT')).toBe(2);
|
|
103
|
+
const killSpy = vi.spyOn(process, 'kill').mockImplementation(() => true);
|
|
104
|
+
try {
|
|
105
|
+
handleLockSignal('SIGINT');
|
|
106
|
+
expect(killSpy).not.toHaveBeenCalled();
|
|
107
|
+
// Our handler should still be registered — only the sole-listener path removes it
|
|
108
|
+
expect(process.listenerCount('SIGINT')).toBe(2);
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
killSpy.mockRestore();
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
});
|
|
53
115
|
//# sourceMappingURL=pr-lock.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-lock.test.js","sourceRoot":"","sources":["../../src/__tests__/pr-lock.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"pr-lock.test.js","sourceRoot":"","sources":["../../src/__tests__/pr-lock.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import {
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { execFileSync } from 'child_process';
|
|
3
|
+
import { mkdtempSync, rmSync, writeFileSync } from 'fs';
|
|
4
|
+
import { tmpdir } from 'os';
|
|
5
|
+
import { join } from 'path';
|
|
6
|
+
import { isRetryableFixError, getEffectiveStepType, exceedsMaxRounds, countCrosscheckCommitsForPR, } from '../lib/runner.js';
|
|
3
7
|
describe('isRetryableFixError', () => {
|
|
4
8
|
it('returns false for auth failure errors', () => {
|
|
5
9
|
expect(isRetryableFixError(new Error('claude auth failure during fix step — run: claude auth login'))).toBe(false);
|
|
@@ -45,6 +49,72 @@ describe('exceedsMaxRounds', () => {
|
|
|
45
49
|
expect(exceedsMaxRounds('review', 'review', 1, 2)).toBe(false);
|
|
46
50
|
});
|
|
47
51
|
});
|
|
52
|
+
describe('countCrosscheckCommitsForPR', () => {
|
|
53
|
+
let tmpDir;
|
|
54
|
+
// Build a repo with a `base` branch carrying [crosscheck] commits (simulating
|
|
55
|
+
// a long-lived branch like staging) and a `head` branch ahead of it. The
|
|
56
|
+
// count must include only commits unique to head.
|
|
57
|
+
const git = (...args) => execFileSync('git', args, { cwd: tmpDir, encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'] });
|
|
58
|
+
const commit = (file, content, message) => {
|
|
59
|
+
writeFileSync(join(tmpDir, file), content);
|
|
60
|
+
git('add', file);
|
|
61
|
+
git('commit', '-m', message);
|
|
62
|
+
};
|
|
63
|
+
beforeEach(() => {
|
|
64
|
+
tmpDir = mkdtempSync(join(tmpdir(), 'crosscheck-runner-test-'));
|
|
65
|
+
git('init', '-q', '-b', 'base');
|
|
66
|
+
git('config', 'user.email', 'test@example.com');
|
|
67
|
+
git('config', 'user.name', 'Test');
|
|
68
|
+
git('config', 'commit.gpgsign', 'false');
|
|
69
|
+
// base branch: 6 [crosscheck] commits from prior merged PRs
|
|
70
|
+
commit('seed.txt', 'seed\n', 'chore: initial');
|
|
71
|
+
for (let i = 0; i < 6; i++) {
|
|
72
|
+
commit(`base${i}.txt`, `b${i}\n`, `[crosscheck] fix from prior PR #${i}`);
|
|
73
|
+
}
|
|
74
|
+
// Promote base into refs/remotes/origin/base so the helper's
|
|
75
|
+
// `origin/<base>..HEAD` range resolves the same way it does in production
|
|
76
|
+
// (clone.ts fetches the base ref into refs/remotes/origin/<base>).
|
|
77
|
+
git('update-ref', 'refs/remotes/origin/base', 'base');
|
|
78
|
+
// head branch ahead of base
|
|
79
|
+
git('checkout', '-q', '-b', 'feature');
|
|
80
|
+
});
|
|
81
|
+
afterEach(() => {
|
|
82
|
+
rmSync(tmpDir, { force: true, recursive: true });
|
|
83
|
+
});
|
|
84
|
+
it('counts only [crosscheck] commits ahead of base (ignores base history)', () => {
|
|
85
|
+
// Two fix commits on this PR — base has 6 prior crosscheck commits we must ignore
|
|
86
|
+
commit('a.txt', 'a\n', '[crosscheck] fix round 1');
|
|
87
|
+
commit('b.txt', 'b\n', '[crosscheck] fix round 2');
|
|
88
|
+
expect(countCrosscheckCommitsForPR(tmpDir, 'base')).toBe(2);
|
|
89
|
+
});
|
|
90
|
+
it('returns 0 when the PR has no crosscheck commits, even if base has many', () => {
|
|
91
|
+
commit('feat.txt', 'feat\n', 'feat: human work only');
|
|
92
|
+
expect(countCrosscheckCommitsForPR(tmpDir, 'base')).toBe(0);
|
|
93
|
+
});
|
|
94
|
+
it('ignores non-crosscheck commits on the PR branch', () => {
|
|
95
|
+
commit('feat.txt', 'feat\n', 'feat: add thing');
|
|
96
|
+
commit('a.txt', 'a\n', '[crosscheck] fix one');
|
|
97
|
+
commit('docs.txt', 'docs\n', 'docs: update readme');
|
|
98
|
+
expect(countCrosscheckCommitsForPR(tmpDir, 'base')).toBe(1);
|
|
99
|
+
});
|
|
100
|
+
it('falls back to full-history count when origin/<base> does not exist (fail closed)', () => {
|
|
101
|
+
// 6 [crosscheck] commits on base + 1 on feature = 7 total in the branch
|
|
102
|
+
// history. If the scoped range fails, we must still see them so the
|
|
103
|
+
// 5-commit cap trips rather than silently passing.
|
|
104
|
+
commit('a.txt', 'a\n', '[crosscheck] fix one');
|
|
105
|
+
expect(countCrosscheckCommitsForPR(tmpDir, 'nonexistent-branch')).toBe(7);
|
|
106
|
+
});
|
|
107
|
+
it('returns 0 only when neither the scoped range nor the full history is readable', () => {
|
|
108
|
+
// Point tmpDir at a non-repo location — both git invocations will fail.
|
|
109
|
+
const nonRepo = mkdtempSync(join(tmpdir(), 'crosscheck-not-a-repo-'));
|
|
110
|
+
try {
|
|
111
|
+
expect(countCrosscheckCommitsForPR(nonRepo, 'main')).toBe(0);
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
rmSync(nonRepo, { force: true, recursive: true });
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
});
|
|
48
118
|
describe('getEffectiveStepType', () => {
|
|
49
119
|
it('coerces review → recheck when isRecheckRun is true', () => {
|
|
50
120
|
expect(getEffectiveStepType('review', true)).toBe('recheck');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../../src/__tests__/runner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"runner.test.js","sourceRoot":"","sources":["../../src/__tests__/runner.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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"}
|
|
@@ -48,6 +48,7 @@ declare const QUALITY_TIERS: {
|
|
|
48
48
|
};
|
|
49
49
|
type QualityTier = keyof typeof QUALITY_TIERS;
|
|
50
50
|
export declare function detectCurrentPreset(workflowDir?: string): WorkflowPreset;
|
|
51
|
+
export declare function detectConflictResolveEnabled(workflowDir?: string): boolean;
|
|
51
52
|
export interface OnboardDecisions {
|
|
52
53
|
deployment: 'personal' | 'team';
|
|
53
54
|
login: string;
|
|
@@ -58,6 +59,7 @@ export interface OnboardDecisions {
|
|
|
58
59
|
qualityTier: QualityTier;
|
|
59
60
|
pipelinePreset: WorkflowPreset;
|
|
60
61
|
maxRounds?: number;
|
|
62
|
+
conflictResolve: boolean;
|
|
61
63
|
tunnelBackend: 'localhost.run' | 'smee';
|
|
62
64
|
smeeChannel: string;
|
|
63
65
|
cloneProtocol: 'ssh' | 'https';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAQD,KAAK,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,oBAAoB,CAAA;AAEzE,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,cAAc,GAAG,eAAe,CAAA;IACtC,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;CACtB,CAAA;AAID,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgBT,CAAA;AAEV,KAAK,WAAW,GAAG,MAAM,OAAO,aAAa,CAAA;AAkM7C,wBAAgB,mBAAmB,CAAC,WAAW,GAAE,MAAuC,GAAG,cAAc,CAexG;
|
|
1
|
+
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../src/commands/onboard.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAQD,KAAK,cAAc,GAAG,aAAa,GAAG,YAAY,GAAG,oBAAoB,CAAA;AAEzE,KAAK,gBAAgB,GAAG;IACtB,IAAI,EAAE,cAAc,GAAG,eAAe,CAAA;IACtC,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;CACtB,CAAA;AAID,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgBT,CAAA;AAEV,KAAK,WAAW,GAAG,MAAM,OAAO,aAAa,CAAA;AAkM7C,wBAAgB,mBAAmB,CAAC,WAAW,GAAE,MAAuC,GAAG,cAAc,CAexG;AAED,wBAAgB,4BAA4B,CAAC,WAAW,GAAE,MAAuC,GAAG,OAAO,CAO1G;AA4ID,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,UAAU,GAAG,MAAM,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,YAAY,EAAE,gBAAgB,CAAA;IAC9B,YAAY,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAA;IACzC,WAAW,EAAE,WAAW,CAAA;IACxB,cAAc,EAAE,cAAc,CAAA;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,EAAE,OAAO,CAAA;IACxB,aAAa,EAAE,eAAe,GAAG,MAAM,CAAA;IACvC,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,KAAK,GAAG,OAAO,CAAA;CAC/B;AAwDD,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,gBAAgB,EAC3B,WAAW,SAAiC,GAC3C,IAAI,CAwKN;AAED,wBAAsB,UAAU,CAAC,IAAI,GAAE,WAAgB,iBAoWtD"}
|
package/dist/commands/onboard.js
CHANGED
|
@@ -10,7 +10,7 @@ import { checkCodexAuth } from '../reviewers/codex.js';
|
|
|
10
10
|
import { checkClaudeAuth } from '../reviewers/claude.js';
|
|
11
11
|
import { execSync } from 'child_process';
|
|
12
12
|
import { promptRepoPicker, promptSinglePicker } from '../lib/repo-picker.js';
|
|
13
|
-
import { DEFAULT_REVIEW_INSTRUCTIONS, DEFAULT_FIX_INSTRUCTIONS, DEFAULT_RECHECK_INSTRUCTIONS } from '../lib/workflow.js';
|
|
13
|
+
import { DEFAULT_REVIEW_INSTRUCTIONS, DEFAULT_FIX_INSTRUCTIONS, DEFAULT_RECHECK_INSTRUCTIONS, DEFAULT_CONFLICT_RESOLVE_INSTRUCTIONS } from '../lib/workflow.js';
|
|
14
14
|
// Model and effort settings for each quality tier.
|
|
15
15
|
// These are written directly to vendors.claude / vendors.codex in the config.
|
|
16
16
|
const QUALITY_TIERS = {
|
|
@@ -216,6 +216,35 @@ export function detectCurrentPreset(workflowDir = join(homedir(), '.crosscheck')
|
|
|
216
216
|
}
|
|
217
217
|
return 'review-only';
|
|
218
218
|
}
|
|
219
|
+
export function detectConflictResolveEnabled(workflowDir = join(homedir(), '.crosscheck')) {
|
|
220
|
+
const path = join(workflowDir, 'workflow.yml');
|
|
221
|
+
if (!existsSync(path))
|
|
222
|
+
return false;
|
|
223
|
+
try {
|
|
224
|
+
const raw = yaml.load(readFileSync(path, 'utf8'));
|
|
225
|
+
return (raw?.steps ?? []).some(s => s.type === 'conflict-resolve');
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
async function promptConflictResolve(currentEnabled, opts) {
|
|
232
|
+
if (opts.yes) {
|
|
233
|
+
console.log(` Conflict-resolve: ${chalk.cyan(currentEnabled ? 'yes' : 'no')}`);
|
|
234
|
+
return currentEnabled;
|
|
235
|
+
}
|
|
236
|
+
const items = [
|
|
237
|
+
{ label: 'no', description: 'leave merge conflicts for the PR author to resolve manually' },
|
|
238
|
+
{ label: 'yes', description: 'auto-resolve merge conflicts before each review (requires Claude)' },
|
|
239
|
+
];
|
|
240
|
+
const defaultIdx = currentEnabled ? 1 : 0;
|
|
241
|
+
const idx = await promptSinglePicker(items, {
|
|
242
|
+
title: 'Auto-resolve merge conflicts?',
|
|
243
|
+
defaultIndex: defaultIdx,
|
|
244
|
+
});
|
|
245
|
+
console.log();
|
|
246
|
+
return idx === 1;
|
|
247
|
+
}
|
|
219
248
|
async function promptMaxRounds(currentMaxRounds, opts) {
|
|
220
249
|
if (opts.yes) {
|
|
221
250
|
const rounds = currentMaxRounds ?? 1;
|
|
@@ -312,7 +341,14 @@ async function promptCloneProtocol(currentProtocol, opts) {
|
|
|
312
341
|
// Build the workflow YAML for the given preset, with inline per-step instructions.
|
|
313
342
|
// Written to ~/.crosscheck/workflow.yml on first onboard. On re-runs, regenerated
|
|
314
343
|
// only when the step-type sequence drifts from the selected preset.
|
|
315
|
-
function buildWorkflowYaml(preset, maxRounds = 1) {
|
|
344
|
+
function buildWorkflowYaml(preset, maxRounds = 1, conflictResolve = false) {
|
|
345
|
+
const conflictResolveStep = {
|
|
346
|
+
name: 'conflict-resolve',
|
|
347
|
+
type: 'conflict-resolve',
|
|
348
|
+
reviewer: 'origin',
|
|
349
|
+
max_rounds: 3,
|
|
350
|
+
instructions: DEFAULT_CONFLICT_RESOLVE_INSTRUCTIONS,
|
|
351
|
+
};
|
|
316
352
|
const reviewStep = {
|
|
317
353
|
name: 'review',
|
|
318
354
|
type: 'review',
|
|
@@ -343,6 +379,8 @@ function buildWorkflowYaml(preset, maxRounds = 1) {
|
|
|
343
379
|
steps = [reviewStep, fixStep];
|
|
344
380
|
else
|
|
345
381
|
steps = [reviewStep, fixStep, recheckStep];
|
|
382
|
+
if (conflictResolve)
|
|
383
|
+
steps = [conflictResolveStep, ...steps];
|
|
346
384
|
const header = [
|
|
347
385
|
'# crosscheck workflow — generated by crosscheck onboard',
|
|
348
386
|
'# Edit this file to customize your pipeline. Re-running onboard preserves this file.',
|
|
@@ -354,7 +392,7 @@ function buildWorkflowYaml(preset, maxRounds = 1) {
|
|
|
354
392
|
// Writes all onboard decisions to configPath and manages the global workflow.yml.
|
|
355
393
|
// On re-runs, only the fields onboard owns are updated; everything else is preserved.
|
|
356
394
|
export function applyOnboardConfig(configPath, decisions, workflowDir = join(homedir(), '.crosscheck')) {
|
|
357
|
-
const { deployment, login, selectedRepos, selectedOrgs, vendorConfig, qualityTier, pipelinePreset, maxRounds, tunnelBackend, smeeChannel, cloneProtocol } = decisions;
|
|
395
|
+
const { deployment, login, selectedRepos, selectedOrgs, vendorConfig, qualityTier, pipelinePreset, maxRounds, conflictResolve, tunnelBackend, smeeChannel, cloneProtocol } = decisions;
|
|
358
396
|
mkdirSync(dirname(configPath), { recursive: true });
|
|
359
397
|
// Load existing config (preserves all custom fields) or start fresh
|
|
360
398
|
const raw = existsSync(configPath)
|
|
@@ -471,9 +509,11 @@ export function applyOnboardConfig(configPath, decisions, workflowDir = join(hom
|
|
|
471
509
|
'review-fix-recheck': ['review', 'fix', 'recheck'],
|
|
472
510
|
};
|
|
473
511
|
const requiredSet = new Set(presetStepTypes[pipelinePreset]);
|
|
512
|
+
if (conflictResolve)
|
|
513
|
+
requiredSet.add('conflict-resolve');
|
|
474
514
|
const effectiveMaxRounds = maxRounds ?? 1;
|
|
475
515
|
if (!existsSync(globalWorkflowPath)) {
|
|
476
|
-
writeFileSync(globalWorkflowPath, buildWorkflowYaml(pipelinePreset, effectiveMaxRounds));
|
|
516
|
+
writeFileSync(globalWorkflowPath, buildWorkflowYaml(pipelinePreset, effectiveMaxRounds, conflictResolve));
|
|
477
517
|
}
|
|
478
518
|
else {
|
|
479
519
|
try {
|
|
@@ -496,7 +536,7 @@ export function applyOnboardConfig(configPath, decisions, workflowDir = join(hom
|
|
|
496
536
|
&& existingMaxRounds.some(r => r !== effectiveMaxRounds);
|
|
497
537
|
if (!setsMatch) {
|
|
498
538
|
// Preset changed — regenerate from template (step types differ)
|
|
499
|
-
writeFileSync(globalWorkflowPath, buildWorkflowYaml(pipelinePreset, effectiveMaxRounds));
|
|
539
|
+
writeFileSync(globalWorkflowPath, buildWorkflowYaml(pipelinePreset, effectiveMaxRounds, conflictResolve));
|
|
500
540
|
}
|
|
501
541
|
else if (maxRoundsDrifted) {
|
|
502
542
|
// Preset unchanged, only max_rounds changed — patch in-place to preserve
|
|
@@ -514,7 +554,7 @@ export function applyOnboardConfig(configPath, decisions, workflowDir = join(hom
|
|
|
514
554
|
}
|
|
515
555
|
catch {
|
|
516
556
|
// Malformed workflow file — regenerate
|
|
517
|
-
writeFileSync(globalWorkflowPath, buildWorkflowYaml(pipelinePreset, effectiveMaxRounds));
|
|
557
|
+
writeFileSync(globalWorkflowPath, buildWorkflowYaml(pipelinePreset, effectiveMaxRounds, conflictResolve));
|
|
518
558
|
}
|
|
519
559
|
}
|
|
520
560
|
}
|
|
@@ -735,6 +775,11 @@ export async function runOnboard(opts = {}) {
|
|
|
735
775
|
maxRounds = await promptMaxRounds(currentMaxRounds, opts);
|
|
736
776
|
console.log();
|
|
737
777
|
}
|
|
778
|
+
// ── Step 7.7: Auto-conflict-resolve (opt-in) ──────────────────────────────
|
|
779
|
+
console.log(chalk.bold('Step 7.7 — auto conflict-resolve'));
|
|
780
|
+
const currentConflictResolve = detectConflictResolveEnabled();
|
|
781
|
+
const conflictResolve = await promptConflictResolve(currentConflictResolve, opts);
|
|
782
|
+
console.log();
|
|
738
783
|
// ── Step 8: Connection type ────────────────────────────────────────────────
|
|
739
784
|
console.log(chalk.bold('Step 8 — connection type'));
|
|
740
785
|
const currentTunnel = existingConfig?.tunnel?.backend;
|
|
@@ -787,6 +832,7 @@ export async function runOnboard(opts = {}) {
|
|
|
787
832
|
if (pipelinePreset === 'review-fix-recheck') {
|
|
788
833
|
console.log(` max rounds ${chalk.cyan(String(maxRounds ?? 1))}`);
|
|
789
834
|
}
|
|
835
|
+
console.log(` conflict-resolve ${chalk.cyan(conflictResolve ? 'yes' : 'no')}`);
|
|
790
836
|
if (selectedOrgs.length > 0) {
|
|
791
837
|
console.log(` orgs ${selectedOrgs.map(o => chalk.cyan(o)).join(', ')}`);
|
|
792
838
|
}
|
|
@@ -818,6 +864,7 @@ export async function runOnboard(opts = {}) {
|
|
|
818
864
|
qualityTier,
|
|
819
865
|
pipelinePreset,
|
|
820
866
|
maxRounds,
|
|
867
|
+
conflictResolve,
|
|
821
868
|
tunnelBackend,
|
|
822
869
|
smeeChannel,
|
|
823
870
|
cloneProtocol,
|