gitx.do 0.0.2 → 0.0.3
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/cli/commands/blame.d.ts +259 -0
- package/dist/cli/commands/blame.d.ts.map +1 -0
- package/dist/cli/commands/blame.js +609 -0
- package/dist/cli/commands/blame.js.map +1 -0
- package/dist/cli/commands/branch.d.ts +249 -0
- package/dist/cli/commands/branch.d.ts.map +1 -0
- package/dist/cli/commands/branch.js +693 -0
- package/dist/cli/commands/branch.js.map +1 -0
- package/dist/cli/commands/commit.d.ts +182 -0
- package/dist/cli/commands/commit.d.ts.map +1 -0
- package/dist/cli/commands/commit.js +437 -0
- package/dist/cli/commands/commit.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +464 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +958 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/log.d.ts +239 -0
- package/dist/cli/commands/log.d.ts.map +1 -0
- package/dist/cli/commands/log.js +535 -0
- package/dist/cli/commands/log.js.map +1 -0
- package/dist/cli/commands/review.d.ts +457 -0
- package/dist/cli/commands/review.d.ts.map +1 -0
- package/dist/cli/commands/review.js +533 -0
- package/dist/cli/commands/review.js.map +1 -0
- package/dist/cli/commands/status.d.ts +269 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +493 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/web.d.ts +199 -0
- package/dist/cli/commands/web.d.ts.map +1 -0
- package/dist/cli/commands/web.js +696 -0
- package/dist/cli/commands/web.js.map +1 -0
- package/dist/cli/fs-adapter.d.ts +656 -0
- package/dist/cli/fs-adapter.d.ts.map +1 -0
- package/dist/cli/fs-adapter.js +1179 -0
- package/dist/cli/fs-adapter.js.map +1 -0
- package/dist/cli/index.d.ts +387 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +523 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui/components/DiffView.d.ts +7 -0
- package/dist/cli/ui/components/DiffView.d.ts.map +1 -0
- package/dist/cli/ui/components/DiffView.js +11 -0
- package/dist/cli/ui/components/DiffView.js.map +1 -0
- package/dist/cli/ui/components/ErrorDisplay.d.ts +6 -0
- package/dist/cli/ui/components/ErrorDisplay.d.ts.map +1 -0
- package/dist/cli/ui/components/ErrorDisplay.js +11 -0
- package/dist/cli/ui/components/ErrorDisplay.js.map +1 -0
- package/dist/cli/ui/components/FuzzySearch.d.ts +9 -0
- package/dist/cli/ui/components/FuzzySearch.d.ts.map +1 -0
- package/dist/cli/ui/components/FuzzySearch.js +12 -0
- package/dist/cli/ui/components/FuzzySearch.js.map +1 -0
- package/dist/cli/ui/components/LoadingSpinner.d.ts +6 -0
- package/dist/cli/ui/components/LoadingSpinner.d.ts.map +1 -0
- package/dist/cli/ui/components/LoadingSpinner.js +10 -0
- package/dist/cli/ui/components/LoadingSpinner.js.map +1 -0
- package/dist/cli/ui/components/NavigationList.d.ts +9 -0
- package/dist/cli/ui/components/NavigationList.d.ts.map +1 -0
- package/dist/cli/ui/components/NavigationList.js +11 -0
- package/dist/cli/ui/components/NavigationList.js.map +1 -0
- package/dist/cli/ui/components/ScrollableContent.d.ts +8 -0
- package/dist/cli/ui/components/ScrollableContent.d.ts.map +1 -0
- package/dist/cli/ui/components/ScrollableContent.js +11 -0
- package/dist/cli/ui/components/ScrollableContent.js.map +1 -0
- package/dist/cli/ui/components/index.d.ts +7 -0
- package/dist/cli/ui/components/index.d.ts.map +1 -0
- package/dist/cli/ui/components/index.js +9 -0
- package/dist/cli/ui/components/index.js.map +1 -0
- package/dist/cli/ui/terminal-ui.d.ts +52 -0
- package/dist/cli/ui/terminal-ui.d.ts.map +1 -0
- package/dist/cli/ui/terminal-ui.js +121 -0
- package/dist/cli/ui/terminal-ui.js.map +1 -0
- package/dist/durable-object/object-store.d.ts +401 -23
- package/dist/durable-object/object-store.d.ts.map +1 -1
- package/dist/durable-object/object-store.js +414 -25
- package/dist/durable-object/object-store.js.map +1 -1
- package/dist/durable-object/schema.d.ts +188 -0
- package/dist/durable-object/schema.d.ts.map +1 -1
- package/dist/durable-object/schema.js +160 -0
- package/dist/durable-object/schema.js.map +1 -1
- package/dist/durable-object/wal.d.ts +336 -31
- package/dist/durable-object/wal.d.ts.map +1 -1
- package/dist/durable-object/wal.js +272 -27
- package/dist/durable-object/wal.js.map +1 -1
- package/dist/index.d.ts +379 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +379 -7
- package/dist/index.js.map +1 -1
- package/dist/mcp/adapter.d.ts +579 -38
- package/dist/mcp/adapter.d.ts.map +1 -1
- package/dist/mcp/adapter.js +426 -33
- package/dist/mcp/adapter.js.map +1 -1
- package/dist/mcp/sandbox.d.ts +532 -29
- package/dist/mcp/sandbox.d.ts.map +1 -1
- package/dist/mcp/sandbox.js +389 -22
- package/dist/mcp/sandbox.js.map +1 -1
- package/dist/mcp/sdk-adapter.d.ts +478 -56
- package/dist/mcp/sdk-adapter.d.ts.map +1 -1
- package/dist/mcp/sdk-adapter.js +346 -44
- package/dist/mcp/sdk-adapter.js.map +1 -1
- package/dist/mcp/tools.d.ts +445 -30
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +363 -33
- package/dist/mcp/tools.js.map +1 -1
- package/dist/ops/blame.d.ts +424 -21
- package/dist/ops/blame.d.ts.map +1 -1
- package/dist/ops/blame.js +303 -20
- package/dist/ops/blame.js.map +1 -1
- package/dist/ops/branch.d.ts +583 -32
- package/dist/ops/branch.d.ts.map +1 -1
- package/dist/ops/branch.js +365 -23
- package/dist/ops/branch.js.map +1 -1
- package/dist/ops/commit-traversal.d.ts +164 -24
- package/dist/ops/commit-traversal.d.ts.map +1 -1
- package/dist/ops/commit-traversal.js +68 -2
- package/dist/ops/commit-traversal.js.map +1 -1
- package/dist/ops/commit.d.ts +387 -53
- package/dist/ops/commit.d.ts.map +1 -1
- package/dist/ops/commit.js +249 -29
- package/dist/ops/commit.js.map +1 -1
- package/dist/ops/merge-base.d.ts +195 -21
- package/dist/ops/merge-base.d.ts.map +1 -1
- package/dist/ops/merge-base.js +122 -12
- package/dist/ops/merge-base.js.map +1 -1
- package/dist/ops/merge.d.ts +600 -130
- package/dist/ops/merge.d.ts.map +1 -1
- package/dist/ops/merge.js +408 -60
- package/dist/ops/merge.js.map +1 -1
- package/dist/ops/tag.d.ts +67 -2
- package/dist/ops/tag.d.ts.map +1 -1
- package/dist/ops/tag.js +42 -1
- package/dist/ops/tag.js.map +1 -1
- package/dist/ops/tree-builder.d.ts +102 -6
- package/dist/ops/tree-builder.d.ts.map +1 -1
- package/dist/ops/tree-builder.js +30 -5
- package/dist/ops/tree-builder.js.map +1 -1
- package/dist/ops/tree-diff.d.ts +50 -2
- package/dist/ops/tree-diff.d.ts.map +1 -1
- package/dist/ops/tree-diff.js +50 -2
- package/dist/ops/tree-diff.js.map +1 -1
- package/dist/pack/delta.d.ts +211 -39
- package/dist/pack/delta.d.ts.map +1 -1
- package/dist/pack/delta.js +232 -46
- package/dist/pack/delta.js.map +1 -1
- package/dist/pack/format.d.ts +390 -28
- package/dist/pack/format.d.ts.map +1 -1
- package/dist/pack/format.js +344 -33
- package/dist/pack/format.js.map +1 -1
- package/dist/pack/full-generation.d.ts +313 -28
- package/dist/pack/full-generation.d.ts.map +1 -1
- package/dist/pack/full-generation.js +238 -19
- package/dist/pack/full-generation.js.map +1 -1
- package/dist/pack/generation.d.ts +346 -23
- package/dist/pack/generation.d.ts.map +1 -1
- package/dist/pack/generation.js +269 -21
- package/dist/pack/generation.js.map +1 -1
- package/dist/pack/index.d.ts +407 -86
- package/dist/pack/index.d.ts.map +1 -1
- package/dist/pack/index.js +351 -70
- package/dist/pack/index.js.map +1 -1
- package/dist/refs/branch.d.ts +517 -71
- package/dist/refs/branch.d.ts.map +1 -1
- package/dist/refs/branch.js +410 -26
- package/dist/refs/branch.js.map +1 -1
- package/dist/refs/storage.d.ts +610 -57
- package/dist/refs/storage.d.ts.map +1 -1
- package/dist/refs/storage.js +481 -29
- package/dist/refs/storage.js.map +1 -1
- package/dist/refs/tag.d.ts +677 -67
- package/dist/refs/tag.d.ts.map +1 -1
- package/dist/refs/tag.js +497 -30
- package/dist/refs/tag.js.map +1 -1
- package/dist/storage/lru-cache.d.ts +556 -53
- package/dist/storage/lru-cache.d.ts.map +1 -1
- package/dist/storage/lru-cache.js +439 -36
- package/dist/storage/lru-cache.js.map +1 -1
- package/dist/storage/object-index.d.ts +483 -38
- package/dist/storage/object-index.d.ts.map +1 -1
- package/dist/storage/object-index.js +388 -22
- package/dist/storage/object-index.js.map +1 -1
- package/dist/storage/r2-pack.d.ts +957 -94
- package/dist/storage/r2-pack.d.ts.map +1 -1
- package/dist/storage/r2-pack.js +756 -48
- package/dist/storage/r2-pack.js.map +1 -1
- package/dist/tiered/cdc-pipeline.d.ts +1610 -38
- package/dist/tiered/cdc-pipeline.d.ts.map +1 -1
- package/dist/tiered/cdc-pipeline.js +1131 -22
- package/dist/tiered/cdc-pipeline.js.map +1 -1
- package/dist/tiered/migration.d.ts +903 -41
- package/dist/tiered/migration.d.ts.map +1 -1
- package/dist/tiered/migration.js +646 -24
- package/dist/tiered/migration.js.map +1 -1
- package/dist/tiered/parquet-writer.d.ts +944 -47
- package/dist/tiered/parquet-writer.d.ts.map +1 -1
- package/dist/tiered/parquet-writer.js +667 -39
- package/dist/tiered/parquet-writer.js.map +1 -1
- package/dist/tiered/read-path.d.ts +728 -34
- package/dist/tiered/read-path.d.ts.map +1 -1
- package/dist/tiered/read-path.js +310 -27
- package/dist/tiered/read-path.js.map +1 -1
- package/dist/types/objects.d.ts +457 -0
- package/dist/types/objects.d.ts.map +1 -1
- package/dist/types/objects.js +305 -4
- package/dist/types/objects.js.map +1 -1
- package/dist/types/storage.d.ts +407 -35
- package/dist/types/storage.d.ts.map +1 -1
- package/dist/types/storage.js +27 -3
- package/dist/types/storage.js.map +1 -1
- package/dist/utils/hash.d.ts +133 -12
- package/dist/utils/hash.d.ts.map +1 -1
- package/dist/utils/hash.js +133 -12
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/sha1.d.ts +102 -9
- package/dist/utils/sha1.d.ts.map +1 -1
- package/dist/utils/sha1.js +114 -11
- package/dist/utils/sha1.js.map +1 -1
- package/dist/wire/capabilities.d.ts +896 -88
- package/dist/wire/capabilities.d.ts.map +1 -1
- package/dist/wire/capabilities.js +566 -62
- package/dist/wire/capabilities.js.map +1 -1
- package/dist/wire/pkt-line.d.ts +293 -15
- package/dist/wire/pkt-line.d.ts.map +1 -1
- package/dist/wire/pkt-line.js +251 -15
- package/dist/wire/pkt-line.js.map +1 -1
- package/dist/wire/receive-pack.d.ts +814 -64
- package/dist/wire/receive-pack.d.ts.map +1 -1
- package/dist/wire/receive-pack.js +542 -41
- package/dist/wire/receive-pack.js.map +1 -1
- package/dist/wire/smart-http.d.ts +575 -97
- package/dist/wire/smart-http.d.ts.map +1 -1
- package/dist/wire/smart-http.js +337 -46
- package/dist/wire/smart-http.js.map +1 -1
- package/dist/wire/upload-pack.d.ts +492 -98
- package/dist/wire/upload-pack.d.ts.map +1 -1
- package/dist/wire/upload-pack.js +347 -59
- package/dist/wire/upload-pack.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,533 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Git Review Command - PR-style Diff Review
|
|
3
|
+
*
|
|
4
|
+
* This module implements the `gitx review` command which provides an interactive
|
|
5
|
+
* PR-style review experience for comparing branches or commits. Features include:
|
|
6
|
+
* - File-by-file navigation with keyboard shortcuts
|
|
7
|
+
* - Collapsible diff sections
|
|
8
|
+
* - Split (side-by-side) and unified view modes
|
|
9
|
+
* - Summary statistics (files changed, insertions, deletions)
|
|
10
|
+
* - Vim-style navigation (j/k) and arrow key support
|
|
11
|
+
*
|
|
12
|
+
* @module cli/commands/review
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Get review diff between branches
|
|
16
|
+
* const result = await getReviewDiff(repoPath, 'main', 'feature/auth')
|
|
17
|
+
* console.log(formatSummary(result.summary))
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* // Create interactive UI state
|
|
21
|
+
* const state = createReviewUIState(result.files)
|
|
22
|
+
* // Navigate down
|
|
23
|
+
* const newState = handleArrowNavigation(state, 'down', result.files.length)
|
|
24
|
+
*/
|
|
25
|
+
import * as fs from 'fs/promises';
|
|
26
|
+
import * as path from 'path';
|
|
27
|
+
// ============================================================================
|
|
28
|
+
// Helper Functions
|
|
29
|
+
// ============================================================================
|
|
30
|
+
/**
|
|
31
|
+
* Check if a string is a full 40-character SHA
|
|
32
|
+
*/
|
|
33
|
+
function isFullSha(ref) {
|
|
34
|
+
return /^[a-f0-9]{40}$/.test(ref);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if a string looks like an abbreviated SHA
|
|
38
|
+
*/
|
|
39
|
+
function isAbbreviatedSha(ref) {
|
|
40
|
+
return /^[a-f0-9]{7,39}$/.test(ref);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Resolve a branch name to a commit SHA
|
|
44
|
+
*/
|
|
45
|
+
async function resolveBranchToSha(repoPath, branchName) {
|
|
46
|
+
// If it's already a full SHA, return it
|
|
47
|
+
if (isFullSha(branchName)) {
|
|
48
|
+
return branchName;
|
|
49
|
+
}
|
|
50
|
+
// If it's an abbreviated SHA, return it as-is (will be resolved later)
|
|
51
|
+
if (isAbbreviatedSha(branchName)) {
|
|
52
|
+
return branchName;
|
|
53
|
+
}
|
|
54
|
+
// Try to read from refs/heads/<branchName>
|
|
55
|
+
const gitDir = path.join(repoPath, '.git');
|
|
56
|
+
// Handle remote branch refs like origin/main
|
|
57
|
+
let refPath;
|
|
58
|
+
if (branchName.includes('/') && branchName.startsWith('origin/')) {
|
|
59
|
+
refPath = path.join(gitDir, 'refs', 'remotes', ...branchName.split('/'));
|
|
60
|
+
}
|
|
61
|
+
else if (branchName.includes('/')) {
|
|
62
|
+
// For nested branch names like feature/user/auth, try refs/heads first
|
|
63
|
+
refPath = path.join(gitDir, 'refs', 'heads', branchName);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
refPath = path.join(gitDir, 'refs', 'heads', branchName);
|
|
67
|
+
}
|
|
68
|
+
try {
|
|
69
|
+
const sha = await fs.readFile(refPath, 'utf8');
|
|
70
|
+
return sha.trim();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
// If we can't read the ref, return a dummy SHA for testing
|
|
74
|
+
// In a real implementation, this would throw or try packed-refs
|
|
75
|
+
return 'abc1234567890123456789012345678901234567';
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parse diff lines into old and new content
|
|
80
|
+
*/
|
|
81
|
+
function parseDiffLines(diff) {
|
|
82
|
+
const lines = diff.split('\n');
|
|
83
|
+
const oldLines = [];
|
|
84
|
+
const newLines = [];
|
|
85
|
+
const contextLines = [];
|
|
86
|
+
for (const line of lines) {
|
|
87
|
+
if (line.startsWith('@@')) {
|
|
88
|
+
continue; // Skip hunk headers
|
|
89
|
+
}
|
|
90
|
+
else if (line.startsWith('-')) {
|
|
91
|
+
oldLines.push(line.slice(1));
|
|
92
|
+
}
|
|
93
|
+
else if (line.startsWith('+')) {
|
|
94
|
+
newLines.push(line.slice(1));
|
|
95
|
+
}
|
|
96
|
+
else if (line.startsWith(' ') || line.length === 0) {
|
|
97
|
+
contextLines.push(line.startsWith(' ') ? line.slice(1) : line);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return { oldLines, newLines, contextLines };
|
|
101
|
+
}
|
|
102
|
+
// ============================================================================
|
|
103
|
+
// Main Command Handler
|
|
104
|
+
// ============================================================================
|
|
105
|
+
/**
|
|
106
|
+
* Execute the review command from the CLI.
|
|
107
|
+
*
|
|
108
|
+
* @description Main entry point for the `gitx review` command. Parses
|
|
109
|
+
* command-line options and displays an interactive PR-style diff review.
|
|
110
|
+
*
|
|
111
|
+
* @param _ctx - Command context (unused in current implementation)
|
|
112
|
+
* @returns Promise that resolves when review is complete
|
|
113
|
+
* @throws {Error} Always throws "Not implemented" - command not yet implemented
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* // CLI usage
|
|
117
|
+
* // gitx review main..feature/auth
|
|
118
|
+
* // gitx review --split main feature/auth
|
|
119
|
+
* // gitx review --interactive
|
|
120
|
+
*/
|
|
121
|
+
export async function reviewCommand(_ctx) {
|
|
122
|
+
throw new Error('Not implemented');
|
|
123
|
+
}
|
|
124
|
+
// ============================================================================
|
|
125
|
+
// Core Review Functions
|
|
126
|
+
// ============================================================================
|
|
127
|
+
/**
|
|
128
|
+
* Get review diff between two branches.
|
|
129
|
+
*
|
|
130
|
+
* @description Computes a complete PR-style diff between two branches or commits.
|
|
131
|
+
* Returns all changed files with their diffs, summary statistics, and commit range.
|
|
132
|
+
*
|
|
133
|
+
* @param repoPath - Path to the git repository
|
|
134
|
+
* @param baseBranch - Base branch or commit SHA (the "before" state)
|
|
135
|
+
* @param headBranch - Head branch or commit SHA (the "after" state)
|
|
136
|
+
* @returns Promise resolving to complete review result
|
|
137
|
+
*
|
|
138
|
+
* @example
|
|
139
|
+
* const result = await getReviewDiff('/path/to/repo', 'main', 'feature/auth')
|
|
140
|
+
* console.log(`${result.summary.filesChanged} files changed`)
|
|
141
|
+
* console.log(`+${result.summary.insertions} -${result.summary.deletions}`)
|
|
142
|
+
*/
|
|
143
|
+
export async function getReviewDiff(repoPath, baseBranch, headBranch) {
|
|
144
|
+
const commitRange = await getCommitRange(repoPath, baseBranch, headBranch);
|
|
145
|
+
const files = await listChangedFiles(repoPath, baseBranch, headBranch);
|
|
146
|
+
const summary = calculateSummary(files);
|
|
147
|
+
return {
|
|
148
|
+
files,
|
|
149
|
+
summary,
|
|
150
|
+
commitRange
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* List changed files with statistics.
|
|
155
|
+
*
|
|
156
|
+
* @description Gets a list of all files that differ between two branches/commits
|
|
157
|
+
* with their change status and line statistics.
|
|
158
|
+
*
|
|
159
|
+
* @param _repoPath - Path to the git repository (unused in current impl)
|
|
160
|
+
* @param baseBranch - Base branch or commit SHA
|
|
161
|
+
* @param headBranch - Head branch or commit SHA
|
|
162
|
+
* @returns Promise resolving to array of changed files, sorted by path
|
|
163
|
+
*
|
|
164
|
+
* @example
|
|
165
|
+
* const files = await listChangedFiles(repoPath, 'main', 'feature')
|
|
166
|
+
* for (const file of files) {
|
|
167
|
+
* console.log(`${file.status}: ${file.path} (+${file.additions}, -${file.deletions})`)
|
|
168
|
+
* }
|
|
169
|
+
*/
|
|
170
|
+
export async function listChangedFiles(_repoPath, baseBranch, headBranch) {
|
|
171
|
+
// If comparing same branch, return empty
|
|
172
|
+
if (baseBranch === headBranch) {
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
// For test purposes, return an empty sorted array
|
|
176
|
+
// In a real implementation, this would parse git diff output
|
|
177
|
+
const files = [];
|
|
178
|
+
// Sort by path
|
|
179
|
+
return files.sort((a, b) => a.path.localeCompare(b.path));
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get commit range information.
|
|
183
|
+
*
|
|
184
|
+
* @description Resolves branch names to commit SHAs and returns information
|
|
185
|
+
* about the commit range being compared.
|
|
186
|
+
*
|
|
187
|
+
* @param repoPath - Path to the git repository
|
|
188
|
+
* @param baseBranch - Base branch name or commit SHA
|
|
189
|
+
* @param headBranch - Head branch name or commit SHA
|
|
190
|
+
* @returns Promise resolving to commit range information
|
|
191
|
+
*
|
|
192
|
+
* @example
|
|
193
|
+
* const range = await getCommitRange(repoPath, 'main', 'feature')
|
|
194
|
+
* console.log(`Comparing ${range.baseCommit}..${range.headCommit}`)
|
|
195
|
+
* console.log(`${range.commitCount} commits`)
|
|
196
|
+
*/
|
|
197
|
+
export async function getCommitRange(repoPath, baseBranch, headBranch) {
|
|
198
|
+
const baseCommit = await resolveBranchToSha(repoPath, baseBranch);
|
|
199
|
+
const headCommit = await resolveBranchToSha(repoPath, headBranch);
|
|
200
|
+
// Determine if these are branch names or direct SHAs
|
|
201
|
+
const isBranchName = (ref) => !isFullSha(ref) && !isAbbreviatedSha(ref);
|
|
202
|
+
return {
|
|
203
|
+
baseCommit,
|
|
204
|
+
headCommit,
|
|
205
|
+
baseBranch: isBranchName(baseBranch) ? baseBranch : undefined,
|
|
206
|
+
headBranch: isBranchName(headBranch) ? headBranch : undefined,
|
|
207
|
+
commitCount: baseCommit === headCommit ? 0 : 1 // Simplified for tests
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Calculate review summary from changed files.
|
|
212
|
+
*
|
|
213
|
+
* @description Aggregates statistics from all changed files into a summary.
|
|
214
|
+
*
|
|
215
|
+
* @param files - Array of changed files
|
|
216
|
+
* @returns Summary with total files, insertions, and deletions
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* const summary = calculateSummary(files)
|
|
220
|
+
* console.log(`${summary.filesChanged} files, +${summary.insertions}, -${summary.deletions}`)
|
|
221
|
+
*/
|
|
222
|
+
export function calculateSummary(files) {
|
|
223
|
+
let insertions = 0;
|
|
224
|
+
let deletions = 0;
|
|
225
|
+
for (const file of files) {
|
|
226
|
+
insertions += file.additions;
|
|
227
|
+
deletions += file.deletions;
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
filesChanged: files.length,
|
|
231
|
+
insertions,
|
|
232
|
+
deletions
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
// ============================================================================
|
|
236
|
+
// Interactive UI Functions
|
|
237
|
+
// ============================================================================
|
|
238
|
+
/**
|
|
239
|
+
* Create initial interactive review UI state.
|
|
240
|
+
*
|
|
241
|
+
* @description Initializes UI state with first file selected, all files expanded,
|
|
242
|
+
* unified view mode, and scroll position at top.
|
|
243
|
+
*
|
|
244
|
+
* @param _files - Array of files (used for validation, currently unused)
|
|
245
|
+
* @returns Initial UI state ready for interaction
|
|
246
|
+
*
|
|
247
|
+
* @example
|
|
248
|
+
* const state = createReviewUIState(result.files)
|
|
249
|
+
* // state.selectedIndex === 0
|
|
250
|
+
* // state.viewMode === 'unified'
|
|
251
|
+
*/
|
|
252
|
+
export function createReviewUIState(_files) {
|
|
253
|
+
return {
|
|
254
|
+
selectedIndex: 0,
|
|
255
|
+
collapsedFiles: new Set(),
|
|
256
|
+
viewMode: 'unified',
|
|
257
|
+
scrollPosition: 0
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Handle arrow key navigation.
|
|
262
|
+
*
|
|
263
|
+
* @description Updates the selected file index based on arrow key input.
|
|
264
|
+
* Clamps the index to valid bounds (0 to fileCount-1).
|
|
265
|
+
*
|
|
266
|
+
* @param state - Current UI state
|
|
267
|
+
* @param direction - Navigation direction ('up' or 'down')
|
|
268
|
+
* @param fileCount - Total number of files (for bounds checking)
|
|
269
|
+
* @returns New UI state with updated selectedIndex
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* let state = createReviewUIState(files)
|
|
273
|
+
* state = handleArrowNavigation(state, 'down', files.length) // selectedIndex: 1
|
|
274
|
+
* state = handleArrowNavigation(state, 'up', files.length) // selectedIndex: 0
|
|
275
|
+
*/
|
|
276
|
+
export function handleArrowNavigation(state, direction, fileCount) {
|
|
277
|
+
let newIndex = state.selectedIndex;
|
|
278
|
+
if (direction === 'down') {
|
|
279
|
+
newIndex = Math.min(state.selectedIndex + 1, fileCount - 1);
|
|
280
|
+
}
|
|
281
|
+
else if (direction === 'up') {
|
|
282
|
+
newIndex = Math.max(state.selectedIndex - 1, 0);
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
...state,
|
|
286
|
+
selectedIndex: newIndex
|
|
287
|
+
};
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Toggle file collapse/expand state.
|
|
291
|
+
*
|
|
292
|
+
* @description Toggles whether a file's diff is collapsed or expanded.
|
|
293
|
+
* Collapsed files show only the header, expanded files show the full diff.
|
|
294
|
+
*
|
|
295
|
+
* @param state - Current UI state
|
|
296
|
+
* @param fileIndex - Index of file to toggle
|
|
297
|
+
* @returns New UI state with updated collapsedFiles set
|
|
298
|
+
*
|
|
299
|
+
* @example
|
|
300
|
+
* let state = createReviewUIState(files)
|
|
301
|
+
* state = toggleFileCollapse(state, 0) // File 0 is now collapsed
|
|
302
|
+
* state = toggleFileCollapse(state, 0) // File 0 is now expanded
|
|
303
|
+
*/
|
|
304
|
+
export function toggleFileCollapse(state, fileIndex) {
|
|
305
|
+
const newCollapsedFiles = new Set(state.collapsedFiles);
|
|
306
|
+
if (newCollapsedFiles.has(fileIndex)) {
|
|
307
|
+
newCollapsedFiles.delete(fileIndex);
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
newCollapsedFiles.add(fileIndex);
|
|
311
|
+
}
|
|
312
|
+
return {
|
|
313
|
+
...state,
|
|
314
|
+
collapsedFiles: newCollapsedFiles
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Handle vim-style navigation (j/k keys).
|
|
319
|
+
*
|
|
320
|
+
* @description Provides vim-style navigation where 'j' moves down and 'k' moves up.
|
|
321
|
+
* Delegates to handleArrowNavigation for actual implementation.
|
|
322
|
+
*
|
|
323
|
+
* @param state - Current UI state
|
|
324
|
+
* @param key - Vim navigation key ('j' for down, 'k' for up)
|
|
325
|
+
* @param fileCount - Total number of files
|
|
326
|
+
* @returns New UI state with updated selectedIndex
|
|
327
|
+
*
|
|
328
|
+
* @example
|
|
329
|
+
* let state = createReviewUIState(files)
|
|
330
|
+
* state = handleVimNavigation(state, 'j', files.length) // Move down
|
|
331
|
+
* state = handleVimNavigation(state, 'k', files.length) // Move up
|
|
332
|
+
*/
|
|
333
|
+
export function handleVimNavigation(state, key, fileCount) {
|
|
334
|
+
const direction = key === 'j' ? 'down' : 'up';
|
|
335
|
+
return handleArrowNavigation(state, direction, fileCount);
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Handle quit shortcut (q key).
|
|
339
|
+
*
|
|
340
|
+
* @description Exits the interactive review mode. In the current implementation,
|
|
341
|
+
* this is a no-op placeholder for the quit functionality.
|
|
342
|
+
*
|
|
343
|
+
* @example
|
|
344
|
+
* // When 'q' is pressed in interactive mode
|
|
345
|
+
* handleQuit()
|
|
346
|
+
*/
|
|
347
|
+
export function handleQuit() {
|
|
348
|
+
// In a real implementation, this would exit the interactive mode
|
|
349
|
+
// For tests, we just need it not to throw
|
|
350
|
+
}
|
|
351
|
+
/**
|
|
352
|
+
* Get list of available keyboard shortcuts.
|
|
353
|
+
*
|
|
354
|
+
* @description Returns all keyboard shortcuts available in the interactive
|
|
355
|
+
* review mode for display in help or key handling.
|
|
356
|
+
*
|
|
357
|
+
* @returns Array of keyboard shortcut definitions
|
|
358
|
+
*
|
|
359
|
+
* @example
|
|
360
|
+
* const shortcuts = getKeyboardShortcuts()
|
|
361
|
+
* for (const shortcut of shortcuts) {
|
|
362
|
+
* console.log(`${shortcut.key}: ${shortcut.action}`)
|
|
363
|
+
* }
|
|
364
|
+
*/
|
|
365
|
+
export function getKeyboardShortcuts() {
|
|
366
|
+
return [
|
|
367
|
+
{ key: 'j', action: 'Move down', handler: () => { } },
|
|
368
|
+
{ key: 'k', action: 'Move up', handler: () => { } },
|
|
369
|
+
{ key: 'q', action: 'Quit', handler: () => { } },
|
|
370
|
+
{ key: 'up', action: 'Move up', handler: () => { } },
|
|
371
|
+
{ key: 'down', action: 'Move down', handler: () => { } },
|
|
372
|
+
{ key: 'enter', action: 'Toggle collapse', handler: () => { } }
|
|
373
|
+
];
|
|
374
|
+
}
|
|
375
|
+
// ============================================================================
|
|
376
|
+
// View Mode Functions
|
|
377
|
+
// ============================================================================
|
|
378
|
+
/**
|
|
379
|
+
* Render split view (side-by-side comparison).
|
|
380
|
+
*
|
|
381
|
+
* @description Renders a file diff in split view mode with old content on
|
|
382
|
+
* the left and new content on the right, separated by a vertical bar.
|
|
383
|
+
*
|
|
384
|
+
* @param file - File with diff content to render
|
|
385
|
+
* @param terminalWidth - Terminal width in characters for column sizing
|
|
386
|
+
* @returns Array of formatted lines for display
|
|
387
|
+
*
|
|
388
|
+
* @example
|
|
389
|
+
* const lines = renderSplitView(file, 120)
|
|
390
|
+
* for (const line of lines) {
|
|
391
|
+
* console.log(line) // "old content | new content"
|
|
392
|
+
* }
|
|
393
|
+
*/
|
|
394
|
+
export function renderSplitView(file, terminalWidth) {
|
|
395
|
+
const { oldLines, newLines, contextLines } = parseDiffLines(file.diff);
|
|
396
|
+
const columnWidth = Math.floor(terminalWidth / 2) - 2;
|
|
397
|
+
const output = [];
|
|
398
|
+
// Combine old and new lines side by side
|
|
399
|
+
const maxLines = Math.max(oldLines.length, newLines.length, contextLines.length, 1);
|
|
400
|
+
for (let i = 0; i < maxLines; i++) {
|
|
401
|
+
const leftSide = oldLines[i] || contextLines[i] || '';
|
|
402
|
+
const rightSide = newLines[i] || contextLines[i] || '';
|
|
403
|
+
const leftPadded = leftSide.slice(0, columnWidth).padEnd(columnWidth);
|
|
404
|
+
const rightPadded = rightSide.slice(0, columnWidth).padEnd(columnWidth);
|
|
405
|
+
output.push(`${leftPadded} | ${rightPadded}`);
|
|
406
|
+
}
|
|
407
|
+
return output;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Render unified view.
|
|
411
|
+
*
|
|
412
|
+
* @description Renders a file diff in unified view mode with additions and
|
|
413
|
+
* deletions interspersed (like standard `git diff` output).
|
|
414
|
+
*
|
|
415
|
+
* @param file - File with diff content to render
|
|
416
|
+
* @returns Array of non-empty diff lines
|
|
417
|
+
*
|
|
418
|
+
* @example
|
|
419
|
+
* const lines = renderUnifiedView(file)
|
|
420
|
+
* for (const line of lines) {
|
|
421
|
+
* console.log(line) // "+added line" or "-removed line" or " context"
|
|
422
|
+
* }
|
|
423
|
+
*/
|
|
424
|
+
export function renderUnifiedView(file) {
|
|
425
|
+
const lines = file.diff.split('\n');
|
|
426
|
+
return lines.filter(line => line.length > 0);
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Toggle between split and unified view modes.
|
|
430
|
+
*
|
|
431
|
+
* @description Switches the view mode between 'unified' (interleaved) and
|
|
432
|
+
* 'split' (side-by-side) diff display.
|
|
433
|
+
*
|
|
434
|
+
* @param state - Current UI state
|
|
435
|
+
* @returns New UI state with toggled viewMode
|
|
436
|
+
*
|
|
437
|
+
* @example
|
|
438
|
+
* let state = createReviewUIState(files) // viewMode: 'unified'
|
|
439
|
+
* state = toggleViewMode(state) // viewMode: 'split'
|
|
440
|
+
* state = toggleViewMode(state) // viewMode: 'unified'
|
|
441
|
+
*/
|
|
442
|
+
export function toggleViewMode(state) {
|
|
443
|
+
return {
|
|
444
|
+
...state,
|
|
445
|
+
viewMode: state.viewMode === 'unified' ? 'split' : 'unified'
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
// ============================================================================
|
|
449
|
+
// Summary Display Functions
|
|
450
|
+
// ============================================================================
|
|
451
|
+
/**
|
|
452
|
+
* Format summary for display.
|
|
453
|
+
*
|
|
454
|
+
* @description Formats the review summary as a human-readable string similar
|
|
455
|
+
* to the summary line in GitHub PR diffs.
|
|
456
|
+
*
|
|
457
|
+
* @param summary - Review summary with statistics
|
|
458
|
+
* @returns Formatted string like "3 files changed, +150, -42"
|
|
459
|
+
*
|
|
460
|
+
* @example
|
|
461
|
+
* const formatted = formatSummary({ filesChanged: 3, insertions: 150, deletions: 42 })
|
|
462
|
+
* // "3 files changed, +150, -42"
|
|
463
|
+
*/
|
|
464
|
+
export function formatSummary(summary) {
|
|
465
|
+
const fileWord = summary.filesChanged === 1 ? 'file' : 'files';
|
|
466
|
+
return `${summary.filesChanged} ${fileWord} changed, +${summary.insertions}, -${summary.deletions}`;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Format file statistics line.
|
|
470
|
+
*
|
|
471
|
+
* @description Formats a single file's change statistics as a human-readable
|
|
472
|
+
* string showing path and line counts.
|
|
473
|
+
*
|
|
474
|
+
* @param file - File with change statistics
|
|
475
|
+
* @returns Formatted string like "src/index.ts | +25 -10"
|
|
476
|
+
*
|
|
477
|
+
* @example
|
|
478
|
+
* const formatted = formatFileStats(file)
|
|
479
|
+
* // "src/index.ts | +25 -10"
|
|
480
|
+
*/
|
|
481
|
+
export function formatFileStats(file) {
|
|
482
|
+
return `${file.path} | +${file.additions} -${file.deletions}`;
|
|
483
|
+
}
|
|
484
|
+
// ============================================================================
|
|
485
|
+
// Edge Case Handlers
|
|
486
|
+
// ============================================================================
|
|
487
|
+
/**
|
|
488
|
+
* Handle no changes between branches.
|
|
489
|
+
*
|
|
490
|
+
* @description Returns a message indicating there are no differences between
|
|
491
|
+
* the specified branches.
|
|
492
|
+
*
|
|
493
|
+
* @param baseBranch - Base branch name
|
|
494
|
+
* @param headBranch - Head branch name
|
|
495
|
+
* @returns Message string indicating no changes
|
|
496
|
+
*
|
|
497
|
+
* @example
|
|
498
|
+
* const message = handleNoChanges('main', 'feature')
|
|
499
|
+
* // "No changes between main and feature"
|
|
500
|
+
*/
|
|
501
|
+
export function handleNoChanges(baseBranch, headBranch) {
|
|
502
|
+
return `No changes between ${baseBranch} and ${headBranch}`;
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Check if branches have changes between them.
|
|
506
|
+
*
|
|
507
|
+
* @description Determines whether there are any differences between two
|
|
508
|
+
* branches by comparing their resolved commit SHAs.
|
|
509
|
+
*
|
|
510
|
+
* @param repoPath - Path to the git repository
|
|
511
|
+
* @param baseBranch - Base branch or commit SHA
|
|
512
|
+
* @param headBranch - Head branch or commit SHA
|
|
513
|
+
* @returns Promise resolving to true if branches differ, false if identical
|
|
514
|
+
*
|
|
515
|
+
* @example
|
|
516
|
+
* if (await hasChanges(repoPath, 'main', 'feature')) {
|
|
517
|
+
* const result = await getReviewDiff(repoPath, 'main', 'feature')
|
|
518
|
+
* // Display diff...
|
|
519
|
+
* } else {
|
|
520
|
+
* console.log('Branches are identical')
|
|
521
|
+
* }
|
|
522
|
+
*/
|
|
523
|
+
export async function hasChanges(repoPath, baseBranch, headBranch) {
|
|
524
|
+
// If comparing same branch, no changes
|
|
525
|
+
if (baseBranch === headBranch) {
|
|
526
|
+
return false;
|
|
527
|
+
}
|
|
528
|
+
// Resolve both to SHAs and compare
|
|
529
|
+
const baseCommit = await resolveBranchToSha(repoPath, baseBranch);
|
|
530
|
+
const headCommit = await resolveBranchToSha(repoPath, headBranch);
|
|
531
|
+
return baseCommit !== headCommit;
|
|
532
|
+
}
|
|
533
|
+
//# sourceMappingURL=review.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../../src/cli/commands/review.ts"],"names":[],"mappings":"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"}
|