@ccpocket/bridge 1.29.1 → 1.31.0
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/git-assist.d.ts +7 -0
- package/dist/git-assist.js +51 -0
- package/dist/git-assist.js.map +1 -0
- package/dist/git-operations.d.ts +63 -0
- package/dist/git-operations.js +251 -0
- package/dist/git-operations.js.map +1 -0
- package/dist/parser.d.ts +138 -0
- package/dist/parser.js +194 -46
- package/dist/parser.js.map +1 -1
- package/dist/websocket.js +1022 -202
- package/dist/websocket.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { mkdtempSync, readFileSync, rmSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join, resolve } from "node:path";
|
|
5
|
+
import { getStagedDiff } from "./git-operations.js";
|
|
6
|
+
const COMMIT_MESSAGE_PROMPT = "Write a single Conventional Commits message in English for the staged changes below. Output only the commit message, with no quotes or explanation.";
|
|
7
|
+
const CODEX_COMMIT_MODEL = "gpt-5.4-mini";
|
|
8
|
+
export function generateCommitMessage(options) {
|
|
9
|
+
const diff = getStagedDiff(options.projectPath).trim();
|
|
10
|
+
if (!diff) {
|
|
11
|
+
throw new Error("Nothing to commit: no files are staged");
|
|
12
|
+
}
|
|
13
|
+
const cwd = resolve(options.projectPath);
|
|
14
|
+
const output = options.provider === "codex"
|
|
15
|
+
? runCodexCommitAssist(cwd, diff, options.model)
|
|
16
|
+
: execFileSync("claude", [
|
|
17
|
+
"-p",
|
|
18
|
+
...(options.model ? ["--model", options.model] : []),
|
|
19
|
+
COMMIT_MESSAGE_PROMPT,
|
|
20
|
+
], {
|
|
21
|
+
cwd,
|
|
22
|
+
encoding: "utf-8",
|
|
23
|
+
input: diff,
|
|
24
|
+
maxBuffer: 1024 * 1024,
|
|
25
|
+
});
|
|
26
|
+
const message = output
|
|
27
|
+
.split("\n")
|
|
28
|
+
.map((line) => line.trim())
|
|
29
|
+
.find(Boolean);
|
|
30
|
+
if (!message) {
|
|
31
|
+
throw new Error("Commit message generation returned empty output");
|
|
32
|
+
}
|
|
33
|
+
return message;
|
|
34
|
+
}
|
|
35
|
+
function runCodexCommitAssist(cwd, diff, _model) {
|
|
36
|
+
const outputDir = mkdtempSync(join(tmpdir(), "ccpocket-git-assist-"));
|
|
37
|
+
const outputPath = join(outputDir, "last-message.txt");
|
|
38
|
+
try {
|
|
39
|
+
execFileSync("codex", ["exec", "-m", CODEX_COMMIT_MODEL, "-o", outputPath, "-"], {
|
|
40
|
+
cwd,
|
|
41
|
+
encoding: "utf-8",
|
|
42
|
+
input: `${COMMIT_MESSAGE_PROMPT}\n\n${diff}`,
|
|
43
|
+
maxBuffer: 1024 * 1024,
|
|
44
|
+
});
|
|
45
|
+
return readFileSync(outputPath, "utf-8");
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
rmSync(outputDir, { recursive: true, force: true });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=git-assist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-assist.js","sourceRoot":"","sources":["../src/git-assist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,qBAAqB,GACzB,qJAAqJ,CAAC;AACxJ,MAAM,kBAAkB,GAAG,cAAc,CAAC;AAQ1C,MAAM,UAAU,qBAAqB,CAAC,OAAyB;IAC7D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACzC,MAAM,MAAM,GACV,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC1B,CAAC,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,YAAY,CACV,QAAQ,EACR;YACE,IAAI;YACJ,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACpD,qBAAqB;SACtB,EACD;YACE,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI,GAAG,IAAI;SACvB,CACF,CAAC;IAER,MAAM,OAAO,GAAG,MAAM;SACnB,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,IAAI,CAAC,OAAO,CAAC,CAAC;IACjB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAC3B,GAAW,EACX,IAAY,EACZ,MAAe;IAEf,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAEvD,IAAI,CAAC;QACH,YAAY,CACV,OAAO,EACP,CAAC,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,EACzD;YACE,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,GAAG,qBAAqB,OAAO,IAAI,EAAE;YAC5C,SAAS,EAAE,IAAI,GAAG,IAAI;SACvB,CACF,CAAC;QACF,OAAO,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export interface HunkRef {
|
|
2
|
+
file: string;
|
|
3
|
+
hunkIndex: number;
|
|
4
|
+
}
|
|
5
|
+
export interface CommitResult {
|
|
6
|
+
hash: string;
|
|
7
|
+
message: string;
|
|
8
|
+
}
|
|
9
|
+
export interface BranchRemoteStatus {
|
|
10
|
+
ahead: number;
|
|
11
|
+
behind: number;
|
|
12
|
+
hasUpstream: boolean;
|
|
13
|
+
}
|
|
14
|
+
export interface BranchListResult {
|
|
15
|
+
current: string;
|
|
16
|
+
branches: string[];
|
|
17
|
+
/** Branches currently checked out by main repo or worktrees (cannot switch to). */
|
|
18
|
+
checkedOutBranches: string[];
|
|
19
|
+
remoteStatusByBranch: Record<string, BranchRemoteStatus>;
|
|
20
|
+
}
|
|
21
|
+
/** Stage entire files. */
|
|
22
|
+
export declare function stageFiles(projectPath: string, files: string[]): void;
|
|
23
|
+
/**
|
|
24
|
+
* Stage specific hunks by extracting them from `git diff` and applying via `git apply --cached`.
|
|
25
|
+
*
|
|
26
|
+
* Groups hunks by file, extracts the diff header + requested hunks, then pipes through `git apply`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function stageHunks(projectPath: string, hunks: HunkRef[]): void;
|
|
29
|
+
/** Unstage files (remove from index, keep working tree changes). */
|
|
30
|
+
export declare function unstageFiles(projectPath: string, files: string[]): void;
|
|
31
|
+
/** Unstage specific hunks from the index, leaving the working tree intact. */
|
|
32
|
+
export declare function unstageHunks(projectPath: string, hunks: HunkRef[]): void;
|
|
33
|
+
/** Create a commit with the given message. Throws if nothing is staged. */
|
|
34
|
+
export declare function gitCommit(projectPath: string, message: string): CommitResult;
|
|
35
|
+
/** Return staged diff content for commit-message generation. */
|
|
36
|
+
export declare function getStagedDiff(projectPath: string): string;
|
|
37
|
+
/** Push to remote. */
|
|
38
|
+
export declare function gitPush(projectPath: string): void;
|
|
39
|
+
/** List branches and branches checked out by worktrees. */
|
|
40
|
+
export declare function listBranches(projectPath: string): BranchListResult;
|
|
41
|
+
/** Create a new branch, optionally checking it out. */
|
|
42
|
+
export declare function createBranch(projectPath: string, name: string, checkout?: boolean): void;
|
|
43
|
+
/** Checkout an existing branch. */
|
|
44
|
+
export declare function checkoutBranch(projectPath: string, branch: string): void;
|
|
45
|
+
/** Revert (discard) unstaged changes for specific files. */
|
|
46
|
+
export declare function revertFiles(projectPath: string, files: string[]): void;
|
|
47
|
+
/** Revert specific working-tree hunks, leaving the index intact. */
|
|
48
|
+
export declare function revertHunks(projectPath: string, hunks: HunkRef[]): void;
|
|
49
|
+
export interface RemoteStatusResult {
|
|
50
|
+
ahead: number;
|
|
51
|
+
behind: number;
|
|
52
|
+
branch: string;
|
|
53
|
+
hasUpstream: boolean;
|
|
54
|
+
}
|
|
55
|
+
/** Fetch from remote (non-blocking, returns when done). */
|
|
56
|
+
export declare function gitFetch(projectPath: string): void;
|
|
57
|
+
/** Get ahead/behind counts relative to upstream. */
|
|
58
|
+
export declare function gitRemoteStatus(projectPath: string): RemoteStatusResult;
|
|
59
|
+
/** Pull from remote (fetch + merge). */
|
|
60
|
+
export declare function gitPull(projectPath: string): {
|
|
61
|
+
success: boolean;
|
|
62
|
+
message: string;
|
|
63
|
+
};
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { realpathSync } from "node:fs";
|
|
3
|
+
import { resolve } from "node:path";
|
|
4
|
+
// ---- Helpers ----
|
|
5
|
+
function resolveProject(projectPath) {
|
|
6
|
+
return realpathSync(resolve(projectPath));
|
|
7
|
+
}
|
|
8
|
+
function git(args, cwd) {
|
|
9
|
+
return execFileSync("git", args, { cwd, encoding: "utf-8" }).trim();
|
|
10
|
+
}
|
|
11
|
+
function buildHunkPatch(diffText, file, indices) {
|
|
12
|
+
if (!diffText)
|
|
13
|
+
return null;
|
|
14
|
+
const lines = diffText.split("\n");
|
|
15
|
+
const hunkStarts = [];
|
|
16
|
+
for (let i = 0; i < lines.length; i++) {
|
|
17
|
+
if (lines[i].startsWith("@@")) {
|
|
18
|
+
hunkStarts.push(i);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (hunkStarts.length === 0)
|
|
22
|
+
return null;
|
|
23
|
+
const header = lines.slice(0, hunkStarts[0]).join("\n") + "\n";
|
|
24
|
+
const sortedIndices = [...new Set(indices)].sort((a, b) => a - b);
|
|
25
|
+
let patch = header;
|
|
26
|
+
for (const idx of sortedIndices) {
|
|
27
|
+
if (idx < 0 || idx >= hunkStarts.length) {
|
|
28
|
+
throw new Error(`Hunk index ${idx} out of range for file ${file} (${hunkStarts.length} hunks)`);
|
|
29
|
+
}
|
|
30
|
+
const start = hunkStarts[idx];
|
|
31
|
+
const end = idx + 1 < hunkStarts.length ? hunkStarts[idx + 1] : lines.length;
|
|
32
|
+
patch += lines.slice(start, end).join("\n") + "\n";
|
|
33
|
+
}
|
|
34
|
+
return patch;
|
|
35
|
+
}
|
|
36
|
+
function applyHunks(projectPath, hunks, options) {
|
|
37
|
+
const cwd = resolveProject(projectPath);
|
|
38
|
+
const byFile = new Map();
|
|
39
|
+
for (const h of hunks) {
|
|
40
|
+
const list = byFile.get(h.file) ?? [];
|
|
41
|
+
list.push(h.hunkIndex);
|
|
42
|
+
byFile.set(h.file, list);
|
|
43
|
+
}
|
|
44
|
+
for (const [file, indices] of byFile) {
|
|
45
|
+
const diffText = git([...options.diffArgs, "--", file], cwd);
|
|
46
|
+
const patch = buildHunkPatch(diffText, file, indices);
|
|
47
|
+
if (!patch)
|
|
48
|
+
continue;
|
|
49
|
+
execFileSync("git", [...options.applyArgs, "-"], {
|
|
50
|
+
cwd,
|
|
51
|
+
encoding: "utf-8",
|
|
52
|
+
input: patch,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// ---- Phase 1: Staging ----
|
|
57
|
+
/** Stage entire files. */
|
|
58
|
+
export function stageFiles(projectPath, files) {
|
|
59
|
+
const cwd = resolveProject(projectPath);
|
|
60
|
+
execFileSync("git", ["add", "--", ...files], { cwd, encoding: "utf-8" });
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Stage specific hunks by extracting them from `git diff` and applying via `git apply --cached`.
|
|
64
|
+
*
|
|
65
|
+
* Groups hunks by file, extracts the diff header + requested hunks, then pipes through `git apply`.
|
|
66
|
+
*/
|
|
67
|
+
export function stageHunks(projectPath, hunks) {
|
|
68
|
+
applyHunks(projectPath, hunks, {
|
|
69
|
+
diffArgs: ["diff", "--unified=0"],
|
|
70
|
+
applyArgs: ["apply", "--cached", "--unidiff-zero"],
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
/** Unstage files (remove from index, keep working tree changes). */
|
|
74
|
+
export function unstageFiles(projectPath, files) {
|
|
75
|
+
const cwd = resolveProject(projectPath);
|
|
76
|
+
execFileSync("git", ["reset", "HEAD", "--", ...files], {
|
|
77
|
+
cwd,
|
|
78
|
+
encoding: "utf-8",
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/** Unstage specific hunks from the index, leaving the working tree intact. */
|
|
82
|
+
export function unstageHunks(projectPath, hunks) {
|
|
83
|
+
applyHunks(projectPath, hunks, {
|
|
84
|
+
diffArgs: ["diff", "--cached", "--unified=0"],
|
|
85
|
+
applyArgs: ["apply", "-R", "--cached", "--unidiff-zero"],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// ---- Phase 2: Commit / Push ----
|
|
89
|
+
/** Create a commit with the given message. Throws if nothing is staged. */
|
|
90
|
+
export function gitCommit(projectPath, message) {
|
|
91
|
+
const cwd = resolveProject(projectPath);
|
|
92
|
+
// Check if there's anything staged
|
|
93
|
+
const staged = git(["diff", "--cached", "--name-only"], cwd);
|
|
94
|
+
if (!staged) {
|
|
95
|
+
throw new Error("Nothing to commit: no files are staged");
|
|
96
|
+
}
|
|
97
|
+
execFileSync("git", ["commit", "-m", message], { cwd, encoding: "utf-8" });
|
|
98
|
+
const hash = git(["rev-parse", "--short", "HEAD"], cwd);
|
|
99
|
+
return { hash, message };
|
|
100
|
+
}
|
|
101
|
+
/** Return staged diff content for commit-message generation. */
|
|
102
|
+
export function getStagedDiff(projectPath) {
|
|
103
|
+
const cwd = resolveProject(projectPath);
|
|
104
|
+
return execFileSync("git", ["diff", "--cached", "--no-color"], {
|
|
105
|
+
cwd,
|
|
106
|
+
encoding: "utf-8",
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
/** Push to remote. */
|
|
110
|
+
export function gitPush(projectPath) {
|
|
111
|
+
const cwd = resolveProject(projectPath);
|
|
112
|
+
const branch = git(["rev-parse", "--abbrev-ref", "HEAD"], cwd);
|
|
113
|
+
execFileSync("git", ["push", "--set-upstream", "origin", branch], {
|
|
114
|
+
cwd,
|
|
115
|
+
encoding: "utf-8",
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
// ---- Phase 3: Branch Operations ----
|
|
119
|
+
/** List branches and branches checked out by worktrees. */
|
|
120
|
+
export function listBranches(projectPath) {
|
|
121
|
+
const cwd = resolveProject(projectPath);
|
|
122
|
+
const current = git(["rev-parse", "--abbrev-ref", "HEAD"], cwd);
|
|
123
|
+
const output = git(["branch", "--list", "--format=%(refname:short)"], cwd);
|
|
124
|
+
const branches = output ? output.split("\n").filter(Boolean) : [];
|
|
125
|
+
// Collect branches checked out by worktrees (+ main repo)
|
|
126
|
+
const checkedOutBranches = [];
|
|
127
|
+
try {
|
|
128
|
+
const wtOutput = execFileSync("git", ["worktree", "list", "--porcelain"], {
|
|
129
|
+
cwd,
|
|
130
|
+
encoding: "utf-8",
|
|
131
|
+
});
|
|
132
|
+
for (const line of wtOutput.split("\n")) {
|
|
133
|
+
if (line.startsWith("branch ")) {
|
|
134
|
+
const branch = line
|
|
135
|
+
.slice("branch ".length)
|
|
136
|
+
.replace(/^refs\/heads\//, "");
|
|
137
|
+
checkedOutBranches.push(branch);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
/* ignore if worktree command fails */
|
|
143
|
+
}
|
|
144
|
+
const remoteStatusByBranch = Object.fromEntries(branches.map((branch) => [branch, getBranchRemoteStatus(cwd, branch)]));
|
|
145
|
+
return { current, branches, checkedOutBranches, remoteStatusByBranch };
|
|
146
|
+
}
|
|
147
|
+
function getBranchRemoteStatus(cwd, branch) {
|
|
148
|
+
const upstream = execFileSync("git", ["for-each-ref", "--format=%(upstream:short)", `refs/heads/${branch}`], { cwd, encoding: "utf-8" }).trim();
|
|
149
|
+
if (!upstream) {
|
|
150
|
+
return { ahead: 0, behind: 0, hasUpstream: false };
|
|
151
|
+
}
|
|
152
|
+
let ahead = 0;
|
|
153
|
+
let behind = 0;
|
|
154
|
+
try {
|
|
155
|
+
ahead =
|
|
156
|
+
parseInt(git(["rev-list", "--count", `${upstream}..${branch}`], cwd), 10) || 0;
|
|
157
|
+
}
|
|
158
|
+
catch {
|
|
159
|
+
ahead = 0;
|
|
160
|
+
}
|
|
161
|
+
try {
|
|
162
|
+
behind =
|
|
163
|
+
parseInt(git(["rev-list", "--count", `${branch}..${upstream}`], cwd), 10) || 0;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
behind = 0;
|
|
167
|
+
}
|
|
168
|
+
return { ahead, behind, hasUpstream: true };
|
|
169
|
+
}
|
|
170
|
+
/** Create a new branch, optionally checking it out. */
|
|
171
|
+
export function createBranch(projectPath, name, checkout) {
|
|
172
|
+
const cwd = resolveProject(projectPath);
|
|
173
|
+
if (checkout) {
|
|
174
|
+
execFileSync("git", ["checkout", "-b", name], { cwd, encoding: "utf-8" });
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
execFileSync("git", ["branch", name], { cwd, encoding: "utf-8" });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/** Checkout an existing branch. */
|
|
181
|
+
export function checkoutBranch(projectPath, branch) {
|
|
182
|
+
const cwd = resolveProject(projectPath);
|
|
183
|
+
execFileSync("git", ["checkout", branch], { cwd, encoding: "utf-8" });
|
|
184
|
+
}
|
|
185
|
+
/** Revert (discard) unstaged changes for specific files. */
|
|
186
|
+
export function revertFiles(projectPath, files) {
|
|
187
|
+
const cwd = resolveProject(projectPath);
|
|
188
|
+
execFileSync("git", ["checkout", "--", ...files], { cwd, encoding: "utf-8" });
|
|
189
|
+
}
|
|
190
|
+
/** Revert specific working-tree hunks, leaving the index intact. */
|
|
191
|
+
export function revertHunks(projectPath, hunks) {
|
|
192
|
+
applyHunks(projectPath, hunks, {
|
|
193
|
+
diffArgs: ["diff", "--unified=0"],
|
|
194
|
+
applyArgs: ["apply", "-R", "--unidiff-zero"],
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
/** Fetch from remote (non-blocking, returns when done). */
|
|
198
|
+
export function gitFetch(projectPath) {
|
|
199
|
+
const cwd = resolveProject(projectPath);
|
|
200
|
+
execFileSync("git", ["fetch", "--quiet"], {
|
|
201
|
+
cwd,
|
|
202
|
+
encoding: "utf-8",
|
|
203
|
+
timeout: 30000,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
/** Get ahead/behind counts relative to upstream. */
|
|
207
|
+
export function gitRemoteStatus(projectPath) {
|
|
208
|
+
const cwd = resolveProject(projectPath);
|
|
209
|
+
const branch = git(["rev-parse", "--abbrev-ref", "HEAD"], cwd);
|
|
210
|
+
// Check if upstream is configured
|
|
211
|
+
let hasUpstream = false;
|
|
212
|
+
try {
|
|
213
|
+
git(["rev-parse", "--abbrev-ref", `${branch}@{upstream}`], cwd);
|
|
214
|
+
hasUpstream = true;
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return { ahead: 0, behind: 0, branch, hasUpstream: false };
|
|
218
|
+
}
|
|
219
|
+
let ahead = 0;
|
|
220
|
+
let behind = 0;
|
|
221
|
+
try {
|
|
222
|
+
const aheadStr = git(["rev-list", "--count", `@{upstream}..HEAD`], cwd);
|
|
223
|
+
ahead = parseInt(aheadStr, 10) || 0;
|
|
224
|
+
}
|
|
225
|
+
catch {
|
|
226
|
+
/* ignore */
|
|
227
|
+
}
|
|
228
|
+
try {
|
|
229
|
+
const behindStr = git(["rev-list", "--count", `HEAD..@{upstream}`], cwd);
|
|
230
|
+
behind = parseInt(behindStr, 10) || 0;
|
|
231
|
+
}
|
|
232
|
+
catch {
|
|
233
|
+
/* ignore */
|
|
234
|
+
}
|
|
235
|
+
return { ahead, behind, branch, hasUpstream };
|
|
236
|
+
}
|
|
237
|
+
/** Pull from remote (fetch + merge). */
|
|
238
|
+
export function gitPull(projectPath) {
|
|
239
|
+
const cwd = resolveProject(projectPath);
|
|
240
|
+
try {
|
|
241
|
+
const output = execFileSync("git", ["pull"], {
|
|
242
|
+
cwd,
|
|
243
|
+
encoding: "utf-8",
|
|
244
|
+
}).trim();
|
|
245
|
+
return { success: true, message: output };
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
return { success: false, message: String(err) };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=git-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-operations.js","sourceRoot":"","sources":["../src/git-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA4BpC,oBAAoB;AAEpB,SAAS,cAAc,CAAC,WAAmB;IACzC,OAAO,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAS,GAAG,CAAC,IAAc,EAAE,GAAW;IACtC,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACtE,CAAC;AAED,SAAS,cAAc,CACrB,QAAgB,EAChB,IAAY,EACZ,OAAiB;IAEjB,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/D,MAAM,aAAa,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClE,IAAI,KAAK,GAAG,MAAM,CAAC;IAEnB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACxC,MAAM,IAAI,KAAK,CACb,cAAc,GAAG,0BAA0B,IAAI,KAAK,UAAU,CAAC,MAAM,SAAS,CAC/E,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC9B,MAAM,GAAG,GACP,GAAG,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QACnE,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACrD,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CACjB,WAAmB,EACnB,KAAgB,EAChB,OAGC;IAED,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE3C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACvB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;QAC7D,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,YAAY,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE;YAC/C,GAAG;YACH,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,6BAA6B;AAE7B,0BAA0B;AAC1B,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,KAAe;IAC7D,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,WAAmB,EAAE,KAAgB;IAC9D,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE;QAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;QACjC,SAAS,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,gBAAgB,CAAC;KACnD,CAAC,CAAC;AACL,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,KAAe;IAC/D,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,YAAY,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE;QACrD,GAAG;QACH,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,WAAmB,EAAE,KAAgB;IAChE,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE;QAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC;QAC7C,SAAS,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,CAAC;KACzD,CAAC,CAAC;AACL,CAAC;AAED,mCAAmC;AAEnC,2EAA2E;AAC3E,MAAM,UAAU,SAAS,CAAC,WAAmB,EAAE,OAAe;IAC5D,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAExC,mCAAmC;IACnC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7D,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IAED,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAE3E,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IACxD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,OAAO,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE;QAC7D,GAAG;QACH,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;AACL,CAAC;AAED,sBAAsB;AACtB,MAAM,UAAU,OAAO,CAAC,WAAmB;IACzC,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IAC/D,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE;QAChE,GAAG;QACH,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;AACL,CAAC;AAED,uCAAuC;AAEvC,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IAEhE,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,2BAA2B,CAAC,EAAE,GAAG,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElE,0DAA0D;IAC1D,MAAM,kBAAkB,GAAa,EAAE,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE;YACxE,GAAG;YACH,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,IAAI;qBAChB,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC;qBACvB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;gBACjC,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,MAAM,oBAAoB,GAAG,MAAM,CAAC,WAAW,CAC7C,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CACvE,CAAC;IAEF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;AACzE,CAAC;AAED,SAAS,qBAAqB,CAC5B,GAAW,EACX,MAAc;IAEd,MAAM,QAAQ,GAAG,YAAY,CAC3B,KAAK,EACL,CAAC,cAAc,EAAE,4BAA4B,EAAE,cAAc,MAAM,EAAE,CAAC,EACtE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAC3B,CAAC,IAAI,EAAE,CAAC;IAET,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,IAAI,CAAC;QACH,KAAK;YACH,QAAQ,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,QAAQ,KAAK,MAAM,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,GAAG,CAAC,CAAC;IACZ,CAAC;IAED,IAAI,CAAC;QACH,MAAM;YACJ,QAAQ,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,KAAK,QAAQ,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,CAAC,CAAC;IACb,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC9C,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAC1B,WAAmB,EACnB,IAAY,EACZ,QAAkB;IAElB,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,QAAQ,EAAE,CAAC;QACb,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;SAAM,CAAC;QACN,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,cAAc,CAAC,WAAmB,EAAE,MAAc;IAChE,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,KAAe;IAC9D,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,YAAY,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;AAChF,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,KAAgB;IAC/D,UAAU,CAAC,WAAW,EAAE,KAAK,EAAE;QAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;QACjC,SAAS,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,gBAAgB,CAAC;KAC7C,CAAC,CAAC;AACL,CAAC;AAWD,2DAA2D;AAC3D,MAAM,UAAU,QAAQ,CAAC,WAAmB;IAC1C,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,YAAY,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE;QACxC,GAAG;QACH,QAAQ,EAAE,OAAO;QACjB,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;AACL,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;IAE/D,kCAAkC;IAClC,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC;QACH,GAAG,CAAC,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,CAAC,CAAC;QAChE,WAAW,GAAG,IAAI,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC7D,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,mBAAmB,CAAC,EAAE,GAAG,CAAC,CAAC;QACxE,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,mBAAmB,CAAC,EAAE,GAAG,CAAC,CAAC;QACzE,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAChD,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,OAAO,CAAC,WAAmB;IAIzC,MAAM,GAAG,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE;YAC3C,GAAG;YACH,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IAClD,CAAC;AACH,CAAC"}
|
package/dist/parser.d.ts
CHANGED
|
@@ -151,12 +151,18 @@ export type ClientMessage = {
|
|
|
151
151
|
type: "list_gallery";
|
|
152
152
|
project?: string;
|
|
153
153
|
sessionId?: string;
|
|
154
|
+
} | {
|
|
155
|
+
type: "read_file";
|
|
156
|
+
projectPath: string;
|
|
157
|
+
filePath: string;
|
|
158
|
+
maxLines?: number;
|
|
154
159
|
} | {
|
|
155
160
|
type: "list_files";
|
|
156
161
|
projectPath: string;
|
|
157
162
|
} | {
|
|
158
163
|
type: "get_diff";
|
|
159
164
|
projectPath: string;
|
|
165
|
+
staged?: boolean;
|
|
160
166
|
} | {
|
|
161
167
|
type: "get_diff_image";
|
|
162
168
|
projectPath: string;
|
|
@@ -227,6 +233,66 @@ export type ClientMessage = {
|
|
|
227
233
|
} | {
|
|
228
234
|
type: "refresh_branch";
|
|
229
235
|
sessionId: string;
|
|
236
|
+
} | {
|
|
237
|
+
type: "git_stage";
|
|
238
|
+
projectPath: string;
|
|
239
|
+
files?: string[];
|
|
240
|
+
hunks?: {
|
|
241
|
+
file: string;
|
|
242
|
+
hunkIndex: number;
|
|
243
|
+
}[];
|
|
244
|
+
} | {
|
|
245
|
+
type: "git_unstage";
|
|
246
|
+
projectPath: string;
|
|
247
|
+
files?: string[];
|
|
248
|
+
} | {
|
|
249
|
+
type: "git_unstage_hunks";
|
|
250
|
+
projectPath: string;
|
|
251
|
+
hunks: {
|
|
252
|
+
file: string;
|
|
253
|
+
hunkIndex: number;
|
|
254
|
+
}[];
|
|
255
|
+
} | {
|
|
256
|
+
type: "git_commit";
|
|
257
|
+
projectPath: string;
|
|
258
|
+
sessionId?: string;
|
|
259
|
+
message?: string;
|
|
260
|
+
autoGenerate?: boolean;
|
|
261
|
+
} | {
|
|
262
|
+
type: "git_push";
|
|
263
|
+
projectPath: string;
|
|
264
|
+
} | {
|
|
265
|
+
type: "git_branches";
|
|
266
|
+
projectPath: string;
|
|
267
|
+
} | {
|
|
268
|
+
type: "git_create_branch";
|
|
269
|
+
projectPath: string;
|
|
270
|
+
name: string;
|
|
271
|
+
checkout?: boolean;
|
|
272
|
+
} | {
|
|
273
|
+
type: "git_checkout_branch";
|
|
274
|
+
projectPath: string;
|
|
275
|
+
branch: string;
|
|
276
|
+
} | {
|
|
277
|
+
type: "git_revert_file";
|
|
278
|
+
projectPath: string;
|
|
279
|
+
files: string[];
|
|
280
|
+
} | {
|
|
281
|
+
type: "git_revert_hunks";
|
|
282
|
+
projectPath: string;
|
|
283
|
+
hunks: {
|
|
284
|
+
file: string;
|
|
285
|
+
hunkIndex: number;
|
|
286
|
+
}[];
|
|
287
|
+
} | {
|
|
288
|
+
type: "git_fetch";
|
|
289
|
+
projectPath: string;
|
|
290
|
+
} | {
|
|
291
|
+
type: "git_pull";
|
|
292
|
+
projectPath: string;
|
|
293
|
+
} | {
|
|
294
|
+
type: "git_remote_status";
|
|
295
|
+
projectPath: string;
|
|
230
296
|
};
|
|
231
297
|
/** Image change detected in a git diff (binary image file). */
|
|
232
298
|
export interface ImageChange {
|
|
@@ -338,6 +404,14 @@ export type ServerMessage = {
|
|
|
338
404
|
} | {
|
|
339
405
|
type: "thinking_delta";
|
|
340
406
|
text: string;
|
|
407
|
+
} | {
|
|
408
|
+
type: "file_content";
|
|
409
|
+
filePath: string;
|
|
410
|
+
content: string;
|
|
411
|
+
language?: string;
|
|
412
|
+
error?: string;
|
|
413
|
+
totalLines?: number;
|
|
414
|
+
truncated?: boolean;
|
|
341
415
|
} | {
|
|
342
416
|
type: "file_list";
|
|
343
417
|
files: string[];
|
|
@@ -461,6 +535,70 @@ export type ServerMessage = {
|
|
|
461
535
|
name: string | null;
|
|
462
536
|
success: boolean;
|
|
463
537
|
error?: string;
|
|
538
|
+
} | {
|
|
539
|
+
type: "git_stage_result";
|
|
540
|
+
success: boolean;
|
|
541
|
+
error?: string;
|
|
542
|
+
} | {
|
|
543
|
+
type: "git_unstage_result";
|
|
544
|
+
success: boolean;
|
|
545
|
+
error?: string;
|
|
546
|
+
} | {
|
|
547
|
+
type: "git_unstage_hunks_result";
|
|
548
|
+
success: boolean;
|
|
549
|
+
error?: string;
|
|
550
|
+
} | {
|
|
551
|
+
type: "git_commit_result";
|
|
552
|
+
success: boolean;
|
|
553
|
+
commitHash?: string;
|
|
554
|
+
message?: string;
|
|
555
|
+
error?: string;
|
|
556
|
+
} | {
|
|
557
|
+
type: "git_push_result";
|
|
558
|
+
success: boolean;
|
|
559
|
+
error?: string;
|
|
560
|
+
} | {
|
|
561
|
+
type: "git_branches_result";
|
|
562
|
+
current: string;
|
|
563
|
+
branches: string[];
|
|
564
|
+
checkedOutBranches?: string[];
|
|
565
|
+
remoteStatusByBranch?: Record<string, {
|
|
566
|
+
ahead: number;
|
|
567
|
+
behind: number;
|
|
568
|
+
hasUpstream: boolean;
|
|
569
|
+
}>;
|
|
570
|
+
error?: string;
|
|
571
|
+
} | {
|
|
572
|
+
type: "git_create_branch_result";
|
|
573
|
+
success: boolean;
|
|
574
|
+
error?: string;
|
|
575
|
+
} | {
|
|
576
|
+
type: "git_checkout_branch_result";
|
|
577
|
+
success: boolean;
|
|
578
|
+
error?: string;
|
|
579
|
+
} | {
|
|
580
|
+
type: "git_revert_file_result";
|
|
581
|
+
success: boolean;
|
|
582
|
+
error?: string;
|
|
583
|
+
} | {
|
|
584
|
+
type: "git_revert_hunks_result";
|
|
585
|
+
success: boolean;
|
|
586
|
+
error?: string;
|
|
587
|
+
} | {
|
|
588
|
+
type: "git_fetch_result";
|
|
589
|
+
success: boolean;
|
|
590
|
+
error?: string;
|
|
591
|
+
} | {
|
|
592
|
+
type: "git_pull_result";
|
|
593
|
+
success: boolean;
|
|
594
|
+
message?: string;
|
|
595
|
+
error?: string;
|
|
596
|
+
} | {
|
|
597
|
+
type: "git_remote_status_result";
|
|
598
|
+
ahead: number;
|
|
599
|
+
behind: number;
|
|
600
|
+
branch: string;
|
|
601
|
+
hasUpstream: boolean;
|
|
464
602
|
};
|
|
465
603
|
export interface UsageWindowPayload {
|
|
466
604
|
utilization: number;
|