@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.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @spences10/pi-git-ui
2
2
 
3
- Interactive Git staging, diff review, and commit UI for Pi.
3
+ Focused Git staging, diff review, and commit modal for Pi.
4
4
 
5
5
  ## Usage
6
6
 
@@ -17,15 +17,29 @@ Then run:
17
17
  Controls:
18
18
 
19
19
  - `↑`/`↓` or `j`/`k` — move file selection
20
+ - `/` — filter files by path, state, or status code
21
+ - `enter` — open contextual actions for the selected file
22
+ - `?` — show grouped keyboard help
20
23
  - `←`/`→` or `h`/`l` — scroll the diff preview
24
+ - `n`/`p` — move between diff hunks
25
+ - `[`/`]` — move between changed lines
21
26
  - `space` — safely stage/unstage selected file; disabled for
22
27
  partial/conflicted files
23
28
  - `s` — stage selected file explicitly
24
29
  - `x` — unstage selected file explicitly
30
+ - `S` — stage selected hunk
31
+ - `X` — unstage selected hunk
32
+ - `+` — stage selected changed line
33
+ - `-` — unstage selected changed line
25
34
  - `c` — commit staged changes with a Conventional Commit helper or raw
26
35
  message
36
+ - `m` — amend the last commit with staged changes
37
+ - `g` — show repository overview with branches, recent commits,
38
+ stashes, and remotes
27
39
  - `a` — safely stage all; blocked if partial/conflicted files exist
28
40
  - `A` — force stage all
29
41
  - `u` — unstage all
42
+ - actions menu → `discard file` — confirm and discard unstaged file
43
+ changes
30
44
  - `r` — refresh
31
45
  - `esc`/`q` — close
@@ -5,11 +5,12 @@ export declare class CommitComposer implements Focusable {
5
5
  private readonly staged_count;
6
6
  private readonly on_commit;
7
7
  private readonly on_cancel;
8
+ private readonly amend;
8
9
  private step;
9
10
  private selected_type;
10
11
  private conventional;
11
12
  private readonly input;
12
- constructor(theme: ModalTheme, staged_count: number, on_commit: (message: string) => void, on_cancel: () => void);
13
+ constructor(theme: ModalTheme, staged_count: number, on_commit: (message: string) => void, on_cancel: () => void, amend?: boolean);
13
14
  get focused(): boolean;
14
15
  set focused(value: boolean);
15
16
  render(width: number): string[];
@@ -13,15 +13,17 @@ export class CommitComposer {
13
13
  staged_count;
14
14
  on_commit;
15
15
  on_cancel;
16
+ amend;
16
17
  step = 'type';
17
18
  selected_type = 'feat';
18
19
  conventional = true;
19
20
  input = new Input();
20
- constructor(theme, staged_count, on_commit, on_cancel) {
21
+ constructor(theme, staged_count, on_commit, on_cancel, amend = false) {
21
22
  this.theme = theme;
22
23
  this.staged_count = staged_count;
23
24
  this.on_commit = on_commit;
24
25
  this.on_cancel = on_cancel;
26
+ this.amend = amend;
25
27
  this.input.onSubmit = (summary) => this.submit(summary);
26
28
  this.input.onEscape = () => this.on_cancel();
27
29
  }
@@ -62,7 +64,7 @@ export class CommitComposer {
62
64
  }
63
65
  render_type_picker(width) {
64
66
  const lines = [
65
- this.theme.bold('Commit staged changes'),
67
+ this.theme.bold(this.amend ? 'Amend last commit' : 'Commit staged changes'),
66
68
  this.theme.fg('muted', `${this.staged_count} staged file${this.staged_count === 1 ? '' : 's'}`),
67
69
  '',
68
70
  'Choose commit format:',
@@ -76,7 +78,7 @@ export class CommitComposer {
76
78
  render_summary(width) {
77
79
  const preview = this.build_message(this.input.getValue().trim());
78
80
  const lines = [
79
- this.theme.bold('Commit message'),
81
+ this.theme.bold(this.amend ? 'Amend message' : 'Commit message'),
80
82
  this.theme.fg('muted', `${this.staged_count} staged file${this.staged_count === 1 ? '' : 's'}`),
81
83
  '',
82
84
  this.conventional
@@ -87,7 +89,9 @@ export class CommitComposer {
87
89
  'Summary:',
88
90
  ...this.input.render(width),
89
91
  '',
90
- this.theme.fg('dim', 'enter commit • esc cancel'),
92
+ this.theme.fg('dim', this.amend
93
+ ? 'enter amend • esc cancel'
94
+ : 'enter commit • esc cancel'),
91
95
  ];
92
96
  return lines;
93
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commit-composer.js","sourceRoot":"","sources":["../src/commit-composer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commit-composer.js","sourceRoot":"","sources":["../src/commit-composer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function git(args: string[], cwd: string): Promise<string>;
2
+ export declare function git_with_input(args: string[], cwd: string, input: string): Promise<string>;
@@ -0,0 +1,35 @@
1
+ import { execFile, spawn } from 'node:child_process';
2
+ import { promisify } from 'node:util';
3
+ const exec_file = promisify(execFile);
4
+ export async function git(args, cwd) {
5
+ const { stdout } = await exec_file('git', args, {
6
+ cwd,
7
+ encoding: 'utf8',
8
+ maxBuffer: 1024 * 1024 * 8,
9
+ });
10
+ return stdout;
11
+ }
12
+ export async function git_with_input(args, cwd, input) {
13
+ return await new Promise((resolve, reject) => {
14
+ const child = spawn('git', args, { cwd, stdio: 'pipe' });
15
+ let stdout = '';
16
+ let stderr = '';
17
+ child.stdout.setEncoding('utf8');
18
+ child.stderr.setEncoding('utf8');
19
+ child.stdout.on('data', (chunk) => {
20
+ stdout += chunk;
21
+ });
22
+ child.stderr.on('data', (chunk) => {
23
+ stderr += chunk;
24
+ });
25
+ child.on('error', reject);
26
+ child.on('close', (code) => {
27
+ if (code === 0)
28
+ resolve(stdout);
29
+ else
30
+ reject(new Error(stderr || `git exited with status ${code}`));
31
+ });
32
+ child.stdin.end(input);
33
+ });
34
+ }
35
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/git/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,GAAG,CACxB,IAAc,EACd,GAAW;IAEX,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE;QAC/C,GAAG;QACH,QAAQ,EAAE,MAAM;QAChB,SAAS,EAAE,IAAI,GAAG,IAAI,GAAG,CAAC;KAC1B,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CACnC,IAAc,EACd,GAAW,EACX,KAAa;IAEb,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC;QACjB,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YAC1B,IAAI,IAAI,KAAK,CAAC;gBAAE,OAAO,CAAC,MAAM,CAAC,CAAC;;gBAE/B,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,0BAA0B,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { DiffHunk, DiffSection, DiffView, GitFile } from './types.js';
2
+ export declare function read_diff(cwd: string, file: GitFile): Promise<DiffView>;
3
+ export declare function parse_diff_hunks(raw: string, section: DiffSection): DiffHunk[];
4
+ export declare function changed_line_indexes(hunk: DiffHunk): number[];
5
+ export declare function stage_hunk(cwd: string, hunk: DiffHunk): Promise<void>;
6
+ export declare function unstage_hunk(cwd: string, hunk: DiffHunk): Promise<void>;
7
+ export declare function stage_line(cwd: string, hunk: DiffHunk, line_index: number): Promise<void>;
8
+ export declare function unstage_line(cwd: string, hunk: DiffHunk, line_index: number): Promise<void>;
9
+ export declare function build_line_patch(hunk: DiffHunk, line_index: number): string;
@@ -0,0 +1,152 @@
1
+ import { git, git_with_input } from './client.js';
2
+ import { format_git_error } from './errors.js';
3
+ import { git_path } from './operations.js';
4
+ export async function read_diff(cwd, file) {
5
+ const path = git_path(file);
6
+ if (file.state === 'untracked') {
7
+ return {
8
+ path: file.path,
9
+ lines: [
10
+ 'Untracked file',
11
+ '',
12
+ 'Press space or s to stage it.',
13
+ 'No diff is available until Git starts tracking the path.',
14
+ ],
15
+ hunks: [],
16
+ };
17
+ }
18
+ const lines = [];
19
+ const hunks = [];
20
+ const staged = await git(['diff', '--cached', '--', path], cwd).catch((error) => format_git_error(error));
21
+ const unstaged = await git(['diff', '--', path], cwd).catch((error) => format_git_error(error));
22
+ append_diff_section(lines, hunks, 'staged', staged);
23
+ if (staged.trim() && unstaged.trim())
24
+ lines.push('', '');
25
+ append_diff_section(lines, hunks, 'unstaged', unstaged);
26
+ if (lines.length === 0)
27
+ lines.push('No textual diff for this file.');
28
+ return { path: file.path, lines, hunks };
29
+ }
30
+ function append_diff_section(lines, hunks, section, raw) {
31
+ if (!raw.trim())
32
+ return;
33
+ lines.push(section.toUpperCase(), '');
34
+ const offset = lines.length;
35
+ const parsed = parse_diff_hunks(raw, section);
36
+ for (const hunk of parsed) {
37
+ hunks.push({ ...hunk, line_index: offset + hunk.line_index });
38
+ }
39
+ lines.push(...raw.split('\n'));
40
+ }
41
+ export function parse_diff_hunks(raw, section) {
42
+ const lines = raw.endsWith('\n')
43
+ ? raw.slice(0, -1).split('\n')
44
+ : raw.split('\n');
45
+ const hunks = [];
46
+ let file_header = [];
47
+ let current_hunk;
48
+ const flush_hunk = () => {
49
+ if (!current_hunk)
50
+ return;
51
+ hunks.push({
52
+ section,
53
+ line_index: current_hunk.start,
54
+ header: current_hunk.lines[0] ?? '@@',
55
+ patch: [...file_header, ...current_hunk.lines].join('\n'),
56
+ });
57
+ current_hunk = undefined;
58
+ };
59
+ for (let index = 0; index < lines.length; index++) {
60
+ const line = lines[index];
61
+ if (line.startsWith('diff --git ')) {
62
+ flush_hunk();
63
+ file_header = [line];
64
+ continue;
65
+ }
66
+ if (line.startsWith('@@')) {
67
+ flush_hunk();
68
+ current_hunk = { start: index, lines: [line] };
69
+ continue;
70
+ }
71
+ if (current_hunk)
72
+ current_hunk.lines.push(line);
73
+ else if (file_header.length > 0)
74
+ file_header.push(line);
75
+ }
76
+ flush_hunk();
77
+ return hunks;
78
+ }
79
+ export function changed_line_indexes(hunk) {
80
+ const lines = hunk.patch.split('\n');
81
+ const header_index = lines.findIndex((line) => line.startsWith('@@'));
82
+ if (header_index < 0)
83
+ return [];
84
+ return lines
85
+ .slice(header_index + 1)
86
+ .flatMap((line, index) => (line.startsWith('+') || line.startsWith('-')) &&
87
+ !line.startsWith('+++') &&
88
+ !line.startsWith('---')
89
+ ? [hunk.line_index + 1 + index]
90
+ : []);
91
+ }
92
+ export async function stage_hunk(cwd, hunk) {
93
+ if (hunk.section !== 'unstaged')
94
+ throw new Error('Selected hunk is already staged.');
95
+ await git_with_input(['apply', '--cached', '--whitespace=nowarn', '-'], cwd, `${hunk.patch}\n`);
96
+ }
97
+ export async function unstage_hunk(cwd, hunk) {
98
+ if (hunk.section !== 'staged')
99
+ throw new Error('Selected hunk is not staged.');
100
+ await git_with_input(['apply', '--cached', '--reverse', '--whitespace=nowarn', '-'], cwd, `${hunk.patch}\n`);
101
+ }
102
+ export async function stage_line(cwd, hunk, line_index) {
103
+ if (hunk.section !== 'unstaged')
104
+ throw new Error('Selected line is already staged.');
105
+ await git_with_input(['apply', '--cached', '--whitespace=nowarn', '-'], cwd, `${build_line_patch(hunk, line_index)}\n`);
106
+ }
107
+ export async function unstage_line(cwd, hunk, line_index) {
108
+ if (hunk.section !== 'staged')
109
+ throw new Error('Selected line is not staged.');
110
+ await git_with_input(['apply', '--cached', '--reverse', '--whitespace=nowarn', '-'], cwd, `${build_line_patch(hunk, line_index)}\n`);
111
+ }
112
+ export function build_line_patch(hunk, line_index) {
113
+ const lines = hunk.patch.split('\n');
114
+ const header_index = lines.findIndex((line) => line.startsWith('@@'));
115
+ if (header_index < 0)
116
+ throw new Error('Selected hunk has no header.');
117
+ const body_index = line_index - hunk.line_index - 1;
118
+ const body = lines.slice(header_index + 1);
119
+ const selected = body[body_index];
120
+ if (!selected ||
121
+ (!selected.startsWith('+') && !selected.startsWith('-'))) {
122
+ throw new Error('Selected line is not stageable.');
123
+ }
124
+ const next_body = body.flatMap((line, index) => {
125
+ if (index === body_index)
126
+ return [line];
127
+ if (line.startsWith('+'))
128
+ return [];
129
+ if (line.startsWith('-'))
130
+ return [` ${line.slice(1)}`];
131
+ return [line];
132
+ });
133
+ const header = rebuild_hunk_header(lines[header_index], next_body);
134
+ return [...lines.slice(0, header_index), header, ...next_body].join('\n');
135
+ }
136
+ function rebuild_hunk_header(header, body) {
137
+ const match = /^@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@(.*)$/.exec(header);
138
+ if (!match)
139
+ return header;
140
+ let old_count = 0;
141
+ let new_count = 0;
142
+ for (const line of body) {
143
+ if (line.startsWith('\\'))
144
+ continue;
145
+ if (!line.startsWith('+'))
146
+ old_count++;
147
+ if (!line.startsWith('-'))
148
+ new_count++;
149
+ }
150
+ return `@@ -${match[1]},${old_count} +${match[2]},${new_count} @@${match[3]}`;
151
+ }
152
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/git/diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAQ3C,MAAM,CAAC,KAAK,UAAU,SAAS,CAC9B,GAAW,EACX,IAAa;IAEb,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO;YACN,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE;gBACN,gBAAgB;gBAChB,EAAE;gBACF,+BAA+B;gBAC/B,0DAA0D;aAC1D;YACD,KAAK,EAAE,EAAE;SACT,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,MAAM,GAAG,CACvB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,EAChC,GAAG,CACH,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAC1D,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAClC,CAAC;IAEF,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,QAAQ,CAAC,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACzD,mBAAmB,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAE9C,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,mBAAmB,CAC3B,KAAe,EACf,KAAiB,EACjB,OAAoB,EACpB,GAAW;IAEX,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO;IACxB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC/D,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,GAAW,EACX,OAAoB;IAEpB,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC/B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAC9B,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,KAAK,GAAe,EAAE,CAAC;IAC7B,IAAI,WAAW,GAAa,EAAE,CAAC;IAC/B,IAAI,YAA4D,CAAC;IAEjE,MAAM,UAAU,GAAG,GAAS,EAAE;QAC7B,IAAI,CAAC,YAAY;YAAE,OAAO;QAC1B,KAAK,CAAC,IAAI,CAAC;YACV,OAAO;YACP,UAAU,EAAE,YAAY,CAAC,KAAK;YAC9B,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;YACrC,KAAK,EAAE,CAAC,GAAG,WAAW,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;SACzD,CAAC,CAAC;QACH,YAAY,GAAG,SAAS,CAAC;IAC1B,CAAC,CAAC;IAEF,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACpC,UAAU,EAAE,CAAC;YACb,WAAW,GAAG,CAAC,IAAI,CAAC,CAAC;YACrB,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,UAAU,EAAE,CAAC;YACb,YAAY,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,SAAS;QACV,CAAC;QACD,IAAI,YAAY;YAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aAC3C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IACD,UAAU,EAAE,CAAC;IACb,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAc;IAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CACrB,CAAC;IACF,IAAI,YAAY,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,KAAK;SACV,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC;SACvB,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACxB,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9C,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACvB,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACtB,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC;QAC/B,CAAC,CAAC,EAAE,CACL,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,GAAW,EACX,IAAc;IAEd,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU;QAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACrD,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,GAAG,CAAC,EACjD,GAAG,EACH,GAAG,IAAI,CAAC,KAAK,IAAI,CACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,GAAW,EACX,IAAc;IAEd,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ;QAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACjD,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,qBAAqB,EAAE,GAAG,CAAC,EAC9D,GAAG,EACH,GAAG,IAAI,CAAC,KAAK,IAAI,CACjB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,GAAW,EACX,IAAc,EACd,UAAkB;IAElB,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU;QAC9B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACrD,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,GAAG,CAAC,EACjD,GAAG,EACH,GAAG,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CACzC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,GAAW,EACX,IAAc,EACd,UAAkB;IAElB,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ;QAC5B,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACjD,MAAM,cAAc,CACnB,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,qBAAqB,EAAE,GAAG,CAAC,EAC9D,GAAG,EACH,GAAG,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC/B,IAAc,EACd,UAAkB;IAElB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE,CAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CACrB,CAAC;IACF,IAAI,YAAY,GAAG,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACjD,MAAM,UAAU,GAAG,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAClC,IACC,CAAC,QAAQ;QACT,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EACvD,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC9C,IAAI,KAAK,KAAK,UAAU;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,YAAY,CAAE,EAAE,SAAS,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC,IAAI,CAClE,IAAI,CACJ,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAc,EAAE,IAAc;IAC1D,MAAM,KAAK,GAAG,8CAA8C,CAAC,IAAI,CAChE,MAAM,CACN,CAAC;IACF,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,EAAE,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function format_git_error(error: unknown): string;
@@ -0,0 +1,17 @@
1
+ export function format_git_error(error) {
2
+ const message = error instanceof Error ? error.message : String(error);
3
+ if (message.includes('No staged changes'))
4
+ return 'No staged changes to commit.';
5
+ if (message.includes('nothing to commit'))
6
+ return 'Nothing to commit.';
7
+ if (message.includes('patch does not apply')) {
8
+ return 'Hunk no longer applies. Refresh and try again.';
9
+ }
10
+ if (message.includes('CONFLICT')) {
11
+ return 'Git conflict detected. Resolve conflict markers, then stage the file.';
12
+ }
13
+ if (message.includes('not a git repository'))
14
+ return 'Not inside a Git repository.';
15
+ return message;
16
+ }
17
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/git/errors.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC9C,MAAM,OAAO,GACZ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACxC,OAAO,8BAA8B,CAAC;IACvC,IAAI,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QACxC,OAAO,oBAAoB,CAAC;IAC7B,IAAI,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC9C,OAAO,gDAAgD,CAAC;IACzD,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO,uEAAuE,CAAC;IAChF,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC;QAC3C,OAAO,8BAA8B,CAAC;IACvC,OAAO,OAAO,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { GitFile } from './types.js';
2
+ export declare function git_path(file: GitFile): string;
3
+ export declare function stage_file(cwd: string, file: GitFile): Promise<void>;
4
+ export declare function unstage_file(cwd: string, file: GitFile): Promise<void>;
5
+ export declare function toggle_file(cwd: string, file: GitFile): Promise<void>;
6
+ export declare function stage_all(cwd: string): Promise<void>;
7
+ export declare function unstage_all(cwd: string): Promise<void>;
8
+ export declare function discard_file(cwd: string, file: GitFile): Promise<void>;
9
+ export declare function commit(cwd: string, message: string, options?: {
10
+ amend?: boolean;
11
+ }): Promise<void>;
@@ -0,0 +1,46 @@
1
+ import { git } from './client.js';
2
+ export function git_path(file) {
3
+ const arrow = ' → ';
4
+ return file.path.includes(arrow)
5
+ ? file.path.split(arrow).at(-1)
6
+ : file.path;
7
+ }
8
+ export async function stage_file(cwd, file) {
9
+ await git(['add', '--', git_path(file)], cwd);
10
+ }
11
+ export async function unstage_file(cwd, file) {
12
+ await git(['restore', '--staged', '--', git_path(file)], cwd);
13
+ }
14
+ export async function toggle_file(cwd, file) {
15
+ if (file.state === 'mixed') {
16
+ throw new Error('Partial file: space is disabled. Use s to stage worktree changes or x to unstage staged changes.');
17
+ }
18
+ if (file.state === 'conflicted') {
19
+ throw new Error('Conflicted file: resolve conflicts, then stage explicitly with s.');
20
+ }
21
+ if (file.state === 'staged')
22
+ await unstage_file(cwd, file);
23
+ else
24
+ await stage_file(cwd, file);
25
+ }
26
+ export async function stage_all(cwd) {
27
+ await git(['add', '--all'], cwd);
28
+ }
29
+ export async function unstage_all(cwd) {
30
+ await git(['restore', '--staged', '--', ':/'], cwd);
31
+ }
32
+ export async function discard_file(cwd, file) {
33
+ const path = git_path(file);
34
+ if (file.state === 'untracked')
35
+ await git(['clean', '-f', '--', path], cwd);
36
+ else
37
+ await git(['restore', '--worktree', '--', path], cwd);
38
+ }
39
+ export async function commit(cwd, message, options = {}) {
40
+ const args = ['commit'];
41
+ if (options.amend)
42
+ args.push('--amend');
43
+ args.push('-m', message);
44
+ await git(args, cwd);
45
+ }
46
+ //# sourceMappingURL=operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/git/operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGlC,MAAM,UAAU,QAAQ,CAAC,IAAa;IACrC,MAAM,KAAK,GAAG,KAAK,CAAC;IACpB,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAC/B,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE;QAChC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC/B,GAAW,EACX,IAAa;IAEb,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,GAAW,EACX,IAAa;IAEb,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAChC,GAAW,EACX,IAAa;IAEb,IAAI,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACd,kGAAkG,CAClG,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,YAAY,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CACd,mEAAmE,CACnE,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,KAAK,QAAQ;QAAE,MAAM,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;QACtD,MAAM,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,GAAW;IAC1C,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,GAAW;IAC5C,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CACjC,GAAW,EACX,IAAa;IAEb,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,IAAI,CAAC,KAAK,KAAK,WAAW;QAC7B,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;;QACxC,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC3B,GAAW,EACX,OAAe,EACf,UAA+B,EAAE;IAEjC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IACxB,IAAI,OAAO,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACzB,MAAM,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { RepoOverview } from './types.js';
2
+ export declare function read_repo_overview(cwd: string): Promise<RepoOverview>;
@@ -0,0 +1,23 @@
1
+ import { git } from './client.js';
2
+ import { format_git_error } from './errors.js';
3
+ export async function read_repo_overview(cwd) {
4
+ const [branches, log, stashes, remotes] = await Promise.all([
5
+ git(['branch', '--all', '--format=%(HEAD) %(refname:short)'], cwd).catch((error) => format_git_error(error)),
6
+ git(['log', '--oneline', '--decorate', '-n', '8'], cwd).catch((error) => format_git_error(error)),
7
+ git(['stash', 'list', '-n', '8'], cwd).catch((error) => format_git_error(error)),
8
+ git(['remote', '-v'], cwd).catch((error) => format_git_error(error)),
9
+ ]);
10
+ return {
11
+ branches: split_non_empty(branches),
12
+ log: split_non_empty(log),
13
+ stashes: split_non_empty(stashes),
14
+ remotes: split_non_empty(remotes),
15
+ };
16
+ }
17
+ function split_non_empty(raw) {
18
+ return raw
19
+ .split('\n')
20
+ .map((line) => line.trim())
21
+ .filter(Boolean);
22
+ }
23
+ //# sourceMappingURL=overview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/git/overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG/C,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACvC,GAAW;IAEX,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC3D,GAAG,CACF,CAAC,QAAQ,EAAE,OAAO,EAAE,mCAAmC,CAAC,EACxD,GAAG,CACH,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC3C,GAAG,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAC5D,CAAC,KAAK,EAAE,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAClC;QACD,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACtD,gBAAgB,CAAC,KAAK,CAAC,CACvB;QACD,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAC1C,gBAAgB,CAAC,KAAK,CAAC,CACvB;KACD,CAAC,CAAC;IACH,OAAO;QACN,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC;QACnC,GAAG,EAAE,eAAe,CAAC,GAAG,CAAC;QACzB,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC;QACjC,OAAO,EAAE,eAAe,CAAC,OAAO,CAAC;KACjC,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IACnC,OAAO,GAAG;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { GitFile, GitStatus } from './types.js';
2
+ export declare function read_status(cwd: string): Promise<GitStatus>;
3
+ export declare function parse_porcelain_z(raw: string): GitFile[];
4
+ export declare function has_staged_changes(files: GitFile[]): boolean;
5
+ export declare function staged_file_count(files: GitFile[]): number;
@@ -0,0 +1,85 @@
1
+ import { git } from './client.js';
2
+ export async function read_status(cwd) {
3
+ const [branch, upstream, raw] = await Promise.all([
4
+ git(['branch', '--show-current'], cwd).catch(() => 'detached'),
5
+ git([
6
+ 'rev-parse',
7
+ '--abbrev-ref',
8
+ '--symbolic-full-name',
9
+ '@{upstream}',
10
+ ], cwd).catch(() => ''),
11
+ git(['status', '--porcelain=v1', '-z'], cwd),
12
+ ]);
13
+ const counts = upstream.trim()
14
+ ? await read_ahead_behind(cwd)
15
+ : { ahead: 0, behind: 0 };
16
+ return {
17
+ branch: branch.trim() || 'detached',
18
+ upstream: upstream.trim() || undefined,
19
+ ...counts,
20
+ files: parse_porcelain_z(raw),
21
+ };
22
+ }
23
+ async function read_ahead_behind(cwd) {
24
+ const raw = await git(['rev-list', '--left-right', '--count', '@{upstream}...HEAD'], cwd).catch(() => '');
25
+ const [behind = '0', ahead = '0'] = raw.trim().split(/\s+/);
26
+ return { ahead: Number(ahead) || 0, behind: Number(behind) || 0 };
27
+ }
28
+ export function parse_porcelain_z(raw) {
29
+ if (!raw)
30
+ return [];
31
+ const entries = raw.split('\0').filter(Boolean);
32
+ const files = [];
33
+ for (let i = 0; i < entries.length; i++) {
34
+ const entry = entries[i];
35
+ const index_status = entry[0] ?? ' ';
36
+ const worktree_status = entry[1] ?? ' ';
37
+ let path = entry.slice(3);
38
+ if (index_status === 'R' || index_status === 'C') {
39
+ const original = entries[++i];
40
+ if (original)
41
+ path = `${original} → ${path}`;
42
+ }
43
+ files.push({
44
+ path,
45
+ index_status,
46
+ worktree_status,
47
+ state: get_file_state(index_status, worktree_status),
48
+ });
49
+ }
50
+ return files.sort((a, b) => state_rank(a.state) - state_rank(b.state) ||
51
+ a.path.localeCompare(b.path));
52
+ }
53
+ function get_file_state(index_status, worktree_status) {
54
+ if (index_status === '?' && worktree_status === '?')
55
+ return 'untracked';
56
+ if (index_status === 'U' ||
57
+ worktree_status === 'U' ||
58
+ (index_status === 'A' && worktree_status === 'A') ||
59
+ (index_status === 'D' && worktree_status === 'D')) {
60
+ return 'conflicted';
61
+ }
62
+ const has_index = index_status !== ' ';
63
+ const has_worktree = worktree_status !== ' ';
64
+ if (has_index && has_worktree)
65
+ return 'mixed';
66
+ if (has_index)
67
+ return 'staged';
68
+ return 'changed';
69
+ }
70
+ function state_rank(state) {
71
+ return [
72
+ 'conflicted',
73
+ 'changed',
74
+ 'untracked',
75
+ 'mixed',
76
+ 'staged',
77
+ ].indexOf(state);
78
+ }
79
+ export function has_staged_changes(files) {
80
+ return files.some((file) => file.index_status !== ' ' && file.index_status !== '?');
81
+ }
82
+ export function staged_file_count(files) {
83
+ return files.filter((file) => file.index_status !== ' ' && file.index_status !== '?').length;
84
+ }
85
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/git/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export type FileState = 'staged' | 'changed' | 'mixed' | 'untracked' | 'conflicted';
2
+ export interface GitFile {
3
+ path: string;
4
+ index_status: string;
5
+ worktree_status: string;
6
+ state: FileState;
7
+ }
8
+ export interface GitStatus {
9
+ branch: string;
10
+ upstream?: string;
11
+ ahead: number;
12
+ behind: number;
13
+ files: GitFile[];
14
+ }
15
+ export type DiffSection = 'staged' | 'unstaged';
16
+ export interface DiffHunk {
17
+ section: DiffSection;
18
+ line_index: number;
19
+ header: string;
20
+ patch: string;
21
+ }
22
+ export interface DiffView {
23
+ path: string;
24
+ lines: string[];
25
+ hunks: DiffHunk[];
26
+ }
27
+ export interface RepoOverview {
28
+ branches: string[];
29
+ log: string[];
30
+ stashes: string[];
31
+ remotes: string[];
32
+ }
33
+ export declare const EMPTY_STATUS: GitStatus;
@@ -0,0 +1,7 @@
1
+ export const EMPTY_STATUS = {
2
+ branch: 'unknown',
3
+ ahead: 0,
4
+ behind: 0,
5
+ files: [],
6
+ };
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/git/types.ts"],"names":[],"mappings":"AA4CA,MAAM,CAAC,MAAM,YAAY,GAAc;IACtC,MAAM,EAAE,SAAS;IACjB,KAAK,EAAE,CAAC;IACR,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,EAAE;CACT,CAAC"}