@heyhuynhgiabuu/pi-diff 0.6.4 → 0.6.6

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.
Files changed (54) hide show
  1. package/README.md +37 -181
  2. package/dist/edit-guard.d.ts +2 -0
  3. package/dist/edit-guard.d.ts.map +1 -0
  4. package/dist/edit-guard.js +34 -0
  5. package/dist/edit-guard.js.map +1 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +49 -160
  8. package/dist/index.js.map +1 -1
  9. package/package.json +7 -49
  10. package/dist/cli.d.ts +0 -3
  11. package/dist/cli.d.ts.map +0 -1
  12. package/dist/cli.js +0 -53
  13. package/dist/cli.js.map +0 -1
  14. package/dist/core/resolve-lines.d.ts +0 -45
  15. package/dist/core/resolve-lines.d.ts.map +0 -1
  16. package/dist/core/resolve-lines.js +0 -204
  17. package/dist/core/resolve-lines.js.map +0 -1
  18. package/dist/review/command.d.ts +0 -3
  19. package/dist/review/command.d.ts.map +0 -1
  20. package/dist/review/command.js +0 -492
  21. package/dist/review/command.js.map +0 -1
  22. package/dist/review/export.d.ts +0 -7
  23. package/dist/review/export.d.ts.map +0 -1
  24. package/dist/review/export.js +0 -74
  25. package/dist/review/export.js.map +0 -1
  26. package/dist/review/file-preview.d.ts +0 -9
  27. package/dist/review/file-preview.d.ts.map +0 -1
  28. package/dist/review/file-preview.js +0 -225
  29. package/dist/review/file-preview.js.map +0 -1
  30. package/dist/review/hunk-bridge.d.ts +0 -54
  31. package/dist/review/hunk-bridge.d.ts.map +0 -1
  32. package/dist/review/hunk-bridge.js +0 -105
  33. package/dist/review/hunk-bridge.js.map +0 -1
  34. package/dist/review/interactive.d.ts +0 -27
  35. package/dist/review/interactive.d.ts.map +0 -1
  36. package/dist/review/interactive.js +0 -137
  37. package/dist/review/interactive.js.map +0 -1
  38. package/dist/review/model.d.ts +0 -33
  39. package/dist/review/model.d.ts.map +0 -1
  40. package/dist/review/model.js +0 -197
  41. package/dist/review/model.js.map +0 -1
  42. package/dist/review/prompt.d.ts +0 -4
  43. package/dist/review/prompt.d.ts.map +0 -1
  44. package/dist/review/prompt.js +0 -40
  45. package/dist/review/prompt.js.map +0 -1
  46. package/dist/review/session.d.ts +0 -69
  47. package/dist/review/session.d.ts.map +0 -1
  48. package/dist/review/session.js +0 -168
  49. package/dist/review/session.js.map +0 -1
  50. package/dist/review/tui.d.ts +0 -57
  51. package/dist/review/tui.d.ts.map +0 -1
  52. package/dist/review/tui.js +0 -482
  53. package/dist/review/tui.js.map +0 -1
  54. package/prompts/review-diff-agent.md +0 -19
@@ -1,492 +0,0 @@
1
- import { execFileSync } from "node:child_process";
2
- import { createRequire } from "node:module";
3
- import { readGitDiff } from "./git.js";
4
- import { getSelectedPreviewLine, selectPreviewLineForComment, syncPreviewSelection } from "./model.js";
5
- import { buildReviewDiffPrompt } from "./prompt.js";
6
- import { addDraftComment, approveAllComments, cloneReviewDiffSession, createDraftComment, createReviewDiffSession, deleteSelectedComment, editSelectedComment, getLatestReviewDiffSession, getSelectedComment, getSelectedFile, getSelectedHunk, getSubmittableComments, persistReviewDiffSession, syncReviewDiffSession, } from "./session.js";
7
- import { checkHunkAvailable, launchHunkReview } from "./hunk-bridge.js";
8
- const require = createRequire(import.meta.url);
9
- function loadTextComponent() {
10
- try {
11
- const tui = require("@earendil-works/pi-tui");
12
- return tui.Text ?? null;
13
- }
14
- catch {
15
- return null;
16
- }
17
- }
18
- async function copyTextToClipboard(text) {
19
- try {
20
- const hostModule = await import("@earendil-works/pi-coding-agent");
21
- const hostClipboard = hostModule.copyToClipboard;
22
- if (typeof hostClipboard === "function") {
23
- await hostClipboard(text);
24
- return;
25
- }
26
- }
27
- catch (error) {
28
- const message = error instanceof Error ? error.message : String(error);
29
- // If the host package cannot be resolved from an isolated extension install,
30
- // use OS clipboard commands. If the host clipboard helper itself failed,
31
- // preserve the old fallback behavior and let the caller load editor text.
32
- if (!message.includes("Cannot find module"))
33
- throw error;
34
- }
35
- if (process.platform === "darwin") {
36
- execFileSync("pbcopy", { input: text });
37
- return;
38
- }
39
- if (process.platform === "win32") {
40
- execFileSync("clip", { input: text });
41
- return;
42
- }
43
- try {
44
- execFileSync("wl-copy", { input: text });
45
- return;
46
- }
47
- catch {
48
- // Fall through to xclip.
49
- }
50
- execFileSync("xclip", ["-selection", "clipboard"], { input: text });
51
- }
52
- const REVIEW_DIFF_POLL_MS = 1000;
53
- // ─── Hunk availability cache (checked once per process lifetime) ──────────────
54
- let _hunkAvailable = undefined;
55
- let _hunkWarningShown = false;
56
- async function hunkAvailableCached() {
57
- if (_hunkAvailable === undefined) {
58
- _hunkAvailable = await checkHunkAvailable();
59
- }
60
- return _hunkAvailable;
61
- }
62
- // ─── Helpers for mapping Hunk comments to ReviewDraftComment ─────────────────
63
- function hunkCommentToDraftComment(comment, index) {
64
- return {
65
- id: `H${String(index + 1).padStart(3, "0")}`,
66
- file: comment.filePath,
67
- line: comment.newLine || comment.oldLine || undefined,
68
- oldNum: comment.oldLine || null,
69
- newNum: comment.newLine || null,
70
- body: comment.summary,
71
- createdAt: new Date().toISOString(),
72
- status: "approved",
73
- };
74
- }
75
- function mapHunkCommentsToDraftComments(hunkComments) {
76
- return hunkComments.map((comment, index) => hunkCommentToDraftComment(comment, index));
77
- }
78
- export function registerReviewDiffCommand(pi, cwd) {
79
- let latestSession = null;
80
- const reconstruct = (ctx) => {
81
- latestSession = getLatestReviewDiffSession(ctx);
82
- };
83
- pi.on?.("session_start", async (_event, ctx) => reconstruct(ctx));
84
- pi.on?.("session_before_switch", async (_event, ctx) => reconstruct(ctx));
85
- pi.on?.("session_before_fork", async (_event, ctx) => reconstruct(ctx));
86
- pi.on?.("session_tree", async (_event, ctx) => reconstruct(ctx));
87
- pi.registerMessageRenderer?.("review-diff-submit", (message, _options, theme) => {
88
- const Text = loadTextComponent();
89
- if (!Text)
90
- return undefined;
91
- const text = typeof message.content === "string" ? message.content : message.content.map((c) => c.text ?? "").join("");
92
- return new Text(theme.fg("success", theme.bold("review-diff ")) + text, 0, 0);
93
- });
94
- pi.registerMessageRenderer?.("review-diff-status", (message, _options, theme) => {
95
- const Text = loadTextComponent();
96
- if (!Text)
97
- return undefined;
98
- const text = typeof message.content === "string" ? message.content : message.content.map((c) => c.text ?? "").join("");
99
- const level = message.details?.level === "error" ? "error" : message.details?.level === "warning" ? "warning" : "muted";
100
- return new Text(theme.fg(level, theme.bold("review-diff ")) + text, 0, 0);
101
- });
102
- pi.registerCommand?.("review-diff", {
103
- description: "Open an interactive local Git review overlay and submit drafted comments back to Pi",
104
- getArgumentCompletions: (prefix) => {
105
- const items = [
106
- { value: "working-tree", label: "working-tree", description: "Review uncommitted local changes" },
107
- ...listGitBranches(cwd).map((branch) => ({
108
- value: branch,
109
- label: branch,
110
- description: `Review ${branch}...HEAD`,
111
- })),
112
- ];
113
- const filtered = items.filter((item) => item.value.startsWith(prefix));
114
- return filtered.length > 0 ? filtered : null;
115
- },
116
- handler: async (args, ctx) => {
117
- if (!ctx.hasUI) {
118
- notifyReviewDiff(pi, ctx, "/review-diff requires interactive mode", "error");
119
- return;
120
- }
121
- let mode;
122
- try {
123
- mode = parseReviewDiffArgs(args, latestSession?.mode);
124
- }
125
- catch (error) {
126
- notifyReviewDiff(pi, ctx, error instanceof Error ? error.message : String(error), "error");
127
- return;
128
- }
129
- const initialDiff = loadReviewDiff(cwd, mode);
130
- if (!initialDiff.ok) {
131
- notifyReviewDiff(pi, ctx, initialDiff.message, "error");
132
- return;
133
- }
134
- const diff = initialDiff.diff;
135
- const available = await hunkAvailableCached();
136
- if (available) {
137
- // ── Hunk path ────────────────────────────────────────────────
138
- await handleHunkReview(pi, ctx, cwd, diff, mode, latestSession);
139
- return;
140
- }
141
- // ── Fallback path (TUI) ─────────────────────────────────────────
142
- if (!_hunkWarningShown) {
143
- _hunkWarningShown = true;
144
- notifyReviewDiff(pi, ctx, "Hunk not found — using built-in review UI. Install with: npm i -g hunkdiff", "warning");
145
- }
146
- await handleTuiReview(pi, ctx, cwd, diff, mode, latestSession);
147
- },
148
- });
149
- }
150
- /**
151
- * Hunk review path: pipe git diff to `hunk patch -`, wait for exit,
152
- * map returned comments to ReviewDraftComment[], and submit.
153
- */
154
- async function handleHunkReview(pi, ctx, cwd, diff, mode, latestSession) {
155
- let session = latestSession && sameMode(latestSession.mode, mode)
156
- ? cloneReviewDiffSession(latestSession)
157
- : createReviewDiffSession(mode);
158
- session = syncReviewDiffSession(session, diff);
159
- persistReviewDiffSession(pi, session);
160
- const hunkResult = await launchHunkReview(cwd, diff.raw);
161
- // Even if the process returned non-zero, attempt to harvest comments
162
- const hunkComments = hunkResult.comments ?? [];
163
- if (hunkComments.length > 0) {
164
- const draftComments = mapHunkCommentsToDraftComments(hunkComments);
165
- for (const dc of draftComments) {
166
- addDraftComment(session, dc);
167
- }
168
- persistReviewDiffSession(pi, session);
169
- }
170
- const comments = getSubmittableComments(session);
171
- if (comments.length > 0) {
172
- const prompt = buildReviewDiffPrompt(diff, session);
173
- if (typeof ctx.isIdle === "function" && !ctx.isIdle()) {
174
- pi.sendUserMessage(prompt, { deliverAs: "followUp" });
175
- }
176
- else {
177
- pi.sendUserMessage(prompt);
178
- }
179
- session.submittedAt = Date.now();
180
- persistReviewDiffSession(pi, session);
181
- pi.sendMessage?.({
182
- customType: "review-diff-submit",
183
- content: `${comments.length} comment(s) queued for Pi from ${session.mode.type === "branch" ? `${session.mode.base}...HEAD` : "working tree"}`,
184
- display: true,
185
- details: { commentCount: comments.length, mode: session.mode },
186
- });
187
- ctx.ui.notify(`Queued ${comments.length} review comment(s) for Pi`, "info");
188
- }
189
- else {
190
- ctx.ui.notify("Hunk review completed with no comments to submit.", "info");
191
- }
192
- }
193
- /**
194
- * Legacy TUI review path: open the ReviewDiffPane overlay with the existing
195
- * session management, refresh, approve-all, and submit flows.
196
- */
197
- async function handleTuiReview(pi, ctx, cwd, diff, mode, latestSession) {
198
- let session = latestSession && sameMode(latestSession.mode, mode)
199
- ? cloneReviewDiffSession(latestSession)
200
- : createReviewDiffSession(mode);
201
- session = syncReviewDiffSession(session, diff);
202
- syncPreviewSelection(session, diff);
203
- persistReviewDiffSession(pi, session);
204
- // eslint-disable-next-line no-constant-condition
205
- while (true) {
206
- const paneResult = await openReviewDiffPane(ctx, cwd, diff, session);
207
- diff = paneResult.diff;
208
- session = paneResult.session;
209
- const action = paneResult.action;
210
- if (action.type === "cancel") {
211
- persistReviewDiffSession(pi, session);
212
- return;
213
- }
214
- if (action.type === "refresh") {
215
- const refreshed = loadReviewDiff(cwd, session.mode);
216
- if (!refreshed.ok) {
217
- notifyReviewDiff(pi, ctx, refreshed.message, "error");
218
- continue;
219
- }
220
- diff = refreshed.diff;
221
- session = syncReviewDiffSession(session, diff);
222
- syncPreviewSelection(session, diff);
223
- persistReviewDiffSession(pi, session);
224
- continue;
225
- }
226
- if (action.type === "approve-all") {
227
- approveAllComments(session);
228
- selectPreviewLineForComment(session, diff);
229
- syncPreviewSelection(session, diff);
230
- persistReviewDiffSession(pi, session);
231
- continue;
232
- }
233
- if (action.type === "add-comment") {
234
- const file = getSelectedFile(diff, session);
235
- const hunk = getSelectedHunk(diff, session);
236
- const previewLine = getSelectedPreviewLine(diff, session);
237
- if (!file || !hunk) {
238
- ctx.ui.notify("Select a file and hunk before drafting a comment", "warning");
239
- continue;
240
- }
241
- const lineNumber = previewLine?.newNum ?? previewLine?.oldNum ?? firstChangedLine(hunk) ?? hunk.newStart;
242
- const body = await ctx.ui.editor(`Draft review comment for ${file.path}`, commentSeed(file.path, hunk.id, lineNumber));
243
- if (!body || !body.trim())
244
- continue;
245
- addDraftComment(session, createDraftComment({
246
- session,
247
- file: file.path,
248
- body: body.trim(),
249
- line: lineNumber,
250
- hunkId: previewLine?.hunkId ?? hunk.id,
251
- previewLineId: previewLine?.id,
252
- oldNum: previewLine?.oldNum,
253
- newNum: previewLine?.newNum,
254
- lineType: previewLine?.kind === "hunk-header" ? undefined : previewLine?.kind,
255
- }));
256
- syncPreviewSelection(session, diff);
257
- persistReviewDiffSession(pi, session);
258
- continue;
259
- }
260
- if (action.type === "edit-comment") {
261
- const selected = getSelectedComment(session);
262
- if (!selected) {
263
- ctx.ui.notify("No drafted comment selected. Press c to draft one first, or Tab to Comments.", "warning");
264
- continue;
265
- }
266
- const body = await ctx.ui.editor(`Edit ${selected.id}`, selected.body);
267
- if (!body || !body.trim())
268
- continue;
269
- editSelectedComment(session, body.trim());
270
- selectPreviewLineForComment(session, diff);
271
- persistReviewDiffSession(pi, session);
272
- continue;
273
- }
274
- if (action.type === "open-location") {
275
- const location = buildSelectedLocationText(diff, session);
276
- if (!location) {
277
- ctx.ui.notify("No selected review location to open", "warning");
278
- continue;
279
- }
280
- ctx.ui.setEditorText(location);
281
- ctx.ui.notify("Selected review location loaded into the editor", "info");
282
- persistReviewDiffSession(pi, session);
283
- return;
284
- }
285
- if (action.type === "copy-location") {
286
- const location = buildSelectedLocationText(diff, session);
287
- if (!location) {
288
- ctx.ui.notify("No selected review location to copy", "warning");
289
- continue;
290
- }
291
- try {
292
- await copyTextToClipboard(location);
293
- ctx.ui.notify("Selected review location copied to clipboard", "info");
294
- }
295
- catch {
296
- ctx.ui.setEditorText(location);
297
- ctx.ui.notify("Clipboard unavailable; selected review location loaded into the editor", "warning");
298
- }
299
- persistReviewDiffSession(pi, session);
300
- continue;
301
- }
302
- if (action.type === "delete-comment") {
303
- const removed = deleteSelectedComment(session);
304
- if (removed)
305
- ctx.ui.notify(`Removed ${removed.id}`, "info");
306
- selectPreviewLineForComment(session, diff);
307
- syncPreviewSelection(session, diff);
308
- persistReviewDiffSession(pi, session);
309
- continue;
310
- }
311
- if (action.type === "submit") {
312
- const comments = getSubmittableComments(session);
313
- if (comments.length === 0) {
314
- ctx.ui.notify("No approved comments selected for submission", "warning");
315
- continue;
316
- }
317
- const prompt = buildReviewDiffPrompt(diff, session);
318
- if (typeof ctx.isIdle === "function" && !ctx.isIdle()) {
319
- pi.sendUserMessage(prompt, { deliverAs: "followUp" });
320
- }
321
- else {
322
- pi.sendUserMessage(prompt);
323
- }
324
- session.submittedAt = Date.now();
325
- persistReviewDiffSession(pi, session);
326
- pi.sendMessage?.({
327
- customType: "review-diff-submit",
328
- content: `${comments.length} comment(s) queued for Pi from ${session.mode.type === "branch" ? `${session.mode.base}...HEAD` : "working tree"}`,
329
- display: true,
330
- details: { commentCount: comments.length, mode: session.mode },
331
- });
332
- ctx.ui.notify(`Queued ${comments.length} review comment(s) for Pi`, "info");
333
- return;
334
- }
335
- }
336
- }
337
- async function openReviewDiffPane(ctx, cwd, diff, session) {
338
- const { ReviewDiffPane } = await import("./tui.js");
339
- let liveDiff = diff;
340
- let liveSession = session;
341
- const action = await ctx.ui.custom((tui, theme, _kb, done) => {
342
- const pane = new ReviewDiffPane(liveDiff, liveSession, theme, done, {
343
- requestRender: () => tui.requestRender(),
344
- });
345
- let interval = setInterval(() => {
346
- const refreshed = loadReviewDiff(cwd, liveSession.mode);
347
- if (!refreshed.ok || refreshed.diff.raw === liveDiff.raw)
348
- return;
349
- liveDiff = refreshed.diff;
350
- liveSession = syncReviewDiffSession(liveSession, liveDiff);
351
- syncPreviewSelection(liveSession, liveDiff);
352
- pane.updateReviewState(liveDiff, liveSession);
353
- tui.requestRender();
354
- }, REVIEW_DIFF_POLL_MS);
355
- return {
356
- render: (width) => pane.render(width),
357
- invalidate: () => pane.invalidate(),
358
- handleInput: (data) => {
359
- pane.handleInput(data);
360
- tui.requestRender();
361
- },
362
- dispose: () => {
363
- if (interval) {
364
- clearInterval(interval);
365
- interval = null;
366
- }
367
- },
368
- };
369
- }, {
370
- overlay: true,
371
- overlayOptions: {
372
- anchor: "center",
373
- width: "100%",
374
- minWidth: 84,
375
- maxHeight: "94%",
376
- margin: 1,
377
- },
378
- });
379
- return { action, diff: liveDiff, session: liveSession };
380
- }
381
- function parseReviewDiffArgs(args, previousMode) {
382
- const trimmed = args?.trim() ?? "";
383
- if (!trimmed)
384
- return previousMode ?? { type: "working-tree" };
385
- if (trimmed === "working-tree" || trimmed === "worktree")
386
- return { type: "working-tree" };
387
- const tokens = trimmed.split(/\s+/).filter(Boolean);
388
- if (tokens[0] === "--base") {
389
- if (!tokens[1] || tokens.length > 2) {
390
- throw new Error("Usage: /review-diff [working-tree|--base <branch>|<branch>]");
391
- }
392
- return { type: "branch", base: tokens[1] };
393
- }
394
- if (tokens.length === 1)
395
- return { type: "branch", base: tokens[0] };
396
- throw new Error("Usage: /review-diff [working-tree|--base <branch>|<branch>]");
397
- }
398
- function listGitBranches(cwd) {
399
- try {
400
- const raw = execFileSync("git", ["branch", "--format=%(refname:short)"], {
401
- cwd,
402
- encoding: "utf8",
403
- stdio: ["ignore", "pipe", "pipe"],
404
- });
405
- return raw
406
- .split("\n")
407
- .map((line) => line.trim())
408
- .filter(Boolean);
409
- }
410
- catch {
411
- return [];
412
- }
413
- }
414
- function sameMode(left, right) {
415
- if (left.type !== right.type)
416
- return false;
417
- if (left.type === "branch" && right.type === "branch")
418
- return left.base === right.base;
419
- return true;
420
- }
421
- function loadReviewDiff(cwd, mode) {
422
- try {
423
- return { ok: true, diff: readGitDiff(cwd, mode) };
424
- }
425
- catch (error) {
426
- return { ok: false, message: formatReviewDiffError(error, mode) };
427
- }
428
- }
429
- function formatReviewDiffError(error, mode) {
430
- const target = mode.type === "branch" ? `${mode.base}...HEAD` : "working tree";
431
- const detail = extractGitErrorDetail(error);
432
- if (!detail) {
433
- return `Could not read git diff for ${target}.`;
434
- }
435
- const normalized = detail.toLowerCase();
436
- if (normalized.includes("bad revision") ||
437
- normalized.includes("unknown revision") ||
438
- normalized.includes("ambiguous argument") ||
439
- normalized.includes("unknown option")) {
440
- return `Could not read git diff for ${target}. Verify the branch or ref exists.`;
441
- }
442
- return `Could not read git diff for ${target}: ${detail}`;
443
- }
444
- function extractGitErrorDetail(error) {
445
- if (error instanceof Error)
446
- return error.message;
447
- if (!error || typeof error !== "object") {
448
- return String(error ?? "").trim();
449
- }
450
- const stderr = "stderr" in error ? error.stderr : undefined;
451
- if (typeof stderr === "string" && stderr.trim())
452
- return stderr.trim();
453
- if (Buffer.isBuffer(stderr) && stderr.byteLength > 0)
454
- return stderr.toString("utf8").trim();
455
- const message = "message" in error ? error.message : undefined;
456
- return typeof message === "string" ? message.trim() : "";
457
- }
458
- function notifyReviewDiff(pi, ctx, message, level) {
459
- if (ctx?.ui && typeof ctx.ui.notify === "function") {
460
- ctx.ui.notify(message, level);
461
- return;
462
- }
463
- if (typeof pi.sendMessage === "function") {
464
- pi.sendMessage({
465
- customType: "review-diff-status",
466
- content: message,
467
- display: true,
468
- details: { level },
469
- });
470
- return;
471
- }
472
- console.warn(`review-diff (${level}): ${message}`);
473
- }
474
- function buildSelectedLocationText(diff, session) {
475
- const file = getSelectedFile(diff, session);
476
- const hunk = getSelectedHunk(diff, session);
477
- const previewLine = getSelectedPreviewLine(diff, session);
478
- if (!file)
479
- return null;
480
- const line = previewLine?.newNum ?? previewLine?.oldNum ?? (hunk ? (firstChangedLine(hunk) ?? hunk.newStart) : null);
481
- const hunkText = hunk ? `\nHunk: ${hunk.id} ${hunk.header}` : "";
482
- const selectedText = previewLine ? `\nSelected line (${previewLine.kind}): ${previewLine.content}` : "";
483
- return `Review this location:\n\nFile: ${file.path}${line ? `:${line}` : ""}${hunkText}${selectedText}\n\nTask: Inspect this code location in the current git diff and explain what should be changed, if anything.`;
484
- }
485
- function firstChangedLine(hunk) {
486
- const changed = hunk.lines.find((line) => line.type === "add" || line.type === "del");
487
- return changed?.newNum ?? changed?.oldNum ?? null;
488
- }
489
- function commentSeed(file, hunkId, line) {
490
- return `Comment on ${file}${line ? `:${line}` : ""} (${hunkId})\n\n`;
491
- }
492
- //# sourceMappingURL=command.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/review/command.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import type { ReviewDiff } from "./git.js";
2
- export interface ReviewExportOptions {
3
- includeRawDiff?: boolean;
4
- maxLinesPerHunk?: number;
5
- }
6
- export declare function formatReviewMarkdown(diff: ReviewDiff, options?: ReviewExportOptions): string;
7
- //# sourceMappingURL=export.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/review/export.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA0D,MAAM,UAAU,CAAC;AAEnG,MAAM,WAAW,mBAAmB;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,CAkDhG"}
@@ -1,74 +0,0 @@
1
- export function formatReviewMarkdown(diff, options = {}) {
2
- const maxLinesPerHunk = options.maxLinesPerHunk ?? 80;
3
- const lines = [];
4
- lines.push("# Code Review Context");
5
- lines.push("");
6
- lines.push(`Mode: ${formatMode(diff.mode)}`);
7
- lines.push(`Files changed: ${diff.files.length}`);
8
- lines.push("");
9
- if (diff.files.length === 0) {
10
- lines.push("No changes found.");
11
- return lines.join("\n");
12
- }
13
- lines.push("## Review instructions for an agent");
14
- lines.push("");
15
- 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.");
16
- lines.push("");
17
- lines.push("## Changed files");
18
- lines.push("");
19
- for (const file of diff.files) {
20
- lines.push(formatFileSummary(file));
21
- }
22
- lines.push("");
23
- for (const file of diff.files) {
24
- lines.push(`## ${file.path}`);
25
- lines.push("");
26
- lines.push(`Status: ${file.status}`);
27
- if (file.oldPath && file.oldPath !== file.path)
28
- lines.push(`Old path: ${file.oldPath}`);
29
- lines.push("");
30
- for (const hunk of file.hunks) {
31
- lines.push(formatHunk(file, hunk, maxLinesPerHunk));
32
- lines.push("");
33
- }
34
- }
35
- if (options.includeRawDiff && diff.raw.trim()) {
36
- lines.push("## Raw diff");
37
- lines.push("");
38
- lines.push("```diff");
39
- lines.push(diff.raw.trimEnd());
40
- lines.push("```");
41
- }
42
- return `${lines.join("\n").trimEnd()}\n`;
43
- }
44
- function formatMode(mode) {
45
- return mode.type === "branch" ? `branch (${mode.base}...HEAD)` : "working tree";
46
- }
47
- function formatFileSummary(file) {
48
- const additions = countLines(file, "add");
49
- const deletions = countLines(file, "del");
50
- return `- ${file.path} (${file.status}, +${additions}/-${deletions}, ${file.hunks.length} hunks)`;
51
- }
52
- function countLines(file, type) {
53
- return file.hunks.reduce((sum, hunk) => sum + hunk.lines.filter((line) => line.type === type).length, 0);
54
- }
55
- function formatHunk(file, hunk, maxLines) {
56
- const lines = [];
57
- lines.push(`### ${file.path}:${hunk.newStart}`);
58
- lines.push("");
59
- lines.push("```diff");
60
- lines.push(hunk.header);
61
- const visible = hunk.lines.slice(0, maxLines);
62
- for (const line of visible) {
63
- const marker = line.type === "add" ? "+" : line.type === "del" ? "-" : " ";
64
- const number = line.type === "del" ? line.oldNum : line.newNum;
65
- const gutter = number === null ? "" : String(number).padStart(4, " ");
66
- lines.push(`${marker}${gutter} ${line.content}`);
67
- }
68
- if (hunk.lines.length > visible.length) {
69
- lines.push(` … ${hunk.lines.length - visible.length} more changed/context lines omitted`);
70
- }
71
- lines.push("```");
72
- return lines.join("\n");
73
- }
74
- //# sourceMappingURL=export.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/review/export.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-preview.d.ts","sourceRoot":"","sources":["../../src/review/file-preview.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAKrD,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"}