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.
- package/dist/constants.d.ts +6 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +7 -2
- package/dist/constants.js.map +1 -1
- package/dist/diff/diff-handler.d.ts +15 -0
- package/dist/diff/diff-handler.d.ts.map +1 -0
- package/dist/diff/diff-handler.js +235 -0
- package/dist/diff/diff-handler.js.map +1 -0
- package/dist/diff/diff-manager.d.ts +63 -0
- package/dist/diff/diff-manager.d.ts.map +1 -0
- package/dist/diff/diff-manager.js +271 -0
- package/dist/diff/diff-manager.js.map +1 -0
- package/dist/diff/diff-pane-render.d.ts +34 -0
- package/dist/diff/diff-pane-render.d.ts.map +1 -0
- package/dist/diff/diff-pane-render.js +222 -0
- package/dist/diff/diff-pane-render.js.map +1 -0
- package/dist/diff/file-diff-content-handler.d.ts +16 -0
- package/dist/diff/file-diff-content-handler.d.ts.map +1 -0
- package/dist/diff/file-diff-content-handler.js +142 -0
- package/dist/diff/file-diff-content-handler.js.map +1 -0
- package/dist/diff/file-diff-header-handler.d.ts +16 -0
- package/dist/diff/file-diff-header-handler.d.ts.map +1 -0
- package/dist/diff/file-diff-header-handler.js +191 -0
- package/dist/diff/file-diff-header-handler.js.map +1 -0
- package/dist/diff/file-diff-header-render.d.ts +30 -0
- package/dist/diff/file-diff-header-render.d.ts.map +1 -0
- package/dist/diff/file-diff-header-render.js +101 -0
- package/dist/diff/file-diff-header-render.js.map +1 -0
- package/dist/diff/file-diff-render.d.ts +27 -0
- package/dist/diff/file-diff-render.d.ts.map +1 -0
- package/dist/diff/file-diff-render.js +211 -0
- package/dist/diff/file-diff-render.js.map +1 -0
- package/dist/diff/git-diff.d.ts +54 -0
- package/dist/diff/git-diff.d.ts.map +1 -0
- package/dist/diff/git-diff.js +599 -0
- package/dist/diff/git-diff.js.map +1 -0
- package/dist/diff/index.d.ts +8 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +37 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/git/worktree.d.ts +11 -0
- package/dist/git/worktree.d.ts.map +1 -1
- package/dist/git/worktree.js +86 -0
- package/dist/git/worktree.js.map +1 -1
- package/dist/sidebar/app.d.ts +69 -0
- package/dist/sidebar/app.d.ts.map +1 -1
- package/dist/sidebar/app.js +508 -10
- package/dist/sidebar/app.js.map +1 -1
- package/dist/sidebar/commands.d.ts +1 -0
- package/dist/sidebar/commands.d.ts.map +1 -1
- package/dist/sidebar/commands.js +11 -0
- package/dist/sidebar/commands.js.map +1 -1
- package/dist/sidebar/pane-orchestrator.d.ts.map +1 -1
- package/dist/sidebar/pane-orchestrator.js +10 -1
- package/dist/sidebar/pane-orchestrator.js.map +1 -1
- package/dist/sidebar/render.d.ts.map +1 -1
- package/dist/sidebar/render.js +2 -1
- package/dist/sidebar/render.js.map +1 -1
- package/dist/tmux/index.d.ts +1 -1
- package/dist/tmux/index.d.ts.map +1 -1
- package/dist/tmux/index.js +2 -1
- package/dist/tmux/index.js.map +1 -1
- package/dist/tmux/pane.d.ts +5 -0
- package/dist/tmux/pane.d.ts.map +1 -1
- package/dist/tmux/pane.js +10 -0
- package/dist/tmux/pane.js.map +1 -1
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- 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"}
|