@heyhuynhgiabuu/pi-diff 0.7.5 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -9
- package/dist/core/apply-patch.d.ts +1 -1
- package/dist/core/apply-patch.d.ts.map +1 -1
- package/dist/core/apply-patch.js +148 -102
- package/dist/core/apply-patch.js.map +1 -1
- package/dist/core/config.d.ts +4 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +15 -5
- package/dist/core/config.js.map +1 -1
- package/dist/core/diff.d.ts +0 -4
- package/dist/core/diff.d.ts.map +1 -1
- package/dist/core/diff.js +67 -47
- package/dist/core/diff.js.map +1 -1
- package/dist/core/replace.d.ts +11 -2
- package/dist/core/replace.d.ts.map +1 -1
- package/dist/core/replace.js +108 -2
- package/dist/core/replace.js.map +1 -1
- package/dist/hashline.d.ts +2 -3
- package/dist/hashline.d.ts.map +1 -1
- package/dist/hashline.js +2 -3
- package/dist/hashline.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +81 -203
- package/dist/index.js.map +1 -1
- package/package.json +9 -4
- package/dist/edit-guard.d.ts +0 -2
- package/dist/edit-guard.d.ts.map +0 -1
- package/dist/edit-guard.js +0 -34
- package/dist/edit-guard.js.map +0 -1
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@ A [pi](https://pi.dev) extension that replaces the default `write` and `edit` to
|
|
|
26
26
|
- **LRU cache** — singleton Shiki highlighter with 192-entry cache for fast re-renders
|
|
27
27
|
- **Large diff fallback** — gracefully degrades (skips highlighting, still shows diff structure) for files > 80k chars
|
|
28
28
|
- **Fully customizable** — every color and threshold is overridable via environment variables
|
|
29
|
-
- **
|
|
29
|
+
- **Strict edit safety** — delegates matching, uniqueness, overlap checks, mutation queues, aborts, BOM, and EOL preservation to Pi's SDK edit tool
|
|
30
30
|
|
|
31
31
|
## Install
|
|
32
32
|
|
|
@@ -51,7 +51,7 @@ pi-diff wraps the built-in `write` and `edit` tools from the pi SDK, including s
|
|
|
51
51
|
3. **After the write** — computes a structured diff between old and new content
|
|
52
52
|
4. **Renders** the diff with syntax highlighting and word-level emphasis
|
|
53
53
|
|
|
54
|
-
For `edit` calls,
|
|
54
|
+
For `edit` calls, Pi's SDK performs matching, uniqueness and overlap validation, mutation queueing, and the file write. pi-diff adapts the SDK's returned unified patch into its syntax-highlighted renderer, so the preview reflects the actual matched source rather than the requested text.
|
|
55
55
|
|
|
56
56
|
The rendering pipeline:
|
|
57
57
|
|
|
@@ -80,6 +80,18 @@ Both views show:
|
|
|
80
80
|
|
|
81
81
|
## Configuration
|
|
82
82
|
|
|
83
|
+
### Disable pi-diff tools
|
|
84
|
+
|
|
85
|
+
Add `disabledTools` to `pi-diff.json` to omit pi-diff tools. Disabling `write` or `edit` leaves Pi's built-in tool available; disabling `apply_patch` removes that custom tool.
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"disabledTools": ["apply_patch"]
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
See [CONFIG.md](CONFIG.md) for the full `pi-diff.json` reference.
|
|
94
|
+
|
|
83
95
|
### Diff Theme Presets
|
|
84
96
|
|
|
85
97
|
pi-diff ships with built-in theme presets optimized for different terminal backgrounds. Add to your `.pi/settings.json`:
|
|
@@ -199,13 +211,11 @@ export DIFF_SPLIT_MIN_WIDTH=120
|
|
|
199
211
|
```
|
|
200
212
|
src/
|
|
201
213
|
├── index.ts # Extension entry point — wraps write/edit tools with diff rendering
|
|
202
|
-
├── edit-guard.ts # tool_call handler that blocks stale oldText in edit calls
|
|
203
|
-
├── edit-guard.test.ts # Unit tests for the edit guard
|
|
204
214
|
├── core/ # Pure data layer: diff parsing, conflict detection, line resolution
|
|
205
215
|
│ ├── config.ts
|
|
206
216
|
│ ├── conflicts.ts
|
|
207
217
|
│ ├── diff.ts # parseDiff, parsePatchFiles, resolveSepStyle
|
|
208
|
-
│ ├── replace.ts #
|
|
218
|
+
│ ├── replace.ts # conservative apply_patch matcher and legacy helpers
|
|
209
219
|
│ ├── resolve-lines.ts
|
|
210
220
|
│ └── *.test.ts
|
|
211
221
|
└── review/ # Shared diff-rendering primitives used by the main extension
|
|
@@ -275,8 +285,6 @@ pi install .
|
|
|
275
285
|
pi-diff is a **pi extension** — a TypeScript file that exports a default function receiving the pi API:
|
|
276
286
|
|
|
277
287
|
```typescript
|
|
278
|
-
import { registerEditGuard } from "./edit-guard.js";
|
|
279
|
-
|
|
280
288
|
export default function piDiffExtension(pi: ExtensionAPI): void {
|
|
281
289
|
// Wrap the built-in write/edit tools with diff rendering
|
|
282
290
|
const origWrite = createWriteTool(cwd);
|
|
@@ -290,8 +298,6 @@ export default function piDiffExtension(pi: ExtensionAPI): void {
|
|
|
290
298
|
renderResult: (...) => { /* render diff */ },
|
|
291
299
|
});
|
|
292
300
|
|
|
293
|
-
// Block stale-oldText edit calls before they run
|
|
294
|
-
registerEditGuard(pi);
|
|
295
301
|
}
|
|
296
302
|
```
|
|
297
303
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* apply_patch — Multi-file patch engine.
|
|
3
3
|
*
|
|
4
4
|
* One call can add, update, delete, or move multiple files.
|
|
5
|
-
* Uses replace.ts
|
|
5
|
+
* Uses replace.ts's conservative matcher for oldText → newText matching.
|
|
6
6
|
*/
|
|
7
7
|
export interface ApplyPatchChange {
|
|
8
8
|
/** Absolute path to the file. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-patch.d.ts","sourceRoot":"","sources":["../../src/core/apply-patch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,gBAAgB;IAChC,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC7C,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"apply-patch.d.ts","sourceRoot":"","sources":["../../src/core/apply-patch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,MAAM,WAAW,gBAAgB;IAChC,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC7C,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gDAAgD;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACnC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACd;AA8KD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,gBAAgB,CAAC,CA2D9F;AAMD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAgCvE"}
|
package/dist/core/apply-patch.js
CHANGED
|
@@ -2,106 +2,133 @@
|
|
|
2
2
|
* apply_patch — Multi-file patch engine.
|
|
3
3
|
*
|
|
4
4
|
* One call can add, update, delete, or move multiple files.
|
|
5
|
-
* Uses replace.ts
|
|
5
|
+
* Uses replace.ts's conservative matcher for oldText → newText matching.
|
|
6
6
|
*/
|
|
7
7
|
import * as fs from "node:fs";
|
|
8
8
|
import * as path from "node:path";
|
|
9
|
-
import {
|
|
9
|
+
import { replaceForPatch } from "./replace.js";
|
|
10
10
|
// ---------------------------------------------------------------------------
|
|
11
11
|
// Atomic file write
|
|
12
12
|
// ---------------------------------------------------------------------------
|
|
13
|
-
async function atomicWriteFile(filePath, content) {
|
|
13
|
+
async function atomicWriteFile(filePath, content, mode) {
|
|
14
14
|
const dir = path.dirname(filePath);
|
|
15
15
|
const tmp = path.join(dir, `.${path.basename(filePath)}.pi-apply-patch.${process.pid}.tmp`);
|
|
16
|
-
await fs.promises.writeFile(tmp, content, "utf8");
|
|
16
|
+
await fs.promises.writeFile(tmp, content, { encoding: "utf8", mode });
|
|
17
17
|
await fs.promises.rename(tmp, filePath);
|
|
18
18
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const content = change.content ?? "";
|
|
24
|
-
// Ensure trailing newline
|
|
25
|
-
const final = content.endsWith("\n") ? content : `${content}\n`;
|
|
26
|
-
// Create parent directories
|
|
27
|
-
const dir = path.dirname(change.path);
|
|
28
|
-
await fs.promises.mkdir(dir, { recursive: true });
|
|
29
|
-
await atomicWriteFile(change.path, final);
|
|
30
|
-
return {
|
|
31
|
-
path: change.path,
|
|
32
|
-
action: "add",
|
|
33
|
-
bytes: Buffer.byteLength(final, "utf8"),
|
|
34
|
-
newContent: final,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
async function handleUpdate(change) {
|
|
38
|
-
if (!change.oldText) {
|
|
39
|
-
throw new Error(`update requires oldText`);
|
|
19
|
+
async function readRegularFile(filePath, label) {
|
|
20
|
+
let stats;
|
|
21
|
+
try {
|
|
22
|
+
stats = await fs.promises.lstat(filePath);
|
|
40
23
|
}
|
|
41
|
-
|
|
42
|
-
throw new Error(
|
|
24
|
+
catch {
|
|
25
|
+
throw new Error(`${label} not found: ${filePath}`);
|
|
43
26
|
}
|
|
44
|
-
|
|
45
|
-
|
|
27
|
+
if (stats.isSymbolicLink())
|
|
28
|
+
throw new Error(`${label} must not be a symbolic link: ${filePath}`);
|
|
29
|
+
if (!stats.isFile())
|
|
30
|
+
throw new Error(`${label} must be a regular file: ${filePath}`);
|
|
31
|
+
return { content: await fs.promises.readFile(filePath, "utf8"), mode: stats.mode };
|
|
32
|
+
}
|
|
33
|
+
async function pathExists(filePath) {
|
|
46
34
|
try {
|
|
47
|
-
|
|
35
|
+
await fs.promises.lstat(filePath);
|
|
36
|
+
return true;
|
|
48
37
|
}
|
|
49
|
-
catch
|
|
50
|
-
|
|
51
|
-
throw new Error(`cannot read ${change.path}: ${msg}`);
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
52
40
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (
|
|
41
|
+
}
|
|
42
|
+
async function prepareAdd(change) {
|
|
43
|
+
if (await pathExists(change.path))
|
|
44
|
+
throw new Error(`add target already exists: ${change.path}`);
|
|
45
|
+
const content = change.content ?? "";
|
|
46
|
+
const final = content.endsWith("\n") ? content : `${content}\n`;
|
|
47
|
+
return {
|
|
48
|
+
change,
|
|
49
|
+
applied: { path: change.path, action: "add", bytes: Buffer.byteLength(final, "utf8"), newContent: final },
|
|
50
|
+
async commit() {
|
|
51
|
+
await fs.promises.mkdir(path.dirname(change.path), { recursive: true });
|
|
52
|
+
await atomicWriteFile(change.path, final);
|
|
53
|
+
},
|
|
54
|
+
async rollback() {
|
|
55
|
+
await fs.promises.unlink(change.path);
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
async function prepareUpdate(change) {
|
|
60
|
+
if (!change.oldText)
|
|
61
|
+
throw new Error("update requires oldText");
|
|
62
|
+
if (change.oldText === change.newText)
|
|
63
|
+
throw new Error("oldText and newText are identical — no change");
|
|
64
|
+
const original = await readRegularFile(change.path, "update target");
|
|
65
|
+
const result = replaceForPatch(original.content, change.oldText, change.newText ?? "");
|
|
66
|
+
if (!result.changed)
|
|
56
67
|
throw new Error(`oldText not found in ${change.path}`);
|
|
57
|
-
}
|
|
58
68
|
const newContent = result.content;
|
|
59
|
-
// Generate simple diff
|
|
60
|
-
const diff = generateDiff(change.path, content, newContent);
|
|
61
|
-
// Write atomically
|
|
62
|
-
await atomicWriteFile(change.path, newContent);
|
|
63
69
|
return {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
+
change,
|
|
71
|
+
applied: {
|
|
72
|
+
path: change.path,
|
|
73
|
+
action: "update",
|
|
74
|
+
diff: generateDiff(change.path, original.content, newContent),
|
|
75
|
+
bytes: Buffer.byteLength(newContent, "utf8"),
|
|
76
|
+
oldContent: original.content,
|
|
77
|
+
newContent,
|
|
78
|
+
},
|
|
79
|
+
async commit() {
|
|
80
|
+
await atomicWriteFile(change.path, newContent, original.mode);
|
|
81
|
+
},
|
|
82
|
+
async rollback() {
|
|
83
|
+
await atomicWriteFile(change.path, original.content, original.mode);
|
|
84
|
+
},
|
|
70
85
|
};
|
|
71
86
|
}
|
|
72
|
-
async function
|
|
73
|
-
|
|
74
|
-
try {
|
|
75
|
-
await fs.promises.access(change.path);
|
|
76
|
-
}
|
|
77
|
-
catch {
|
|
78
|
-
throw new Error(`file not found: ${change.path}`);
|
|
79
|
-
}
|
|
80
|
-
const oldContent = await fs.promises.readFile(change.path, "utf8");
|
|
81
|
-
await fs.promises.unlink(change.path);
|
|
87
|
+
async function prepareDelete(change) {
|
|
88
|
+
const original = await readRegularFile(change.path, "delete target");
|
|
82
89
|
return {
|
|
83
|
-
|
|
84
|
-
action: "delete",
|
|
85
|
-
|
|
90
|
+
change,
|
|
91
|
+
applied: { path: change.path, action: "delete", oldContent: original.content },
|
|
92
|
+
async commit() {
|
|
93
|
+
await fs.promises.unlink(change.path);
|
|
94
|
+
},
|
|
95
|
+
async rollback() {
|
|
96
|
+
await atomicWriteFile(change.path, original.content, original.mode);
|
|
97
|
+
},
|
|
86
98
|
};
|
|
87
99
|
}
|
|
88
|
-
async function
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
100
|
+
async function prepareMove(change) {
|
|
101
|
+
const movePath = change.movePath;
|
|
102
|
+
if (!movePath)
|
|
103
|
+
throw new Error("move requires movePath");
|
|
104
|
+
await readRegularFile(change.path, "move source");
|
|
105
|
+
if (await pathExists(movePath))
|
|
106
|
+
throw new Error(`move destination already exists: ${movePath}`);
|
|
107
|
+
return {
|
|
108
|
+
change,
|
|
109
|
+
applied: { path: change.path, action: "move", movePath },
|
|
110
|
+
async commit() {
|
|
111
|
+
await fs.promises.mkdir(path.dirname(movePath), { recursive: true });
|
|
112
|
+
await fs.promises.rename(change.path, movePath);
|
|
113
|
+
},
|
|
114
|
+
async rollback() {
|
|
115
|
+
await fs.promises.rename(movePath, change.path);
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async function prepareChange(change) {
|
|
120
|
+
switch (change.action) {
|
|
121
|
+
case "add":
|
|
122
|
+
return prepareAdd(change);
|
|
123
|
+
case "update":
|
|
124
|
+
return prepareUpdate(change);
|
|
125
|
+
case "delete":
|
|
126
|
+
return prepareDelete(change);
|
|
127
|
+
case "move":
|
|
128
|
+
return prepareMove(change);
|
|
129
|
+
default:
|
|
130
|
+
throw new Error(`unknown action: ${change.action}`);
|
|
98
131
|
}
|
|
99
|
-
// Create parent directories for destination
|
|
100
|
-
const dir = path.dirname(change.movePath);
|
|
101
|
-
await fs.promises.mkdir(dir, { recursive: true });
|
|
102
|
-
// Move file
|
|
103
|
-
await fs.promises.rename(change.path, change.movePath);
|
|
104
|
-
return { path: change.path, action: "move", movePath: change.movePath };
|
|
105
132
|
}
|
|
106
133
|
// ---------------------------------------------------------------------------
|
|
107
134
|
// Diff generation (simple, for UI feedback)
|
|
@@ -134,43 +161,62 @@ function generateDiff(_filePath, oldContent, newContent) {
|
|
|
134
161
|
// Main executor
|
|
135
162
|
// ---------------------------------------------------------------------------
|
|
136
163
|
export async function executeApplyPatch(changes) {
|
|
137
|
-
const
|
|
164
|
+
const prepared = [];
|
|
138
165
|
const errors = [];
|
|
166
|
+
const claimedPaths = new Set();
|
|
139
167
|
for (const change of changes) {
|
|
168
|
+
const paths = [change.path, ...(change.action === "move" && change.movePath ? [change.movePath] : [])].map((filePath) => path.resolve(filePath));
|
|
169
|
+
if (paths.some((filePath) => claimedPaths.has(filePath))) {
|
|
170
|
+
errors.push({
|
|
171
|
+
path: change.path,
|
|
172
|
+
action: change.action,
|
|
173
|
+
error: "each source and destination path may appear only once per patch",
|
|
174
|
+
});
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
for (const filePath of paths)
|
|
178
|
+
claimedPaths.add(filePath);
|
|
140
179
|
try {
|
|
141
|
-
|
|
142
|
-
switch (change.action) {
|
|
143
|
-
case "add":
|
|
144
|
-
result = await handleAdd(change);
|
|
145
|
-
break;
|
|
146
|
-
case "update":
|
|
147
|
-
result = await handleUpdate(change);
|
|
148
|
-
break;
|
|
149
|
-
case "delete":
|
|
150
|
-
result = await handleDelete(change);
|
|
151
|
-
break;
|
|
152
|
-
case "move":
|
|
153
|
-
result = await handleMove(change);
|
|
154
|
-
break;
|
|
155
|
-
default:
|
|
156
|
-
throw new Error(`unknown action: ${change.action}`);
|
|
157
|
-
}
|
|
158
|
-
applied.push(result);
|
|
180
|
+
prepared.push(await prepareChange(change));
|
|
159
181
|
}
|
|
160
182
|
catch (err) {
|
|
161
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
162
183
|
errors.push({
|
|
163
184
|
path: change.path,
|
|
164
185
|
action: change.action,
|
|
165
|
-
error:
|
|
186
|
+
error: err instanceof Error ? err.message : String(err),
|
|
166
187
|
});
|
|
167
188
|
}
|
|
168
189
|
}
|
|
169
|
-
|
|
170
|
-
ok:
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
190
|
+
if (errors.length > 0)
|
|
191
|
+
return { ok: false, applied: [], errors };
|
|
192
|
+
const committed = [];
|
|
193
|
+
try {
|
|
194
|
+
for (const change of prepared) {
|
|
195
|
+
await change.commit();
|
|
196
|
+
committed.push(change);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
for (const change of committed.reverse()) {
|
|
201
|
+
try {
|
|
202
|
+
await change.rollback();
|
|
203
|
+
}
|
|
204
|
+
catch (rollbackError) {
|
|
205
|
+
errors.push({
|
|
206
|
+
path: change.change.path,
|
|
207
|
+
action: change.change.action,
|
|
208
|
+
error: `rollback failed: ${rollbackError instanceof Error ? rollbackError.message : String(rollbackError)}`,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
errors.unshift({
|
|
213
|
+
path: prepared[committed.length]?.change.path ?? "",
|
|
214
|
+
action: prepared[committed.length]?.change.action ?? "commit",
|
|
215
|
+
error: err instanceof Error ? err.message : String(err),
|
|
216
|
+
});
|
|
217
|
+
return { ok: false, applied: [], errors };
|
|
218
|
+
}
|
|
219
|
+
return { ok: true, applied: prepared.map((change) => change.applied), errors: [] };
|
|
174
220
|
}
|
|
175
221
|
// ---------------------------------------------------------------------------
|
|
176
222
|
// Format result for tool output
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-patch.js","sourceRoot":"","sources":["../../src/core/apply-patch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"apply-patch.js","sourceRoot":"","sources":["../../src/core/apply-patch.ts"],"names":[],"mappings":"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"}
|
package/dist/core/config.d.ts
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
export declare const PI_DIFF_TOOL_NAMES: readonly ["write", "edit", "apply_patch"];
|
|
2
|
+
export type PiDiffToolName = (typeof PI_DIFF_TOOL_NAMES)[number];
|
|
1
3
|
/**
|
|
2
4
|
* Full pi-diff.json schema.
|
|
3
5
|
* All fields are optional — missing fields fall through to env → defaults.
|
|
4
6
|
*/
|
|
5
7
|
export interface PiDiffJson {
|
|
8
|
+
/** pi-diff tools to omit. Disabling write or edit restores Pi's built-in tool. */
|
|
9
|
+
disabledTools?: PiDiffToolName[];
|
|
6
10
|
/** Hunk separator style. */
|
|
7
11
|
sepStyle?: "auto" | "simple" | "gap" | "context" | "metadata";
|
|
8
12
|
/** Show line numbers in gutter. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAuBA;;;GAGG;AACH,MAAM,WAAW,UAAU;IAC1B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IAC9D,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yCAAyC;IACzC,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;IAC5C,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9B,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACH;AAQD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,kBAAkB,2CAA4C,CAAC;AAC5E,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE;;;GAGG;AACH,MAAM,WAAW,UAAU;IAC1B,kFAAkF;IAClF,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC;IACjC,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;IAC9D,mCAAmC;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,yCAAyC;IACzC,cAAc,CAAC,EAAE,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;IAC5C,gCAAgC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9B,gDAAgD;IAChD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,+BAA+B;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+BAA+B;IAC/B,MAAM,CAAC,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC,CAAC;CACH;AAQD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CA+CzD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C;AAuBD,wBAAgB,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAEnE;AAED,wBAAgB,iBAAiB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAEnE;AAED,wBAAgB,oBAAoB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAE/E;AAED,wBAAgB,eAAe,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAErE;AAED,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAElE;AAED,wBAAgB,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE5D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjE;AAED,wBAAgB,YAAY,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAE/D"}
|
package/dist/core/config.js
CHANGED
|
@@ -16,6 +16,10 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
16
16
|
import { homedir } from "node:os";
|
|
17
17
|
import { join } from "node:path";
|
|
18
18
|
// ---------------------------------------------------------------------------
|
|
19
|
+
// Types
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
export const PI_DIFF_TOOL_NAMES = ["write", "edit", "apply_patch"];
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
19
23
|
// Module state — singleton cache
|
|
20
24
|
// ---------------------------------------------------------------------------
|
|
21
25
|
let _cachedConfig; // null = not loaded, undefined = attempted/no-file
|
|
@@ -29,12 +33,12 @@ export function loadPiDiffConfig(cwd) {
|
|
|
29
33
|
// When a specific cwd is provided (e.g. for testing), only search that path.
|
|
30
34
|
// When omitted, search project root then global.
|
|
31
35
|
const searchPaths = cwd
|
|
32
|
-
? [join(cwd, "pi-diff.json"), join(cwd, "
|
|
36
|
+
? [join(cwd, ".pi", "pi-diff.json"), join(cwd, "pi-diff.json")]
|
|
33
37
|
: [
|
|
34
|
-
join(process.cwd(), "pi-diff.json"),
|
|
35
|
-
join(process.cwd(), ".pi", "pi-diff.json"),
|
|
36
|
-
join(homedir(), ".pi", "agent", "pi-diff.json"),
|
|
37
38
|
join(homedir(), ".pi", "pi-diff.json"),
|
|
39
|
+
join(homedir(), ".pi", "agent", "pi-diff.json"),
|
|
40
|
+
join(process.cwd(), ".pi", "pi-diff.json"),
|
|
41
|
+
join(process.cwd(), "pi-diff.json"),
|
|
38
42
|
];
|
|
39
43
|
// Deduplicate by resolving to absolute paths
|
|
40
44
|
const seen = new Set();
|
|
@@ -46,13 +50,19 @@ export function loadPiDiffConfig(cwd) {
|
|
|
46
50
|
uniquePaths.push(abs);
|
|
47
51
|
}
|
|
48
52
|
}
|
|
49
|
-
//
|
|
53
|
+
// Paths are ordered lowest-to-highest priority; later files override earlier ones.
|
|
50
54
|
let merged = {};
|
|
51
55
|
for (const filePath of uniquePaths) {
|
|
52
56
|
try {
|
|
53
57
|
if (!existsSync(filePath))
|
|
54
58
|
continue;
|
|
55
59
|
const raw = JSON.parse(readFileSync(filePath, "utf-8"));
|
|
60
|
+
if (Array.isArray(raw.disabledTools)) {
|
|
61
|
+
raw.disabledTools = raw.disabledTools.filter((tool) => typeof tool === "string" && PI_DIFF_TOOL_NAMES.includes(tool));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
delete raw.disabledTools;
|
|
65
|
+
}
|
|
56
66
|
merged = deepMerge(merged, raw);
|
|
57
67
|
}
|
|
58
68
|
catch {
|
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,6BAA6B;AAC7B,EAAE;AACF,mCAAmC;AACnC,sEAAsE;AACtE,uDAAuD;AACvD,sEAAsE;AACtE,4DAA4D;AAC5D,sDAAsD;AACtD,0BAA0B;AAC1B,EAAE;AACF,gEAAgE;AAChE,8CAA8C;AAC9C,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
|
package/dist/core/diff.d.ts
CHANGED
|
@@ -21,10 +21,6 @@ export interface ParsedDiff {
|
|
|
21
21
|
removed: number;
|
|
22
22
|
chars: number;
|
|
23
23
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Parse a unified diff/patch string into one or more ParsedDiff.
|
|
26
|
-
* Each file in the patch gets its own entry.
|
|
27
|
-
*/
|
|
28
24
|
export declare function parsePatchFiles(patch: string): ParsedDiff[];
|
|
29
25
|
/** Style for rendering hunk separators between change blocks. */
|
|
30
26
|
export type HunkSeparatorStyle = "auto" | "simple" | "gap" | "context" | "metadata";
|
package/dist/core/diff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/core/diff.ts"],"names":[],"mappings":"AAMA,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/core/diff.ts"],"names":[],"mappings":"AAMA,qDAAqD;AACrD,MAAM,WAAW,QAAQ;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACd;AAyBD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,EAAE,CAyC3D;AA2FD,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;AAIpF;;;GAGG;AACH,wBAAgB,eAAe,IAAI,kBAAkB,CAQpD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,kBAAkB,CAEhD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,OAAO,CAAC,EAAE,MAAM,GACd,MAAM,CAwBR;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC5B,KAAK,EAAE,kBAAkB,EACzB,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,GAAG,EAAE,MAAM,GAAG,IAAI,EAClB,OAAO,CAAC,EAAE,MAAM,GACd,MAAM,CAyBR;AASD,+DAA+D;AAC/D,MAAM,WAAW,SAAS;IACzB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,SAAS,EAAE,QAAQ,EAAE,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,CA8B/D;AAED,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAI,GAAG,UAAU,CA2CrF"}
|