ownkey 1.0.0 → 1.0.2
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/LICENSE +21 -21
- package/README.md +256 -81
- package/dist/ai/factory.js +2 -2
- package/dist/ai/factory.js.map +1 -1
- package/dist/ai/gemini.d.ts.map +1 -1
- package/dist/ai/gemini.js +13 -3
- package/dist/ai/gemini.js.map +1 -1
- package/dist/ai/ollama.d.ts +0 -2
- package/dist/ai/ollama.d.ts.map +1 -1
- package/dist/ai/ollama.js +20 -93
- package/dist/ai/ollama.js.map +1 -1
- package/dist/ai/openai.d.ts +4 -1
- package/dist/ai/openai.d.ts.map +1 -1
- package/dist/ai/openai.js +7 -3
- package/dist/ai/openai.js.map +1 -1
- package/dist/ai/provider.d.ts +4 -0
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +80 -47
- package/dist/ai/provider.js.map +1 -1
- package/dist/commands/apply.d.ts.map +1 -1
- package/dist/commands/apply.js +82 -47
- package/dist/commands/apply.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +249 -101
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/suggest.d.ts.map +1 -1
- package/dist/commands/suggest.js +44 -34
- package/dist/commands/suggest.js.map +1 -1
- package/dist/commands/undo.d.ts.map +1 -1
- package/dist/commands/undo.js +35 -25
- package/dist/commands/undo.js.map +1 -1
- package/dist/config/keychain.d.ts.map +1 -1
- package/dist/config/keychain.js +5 -1
- package/dist/config/keychain.js.map +1 -1
- package/dist/config/manager.d.ts +15 -2
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +42 -13
- package/dist/config/manager.js.map +1 -1
- package/dist/core/apply/engine.d.ts +19 -12
- package/dist/core/apply/engine.d.ts.map +1 -1
- package/dist/core/apply/engine.js +160 -149
- package/dist/core/apply/engine.js.map +1 -1
- package/dist/core/apply/index.d.ts +4 -2
- package/dist/core/apply/index.d.ts.map +1 -1
- package/dist/core/apply/index.js.map +1 -1
- package/dist/core/apply/interactive.d.ts +1 -1
- package/dist/core/apply/interactive.d.ts.map +1 -1
- package/dist/core/apply/interactive.js.map +1 -1
- package/dist/core/backup/index.d.ts +2 -1
- package/dist/core/backup/index.d.ts.map +1 -1
- package/dist/core/backup/index.js.map +1 -1
- package/dist/core/backup/manager.d.ts +6 -1
- package/dist/core/backup/manager.d.ts.map +1 -1
- package/dist/core/backup/manager.js +26 -18
- package/dist/core/backup/manager.js.map +1 -1
- package/dist/core/diff/applier.d.ts +23 -8
- package/dist/core/diff/applier.d.ts.map +1 -1
- package/dist/core/diff/applier.js +85 -80
- package/dist/core/diff/applier.js.map +1 -1
- package/dist/core/diff/index.d.ts +6 -3
- package/dist/core/diff/index.d.ts.map +1 -1
- package/dist/core/diff/index.js.map +1 -1
- package/dist/core/diff/parser.d.ts +2 -0
- package/dist/core/diff/parser.d.ts.map +1 -1
- package/dist/core/diff/parser.js +15 -5
- package/dist/core/diff/parser.js.map +1 -1
- package/dist/core/diff/validator.d.ts +3 -8
- package/dist/core/diff/validator.d.ts.map +1 -1
- package/dist/core/diff/validator.js +13 -71
- package/dist/core/diff/validator.js.map +1 -1
- package/dist/db/client.d.ts +9 -1
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +64 -86
- package/dist/db/client.js.map +1 -1
- package/dist/db/migrations/001_init.sql +80 -80
- package/dist/db/migrations/002_applies.sql +33 -32
- package/dist/index.js +13 -20
- package/dist/index.js.map +1 -1
- package/dist/storage/local.d.ts +12 -0
- package/dist/storage/local.d.ts.map +1 -1
- package/dist/storage/local.js +28 -0
- package/dist/storage/local.js.map +1 -1
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/utils/severity.d.ts +6 -0
- package/dist/utils/severity.d.ts.map +1 -0
- package/dist/utils/severity.js +19 -0
- package/dist/utils/severity.js.map +1 -0
- package/package.json +72 -72
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/backup/manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAChF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../../src/core/backup/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,22 +1,37 @@
|
|
|
1
|
-
import { ParsedDiff } from './parser.js';
|
|
1
|
+
import { ParsedDiff, Hunk } from './parser.js';
|
|
2
2
|
export interface ApplyResult {
|
|
3
3
|
success: boolean;
|
|
4
4
|
filePath: string;
|
|
5
5
|
linesChanged: number;
|
|
6
6
|
error?: string;
|
|
7
7
|
}
|
|
8
|
+
export interface ContentResult {
|
|
9
|
+
ok: boolean;
|
|
10
|
+
content: string;
|
|
11
|
+
linesChanged: number;
|
|
12
|
+
errors: string[];
|
|
13
|
+
warnings: string[];
|
|
14
|
+
isNewFile: boolean;
|
|
15
|
+
}
|
|
8
16
|
export declare class DiffApplier {
|
|
9
17
|
/**
|
|
10
|
-
* Apply a
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*
|
|
18
|
+
* Apply a diff to file content in memory.
|
|
19
|
+
*
|
|
20
|
+
* Each hunk is located by matching its context + removed lines against the file,
|
|
21
|
+
* starting at the line the hunk claims and searching outward, so slightly wrong
|
|
22
|
+
* line numbers (common in model output) still apply cleanly. A hunk whose lines
|
|
23
|
+
* do not exist in the file is rejected instead of being written in the wrong place.
|
|
15
24
|
*/
|
|
16
|
-
|
|
25
|
+
static applyToContent(original: string | null, diff: ParsedDiff): ContentResult;
|
|
26
|
+
/** Find where `block` occurs in `lines`, preferring the position closest to `expected`. */
|
|
27
|
+
private static locate;
|
|
17
28
|
/**
|
|
18
|
-
*
|
|
29
|
+
* Apply a parsed diff to a file on disk (creates the file for new-file diffs).
|
|
19
30
|
*/
|
|
31
|
+
static apply(diff: ParsedDiff, targetPath: string): Promise<ApplyResult>;
|
|
32
|
+
/** Dry run: the file's lines after applying, without writing. */
|
|
20
33
|
static dryRun(diff: ParsedDiff, targetPath: string): Promise<string[]>;
|
|
34
|
+
/** Kept for API compatibility. */
|
|
35
|
+
static hunkSize(hunk: Hunk): number;
|
|
21
36
|
}
|
|
22
37
|
//# sourceMappingURL=applier.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applier.d.ts","sourceRoot":"","sources":["../../../src/core/diff/applier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"applier.d.ts","sourceRoot":"","sources":["../../../src/core/diff/applier.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAK/C,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACtB;AAED,qBAAa,WAAW;IACpB;;;;;;;OAOG;IACH,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,UAAU,GAAG,aAAa;IA2C/E,2FAA2F;IAC3F,OAAO,CAAC,MAAM,CAAC,MAAM;IAwBrB;;OAEG;WACU,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAe9E,iEAAiE;WACpD,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAK5E,kCAAkC;IAClC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM;CAGtC"}
|
|
@@ -1,98 +1,103 @@
|
|
|
1
|
-
import { readFile, writeFile } from 'fs/promises';
|
|
2
|
-
import {
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { dirname } from 'path';
|
|
3
4
|
export class DiffApplier {
|
|
4
5
|
/**
|
|
5
|
-
* Apply a
|
|
6
|
+
* Apply a diff to file content in memory.
|
|
7
|
+
*
|
|
8
|
+
* Each hunk is located by matching its context + removed lines against the file,
|
|
9
|
+
* starting at the line the hunk claims and searching outward, so slightly wrong
|
|
10
|
+
* line numbers (common in model output) still apply cleanly. A hunk whose lines
|
|
11
|
+
* do not exist in the file is rejected instead of being written in the wrong place.
|
|
6
12
|
*/
|
|
7
|
-
static
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
static applyToContent(original, diff) {
|
|
14
|
+
const errors = [];
|
|
15
|
+
const warnings = [];
|
|
16
|
+
const isNewFile = original === null;
|
|
17
|
+
if (diff.newPath === '/dev/null') {
|
|
18
|
+
return { ok: false, content: original ?? '', linesChanged: 0, errors: ['File deletion is not supported'], warnings, isNewFile };
|
|
19
|
+
}
|
|
20
|
+
const usesCRLF = original?.includes('\r\n') ?? false;
|
|
21
|
+
const text = (original ?? '').replace(/\r\n/g, '\n');
|
|
22
|
+
const lines = text === '' ? [] : text.split('\n');
|
|
23
|
+
let offset = 0;
|
|
24
|
+
let linesChanged = 0;
|
|
25
|
+
diff.hunks.forEach((hunk, index) => {
|
|
26
|
+
const oldBlock = hunk.changes.filter((c) => c.type !== 'add').map((c) => c.content);
|
|
27
|
+
const newBlock = hunk.changes.filter((c) => c.type !== 'remove').map((c) => c.content);
|
|
28
|
+
const expected = Math.max(0, hunk.oldStart - 1 + offset);
|
|
29
|
+
const at = DiffApplier.locate(lines, oldBlock, expected);
|
|
30
|
+
if (at === -1) {
|
|
31
|
+
errors.push(`Hunk ${index + 1} (around line ${hunk.oldStart}) does not match the current file contents`);
|
|
32
|
+
return;
|
|
18
33
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const lines = fileContent.split('\n');
|
|
22
|
-
// Apply hunks
|
|
23
|
-
let linesChanged = 0;
|
|
24
|
-
let offset = 0; // Track line number shifts
|
|
25
|
-
for (const hunk of diff.hunks) {
|
|
26
|
-
const result = this.applyHunk(hunk, lines, offset);
|
|
27
|
-
linesChanged += result.linesChanged;
|
|
28
|
-
offset += result.offset;
|
|
34
|
+
if (oldBlock.length > 0 && at !== expected) {
|
|
35
|
+
warnings.push(`Hunk ${index + 1} applied at line ${at + 1} (diff said ${hunk.oldStart})`);
|
|
29
36
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
+
lines.splice(at, oldBlock.length, ...newBlock);
|
|
38
|
+
offset += newBlock.length - oldBlock.length;
|
|
39
|
+
linesChanged += hunk.changes.filter((c) => c.type !== 'context').length;
|
|
40
|
+
});
|
|
41
|
+
let content = lines.join('\n');
|
|
42
|
+
if (isNewFile && content !== '' && !content.endsWith('\n'))
|
|
43
|
+
content += '\n';
|
|
44
|
+
if (usesCRLF)
|
|
45
|
+
content = content.replace(/\n/g, '\r\n');
|
|
46
|
+
return { ok: errors.length === 0, content, linesChanged, errors, warnings, isNewFile };
|
|
47
|
+
}
|
|
48
|
+
/** Find where `block` occurs in `lines`, preferring the position closest to `expected`. */
|
|
49
|
+
static locate(lines, block, expected) {
|
|
50
|
+
if (block.length === 0) {
|
|
51
|
+
return Math.min(expected, lines.length);
|
|
37
52
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
53
|
+
const matchesAt = (i, loose) => {
|
|
54
|
+
for (let k = 0; k < block.length; k++) {
|
|
55
|
+
const a = lines[i + k];
|
|
56
|
+
const b = block[k];
|
|
57
|
+
if (a === undefined)
|
|
58
|
+
return false;
|
|
59
|
+
if (loose ? a.trim() !== b.trim() : a !== b)
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
return true;
|
|
63
|
+
};
|
|
64
|
+
const last = lines.length - block.length;
|
|
65
|
+
for (const loose of [false, true]) {
|
|
66
|
+
for (let d = 0; d <= Math.max(expected, last - expected); d++) {
|
|
67
|
+
for (const i of d === 0 ? [expected] : [expected - d, expected + d]) {
|
|
68
|
+
if (i >= 0 && i <= last && matchesAt(i, loose))
|
|
69
|
+
return i;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
45
72
|
}
|
|
73
|
+
return -1;
|
|
46
74
|
}
|
|
47
75
|
/**
|
|
48
|
-
* Apply a
|
|
76
|
+
* Apply a parsed diff to a file on disk (creates the file for new-file diffs).
|
|
49
77
|
*/
|
|
50
|
-
static
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const toAdd = [];
|
|
57
|
-
for (const change of hunk.changes) {
|
|
58
|
-
if (change.type === 'remove') {
|
|
59
|
-
toRemove.push(fileLineIndex);
|
|
60
|
-
fileLineIndex++;
|
|
61
|
-
linesChanged++;
|
|
62
|
-
}
|
|
63
|
-
else if (change.type === 'add') {
|
|
64
|
-
toAdd.push({ index: fileLineIndex, content: change.content });
|
|
65
|
-
fileLineIndex++;
|
|
66
|
-
currentOffset++;
|
|
67
|
-
linesChanged++;
|
|
68
|
-
}
|
|
69
|
-
else if (change.type === 'context') {
|
|
70
|
-
fileLineIndex++;
|
|
78
|
+
static async apply(diff, targetPath) {
|
|
79
|
+
try {
|
|
80
|
+
const original = existsSync(targetPath) ? await readFile(targetPath, 'utf-8') : null;
|
|
81
|
+
const result = DiffApplier.applyToContent(original, diff);
|
|
82
|
+
if (!result.ok) {
|
|
83
|
+
return { success: false, filePath: targetPath, linesChanged: 0, error: result.errors.join('; ') };
|
|
71
84
|
}
|
|
85
|
+
await mkdir(dirname(targetPath), { recursive: true });
|
|
86
|
+
await writeFile(targetPath, result.content, 'utf-8');
|
|
87
|
+
return { success: true, filePath: targetPath, linesChanged: result.linesChanged };
|
|
72
88
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
lines.splice(toRemove[i], 1);
|
|
76
|
-
currentOffset--;
|
|
77
|
-
}
|
|
78
|
-
// Apply additions
|
|
79
|
-
for (const add of toAdd) {
|
|
80
|
-
lines.splice(add.index, 0, add.content);
|
|
89
|
+
catch (error) {
|
|
90
|
+
return { success: false, filePath: targetPath, linesChanged: 0, error: error.message };
|
|
81
91
|
}
|
|
82
|
-
return { linesChanged, offset: currentOffset - offset };
|
|
83
92
|
}
|
|
84
|
-
/**
|
|
85
|
-
* Dry run - show what would change without actually applying
|
|
86
|
-
*/
|
|
93
|
+
/** Dry run: the file's lines after applying, without writing. */
|
|
87
94
|
static async dryRun(diff, targetPath) {
|
|
88
|
-
const
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
return lines;
|
|
95
|
+
const original = existsSync(targetPath) ? await readFile(targetPath, 'utf-8') : null;
|
|
96
|
+
return DiffApplier.applyToContent(original, diff).content.split('\n');
|
|
97
|
+
}
|
|
98
|
+
/** Kept for API compatibility. */
|
|
99
|
+
static hunkSize(hunk) {
|
|
100
|
+
return hunk.changes.length;
|
|
96
101
|
}
|
|
97
102
|
}
|
|
98
103
|
//# sourceMappingURL=applier.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"applier.js","sourceRoot":"","sources":["../../../src/core/diff/applier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"applier.js","sourceRoot":"","sources":["../../../src/core/diff/applier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAkB/B,MAAM,OAAO,WAAW;IACpB;;;;;;;OAOG;IACH,MAAM,CAAC,cAAc,CAAC,QAAuB,EAAE,IAAgB;QAC3D,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,QAAQ,KAAK,IAAI,CAAC;QAEpC,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YAC/B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,gCAAgC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QACpI,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC;QACrD,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,YAAY,GAAG,CAAC,CAAC;QAErB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACpF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YACvF,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;YAEzD,MAAM,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACzD,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;gBACZ,MAAM,CAAC,IAAI,CACP,QAAQ,KAAK,GAAG,CAAC,iBAAiB,IAAI,CAAC,QAAQ,4CAA4C,CAC9F,CAAC;gBACF,OAAO;YACX,CAAC;YACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;gBACzC,QAAQ,CAAC,IAAI,CAAC,QAAQ,KAAK,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,eAAe,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC9F,CAAC;YAED,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC;YAC/C,MAAM,IAAI,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;YAC5C,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAC5E,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,SAAS,IAAI,OAAO,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,IAAI,CAAC;QAC5E,IAAI,QAAQ;YAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAEvD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC3F,CAAC;IAED,2FAA2F;IACnF,MAAM,CAAC,MAAM,CAAC,KAAe,EAAE,KAAe,EAAE,QAAgB;QACpE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,CAAS,EAAE,KAAc,EAAW,EAAE;YACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACpC,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACnB,IAAI,CAAC,KAAK,SAAS;oBAAE,OAAO,KAAK,CAAC;gBAClC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;oBAAE,OAAO,KAAK,CAAC;YAC9D,CAAC;YACD,OAAO,IAAI,CAAC;QAChB,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC5D,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;oBAClE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC;wBAAE,OAAO,CAAC,CAAC;gBAC7D,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;IACd,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAgB,EAAE,UAAkB;QACnD,IAAI,CAAC;YACD,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrF,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC1D,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtG,CAAC;YACD,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,MAAM,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACrD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;QACtF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC;QACtG,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAgB,EAAE,UAAkB;QACpD,MAAM,QAAQ,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrF,OAAO,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED,kCAAkC;IAClC,MAAM,CAAC,QAAQ,CAAC,IAAU;QACtB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;CACJ"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
export { DiffParser
|
|
2
|
-
export {
|
|
3
|
-
export {
|
|
1
|
+
export { DiffParser } from './parser.js';
|
|
2
|
+
export type { ParsedDiff, Hunk, Change } from './parser.js';
|
|
3
|
+
export { DiffValidator } from './validator.js';
|
|
4
|
+
export type { ValidationResult } from './validator.js';
|
|
5
|
+
export { DiffApplier } from './applier.js';
|
|
6
|
+
export type { ApplyResult, ContentResult } from './applier.js';
|
|
4
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/diff/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/diff/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/diff/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/diff/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -24,6 +24,8 @@ export declare class DiffParser {
|
|
|
24
24
|
* Parse unified diff format into structured data
|
|
25
25
|
*/
|
|
26
26
|
static parse(diffText: string): ParsedDiff[];
|
|
27
|
+
/** Strip tab-separated timestamps and surrounding quotes from a ---/+++ path. */
|
|
28
|
+
static cleanPath(raw: string): string;
|
|
27
29
|
/**
|
|
28
30
|
* Generate unified diff format from structured data
|
|
29
31
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/core/diff/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,IAAI;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,UAAU;IACnB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/core/diff/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,UAAU;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,IAAI;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,MAAM;IACnB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,UAAU;IACnB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE;IA8F5C,iFAAiF;IACjF,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIrC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;CAiB5C"}
|
package/dist/core/diff/parser.js
CHANGED
|
@@ -7,7 +7,8 @@ export class DiffParser {
|
|
|
7
7
|
*/
|
|
8
8
|
static parse(diffText) {
|
|
9
9
|
const diffs = [];
|
|
10
|
-
|
|
10
|
+
// Normalise line endings and drop trailing blank lines (they are not context)
|
|
11
|
+
const lines = diffText.replace(/\r\n/g, '\n').replace(/\n+$/, '').split('\n');
|
|
11
12
|
let currentDiff = null;
|
|
12
13
|
let currentHunk = null;
|
|
13
14
|
let lineNumber = 0;
|
|
@@ -21,7 +22,7 @@ export class DiffParser {
|
|
|
21
22
|
if (currentDiff) {
|
|
22
23
|
diffs.push(currentDiff);
|
|
23
24
|
}
|
|
24
|
-
const oldPath = line.substring(4).replace(/^a\//, '');
|
|
25
|
+
const oldPath = DiffParser.cleanPath(line.substring(4)).replace(/^a\//, '');
|
|
25
26
|
currentDiff = {
|
|
26
27
|
filePath: oldPath,
|
|
27
28
|
oldPath,
|
|
@@ -31,9 +32,12 @@ export class DiffParser {
|
|
|
31
32
|
}
|
|
32
33
|
// File header: +++ b/path/to/file.ts
|
|
33
34
|
else if (line.startsWith('+++ ') && currentDiff) {
|
|
34
|
-
const newPath = line.substring(4).replace(/^b\//, '');
|
|
35
|
+
const newPath = DiffParser.cleanPath(line.substring(4)).replace(/^b\//, '');
|
|
35
36
|
currentDiff.newPath = newPath;
|
|
36
|
-
|
|
37
|
+
// A deletion diff ends in /dev/null: keep the real path
|
|
38
|
+
if (newPath !== '/dev/null') {
|
|
39
|
+
currentDiff.filePath = newPath;
|
|
40
|
+
}
|
|
37
41
|
}
|
|
38
42
|
// Hunk header: @@ -10,5 +10,6 @@
|
|
39
43
|
else if (line.startsWith('@@')) {
|
|
@@ -69,7 +73,8 @@ export class DiffParser {
|
|
|
69
73
|
});
|
|
70
74
|
lineNumber++;
|
|
71
75
|
}
|
|
72
|
-
else if (line.startsWith(' ')) {
|
|
76
|
+
else if (line.startsWith(' ') || line === '') {
|
|
77
|
+
// Models often strip the leading space from blank context lines
|
|
73
78
|
currentHunk.changes.push({
|
|
74
79
|
type: 'context',
|
|
75
80
|
content: line.substring(1),
|
|
@@ -77,6 +82,7 @@ export class DiffParser {
|
|
|
77
82
|
});
|
|
78
83
|
lineNumber++;
|
|
79
84
|
}
|
|
85
|
+
// '\' and other noise are ignored
|
|
80
86
|
}
|
|
81
87
|
}
|
|
82
88
|
// Push last hunk and diff
|
|
@@ -88,6 +94,10 @@ export class DiffParser {
|
|
|
88
94
|
}
|
|
89
95
|
return diffs;
|
|
90
96
|
}
|
|
97
|
+
/** Strip tab-separated timestamps and surrounding quotes from a ---/+++ path. */
|
|
98
|
+
static cleanPath(raw) {
|
|
99
|
+
return raw.split('\t')[0].trim().replace(/^"(.*)"$/, '$1');
|
|
100
|
+
}
|
|
91
101
|
/**
|
|
92
102
|
* Generate unified diff format from structured data
|
|
93
103
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/core/diff/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH,MAAM,OAAO,UAAU;IACnB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,QAAgB;QACzB,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/core/diff/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH,MAAM,OAAO,UAAU;IACnB;;OAEG;IACH,MAAM,CAAC,KAAK,CAAC,QAAgB;QACzB,MAAM,KAAK,GAAiB,EAAE,CAAC;QAC/B,8EAA8E;QAC9E,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9E,IAAI,WAAW,GAAsB,IAAI,CAAC;QAC1C,IAAI,WAAW,GAAgB,IAAI,CAAC;QACpC,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAEtB,qCAAqC;YACrC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;oBAC7B,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxC,CAAC;gBACD,IAAI,WAAW,EAAE,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAC5B,CAAC;gBAED,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC5E,WAAW,GAAG;oBACV,QAAQ,EAAE,OAAO;oBACjB,OAAO;oBACP,KAAK,EAAE,EAAE;iBACZ,CAAC;gBACF,WAAW,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,qCAAqC;iBAChC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;gBAC9C,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC5E,WAAW,CAAC,OAAO,GAAG,OAAO,CAAC;gBAC9B,wDAAwD;gBACxD,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;oBAC1B,WAAW,CAAC,QAAQ,GAAG,OAAO,CAAC;gBACnC,CAAC;YACL,CAAC;YACD,iCAAiC;iBAC5B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;oBAC7B,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACxC,CAAC;gBAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;gBAC/D,IAAI,KAAK,EAAE,CAAC;oBACR,WAAW,GAAG;wBACV,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;wBAChC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/C,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;wBAChC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;wBAC/C,OAAO,EAAE,EAAE;qBACd,CAAC;oBACF,UAAU,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;YACD,eAAe;iBACV,IAAI,WAAW,EAAE,CAAC;gBACnB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBACvB,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,KAAK;wBACX,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;wBAC1B,UAAU,EAAE,UAAU;qBACzB,CAAC,CAAC;gBACP,CAAC;qBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9B,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,QAAQ;wBACd,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;wBAC1B,UAAU,EAAE,UAAU;qBACzB,CAAC,CAAC;oBACH,UAAU,EAAE,CAAC;gBACjB,CAAC;qBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;oBAC7C,gEAAgE;oBAChE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,SAAS;wBACf,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;wBAC1B,UAAU,EAAE,UAAU;qBACzB,CAAC,CAAC;oBACH,UAAU,EAAE,CAAC;gBACjB,CAAC;gBACD,6DAA6D;YACjE,CAAC;QACL,CAAC;QAED,0BAA0B;QAC1B,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;YAC7B,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,WAAW,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5B,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,iFAAiF;IACjF,MAAM,CAAC,SAAS,CAAC,GAAW;QACxB,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAgB;QAC5B,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,MAAM,IAAI,SAAS,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC;QACrD,MAAM,IAAI,SAAS,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC;QAErD,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC5B,MAAM,IAAI,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,OAAO,CAAC;YAE1F,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;gBAClF,MAAM,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC;YAC7C,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
|
|
@@ -6,16 +6,11 @@ export interface ValidationResult {
|
|
|
6
6
|
}
|
|
7
7
|
export declare class DiffValidator {
|
|
8
8
|
/**
|
|
9
|
-
* Validate a parsed diff
|
|
9
|
+
* Validate a parsed diff against the file it targets (a missing file is only
|
|
10
|
+
* valid when the diff creates it).
|
|
10
11
|
*/
|
|
11
12
|
static validate(diff: ParsedDiff, targetPath: string): Promise<ValidationResult>;
|
|
12
|
-
/**
|
|
13
|
-
* Validate a single hunk against file content
|
|
14
|
-
*/
|
|
15
|
-
private static validateHunk;
|
|
16
|
-
/**
|
|
17
|
-
* Check if diff can be applied cleanly (no conflicts)
|
|
18
|
-
*/
|
|
13
|
+
/** Check if a diff applies to the given content. */
|
|
19
14
|
static canApplyCleanly(diff: ParsedDiff, fileContent: string): boolean;
|
|
20
15
|
}
|
|
21
16
|
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/core/diff/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/core/diff/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAKzC,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,qBAAa,aAAa;IACtB;;;OAGG;WACU,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IActF,oDAAoD;IACpD,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;CAGzE"}
|
|
@@ -1,86 +1,28 @@
|
|
|
1
1
|
import { readFile } from 'fs/promises';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import { DiffApplier } from './applier.js';
|
|
2
4
|
export class DiffValidator {
|
|
3
5
|
/**
|
|
4
|
-
* Validate a parsed diff
|
|
6
|
+
* Validate a parsed diff against the file it targets (a missing file is only
|
|
7
|
+
* valid when the diff creates it).
|
|
5
8
|
*/
|
|
6
9
|
static async validate(diff, targetPath) {
|
|
7
|
-
const errors = [];
|
|
8
|
-
const warnings = [];
|
|
9
10
|
try {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
// Validate each hunk
|
|
14
|
-
for (const hunk of diff.hunks) {
|
|
15
|
-
const hunkValidation = this.validateHunk(hunk, lines);
|
|
16
|
-
errors.push(...hunkValidation.errors);
|
|
17
|
-
warnings.push(...hunkValidation.warnings);
|
|
11
|
+
const exists = existsSync(targetPath);
|
|
12
|
+
if (!exists && diff.oldPath !== '/dev/null' && diff.hunks.some((h) => h.oldLines > 0)) {
|
|
13
|
+
return { valid: false, errors: [`File not found: ${targetPath}`], warnings: [] };
|
|
18
14
|
}
|
|
15
|
+
const original = exists ? await readFile(targetPath, 'utf-8') : null;
|
|
16
|
+
const result = DiffApplier.applyToContent(original, diff);
|
|
17
|
+
return { valid: result.ok, errors: result.errors, warnings: result.warnings };
|
|
19
18
|
}
|
|
20
19
|
catch (error) {
|
|
21
|
-
|
|
22
|
-
errors.push(`File not found: ${targetPath}`);
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
errors.push(`Failed to read file: ${error.message}`);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return {
|
|
29
|
-
valid: errors.length === 0,
|
|
30
|
-
errors,
|
|
31
|
-
warnings,
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Validate a single hunk against file content
|
|
36
|
-
*/
|
|
37
|
-
static validateHunk(hunk, fileLines) {
|
|
38
|
-
const errors = [];
|
|
39
|
-
const warnings = [];
|
|
40
|
-
// Check if hunk is within file bounds
|
|
41
|
-
if (hunk.oldStart < 1 || hunk.oldStart > fileLines.length + 1) {
|
|
42
|
-
errors.push(`Hunk starts at line ${hunk.oldStart}, but file only has ${fileLines.length} lines`);
|
|
43
|
-
return { valid: false, errors, warnings };
|
|
20
|
+
return { valid: false, errors: [`Failed to read file: ${error.message}`], warnings: [] };
|
|
44
21
|
}
|
|
45
|
-
// Validate context lines match
|
|
46
|
-
let fileLineIndex = hunk.oldStart - 1;
|
|
47
|
-
for (const change of hunk.changes) {
|
|
48
|
-
if (change.type === 'context' || change.type === 'remove') {
|
|
49
|
-
if (fileLineIndex >= fileLines.length) {
|
|
50
|
-
errors.push(`Context line ${fileLineIndex + 1} is beyond end of file`);
|
|
51
|
-
break;
|
|
52
|
-
}
|
|
53
|
-
const fileLine = fileLines[fileLineIndex];
|
|
54
|
-
if (fileLine !== change.content) {
|
|
55
|
-
warnings.push(`Line ${fileLineIndex + 1} doesn't match context:\n` +
|
|
56
|
-
` Expected: "${change.content}"\n` +
|
|
57
|
-
` Found: "${fileLine}"`);
|
|
58
|
-
}
|
|
59
|
-
fileLineIndex++;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
return { valid: errors.length === 0, errors, warnings };
|
|
63
22
|
}
|
|
64
|
-
/**
|
|
65
|
-
* Check if diff can be applied cleanly (no conflicts)
|
|
66
|
-
*/
|
|
23
|
+
/** Check if a diff applies to the given content. */
|
|
67
24
|
static canApplyCleanly(diff, fileContent) {
|
|
68
|
-
|
|
69
|
-
for (const hunk of diff.hunks) {
|
|
70
|
-
let fileLineIndex = hunk.oldStart - 1;
|
|
71
|
-
for (const change of hunk.changes) {
|
|
72
|
-
if (change.type === 'context' || change.type === 'remove') {
|
|
73
|
-
if (fileLineIndex >= lines.length) {
|
|
74
|
-
return false;
|
|
75
|
-
}
|
|
76
|
-
if (lines[fileLineIndex] !== change.content) {
|
|
77
|
-
return false;
|
|
78
|
-
}
|
|
79
|
-
fileLineIndex++;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
return true;
|
|
25
|
+
return DiffApplier.applyToContent(fileContent, diff).ok;
|
|
84
26
|
}
|
|
85
27
|
}
|
|
86
28
|
//# sourceMappingURL=validator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/core/diff/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../../src/core/diff/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAQ3C,MAAM,OAAO,aAAa;IACtB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAgB,EAAE,UAAkB;QACtD,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,KAAK,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC;gBACpF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,mBAAmB,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;YACrF,CAAC;YACD,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACrE,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,wBAAyB,KAAe,CAAC,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACxG,CAAC;IACL,CAAC;IAED,oDAAoD;IACpD,MAAM,CAAC,eAAe,CAAC,IAAgB,EAAE,WAAmB;QACxD,OAAO,WAAW,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;IAC5D,CAAC;CACJ"}
|
package/dist/db/client.d.ts
CHANGED
|
@@ -11,8 +11,16 @@ export declare class DatabaseClient {
|
|
|
11
11
|
isConnected(): boolean;
|
|
12
12
|
isLocalOnlyMode(): boolean;
|
|
13
13
|
getClient(): ReturnType<typeof postgres> | null;
|
|
14
|
+
/**
|
|
15
|
+
* Apply every migrations/NNN_name.sql that has not been recorded in schema_migrations.
|
|
16
|
+
* Each migration runs in its own transaction together with its version record.
|
|
17
|
+
*/
|
|
14
18
|
private runMigrations;
|
|
15
|
-
|
|
19
|
+
static listMigrations(): Promise<{
|
|
20
|
+
version: number;
|
|
21
|
+
file: string;
|
|
22
|
+
path: string;
|
|
23
|
+
}[]>;
|
|
16
24
|
}
|
|
17
25
|
export declare const dbClient: DatabaseClient;
|
|
18
26
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/db/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAYlD,qBAAa,cAAc;IACvB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,EAAE,CAA2C;IACrD,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,eAAe,CAAkB;IAEnC,OAAO,CAAC,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAYlD,qBAAa,cAAc;IACvB,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,EAAE,CAA2C;IACrD,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,eAAe,CAAkB;IAEnC,OAAO,CAAC,SAAS,GAAE,OAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAyDlD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAiBjC,KAAK,IAAI,UAAU,CAAC,OAAO,OAAO,CAAC;IAUnC,WAAW,IAAI,OAAO;IAItB,eAAe,IAAI,OAAO;IAI1B,SAAS,IAAI,UAAU,CAAC,OAAO,QAAQ,CAAC,GAAG,IAAI;IAI/C;;;OAGG;YACW,aAAa;WAoCd,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAS5F;AAED,eAAO,MAAM,QAAQ,gBAAuB,CAAC"}
|