@heyhuynhgiabuu/pi-diff 0.2.2 → 0.3.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 +117 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +55 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/diff.d.ts +14 -0
- package/dist/core/diff.d.ts.map +1 -0
- package/dist/core/diff.js +72 -0
- package/dist/core/diff.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1738 -0
- package/dist/index.js.map +1 -0
- package/dist/review/command.d.ts +2 -0
- package/dist/review/command.d.ts.map +1 -0
- package/dist/review/command.js +365 -0
- package/dist/review/command.js.map +1 -0
- package/dist/review/export.d.ts +7 -0
- package/dist/review/export.d.ts.map +1 -0
- package/dist/review/export.js +77 -0
- package/dist/review/export.js.map +1 -0
- package/dist/review/file-preview.d.ts +9 -0
- package/dist/review/file-preview.d.ts.map +1 -0
- package/dist/review/file-preview.js +228 -0
- package/dist/review/file-preview.js.map +1 -0
- package/dist/review/git.d.ts +49 -0
- package/dist/review/git.d.ts.map +1 -0
- package/dist/review/git.js +200 -0
- package/dist/review/git.js.map +1 -0
- package/dist/review/hunk-preview.d.ts +25 -0
- package/dist/review/hunk-preview.d.ts.map +1 -0
- package/dist/review/hunk-preview.js +973 -0
- package/dist/review/hunk-preview.js.map +1 -0
- package/dist/review/interactive.d.ts +27 -0
- package/dist/review/interactive.d.ts.map +1 -0
- package/dist/review/interactive.js +146 -0
- package/dist/review/interactive.js.map +1 -0
- package/dist/review/model.d.ts +33 -0
- package/dist/review/model.d.ts.map +1 -0
- package/dist/review/model.js +208 -0
- package/dist/review/model.js.map +1 -0
- package/dist/review/prompt.d.ts +4 -0
- package/dist/review/prompt.d.ts.map +1 -0
- package/dist/review/prompt.js +43 -0
- package/dist/review/prompt.js.map +1 -0
- package/dist/review/session.d.ts +69 -0
- package/dist/review/session.d.ts.map +1 -0
- package/dist/review/session.js +190 -0
- package/dist/review/session.js.map +1 -0
- package/dist/review/tui.d.ts +57 -0
- package/dist/review/tui.d.ts.map +1 -0
- package/dist/review/tui.js +486 -0
- package/dist/review/tui.js.map +1 -0
- package/media/review-diff.png +0 -0
- package/package.json +69 -5
- package/prompts/review-diff-agent.md +19 -0
- package/biome.json +0 -29
- package/src/index.ts +0 -1635
- package/tsconfig.json +0 -19
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.formatReviewMarkdown = formatReviewMarkdown;
|
|
4
|
+
function formatReviewMarkdown(diff, options = {}) {
|
|
5
|
+
const maxLinesPerHunk = options.maxLinesPerHunk ?? 80;
|
|
6
|
+
const lines = [];
|
|
7
|
+
lines.push("# Code Review Context");
|
|
8
|
+
lines.push("");
|
|
9
|
+
lines.push(`Mode: ${formatMode(diff.mode)}`);
|
|
10
|
+
lines.push(`Files changed: ${diff.files.length}`);
|
|
11
|
+
lines.push("");
|
|
12
|
+
if (diff.files.length === 0) {
|
|
13
|
+
lines.push("No changes found.");
|
|
14
|
+
return lines.join("\n");
|
|
15
|
+
}
|
|
16
|
+
lines.push("## Review instructions for an agent");
|
|
17
|
+
lines.push("");
|
|
18
|
+
lines.push("Review the changed files below. Focus on correctness, regressions, security, missing tests, and maintainability. Cite file paths and changed line numbers. Do not comment on unchanged code unless it is necessary to explain a changed-line issue.");
|
|
19
|
+
lines.push("");
|
|
20
|
+
lines.push("## Changed files");
|
|
21
|
+
lines.push("");
|
|
22
|
+
for (const file of diff.files) {
|
|
23
|
+
lines.push(formatFileSummary(file));
|
|
24
|
+
}
|
|
25
|
+
lines.push("");
|
|
26
|
+
for (const file of diff.files) {
|
|
27
|
+
lines.push(`## ${file.path}`);
|
|
28
|
+
lines.push("");
|
|
29
|
+
lines.push(`Status: ${file.status}`);
|
|
30
|
+
if (file.oldPath && file.oldPath !== file.path)
|
|
31
|
+
lines.push(`Old path: ${file.oldPath}`);
|
|
32
|
+
lines.push("");
|
|
33
|
+
for (const hunk of file.hunks) {
|
|
34
|
+
lines.push(formatHunk(file, hunk, maxLinesPerHunk));
|
|
35
|
+
lines.push("");
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (options.includeRawDiff && diff.raw.trim()) {
|
|
39
|
+
lines.push("## Raw diff");
|
|
40
|
+
lines.push("");
|
|
41
|
+
lines.push("```diff");
|
|
42
|
+
lines.push(diff.raw.trimEnd());
|
|
43
|
+
lines.push("```");
|
|
44
|
+
}
|
|
45
|
+
return `${lines.join("\n").trimEnd()}\n`;
|
|
46
|
+
}
|
|
47
|
+
function formatMode(mode) {
|
|
48
|
+
return mode.type === "branch" ? `branch (${mode.base}...HEAD)` : "working tree";
|
|
49
|
+
}
|
|
50
|
+
function formatFileSummary(file) {
|
|
51
|
+
const additions = countLines(file, "add");
|
|
52
|
+
const deletions = countLines(file, "del");
|
|
53
|
+
return `- ${file.path} (${file.status}, +${additions}/-${deletions}, ${file.hunks.length} hunks)`;
|
|
54
|
+
}
|
|
55
|
+
function countLines(file, type) {
|
|
56
|
+
return file.hunks.reduce((sum, hunk) => sum + hunk.lines.filter((line) => line.type === type).length, 0);
|
|
57
|
+
}
|
|
58
|
+
function formatHunk(file, hunk, maxLines) {
|
|
59
|
+
const lines = [];
|
|
60
|
+
lines.push(`### ${file.path}:${hunk.newStart}`);
|
|
61
|
+
lines.push("");
|
|
62
|
+
lines.push("```diff");
|
|
63
|
+
lines.push(hunk.header);
|
|
64
|
+
const visible = hunk.lines.slice(0, maxLines);
|
|
65
|
+
for (const line of visible) {
|
|
66
|
+
const marker = line.type === "add" ? "+" : line.type === "del" ? "-" : " ";
|
|
67
|
+
const number = line.type === "del" ? line.oldNum : line.newNum;
|
|
68
|
+
const gutter = number === null ? "" : String(number).padStart(4, " ");
|
|
69
|
+
lines.push(`${marker}${gutter} ${line.content}`);
|
|
70
|
+
}
|
|
71
|
+
if (hunk.lines.length > visible.length) {
|
|
72
|
+
lines.push(` … ${hunk.lines.length - visible.length} more changed/context lines omitted`);
|
|
73
|
+
}
|
|
74
|
+
lines.push("```");
|
|
75
|
+
return lines.join("\n");
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/review/export.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ReviewViewportLine } from "./model.js";
|
|
2
|
+
export interface ReviewFilePreviewInput {
|
|
3
|
+
filePath: string;
|
|
4
|
+
lines: ReviewViewportLine[];
|
|
5
|
+
theme?: any;
|
|
6
|
+
width: number;
|
|
7
|
+
}
|
|
8
|
+
export declare function renderReviewFilePreview(input: ReviewFilePreviewInput): Promise<string[]>;
|
|
9
|
+
//# sourceMappingURL=file-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-preview.d.ts","sourceRoot":"","sources":["../../src/review/file-preview.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACd;AAmHD,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAuD9F"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.renderReviewFilePreview = renderReviewFilePreview;
|
|
4
|
+
const node_path_1 = require("node:path");
|
|
5
|
+
const cli_1 = require("@shikijs/cli");
|
|
6
|
+
const THEME = process.env.DIFF_THEME ?? "github-dark";
|
|
7
|
+
const MAX_HL_CHARS = 80_000;
|
|
8
|
+
const CACHE_LIMIT = 192;
|
|
9
|
+
const BG_ADD = "\x1b[48;2;22;38;32m";
|
|
10
|
+
const BG_DEL = "\x1b[48;2;45;25;25m";
|
|
11
|
+
const BG_CTX = "\x1b[49m";
|
|
12
|
+
const RST = "\x1b[0m";
|
|
13
|
+
// Binary file extensions — never try to Shiki-render these as code.
|
|
14
|
+
const BINARY_EXTS = new Set([
|
|
15
|
+
"png",
|
|
16
|
+
"jpg",
|
|
17
|
+
"jpeg",
|
|
18
|
+
"gif",
|
|
19
|
+
"webp",
|
|
20
|
+
"ico",
|
|
21
|
+
"bmp",
|
|
22
|
+
"tiff",
|
|
23
|
+
"tif",
|
|
24
|
+
"pdf",
|
|
25
|
+
"zip",
|
|
26
|
+
"tar",
|
|
27
|
+
"gz",
|
|
28
|
+
"bz2",
|
|
29
|
+
"xz",
|
|
30
|
+
"7z",
|
|
31
|
+
"rar",
|
|
32
|
+
"bin",
|
|
33
|
+
"exe",
|
|
34
|
+
"dll",
|
|
35
|
+
"so",
|
|
36
|
+
"dylib",
|
|
37
|
+
"o",
|
|
38
|
+
"a",
|
|
39
|
+
"woff",
|
|
40
|
+
"woff2",
|
|
41
|
+
"ttf",
|
|
42
|
+
"otf",
|
|
43
|
+
"eot",
|
|
44
|
+
"mp3",
|
|
45
|
+
"mp4",
|
|
46
|
+
"avi",
|
|
47
|
+
"mov",
|
|
48
|
+
"mkv",
|
|
49
|
+
"flac",
|
|
50
|
+
"wav",
|
|
51
|
+
"ogg",
|
|
52
|
+
"aac",
|
|
53
|
+
"db",
|
|
54
|
+
"sqlite",
|
|
55
|
+
"sqlite3",
|
|
56
|
+
]);
|
|
57
|
+
function isBinaryPath(filePath) {
|
|
58
|
+
const ext = (0, node_path_1.extname)(filePath).slice(1).toLowerCase();
|
|
59
|
+
return BINARY_EXTS.has(ext);
|
|
60
|
+
}
|
|
61
|
+
// Return a raw background ANSI escape. Pi theme.bg(token, text) wraps text and is
|
|
62
|
+
// not a raw escape provider; calling it as bg(token) can throw and blank the
|
|
63
|
+
// preview. Use getBgAnsi() when available, otherwise fall back to a stable RGB.
|
|
64
|
+
function bgAnsi(theme, token, fallback) {
|
|
65
|
+
if (typeof theme?.getBgAnsi !== "function")
|
|
66
|
+
return fallback;
|
|
67
|
+
try {
|
|
68
|
+
const bg = theme.getBgAnsi(token);
|
|
69
|
+
return bg || fallback;
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return fallback;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const EXT_LANG = {
|
|
76
|
+
ts: "typescript",
|
|
77
|
+
tsx: "tsx",
|
|
78
|
+
js: "javascript",
|
|
79
|
+
jsx: "jsx",
|
|
80
|
+
mjs: "javascript",
|
|
81
|
+
cjs: "javascript",
|
|
82
|
+
py: "python",
|
|
83
|
+
rb: "ruby",
|
|
84
|
+
rs: "rust",
|
|
85
|
+
go: "go",
|
|
86
|
+
java: "java",
|
|
87
|
+
c: "c",
|
|
88
|
+
cpp: "cpp",
|
|
89
|
+
h: "c",
|
|
90
|
+
hpp: "cpp",
|
|
91
|
+
cs: "csharp",
|
|
92
|
+
swift: "swift",
|
|
93
|
+
kt: "kotlin",
|
|
94
|
+
html: "html",
|
|
95
|
+
css: "css",
|
|
96
|
+
scss: "scss",
|
|
97
|
+
json: "json",
|
|
98
|
+
yaml: "yaml",
|
|
99
|
+
yml: "yaml",
|
|
100
|
+
toml: "toml",
|
|
101
|
+
md: "markdown",
|
|
102
|
+
sql: "sql",
|
|
103
|
+
sh: "bash",
|
|
104
|
+
bash: "bash",
|
|
105
|
+
zsh: "bash",
|
|
106
|
+
lua: "lua",
|
|
107
|
+
php: "php",
|
|
108
|
+
dart: "dart",
|
|
109
|
+
xml: "xml",
|
|
110
|
+
graphql: "graphql",
|
|
111
|
+
svelte: "svelte",
|
|
112
|
+
vue: "vue",
|
|
113
|
+
};
|
|
114
|
+
const cache = new Map();
|
|
115
|
+
(0, cli_1.codeToANSI)("", "typescript", THEME).catch(() => { });
|
|
116
|
+
async function renderReviewFilePreview(input) {
|
|
117
|
+
// Binary files must not be Shiki-rendered: their bytes, when decoded as UTF-8, can
|
|
118
|
+
// produce wide Unicode characters whose display width exceeds our column budget and
|
|
119
|
+
// crashes Pi TUI's renderer.
|
|
120
|
+
if (isBinaryPath(input.filePath)) {
|
|
121
|
+
return input.lines.map((line) => {
|
|
122
|
+
if (line.kind === "hunk-header") {
|
|
123
|
+
return styleLine(input.theme?.fg?.("muted", line.content) ?? line.content, input.width);
|
|
124
|
+
}
|
|
125
|
+
const sign = line.kind === "add" ? "+" : line.kind === "del" ? "-" : " ";
|
|
126
|
+
const signColor = line.kind === "add" ? "toolDiffAdded" : line.kind === "del" ? "toolDiffRemoved" : "toolDiffContext";
|
|
127
|
+
const number = line.kind === "del" ? line.oldNum : line.newNum;
|
|
128
|
+
const bodyBg = line.kind === "add"
|
|
129
|
+
? bgAnsi(input.theme, "toolDiffAdded", BG_ADD)
|
|
130
|
+
: line.kind === "del"
|
|
131
|
+
? bgAnsi(input.theme, "toolDiffRemoved", BG_DEL)
|
|
132
|
+
: BG_CTX;
|
|
133
|
+
const gutter = ` ${fg(input.theme, signColor, String(number ?? "").padStart(4, " "))} ${fg(input.theme, signColor, sign)} `;
|
|
134
|
+
return styleLine(`${gutter}${bodyBg}${fg(input.theme, signColor, "(binary)")}${RST}`, input.width);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
const language = lang(input.filePath);
|
|
138
|
+
const diffLines = input.lines.filter((line) => line.kind !== "hunk-header");
|
|
139
|
+
const highlights = await hlBlock(diffLines.map((line) => line.content).join("\n"), language);
|
|
140
|
+
let highlightIndex = 0;
|
|
141
|
+
return input.lines.map((line) => {
|
|
142
|
+
if (line.kind === "hunk-header") {
|
|
143
|
+
return styleLine(input.theme?.fg?.("muted", line.content) ?? line.content, input.width);
|
|
144
|
+
}
|
|
145
|
+
const highlighted = highlights[highlightIndex++] ?? line.content;
|
|
146
|
+
const marker = " ";
|
|
147
|
+
const commentMarker = line.commentCount > 0
|
|
148
|
+
? fg(input.theme, "warning", `●${line.commentCount > 1 ? Math.min(line.commentCount, 9) : ""}`)
|
|
149
|
+
: " ";
|
|
150
|
+
const sign = line.kind === "add" ? "+" : line.kind === "del" ? "-" : " ";
|
|
151
|
+
const signColor = line.kind === "add" ? "toolDiffAdded" : line.kind === "del" ? "toolDiffRemoved" : "toolDiffContext";
|
|
152
|
+
const number = line.kind === "del" ? line.oldNum : line.newNum;
|
|
153
|
+
// Use the theme's background color for add/del lines so the background adapts to
|
|
154
|
+
// the active Pi theme instead of using hard-coded RGB that can clash with syntax
|
|
155
|
+
// highlighting token colors. Falls back to a dark RGB constant when the theme
|
|
156
|
+
// does not expose a bg() / getBgAnsi() method.
|
|
157
|
+
const bodyBg = line.kind === "add"
|
|
158
|
+
? bgAnsi(input.theme, "toolDiffAdded", BG_ADD)
|
|
159
|
+
: line.kind === "del"
|
|
160
|
+
? bgAnsi(input.theme, "toolDiffRemoved", BG_DEL)
|
|
161
|
+
: BG_CTX;
|
|
162
|
+
const gutter = `${marker}${commentMarker} ${fg(input.theme, signColor, String(number ?? "").padStart(4, " "))} ${fg(input.theme, signColor, sign)} `;
|
|
163
|
+
return styleLine(`${gutter}${bodyBg}${highlighted}${RST}`, input.width);
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
function fg(theme, token, text) {
|
|
167
|
+
return typeof theme?.fg === "function" ? theme.fg(token, text) : text;
|
|
168
|
+
}
|
|
169
|
+
function styleLine(text, width) {
|
|
170
|
+
const stripped = stripAnsi(text);
|
|
171
|
+
if (stripped.length <= width)
|
|
172
|
+
return text;
|
|
173
|
+
return truncateAnsi(text, width);
|
|
174
|
+
}
|
|
175
|
+
// biome-ignore lint/complexity/useRegexLiterals: constructor form avoids the control-character lint on ESC.
|
|
176
|
+
const ANSI_RE = new RegExp("\\u001b\\[[0-9;]*m", "g");
|
|
177
|
+
function stripAnsi(text) {
|
|
178
|
+
return text.replace(ANSI_RE, "");
|
|
179
|
+
}
|
|
180
|
+
function truncateAnsi(text, width) {
|
|
181
|
+
let visible = 0;
|
|
182
|
+
let index = 0;
|
|
183
|
+
while (index < text.length && visible < width) {
|
|
184
|
+
if (text[index] === "\u001b") {
|
|
185
|
+
const end = text.indexOf("m", index);
|
|
186
|
+
if (end !== -1) {
|
|
187
|
+
index = end + 1;
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
visible += 1;
|
|
192
|
+
index += 1;
|
|
193
|
+
}
|
|
194
|
+
return `${text.slice(0, index)}${RST}`;
|
|
195
|
+
}
|
|
196
|
+
function lang(filePath) {
|
|
197
|
+
return EXT_LANG[(0, node_path_1.extname)(filePath).slice(1).toLowerCase()];
|
|
198
|
+
}
|
|
199
|
+
async function hlBlock(code, language) {
|
|
200
|
+
if (!code)
|
|
201
|
+
return [];
|
|
202
|
+
if (!language || code.length > MAX_HL_CHARS)
|
|
203
|
+
return code.split("\n");
|
|
204
|
+
const key = `${THEME}\0${language}\0${code}`;
|
|
205
|
+
const hit = cache.get(key);
|
|
206
|
+
if (hit)
|
|
207
|
+
return touch(key, hit);
|
|
208
|
+
try {
|
|
209
|
+
const ansi = await (0, cli_1.codeToANSI)(code, language, THEME);
|
|
210
|
+
const output = (ansi.endsWith("\n") ? ansi.slice(0, -1) : ansi).split("\n");
|
|
211
|
+
return touch(key, output);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return code.split("\n");
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function touch(key, value) {
|
|
218
|
+
cache.delete(key);
|
|
219
|
+
cache.set(key, value);
|
|
220
|
+
while (cache.size > CACHE_LIMIT) {
|
|
221
|
+
const first = cache.keys().next().value;
|
|
222
|
+
if (first === undefined)
|
|
223
|
+
break;
|
|
224
|
+
cache.delete(first);
|
|
225
|
+
}
|
|
226
|
+
return value;
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=file-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-preview.js","sourceRoot":"","sources":["../../src/review/file-preview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type ReviewDiffMode = {
|
|
2
|
+
type: "working-tree";
|
|
3
|
+
} | {
|
|
4
|
+
type: "branch";
|
|
5
|
+
base: string;
|
|
6
|
+
};
|
|
7
|
+
export interface ReviewLine {
|
|
8
|
+
type: "add" | "del" | "ctx";
|
|
9
|
+
oldNum: number | null;
|
|
10
|
+
newNum: number | null;
|
|
11
|
+
content: string;
|
|
12
|
+
}
|
|
13
|
+
export interface ReviewHunk {
|
|
14
|
+
id: string;
|
|
15
|
+
oldStart: number;
|
|
16
|
+
oldLines: number;
|
|
17
|
+
newStart: number;
|
|
18
|
+
newLines: number;
|
|
19
|
+
header: string;
|
|
20
|
+
lines: ReviewLine[];
|
|
21
|
+
}
|
|
22
|
+
export interface ReviewFileDiff {
|
|
23
|
+
oldPath: string | null;
|
|
24
|
+
newPath: string | null;
|
|
25
|
+
path: string;
|
|
26
|
+
status: "added" | "deleted" | "modified" | "renamed";
|
|
27
|
+
hunks: ReviewHunk[];
|
|
28
|
+
}
|
|
29
|
+
export interface ReviewDiff {
|
|
30
|
+
mode: ReviewDiffMode;
|
|
31
|
+
files: ReviewFileDiff[];
|
|
32
|
+
raw: string;
|
|
33
|
+
}
|
|
34
|
+
export declare function readGitDiff(cwd: string, mode?: ReviewDiffMode): ReviewDiff;
|
|
35
|
+
export declare function readChangedFiles(cwd: string, mode?: ReviewDiffMode): string[];
|
|
36
|
+
export declare function countReviewHunkLines(hunk: ReviewHunk): {
|
|
37
|
+
insertions: number;
|
|
38
|
+
deletions: number;
|
|
39
|
+
};
|
|
40
|
+
export declare function countReviewFileLines(file: ReviewFileDiff): {
|
|
41
|
+
insertions: number;
|
|
42
|
+
deletions: number;
|
|
43
|
+
};
|
|
44
|
+
export declare function countReviewDiffLines(diff: ReviewDiff): {
|
|
45
|
+
insertions: number;
|
|
46
|
+
deletions: number;
|
|
47
|
+
};
|
|
48
|
+
export declare function parseUnifiedGitDiff(raw: string): ReviewFileDiff[];
|
|
49
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/review/git.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzF,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,UAAU,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;IACrD,KAAK,EAAE,UAAU,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;CACZ;AAID,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAyC,GAAG,UAAU,CAWpG;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,cAAyC,GAAG,MAAM,EAAE,CAQvG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAQhG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CASpG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAShG;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,EAAE,CAiFjE"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.readGitDiff = readGitDiff;
|
|
4
|
+
exports.readChangedFiles = readChangedFiles;
|
|
5
|
+
exports.countReviewHunkLines = countReviewHunkLines;
|
|
6
|
+
exports.countReviewFileLines = countReviewFileLines;
|
|
7
|
+
exports.countReviewDiffLines = countReviewDiffLines;
|
|
8
|
+
exports.parseUnifiedGitDiff = parseUnifiedGitDiff;
|
|
9
|
+
const node_child_process_1 = require("node:child_process");
|
|
10
|
+
const node_fs_1 = require("node:fs");
|
|
11
|
+
const node_path_1 = require("node:path");
|
|
12
|
+
const HUNK_RE = /^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)$/;
|
|
13
|
+
function readGitDiff(cwd, mode = { type: "working-tree" }) {
|
|
14
|
+
const args = mode.type === "branch" ? ["diff", "--no-ext-diff", `${mode.base}...HEAD`] : ["diff", "--no-ext-diff"];
|
|
15
|
+
const trackedRaw = (0, node_child_process_1.execFileSync)("git", args, {
|
|
16
|
+
cwd,
|
|
17
|
+
encoding: "utf8",
|
|
18
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
19
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
20
|
+
});
|
|
21
|
+
const untrackedRaw = mode.type === "working-tree" ? readUntrackedFilesAsDiff(cwd) : "";
|
|
22
|
+
const raw = [trackedRaw.trimEnd(), untrackedRaw.trimEnd()].filter(Boolean).join("\n");
|
|
23
|
+
return { mode, files: parseUnifiedGitDiff(raw), raw };
|
|
24
|
+
}
|
|
25
|
+
function readChangedFiles(cwd, mode = { type: "working-tree" }) {
|
|
26
|
+
const args = mode.type === "branch" ? ["diff", "--name-only", `${mode.base}...HEAD`] : ["diff", "--name-only"];
|
|
27
|
+
const raw = (0, node_child_process_1.execFileSync)("git", args, { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
|
|
28
|
+
const tracked = raw
|
|
29
|
+
.split("\n")
|
|
30
|
+
.map((line) => line.trim())
|
|
31
|
+
.filter(Boolean);
|
|
32
|
+
return mode.type === "working-tree" ? [...tracked, ...readUntrackedFiles(cwd)] : tracked;
|
|
33
|
+
}
|
|
34
|
+
function countReviewHunkLines(hunk) {
|
|
35
|
+
let insertions = 0;
|
|
36
|
+
let deletions = 0;
|
|
37
|
+
for (const line of hunk.lines) {
|
|
38
|
+
if (line.type === "add")
|
|
39
|
+
insertions++;
|
|
40
|
+
else if (line.type === "del")
|
|
41
|
+
deletions++;
|
|
42
|
+
}
|
|
43
|
+
return { insertions, deletions };
|
|
44
|
+
}
|
|
45
|
+
function countReviewFileLines(file) {
|
|
46
|
+
let insertions = 0;
|
|
47
|
+
let deletions = 0;
|
|
48
|
+
for (const hunk of file.hunks) {
|
|
49
|
+
const counts = countReviewHunkLines(hunk);
|
|
50
|
+
insertions += counts.insertions;
|
|
51
|
+
deletions += counts.deletions;
|
|
52
|
+
}
|
|
53
|
+
return { insertions, deletions };
|
|
54
|
+
}
|
|
55
|
+
function countReviewDiffLines(diff) {
|
|
56
|
+
let insertions = 0;
|
|
57
|
+
let deletions = 0;
|
|
58
|
+
for (const file of diff.files) {
|
|
59
|
+
const counts = countReviewFileLines(file);
|
|
60
|
+
insertions += counts.insertions;
|
|
61
|
+
deletions += counts.deletions;
|
|
62
|
+
}
|
|
63
|
+
return { insertions, deletions };
|
|
64
|
+
}
|
|
65
|
+
function parseUnifiedGitDiff(raw) {
|
|
66
|
+
const files = [];
|
|
67
|
+
let currentFile = null;
|
|
68
|
+
let currentHunk = null;
|
|
69
|
+
let oldLine = 0;
|
|
70
|
+
let newLine = 0;
|
|
71
|
+
for (const line of raw.split("\n")) {
|
|
72
|
+
if (line.startsWith("diff --git ")) {
|
|
73
|
+
currentFile = createFileDiff(line);
|
|
74
|
+
files.push(currentFile);
|
|
75
|
+
currentHunk = null;
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
if (!currentFile)
|
|
79
|
+
continue;
|
|
80
|
+
if (line.startsWith("new file mode")) {
|
|
81
|
+
currentFile.status = "added";
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
if (line.startsWith("deleted file mode")) {
|
|
85
|
+
currentFile.status = "deleted";
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
if (line.startsWith("rename from ")) {
|
|
89
|
+
currentFile.status = "renamed";
|
|
90
|
+
currentFile.oldPath = line.slice("rename from ".length);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
if (line.startsWith("rename to ")) {
|
|
94
|
+
currentFile.status = "renamed";
|
|
95
|
+
currentFile.newPath = line.slice("rename to ".length);
|
|
96
|
+
currentFile.path = currentFile.newPath;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (line.startsWith("--- ")) {
|
|
100
|
+
currentFile.oldPath = normalizeDiffPath(line.slice(4));
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (line.startsWith("+++ ")) {
|
|
104
|
+
currentFile.newPath = normalizeDiffPath(line.slice(4));
|
|
105
|
+
currentFile.path = currentFile.newPath ?? currentFile.oldPath ?? currentFile.path;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const hunkMatch = line.match(HUNK_RE);
|
|
109
|
+
if (hunkMatch) {
|
|
110
|
+
const oldStart = Number(hunkMatch[1]);
|
|
111
|
+
const oldLines = Number(hunkMatch[2] ?? "1");
|
|
112
|
+
const newStart = Number(hunkMatch[3]);
|
|
113
|
+
const newLines = Number(hunkMatch[4] ?? "1");
|
|
114
|
+
currentHunk = {
|
|
115
|
+
id: `${currentFile.path}:${oldStart}:${newStart}`,
|
|
116
|
+
oldStart,
|
|
117
|
+
oldLines,
|
|
118
|
+
newStart,
|
|
119
|
+
newLines,
|
|
120
|
+
header: line,
|
|
121
|
+
lines: [],
|
|
122
|
+
};
|
|
123
|
+
currentFile.hunks.push(currentHunk);
|
|
124
|
+
oldLine = oldStart;
|
|
125
|
+
newLine = newStart;
|
|
126
|
+
continue;
|
|
127
|
+
}
|
|
128
|
+
if (!currentHunk || line === "\")
|
|
129
|
+
continue;
|
|
130
|
+
const prefix = line[0];
|
|
131
|
+
const content = line.slice(1);
|
|
132
|
+
if (prefix === "+") {
|
|
133
|
+
currentHunk.lines.push({ type: "add", oldNum: null, newNum: newLine++, content });
|
|
134
|
+
}
|
|
135
|
+
else if (prefix === "-") {
|
|
136
|
+
currentHunk.lines.push({ type: "del", oldNum: oldLine++, newNum: null, content });
|
|
137
|
+
}
|
|
138
|
+
else if (prefix === " ") {
|
|
139
|
+
currentHunk.lines.push({ type: "ctx", oldNum: oldLine++, newNum: newLine++, content });
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return files;
|
|
143
|
+
}
|
|
144
|
+
function readUntrackedFiles(cwd) {
|
|
145
|
+
const raw = (0, node_child_process_1.execFileSync)("git", ["ls-files", "--others", "--exclude-standard"], {
|
|
146
|
+
cwd,
|
|
147
|
+
encoding: "utf8",
|
|
148
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
149
|
+
});
|
|
150
|
+
return raw
|
|
151
|
+
.split("\n")
|
|
152
|
+
.map((line) => line.trim())
|
|
153
|
+
.filter(Boolean)
|
|
154
|
+
.filter((path) => {
|
|
155
|
+
try {
|
|
156
|
+
return (0, node_fs_1.statSync)((0, node_path_1.join)(cwd, path)).isFile();
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
function readUntrackedFilesAsDiff(cwd) {
|
|
164
|
+
return readUntrackedFiles(cwd)
|
|
165
|
+
.map((path) => formatNewFileDiff(path, (0, node_fs_1.readFileSync)((0, node_path_1.join)(cwd, path), "utf8")))
|
|
166
|
+
.join("\n");
|
|
167
|
+
}
|
|
168
|
+
function formatNewFileDiff(path, content) {
|
|
169
|
+
const lines = content.split("\n");
|
|
170
|
+
if (lines.at(-1) === "")
|
|
171
|
+
lines.pop();
|
|
172
|
+
const lineCount = Math.max(lines.length, 1);
|
|
173
|
+
return [
|
|
174
|
+
`diff --git a/${path} b/${path}`,
|
|
175
|
+
"new file mode 100644",
|
|
176
|
+
"index 0000000..0000000",
|
|
177
|
+
"--- /dev/null",
|
|
178
|
+
`+++ b/${path}`,
|
|
179
|
+
`@@ -0,0 +1,${lineCount} @@`,
|
|
180
|
+
...lines.map((line) => `+${line}`),
|
|
181
|
+
].join("\n");
|
|
182
|
+
}
|
|
183
|
+
function createFileDiff(header) {
|
|
184
|
+
const match = header.match(/^diff --git a\/(.*) b\/(.*)$/);
|
|
185
|
+
const oldPath = match?.[1] ?? null;
|
|
186
|
+
const newPath = match?.[2] ?? oldPath;
|
|
187
|
+
return {
|
|
188
|
+
oldPath,
|
|
189
|
+
newPath,
|
|
190
|
+
path: newPath ?? oldPath ?? "unknown",
|
|
191
|
+
status: "modified",
|
|
192
|
+
hunks: [],
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function normalizeDiffPath(path) {
|
|
196
|
+
if (path === "/dev/null")
|
|
197
|
+
return null;
|
|
198
|
+
return path.replace(/^[ab]\//, "");
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/review/git.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { BundledLanguage } from "shiki";
|
|
2
|
+
import type { ParsedDiff } from "../core/diff.js";
|
|
3
|
+
import type { ReviewHunk } from "./git.js";
|
|
4
|
+
export interface ReviewHunkPreviewInput {
|
|
5
|
+
hunk: ReviewHunk;
|
|
6
|
+
filePath: string;
|
|
7
|
+
theme?: any;
|
|
8
|
+
width: number;
|
|
9
|
+
maxLines?: number;
|
|
10
|
+
}
|
|
11
|
+
export type ReviewHunkPreviewRenderer = (input: ReviewHunkPreviewInput) => Promise<string>;
|
|
12
|
+
interface DiffColors {
|
|
13
|
+
fgAdd: string;
|
|
14
|
+
fgDel: string;
|
|
15
|
+
fgCtx: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function renderReviewHunkPreview(input: ReviewHunkPreviewInput): Promise<string>;
|
|
18
|
+
export declare function applyDiffPalette(): void;
|
|
19
|
+
export declare function themeCacheKey(theme?: any): string;
|
|
20
|
+
export declare function resolveDiffColors(theme?: any): DiffColors;
|
|
21
|
+
export declare function lang(filePath: string): BundledLanguage | undefined;
|
|
22
|
+
export declare function renderUnified(diff: ParsedDiff, language: BundledLanguage | undefined, maxLines: number, colors: DiffColors, width: number): Promise<string>;
|
|
23
|
+
export declare function renderSplit(diff: ParsedDiff, language: BundledLanguage | undefined, maxLines: number, colors: DiffColors, width: number): Promise<string>;
|
|
24
|
+
export {};
|
|
25
|
+
//# sourceMappingURL=hunk-preview.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hunk-preview.d.ts","sourceRoot":"","sources":["../../src/review/hunk-preview.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAgB,MAAM,OAAO,CAAC;AAE3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,sBAAsB;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,yBAAyB,GAAG,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AA2B3F,UAAU,UAAU;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd;AA6JD,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAO5F;AA2ID,wBAAgB,gBAAgB,IAAI,IAAI,CAiFvC;AAED,wBAAgB,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,MAAM,CA6BjD;AAED,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,GAAG,GAAG,UAAU,CAgCzD;AA8KD,wBAAgB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAElE;AA4GD,wBAAsB,aAAa,CAClC,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CAgHjB;AAED,wBAAsB,WAAW,CAChC,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,eAAe,GAAG,SAAS,EACrC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,GACX,OAAO,CAAC,MAAM,CAAC,CA6HjB"}
|