@amnesia2k/git-aic 2.1.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.
@@ -0,0 +1,394 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { arrows_3 } from "cli-loaders";
4
+ import { simpleGit } from "simple-git";
5
+ import chalk from "chalk";
6
+ import { getGitDiff, getBranchName, getHeadCommitInfo, getSelectedFileDiffs, getSelectedFilesDiff, } from "../src/git.js";
7
+ import { generateCommitMessage, generateDiffExplanations, generateDiffFileName, } from "../src/llm.js";
8
+ import { spawnSync } from "child_process";
9
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
10
+ import { join } from "path";
11
+ import { config, setStoredApiKey } from "../src/config.js";
12
+ const git = simpleGit();
13
+ const program = new Command();
14
+ const createLoader = () => {
15
+ let timer = null;
16
+ let frameIndex = 0;
17
+ let message = "";
18
+ const render = () => {
19
+ if (!process.stdout.isTTY) {
20
+ return;
21
+ }
22
+ const frame = arrows_3.keyframes[frameIndex % arrows_3.keyframes.length];
23
+ frameIndex += 1;
24
+ process.stdout.write(`\r${chalk.cyan(frame)} ${message}`);
25
+ };
26
+ const clear = () => {
27
+ if (!process.stdout.isTTY) {
28
+ return;
29
+ }
30
+ process.stdout.clearLine(0);
31
+ process.stdout.cursorTo(0);
32
+ };
33
+ return {
34
+ start(nextMessage) {
35
+ message = nextMessage;
36
+ frameIndex = 0;
37
+ render();
38
+ if (timer) {
39
+ clearInterval(timer);
40
+ }
41
+ timer = setInterval(render, arrows_3.speed);
42
+ },
43
+ update(nextMessage) {
44
+ message = nextMessage;
45
+ render();
46
+ },
47
+ succeed(doneMessage) {
48
+ if (timer) {
49
+ clearInterval(timer);
50
+ timer = null;
51
+ }
52
+ clear();
53
+ console.log(chalk.green(`OK ${doneMessage}`));
54
+ },
55
+ fail(errorMessage) {
56
+ if (timer) {
57
+ clearInterval(timer);
58
+ timer = null;
59
+ }
60
+ clear();
61
+ console.log(chalk.red(`ERROR ${errorMessage}`));
62
+ },
63
+ stop() {
64
+ if (timer) {
65
+ clearInterval(timer);
66
+ timer = null;
67
+ }
68
+ clear();
69
+ },
70
+ };
71
+ };
72
+ const normalizeLegacyDiffFlag = () => {
73
+ for (let index = 2; index < process.argv.length; index += 1) {
74
+ if (process.argv[index] === "-diff") {
75
+ process.argv[index] = "--diff";
76
+ }
77
+ }
78
+ };
79
+ const sanitizeFileSegment = (value) => value
80
+ .trim()
81
+ .replace(/[^a-zA-Z0-9-_]+/g, "-")
82
+ .replace(/-+/g, "-")
83
+ .replace(/^-|-$/g, "")
84
+ .toLowerCase();
85
+ const getChangedFiles = (status) => Array.from(new Set([
86
+ ...status.staged,
87
+ ...status.modified,
88
+ ...status.not_added,
89
+ ...status.created,
90
+ ...status.deleted,
91
+ ]));
92
+ const unstageFiles = async (files) => {
93
+ if (files.length === 0) {
94
+ return;
95
+ }
96
+ const restoreResult = spawnSync("git", ["restore", "--staged", "--", ...files], { stdio: "ignore" });
97
+ if (restoreResult.status === 0) {
98
+ return;
99
+ }
100
+ const resetResult = spawnSync("git", ["reset", "HEAD", "--", ...files], {
101
+ stdio: "ignore",
102
+ });
103
+ if (resetResult.status !== 0) {
104
+ throw new Error("Failed to update staged file selection");
105
+ }
106
+ };
107
+ const selectFilesForOperation = async (actionLabel, status, shouldStageSelection) => {
108
+ const changedFiles = getChangedFiles(status);
109
+ if (changedFiles.length === 0) {
110
+ return;
111
+ }
112
+ if (changedFiles.length === 1) {
113
+ const onlyFile = changedFiles[0];
114
+ if (shouldStageSelection && !status.staged.includes(onlyFile)) {
115
+ console.log(chalk.cyan(`\nOnly one changed file found: ${onlyFile}`));
116
+ console.log(chalk.blue("Staging 1 file..."));
117
+ await git.add(onlyFile);
118
+ }
119
+ return [onlyFile];
120
+ }
121
+ const p = await import("@clack/prompts");
122
+ p.intro(chalk.bgCyan(chalk.black(" Git AIC ")));
123
+ const selectedFiles = await p.multiselect({
124
+ message: `Select the files you want to ${actionLabel}:`,
125
+ options: changedFiles.map((file) => ({
126
+ value: file,
127
+ label: status.staged.includes(file) ? `${file} (staged)` : file,
128
+ })),
129
+ initialValues: status.staged,
130
+ required: false,
131
+ });
132
+ if (p.isCancel(selectedFiles) ||
133
+ !selectedFiles ||
134
+ selectedFiles.length === 0) {
135
+ p.outro(chalk.yellow("No files selected. Exiting."));
136
+ process.exit(0);
137
+ }
138
+ const filesToUse = selectedFiles;
139
+ if (!shouldStageSelection) {
140
+ p.outro(chalk.blue(`Using ${filesToUse.length} selected file(s)...`));
141
+ return filesToUse;
142
+ }
143
+ const filesToUnstage = status.staged.filter((file) => !filesToUse.includes(file));
144
+ const filesToStage = filesToUse.filter((file) => !status.staged.includes(file));
145
+ if (filesToUnstage.length > 0) {
146
+ await unstageFiles(filesToUnstage);
147
+ }
148
+ if (filesToStage.length > 0) {
149
+ p.outro(chalk.blue(`Staging ${filesToStage.length} file(s)...`));
150
+ await git.add(filesToStage);
151
+ }
152
+ else {
153
+ p.outro(chalk.blue(`Using ${filesToUse.length} selected file(s)...`));
154
+ }
155
+ return filesToUse;
156
+ };
157
+ const getAvailableMarkdownPath = (directory, baseName) => {
158
+ const cleanBaseName = sanitizeFileSegment(baseName) || "proposed-diff";
159
+ let candidate = join(directory, `${cleanBaseName}.md`);
160
+ let counter = 1;
161
+ while (existsSync(candidate)) {
162
+ candidate = join(directory, `${cleanBaseName}-${counter}.md`);
163
+ counter += 1;
164
+ }
165
+ return candidate;
166
+ };
167
+ const ensureGitDiffsIgnored = () => {
168
+ const gitignorePath = join(process.cwd(), ".gitignore");
169
+ const ignoreEntry = "git-diffs/";
170
+ if (!existsSync(gitignorePath)) {
171
+ writeFileSync(gitignorePath, `${ignoreEntry}\n`, "utf8");
172
+ return;
173
+ }
174
+ const currentContents = readFileSync(gitignorePath, "utf8");
175
+ const normalizedEntries = currentContents
176
+ .split(/\r?\n/)
177
+ .map((line) => line.trim());
178
+ if (normalizedEntries.includes(ignoreEntry) ||
179
+ normalizedEntries.includes("/git-diffs/") ||
180
+ normalizedEntries.includes("git-diffs") ||
181
+ normalizedEntries.includes("/git-diffs")) {
182
+ return;
183
+ }
184
+ const separator = currentContents.endsWith("\n") || currentContents.length === 0 ? "" : "\n";
185
+ writeFileSync(gitignorePath, `${currentContents}${separator}${ignoreEntry}\n`, "utf8");
186
+ };
187
+ const createDiffMarkdown = async (branchName, headCommit, fileDiffs, updateStatus) => {
188
+ updateStatus(`Explaining diffs with AI (${fileDiffs.length} files)`);
189
+ const explanations = await generateDiffExplanations(fileDiffs, branchName);
190
+ const sections = [];
191
+ for (let index = 0; index < fileDiffs.length; index += 1) {
192
+ const { filePath, diff } = fileDiffs[index];
193
+ updateStatus(`Formatting diff ${index + 1}/${fileDiffs.length}: ${filePath}`);
194
+ const explanation = explanations.get(filePath) ||
195
+ `Updates ${filePath} with the selected changes shown below.`;
196
+ sections.push([
197
+ `## ${filePath}`,
198
+ "",
199
+ explanation.trim(),
200
+ "",
201
+ "```diff",
202
+ diff.trimEnd(),
203
+ "```",
204
+ ].join("\n"));
205
+ }
206
+ const lines = [
207
+ "# Proposed Diff",
208
+ "",
209
+ "## Metadata",
210
+ "",
211
+ `- Generated: ${new Date().toISOString()}`,
212
+ `- Branch: ${branchName || "unknown"}`,
213
+ `- Base Commit: ${headCommit.short}`,
214
+ `- Base Commit Full: ${headCommit.full}`,
215
+ "",
216
+ "## Files",
217
+ "",
218
+ ...(fileDiffs.length > 0
219
+ ? fileDiffs.map(({ filePath }) => `- ${filePath}`)
220
+ : ["- No staged files detected"]),
221
+ "",
222
+ ...sections.flatMap((section) => [section, ""]),
223
+ ];
224
+ return lines.join("\n");
225
+ };
226
+ program
227
+ .name("git-aic")
228
+ .description("AI-powered Git commit using Google Gemini")
229
+ .version("1.0.0")
230
+ .option("-p, --push", "push after committing")
231
+ .option("-d, --diff", "write selected changes to a markdown diff report");
232
+ program
233
+ .command("show")
234
+ .description("Show current configuration")
235
+ .action(() => {
236
+ const rawKey = config.get("apiKey");
237
+ const displayKey = rawKey
238
+ ? `${rawKey.substring(0, 8)}${"*".repeat(Math.max(0, rawKey.length - 8))}`
239
+ : "not set";
240
+ console.log(chalk.cyan(`API Key: ${displayKey}`));
241
+ console.log(chalk.cyan(`Config path: ${config.path}`));
242
+ });
243
+ program
244
+ .command("set-key <key>")
245
+ .description("Set your Gemini API key persistently")
246
+ .action((key) => {
247
+ setStoredApiKey(key);
248
+ console.log(chalk.green("API key saved successfully."));
249
+ });
250
+ program
251
+ .command("alias")
252
+ .description("Set up 'git aic' alias")
253
+ .action(() => {
254
+ try {
255
+ spawnSync("git", ["config", "--global", "alias.aic", "!git-aic"], {
256
+ stdio: "inherit",
257
+ shell: true,
258
+ });
259
+ console.log(chalk.green("Alias 'git aic' set up successfully."));
260
+ console.log(chalk.cyan("Now you can use 'git aic' instead of 'git-aic'!"));
261
+ console.log(chalk.yellow("\nNote: Use 'git aic help' or 'git aic -h' for help. 'git aic --help' is reserved by Git for its internal documentation."));
262
+ }
263
+ catch (error) {
264
+ console.error(chalk.red("Failed to set up alias:"), error);
265
+ }
266
+ });
267
+ program
268
+ .command("help")
269
+ .description("Display help information")
270
+ .action(() => {
271
+ program.help();
272
+ });
273
+ program.action(async (options) => {
274
+ const loader = createLoader();
275
+ try {
276
+ loader.start("Inspecting repository changes");
277
+ let status = await git.status();
278
+ if (!options.diff && status.deleted.length > 0) {
279
+ loader.update(`Auto-staging ${status.deleted.length} deleted file(s)`);
280
+ await git.add(status.deleted);
281
+ status = await git.status();
282
+ }
283
+ const changedFiles = getChangedFiles(status);
284
+ if (changedFiles.length === 0) {
285
+ loader.stop();
286
+ console.log(chalk.yellow("No files changed in this repository."));
287
+ process.exit(0);
288
+ }
289
+ const actionLabel = options.diff
290
+ ? "include in the diff report"
291
+ : options.push
292
+ ? "commit and push"
293
+ : "commit";
294
+ let selectedFiles = [];
295
+ if (changedFiles.length > 1) {
296
+ loader.stop();
297
+ selectedFiles =
298
+ (await selectFilesForOperation(actionLabel, status, !options.diff)) ||
299
+ [];
300
+ }
301
+ else if (!status.staged.includes(changedFiles[0])) {
302
+ loader.stop();
303
+ selectedFiles =
304
+ (await selectFilesForOperation(actionLabel, status, !options.diff)) ||
305
+ [];
306
+ }
307
+ else {
308
+ selectedFiles = options.diff ? changedFiles : status.staged;
309
+ loader.succeed(options.diff
310
+ ? "Using the currently selected file set for diff report"
311
+ : "Using the currently staged file selection");
312
+ }
313
+ loader.start(options.diff ? "Checking selected changes" : "Checking staged changes");
314
+ const finalDiff = options.diff
315
+ ? await getSelectedFilesDiff(selectedFiles)
316
+ : await getGitDiff();
317
+ if (!finalDiff) {
318
+ loader.stop();
319
+ console.log(chalk.yellow(options.diff
320
+ ? "No selected changes found for the diff report!"
321
+ : "Still no changes to commit!"));
322
+ process.exit(0);
323
+ }
324
+ status = await git.status();
325
+ const filesBeingUsed = options.diff ? selectedFiles : status.staged;
326
+ loader.succeed(options.diff
327
+ ? "Collected selected changes for diff report"
328
+ : "Collected staged changes for commit");
329
+ console.log(chalk.blue(options.diff ? "\nFiles being documented:" : "\nFiles being committed:"));
330
+ filesBeingUsed.forEach((file) => console.log(chalk.cyan(`- ${file}`)));
331
+ console.log("");
332
+ if (options.diff) {
333
+ const branchName = await getBranchName();
334
+ const headCommit = await getHeadCommitInfo();
335
+ loader.start("Collecting selected file diffs");
336
+ const fileDiffs = await getSelectedFileDiffs(selectedFiles);
337
+ const outputDirectory = join(process.cwd(), "git-diffs");
338
+ const outputDirectoryExists = existsSync(outputDirectory);
339
+ loader.update("Preparing git-diffs output folder");
340
+ mkdirSync(outputDirectory, { recursive: true });
341
+ if (!outputDirectoryExists) {
342
+ loader.update("Adding git-diffs to .gitignore");
343
+ ensureGitDiffsIgnored();
344
+ }
345
+ loader.update("Generating AI report filename");
346
+ const aiFileName = await generateDiffFileName(finalDiff);
347
+ const markdownPath = getAvailableMarkdownPath(outputDirectory, aiFileName);
348
+ const markdown = await createDiffMarkdown(branchName, headCommit, fileDiffs, (message) => loader.update(message));
349
+ loader.update("Writing markdown report");
350
+ writeFileSync(markdownPath, markdown, "utf8");
351
+ loader.succeed(`Diff markdown written to ${markdownPath}`);
352
+ process.exit(0);
353
+ }
354
+ loader.start("Analyzing staged changes with AI");
355
+ const branchName = await getBranchName();
356
+ const message = await generateCommitMessage(finalDiff, branchName);
357
+ loader.succeed("Commit message generated");
358
+ console.log(chalk.green("Commit message generated:\n"));
359
+ console.log(chalk.green(`"${message}"\n`));
360
+ console.log(chalk.blue(`> ran: git commit -m\n"${message}"`));
361
+ // await git.commit(message);
362
+ const commitResult = spawnSync("git", ["commit", "-F", "-"], {
363
+ input: message,
364
+ stdio: ["pipe", "inherit", "inherit"],
365
+ });
366
+ if (commitResult.status !== 0) {
367
+ throw new Error(`Git commit failed with status ${commitResult.status}`);
368
+ }
369
+ console.log(chalk.green("\nCommit successful"));
370
+ if (options.push) {
371
+ console.log(chalk.blue("\n> ran: git push"));
372
+ const pushResult = spawnSync("git", ["push"], { stdio: "inherit" });
373
+ if (pushResult.status !== 0) {
374
+ throw new Error(`Git push failed with status ${pushResult.status}`);
375
+ }
376
+ console.log(chalk.green("Push successful"));
377
+ }
378
+ }
379
+ catch (error) {
380
+ if (error.name === "ExitPromptError" ||
381
+ error.message?.includes("force closed") ||
382
+ error.message?.includes("Prompt was canceled")) {
383
+ loader.stop();
384
+ console.log(chalk.yellow("\nCommit cancelled."));
385
+ process.exit(0);
386
+ }
387
+ loader.fail("Command failed");
388
+ console.error(chalk.red("Commit failed:"), error);
389
+ process.exit(1);
390
+ }
391
+ });
392
+ normalizeLegacyDiffFlag();
393
+ program.parse(process.argv);
394
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../bin/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import Conf from "conf";
2
+ export declare const config: Conf<any>;
3
+ export declare const getStoredApiKey: () => string | undefined;
4
+ export declare const setStoredApiKey: (key: string) => void;
@@ -0,0 +1,6 @@
1
+ import Conf from "conf";
2
+ // @ts-ignore
3
+ export const config = new Conf({ projectName: "git-aic" });
4
+ export const getStoredApiKey = () => config.get("apiKey");
5
+ export const setStoredApiKey = (key) => config.set("apiKey", key);
6
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,aAAa;AACb,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAuB,CAAC;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface FileDiff {
2
+ filePath: string;
3
+ diff: string;
4
+ }
5
+ export interface HeadCommitInfo {
6
+ short: string;
7
+ full: string;
8
+ }
9
+ export declare const getGitDiff: () => Promise<string>;
10
+ export declare const getBranchName: () => Promise<string>;
11
+ export declare const getStagedFileDiffs: () => Promise<FileDiff[]>;
12
+ export declare const getSelectedFileDiffs: (filePaths: string[]) => Promise<FileDiff[]>;
13
+ export declare const getSelectedFilesDiff: (filePaths: string[]) => Promise<string>;
14
+ export declare const getHeadCommitInfo: () => Promise<HeadCommitInfo>;
@@ -0,0 +1,116 @@
1
+ import { simpleGit } from "simple-git";
2
+ import { readFileSync } from "fs";
3
+ const git = simpleGit();
4
+ export const getGitDiff = async () => {
5
+ try {
6
+ await git.raw(["config", "core.autocrlf", "true"]);
7
+ const diff = await git.diff(["--cached", "--ignore-space-at-eol"]);
8
+ return diff || "";
9
+ }
10
+ catch (error) {
11
+ console.error(error);
12
+ return "";
13
+ }
14
+ };
15
+ export const getBranchName = async () => {
16
+ try {
17
+ const status = await git.status();
18
+ return status.current || "";
19
+ }
20
+ catch (error) {
21
+ console.error(error);
22
+ return "";
23
+ }
24
+ };
25
+ export const getStagedFileDiffs = async () => {
26
+ try {
27
+ const status = await git.status();
28
+ const fileDiffs = await Promise.all(status.staged.map(async (filePath) => {
29
+ const diff = await git.diff([
30
+ "--cached",
31
+ "--ignore-space-at-eol",
32
+ "--",
33
+ filePath,
34
+ ]);
35
+ return {
36
+ filePath,
37
+ diff: diff || "",
38
+ };
39
+ }));
40
+ return fileDiffs.filter((entry) => entry.diff.trim().length > 0);
41
+ }
42
+ catch (error) {
43
+ console.error(error);
44
+ return [];
45
+ }
46
+ };
47
+ const createUntrackedFileDiff = (filePath) => {
48
+ try {
49
+ const contents = readFileSync(filePath, "utf8");
50
+ const lines = contents.split(/\r?\n/);
51
+ const body = lines.map((line) => `+${line}`).join("\n");
52
+ return [
53
+ `diff --git a/${filePath} b/${filePath}`,
54
+ "new file mode 100644",
55
+ "index 0000000..0000000",
56
+ "--- /dev/null",
57
+ `+++ b/${filePath}`,
58
+ `@@ -0,0 +1,${lines.length} @@`,
59
+ body,
60
+ ].join("\n");
61
+ }
62
+ catch (error) {
63
+ console.error(error);
64
+ return "";
65
+ }
66
+ };
67
+ export const getSelectedFileDiffs = async (filePaths) => {
68
+ try {
69
+ const status = await git.status();
70
+ const fileDiffs = await Promise.all(filePaths.map(async (filePath) => {
71
+ if (status.not_added.includes(filePath)) {
72
+ return {
73
+ filePath,
74
+ diff: createUntrackedFileDiff(filePath),
75
+ };
76
+ }
77
+ const diff = await git.diff([
78
+ "HEAD",
79
+ "--ignore-space-at-eol",
80
+ "--",
81
+ filePath,
82
+ ]);
83
+ return {
84
+ filePath,
85
+ diff: diff || "",
86
+ };
87
+ }));
88
+ return fileDiffs.filter((entry) => entry.diff.trim().length > 0);
89
+ }
90
+ catch (error) {
91
+ console.error(error);
92
+ return [];
93
+ }
94
+ };
95
+ export const getSelectedFilesDiff = async (filePaths) => {
96
+ const fileDiffs = await getSelectedFileDiffs(filePaths);
97
+ return fileDiffs.map(({ diff }) => diff).join("\n\n");
98
+ };
99
+ export const getHeadCommitInfo = async () => {
100
+ try {
101
+ const full = (await git.revparse(["HEAD"])).trim();
102
+ const short = (await git.revparse(["--short", "HEAD"])).trim();
103
+ return {
104
+ short,
105
+ full,
106
+ };
107
+ }
108
+ catch (error) {
109
+ console.error(error);
110
+ return {
111
+ short: "unknown",
112
+ full: "unknown",
113
+ };
114
+ }
115
+ };
116
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/git.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ interface DiffFileInput {
2
+ filePath: string;
3
+ diff: string;
4
+ }
5
+ export declare const generateCommitMessage: (rawDiff: string, branchName: string) => Promise<string>;
6
+ export declare const generateDiffExplanation: (filePath: string, rawDiff: string, branchName: string) => Promise<string>;
7
+ export declare const generateDiffExplanations: (fileDiffs: DiffFileInput[], branchName: string) => Promise<Map<string, string>>;
8
+ export declare const generateDiffFileName: (rawDiff: string) => Promise<string>;
9
+ export {};