@spences10/pi-git-ui 0.0.1 → 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.
@@ -0,0 +1,210 @@
1
+ import { Text } from '@earendil-works/pi-tui';
2
+ import { staged_file_count, } from './git.js';
3
+ import { pad_ansi, pad_plain, state_counts, state_icon, state_label, status_code, truncate_plain, } from './render.js';
4
+ export function render_stage(state, width) {
5
+ if (state.actions)
6
+ return render_action_menu(state, width);
7
+ if (state.show_help)
8
+ return render_help(state, width);
9
+ if (state.repo_overview)
10
+ return render_repo_overview(state, width);
11
+ const lines = render_header(state, width);
12
+ if (state.message)
13
+ lines.push(...render_message(state, width));
14
+ if (state.status.files.length === 0)
15
+ return lines;
16
+ return [...lines, ...render_workbench(state, width)];
17
+ }
18
+ function render_header(state, width) {
19
+ const upstream = state.status.upstream
20
+ ? ` • ${state.status.upstream} ↑${state.status.ahead} ↓${state.status.behind}`
21
+ : '';
22
+ const counts = state_counts(state.status.files);
23
+ const staged = staged_file_count(state.status.files);
24
+ const filter_status = state.visible_files.length !== state.status.files.length
25
+ ? ` • filtered ${state.visible_files.length}/${state.status.files.length}`
26
+ : '';
27
+ const text = `branch ${state.status.branch}${upstream} • ${state.status.files.length} files • staged ${staged}${filter_status}${counts ? ` • ${counts}` : ''}`;
28
+ return new Text(state.theme.fg('muted', text), 0, 0).render(width);
29
+ }
30
+ function render_message(state, width) {
31
+ const color = state.busy
32
+ ? 'accent'
33
+ : state.message.includes('disabled') ||
34
+ state.message.includes('conflict') ||
35
+ state.message.includes('blocked')
36
+ ? 'warning'
37
+ : 'dim';
38
+ return new Text(state.theme.fg(color, state.message), 0, 0).render(width);
39
+ }
40
+ function render_action_menu(state, width) {
41
+ const file = selected_file(state);
42
+ const lines = [
43
+ state.theme.bold('Actions'),
44
+ state.theme.fg('muted', file?.path ?? 'No file selected'),
45
+ '',
46
+ ];
47
+ for (let index = 0; index < (state.actions?.length ?? 0); index++) {
48
+ const action = state.actions[index];
49
+ const prefix = index === state.selected_action ? '› ' : ' ';
50
+ const line = `${prefix}${action.action_label.padEnd(18)} ${state.theme.fg('dim', action.action_description)}`;
51
+ lines.push(index === state.selected_action
52
+ ? state.theme.fg('accent', state.theme.bold(line))
53
+ : line);
54
+ }
55
+ lines.push('', state.theme.fg('dim', '↑↓/jk move • enter run • ? help • esc cancel'));
56
+ return lines.flatMap((line) => new Text(line, 0, 0).render(width));
57
+ }
58
+ function render_help(state, width) {
59
+ const groups = [
60
+ [
61
+ 'Navigation',
62
+ '↑↓/jk move files',
63
+ '←→/hl scroll diff',
64
+ '/ filter files',
65
+ 'r refresh',
66
+ ],
67
+ [
68
+ 'Staging',
69
+ 'space safe toggle file',
70
+ 's stage file',
71
+ 'x unstage file',
72
+ 'S/X stage or unstage hunk',
73
+ '+/- stage or unstage line',
74
+ 'a safe stage all',
75
+ 'A force stage all',
76
+ 'u unstage all',
77
+ 'discard file from actions menu',
78
+ ],
79
+ ['Diff selection', 'n/p move hunks', '[/] move changed lines'],
80
+ [
81
+ 'Other',
82
+ 'enter actions',
83
+ 'c commit',
84
+ 'm amend commit',
85
+ 'g repository',
86
+ 'q/esc close',
87
+ ],
88
+ ];
89
+ const lines = [
90
+ state.theme.bold('Git UI help'),
91
+ state.theme.fg('dim', '?/q/esc back'),
92
+ '',
93
+ ];
94
+ for (const [title, ...items] of groups) {
95
+ lines.push(state.theme.fg('accent', state.theme.bold(title)));
96
+ for (const item of items)
97
+ lines.push(` ${item}`);
98
+ lines.push('');
99
+ }
100
+ return lines.flatMap((line) => new Text(truncate_plain(line, width), 0, 0).render(width));
101
+ }
102
+ function render_repo_overview(state, width) {
103
+ const overview = state.repo_overview;
104
+ if (!overview)
105
+ return [];
106
+ const lines = [
107
+ state.theme.bold('Repository'),
108
+ state.theme.fg('dim', 'q/esc back'),
109
+ '',
110
+ state.theme.fg('accent', state.theme.bold('Branches')),
111
+ ...render_section(overview.branches, 'No branches found'),
112
+ '',
113
+ state.theme.fg('accent', state.theme.bold('Recent commits')),
114
+ ...render_section(overview.log, 'No commits found'),
115
+ '',
116
+ state.theme.fg('accent', state.theme.bold('Stashes')),
117
+ ...render_section(overview.stashes, 'No stashes'),
118
+ '',
119
+ state.theme.fg('accent', state.theme.bold('Remotes')),
120
+ ...render_section(overview.remotes, 'No remotes'),
121
+ ];
122
+ return lines.flatMap((line) => new Text(truncate_plain(line, width), 0, 0).render(width));
123
+ }
124
+ function render_workbench(state, width) {
125
+ const gap = width >= 96 ? 3 : 1;
126
+ const list_width = Math.min(42, Math.max(28, Math.floor(width * 0.42)));
127
+ const diff_width = Math.max(20, width - list_width - gap);
128
+ const list = render_file_list(state, list_width);
129
+ const diff = render_diff(state, diff_width, list.length);
130
+ const height = Math.max(list.length, diff.length);
131
+ const lines = [];
132
+ for (let i = 0; i < height; i++) {
133
+ const left = pad_ansi(list[i] ?? '', list_width);
134
+ lines.push(`${left}${' '.repeat(gap)}${diff[i] ?? ''}`);
135
+ }
136
+ return lines;
137
+ }
138
+ function render_file_list(state, width) {
139
+ const lines = [state.theme.bold('Files')];
140
+ let last_state;
141
+ for (let i = 0; i < state.visible_files.length; i++) {
142
+ const file = state.visible_files[i];
143
+ if (file.state !== last_state) {
144
+ lines.push(state.theme.fg('dim', state_label(file.state).toUpperCase()));
145
+ last_state = file.state;
146
+ }
147
+ const selected = i === state.selected;
148
+ const prefix = selected ? '› ' : ' ';
149
+ const label_width = Math.max(8, width - 14);
150
+ const label = truncate_plain(file.path, label_width);
151
+ const meta = `${state_icon(file.state)} ${status_code(file)}`;
152
+ const line = `${prefix}${pad_plain(label, label_width)} ${meta}`;
153
+ lines.push(selected
154
+ ? state.theme.fg('accent', state.theme.bold(line))
155
+ : line);
156
+ }
157
+ return lines;
158
+ }
159
+ function render_diff(state, width, height) {
160
+ const selected = selected_file(state);
161
+ const title = selected
162
+ ? `Diff: ${truncate_plain(selected.path, Math.max(0, width - 6))}`
163
+ : 'Diff';
164
+ const lines = [state.theme.bold(title)];
165
+ if (selected?.state === 'conflicted') {
166
+ lines.push(state.theme.fg('warning', 'Conflict: resolve markers in your editor, then stage the file.'), '');
167
+ }
168
+ if (!state.diff || state.diff.path !== state.diff_for_path) {
169
+ lines.push(state.theme.fg('dim', 'Loading diff…'));
170
+ return lines;
171
+ }
172
+ const visible = Math.max(1, height - 1);
173
+ const max_scroll = Math.max(0, state.diff.lines.length - visible);
174
+ const diff_scroll = Math.min(state.diff_scroll, max_scroll);
175
+ const body = state.diff.lines.slice(diff_scroll, diff_scroll + visible);
176
+ for (let index = 0; index < body.length; index++) {
177
+ const line_index = diff_scroll + index;
178
+ const selected_hunk = state.diff.hunks[state.selected_hunk];
179
+ lines.push(format_diff_line(state, body[index], width, selected_hunk?.line_index === line_index, state.selected_line_index === line_index));
180
+ }
181
+ if (max_scroll > 0) {
182
+ lines[0] = `${lines[0]} ${state.theme.fg('dim', `${diff_scroll + 1}-${Math.min(diff_scroll + visible, state.diff.lines.length)}/${state.diff.lines.length}`)}`;
183
+ }
184
+ return lines;
185
+ }
186
+ function format_diff_line(state, raw, width, selected_hunk = false, selected_line = false) {
187
+ const marker = selected_line ? '» ' : selected_hunk ? '› ' : '';
188
+ const text = truncate_plain(`${marker}${raw.replace(/\t/g, ' ')}`, width);
189
+ if (raw === 'STAGED' || raw === 'UNSTAGED') {
190
+ return state.theme.fg('accent', state.theme.bold(text));
191
+ }
192
+ if (raw.startsWith('+++') || raw.startsWith('---'))
193
+ return state.theme.fg('muted', text);
194
+ if (raw.startsWith('@@'))
195
+ return state.theme.fg('accent', text);
196
+ if (raw.startsWith('+'))
197
+ return state.theme.fg('success', text);
198
+ if (raw.startsWith('-'))
199
+ return state.theme.fg('warning', text);
200
+ return text;
201
+ }
202
+ function selected_file(state) {
203
+ return state.visible_files[state.selected];
204
+ }
205
+ function render_section(items, empty_text) {
206
+ if (items.length === 0)
207
+ return [` ${empty_text}`];
208
+ return items.map((item) => ` ${item}`);
209
+ }
210
+ //# sourceMappingURL=stage-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage-render.js","sourceRoot":"","sources":["../src/stage-render.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ModalTheme } from '@spences10/pi-tui-modal';
2
+ import type { DiffView, GitFile, GitStatus, RepoOverview } from './git.js';
3
+ export interface ActionItem {
4
+ action_label: string;
5
+ action_description: string;
6
+ run: () => void;
7
+ }
8
+ export interface StageRenderState {
9
+ theme: ModalTheme;
10
+ status: GitStatus;
11
+ message: string;
12
+ busy: boolean;
13
+ visible_files: GitFile[];
14
+ selected: number;
15
+ diff?: DiffView;
16
+ diff_for_path: string;
17
+ diff_scroll: number;
18
+ selected_hunk: number;
19
+ selected_line_index?: number;
20
+ actions?: ActionItem[];
21
+ selected_action: number;
22
+ repo_overview?: RepoOverview;
23
+ show_help: boolean;
24
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stage-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage-types.js","sourceRoot":"","sources":["../src/stage-types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@spences10/pi-git-ui",
3
- "version": "0.0.1",
4
- "description": "Interactive Git staging UI for Pi",
3
+ "version": "0.0.3",
4
+ "description": "Focused Git staging and commit modal for Pi",
5
5
  "keywords": [
6
6
  "git",
7
7
  "pi",
@@ -29,14 +29,16 @@
29
29
  }
30
30
  },
31
31
  "dependencies": {
32
- "@earendil-works/pi-coding-agent": "^0.74.0",
33
- "@earendil-works/pi-tui": "^0.74.0",
34
- "@spences10/pi-tui-modal": "0.0.12"
32
+ "@spences10/pi-tui-modal": "0.0.13"
35
33
  },
36
34
  "devDependencies": {
37
35
  "@types/node": "^25.8.0",
38
36
  "typescript": "^6.0.3"
39
37
  },
38
+ "peerDependencies": {
39
+ "@earendil-works/pi-coding-agent": "*",
40
+ "@earendil-works/pi-tui": "*"
41
+ },
40
42
  "engines": {
41
43
  "node": ">=24.15.0"
42
44
  },
@@ -51,6 +53,6 @@
51
53
  "check": "pnpm --filter \"$npm_package_name^...\" run build:self && pnpm run check:self",
52
54
  "check:self": "tsc --noEmit",
53
55
  "test": "pnpm --filter \"$npm_package_name^...\" run build:self && pnpm run test:self",
54
- "test:self": "node -e \"process.exit(0)\""
56
+ "test:self": "vitest run src/git.test.ts"
55
57
  }
56
58
  }