claude-code-plus-plus 0.3.1 → 0.4.1

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 (70) hide show
  1. package/dist/constants.d.ts +6 -1
  2. package/dist/constants.d.ts.map +1 -1
  3. package/dist/constants.js +7 -2
  4. package/dist/constants.js.map +1 -1
  5. package/dist/diff/diff-handler.d.ts +15 -0
  6. package/dist/diff/diff-handler.d.ts.map +1 -0
  7. package/dist/diff/diff-handler.js +235 -0
  8. package/dist/diff/diff-handler.js.map +1 -0
  9. package/dist/diff/diff-manager.d.ts +63 -0
  10. package/dist/diff/diff-manager.d.ts.map +1 -0
  11. package/dist/diff/diff-manager.js +271 -0
  12. package/dist/diff/diff-manager.js.map +1 -0
  13. package/dist/diff/diff-pane-render.d.ts +34 -0
  14. package/dist/diff/diff-pane-render.d.ts.map +1 -0
  15. package/dist/diff/diff-pane-render.js +222 -0
  16. package/dist/diff/diff-pane-render.js.map +1 -0
  17. package/dist/diff/file-diff-content-handler.d.ts +16 -0
  18. package/dist/diff/file-diff-content-handler.d.ts.map +1 -0
  19. package/dist/diff/file-diff-content-handler.js +142 -0
  20. package/dist/diff/file-diff-content-handler.js.map +1 -0
  21. package/dist/diff/file-diff-header-handler.d.ts +16 -0
  22. package/dist/diff/file-diff-header-handler.d.ts.map +1 -0
  23. package/dist/diff/file-diff-header-handler.js +191 -0
  24. package/dist/diff/file-diff-header-handler.js.map +1 -0
  25. package/dist/diff/file-diff-header-render.d.ts +30 -0
  26. package/dist/diff/file-diff-header-render.d.ts.map +1 -0
  27. package/dist/diff/file-diff-header-render.js +101 -0
  28. package/dist/diff/file-diff-header-render.js.map +1 -0
  29. package/dist/diff/file-diff-render.d.ts +27 -0
  30. package/dist/diff/file-diff-render.d.ts.map +1 -0
  31. package/dist/diff/file-diff-render.js +211 -0
  32. package/dist/diff/file-diff-render.js.map +1 -0
  33. package/dist/diff/git-diff.d.ts +54 -0
  34. package/dist/diff/git-diff.d.ts.map +1 -0
  35. package/dist/diff/git-diff.js +599 -0
  36. package/dist/diff/git-diff.js.map +1 -0
  37. package/dist/diff/index.d.ts +8 -0
  38. package/dist/diff/index.d.ts.map +1 -0
  39. package/dist/diff/index.js +37 -0
  40. package/dist/diff/index.js.map +1 -0
  41. package/dist/git/worktree.d.ts +11 -0
  42. package/dist/git/worktree.d.ts.map +1 -1
  43. package/dist/git/worktree.js +86 -0
  44. package/dist/git/worktree.js.map +1 -1
  45. package/dist/sidebar/app.d.ts +69 -0
  46. package/dist/sidebar/app.d.ts.map +1 -1
  47. package/dist/sidebar/app.js +508 -10
  48. package/dist/sidebar/app.js.map +1 -1
  49. package/dist/sidebar/commands.d.ts +1 -0
  50. package/dist/sidebar/commands.d.ts.map +1 -1
  51. package/dist/sidebar/commands.js +11 -0
  52. package/dist/sidebar/commands.js.map +1 -1
  53. package/dist/sidebar/pane-orchestrator.d.ts.map +1 -1
  54. package/dist/sidebar/pane-orchestrator.js +10 -1
  55. package/dist/sidebar/pane-orchestrator.js.map +1 -1
  56. package/dist/sidebar/render.d.ts.map +1 -1
  57. package/dist/sidebar/render.js +2 -1
  58. package/dist/sidebar/render.js.map +1 -1
  59. package/dist/tmux/index.d.ts +1 -1
  60. package/dist/tmux/index.d.ts.map +1 -1
  61. package/dist/tmux/index.js +2 -1
  62. package/dist/tmux/index.js.map +1 -1
  63. package/dist/tmux/pane.d.ts +5 -0
  64. package/dist/tmux/pane.d.ts.map +1 -1
  65. package/dist/tmux/pane.js +10 -0
  66. package/dist/tmux/pane.js.map +1 -1
  67. package/dist/types.d.ts +10 -0
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/types.js.map +1 -1
  70. package/package.json +1 -1
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ /**
3
+ * Diff Pane Manager
4
+ *
5
+ * Handles creating, updating, and closing the diff pane.
6
+ * Manages the diff handler process lifecycle.
7
+ * Also manages file diff header pane for viewing individual file diffs.
8
+ */
9
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ var desc = Object.getOwnPropertyDescriptor(m, k);
12
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
13
+ desc = { enumerable: true, get: function() { return m[k]; } };
14
+ }
15
+ Object.defineProperty(o, k2, desc);
16
+ }) : (function(o, m, k, k2) {
17
+ if (k2 === undefined) k2 = k;
18
+ o[k2] = m[k];
19
+ }));
20
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
21
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
22
+ }) : function(o, v) {
23
+ o["default"] = v;
24
+ });
25
+ var __importStar = (this && this.__importStar) || (function () {
26
+ var ownKeys = function(o) {
27
+ ownKeys = Object.getOwnPropertyNames || function (o) {
28
+ var ar = [];
29
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
30
+ return ar;
31
+ };
32
+ return ownKeys(o);
33
+ };
34
+ return function (mod) {
35
+ if (mod && mod.__esModule) return mod;
36
+ var result = {};
37
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
38
+ __setModuleDefault(result, mod);
39
+ return result;
40
+ };
41
+ })();
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ exports.createDiffPane = createDiffPane;
44
+ exports.startDiffHandler = startDiffHandler;
45
+ exports.updateDiffPane = updateDiffPane;
46
+ exports.closeDiffPane = closeDiffPane;
47
+ exports.breakDiffPane = breakDiffPane;
48
+ exports.joinDiffPane = joinDiffPane;
49
+ exports.createFileDiffContentPane = createFileDiffContentPane;
50
+ exports.createFileDiffHeaderPane = createFileDiffHeaderPane;
51
+ exports.startFileDiffHeaderHandler = startFileDiffHeaderHandler;
52
+ exports.closeFileDiffHeaderPane = closeFileDiffHeaderPane;
53
+ exports.closeFileDiffContentPane = closeFileDiffContentPane;
54
+ exports.startFileDiffContentHandler = startFileDiffContentHandler;
55
+ const fs_1 = require("fs");
56
+ const path_1 = require("path");
57
+ const tmux = __importStar(require("../tmux"));
58
+ const constants_1 = require("../constants");
59
+ // ============================================================================
60
+ // Constants
61
+ // ============================================================================
62
+ /** Height of the file diff header pane (1 row) */
63
+ const FILE_HEADER_HEIGHT = 1;
64
+ // ============================================================================
65
+ // Pane Operations
66
+ // ============================================================================
67
+ /**
68
+ * Create the diff pane to the right of the Claude pane
69
+ * Returns the new pane ID
70
+ */
71
+ function createDiffPane(sessionName, claudePaneId) {
72
+ // Select the Claude pane first
73
+ tmux.selectPane(claudePaneId);
74
+ // Split horizontally to create a pane to the right
75
+ // We want the diff pane to take DIFF_PANE_WIDTH columns
76
+ // split-window -p means percentage for the NEW pane
77
+ const paneId = tmux.splitHorizontal(sessionName, 100 - constants_1.DIFF_PANE_WIDTH);
78
+ // Resize to exact width
79
+ tmux.resizePane(paneId, constants_1.DIFF_PANE_WIDTH);
80
+ return paneId;
81
+ }
82
+ /**
83
+ * Start the diff handler process in a pane
84
+ * Note: We start without initial files - send RENDER command after handler starts
85
+ */
86
+ function startDiffHandler(diffPaneId, sidebarPaneId, sessionId, worktreePath, initialFiles) {
87
+ // Get path to diff-handler - check for .ts first (dev mode), then .js (compiled)
88
+ const tsPath = (0, path_1.resolve)(__dirname, 'diff-handler.ts');
89
+ const jsPath = (0, path_1.resolve)(__dirname, 'diff-handler.js');
90
+ let cmd;
91
+ const escapedPath = worktreePath.replace(/'/g, "'\\''");
92
+ // Start without initial state to avoid long command line issues
93
+ const args = `"${sidebarPaneId}" "${sessionId}" '${escapedPath}'`;
94
+ // Check which file exists
95
+ if ((0, fs_1.existsSync)(tsPath)) {
96
+ cmd = `npx tsx "${tsPath}" ${args}`;
97
+ }
98
+ else if ((0, fs_1.existsSync)(jsPath)) {
99
+ cmd = `node "${jsPath}" ${args}`;
100
+ }
101
+ else {
102
+ console.error('diff-handler not found at', tsPath, 'or', jsPath);
103
+ return;
104
+ }
105
+ tmux.sendKeys(diffPaneId, cmd, true);
106
+ // Send initial files after a short delay for handler to start
107
+ if (initialFiles && initialFiles.length > 0) {
108
+ setTimeout(() => {
109
+ updateDiffPane(diffPaneId, initialFiles);
110
+ }, 500);
111
+ }
112
+ }
113
+ /**
114
+ * Send updated file list to the diff handler
115
+ */
116
+ function updateDiffPane(diffPaneId, files) {
117
+ const renderData = JSON.stringify({ files });
118
+ // Send render command to diff handler
119
+ tmux.sendKeys(diffPaneId, `RENDER:${renderData}`, false);
120
+ }
121
+ /**
122
+ * Close the diff pane
123
+ */
124
+ function closeDiffPane(diffPaneId) {
125
+ try {
126
+ tmux.killPane(diffPaneId);
127
+ }
128
+ catch {
129
+ // Pane may already be closed
130
+ }
131
+ }
132
+ /**
133
+ * Break the diff pane to background (for session switching or fullscreen)
134
+ */
135
+ function breakDiffPane(diffPaneId) {
136
+ try {
137
+ tmux.breakPane(diffPaneId);
138
+ }
139
+ catch {
140
+ // Pane may not exist
141
+ }
142
+ }
143
+ /**
144
+ * Join the diff pane back (after session switching or fullscreen)
145
+ */
146
+ function joinDiffPane(diffPaneId, claudePaneId) {
147
+ try {
148
+ // Join to the right of Claude pane
149
+ tmux.joinPane(diffPaneId, claudePaneId, true);
150
+ // Resize to correct width
151
+ tmux.resizePane(diffPaneId, constants_1.DIFF_PANE_WIDTH);
152
+ }
153
+ catch {
154
+ // Pane may not exist
155
+ }
156
+ }
157
+ // ============================================================================
158
+ // File Diff Header Pane Operations
159
+ // ============================================================================
160
+ /**
161
+ * Create the file diff content pane (fills Claude pane's space)
162
+ * Returns the content pane ID
163
+ */
164
+ function createFileDiffContentPane(sessionName, sidebarPaneId) {
165
+ // Split from sidebar to create a new pane to the right (fills available space)
166
+ tmux.selectPane(sidebarPaneId);
167
+ const contentPaneId = tmux.splitHorizontal(sessionName, 20); // sidebar keeps 20%, content gets 80%
168
+ return contentPaneId;
169
+ }
170
+ /**
171
+ * Create the file diff header pane (1-row above content pane)
172
+ * Returns the header pane ID
173
+ */
174
+ function createFileDiffHeaderPane(sessionName, contentPaneId) {
175
+ // Select the content pane and split at top for header
176
+ tmux.selectPane(contentPaneId);
177
+ // Split vertically - header gets 1 row at top
178
+ const headerPaneId = tmux.splitVertical(sessionName, 95); // content keeps 95%, header gets 5%
179
+ // The splitVertical creates new pane BELOW, we need to swap them
180
+ // Actually, split creates pane below, so headerPaneId is below contentPaneId
181
+ // We need to resize the headerPaneId to 1 row (it's at the bottom after split)
182
+ // Actually we want header at top, so let's split differently
183
+ // Let's resize the new pane (which is at bottom) to take most height
184
+ // Then swap so header is at top
185
+ tmux.swapPanes(contentPaneId, headerPaneId);
186
+ // Now resize the header (which is now at top) to 1 row
187
+ tmux.resizePane(contentPaneId, undefined, FILE_HEADER_HEIGHT);
188
+ // Wait, this is getting confusing. Let me think again...
189
+ // Actually after split -v, the NEW pane is created below the current pane
190
+ // So if contentPaneId was selected, the new pane (headerPaneId) is below it
191
+ // We want header above content, so swap them
192
+ // After swap, contentPaneId is below, headerPaneId is above
193
+ // But the IDs don't change - contentPaneId is now the bottom pane (content)
194
+ // and headerPaneId is now the top pane (header)
195
+ // So we resize headerPaneId to 1 row
196
+ tmux.resizePane(headerPaneId, undefined, FILE_HEADER_HEIGHT);
197
+ return headerPaneId;
198
+ }
199
+ /**
200
+ * Start the file diff header handler in a pane
201
+ */
202
+ function startFileDiffHeaderHandler(headerPaneId, sidebarPaneId, filename, insertions, deletions, mode = 'whole-file') {
203
+ // Get path to file-diff-header-handler
204
+ const tsPath = (0, path_1.resolve)(__dirname, 'file-diff-header-handler.ts');
205
+ const jsPath = (0, path_1.resolve)(__dirname, 'file-diff-header-handler.js');
206
+ let cmd;
207
+ const escapedFilename = filename.replace(/'/g, "'\\''");
208
+ const args = `"${sidebarPaneId}" '${escapedFilename}' ${insertions} ${deletions} ${mode}`;
209
+ // Check which file exists
210
+ if ((0, fs_1.existsSync)(tsPath)) {
211
+ cmd = `npx tsx "${tsPath}" ${args}`;
212
+ }
213
+ else if ((0, fs_1.existsSync)(jsPath)) {
214
+ cmd = `node "${jsPath}" ${args}`;
215
+ }
216
+ else {
217
+ console.error('file-diff-header-handler not found at', tsPath, 'or', jsPath);
218
+ return;
219
+ }
220
+ tmux.sendKeys(headerPaneId, cmd, true);
221
+ }
222
+ /**
223
+ * Close the file diff header pane
224
+ */
225
+ function closeFileDiffHeaderPane(headerPaneId) {
226
+ try {
227
+ tmux.killPane(headerPaneId);
228
+ }
229
+ catch {
230
+ // Pane may already be closed
231
+ }
232
+ }
233
+ /**
234
+ * Close the file diff content pane
235
+ */
236
+ function closeFileDiffContentPane(contentPaneId) {
237
+ try {
238
+ tmux.killPane(contentPaneId);
239
+ }
240
+ catch {
241
+ // Pane may already be closed
242
+ }
243
+ }
244
+ /**
245
+ * Start the file diff content handler in a pane
246
+ * This streams the full file with inline diffs and handles Esc to close
247
+ */
248
+ function startFileDiffContentHandler(contentPaneId, sidebarPaneId, repoPath, filename, mode = 'whole-file') {
249
+ // Get path to file-diff-content-handler
250
+ const tsPath = (0, path_1.resolve)(__dirname, 'file-diff-content-handler.ts');
251
+ const jsPath = (0, path_1.resolve)(__dirname, 'file-diff-content-handler.js');
252
+ let handlerCmd;
253
+ const escapedPath = repoPath.replace(/'/g, "'\\''");
254
+ const escapedFilename = filename.replace(/'/g, "'\\''");
255
+ const args = `"${sidebarPaneId}" '${escapedPath}' '${escapedFilename}' ${mode}`;
256
+ // Check which file exists
257
+ if ((0, fs_1.existsSync)(tsPath)) {
258
+ handlerCmd = `npx tsx "${tsPath}" ${args}`;
259
+ }
260
+ else if ((0, fs_1.existsSync)(jsPath)) {
261
+ handlerCmd = `node "${jsPath}" ${args}`;
262
+ }
263
+ else {
264
+ console.error('file-diff-content-handler not found at', tsPath, 'or', jsPath);
265
+ return;
266
+ }
267
+ // Use respawnPane to run command directly without shell echo
268
+ // This prevents the command from being visible in the terminal
269
+ tmux.respawnPane(contentPaneId, handlerCmd);
270
+ }
271
+ //# sourceMappingURL=diff-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-manager.js","sourceRoot":"","sources":["../../src/diff/diff-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Diff Pane Rendering
3
+ *
4
+ * Pure functions for rendering the diff file list in the right pane.
5
+ * Shows changed files with change type indicators and +/- counts.
6
+ */
7
+ import type { DiffFileSummary } from './git-diff';
8
+ export interface FilePosition {
9
+ index: number;
10
+ startRow: number;
11
+ endRow: number;
12
+ }
13
+ /**
14
+ * Render the diff pane showing the file list
15
+ *
16
+ * @param files - Array of changed files
17
+ * @param selectedIndex - Currently selected file index
18
+ * @param width - Available width in columns
19
+ * @param height - Available height in rows
20
+ * @returns Object with ANSI output string and file positions for click handling
21
+ */
22
+ export declare function renderDiffPane(files: DiffFileSummary[], selectedIndex: number, width: number, height: number): {
23
+ output: string;
24
+ filePositions: FilePosition[];
25
+ };
26
+ /**
27
+ * Find which file was clicked based on row position
28
+ *
29
+ * @param row - Row position of click (1-indexed)
30
+ * @param filePositions - Array of file positions
31
+ * @returns File index or null if no file clicked
32
+ */
33
+ export declare function findClickedFile(row: number, filePositions: FilePosition[]): number | null;
34
+ //# sourceMappingURL=diff-pane-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-pane-render.d.ts","sourceRoot":"","sources":["../../src/diff/diff-pane-render.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,YAAY,CAAC;AAO9D,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AA0DD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,eAAe,EAAE,EACxB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,YAAY,EAAE,CAAA;CAAE,CAsHnD;AA0CD;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,MAAM,GAAG,IAAI,CAOzF"}
@@ -0,0 +1,222 @@
1
+ "use strict";
2
+ /**
3
+ * Diff Pane Rendering
4
+ *
5
+ * Pure functions for rendering the diff file list in the right pane.
6
+ * Shows changed files with change type indicators and +/- counts.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.renderDiffPane = renderDiffPane;
10
+ exports.findClickedFile = findClickedFile;
11
+ const ansi_1 = require("../ansi");
12
+ // ============================================================================
13
+ // Helpers
14
+ // ============================================================================
15
+ /**
16
+ * Get display character and color for change type
17
+ */
18
+ function getChangeTypeDisplay(changeType) {
19
+ switch (changeType) {
20
+ case 'M':
21
+ return { char: 'M', color: ansi_1.ansi.fg.yellow };
22
+ case 'A':
23
+ return { char: 'A', color: ansi_1.ansi.fg.green };
24
+ case 'D':
25
+ return { char: 'D', color: ansi_1.ansi.fg.red };
26
+ case 'R':
27
+ return { char: 'R', color: ansi_1.ansi.fg.magenta };
28
+ case 'C':
29
+ return { char: 'C', color: ansi_1.ansi.fg.cyan };
30
+ case 'U':
31
+ return { char: 'U', color: ansi_1.ansi.fg.red };
32
+ case '?':
33
+ return { char: '?', color: ansi_1.ansi.fg.gray };
34
+ default:
35
+ return { char: ' ', color: '' };
36
+ }
37
+ }
38
+ /**
39
+ * Get display name: always just the filename (basename)
40
+ */
41
+ function getDisplayName(filepath) {
42
+ const parts = filepath.split('/');
43
+ return parts[parts.length - 1];
44
+ }
45
+ /**
46
+ * Truncate string to fit width
47
+ */
48
+ function truncatePath(str, maxLen) {
49
+ if (str.length <= maxLen)
50
+ return str;
51
+ return str.slice(0, maxLen - 1) + '…';
52
+ }
53
+ /**
54
+ * Pad string to width
55
+ */
56
+ function pad(str, width) {
57
+ if (str.length >= width)
58
+ return str;
59
+ return str + ' '.repeat(width - str.length);
60
+ }
61
+ // ============================================================================
62
+ // Rendering
63
+ // ============================================================================
64
+ /**
65
+ * Render the diff pane showing the file list
66
+ *
67
+ * @param files - Array of changed files
68
+ * @param selectedIndex - Currently selected file index
69
+ * @param width - Available width in columns
70
+ * @param height - Available height in rows
71
+ * @returns Object with ANSI output string and file positions for click handling
72
+ */
73
+ function renderDiffPane(files, selectedIndex, width, height) {
74
+ const filePositions = [];
75
+ let output = ansi_1.ansi.hideCursor + ansi_1.ansi.clearScreen + ansi_1.ansi.moveTo(1, 1);
76
+ // Header
77
+ const title = 'Changed Files';
78
+ const titlePad = Math.max(0, Math.floor((width - title.length) / 2));
79
+ output += ' '.repeat(titlePad);
80
+ output += `${ansi_1.ansi.bold}${ansi_1.ansi.fg.cyan}${title}${ansi_1.ansi.reset}\n`;
81
+ output += `${ansi_1.ansi.dim}${'─'.repeat(width - 1)}${ansi_1.ansi.reset}\n`;
82
+ // Calculate space for file list (leave room for header, separator, and footer)
83
+ const headerRows = 2;
84
+ const footerRows = 3;
85
+ const listHeight = height - headerRows - footerRows;
86
+ if (files.length === 0) {
87
+ output += ansi_1.ansi.moveTo(headerRows + 2, 1);
88
+ output += `${ansi_1.ansi.dim}No changes detected${ansi_1.ansi.reset}\n`;
89
+ output += '\n';
90
+ output += `${ansi_1.ansi.dim}Make some changes to${ansi_1.ansi.reset}\n`;
91
+ output += `${ansi_1.ansi.dim}see them here.${ansi_1.ansi.reset}`;
92
+ // Footer
93
+ output += ansi_1.ansi.moveTo(height - 2, 1);
94
+ output += `${ansi_1.ansi.dim}${'─'.repeat(width - 1)}${ansi_1.ansi.reset}\n`;
95
+ output += `${ansi_1.ansi.dim}Esc close${ansi_1.ansi.reset}`;
96
+ return { output, filePositions };
97
+ }
98
+ // Calculate visible window
99
+ const visibleStart = Math.max(0, selectedIndex - Math.floor(listHeight / 2));
100
+ const visibleEnd = Math.min(files.length, visibleStart + listHeight);
101
+ // File list
102
+ for (let i = visibleStart; i < visibleEnd; i++) {
103
+ const file = files[i];
104
+ const isSelected = i === selectedIndex;
105
+ const row = headerRows + 1 + (i - visibleStart);
106
+ // Track position for click handling
107
+ filePositions.push({
108
+ index: i,
109
+ startRow: row,
110
+ endRow: row,
111
+ });
112
+ output += ansi_1.ansi.moveTo(row, 1);
113
+ // Build the line content
114
+ // Format: "M filename +22 -10"
115
+ // ^-- change type (2 chars: char + space)
116
+ // ^-- filename (variable, padded)
117
+ // ^-- stats (right-aligned)
118
+ // Change type indicator
119
+ const { char, color } = getChangeTypeDisplay(file.changeType);
120
+ const typeStr = `${color}${char}${ansi_1.ansi.reset} `;
121
+ // Format stats FIRST to know actual width needed
122
+ let statsStr = '';
123
+ let statsVisibleLen = 0;
124
+ if (!file.binary && (file.insertions > 0 || file.deletions > 0)) {
125
+ statsStr = formatStatsPlain(file.insertions, file.deletions);
126
+ // Calculate visible length (strip ANSI codes)
127
+ statsVisibleLen = statsStr.replace(/\x1b\[[0-9;]*m/g, '').length;
128
+ }
129
+ else if (file.binary) {
130
+ statsStr = '[bin]';
131
+ statsVisibleLen = 5;
132
+ }
133
+ // Get display name (filename only)
134
+ const displayName = getDisplayName(file.file);
135
+ // Calculate available space for filename based on ACTUAL stats width
136
+ // Width - 2 (change type) - statsVisibleLen - 2 (min padding) - 1 (scroll bar space)
137
+ const maxFileLen = width - 2 - statsVisibleLen - 2 - 1;
138
+ const fileName = truncatePath(displayName, Math.max(5, maxFileLen));
139
+ // Calculate padding between filename and stats
140
+ const contentLen = fileName.length;
141
+ const padLen = Math.max(1, width - 2 - contentLen - statsVisibleLen - 1);
142
+ // Build the line (without type prefix for inverse calculation)
143
+ const lineContent = fileName + ' '.repeat(padLen) + statsStr;
144
+ // Apply selection highlight (inverse) to entire line content
145
+ if (isSelected) {
146
+ output += typeStr;
147
+ output += `${ansi_1.ansi.inverse}${lineContent}${ansi_1.ansi.reset}`;
148
+ }
149
+ else {
150
+ output += typeStr + lineContent;
151
+ }
152
+ output += '\n';
153
+ }
154
+ // Scroll indicator if needed
155
+ if (files.length > listHeight) {
156
+ const scrollPos = Math.floor((selectedIndex / (files.length - 1)) * (listHeight - 1));
157
+ for (let i = 0; i < listHeight; i++) {
158
+ output += ansi_1.ansi.moveTo(headerRows + 1 + i, width);
159
+ if (i === scrollPos) {
160
+ output += `${ansi_1.ansi.fg.cyan}█${ansi_1.ansi.reset}`;
161
+ }
162
+ else {
163
+ output += `${ansi_1.ansi.dim}│${ansi_1.ansi.reset}`;
164
+ }
165
+ }
166
+ }
167
+ // Footer
168
+ output += ansi_1.ansi.moveTo(height - 2, 1);
169
+ output += `${ansi_1.ansi.dim}${'─'.repeat(width - 1)}${ansi_1.ansi.reset}\n`;
170
+ output += `${ansi_1.ansi.dim}↵ view q close${ansi_1.ansi.reset}`;
171
+ return { output, filePositions };
172
+ }
173
+ /**
174
+ * Format insertion/deletion stats with colors (old version, kept for compatibility)
175
+ */
176
+ function formatStats(insertions, deletions, maxLen) {
177
+ let stats = '';
178
+ if (insertions > 0) {
179
+ const ins = insertions > 999 ? '999+' : String(insertions);
180
+ stats += `${ansi_1.ansi.fg.green}+${ins}${ansi_1.ansi.reset}`;
181
+ }
182
+ if (deletions > 0) {
183
+ if (stats)
184
+ stats += ' ';
185
+ const del = deletions > 999 ? '999+' : String(deletions);
186
+ stats += `${ansi_1.ansi.fg.red}-${del}${ansi_1.ansi.reset}`;
187
+ }
188
+ return stats;
189
+ }
190
+ /**
191
+ * Format insertion/deletion stats with colors (plain format for right-alignment)
192
+ */
193
+ function formatStatsPlain(insertions, deletions) {
194
+ let stats = '';
195
+ if (insertions > 0) {
196
+ const ins = insertions > 999 ? '999+' : String(insertions);
197
+ stats += `${ansi_1.ansi.fg.green}+${ins}${ansi_1.ansi.reset}`;
198
+ }
199
+ if (deletions > 0) {
200
+ if (stats)
201
+ stats += ' ';
202
+ const del = deletions > 999 ? '999+' : String(deletions);
203
+ stats += `${ansi_1.ansi.fg.red}-${del}${ansi_1.ansi.reset}`;
204
+ }
205
+ return stats;
206
+ }
207
+ /**
208
+ * Find which file was clicked based on row position
209
+ *
210
+ * @param row - Row position of click (1-indexed)
211
+ * @param filePositions - Array of file positions
212
+ * @returns File index or null if no file clicked
213
+ */
214
+ function findClickedFile(row, filePositions) {
215
+ for (const file of filePositions) {
216
+ if (row >= file.startRow && row <= file.endRow) {
217
+ return file.index;
218
+ }
219
+ }
220
+ return null;
221
+ }
222
+ //# sourceMappingURL=diff-pane-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff-pane-render.js","sourceRoot":"","sources":["../../src/diff/diff-pane-render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * File Diff Content Handler
4
+ *
5
+ * Process that runs in the file diff content pane.
6
+ * - Prints file content based on view mode (full file with inline diffs or diffs only)
7
+ * - Uses native tmux scrollback (mouse scroll works)
8
+ * - Handles Esc key to close (sends FILEDIFF:close to sidebar)
9
+ *
10
+ * Communication:
11
+ * - Sends actions to sidebar via tmux send-keys
12
+ *
13
+ * Usage: node file-diff-content-handler.js <sidebarPaneId> <repoPath> <filename> [mode]
14
+ */
15
+ export {};
16
+ //# sourceMappingURL=file-diff-content-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-diff-content-handler.d.ts","sourceRoot":"","sources":["../../src/diff/file-diff-content-handler.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;GAYG"}