@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
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import { execSync } from 'child_process';
|
|
2
|
+
import { readFileSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { execa } from 'execa';
|
|
5
|
+
import { applyEdit } from './fix.js';
|
|
6
|
+
const PROMPT_TEMPLATE = `This pull request has merge conflicts. Resolve all conflict markers in the files listed below.
|
|
7
|
+
|
|
8
|
+
PR title: {PR_TITLE}
|
|
9
|
+
|
|
10
|
+
Conflicted files:
|
|
11
|
+
{CONFLICTED_FILES}
|
|
12
|
+
|
|
13
|
+
{EXTRA_INSTRUCTIONS}
|
|
14
|
+
|
|
15
|
+
Rules for resolving each conflict:
|
|
16
|
+
- Keep ALL meaningful changes from both sides if they are not directly contradictory
|
|
17
|
+
- When both sides modify the same line, prefer the incoming branch changes (the >>>>>>> side) unless they clearly break existing logic
|
|
18
|
+
- Remove ALL conflict markers: <<<<<<<, =======, >>>>>>>
|
|
19
|
+
|
|
20
|
+
For each file, output ONLY the resolved conflict regions using this format:
|
|
21
|
+
|
|
22
|
+
<edit path="relative/path/to/file.ext">
|
|
23
|
+
<old>
|
|
24
|
+
exact conflict region including all markers (copy verbatim from the file)
|
|
25
|
+
</old>
|
|
26
|
+
<new>
|
|
27
|
+
resolved content with no conflict markers
|
|
28
|
+
</new>
|
|
29
|
+
</edit>
|
|
30
|
+
|
|
31
|
+
Rules for <edit> blocks:
|
|
32
|
+
- <old> must match the file content EXACTLY, including conflict markers and surrounding lines
|
|
33
|
+
- <new> must not contain ANY conflict markers
|
|
34
|
+
- Include 2–3 context lines around the conflict region to make the match unambiguous
|
|
35
|
+
- One block per conflict region; multiple blocks per file are fine
|
|
36
|
+
- Output ONLY <edit> blocks. No other text.`;
|
|
37
|
+
// Returns file paths that have unmerged conflict markers (git status: UU/AA/DD).
|
|
38
|
+
export function findConflictedFiles(tmpDir) {
|
|
39
|
+
try {
|
|
40
|
+
const out = execSync('git diff --name-only --diff-filter=U', { cwd: tmpDir, encoding: 'utf8' });
|
|
41
|
+
return out.trim().split('\n').filter(Boolean);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return [];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Extract every conflict region in a file with a few context lines on each side.
|
|
48
|
+
// Slicing from the file prefix instead would hide conflicts that appear past the
|
|
49
|
+
// budget, so the resolver couldn't produce a matching <old> block.
|
|
50
|
+
const CONTEXT_LINES = 6;
|
|
51
|
+
const PER_FILE_MAX = 12_000;
|
|
52
|
+
export function extractConflictWindows(content) {
|
|
53
|
+
const lines = content.split('\n');
|
|
54
|
+
const starts = [];
|
|
55
|
+
for (let i = 0; i < lines.length; i++) {
|
|
56
|
+
if (lines[i].startsWith('<<<<<<<'))
|
|
57
|
+
starts.push(i);
|
|
58
|
+
}
|
|
59
|
+
if (starts.length === 0)
|
|
60
|
+
return '';
|
|
61
|
+
const ranges = [];
|
|
62
|
+
for (const start of starts) {
|
|
63
|
+
let end = start;
|
|
64
|
+
for (let i = start; i < lines.length; i++) {
|
|
65
|
+
if (lines[i].startsWith('>>>>>>>')) {
|
|
66
|
+
end = i;
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
end = i;
|
|
70
|
+
}
|
|
71
|
+
const from = Math.max(0, start - CONTEXT_LINES);
|
|
72
|
+
const to = Math.min(lines.length - 1, end + CONTEXT_LINES);
|
|
73
|
+
const prev = ranges[ranges.length - 1];
|
|
74
|
+
if (prev && from <= prev[1] + 1) {
|
|
75
|
+
prev[1] = Math.max(prev[1], to);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
ranges.push([from, to]);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const chunks = [];
|
|
82
|
+
let total = 0;
|
|
83
|
+
for (const [from, to] of ranges) {
|
|
84
|
+
const block = lines.slice(from, to + 1).join('\n');
|
|
85
|
+
const header = `... lines ${from + 1}-${to + 1} ...`;
|
|
86
|
+
const piece = `${header}\n${block}`;
|
|
87
|
+
if (total + piece.length > PER_FILE_MAX) {
|
|
88
|
+
chunks.push('... (remaining conflict regions truncated)');
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
chunks.push(piece);
|
|
92
|
+
total += piece.length;
|
|
93
|
+
}
|
|
94
|
+
return chunks.join('\n\n');
|
|
95
|
+
}
|
|
96
|
+
function buildConflictedFilesBlock(tmpDir, filePaths) {
|
|
97
|
+
return filePaths.map(f => {
|
|
98
|
+
try {
|
|
99
|
+
const content = readFileSync(join(tmpDir, f), 'utf8');
|
|
100
|
+
const windowed = extractConflictWindows(content);
|
|
101
|
+
// No textual conflict markers (binary / modify-delete) — surface the file by name only.
|
|
102
|
+
if (!windowed) {
|
|
103
|
+
return `### ${f}\n(no textual conflict markers — likely a non-text conflict; skip)`;
|
|
104
|
+
}
|
|
105
|
+
return `### ${f}\n\`\`\`\n${windowed}\n\`\`\``;
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return `### ${f}\n(could not read file)`;
|
|
109
|
+
}
|
|
110
|
+
}).join('\n\n');
|
|
111
|
+
}
|
|
112
|
+
export async function runConflictResolveStep(tmpDir, prTitle, instructions) {
|
|
113
|
+
const conflictedFiles = findConflictedFiles(tmpDir);
|
|
114
|
+
if (conflictedFiles.length === 0)
|
|
115
|
+
return { appliedCount: 0, resolvedPaths: [] };
|
|
116
|
+
const filesBlock = buildConflictedFilesBlock(tmpDir, conflictedFiles);
|
|
117
|
+
const prompt = PROMPT_TEMPLATE
|
|
118
|
+
.replace('{PR_TITLE}', prTitle)
|
|
119
|
+
.replace('{CONFLICTED_FILES}', filesBlock)
|
|
120
|
+
.replace('{EXTRA_INSTRUCTIONS}', instructions ? `Additional instructions: ${instructions}` : '');
|
|
121
|
+
let output = '';
|
|
122
|
+
let tokensUsed;
|
|
123
|
+
try {
|
|
124
|
+
const { stdout } = await execa('claude', ['--print', '--output-format', 'json'], {
|
|
125
|
+
input: prompt,
|
|
126
|
+
timeout: 180_000,
|
|
127
|
+
env: { ...process.env },
|
|
128
|
+
});
|
|
129
|
+
const raw = stdout.trim();
|
|
130
|
+
try {
|
|
131
|
+
const parsed = JSON.parse(raw);
|
|
132
|
+
output = typeof parsed.result === 'string' ? parsed.result : raw;
|
|
133
|
+
const inTok = parsed.usage?.input_tokens;
|
|
134
|
+
const outTok = parsed.usage?.output_tokens;
|
|
135
|
+
tokensUsed = typeof inTok === 'number' && typeof outTok === 'number' ? inTok + outTok : undefined;
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
output = raw;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
143
|
+
if (/not logged in|auth|credential/i.test(msg)) {
|
|
144
|
+
throw new Error('claude auth failure during conflict-resolve step — run: claude auth login');
|
|
145
|
+
}
|
|
146
|
+
throw err;
|
|
147
|
+
}
|
|
148
|
+
if (!output || output === 'NO_CHANGES')
|
|
149
|
+
return { appliedCount: 0, resolvedPaths: [], tokensUsed };
|
|
150
|
+
const fileEdits = new Map();
|
|
151
|
+
const fileCache = new Map();
|
|
152
|
+
for (const { filePath, oldText, newText } of parseResolverEdits(output, conflictedFiles)) {
|
|
153
|
+
const absPath = join(tmpDir, filePath);
|
|
154
|
+
let current = fileEdits.get(filePath) ?? fileCache.get(filePath);
|
|
155
|
+
if (current === undefined) {
|
|
156
|
+
try {
|
|
157
|
+
current = readFileSync(absPath, 'utf8');
|
|
158
|
+
fileCache.set(filePath, current);
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const updated = applyEdit(current, oldText, newText);
|
|
165
|
+
if (updated === null)
|
|
166
|
+
continue;
|
|
167
|
+
fileEdits.set(filePath, updated);
|
|
168
|
+
}
|
|
169
|
+
const { writeFileSync, mkdirSync } = await import('fs');
|
|
170
|
+
const { dirname } = await import('path');
|
|
171
|
+
let appliedCount = 0;
|
|
172
|
+
const resolvedPaths = [];
|
|
173
|
+
for (const [filePath, content] of fileEdits) {
|
|
174
|
+
const absPath = join(tmpDir, filePath);
|
|
175
|
+
try {
|
|
176
|
+
mkdirSync(dirname(absPath), { recursive: true });
|
|
177
|
+
writeFileSync(absPath, content);
|
|
178
|
+
appliedCount++;
|
|
179
|
+
resolvedPaths.push(filePath);
|
|
180
|
+
}
|
|
181
|
+
catch { /* skip unwritable paths */ }
|
|
182
|
+
}
|
|
183
|
+
return { appliedCount, resolvedPaths, tokensUsed };
|
|
184
|
+
}
|
|
185
|
+
// Parses <edit path="…"><old>…</old><new>…</new></edit> blocks from resolver output.
|
|
186
|
+
// Filters out anything that escapes tmpDir (`..`, absolute paths) or targets a file
|
|
187
|
+
// that wasn't in the original unmerged set — the resolver must only touch the files
|
|
188
|
+
// it was asked about, otherwise a buggy or prompt-injected response could land
|
|
189
|
+
// arbitrary content (including unresolved markers) in unrelated tracked files.
|
|
190
|
+
export function parseResolverEdits(output, conflictedFiles) {
|
|
191
|
+
const conflictedSet = new Set(conflictedFiles);
|
|
192
|
+
const edits = [];
|
|
193
|
+
const editRegex = /<edit path="([^"]+)">([\s\S]*?)<\/edit>/g;
|
|
194
|
+
let match;
|
|
195
|
+
while ((match = editRegex.exec(output)) !== null) {
|
|
196
|
+
const [, filePath, body] = match;
|
|
197
|
+
if (filePath.includes('..') || filePath.startsWith('/'))
|
|
198
|
+
continue;
|
|
199
|
+
if (!conflictedSet.has(filePath))
|
|
200
|
+
continue;
|
|
201
|
+
const oldMatch = body.match(/<old>([\s\S]*?)<\/old>/);
|
|
202
|
+
const newMatch = body.match(/<new>([\s\S]*?)<\/new>/);
|
|
203
|
+
if (!oldMatch || !newMatch)
|
|
204
|
+
continue;
|
|
205
|
+
const oldText = oldMatch[1].replace(/^\n/, '').replace(/\n$/, '');
|
|
206
|
+
const newText = newMatch[1].replace(/^\n/, '').replace(/\n$/, '');
|
|
207
|
+
if (oldText === '')
|
|
208
|
+
continue;
|
|
209
|
+
edits.push({ filePath, oldText, newText });
|
|
210
|
+
}
|
|
211
|
+
return edits;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=conflict-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"conflict-resolve.js","sourceRoot":"","sources":["../../src/reviewers/conflict-resolve.ts"],"names":[],"mappings":"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"}
|