gut-cli 0.1.6 → 0.1.7

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
@@ -20,7 +20,10 @@ All AI commands support short aliases (without `ai-` prefix):
20
20
  | `gut ai-merge` | `gut merge` | Resolve merge conflicts |
21
21
  | `gut ai-explain` | `gut explain` | Explain changes, commits, PRs, or files |
22
22
  | `gut ai-find` | `gut find` | Find commits by vague description |
23
+ | `gut ai-branch` | `gut branch` | Generate branch names from description |
23
24
  | `gut changelog` | - | Generate changelogs |
25
+ | `gut sync` | - | Sync with remote (fetch + rebase/merge) |
26
+ | `gut stash` | - | Stash with AI-generated names |
24
27
 
25
28
  ### `gut commit`
26
29
 
@@ -167,6 +170,75 @@ gut find "authentication" --json
167
170
 
168
171
  **Project Context Support**: Create `.gut/find.md` to provide project-specific context for better search results.
169
172
 
173
+ ### `gut branch`
174
+
175
+ Generate branch names from GitHub issue or description using AI.
176
+
177
+ ```bash
178
+ # Generate branch name from issue number (requires gh CLI)
179
+ gut branch 123
180
+ gut branch #123
181
+
182
+ # Auto-checkout the branch
183
+ gut branch 123 --checkout
184
+
185
+ # Specify branch type
186
+ gut branch 123 --type fix
187
+
188
+ # Use description instead of issue
189
+ gut branch -d "add user authentication"
190
+ ```
191
+
192
+ **Branch Convention Support**: Create `.gut/branch-convention.md` for custom naming rules.
193
+
194
+ ### `gut sync`
195
+
196
+ Sync current branch with remote (fetch + rebase).
197
+
198
+ ```bash
199
+ # Sync current branch (rebase by default)
200
+ gut sync
201
+
202
+ # Use merge instead of rebase
203
+ gut sync --merge
204
+
205
+ # Auto-stash changes before sync
206
+ gut sync --stash
207
+
208
+ # Force sync with uncommitted changes
209
+ gut sync --force
210
+ ```
211
+
212
+ ### `gut stash`
213
+
214
+ Stash changes with AI-generated descriptive names.
215
+
216
+ ```bash
217
+ # Stash with AI-generated name
218
+ gut stash
219
+
220
+ # Stash with custom name
221
+ gut stash "working on auth"
222
+
223
+ # List all stashes
224
+ gut stash --list
225
+
226
+ # Apply latest stash
227
+ gut stash --apply
228
+
229
+ # Apply specific stash
230
+ gut stash --apply 2
231
+
232
+ # Pop stash
233
+ gut stash --pop
234
+
235
+ # Drop stash
236
+ gut stash --drop 1
237
+
238
+ # Clear all stashes
239
+ gut stash --clear
240
+ ```
241
+
170
242
  ### `gut changelog`
171
243
 
172
244
  Generate a changelog from commits.
@@ -239,6 +311,7 @@ gut looks for these configuration files in your repository:
239
311
  | `.gut/merge-strategy.md` | Merge conflict resolution rules |
240
312
  | `.gut/explain.md` | Project context for explanations |
241
313
  | `.gut/find.md` | Project context for commit search |
314
+ | `.gut/branch-convention.md` | Custom branch naming rules |
242
315
  | `.github/pull_request_template.md` | PR template (fallback) |
243
316
  | `CHANGELOG.md` | Changelog style (fallback) |
244
317
 
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  // src/index.ts
4
- import { Command as Command10 } from "commander";
4
+ import { Command as Command13 } from "commander";
5
5
 
6
6
  // src/commands/cleanup.ts
7
7
  import { Command } from "commander";
@@ -655,6 +655,67 @@ For each match, provide:
655
655
  summary: result.object.summary
656
656
  };
657
657
  }
658
+ async function generateBranchName(description, options, context) {
659
+ const model = await getModel(options);
660
+ const conventionInstructions = context?.convention ? `
661
+ IMPORTANT: Follow this project's branch naming convention:
662
+
663
+ --- CONVENTION START ---
664
+ ${context.convention}
665
+ --- CONVENTION END ---
666
+ ` : `
667
+ Rules:
668
+ - Use format: <type>/<short-description>
669
+ - Types: feature, fix, hotfix, chore, refactor, docs, test
670
+ - Use kebab-case for description
671
+ - Keep it short (under 50 chars total)
672
+ - No special characters except hyphens and slashes`;
673
+ const typeHint = context?.type ? `
674
+ Branch type: ${context.type}` : "";
675
+ const issueHint = context?.issue ? `
676
+ Include issue number: ${context.issue}` : "";
677
+ const prompt = `You are an expert at creating git branch names.
678
+
679
+ Generate a clean, descriptive branch name for the following:
680
+
681
+ Description: ${description}
682
+ ${typeHint}
683
+ ${issueHint}
684
+ ${conventionInstructions}
685
+
686
+ Respond with ONLY the branch name, nothing else.`;
687
+ const result = await generateText({
688
+ model,
689
+ prompt,
690
+ maxTokens: 100
691
+ });
692
+ return result.text.trim().replace(/[^a-zA-Z0-9/_-]/g, "");
693
+ }
694
+ async function generateStashName(diff, options) {
695
+ const model = await getModel(options);
696
+ const prompt = `You are an expert at summarizing code changes.
697
+
698
+ Generate a short, descriptive stash name for the following changes.
699
+
700
+ Rules:
701
+ - Start with "WIP: " prefix
702
+ - Keep it under 50 characters total
703
+ - Be specific about what the changes do
704
+ - Use present tense
705
+
706
+ Diff:
707
+ \`\`\`
708
+ ${diff.slice(0, 4e3)}
709
+ \`\`\`
710
+
711
+ Respond with ONLY the stash name, nothing else.`;
712
+ const result = await generateText({
713
+ model,
714
+ prompt,
715
+ maxTokens: 100
716
+ });
717
+ return result.text.trim();
718
+ }
658
719
  async function resolveConflict(conflictedContent, context, options, strategy) {
659
720
  const model = await getModel(options);
660
721
  const strategyInstructions = strategy ? `
@@ -771,14 +832,14 @@ var aiCommitCommand = new Command3("ai-commit").alias("commit").description("Gen
771
832
  console.log(chalk3.green("\u2713 Committed successfully"));
772
833
  } else if (answer.toLowerCase() === "e") {
773
834
  console.log(chalk3.gray("Opening editor..."));
774
- const { execSync: execSync3 } = await import("child_process");
835
+ const { execSync: execSync4 } = await import("child_process");
775
836
  const editor = process.env.EDITOR || process.env.VISUAL || "vi";
776
837
  const fs2 = await import("fs");
777
838
  const os = await import("os");
778
839
  const path2 = await import("path");
779
840
  const tmpFile = path2.join(os.tmpdir(), "gut-commit-msg.txt");
780
841
  fs2.writeFileSync(tmpFile, message);
781
- execSync3(`${editor} "${tmpFile}"`, { stdio: "inherit" });
842
+ execSync4(`${editor} "${tmpFile}"`, { stdio: "inherit" });
782
843
  const editedMessage = fs2.readFileSync(tmpFile, "utf-8").trim();
783
844
  fs2.unlinkSync(tmpFile);
784
845
  if (editedMessage) {
@@ -887,11 +948,11 @@ var aiPrCommand = new Command4("ai-pr").alias("pr").description("Generate a pull
887
948
  console.log(chalk4.gray("\u2500".repeat(50)));
888
949
  if (options.copy) {
889
950
  try {
890
- const { execSync: execSync3 } = await import("child_process");
951
+ const { execSync: execSync4 } = await import("child_process");
891
952
  const fullText = `${title}
892
953
 
893
954
  ${body}`;
894
- execSync3("pbcopy", { input: fullText });
955
+ execSync4("pbcopy", { input: fullText });
895
956
  console.log(chalk4.green("\n\u2713 Copied to clipboard"));
896
957
  } catch {
897
958
  console.log(chalk4.yellow("\n\u26A0 Could not copy to clipboard"));
@@ -910,10 +971,10 @@ ${body}`;
910
971
  if (answer.toLowerCase() === "y") {
911
972
  const createSpinner = ora3("Creating PR...").start();
912
973
  try {
913
- const { execSync: execSync3 } = await import("child_process");
974
+ const { execSync: execSync4 } = await import("child_process");
914
975
  const escapedTitle = title.replace(/"/g, '\\"');
915
976
  const escapedBody = body.replace(/"/g, '\\"');
916
- execSync3(
977
+ execSync4(
917
978
  `gh pr create --title "${escapedTitle}" --body "${escapedBody}" --base ${baseBranch}`,
918
979
  { stdio: "pipe" }
919
980
  );
@@ -1664,8 +1725,325 @@ function printResults(results, query) {
1664
1725
  }
1665
1726
  }
1666
1727
 
1728
+ // src/commands/ai-branch.ts
1729
+ import { Command as Command10 } from "commander";
1730
+ import chalk10 from "chalk";
1731
+ import ora9 from "ora";
1732
+ import { simpleGit as simpleGit9 } from "simple-git";
1733
+ import { existsSync as existsSync7, readFileSync as readFileSync7 } from "fs";
1734
+ import { join as join7 } from "path";
1735
+ import { execSync as execSync3 } from "child_process";
1736
+ var CONVENTION_PATHS2 = [".gut/branch-convention.md", ".github/branch-convention.md"];
1737
+ function findBranchConvention(repoRoot) {
1738
+ for (const conventionPath of CONVENTION_PATHS2) {
1739
+ const fullPath = join7(repoRoot, conventionPath);
1740
+ if (existsSync7(fullPath)) {
1741
+ return readFileSync7(fullPath, "utf-8");
1742
+ }
1743
+ }
1744
+ return null;
1745
+ }
1746
+ function getIssueInfo(issueNumber) {
1747
+ try {
1748
+ const result = execSync3(`gh issue view ${issueNumber} --json title,body`, {
1749
+ encoding: "utf-8",
1750
+ stdio: ["pipe", "pipe", "pipe"]
1751
+ });
1752
+ return JSON.parse(result);
1753
+ } catch {
1754
+ return null;
1755
+ }
1756
+ }
1757
+ var aiBranchCommand = new Command10("ai-branch").alias("branch").description("Generate a branch name from issue number or description").argument("[issue]", "Issue number (e.g., 123 or #123)").option("-d, --description <description>", "Use description instead of issue").option("-p, --provider <provider>", "AI provider (gemini, openai, anthropic)", "gemini").option("-m, --model <model>", "Model to use (provider-specific)").option("-t, --type <type>", "Branch type (feature, fix, hotfix, chore, refactor)").option("-c, --checkout", "Create and checkout the branch").action(async (issue, options) => {
1758
+ const git = simpleGit9();
1759
+ const repoRoot = await git.revparse(["--show-toplevel"]).catch(() => process.cwd());
1760
+ const isRepo = await git.checkIsRepo();
1761
+ if (!isRepo) {
1762
+ console.error(chalk10.red("Error: Not a git repository"));
1763
+ process.exit(1);
1764
+ }
1765
+ let description;
1766
+ let issueNumber;
1767
+ if (options.description) {
1768
+ description = options.description;
1769
+ } else if (issue) {
1770
+ issueNumber = issue.replace(/^#/, "");
1771
+ const spinner2 = ora9(`Fetching issue #${issueNumber}...`).start();
1772
+ const issueInfo = getIssueInfo(issueNumber);
1773
+ if (!issueInfo) {
1774
+ spinner2.fail(`Could not fetch issue #${issueNumber}`);
1775
+ console.log(chalk10.gray("Make sure gh CLI is installed and you are authenticated"));
1776
+ process.exit(1);
1777
+ }
1778
+ spinner2.stop();
1779
+ console.log(chalk10.gray(`Issue: ${issueInfo.title}`));
1780
+ description = `${issueInfo.title}
1781
+
1782
+ ${issueInfo.body || ""}`;
1783
+ } else {
1784
+ console.error(chalk10.red("Error: Please provide an issue number or use -d for description"));
1785
+ console.log(chalk10.gray("Usage:"));
1786
+ console.log(chalk10.gray(" gut branch 123"));
1787
+ console.log(chalk10.gray(' gut branch -d "add user authentication"'));
1788
+ process.exit(1);
1789
+ }
1790
+ const provider = options.provider.toLowerCase();
1791
+ const convention = findBranchConvention(repoRoot.trim());
1792
+ if (convention) {
1793
+ console.log(chalk10.gray("Using branch convention from project..."));
1794
+ }
1795
+ const spinner = ora9("Generating branch name...").start();
1796
+ try {
1797
+ const branchName = await generateBranchName(
1798
+ description,
1799
+ { provider, model: options.model },
1800
+ {
1801
+ type: options.type,
1802
+ issue: issueNumber,
1803
+ convention
1804
+ }
1805
+ );
1806
+ spinner.stop();
1807
+ console.log(chalk10.bold("\nGenerated branch name:\n"));
1808
+ console.log(chalk10.green(` ${branchName}`));
1809
+ console.log();
1810
+ if (options.checkout) {
1811
+ await git.checkoutLocalBranch(branchName);
1812
+ console.log(chalk10.green(`\u2713 Created and checked out branch: ${branchName}`));
1813
+ } else {
1814
+ const readline = await import("readline");
1815
+ const rl = readline.createInterface({
1816
+ input: process.stdin,
1817
+ output: process.stdout
1818
+ });
1819
+ const answer = await new Promise((resolve) => {
1820
+ rl.question(chalk10.cyan("Create and checkout this branch? (y/N) "), resolve);
1821
+ });
1822
+ rl.close();
1823
+ if (answer.toLowerCase() === "y") {
1824
+ await git.checkoutLocalBranch(branchName);
1825
+ console.log(chalk10.green(`\u2713 Created and checked out branch: ${branchName}`));
1826
+ } else {
1827
+ console.log(chalk10.gray("\nTo create manually:"));
1828
+ console.log(chalk10.gray(` git checkout -b ${branchName}`));
1829
+ }
1830
+ }
1831
+ } catch (error) {
1832
+ spinner.fail("Failed to generate branch name");
1833
+ console.error(chalk10.red(error instanceof Error ? error.message : "Unknown error"));
1834
+ process.exit(1);
1835
+ }
1836
+ });
1837
+
1838
+ // src/commands/sync.ts
1839
+ import { Command as Command11 } from "commander";
1840
+ import chalk11 from "chalk";
1841
+ import ora10 from "ora";
1842
+ import { simpleGit as simpleGit10 } from "simple-git";
1843
+ var syncCommand = new Command11("sync").description("Sync current branch with remote (fetch + rebase/merge)").option("-m, --merge", "Use merge instead of rebase").option("-a, --all", "Sync all branches").option("--stash", "Auto-stash changes before sync").option("-f, --force", "Force sync even with uncommitted changes").action(async (options) => {
1844
+ const git = simpleGit10();
1845
+ const isRepo = await git.checkIsRepo();
1846
+ if (!isRepo) {
1847
+ console.error(chalk11.red("Error: Not a git repository"));
1848
+ process.exit(1);
1849
+ }
1850
+ const spinner = ora10("Checking repository status...").start();
1851
+ try {
1852
+ const status = await git.status();
1853
+ const hasChanges = !status.isClean();
1854
+ if (hasChanges && !options.stash && !options.force) {
1855
+ spinner.stop();
1856
+ console.log(chalk11.yellow("You have uncommitted changes:"));
1857
+ if (status.modified.length > 0) {
1858
+ console.log(chalk11.gray(` Modified: ${status.modified.length} file(s)`));
1859
+ }
1860
+ if (status.not_added.length > 0) {
1861
+ console.log(chalk11.gray(` Untracked: ${status.not_added.length} file(s)`));
1862
+ }
1863
+ console.log();
1864
+ console.log(chalk11.gray("Use --stash to auto-stash, or --force to sync anyway"));
1865
+ process.exit(1);
1866
+ }
1867
+ let stashed = false;
1868
+ if (hasChanges && options.stash) {
1869
+ spinner.text = "Stashing changes...";
1870
+ await git.stash(["push", "-m", `gut-sync: auto-stash before sync`]);
1871
+ stashed = true;
1872
+ }
1873
+ spinner.text = "Fetching from remote...";
1874
+ await git.fetch(["--all", "--prune"]);
1875
+ const currentBranch = status.current;
1876
+ if (!currentBranch) {
1877
+ spinner.fail("Could not determine current branch");
1878
+ process.exit(1);
1879
+ }
1880
+ const trackingBranch = status.tracking;
1881
+ if (!trackingBranch) {
1882
+ spinner.warn(`Branch ${currentBranch} has no upstream tracking branch`);
1883
+ console.log(chalk11.gray(`
1884
+ To set upstream: git push -u origin ${currentBranch}`));
1885
+ if (stashed) {
1886
+ await git.stash(["pop"]);
1887
+ console.log(chalk11.gray("Restored stashed changes"));
1888
+ }
1889
+ return;
1890
+ }
1891
+ const strategy = options.merge ? "merge" : "rebase";
1892
+ spinner.text = `Syncing with ${trackingBranch} (${strategy})...`;
1893
+ try {
1894
+ if (options.merge) {
1895
+ await git.merge([trackingBranch]);
1896
+ } else {
1897
+ await git.rebase([trackingBranch]);
1898
+ }
1899
+ } catch (error) {
1900
+ spinner.fail(`${strategy} failed - you may have conflicts`);
1901
+ console.log(chalk11.yellow("\nResolve conflicts and then:"));
1902
+ if (options.merge) {
1903
+ console.log(chalk11.gray(" git add . && git commit"));
1904
+ } else {
1905
+ console.log(chalk11.gray(" git add . && git rebase --continue"));
1906
+ }
1907
+ if (stashed) {
1908
+ console.log(chalk11.yellow("\nNote: You have stashed changes. Run `git stash pop` after resolving."));
1909
+ }
1910
+ process.exit(1);
1911
+ }
1912
+ const newStatus = await git.status();
1913
+ const ahead = newStatus.ahead || 0;
1914
+ const behind = newStatus.behind || 0;
1915
+ spinner.succeed(chalk11.green("Synced successfully"));
1916
+ if (ahead > 0) {
1917
+ console.log(chalk11.cyan(` \u2191 ${ahead} commit(s) ahead - run 'git push' to publish`));
1918
+ }
1919
+ if (behind > 0) {
1920
+ console.log(chalk11.yellow(` \u2193 ${behind} commit(s) behind`));
1921
+ }
1922
+ if (stashed) {
1923
+ spinner.start("Restoring stashed changes...");
1924
+ try {
1925
+ await git.stash(["pop"]);
1926
+ spinner.succeed("Restored stashed changes");
1927
+ } catch {
1928
+ spinner.warn("Could not auto-restore stash (may have conflicts)");
1929
+ console.log(chalk11.gray(" Run `git stash pop` manually"));
1930
+ }
1931
+ }
1932
+ } catch (error) {
1933
+ spinner.fail("Sync failed");
1934
+ console.error(chalk11.red(error instanceof Error ? error.message : "Unknown error"));
1935
+ process.exit(1);
1936
+ }
1937
+ });
1938
+
1939
+ // src/commands/stash.ts
1940
+ import { Command as Command12 } from "commander";
1941
+ import chalk12 from "chalk";
1942
+ import ora11 from "ora";
1943
+ import { simpleGit as simpleGit11 } from "simple-git";
1944
+ var stashCommand = new Command12("stash").description("Stash changes with AI-generated name").argument("[name]", "Custom stash name (skips AI generation)").option("-p, --provider <provider>", "AI provider (gemini, openai, anthropic)", "gemini").option("-m, --model <model>", "Model to use (provider-specific)").option("-l, --list", "List all stashes").option("-a, --apply [index]", "Apply stash (default: latest)").option("--pop [index]", "Pop stash (default: latest)").option("-d, --drop [index]", "Drop stash").option("--clear", "Clear all stashes").action(async (name, options) => {
1945
+ const git = simpleGit11();
1946
+ const isRepo = await git.checkIsRepo();
1947
+ if (!isRepo) {
1948
+ console.error(chalk12.red("Error: Not a git repository"));
1949
+ process.exit(1);
1950
+ }
1951
+ if (options.list) {
1952
+ const stashList = await git.stashList();
1953
+ if (stashList.all.length === 0) {
1954
+ console.log(chalk12.gray("No stashes found"));
1955
+ return;
1956
+ }
1957
+ console.log(chalk12.bold("\nStashes:\n"));
1958
+ stashList.all.forEach((stash, index) => {
1959
+ console.log(` ${chalk12.cyan(index.toString())} ${stash.message}`);
1960
+ });
1961
+ console.log();
1962
+ return;
1963
+ }
1964
+ if (options.apply !== void 0) {
1965
+ const index = typeof options.apply === "string" ? options.apply : "0";
1966
+ try {
1967
+ await git.stash(["apply", `stash@{${index}}`]);
1968
+ console.log(chalk12.green(`\u2713 Applied stash@{${index}}`));
1969
+ } catch (error) {
1970
+ console.error(chalk12.red(`Failed to apply stash: ${error instanceof Error ? error.message : "Unknown error"}`));
1971
+ process.exit(1);
1972
+ }
1973
+ return;
1974
+ }
1975
+ if (options.pop !== void 0) {
1976
+ const index = typeof options.pop === "string" ? options.pop : "0";
1977
+ try {
1978
+ await git.stash(["pop", `stash@{${index}}`]);
1979
+ console.log(chalk12.green(`\u2713 Popped stash@{${index}}`));
1980
+ } catch (error) {
1981
+ console.error(chalk12.red(`Failed to pop stash: ${error instanceof Error ? error.message : "Unknown error"}`));
1982
+ process.exit(1);
1983
+ }
1984
+ return;
1985
+ }
1986
+ if (options.drop !== void 0) {
1987
+ const index = typeof options.drop === "string" ? options.drop : "0";
1988
+ try {
1989
+ await git.stash(["drop", `stash@{${index}}`]);
1990
+ console.log(chalk12.green(`\u2713 Dropped stash@{${index}}`));
1991
+ } catch (error) {
1992
+ console.error(chalk12.red(`Failed to drop stash: ${error instanceof Error ? error.message : "Unknown error"}`));
1993
+ process.exit(1);
1994
+ }
1995
+ return;
1996
+ }
1997
+ if (options.clear) {
1998
+ const readline = await import("readline");
1999
+ const rl = readline.createInterface({
2000
+ input: process.stdin,
2001
+ output: process.stdout
2002
+ });
2003
+ const answer = await new Promise((resolve) => {
2004
+ rl.question(chalk12.yellow("Clear all stashes? This cannot be undone. (y/N) "), resolve);
2005
+ });
2006
+ rl.close();
2007
+ if (answer.toLowerCase() === "y") {
2008
+ await git.stash(["clear"]);
2009
+ console.log(chalk12.green("\u2713 Cleared all stashes"));
2010
+ } else {
2011
+ console.log(chalk12.gray("Cancelled"));
2012
+ }
2013
+ return;
2014
+ }
2015
+ const status = await git.status();
2016
+ if (status.isClean()) {
2017
+ console.log(chalk12.yellow("No changes to stash"));
2018
+ return;
2019
+ }
2020
+ let stashName;
2021
+ if (name) {
2022
+ stashName = name;
2023
+ } else {
2024
+ const provider = options.provider.toLowerCase();
2025
+ const diff = await git.diff();
2026
+ const stagedDiff = await git.diff(["--cached"]);
2027
+ const fullDiff = diff + "\n" + stagedDiff;
2028
+ if (!fullDiff.trim()) {
2029
+ stashName = `WIP: untracked files (${status.not_added.length} files)`;
2030
+ } else {
2031
+ const spinner = ora11("Generating stash name...").start();
2032
+ try {
2033
+ stashName = await generateStashName(fullDiff, { provider, model: options.model });
2034
+ spinner.stop();
2035
+ } catch (error) {
2036
+ spinner.fail("Failed to generate name, using default");
2037
+ stashName = `WIP: ${status.modified.length} modified, ${status.not_added.length} untracked`;
2038
+ }
2039
+ }
2040
+ }
2041
+ await git.stash(["push", "-u", "-m", stashName]);
2042
+ console.log(chalk12.green(`\u2713 Stashed: ${stashName}`));
2043
+ });
2044
+
1667
2045
  // src/index.ts
1668
- var program = new Command10();
2046
+ var program = new Command13();
1669
2047
  program.name("gut").description("Git Utility Tool - AI-powered git commands").version("0.1.0");
1670
2048
  program.addCommand(cleanupCommand);
1671
2049
  program.addCommand(authCommand);
@@ -1676,5 +2054,8 @@ program.addCommand(aiMergeCommand);
1676
2054
  program.addCommand(changelogCommand);
1677
2055
  program.addCommand(aiExplainCommand);
1678
2056
  program.addCommand(aiFindCommand);
2057
+ program.addCommand(aiBranchCommand);
2058
+ program.addCommand(syncCommand);
2059
+ program.addCommand(stashCommand);
1679
2060
  program.parse();
1680
2061
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/commands/cleanup.ts","../src/commands/auth.ts","../src/lib/credentials.ts","../src/commands/ai-commit.ts","../src/lib/ai.ts","../src/commands/ai-pr.ts","../src/commands/ai-review.ts","../src/commands/ai-merge.ts","../src/commands/changelog.ts","../src/commands/ai-explain.ts","../src/commands/ai-find.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { cleanupCommand } from './commands/cleanup.js'\nimport { authCommand } from './commands/auth.js'\nimport { aiCommitCommand } from './commands/ai-commit.js'\nimport { aiPrCommand } from './commands/ai-pr.js'\nimport { aiReviewCommand } from './commands/ai-review.js'\nimport { aiMergeCommand } from './commands/ai-merge.js'\nimport { changelogCommand } from './commands/changelog.js'\nimport { aiExplainCommand } from './commands/ai-explain.js'\nimport { aiFindCommand } from './commands/ai-find.js'\n\nconst program = new Command()\n\nprogram\n .name('gut')\n .description('Git Utility Tool - AI-powered git commands')\n .version('0.1.0')\n\n// Branch management\nprogram.addCommand(cleanupCommand)\n\n// Authentication\nprogram.addCommand(authCommand)\n\n// AI-powered commands\nprogram.addCommand(aiCommitCommand)\nprogram.addCommand(aiPrCommand)\nprogram.addCommand(aiReviewCommand)\nprogram.addCommand(aiMergeCommand)\nprogram.addCommand(changelogCommand)\nprogram.addCommand(aiExplainCommand)\nprogram.addCommand(aiFindCommand)\n\nprogram.parse()\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\n\nexport const cleanupCommand = new Command('cleanup')\n .description('Delete merged branches safely')\n .option('-r, --remote', 'Also delete remote branches')\n .option('-f, --force', 'Skip confirmation prompt')\n .option('--dry-run', 'Show branches that would be deleted without deleting')\n .option('--base <branch>', 'Base branch to compare against (default: main or master)')\n .action(async (options) => {\n const git = simpleGit()\n\n // Check if we're in a git repository\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const spinner = ora('Fetching branch information...').start()\n\n try {\n // Fetch latest from remote\n await git.fetch(['--prune'])\n\n // Get current branch\n const currentBranch = (await git.branch()).current\n\n // Determine base branch\n const baseBranch = options.base || (await detectBaseBranch(git))\n spinner.text = `Using ${chalk.cyan(baseBranch)} as base branch`\n\n // Get merged branches\n const mergedResult = await git.branch(['--merged', baseBranch])\n const mergedBranches = mergedResult.all.filter((branch) => {\n const cleanName = branch.trim().replace(/^\\* /, '')\n // Exclude current branch, base branch, and remote tracking branches\n return (\n cleanName !== currentBranch &&\n cleanName !== baseBranch &&\n !cleanName.startsWith('remotes/') &&\n cleanName !== 'main' &&\n cleanName !== 'master' &&\n cleanName !== 'develop'\n )\n })\n\n spinner.stop()\n\n if (mergedBranches.length === 0) {\n console.log(chalk.green('✓ No merged branches to clean up'))\n return\n }\n\n console.log(chalk.yellow(`\\nFound ${mergedBranches.length} merged branch(es):\\n`))\n mergedBranches.forEach((branch) => {\n console.log(` ${chalk.red('•')} ${branch}`)\n })\n\n if (options.dryRun) {\n console.log(chalk.blue('\\n(dry-run mode - no branches were deleted)'))\n return\n }\n\n if (!options.force) {\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.yellow('\\nDelete these branches? (y/N) '), resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() !== 'y') {\n console.log(chalk.gray('Cancelled'))\n return\n }\n }\n\n // Delete branches\n const deleteSpinner = ora('Deleting branches...').start()\n\n for (const branch of mergedBranches) {\n try {\n await git.deleteLocalBranch(branch, true)\n deleteSpinner.text = `Deleted ${branch}`\n\n if (options.remote) {\n try {\n await git.push('origin', `:${branch}`)\n } catch {\n // Remote branch might not exist, ignore\n }\n }\n } catch (error) {\n deleteSpinner.warn(`Failed to delete ${branch}`)\n }\n }\n\n deleteSpinner.succeed(chalk.green(`Deleted ${mergedBranches.length} branch(es)`))\n } catch (error) {\n spinner.fail('Failed to cleanup branches')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\nasync function detectBaseBranch(git: ReturnType<typeof simpleGit>): Promise<string> {\n const branches = await git.branch()\n if (branches.all.includes('main')) return 'main'\n if (branches.all.includes('master')) return 'master'\n return 'main'\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport {\n saveApiKey,\n deleteApiKey,\n listProviders,\n getProviderDisplayName,\n Provider\n} from '../lib/credentials.js'\n\nconst PROVIDERS: Provider[] = ['gemini', 'openai', 'anthropic']\n\nasync function readSecretInput(prompt: string): Promise<string> {\n return new Promise((resolve) => {\n process.stdout.write(chalk.cyan(prompt))\n\n let input = ''\n const stdin = process.stdin\n\n stdin.setRawMode(true)\n stdin.resume()\n stdin.setEncoding('utf8')\n\n const onData = (char: string) => {\n const charCode = char.charCodeAt(0)\n\n if (charCode === 13 || charCode === 10) {\n // Enter key\n stdin.setRawMode(false)\n stdin.pause()\n stdin.removeListener('data', onData)\n console.log() // New line after input\n resolve(input)\n } else if (charCode === 127 || charCode === 8) {\n // Backspace\n if (input.length > 0) {\n input = input.slice(0, -1)\n process.stdout.write('\\b \\b')\n }\n } else if (charCode === 3) {\n // Ctrl+C\n stdin.setRawMode(false)\n stdin.pause()\n console.log()\n process.exit(0)\n } else if (charCode >= 32) {\n // Printable characters\n input += char\n process.stdout.write('*')\n }\n }\n\n stdin.on('data', onData)\n })\n}\n\nexport const authCommand = new Command('auth').description('Manage API key authentication')\n\nauthCommand\n .command('login')\n .description('Save an API key to the system keychain')\n .requiredOption('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)')\n .option('-k, --key <key>', 'API key (if not provided, will prompt)')\n .action(async (options) => {\n const provider = options.provider.toLowerCase() as Provider\n\n if (!PROVIDERS.includes(provider)) {\n console.error(chalk.red(`Invalid provider: ${options.provider}`))\n console.error(chalk.gray(`Valid providers: ${PROVIDERS.join(', ')}`))\n process.exit(1)\n }\n\n let apiKey = options.key\n\n if (!apiKey) {\n const providerName = getProviderDisplayName(provider)\n console.log(chalk.bold(`\\n🔑 ${providerName} API Key Setup\\n`))\n console.log(chalk.gray(`Your API key will be stored securely in the system keychain.`))\n console.log()\n\n apiKey = await readSecretInput(`Enter ${providerName} API key: `)\n }\n\n if (!apiKey || apiKey.trim() === '') {\n console.error(chalk.red('API key cannot be empty'))\n process.exit(1)\n }\n\n try {\n await saveApiKey(provider, apiKey.trim())\n console.log(chalk.green(`\\n✓ API key for ${getProviderDisplayName(provider)} saved to system keychain`))\n } catch (error) {\n console.error(chalk.red('Failed to save API key'))\n console.error(chalk.gray(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\nauthCommand\n .command('logout')\n .description('Remove an API key from the system keychain')\n .requiredOption('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)')\n .action(async (options) => {\n const provider = options.provider.toLowerCase() as Provider\n\n if (!PROVIDERS.includes(provider)) {\n console.error(chalk.red(`Invalid provider: ${options.provider}`))\n process.exit(1)\n }\n\n try {\n const deleted = await deleteApiKey(provider)\n if (deleted) {\n console.log(chalk.green(`✓ API key for ${getProviderDisplayName(provider)} removed`))\n } else {\n console.log(chalk.yellow(`No API key found for ${getProviderDisplayName(provider)}`))\n }\n } catch (error) {\n console.error(chalk.red('Failed to remove API key'))\n process.exit(1)\n }\n })\n\nauthCommand\n .command('status')\n .description('Show which providers have API keys configured')\n .action(async () => {\n try {\n const providers = await listProviders()\n\n console.log(chalk.bold('\\nAPI Key Status:\\n'))\n\n for (const { provider, hasKey } of providers) {\n const status = hasKey ? chalk.green('✓ configured') : chalk.gray('○ not set')\n console.log(` ${getProviderDisplayName(provider).padEnd(20)} ${status}`)\n }\n\n console.log(\n chalk.gray('\\nKeys can also be set via environment variables:')\n )\n console.log(chalk.gray(' GUT_GEMINI_API_KEY, GUT_OPENAI_API_KEY, GUT_ANTHROPIC_API_KEY\\n'))\n } catch (error) {\n console.error(chalk.red('Failed to check status'))\n process.exit(1)\n }\n })\n","const SERVICE_NAME = 'gut-cli'\n\nexport type Provider = 'gemini' | 'openai' | 'anthropic'\n\nconst PROVIDER_KEY_MAP: Record<Provider, string> = {\n gemini: 'gemini-api-key',\n openai: 'openai-api-key',\n anthropic: 'anthropic-api-key'\n}\n\nconst ENV_VAR_MAP: Record<Provider, string> = {\n gemini: 'GUT_GEMINI_API_KEY',\n openai: 'GUT_OPENAI_API_KEY',\n anthropic: 'GUT_ANTHROPIC_API_KEY'\n}\n\nconst FALLBACK_ENV_MAP: Record<Provider, string> = {\n gemini: 'GEMINI_API_KEY',\n openai: 'OPENAI_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY'\n}\n\nasync function getKeytar(): Promise<typeof import('keytar') | null> {\n try {\n return await import('keytar')\n } catch {\n return null\n }\n}\n\nexport async function saveApiKey(provider: Provider, apiKey: string): Promise<void> {\n const keytar = await getKeytar()\n if (!keytar) {\n throw new Error('Keychain not available. Set environment variable instead.')\n }\n await keytar.setPassword(SERVICE_NAME, PROVIDER_KEY_MAP[provider], apiKey)\n}\n\nexport async function getApiKey(provider: Provider): Promise<string | null> {\n // 1. Check environment variable (GUT_*_API_KEY)\n const envKey = process.env[ENV_VAR_MAP[provider]]\n if (envKey) return envKey\n\n // 2. Check fallback environment variable (*_API_KEY)\n const fallbackKey = process.env[FALLBACK_ENV_MAP[provider]]\n if (fallbackKey) return fallbackKey\n\n // 3. Check system keychain\n const keytar = await getKeytar()\n if (!keytar) return null\n return keytar.getPassword(SERVICE_NAME, PROVIDER_KEY_MAP[provider])\n}\n\nexport async function deleteApiKey(provider: Provider): Promise<boolean> {\n const keytar = await getKeytar()\n if (!keytar) {\n throw new Error('Keychain not available.')\n }\n return keytar.deletePassword(SERVICE_NAME, PROVIDER_KEY_MAP[provider])\n}\n\nexport async function listProviders(): Promise<{ provider: Provider; hasKey: boolean }[]> {\n const providers: Provider[] = ['gemini', 'openai', 'anthropic']\n const results = await Promise.all(\n providers.map(async (provider) => ({\n provider,\n hasKey: !!(await getApiKey(provider))\n }))\n )\n return results\n}\n\nexport function getProviderDisplayName(provider: Provider): string {\n const names: Record<Provider, string> = {\n gemini: 'Google Gemini',\n openai: 'OpenAI',\n anthropic: 'Anthropic Claude'\n }\n return names[provider]\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { generateCommitMessage } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst CONVENTION_PATHS = [\n '.gut/commit-convention.md',\n '.github/commit-convention.md',\n '.commit-convention.md',\n 'docs/commit-convention.md',\n '.gitmessage'\n]\n\nfunction findCommitConvention(repoRoot: string): string | null {\n for (const conventionPath of CONVENTION_PATHS) {\n const fullPath = join(repoRoot, conventionPath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nexport const aiCommitCommand = new Command('ai-commit')\n .alias('commit')\n .description('Generate a commit message using AI')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-c, --commit', 'Automatically commit with the generated message')\n .option('-a, --all', 'Force stage all changes (default: auto-stage if nothing staged)')\n .action(async (options) => {\n const git = simpleGit()\n const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n\n // Check if we're in a git repository\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n\n // Stage all changes if requested\n if (options.all) {\n await git.add('-A')\n }\n\n // Get staged diff\n let diff = await git.diff(['--cached'])\n\n // Auto-stage if no staged changes\n if (!diff.trim()) {\n const unstaged = await git.diff()\n if (!unstaged.trim()) {\n console.error(chalk.yellow('No changes to commit.'))\n process.exit(1)\n }\n console.log(chalk.gray('No staged changes, staging all changes...'))\n await git.add('-A')\n diff = await git.diff(['--cached'])\n }\n\n // Find commit convention\n const convention = findCommitConvention(repoRoot.trim())\n if (convention) {\n console.log(chalk.gray('Using commit convention from project...'))\n }\n\n const spinner = ora('Generating commit message...').start()\n\n try {\n const message = await generateCommitMessage(\n diff,\n { provider, model: options.model },\n convention || undefined\n )\n\n spinner.stop()\n\n console.log(chalk.bold('\\nGenerated commit message:\\n'))\n console.log(chalk.green(` ${message.split('\\n')[0]}`))\n if (message.includes('\\n')) {\n const details = message.split('\\n').slice(1).join('\\n')\n console.log(chalk.gray(details.split('\\n').map(l => ` ${l}`).join('\\n')))\n }\n console.log()\n\n if (options.commit) {\n // Auto-commit\n await git.commit(message)\n console.log(chalk.green('✓ Committed successfully'))\n } else {\n // Ask for confirmation\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('Commit with this message? (y/N/e to edit) '), resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() === 'y') {\n await git.commit(message)\n console.log(chalk.green('✓ Committed successfully'))\n } else if (answer.toLowerCase() === 'e') {\n // Open in editor\n console.log(chalk.gray('Opening editor...'))\n const { execSync } = await import('child_process')\n const editor = process.env.EDITOR || process.env.VISUAL || 'vi'\n\n // Write message to temp file\n const fs = await import('fs')\n const os = await import('os')\n const path = await import('path')\n const tmpFile = path.join(os.tmpdir(), 'gut-commit-msg.txt')\n fs.writeFileSync(tmpFile, message)\n\n execSync(`${editor} \"${tmpFile}\"`, { stdio: 'inherit' })\n\n const editedMessage = fs.readFileSync(tmpFile, 'utf-8').trim()\n fs.unlinkSync(tmpFile)\n\n if (editedMessage) {\n await git.commit(editedMessage)\n console.log(chalk.green('✓ Committed successfully'))\n } else {\n console.log(chalk.yellow('Commit cancelled (empty message)'))\n }\n } else {\n console.log(chalk.gray('Commit cancelled'))\n // Print the message for manual use\n console.log(chalk.gray('\\nTo commit manually:'))\n console.log(chalk.gray(` git commit -m \"${message.split('\\n')[0]}\"`))\n }\n }\n } catch (error) {\n spinner.fail('Failed to generate commit message')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { generateText, generateObject } from 'ai'\nimport { createGoogleGenerativeAI } from '@ai-sdk/google'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { createAnthropic } from '@ai-sdk/anthropic'\nimport { z } from 'zod'\nimport { getApiKey, Provider } from './credentials.js'\n\nexport interface AIOptions {\n provider: Provider\n model?: string\n}\n\nconst DEFAULT_MODELS: Record<Provider, string> = {\n gemini: 'gemini-2.0-flash',\n openai: 'gpt-4o-mini',\n anthropic: 'claude-sonnet-4-20250514'\n}\n\nasync function getModel(options: AIOptions) {\n const apiKey = await getApiKey(options.provider)\n if (!apiKey) {\n throw new Error(\n `No API key found for ${options.provider}. Run: gut auth login --provider ${options.provider}`\n )\n }\n\n const modelName = options.model || DEFAULT_MODELS[options.provider]\n\n switch (options.provider) {\n case 'gemini': {\n const google = createGoogleGenerativeAI({ apiKey })\n return google(modelName)\n }\n case 'openai': {\n const openai = createOpenAI({ apiKey })\n return openai(modelName)\n }\n case 'anthropic': {\n const anthropic = createAnthropic({ apiKey })\n return anthropic(modelName)\n }\n }\n}\n\nexport async function generateCommitMessage(\n diff: string,\n options: AIOptions,\n convention?: string\n): Promise<string> {\n const model = await getModel(options)\n\n const conventionInstructions = convention\n ? `\nIMPORTANT: Follow this project's commit message convention:\n\n--- CONVENTION START ---\n${convention}\n--- CONVENTION END ---\n`\n : `\nRules:\n- Use format: <type>(<scope>): <description>\n- Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci\n- Scope is optional but helpful\n- Description should be lowercase, imperative mood, no period at end\n- Keep the first line under 72 characters\n- If changes are complex, add a blank line and bullet points for details`\n\n const prompt = `You are an expert at writing git commit messages.\n\nAnalyze the following git diff and generate a concise, meaningful commit message.\n${conventionInstructions}\n\nGit diff:\n\\`\\`\\`\n${diff.slice(0, 8000)}\n\\`\\`\\`\n\nRespond with ONLY the commit message, nothing else.`\n\n const result = await generateText({\n model,\n prompt,\n maxTokens: 500\n })\n\n return result.text.trim()\n}\n\nexport async function generatePRDescription(\n context: {\n baseBranch: string\n currentBranch: string\n commits: string[]\n diff: string\n template?: string\n },\n options: AIOptions\n): Promise<{ title: string; body: string }> {\n const model = await getModel(options)\n\n const templateInstructions = context.template\n ? `\nIMPORTANT: The repository has a PR template. You MUST fill in this template structure:\n\n--- PR TEMPLATE START ---\n${context.template}\n--- PR TEMPLATE END ---\n\nFill in each section of the template based on the changes. Keep the template structure intact.\nReplace placeholder text and fill in the sections appropriately.`\n : `\nRules for description:\n- Description should have:\n - ## Summary section with 2-3 bullet points\n - ## Changes section listing key modifications\n - ## Test Plan section (suggest what to test)`\n\n const prompt = `You are an expert at writing pull request descriptions.\n\nGenerate a clear and informative PR title and description based on the following information.\n\nBranch: ${context.currentBranch} -> ${context.baseBranch}\n\nCommits:\n${context.commits.map((c) => `- ${c}`).join('\\n')}\n\nDiff summary (truncated):\n\\`\\`\\`\n${context.diff.slice(0, 6000)}\n\\`\\`\\`\n${templateInstructions}\n\nRules for title:\n- Title should be concise (under 72 chars), start with a verb\n\nRespond in JSON format:\n{\n \"title\": \"...\",\n \"body\": \"...\"\n}`\n\n const result = await generateText({\n model,\n prompt,\n maxTokens: 2000\n })\n\n try {\n const cleaned = result.text.replace(/```json\\n?|\\n?```/g, '').trim()\n return JSON.parse(cleaned)\n } catch {\n return {\n title: context.currentBranch.replace(/[-_]/g, ' '),\n body: result.text\n }\n }\n}\n\nconst CodeReviewSchema = z.object({\n summary: z.string().describe('Brief overall assessment'),\n issues: z.array(\n z.object({\n severity: z.enum(['critical', 'warning', 'suggestion']),\n file: z.string(),\n line: z.number().optional(),\n message: z.string(),\n suggestion: z.string().optional()\n })\n ),\n positives: z.array(z.string()).describe('Good practices observed')\n})\n\nexport type CodeReview = z.infer<typeof CodeReviewSchema>\n\nexport async function generateCodeReview(\n diff: string,\n options: AIOptions\n): Promise<CodeReview> {\n const model = await getModel(options)\n\n const result = await generateObject({\n model,\n schema: CodeReviewSchema,\n prompt: `You are an expert code reviewer. Analyze the following git diff and provide a structured review.\n\nFocus on:\n- Bugs and potential issues\n- Security vulnerabilities\n- Performance concerns\n- Code style and best practices\n- Suggestions for improvement\n\nGit diff:\n\\`\\`\\`\n${diff.slice(0, 10000)}\n\\`\\`\\`\n\nBe constructive and specific. Include line numbers when possible.`\n })\n\n return result.object\n}\n\nconst ChangelogSchema = z.object({\n version: z.string().optional().describe('Version string if detected'),\n date: z.string().describe('Release date in YYYY-MM-DD format'),\n sections: z.array(\n z.object({\n type: z.string().describe('Section type (Added, Changed, Fixed, Removed, etc.)'),\n items: z.array(z.string()).describe('List of changes in this section')\n })\n ),\n summary: z.string().optional().describe('Brief summary of this release')\n})\n\nexport type Changelog = z.infer<typeof ChangelogSchema>\n\nexport async function generateChangelog(\n context: {\n commits: Array<{ hash: string; message: string; author: string; date: string }>\n diff: string\n fromRef: string\n toRef: string\n template?: string\n },\n options: AIOptions\n): Promise<Changelog> {\n const model = await getModel(options)\n\n const templateInstructions = context.template\n ? `\nIMPORTANT: Follow this project's changelog format:\n\n--- CHANGELOG TEMPLATE START ---\n${context.template.slice(0, 2000)}\n--- CHANGELOG TEMPLATE END ---\n\nMatch the style, sections, and formatting of the existing changelog.`\n : `\nUse Keep a Changelog format (https://keepachangelog.com/):\n- Group changes by: Added, Changed, Deprecated, Removed, Fixed, Security\n- Each item should be a concise description of the change\n- Use past tense`\n\n const commitList = context.commits\n .map((c) => `- ${c.hash.slice(0, 7)} ${c.message} (${c.author})`)\n .join('\\n')\n\n const result = await generateObject({\n model,\n schema: ChangelogSchema,\n prompt: `You are an expert at writing release notes and changelogs.\n\nGenerate a changelog entry for changes from ${context.fromRef} to ${context.toRef}.\n\nCommits:\n${commitList}\n\nDiff summary (truncated):\n\\`\\`\\`\n${context.diff.slice(0, 8000)}\n\\`\\`\\`\n${templateInstructions}\n\nFocus on:\n- User-facing changes and improvements\n- Bug fixes and their impact\n- Breaking changes (highlight these)\n- Group related changes together\n- Write for end users, not developers (unless it's a library)`\n })\n\n return result.object\n}\n\nconst ConflictResolutionSchema = z.object({\n resolvedContent: z.string().describe('The resolved file content'),\n explanation: z.string().describe('Brief explanation of how the conflict was resolved'),\n strategy: z.enum(['ours', 'theirs', 'combined', 'rewritten']).describe('Resolution strategy used')\n})\n\nexport type ConflictResolution = z.infer<typeof ConflictResolutionSchema>\n\nconst ExplanationSchema = z.object({\n summary: z.string().describe('One-line summary of what this file/commit/PR does'),\n purpose: z.string().describe('The purpose and role of this code'),\n changes: z.array(\n z.object({\n file: z.string(),\n description: z.string().describe('Description of this file or component')\n })\n ),\n impact: z.string().describe('What impact or role this has in the project'),\n notes: z.array(z.string()).optional().describe('Important considerations or caveats')\n})\n\nexport type Explanation = z.infer<typeof ExplanationSchema>\n\nexport async function generateExplanation(\n context: {\n type: 'commit' | 'pr' | 'file-history' | 'file-content' | 'uncommitted' | 'staged'\n title: string\n diff?: string\n content?: string\n metadata: {\n hash?: string\n author?: string\n date?: string\n prNumber?: string\n baseBranch?: string\n headBranch?: string\n commits?: string[]\n filePath?: string\n }\n },\n options: AIOptions,\n projectContext?: string\n): Promise<Explanation> {\n const model = await getModel(options)\n\n const projectContextSection = projectContext\n ? `\nIMPORTANT: Use this project context to provide more accurate explanations:\n\n--- PROJECT CONTEXT START ---\n${projectContext.slice(0, 4000)}\n--- PROJECT CONTEXT END ---\n`\n : ''\n\n // Handle file content explanation (different prompt)\n if (context.type === 'file-content') {\n const result = await generateObject({\n model,\n schema: ExplanationSchema,\n prompt: `You are an expert at explaining code in a clear and insightful way.\n${projectContextSection}\nAnalyze the following file and explain what it does, its purpose, and its role in a project.\n\nFile: ${context.metadata.filePath}\n\nContent:\n\\`\\`\\`\n${context.content?.slice(0, 15000)}\n\\`\\`\\`\n\nFocus on:\n- What this file does (main functionality)\n- Its purpose and role in the codebase\n- Key functions, classes, or components it defines\n- Dependencies and what it interacts with\n- Any important patterns or architecture decisions\n\nExplain in a way that helps someone quickly understand this file's purpose and how it fits into the larger codebase.`\n })\n return result.object\n }\n\n // Handle diff-based explanations (commits, PRs, file history, uncommitted, staged)\n let contextInfo: string\n let targetType: string\n\n if (context.type === 'pr') {\n contextInfo = `\nPull Request: #${context.metadata.prNumber}\nTitle: ${context.title}\nBranch: ${context.metadata.headBranch} -> ${context.metadata.baseBranch}\nCommits:\n${context.metadata.commits?.map((c) => `- ${c}`).join('\\n') || 'N/A'}\n`\n targetType = 'pull request'\n } else if (context.type === 'file-history') {\n contextInfo = `\nFile: ${context.metadata.filePath}\nRecent commits:\n${context.metadata.commits?.map((c) => `- ${c}`).join('\\n') || 'N/A'}\nLatest author: ${context.metadata.author}\nLatest date: ${context.metadata.date}\n`\n targetType = 'file changes'\n } else if (context.type === 'uncommitted' || context.type === 'staged') {\n contextInfo = `\n${context.type === 'staged' ? 'Staged changes (ready to commit)' : 'Uncommitted changes (work in progress)'}\n`\n targetType = context.type === 'staged' ? 'staged changes' : 'uncommitted changes'\n } else {\n contextInfo = `\nCommit: ${context.metadata.hash?.slice(0, 7)}\nMessage: ${context.title}\nAuthor: ${context.metadata.author}\nDate: ${context.metadata.date}\n`\n targetType = 'commit'\n }\n\n const result = await generateObject({\n model,\n schema: ExplanationSchema,\n prompt: `You are an expert at explaining code changes in a clear and insightful way.\n${projectContextSection}\nAnalyze the following ${targetType} and provide a comprehensive explanation.\n\n${contextInfo}\n\nDiff:\n\\`\\`\\`\n${context.diff?.slice(0, 12000)}\n\\`\\`\\`\n\nFocus on:\n- What the changes accomplish (not just what files changed)\n- WHY these changes were likely made\n- The broader context and purpose\n- Any important implications or side effects\n\nExplain in a way that helps someone understand not just the \"what\" but the \"why\" behind these changes.`\n })\n\n return result.object\n}\n\nconst CommitSearchSchema = z.object({\n matches: z.array(\n z.object({\n hash: z.string().describe('Commit hash'),\n reason: z.string().describe('Why this commit matches the query')\n })\n ),\n summary: z.string().optional().describe('Brief summary of the search results')\n})\n\nexport interface CommitSearchResult {\n matches: Array<{\n hash: string\n message: string\n author: string\n email: string\n date: string\n reason: string\n relevance?: 'high' | 'medium' | 'low'\n }>\n summary?: string\n}\n\nexport async function searchCommits(\n query: string,\n commits: Array<{\n hash: string\n message: string\n author: string\n email: string\n date: string\n }>,\n options: AIOptions,\n maxResults: number = 5,\n projectContext?: string\n): Promise<CommitSearchResult> {\n const model = await getModel(options)\n\n const projectContextSection = projectContext\n ? `\nIMPORTANT: Use this project context to better understand the codebase:\n\n--- PROJECT CONTEXT START ---\n${projectContext.slice(0, 3000)}\n--- PROJECT CONTEXT END ---\n`\n : ''\n\n const commitList = commits\n .map((c) => `${c.hash.slice(0, 7)} | ${c.author} | ${c.date.split('T')[0]} | ${c.message.split('\\n')[0]}`)\n .join('\\n')\n\n const result = await generateObject({\n model,\n schema: CommitSearchSchema,\n prompt: `You are an expert at understanding git history and finding relevant commits.\n${projectContextSection}\nThe user is looking for commits related to: \"${query}\"\n\nHere are the commits to search through:\n\\`\\`\\`\n${commitList}\n\\`\\`\\`\n\nFind the commits that best match the user's query. Consider:\n- Commit messages that mention similar concepts\n- Related features, bug fixes, or changes\n- Semantic similarity (e.g., \"login\" matches \"authentication\")\n\nReturn up to ${maxResults} matching commits, ordered by relevance (most relevant first).\nOnly include commits that actually match the query - if none match well, return an empty array.\n\nFor each match, provide:\n- The commit hash (first 7 characters are fine)\n- A brief reason explaining why this commit matches the query`\n })\n\n // Enrich results with full commit data\n const enrichedMatches = result.object.matches.map((match) => {\n const commit = commits.find((c) => c.hash.startsWith(match.hash))\n if (!commit) {\n return null\n }\n return {\n hash: commit.hash,\n message: commit.message,\n author: commit.author,\n email: commit.email,\n date: commit.date,\n reason: match.reason,\n relevance: 'high' as const // First results are most relevant\n }\n }).filter((m): m is NonNullable<typeof m> => m !== null)\n\n // Assign relevance based on position\n enrichedMatches.forEach((match, index) => {\n if (index === 0) match.relevance = 'high'\n else if (index < 3) match.relevance = 'medium'\n else match.relevance = 'low'\n })\n\n return {\n matches: enrichedMatches,\n summary: result.object.summary\n }\n}\n\nexport async function resolveConflict(\n conflictedContent: string,\n context: {\n filename: string\n oursRef: string\n theirsRef: string\n },\n options: AIOptions,\n strategy?: string\n): Promise<ConflictResolution> {\n const model = await getModel(options)\n\n const strategyInstructions = strategy\n ? `\nIMPORTANT: Follow this project's merge strategy:\n\n--- MERGE STRATEGY START ---\n${strategy}\n--- MERGE STRATEGY END ---\n`\n : `\nRules:\n- Understand the intent of both changes\n- Combine changes when both are valid additions\n- Choose the more complete/correct version when they conflict\n- Preserve all necessary functionality`\n\n const result = await generateObject({\n model,\n schema: ConflictResolutionSchema,\n prompt: `You are an expert at resolving git merge conflicts intelligently.\n\nAnalyze the following conflicted file and provide a resolution.\n\nFile: ${context.filename}\nMerging: ${context.theirsRef} into ${context.oursRef}\n\nConflicted content:\n\\`\\`\\`\n${conflictedContent}\n\\`\\`\\`\n${strategyInstructions}\n\nAdditional rules:\n- The resolved content should be valid, working code\n- Do NOT include conflict markers (<<<<<<, =======, >>>>>>)\n\nProvide the fully resolved file content.`\n })\n\n return result.object\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { generatePRDescription } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst PR_TEMPLATE_PATHS = [\n '.gut/pr-template.md',\n '.github/pull_request_template.md',\n '.github/PULL_REQUEST_TEMPLATE.md',\n 'pull_request_template.md',\n 'PULL_REQUEST_TEMPLATE.md',\n 'docs/pull_request_template.md'\n]\n\nfunction findPRTemplate(repoRoot: string): string | null {\n for (const templatePath of PR_TEMPLATE_PATHS) {\n const fullPath = join(repoRoot, templatePath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nexport const aiPrCommand = new Command('ai-pr')\n .alias('pr')\n .description('Generate a pull request title and description using AI')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-b, --base <branch>', 'Base branch to compare against (default: main or master)')\n .option('--create', 'Create the PR using gh CLI')\n .option('--copy', 'Copy the description to clipboard')\n .action(async (options) => {\n const git = simpleGit()\n\n // Check if we're in a git repository\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n\n const spinner = ora('Analyzing branch...').start()\n\n try {\n // Get current branch\n const branchInfo = await git.branch()\n const currentBranch = branchInfo.current\n\n // Detect base branch\n let baseBranch = options.base\n if (!baseBranch) {\n if (branchInfo.all.includes('main')) {\n baseBranch = 'main'\n } else if (branchInfo.all.includes('master')) {\n baseBranch = 'master'\n } else {\n baseBranch = 'main'\n }\n }\n\n if (currentBranch === baseBranch) {\n spinner.fail(`Already on ${baseBranch} branch`)\n process.exit(1)\n }\n\n spinner.text = `Comparing ${currentBranch} to ${baseBranch}...`\n\n // Get commits\n const log = await git.log({ from: baseBranch, to: currentBranch })\n const commits = log.all.map((c) => c.message.split('\\n')[0])\n\n if (commits.length === 0) {\n spinner.fail('No commits found between branches')\n process.exit(1)\n }\n\n // Get diff\n const diff = await git.diff([`${baseBranch}...${currentBranch}`])\n\n // Find PR template\n const repoRoot = await git.revparse(['--show-toplevel'])\n const template = findPRTemplate(repoRoot.trim())\n\n if (template) {\n spinner.text = 'Found PR template, generating description...'\n } else {\n spinner.text = 'Generating PR description...'\n }\n\n const { title, body } = await generatePRDescription(\n {\n baseBranch,\n currentBranch,\n commits,\n diff,\n template: template || undefined\n },\n {\n provider,\n model: options.model\n }\n )\n\n spinner.stop()\n\n console.log(chalk.bold('\\n📝 Generated PR:\\n'))\n console.log(chalk.cyan('Title:'), chalk.white(title))\n console.log(chalk.cyan('\\nDescription:'))\n console.log(chalk.gray('─'.repeat(50)))\n console.log(body)\n console.log(chalk.gray('─'.repeat(50)))\n\n if (options.copy) {\n try {\n const { execSync } = await import('child_process')\n const fullText = `${title}\\n\\n${body}`\n execSync('pbcopy', { input: fullText })\n console.log(chalk.green('\\n✓ Copied to clipboard'))\n } catch {\n console.log(chalk.yellow('\\n⚠ Could not copy to clipboard'))\n }\n }\n\n if (options.create) {\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('\\nCreate PR with this description? (y/N) '), resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() === 'y') {\n const createSpinner = ora('Creating PR...').start()\n try {\n const { execSync } = await import('child_process')\n\n // Escape quotes in title and body\n const escapedTitle = title.replace(/\"/g, '\\\\\"')\n const escapedBody = body.replace(/\"/g, '\\\\\"')\n\n execSync(\n `gh pr create --title \"${escapedTitle}\" --body \"${escapedBody}\" --base ${baseBranch}`,\n { stdio: 'pipe' }\n )\n createSpinner.succeed('PR created successfully!')\n } catch (error) {\n createSpinner.fail('Failed to create PR')\n console.error(chalk.gray('Make sure gh CLI is installed and authenticated'))\n }\n }\n }\n\n if (!options.copy && !options.create) {\n console.log(chalk.gray('\\nOptions:'))\n console.log(chalk.gray(' --copy Copy to clipboard'))\n console.log(chalk.gray(' --create Create PR with gh CLI'))\n }\n } catch (error) {\n spinner.fail('Failed to generate PR description')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { execSync } from 'child_process'\nimport { generateCodeReview, CodeReview } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\ninterface PRInfo {\n number: number\n title: string\n author: string\n url: string\n}\n\nasync function getPRDiff(prNumber: string): Promise<{ diff: string; prInfo: PRInfo }> {\n try {\n const diff = execSync(`gh pr diff ${prNumber}`, { encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024 })\n const prJsonStr = execSync(`gh pr view ${prNumber} --json number,title,author,url`, { encoding: 'utf-8' })\n const prJson = JSON.parse(prJsonStr)\n return {\n diff,\n prInfo: {\n number: prJson.number,\n title: prJson.title,\n author: prJson.author.login,\n url: prJson.url\n }\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('gh: command not found')) {\n throw new Error('GitHub CLI (gh) is not installed. Install it from https://cli.github.com/')\n }\n throw error\n }\n}\n\nexport const aiReviewCommand = new Command('ai-review')\n .alias('review')\n .description('Get an AI code review of your changes or a GitHub PR')\n .argument('[pr-number]', 'GitHub PR number to review')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-s, --staged', 'Review only staged changes')\n .option('-c, --commit <hash>', 'Review a specific commit')\n .option('--json', 'Output as JSON')\n .action(async (prNumber, options) => {\n const git = simpleGit()\n\n // Check if we're in a git repository\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n\n const spinner = ora('Getting diff...').start()\n\n try {\n let diff: string\n let prInfo: PRInfo | null = null\n\n if (prNumber) {\n // Review GitHub PR\n spinner.text = `Fetching PR #${prNumber}...`\n const result = await getPRDiff(prNumber)\n diff = result.diff\n prInfo = result.prInfo\n spinner.text = `Reviewing PR #${prNumber}...`\n } else if (options.commit) {\n // Review specific commit\n diff = await git.diff([`${options.commit}^`, options.commit])\n spinner.text = `Reviewing commit ${options.commit.slice(0, 7)}...`\n } else if (options.staged) {\n // Review staged changes\n diff = await git.diff(['--cached'])\n spinner.text = 'Reviewing staged changes...'\n } else {\n // Review all uncommitted changes\n diff = await git.diff()\n const stagedDiff = await git.diff(['--cached'])\n diff = stagedDiff + '\\n' + diff\n spinner.text = 'Reviewing uncommitted changes...'\n }\n\n if (!diff.trim()) {\n spinner.info('No changes to review')\n process.exit(0)\n }\n\n spinner.text = 'AI is reviewing your code...'\n\n const review = await generateCodeReview(diff, {\n provider,\n model: options.model\n })\n\n spinner.stop()\n\n if (options.json) {\n console.log(JSON.stringify({ prInfo, review }, null, 2))\n return\n }\n\n if (prInfo) {\n console.log(chalk.bold(`\\n🔗 PR #${prInfo.number}: ${prInfo.title}`))\n console.log(chalk.gray(` by ${prInfo.author} - ${prInfo.url}`))\n }\n\n printReview(review)\n } catch (error) {\n spinner.fail('Failed to generate review')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\nfunction printReview(review: CodeReview) {\n console.log(chalk.bold('\\n🔍 AI Code Review\\n'))\n\n // Summary\n console.log(chalk.cyan('Summary:'))\n console.log(` ${review.summary}\\n`)\n\n // Issues\n if (review.issues.length > 0) {\n console.log(chalk.cyan('Issues Found:'))\n for (const issue of review.issues) {\n const severityColors = {\n critical: chalk.red,\n warning: chalk.yellow,\n suggestion: chalk.blue\n }\n const severityIcons = {\n critical: '🔴',\n warning: '🟡',\n suggestion: '💡'\n }\n\n const color = severityColors[issue.severity]\n const icon = severityIcons[issue.severity]\n\n console.log(`\\n ${icon} ${color(issue.severity.toUpperCase())}`)\n console.log(` ${chalk.gray('File:')} ${issue.file}${issue.line ? `:${issue.line}` : ''}`)\n console.log(` ${issue.message}`)\n if (issue.suggestion) {\n console.log(` ${chalk.green('→')} ${issue.suggestion}`)\n }\n }\n } else {\n console.log(chalk.green(' ✓ No issues found!\\n'))\n }\n\n // Positives\n if (review.positives.length > 0) {\n console.log(chalk.cyan('\\nGood Practices:'))\n for (const positive of review.positives) {\n console.log(` ${chalk.green('✓')} ${positive}`)\n }\n }\n\n // Stats\n const criticalCount = review.issues.filter((i) => i.severity === 'critical').length\n const warningCount = review.issues.filter((i) => i.severity === 'warning').length\n const suggestionCount = review.issues.filter((i) => i.severity === 'suggestion').length\n\n console.log(chalk.gray('\\n─'.repeat(40)))\n console.log(\n ` ${chalk.red(criticalCount)} critical ${chalk.yellow(warningCount)} warnings ${chalk.blue(suggestionCount)} suggestions`\n )\n console.log()\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { resolveConflict } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nconst MERGE_STRATEGY_PATHS = [\n '.gut/merge-strategy.md',\n '.github/merge-strategy.md'\n]\n\nfunction findMergeStrategy(repoRoot: string): string | null {\n for (const strategyPath of MERGE_STRATEGY_PATHS) {\n const fullPath = path.join(repoRoot, strategyPath)\n if (fs.existsSync(fullPath)) {\n return fs.readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nexport const aiMergeCommand = new Command('ai-merge')\n .alias('merge')\n .description('Merge a branch with AI-powered conflict resolution')\n .argument('<branch>', 'Branch to merge')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('--no-commit', 'Do not auto-commit after resolving')\n .action(async (branch, options) => {\n const git = simpleGit()\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n\n // Check for uncommitted changes\n const status = await git.status()\n if (status.modified.length > 0 || status.staged.length > 0) {\n console.error(chalk.red('Error: Working directory has uncommitted changes'))\n console.log(chalk.gray('Please commit or stash your changes first'))\n process.exit(1)\n }\n\n const branchInfo = await git.branch()\n const currentBranch = branchInfo.current\n\n console.log(chalk.bold(`\\nMerging ${chalk.cyan(branch)} into ${chalk.cyan(currentBranch)}...\\n`))\n\n // Attempt merge\n try {\n await git.merge([branch])\n console.log(chalk.green('✓ Merged successfully (no conflicts)'))\n return\n } catch (error) {\n // Merge failed, likely due to conflicts\n }\n\n // Get conflicted files\n const conflictStatus = await git.status()\n const conflictedFiles = conflictStatus.conflicted\n\n if (conflictedFiles.length === 0) {\n console.error(chalk.red('Merge failed for unknown reason'))\n await git.merge(['--abort'])\n process.exit(1)\n }\n\n console.log(chalk.yellow(`⚠ ${conflictedFiles.length} conflict(s) detected\\n`))\n\n const spinner = ora()\n const rootDir = await git.revparse(['--show-toplevel'])\n\n // Find merge strategy\n const strategy = findMergeStrategy(rootDir.trim())\n if (strategy) {\n console.log(chalk.gray('Using merge strategy from project...\\n'))\n }\n\n for (const file of conflictedFiles) {\n const filePath = path.join(rootDir.trim(), file)\n const content = fs.readFileSync(filePath, 'utf-8')\n\n console.log(chalk.bold(`\\n📄 ${file}`))\n\n // Show conflict preview\n const conflictMatch = content.match(/<<<<<<< HEAD[\\s\\S]*?>>>>>>>.+/g)\n if (conflictMatch) {\n console.log(chalk.gray('─'.repeat(50)))\n console.log(chalk.gray(conflictMatch[0].slice(0, 500)))\n if (conflictMatch[0].length > 500) console.log(chalk.gray('...'))\n console.log(chalk.gray('─'.repeat(50)))\n }\n\n spinner.start('AI is analyzing conflict...')\n\n try {\n const resolution = await resolveConflict(content, {\n filename: file,\n oursRef: currentBranch,\n theirsRef: branch\n }, { provider, model: options.model }, strategy || undefined)\n\n spinner.stop()\n\n console.log(chalk.cyan('\\n🤖 AI suggests:'))\n console.log(chalk.gray('─'.repeat(50)))\n const preview = resolution.resolvedContent.slice(0, 800)\n console.log(preview)\n if (resolution.resolvedContent.length > 800) console.log(chalk.gray('...'))\n console.log(chalk.gray('─'.repeat(50)))\n console.log(chalk.gray(`Strategy: ${resolution.strategy}`))\n console.log(chalk.gray(`Reason: ${resolution.explanation}`))\n\n // Ask for confirmation\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('\\nAccept this resolution? (y/n/s to skip) '), resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() === 'y') {\n fs.writeFileSync(filePath, resolution.resolvedContent)\n await git.add(file)\n console.log(chalk.green(`✓ Resolved ${file}`))\n } else if (answer.toLowerCase() === 's') {\n console.log(chalk.yellow(`⏭ Skipped ${file}`))\n } else {\n console.log(chalk.yellow(`✗ Rejected - resolve manually: ${file}`))\n }\n } catch (error) {\n spinner.fail('AI resolution failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n console.log(chalk.yellow(`Please resolve manually: ${file}`))\n }\n }\n\n // Check remaining conflicts\n const finalStatus = await git.status()\n if (finalStatus.conflicted.length > 0) {\n console.log(chalk.yellow(`\\n⚠ ${finalStatus.conflicted.length} conflict(s) remaining`))\n console.log(chalk.gray('Resolve manually and run: git add <files> && git commit'))\n } else if (options.commit !== false) {\n await git.commit(`Merge branch '${branch}' into ${currentBranch}`)\n console.log(chalk.green('\\n✓ All conflicts resolved and committed'))\n } else {\n console.log(chalk.green('\\n✓ All conflicts resolved'))\n console.log(chalk.gray('Run: git commit'))\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { generateChangelog, Changelog } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst CHANGELOG_PATHS = [\n '.gut/changelog-template.md',\n '.gut/CHANGELOG.md',\n 'CHANGELOG.md',\n 'HISTORY.md',\n 'CHANGES.md',\n 'changelog.md',\n 'docs/CHANGELOG.md'\n]\n\nfunction findChangelog(repoRoot: string): string | null {\n for (const changelogPath of CHANGELOG_PATHS) {\n const fullPath = join(repoRoot, changelogPath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nfunction formatChangelog(changelog: Changelog): string {\n const lines: string[] = []\n\n const header = changelog.version\n ? `## [${changelog.version}] - ${changelog.date}`\n : `## ${changelog.date}`\n\n lines.push(header)\n lines.push('')\n\n if (changelog.summary) {\n lines.push(changelog.summary)\n lines.push('')\n }\n\n for (const section of changelog.sections) {\n if (section.items.length > 0) {\n lines.push(`### ${section.type}`)\n for (const item of section.items) {\n lines.push(`- ${item}`)\n }\n lines.push('')\n }\n }\n\n return lines.join('\\n')\n}\n\nexport const changelogCommand = new Command('changelog')\n .description('Generate a changelog from commits between refs')\n .argument('[from]', 'Starting ref (tag, branch, commit)', 'HEAD~10')\n .argument('[to]', 'Ending ref', 'HEAD')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-t, --tag <tag>', 'Generate changelog since this tag')\n .option('--json', 'Output as JSON')\n .action(async (from, to, options) => {\n const git = simpleGit()\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n const spinner = ora('Analyzing commits...').start()\n\n try {\n // Handle --tag option\n let fromRef = from\n let toRef = to\n\n if (options.tag) {\n fromRef = options.tag\n toRef = 'HEAD'\n }\n\n // Get commits\n const log = await git.log({ from: fromRef, to: toRef })\n\n if (log.all.length === 0) {\n spinner.info('No commits found in range')\n process.exit(0)\n }\n\n spinner.text = `Found ${log.all.length} commits, generating changelog...`\n\n const commits = log.all.map((c) => ({\n hash: c.hash,\n message: c.message,\n author: c.author_name,\n date: c.date\n }))\n\n // Get diff\n const diff = await git.diff([`${fromRef}...${toRef}`])\n\n // Find existing changelog for style reference\n const repoRoot = await git.revparse(['--show-toplevel'])\n const existingChangelog = findChangelog(repoRoot.trim())\n\n // Extract template from existing changelog (first entry as reference)\n let template: string | undefined\n if (existingChangelog) {\n const firstEntryMatch = existingChangelog.match(/## \\[?[\\d.]+\\]?[\\s\\S]*?(?=## \\[?[\\d.]+\\]?|$)/)\n if (firstEntryMatch) {\n template = firstEntryMatch[0].slice(0, 1500)\n }\n spinner.text = 'Found existing changelog, matching style...'\n }\n\n const changelog = await generateChangelog(\n {\n commits,\n diff,\n fromRef,\n toRef,\n template\n },\n { provider, model: options.model }\n )\n\n spinner.stop()\n\n if (options.json) {\n console.log(JSON.stringify(changelog, null, 2))\n return\n }\n\n console.log(chalk.bold('\\n📋 Generated Changelog\\n'))\n console.log(chalk.gray('─'.repeat(50)))\n console.log(formatChangelog(changelog))\n console.log(chalk.gray('─'.repeat(50)))\n\n console.log(chalk.gray(`\\nRange: ${fromRef}..${toRef} (${commits.length} commits)`))\n\n if (existingChangelog) {\n console.log(chalk.gray('Style matched from existing CHANGELOG.md'))\n }\n } catch (error) {\n spinner.fail('Failed to generate changelog')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { execSync } from 'child_process'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { generateExplanation } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst CONTEXT_PATHS = [\n '.gut/explain.md'\n]\n\nfunction findExplainContext(repoRoot: string): string | null {\n for (const contextPath of CONTEXT_PATHS) {\n const fullPath = join(repoRoot, contextPath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nexport const aiExplainCommand = new Command('ai-explain')\n .alias('explain')\n .description('Get an AI-powered explanation of changes, commits, PRs, or files')\n .argument('[target]', 'Commit hash, PR number, PR URL, or file path (default: uncommitted changes)')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-s, --staged', 'Explain only staged changes')\n .option('-n, --commits <n>', 'Number of commits to analyze for file history (default: 1)', '1')\n .option('--history', 'Explain file change history instead of content')\n .option('--json', 'Output as JSON')\n .action(async (target, options) => {\n const git = simpleGit()\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const spinner = ora('Analyzing...').start()\n\n try {\n let context: ExplainContext\n\n // Handle staged-only or uncommitted changes (no target)\n if (!target || options.staged) {\n if (options.staged) {\n context = await getStagedContext(git, spinner)\n } else {\n context = await getUncommittedContext(git, spinner)\n }\n } else {\n // Detect target type: PR, file, or commit\n const isPR = target.match(/^#?\\d+$/) || target.includes('/pull/')\n const isFile = existsSync(target)\n\n if (isPR) {\n context = await getPRContext(target, spinner)\n } else if (isFile) {\n if (options.history) {\n context = await getFileHistoryContext(target, git, spinner, parseInt(options.commits, 10))\n } else {\n context = await getFileContentContext(target, spinner)\n }\n } else {\n context = await getCommitContext(target, git, spinner)\n }\n }\n\n // Find project context\n const projectContext = findExplainContext(repoRoot.trim())\n if (projectContext) {\n console.log(chalk.gray('Using project context...'))\n }\n\n spinner.text = 'AI is generating explanation...'\n\n const explanation = await generateExplanation(context, {\n provider,\n model: options.model\n }, projectContext || undefined)\n\n spinner.stop()\n\n if (options.json) {\n console.log(JSON.stringify(explanation, null, 2))\n return\n }\n\n printExplanation(explanation, context.type)\n } catch (error) {\n spinner.fail('Failed to generate explanation')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\ninterface ExplainContext {\n type: 'commit' | 'pr' | 'file-history' | 'file-content' | 'uncommitted' | 'staged'\n title: string\n diff?: string\n content?: string\n metadata: {\n hash?: string\n author?: string\n date?: string\n prNumber?: string\n prUrl?: string\n baseBranch?: string\n headBranch?: string\n commits?: string[]\n filePath?: string\n }\n}\n\nasync function getUncommittedContext(\n git: ReturnType<typeof simpleGit>,\n spinner: ReturnType<typeof ora>\n): Promise<ExplainContext> {\n spinner.text = 'Analyzing uncommitted changes...'\n\n const stagedDiff = await git.diff(['--cached'])\n const unstagedDiff = await git.diff()\n const diff = (stagedDiff + '\\n' + unstagedDiff).trim()\n\n if (!diff) {\n throw new Error('No uncommitted changes to analyze')\n }\n\n return {\n type: 'uncommitted',\n title: 'Uncommitted changes',\n diff,\n metadata: {}\n }\n}\n\nasync function getStagedContext(\n git: ReturnType<typeof simpleGit>,\n spinner: ReturnType<typeof ora>\n): Promise<ExplainContext> {\n spinner.text = 'Analyzing staged changes...'\n\n const diff = await git.diff(['--cached'])\n\n if (!diff.trim()) {\n throw new Error('No staged changes to analyze')\n }\n\n return {\n type: 'staged',\n title: 'Staged changes',\n diff,\n metadata: {}\n }\n}\n\nasync function getCommitContext(\n hash: string,\n git: ReturnType<typeof simpleGit>,\n spinner: ReturnType<typeof ora>\n): Promise<ExplainContext> {\n spinner.text = `Analyzing commit ${hash.slice(0, 7)}...`\n\n // Get commit info\n const log = await git.log({ from: `${hash}^`, to: hash, maxCount: 1 })\n const commit = log.latest\n\n if (!commit) {\n throw new Error(`Commit not found: ${hash}`)\n }\n\n // Get diff\n const diff = await git.diff([`${hash}^`, hash])\n\n return {\n type: 'commit',\n title: commit.message.split('\\n')[0],\n diff,\n metadata: {\n hash: commit.hash,\n author: commit.author_name,\n date: commit.date\n }\n }\n}\n\nasync function getFileContentContext(\n filePath: string,\n spinner: ReturnType<typeof ora>\n): Promise<ExplainContext> {\n spinner.text = `Reading ${filePath}...`\n\n const content = readFileSync(filePath, 'utf-8')\n\n return {\n type: 'file-content',\n title: filePath,\n content,\n metadata: {\n filePath\n }\n }\n}\n\nasync function getFileHistoryContext(\n filePath: string,\n git: ReturnType<typeof simpleGit>,\n spinner: ReturnType<typeof ora>,\n numCommits: number\n): Promise<ExplainContext> {\n spinner.text = `Analyzing recent changes to ${filePath}...`\n\n // Get recent commits for this file\n const log = await git.log({ file: filePath, maxCount: numCommits })\n const commits = log.all\n\n if (commits.length === 0) {\n throw new Error(`No commits found for file: ${filePath}`)\n }\n\n // Get combined diff for all commits\n let diff: string\n if (numCommits === 1) {\n const hash = commits[0].hash\n diff = await git.diff([`${hash}^`, hash, '--', filePath])\n } else {\n // Get diff from oldest to newest commit\n const oldestHash = commits[commits.length - 1].hash\n const newestHash = commits[0].hash\n diff = await git.diff([`${oldestHash}^`, newestHash, '--', filePath])\n }\n\n const commitMessages = commits.map((c) => c.message.split('\\n')[0])\n\n return {\n type: 'file-history',\n title: numCommits === 1 ? commitMessages[0] : `${numCommits} recent changes to ${filePath}`,\n diff,\n metadata: {\n filePath,\n hash: commits[0].hash,\n author: commits[0].author_name,\n date: commits[0].date,\n commits: commitMessages\n }\n }\n}\n\nasync function getPRContext(\n target: string,\n spinner: ReturnType<typeof ora>\n): Promise<ExplainContext> {\n // Extract PR number\n let prNumber: string\n if (target.includes('/pull/')) {\n const match = target.match(/\\/pull\\/(\\d+)/)\n prNumber = match ? match[1] : target\n } else {\n prNumber = target.replace(/^#/, '')\n }\n\n spinner.text = `Fetching PR #${prNumber}...`\n\n // Get PR info using gh CLI\n let prInfo: {\n title: string\n url: string\n baseRefName: string\n headRefName: string\n commits: { nodes: Array<{ commit: { message: string } }> }\n }\n\n try {\n const prJson = execSync(\n `gh pr view ${prNumber} --json title,url,baseRefName,headRefName,commits`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n )\n prInfo = JSON.parse(prJson)\n } catch {\n throw new Error(`Failed to fetch PR #${prNumber}. Make sure gh CLI is installed and authenticated.`)\n }\n\n spinner.text = `Getting diff for PR #${prNumber}...`\n\n // Get PR diff\n let diff: string\n try {\n diff = execSync(`gh pr diff ${prNumber}`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024\n })\n } catch {\n throw new Error(`Failed to get diff for PR #${prNumber}`)\n }\n\n const commits = prInfo.commits.nodes.map((n) => n.commit.message.split('\\n')[0])\n\n return {\n type: 'pr',\n title: prInfo.title,\n diff,\n metadata: {\n prNumber,\n prUrl: prInfo.url,\n baseBranch: prInfo.baseRefName,\n headBranch: prInfo.headRefName,\n commits\n }\n }\n}\n\ninterface Explanation {\n summary: string\n purpose: string\n changes: Array<{ file: string; description: string }>\n impact: string\n notes?: string[]\n}\n\nfunction printExplanation(explanation: Explanation, type: 'commit' | 'pr' | 'file-history' | 'file-content' | 'uncommitted' | 'staged') {\n const icons: Record<string, string> = {\n pr: '🔀',\n 'file-content': '📄',\n 'file-history': '📜',\n commit: '📝',\n uncommitted: '✏️',\n staged: '📋'\n }\n const icon = icons[type] || '📝'\n console.log(chalk.bold(`\\n${icon} Explanation\\n`))\n\n // Summary\n console.log(chalk.cyan('Summary:'))\n console.log(` ${explanation.summary}\\n`)\n\n // Purpose\n console.log(chalk.cyan('Purpose:'))\n console.log(` ${explanation.purpose}\\n`)\n\n // Changes / Components\n if (explanation.changes.length > 0) {\n const header = type === 'file-content' ? 'Components:' : 'Key Changes:'\n console.log(chalk.cyan(header))\n for (const change of explanation.changes) {\n console.log(` ${chalk.yellow(change.file)}`)\n console.log(` ${chalk.gray(change.description)}`)\n }\n console.log()\n }\n\n // Impact\n console.log(chalk.cyan('Impact:'))\n console.log(` ${explanation.impact}\\n`)\n\n // Notes\n if (explanation.notes && explanation.notes.length > 0) {\n console.log(chalk.cyan('Notes:'))\n for (const note of explanation.notes) {\n console.log(` ${chalk.gray('•')} ${note}`)\n }\n console.log()\n }\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { searchCommits, CommitSearchResult } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst CONTEXT_PATHS = ['.gut/find.md']\n\nfunction findProjectContext(repoRoot: string): string | null {\n for (const contextPath of CONTEXT_PATHS) {\n const fullPath = join(repoRoot, contextPath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nexport const aiFindCommand = new Command('ai-find')\n .alias('find')\n .description('Find commits matching a vague description using AI')\n .argument('<query>', 'Description of the change you are looking for (e.g., \"login feature added\")')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-n, --num <n>', 'Number of commits to search through', '100')\n .option('--path <path>', 'Limit search to commits affecting this path')\n .option('--author <author>', 'Limit search to commits by this author')\n .option('--since <date>', 'Limit search to commits after this date')\n .option('--until <date>', 'Limit search to commits before this date')\n .option('--max-results <n>', 'Maximum number of matching commits to return', '5')\n .option('--json', 'Output as JSON')\n .action(async (query, options) => {\n const git = simpleGit()\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const spinner = ora('Searching commits...').start()\n\n try {\n // Build log options\n const logOptions: string[] = [`-n`, options.num]\n\n if (options.path) {\n logOptions.push('--', options.path)\n }\n if (options.author) {\n logOptions.push(`--author=${options.author}`)\n }\n if (options.since) {\n logOptions.push(`--since=${options.since}`)\n }\n if (options.until) {\n logOptions.push(`--until=${options.until}`)\n }\n\n // Get commit history\n spinner.text = `Fetching last ${options.num} commits...`\n const log = await git.log(logOptions)\n\n if (log.all.length === 0) {\n spinner.fail('No commits found matching the criteria')\n process.exit(1)\n }\n\n spinner.text = `Analyzing ${log.all.length} commits with AI...`\n\n // Prepare commits for AI\n const commits = log.all.map((c) => ({\n hash: c.hash,\n message: c.message,\n author: c.author_name,\n email: c.author_email,\n date: c.date\n }))\n\n // Find project context\n const projectContext = findProjectContext(repoRoot.trim())\n\n // Search with AI\n const results = await searchCommits(\n query,\n commits,\n {\n provider,\n model: options.model\n },\n parseInt(options.maxResults, 10),\n projectContext || undefined\n )\n\n spinner.stop()\n\n if (results.matches.length === 0) {\n console.log(chalk.yellow('\\nNo matching commits found for your query.'))\n console.log(chalk.gray(`Searched ${commits.length} commits.`))\n process.exit(0)\n }\n\n if (options.json) {\n console.log(JSON.stringify(results, null, 2))\n return\n }\n\n printResults(results, query)\n } catch (error) {\n spinner.fail('Failed to search commits')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\nfunction printResults(results: CommitSearchResult, query: string) {\n console.log(chalk.bold(`\\n🔍 Found ${results.matches.length} matching commit(s)\\n`))\n console.log(chalk.gray(`Query: \"${query}\"\\n`))\n\n for (let i = 0; i < results.matches.length; i++) {\n const match = results.matches[i]\n const num = i + 1\n\n console.log(chalk.cyan(`📝 Commit ${num}`))\n console.log(` ${chalk.gray('Hash:')} ${chalk.yellow(match.hash.slice(0, 7))}`)\n console.log(` ${chalk.gray('Message:')} ${match.message.split('\\n')[0]}`)\n console.log(` ${chalk.gray('Author:')} ${match.author} <${match.email}>`)\n console.log(` ${chalk.gray('Date:')} ${match.date}`)\n console.log(` ${chalk.gray('Reason:')} ${chalk.green(match.reason)}`)\n\n if (match.relevance) {\n const relevanceColor =\n match.relevance === 'high' ? chalk.green : match.relevance === 'medium' ? chalk.yellow : chalk.gray\n console.log(` ${chalk.gray('Match:')} ${relevanceColor(match.relevance)}`)\n }\n\n console.log()\n }\n\n if (results.summary) {\n console.log(chalk.gray('---'))\n console.log(chalk.gray(`Summary: ${results.summary}`))\n }\n}\n"],"mappings":"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","names":["Command","Command","chalk","chalk","Command","Command","chalk","ora","simpleGit","result","Command","simpleGit","chalk","ora","execSync","fs","path","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","join","existsSync","readFileSync","Command","simpleGit","chalk","ora","execSync","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","join","existsSync","readFileSync","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","execSync","existsSync","readFileSync","join","join","existsSync","readFileSync","Command","simpleGit","chalk","ora","execSync","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","CONTEXT_PATHS","join","existsSync","readFileSync","Command","simpleGit","chalk","ora","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/cleanup.ts","../src/commands/auth.ts","../src/lib/credentials.ts","../src/commands/ai-commit.ts","../src/lib/ai.ts","../src/commands/ai-pr.ts","../src/commands/ai-review.ts","../src/commands/ai-merge.ts","../src/commands/changelog.ts","../src/commands/ai-explain.ts","../src/commands/ai-find.ts","../src/commands/ai-branch.ts","../src/commands/sync.ts","../src/commands/stash.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { cleanupCommand } from './commands/cleanup.js'\nimport { authCommand } from './commands/auth.js'\nimport { aiCommitCommand } from './commands/ai-commit.js'\nimport { aiPrCommand } from './commands/ai-pr.js'\nimport { aiReviewCommand } from './commands/ai-review.js'\nimport { aiMergeCommand } from './commands/ai-merge.js'\nimport { changelogCommand } from './commands/changelog.js'\nimport { aiExplainCommand } from './commands/ai-explain.js'\nimport { aiFindCommand } from './commands/ai-find.js'\nimport { aiBranchCommand } from './commands/ai-branch.js'\nimport { syncCommand } from './commands/sync.js'\nimport { stashCommand } from './commands/stash.js'\n\nconst program = new Command()\n\nprogram\n .name('gut')\n .description('Git Utility Tool - AI-powered git commands')\n .version('0.1.0')\n\n// Branch management\nprogram.addCommand(cleanupCommand)\n\n// Authentication\nprogram.addCommand(authCommand)\n\n// AI-powered commands\nprogram.addCommand(aiCommitCommand)\nprogram.addCommand(aiPrCommand)\nprogram.addCommand(aiReviewCommand)\nprogram.addCommand(aiMergeCommand)\nprogram.addCommand(changelogCommand)\nprogram.addCommand(aiExplainCommand)\nprogram.addCommand(aiFindCommand)\nprogram.addCommand(aiBranchCommand)\nprogram.addCommand(syncCommand)\nprogram.addCommand(stashCommand)\n\nprogram.parse()\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\n\nexport const cleanupCommand = new Command('cleanup')\n .description('Delete merged branches safely')\n .option('-r, --remote', 'Also delete remote branches')\n .option('-f, --force', 'Skip confirmation prompt')\n .option('--dry-run', 'Show branches that would be deleted without deleting')\n .option('--base <branch>', 'Base branch to compare against (default: main or master)')\n .action(async (options) => {\n const git = simpleGit()\n\n // Check if we're in a git repository\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const spinner = ora('Fetching branch information...').start()\n\n try {\n // Fetch latest from remote\n await git.fetch(['--prune'])\n\n // Get current branch\n const currentBranch = (await git.branch()).current\n\n // Determine base branch\n const baseBranch = options.base || (await detectBaseBranch(git))\n spinner.text = `Using ${chalk.cyan(baseBranch)} as base branch`\n\n // Get merged branches\n const mergedResult = await git.branch(['--merged', baseBranch])\n const mergedBranches = mergedResult.all.filter((branch) => {\n const cleanName = branch.trim().replace(/^\\* /, '')\n // Exclude current branch, base branch, and remote tracking branches\n return (\n cleanName !== currentBranch &&\n cleanName !== baseBranch &&\n !cleanName.startsWith('remotes/') &&\n cleanName !== 'main' &&\n cleanName !== 'master' &&\n cleanName !== 'develop'\n )\n })\n\n spinner.stop()\n\n if (mergedBranches.length === 0) {\n console.log(chalk.green('✓ No merged branches to clean up'))\n return\n }\n\n console.log(chalk.yellow(`\\nFound ${mergedBranches.length} merged branch(es):\\n`))\n mergedBranches.forEach((branch) => {\n console.log(` ${chalk.red('•')} ${branch}`)\n })\n\n if (options.dryRun) {\n console.log(chalk.blue('\\n(dry-run mode - no branches were deleted)'))\n return\n }\n\n if (!options.force) {\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.yellow('\\nDelete these branches? (y/N) '), resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() !== 'y') {\n console.log(chalk.gray('Cancelled'))\n return\n }\n }\n\n // Delete branches\n const deleteSpinner = ora('Deleting branches...').start()\n\n for (const branch of mergedBranches) {\n try {\n await git.deleteLocalBranch(branch, true)\n deleteSpinner.text = `Deleted ${branch}`\n\n if (options.remote) {\n try {\n await git.push('origin', `:${branch}`)\n } catch {\n // Remote branch might not exist, ignore\n }\n }\n } catch (error) {\n deleteSpinner.warn(`Failed to delete ${branch}`)\n }\n }\n\n deleteSpinner.succeed(chalk.green(`Deleted ${mergedBranches.length} branch(es)`))\n } catch (error) {\n spinner.fail('Failed to cleanup branches')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\nasync function detectBaseBranch(git: ReturnType<typeof simpleGit>): Promise<string> {\n const branches = await git.branch()\n if (branches.all.includes('main')) return 'main'\n if (branches.all.includes('master')) return 'master'\n return 'main'\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport {\n saveApiKey,\n deleteApiKey,\n listProviders,\n getProviderDisplayName,\n Provider\n} from '../lib/credentials.js'\n\nconst PROVIDERS: Provider[] = ['gemini', 'openai', 'anthropic']\n\nasync function readSecretInput(prompt: string): Promise<string> {\n return new Promise((resolve) => {\n process.stdout.write(chalk.cyan(prompt))\n\n let input = ''\n const stdin = process.stdin\n\n stdin.setRawMode(true)\n stdin.resume()\n stdin.setEncoding('utf8')\n\n const onData = (char: string) => {\n const charCode = char.charCodeAt(0)\n\n if (charCode === 13 || charCode === 10) {\n // Enter key\n stdin.setRawMode(false)\n stdin.pause()\n stdin.removeListener('data', onData)\n console.log() // New line after input\n resolve(input)\n } else if (charCode === 127 || charCode === 8) {\n // Backspace\n if (input.length > 0) {\n input = input.slice(0, -1)\n process.stdout.write('\\b \\b')\n }\n } else if (charCode === 3) {\n // Ctrl+C\n stdin.setRawMode(false)\n stdin.pause()\n console.log()\n process.exit(0)\n } else if (charCode >= 32) {\n // Printable characters\n input += char\n process.stdout.write('*')\n }\n }\n\n stdin.on('data', onData)\n })\n}\n\nexport const authCommand = new Command('auth').description('Manage API key authentication')\n\nauthCommand\n .command('login')\n .description('Save an API key to the system keychain')\n .requiredOption('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)')\n .option('-k, --key <key>', 'API key (if not provided, will prompt)')\n .action(async (options) => {\n const provider = options.provider.toLowerCase() as Provider\n\n if (!PROVIDERS.includes(provider)) {\n console.error(chalk.red(`Invalid provider: ${options.provider}`))\n console.error(chalk.gray(`Valid providers: ${PROVIDERS.join(', ')}`))\n process.exit(1)\n }\n\n let apiKey = options.key\n\n if (!apiKey) {\n const providerName = getProviderDisplayName(provider)\n console.log(chalk.bold(`\\n🔑 ${providerName} API Key Setup\\n`))\n console.log(chalk.gray(`Your API key will be stored securely in the system keychain.`))\n console.log()\n\n apiKey = await readSecretInput(`Enter ${providerName} API key: `)\n }\n\n if (!apiKey || apiKey.trim() === '') {\n console.error(chalk.red('API key cannot be empty'))\n process.exit(1)\n }\n\n try {\n await saveApiKey(provider, apiKey.trim())\n console.log(chalk.green(`\\n✓ API key for ${getProviderDisplayName(provider)} saved to system keychain`))\n } catch (error) {\n console.error(chalk.red('Failed to save API key'))\n console.error(chalk.gray(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\nauthCommand\n .command('logout')\n .description('Remove an API key from the system keychain')\n .requiredOption('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)')\n .action(async (options) => {\n const provider = options.provider.toLowerCase() as Provider\n\n if (!PROVIDERS.includes(provider)) {\n console.error(chalk.red(`Invalid provider: ${options.provider}`))\n process.exit(1)\n }\n\n try {\n const deleted = await deleteApiKey(provider)\n if (deleted) {\n console.log(chalk.green(`✓ API key for ${getProviderDisplayName(provider)} removed`))\n } else {\n console.log(chalk.yellow(`No API key found for ${getProviderDisplayName(provider)}`))\n }\n } catch (error) {\n console.error(chalk.red('Failed to remove API key'))\n process.exit(1)\n }\n })\n\nauthCommand\n .command('status')\n .description('Show which providers have API keys configured')\n .action(async () => {\n try {\n const providers = await listProviders()\n\n console.log(chalk.bold('\\nAPI Key Status:\\n'))\n\n for (const { provider, hasKey } of providers) {\n const status = hasKey ? chalk.green('✓ configured') : chalk.gray('○ not set')\n console.log(` ${getProviderDisplayName(provider).padEnd(20)} ${status}`)\n }\n\n console.log(\n chalk.gray('\\nKeys can also be set via environment variables:')\n )\n console.log(chalk.gray(' GUT_GEMINI_API_KEY, GUT_OPENAI_API_KEY, GUT_ANTHROPIC_API_KEY\\n'))\n } catch (error) {\n console.error(chalk.red('Failed to check status'))\n process.exit(1)\n }\n })\n","const SERVICE_NAME = 'gut-cli'\n\nexport type Provider = 'gemini' | 'openai' | 'anthropic'\n\nconst PROVIDER_KEY_MAP: Record<Provider, string> = {\n gemini: 'gemini-api-key',\n openai: 'openai-api-key',\n anthropic: 'anthropic-api-key'\n}\n\nconst ENV_VAR_MAP: Record<Provider, string> = {\n gemini: 'GUT_GEMINI_API_KEY',\n openai: 'GUT_OPENAI_API_KEY',\n anthropic: 'GUT_ANTHROPIC_API_KEY'\n}\n\nconst FALLBACK_ENV_MAP: Record<Provider, string> = {\n gemini: 'GEMINI_API_KEY',\n openai: 'OPENAI_API_KEY',\n anthropic: 'ANTHROPIC_API_KEY'\n}\n\nasync function getKeytar(): Promise<typeof import('keytar') | null> {\n try {\n return await import('keytar')\n } catch {\n return null\n }\n}\n\nexport async function saveApiKey(provider: Provider, apiKey: string): Promise<void> {\n const keytar = await getKeytar()\n if (!keytar) {\n throw new Error('Keychain not available. Set environment variable instead.')\n }\n await keytar.setPassword(SERVICE_NAME, PROVIDER_KEY_MAP[provider], apiKey)\n}\n\nexport async function getApiKey(provider: Provider): Promise<string | null> {\n // 1. Check environment variable (GUT_*_API_KEY)\n const envKey = process.env[ENV_VAR_MAP[provider]]\n if (envKey) return envKey\n\n // 2. Check fallback environment variable (*_API_KEY)\n const fallbackKey = process.env[FALLBACK_ENV_MAP[provider]]\n if (fallbackKey) return fallbackKey\n\n // 3. Check system keychain\n const keytar = await getKeytar()\n if (!keytar) return null\n return keytar.getPassword(SERVICE_NAME, PROVIDER_KEY_MAP[provider])\n}\n\nexport async function deleteApiKey(provider: Provider): Promise<boolean> {\n const keytar = await getKeytar()\n if (!keytar) {\n throw new Error('Keychain not available.')\n }\n return keytar.deletePassword(SERVICE_NAME, PROVIDER_KEY_MAP[provider])\n}\n\nexport async function listProviders(): Promise<{ provider: Provider; hasKey: boolean }[]> {\n const providers: Provider[] = ['gemini', 'openai', 'anthropic']\n const results = await Promise.all(\n providers.map(async (provider) => ({\n provider,\n hasKey: !!(await getApiKey(provider))\n }))\n )\n return results\n}\n\nexport function getProviderDisplayName(provider: Provider): string {\n const names: Record<Provider, string> = {\n gemini: 'Google Gemini',\n openai: 'OpenAI',\n anthropic: 'Anthropic Claude'\n }\n return names[provider]\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { generateCommitMessage } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst CONVENTION_PATHS = [\n '.gut/commit-convention.md',\n '.github/commit-convention.md',\n '.commit-convention.md',\n 'docs/commit-convention.md',\n '.gitmessage'\n]\n\nfunction findCommitConvention(repoRoot: string): string | null {\n for (const conventionPath of CONVENTION_PATHS) {\n const fullPath = join(repoRoot, conventionPath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nexport const aiCommitCommand = new Command('ai-commit')\n .alias('commit')\n .description('Generate a commit message using AI')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-c, --commit', 'Automatically commit with the generated message')\n .option('-a, --all', 'Force stage all changes (default: auto-stage if nothing staged)')\n .action(async (options) => {\n const git = simpleGit()\n const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n\n // Check if we're in a git repository\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n\n // Stage all changes if requested\n if (options.all) {\n await git.add('-A')\n }\n\n // Get staged diff\n let diff = await git.diff(['--cached'])\n\n // Auto-stage if no staged changes\n if (!diff.trim()) {\n const unstaged = await git.diff()\n if (!unstaged.trim()) {\n console.error(chalk.yellow('No changes to commit.'))\n process.exit(1)\n }\n console.log(chalk.gray('No staged changes, staging all changes...'))\n await git.add('-A')\n diff = await git.diff(['--cached'])\n }\n\n // Find commit convention\n const convention = findCommitConvention(repoRoot.trim())\n if (convention) {\n console.log(chalk.gray('Using commit convention from project...'))\n }\n\n const spinner = ora('Generating commit message...').start()\n\n try {\n const message = await generateCommitMessage(\n diff,\n { provider, model: options.model },\n convention || undefined\n )\n\n spinner.stop()\n\n console.log(chalk.bold('\\nGenerated commit message:\\n'))\n console.log(chalk.green(` ${message.split('\\n')[0]}`))\n if (message.includes('\\n')) {\n const details = message.split('\\n').slice(1).join('\\n')\n console.log(chalk.gray(details.split('\\n').map(l => ` ${l}`).join('\\n')))\n }\n console.log()\n\n if (options.commit) {\n // Auto-commit\n await git.commit(message)\n console.log(chalk.green('✓ Committed successfully'))\n } else {\n // Ask for confirmation\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('Commit with this message? (y/N/e to edit) '), resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() === 'y') {\n await git.commit(message)\n console.log(chalk.green('✓ Committed successfully'))\n } else if (answer.toLowerCase() === 'e') {\n // Open in editor\n console.log(chalk.gray('Opening editor...'))\n const { execSync } = await import('child_process')\n const editor = process.env.EDITOR || process.env.VISUAL || 'vi'\n\n // Write message to temp file\n const fs = await import('fs')\n const os = await import('os')\n const path = await import('path')\n const tmpFile = path.join(os.tmpdir(), 'gut-commit-msg.txt')\n fs.writeFileSync(tmpFile, message)\n\n execSync(`${editor} \"${tmpFile}\"`, { stdio: 'inherit' })\n\n const editedMessage = fs.readFileSync(tmpFile, 'utf-8').trim()\n fs.unlinkSync(tmpFile)\n\n if (editedMessage) {\n await git.commit(editedMessage)\n console.log(chalk.green('✓ Committed successfully'))\n } else {\n console.log(chalk.yellow('Commit cancelled (empty message)'))\n }\n } else {\n console.log(chalk.gray('Commit cancelled'))\n // Print the message for manual use\n console.log(chalk.gray('\\nTo commit manually:'))\n console.log(chalk.gray(` git commit -m \"${message.split('\\n')[0]}\"`))\n }\n }\n } catch (error) {\n spinner.fail('Failed to generate commit message')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { generateText, generateObject } from 'ai'\nimport { createGoogleGenerativeAI } from '@ai-sdk/google'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { createAnthropic } from '@ai-sdk/anthropic'\nimport { z } from 'zod'\nimport { getApiKey, Provider } from './credentials.js'\n\nexport interface AIOptions {\n provider: Provider\n model?: string\n}\n\nconst DEFAULT_MODELS: Record<Provider, string> = {\n gemini: 'gemini-2.0-flash',\n openai: 'gpt-4o-mini',\n anthropic: 'claude-sonnet-4-20250514'\n}\n\nasync function getModel(options: AIOptions) {\n const apiKey = await getApiKey(options.provider)\n if (!apiKey) {\n throw new Error(\n `No API key found for ${options.provider}. Run: gut auth login --provider ${options.provider}`\n )\n }\n\n const modelName = options.model || DEFAULT_MODELS[options.provider]\n\n switch (options.provider) {\n case 'gemini': {\n const google = createGoogleGenerativeAI({ apiKey })\n return google(modelName)\n }\n case 'openai': {\n const openai = createOpenAI({ apiKey })\n return openai(modelName)\n }\n case 'anthropic': {\n const anthropic = createAnthropic({ apiKey })\n return anthropic(modelName)\n }\n }\n}\n\nexport async function generateCommitMessage(\n diff: string,\n options: AIOptions,\n convention?: string\n): Promise<string> {\n const model = await getModel(options)\n\n const conventionInstructions = convention\n ? `\nIMPORTANT: Follow this project's commit message convention:\n\n--- CONVENTION START ---\n${convention}\n--- CONVENTION END ---\n`\n : `\nRules:\n- Use format: <type>(<scope>): <description>\n- Types: feat, fix, docs, style, refactor, perf, test, chore, build, ci\n- Scope is optional but helpful\n- Description should be lowercase, imperative mood, no period at end\n- Keep the first line under 72 characters\n- If changes are complex, add a blank line and bullet points for details`\n\n const prompt = `You are an expert at writing git commit messages.\n\nAnalyze the following git diff and generate a concise, meaningful commit message.\n${conventionInstructions}\n\nGit diff:\n\\`\\`\\`\n${diff.slice(0, 8000)}\n\\`\\`\\`\n\nRespond with ONLY the commit message, nothing else.`\n\n const result = await generateText({\n model,\n prompt,\n maxTokens: 500\n })\n\n return result.text.trim()\n}\n\nexport async function generatePRDescription(\n context: {\n baseBranch: string\n currentBranch: string\n commits: string[]\n diff: string\n template?: string\n },\n options: AIOptions\n): Promise<{ title: string; body: string }> {\n const model = await getModel(options)\n\n const templateInstructions = context.template\n ? `\nIMPORTANT: The repository has a PR template. You MUST fill in this template structure:\n\n--- PR TEMPLATE START ---\n${context.template}\n--- PR TEMPLATE END ---\n\nFill in each section of the template based on the changes. Keep the template structure intact.\nReplace placeholder text and fill in the sections appropriately.`\n : `\nRules for description:\n- Description should have:\n - ## Summary section with 2-3 bullet points\n - ## Changes section listing key modifications\n - ## Test Plan section (suggest what to test)`\n\n const prompt = `You are an expert at writing pull request descriptions.\n\nGenerate a clear and informative PR title and description based on the following information.\n\nBranch: ${context.currentBranch} -> ${context.baseBranch}\n\nCommits:\n${context.commits.map((c) => `- ${c}`).join('\\n')}\n\nDiff summary (truncated):\n\\`\\`\\`\n${context.diff.slice(0, 6000)}\n\\`\\`\\`\n${templateInstructions}\n\nRules for title:\n- Title should be concise (under 72 chars), start with a verb\n\nRespond in JSON format:\n{\n \"title\": \"...\",\n \"body\": \"...\"\n}`\n\n const result = await generateText({\n model,\n prompt,\n maxTokens: 2000\n })\n\n try {\n const cleaned = result.text.replace(/```json\\n?|\\n?```/g, '').trim()\n return JSON.parse(cleaned)\n } catch {\n return {\n title: context.currentBranch.replace(/[-_]/g, ' '),\n body: result.text\n }\n }\n}\n\nconst CodeReviewSchema = z.object({\n summary: z.string().describe('Brief overall assessment'),\n issues: z.array(\n z.object({\n severity: z.enum(['critical', 'warning', 'suggestion']),\n file: z.string(),\n line: z.number().optional(),\n message: z.string(),\n suggestion: z.string().optional()\n })\n ),\n positives: z.array(z.string()).describe('Good practices observed')\n})\n\nexport type CodeReview = z.infer<typeof CodeReviewSchema>\n\nexport async function generateCodeReview(\n diff: string,\n options: AIOptions\n): Promise<CodeReview> {\n const model = await getModel(options)\n\n const result = await generateObject({\n model,\n schema: CodeReviewSchema,\n prompt: `You are an expert code reviewer. Analyze the following git diff and provide a structured review.\n\nFocus on:\n- Bugs and potential issues\n- Security vulnerabilities\n- Performance concerns\n- Code style and best practices\n- Suggestions for improvement\n\nGit diff:\n\\`\\`\\`\n${diff.slice(0, 10000)}\n\\`\\`\\`\n\nBe constructive and specific. Include line numbers when possible.`\n })\n\n return result.object\n}\n\nconst ChangelogSchema = z.object({\n version: z.string().optional().describe('Version string if detected'),\n date: z.string().describe('Release date in YYYY-MM-DD format'),\n sections: z.array(\n z.object({\n type: z.string().describe('Section type (Added, Changed, Fixed, Removed, etc.)'),\n items: z.array(z.string()).describe('List of changes in this section')\n })\n ),\n summary: z.string().optional().describe('Brief summary of this release')\n})\n\nexport type Changelog = z.infer<typeof ChangelogSchema>\n\nexport async function generateChangelog(\n context: {\n commits: Array<{ hash: string; message: string; author: string; date: string }>\n diff: string\n fromRef: string\n toRef: string\n template?: string\n },\n options: AIOptions\n): Promise<Changelog> {\n const model = await getModel(options)\n\n const templateInstructions = context.template\n ? `\nIMPORTANT: Follow this project's changelog format:\n\n--- CHANGELOG TEMPLATE START ---\n${context.template.slice(0, 2000)}\n--- CHANGELOG TEMPLATE END ---\n\nMatch the style, sections, and formatting of the existing changelog.`\n : `\nUse Keep a Changelog format (https://keepachangelog.com/):\n- Group changes by: Added, Changed, Deprecated, Removed, Fixed, Security\n- Each item should be a concise description of the change\n- Use past tense`\n\n const commitList = context.commits\n .map((c) => `- ${c.hash.slice(0, 7)} ${c.message} (${c.author})`)\n .join('\\n')\n\n const result = await generateObject({\n model,\n schema: ChangelogSchema,\n prompt: `You are an expert at writing release notes and changelogs.\n\nGenerate a changelog entry for changes from ${context.fromRef} to ${context.toRef}.\n\nCommits:\n${commitList}\n\nDiff summary (truncated):\n\\`\\`\\`\n${context.diff.slice(0, 8000)}\n\\`\\`\\`\n${templateInstructions}\n\nFocus on:\n- User-facing changes and improvements\n- Bug fixes and their impact\n- Breaking changes (highlight these)\n- Group related changes together\n- Write for end users, not developers (unless it's a library)`\n })\n\n return result.object\n}\n\nconst ConflictResolutionSchema = z.object({\n resolvedContent: z.string().describe('The resolved file content'),\n explanation: z.string().describe('Brief explanation of how the conflict was resolved'),\n strategy: z.enum(['ours', 'theirs', 'combined', 'rewritten']).describe('Resolution strategy used')\n})\n\nexport type ConflictResolution = z.infer<typeof ConflictResolutionSchema>\n\nconst ExplanationSchema = z.object({\n summary: z.string().describe('One-line summary of what this file/commit/PR does'),\n purpose: z.string().describe('The purpose and role of this code'),\n changes: z.array(\n z.object({\n file: z.string(),\n description: z.string().describe('Description of this file or component')\n })\n ),\n impact: z.string().describe('What impact or role this has in the project'),\n notes: z.array(z.string()).optional().describe('Important considerations or caveats')\n})\n\nexport type Explanation = z.infer<typeof ExplanationSchema>\n\nexport async function generateExplanation(\n context: {\n type: 'commit' | 'pr' | 'file-history' | 'file-content' | 'uncommitted' | 'staged'\n title: string\n diff?: string\n content?: string\n metadata: {\n hash?: string\n author?: string\n date?: string\n prNumber?: string\n baseBranch?: string\n headBranch?: string\n commits?: string[]\n filePath?: string\n }\n },\n options: AIOptions,\n projectContext?: string\n): Promise<Explanation> {\n const model = await getModel(options)\n\n const projectContextSection = projectContext\n ? `\nIMPORTANT: Use this project context to provide more accurate explanations:\n\n--- PROJECT CONTEXT START ---\n${projectContext.slice(0, 4000)}\n--- PROJECT CONTEXT END ---\n`\n : ''\n\n // Handle file content explanation (different prompt)\n if (context.type === 'file-content') {\n const result = await generateObject({\n model,\n schema: ExplanationSchema,\n prompt: `You are an expert at explaining code in a clear and insightful way.\n${projectContextSection}\nAnalyze the following file and explain what it does, its purpose, and its role in a project.\n\nFile: ${context.metadata.filePath}\n\nContent:\n\\`\\`\\`\n${context.content?.slice(0, 15000)}\n\\`\\`\\`\n\nFocus on:\n- What this file does (main functionality)\n- Its purpose and role in the codebase\n- Key functions, classes, or components it defines\n- Dependencies and what it interacts with\n- Any important patterns or architecture decisions\n\nExplain in a way that helps someone quickly understand this file's purpose and how it fits into the larger codebase.`\n })\n return result.object\n }\n\n // Handle diff-based explanations (commits, PRs, file history, uncommitted, staged)\n let contextInfo: string\n let targetType: string\n\n if (context.type === 'pr') {\n contextInfo = `\nPull Request: #${context.metadata.prNumber}\nTitle: ${context.title}\nBranch: ${context.metadata.headBranch} -> ${context.metadata.baseBranch}\nCommits:\n${context.metadata.commits?.map((c) => `- ${c}`).join('\\n') || 'N/A'}\n`\n targetType = 'pull request'\n } else if (context.type === 'file-history') {\n contextInfo = `\nFile: ${context.metadata.filePath}\nRecent commits:\n${context.metadata.commits?.map((c) => `- ${c}`).join('\\n') || 'N/A'}\nLatest author: ${context.metadata.author}\nLatest date: ${context.metadata.date}\n`\n targetType = 'file changes'\n } else if (context.type === 'uncommitted' || context.type === 'staged') {\n contextInfo = `\n${context.type === 'staged' ? 'Staged changes (ready to commit)' : 'Uncommitted changes (work in progress)'}\n`\n targetType = context.type === 'staged' ? 'staged changes' : 'uncommitted changes'\n } else {\n contextInfo = `\nCommit: ${context.metadata.hash?.slice(0, 7)}\nMessage: ${context.title}\nAuthor: ${context.metadata.author}\nDate: ${context.metadata.date}\n`\n targetType = 'commit'\n }\n\n const result = await generateObject({\n model,\n schema: ExplanationSchema,\n prompt: `You are an expert at explaining code changes in a clear and insightful way.\n${projectContextSection}\nAnalyze the following ${targetType} and provide a comprehensive explanation.\n\n${contextInfo}\n\nDiff:\n\\`\\`\\`\n${context.diff?.slice(0, 12000)}\n\\`\\`\\`\n\nFocus on:\n- What the changes accomplish (not just what files changed)\n- WHY these changes were likely made\n- The broader context and purpose\n- Any important implications or side effects\n\nExplain in a way that helps someone understand not just the \"what\" but the \"why\" behind these changes.`\n })\n\n return result.object\n}\n\nconst CommitSearchSchema = z.object({\n matches: z.array(\n z.object({\n hash: z.string().describe('Commit hash'),\n reason: z.string().describe('Why this commit matches the query')\n })\n ),\n summary: z.string().optional().describe('Brief summary of the search results')\n})\n\nexport interface CommitSearchResult {\n matches: Array<{\n hash: string\n message: string\n author: string\n email: string\n date: string\n reason: string\n relevance?: 'high' | 'medium' | 'low'\n }>\n summary?: string\n}\n\nexport async function searchCommits(\n query: string,\n commits: Array<{\n hash: string\n message: string\n author: string\n email: string\n date: string\n }>,\n options: AIOptions,\n maxResults: number = 5,\n projectContext?: string\n): Promise<CommitSearchResult> {\n const model = await getModel(options)\n\n const projectContextSection = projectContext\n ? `\nIMPORTANT: Use this project context to better understand the codebase:\n\n--- PROJECT CONTEXT START ---\n${projectContext.slice(0, 3000)}\n--- PROJECT CONTEXT END ---\n`\n : ''\n\n const commitList = commits\n .map((c) => `${c.hash.slice(0, 7)} | ${c.author} | ${c.date.split('T')[0]} | ${c.message.split('\\n')[0]}`)\n .join('\\n')\n\n const result = await generateObject({\n model,\n schema: CommitSearchSchema,\n prompt: `You are an expert at understanding git history and finding relevant commits.\n${projectContextSection}\nThe user is looking for commits related to: \"${query}\"\n\nHere are the commits to search through:\n\\`\\`\\`\n${commitList}\n\\`\\`\\`\n\nFind the commits that best match the user's query. Consider:\n- Commit messages that mention similar concepts\n- Related features, bug fixes, or changes\n- Semantic similarity (e.g., \"login\" matches \"authentication\")\n\nReturn up to ${maxResults} matching commits, ordered by relevance (most relevant first).\nOnly include commits that actually match the query - if none match well, return an empty array.\n\nFor each match, provide:\n- The commit hash (first 7 characters are fine)\n- A brief reason explaining why this commit matches the query`\n })\n\n // Enrich results with full commit data\n const enrichedMatches = result.object.matches.map((match) => {\n const commit = commits.find((c) => c.hash.startsWith(match.hash))\n if (!commit) {\n return null\n }\n return {\n hash: commit.hash,\n message: commit.message,\n author: commit.author,\n email: commit.email,\n date: commit.date,\n reason: match.reason,\n relevance: 'high' as const // First results are most relevant\n }\n }).filter((m): m is NonNullable<typeof m> => m !== null)\n\n // Assign relevance based on position\n enrichedMatches.forEach((match, index) => {\n if (index === 0) match.relevance = 'high'\n else if (index < 3) match.relevance = 'medium'\n else match.relevance = 'low'\n })\n\n return {\n matches: enrichedMatches,\n summary: result.object.summary\n }\n}\n\nexport async function generateBranchName(\n description: string,\n options: AIOptions,\n context?: {\n type?: string\n issue?: string\n convention?: string | null\n }\n): Promise<string> {\n const model = await getModel(options)\n\n const conventionInstructions = context?.convention\n ? `\nIMPORTANT: Follow this project's branch naming convention:\n\n--- CONVENTION START ---\n${context.convention}\n--- CONVENTION END ---\n`\n : `\nRules:\n- Use format: <type>/<short-description>\n- Types: feature, fix, hotfix, chore, refactor, docs, test\n- Use kebab-case for description\n- Keep it short (under 50 chars total)\n- No special characters except hyphens and slashes`\n\n const typeHint = context?.type ? `\\nBranch type: ${context.type}` : ''\n const issueHint = context?.issue ? `\\nInclude issue number: ${context.issue}` : ''\n\n const prompt = `You are an expert at creating git branch names.\n\nGenerate a clean, descriptive branch name for the following:\n\nDescription: ${description}\n${typeHint}\n${issueHint}\n${conventionInstructions}\n\nRespond with ONLY the branch name, nothing else.`\n\n const result = await generateText({\n model,\n prompt,\n maxTokens: 100\n })\n\n return result.text.trim().replace(/[^a-zA-Z0-9/_-]/g, '')\n}\n\nexport async function generateStashName(\n diff: string,\n options: AIOptions\n): Promise<string> {\n const model = await getModel(options)\n\n const prompt = `You are an expert at summarizing code changes.\n\nGenerate a short, descriptive stash name for the following changes.\n\nRules:\n- Start with \"WIP: \" prefix\n- Keep it under 50 characters total\n- Be specific about what the changes do\n- Use present tense\n\nDiff:\n\\`\\`\\`\n${diff.slice(0, 4000)}\n\\`\\`\\`\n\nRespond with ONLY the stash name, nothing else.`\n\n const result = await generateText({\n model,\n prompt,\n maxTokens: 100\n })\n\n return result.text.trim()\n}\n\nexport async function resolveConflict(\n conflictedContent: string,\n context: {\n filename: string\n oursRef: string\n theirsRef: string\n },\n options: AIOptions,\n strategy?: string\n): Promise<ConflictResolution> {\n const model = await getModel(options)\n\n const strategyInstructions = strategy\n ? `\nIMPORTANT: Follow this project's merge strategy:\n\n--- MERGE STRATEGY START ---\n${strategy}\n--- MERGE STRATEGY END ---\n`\n : `\nRules:\n- Understand the intent of both changes\n- Combine changes when both are valid additions\n- Choose the more complete/correct version when they conflict\n- Preserve all necessary functionality`\n\n const result = await generateObject({\n model,\n schema: ConflictResolutionSchema,\n prompt: `You are an expert at resolving git merge conflicts intelligently.\n\nAnalyze the following conflicted file and provide a resolution.\n\nFile: ${context.filename}\nMerging: ${context.theirsRef} into ${context.oursRef}\n\nConflicted content:\n\\`\\`\\`\n${conflictedContent}\n\\`\\`\\`\n${strategyInstructions}\n\nAdditional rules:\n- The resolved content should be valid, working code\n- Do NOT include conflict markers (<<<<<<, =======, >>>>>>)\n\nProvide the fully resolved file content.`\n })\n\n return result.object\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { generatePRDescription } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst PR_TEMPLATE_PATHS = [\n '.gut/pr-template.md',\n '.github/pull_request_template.md',\n '.github/PULL_REQUEST_TEMPLATE.md',\n 'pull_request_template.md',\n 'PULL_REQUEST_TEMPLATE.md',\n 'docs/pull_request_template.md'\n]\n\nfunction findPRTemplate(repoRoot: string): string | null {\n for (const templatePath of PR_TEMPLATE_PATHS) {\n const fullPath = join(repoRoot, templatePath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nexport const aiPrCommand = new Command('ai-pr')\n .alias('pr')\n .description('Generate a pull request title and description using AI')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-b, --base <branch>', 'Base branch to compare against (default: main or master)')\n .option('--create', 'Create the PR using gh CLI')\n .option('--copy', 'Copy the description to clipboard')\n .action(async (options) => {\n const git = simpleGit()\n\n // Check if we're in a git repository\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n\n const spinner = ora('Analyzing branch...').start()\n\n try {\n // Get current branch\n const branchInfo = await git.branch()\n const currentBranch = branchInfo.current\n\n // Detect base branch\n let baseBranch = options.base\n if (!baseBranch) {\n if (branchInfo.all.includes('main')) {\n baseBranch = 'main'\n } else if (branchInfo.all.includes('master')) {\n baseBranch = 'master'\n } else {\n baseBranch = 'main'\n }\n }\n\n if (currentBranch === baseBranch) {\n spinner.fail(`Already on ${baseBranch} branch`)\n process.exit(1)\n }\n\n spinner.text = `Comparing ${currentBranch} to ${baseBranch}...`\n\n // Get commits\n const log = await git.log({ from: baseBranch, to: currentBranch })\n const commits = log.all.map((c) => c.message.split('\\n')[0])\n\n if (commits.length === 0) {\n spinner.fail('No commits found between branches')\n process.exit(1)\n }\n\n // Get diff\n const diff = await git.diff([`${baseBranch}...${currentBranch}`])\n\n // Find PR template\n const repoRoot = await git.revparse(['--show-toplevel'])\n const template = findPRTemplate(repoRoot.trim())\n\n if (template) {\n spinner.text = 'Found PR template, generating description...'\n } else {\n spinner.text = 'Generating PR description...'\n }\n\n const { title, body } = await generatePRDescription(\n {\n baseBranch,\n currentBranch,\n commits,\n diff,\n template: template || undefined\n },\n {\n provider,\n model: options.model\n }\n )\n\n spinner.stop()\n\n console.log(chalk.bold('\\n📝 Generated PR:\\n'))\n console.log(chalk.cyan('Title:'), chalk.white(title))\n console.log(chalk.cyan('\\nDescription:'))\n console.log(chalk.gray('─'.repeat(50)))\n console.log(body)\n console.log(chalk.gray('─'.repeat(50)))\n\n if (options.copy) {\n try {\n const { execSync } = await import('child_process')\n const fullText = `${title}\\n\\n${body}`\n execSync('pbcopy', { input: fullText })\n console.log(chalk.green('\\n✓ Copied to clipboard'))\n } catch {\n console.log(chalk.yellow('\\n⚠ Could not copy to clipboard'))\n }\n }\n\n if (options.create) {\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('\\nCreate PR with this description? (y/N) '), resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() === 'y') {\n const createSpinner = ora('Creating PR...').start()\n try {\n const { execSync } = await import('child_process')\n\n // Escape quotes in title and body\n const escapedTitle = title.replace(/\"/g, '\\\\\"')\n const escapedBody = body.replace(/\"/g, '\\\\\"')\n\n execSync(\n `gh pr create --title \"${escapedTitle}\" --body \"${escapedBody}\" --base ${baseBranch}`,\n { stdio: 'pipe' }\n )\n createSpinner.succeed('PR created successfully!')\n } catch (error) {\n createSpinner.fail('Failed to create PR')\n console.error(chalk.gray('Make sure gh CLI is installed and authenticated'))\n }\n }\n }\n\n if (!options.copy && !options.create) {\n console.log(chalk.gray('\\nOptions:'))\n console.log(chalk.gray(' --copy Copy to clipboard'))\n console.log(chalk.gray(' --create Create PR with gh CLI'))\n }\n } catch (error) {\n spinner.fail('Failed to generate PR description')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { execSync } from 'child_process'\nimport { generateCodeReview, CodeReview } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\ninterface PRInfo {\n number: number\n title: string\n author: string\n url: string\n}\n\nasync function getPRDiff(prNumber: string): Promise<{ diff: string; prInfo: PRInfo }> {\n try {\n const diff = execSync(`gh pr diff ${prNumber}`, { encoding: 'utf-8', maxBuffer: 10 * 1024 * 1024 })\n const prJsonStr = execSync(`gh pr view ${prNumber} --json number,title,author,url`, { encoding: 'utf-8' })\n const prJson = JSON.parse(prJsonStr)\n return {\n diff,\n prInfo: {\n number: prJson.number,\n title: prJson.title,\n author: prJson.author.login,\n url: prJson.url\n }\n }\n } catch (error) {\n if (error instanceof Error && error.message.includes('gh: command not found')) {\n throw new Error('GitHub CLI (gh) is not installed. Install it from https://cli.github.com/')\n }\n throw error\n }\n}\n\nexport const aiReviewCommand = new Command('ai-review')\n .alias('review')\n .description('Get an AI code review of your changes or a GitHub PR')\n .argument('[pr-number]', 'GitHub PR number to review')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-s, --staged', 'Review only staged changes')\n .option('-c, --commit <hash>', 'Review a specific commit')\n .option('--json', 'Output as JSON')\n .action(async (prNumber, options) => {\n const git = simpleGit()\n\n // Check if we're in a git repository\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n\n const spinner = ora('Getting diff...').start()\n\n try {\n let diff: string\n let prInfo: PRInfo | null = null\n\n if (prNumber) {\n // Review GitHub PR\n spinner.text = `Fetching PR #${prNumber}...`\n const result = await getPRDiff(prNumber)\n diff = result.diff\n prInfo = result.prInfo\n spinner.text = `Reviewing PR #${prNumber}...`\n } else if (options.commit) {\n // Review specific commit\n diff = await git.diff([`${options.commit}^`, options.commit])\n spinner.text = `Reviewing commit ${options.commit.slice(0, 7)}...`\n } else if (options.staged) {\n // Review staged changes\n diff = await git.diff(['--cached'])\n spinner.text = 'Reviewing staged changes...'\n } else {\n // Review all uncommitted changes\n diff = await git.diff()\n const stagedDiff = await git.diff(['--cached'])\n diff = stagedDiff + '\\n' + diff\n spinner.text = 'Reviewing uncommitted changes...'\n }\n\n if (!diff.trim()) {\n spinner.info('No changes to review')\n process.exit(0)\n }\n\n spinner.text = 'AI is reviewing your code...'\n\n const review = await generateCodeReview(diff, {\n provider,\n model: options.model\n })\n\n spinner.stop()\n\n if (options.json) {\n console.log(JSON.stringify({ prInfo, review }, null, 2))\n return\n }\n\n if (prInfo) {\n console.log(chalk.bold(`\\n🔗 PR #${prInfo.number}: ${prInfo.title}`))\n console.log(chalk.gray(` by ${prInfo.author} - ${prInfo.url}`))\n }\n\n printReview(review)\n } catch (error) {\n spinner.fail('Failed to generate review')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\nfunction printReview(review: CodeReview) {\n console.log(chalk.bold('\\n🔍 AI Code Review\\n'))\n\n // Summary\n console.log(chalk.cyan('Summary:'))\n console.log(` ${review.summary}\\n`)\n\n // Issues\n if (review.issues.length > 0) {\n console.log(chalk.cyan('Issues Found:'))\n for (const issue of review.issues) {\n const severityColors = {\n critical: chalk.red,\n warning: chalk.yellow,\n suggestion: chalk.blue\n }\n const severityIcons = {\n critical: '🔴',\n warning: '🟡',\n suggestion: '💡'\n }\n\n const color = severityColors[issue.severity]\n const icon = severityIcons[issue.severity]\n\n console.log(`\\n ${icon} ${color(issue.severity.toUpperCase())}`)\n console.log(` ${chalk.gray('File:')} ${issue.file}${issue.line ? `:${issue.line}` : ''}`)\n console.log(` ${issue.message}`)\n if (issue.suggestion) {\n console.log(` ${chalk.green('→')} ${issue.suggestion}`)\n }\n }\n } else {\n console.log(chalk.green(' ✓ No issues found!\\n'))\n }\n\n // Positives\n if (review.positives.length > 0) {\n console.log(chalk.cyan('\\nGood Practices:'))\n for (const positive of review.positives) {\n console.log(` ${chalk.green('✓')} ${positive}`)\n }\n }\n\n // Stats\n const criticalCount = review.issues.filter((i) => i.severity === 'critical').length\n const warningCount = review.issues.filter((i) => i.severity === 'warning').length\n const suggestionCount = review.issues.filter((i) => i.severity === 'suggestion').length\n\n console.log(chalk.gray('\\n─'.repeat(40)))\n console.log(\n ` ${chalk.red(criticalCount)} critical ${chalk.yellow(warningCount)} warnings ${chalk.blue(suggestionCount)} suggestions`\n )\n console.log()\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { resolveConflict } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nconst MERGE_STRATEGY_PATHS = [\n '.gut/merge-strategy.md',\n '.github/merge-strategy.md'\n]\n\nfunction findMergeStrategy(repoRoot: string): string | null {\n for (const strategyPath of MERGE_STRATEGY_PATHS) {\n const fullPath = path.join(repoRoot, strategyPath)\n if (fs.existsSync(fullPath)) {\n return fs.readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nexport const aiMergeCommand = new Command('ai-merge')\n .alias('merge')\n .description('Merge a branch with AI-powered conflict resolution')\n .argument('<branch>', 'Branch to merge')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('--no-commit', 'Do not auto-commit after resolving')\n .action(async (branch, options) => {\n const git = simpleGit()\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n\n // Check for uncommitted changes\n const status = await git.status()\n if (status.modified.length > 0 || status.staged.length > 0) {\n console.error(chalk.red('Error: Working directory has uncommitted changes'))\n console.log(chalk.gray('Please commit or stash your changes first'))\n process.exit(1)\n }\n\n const branchInfo = await git.branch()\n const currentBranch = branchInfo.current\n\n console.log(chalk.bold(`\\nMerging ${chalk.cyan(branch)} into ${chalk.cyan(currentBranch)}...\\n`))\n\n // Attempt merge\n try {\n await git.merge([branch])\n console.log(chalk.green('✓ Merged successfully (no conflicts)'))\n return\n } catch (error) {\n // Merge failed, likely due to conflicts\n }\n\n // Get conflicted files\n const conflictStatus = await git.status()\n const conflictedFiles = conflictStatus.conflicted\n\n if (conflictedFiles.length === 0) {\n console.error(chalk.red('Merge failed for unknown reason'))\n await git.merge(['--abort'])\n process.exit(1)\n }\n\n console.log(chalk.yellow(`⚠ ${conflictedFiles.length} conflict(s) detected\\n`))\n\n const spinner = ora()\n const rootDir = await git.revparse(['--show-toplevel'])\n\n // Find merge strategy\n const strategy = findMergeStrategy(rootDir.trim())\n if (strategy) {\n console.log(chalk.gray('Using merge strategy from project...\\n'))\n }\n\n for (const file of conflictedFiles) {\n const filePath = path.join(rootDir.trim(), file)\n const content = fs.readFileSync(filePath, 'utf-8')\n\n console.log(chalk.bold(`\\n📄 ${file}`))\n\n // Show conflict preview\n const conflictMatch = content.match(/<<<<<<< HEAD[\\s\\S]*?>>>>>>>.+/g)\n if (conflictMatch) {\n console.log(chalk.gray('─'.repeat(50)))\n console.log(chalk.gray(conflictMatch[0].slice(0, 500)))\n if (conflictMatch[0].length > 500) console.log(chalk.gray('...'))\n console.log(chalk.gray('─'.repeat(50)))\n }\n\n spinner.start('AI is analyzing conflict...')\n\n try {\n const resolution = await resolveConflict(content, {\n filename: file,\n oursRef: currentBranch,\n theirsRef: branch\n }, { provider, model: options.model }, strategy || undefined)\n\n spinner.stop()\n\n console.log(chalk.cyan('\\n🤖 AI suggests:'))\n console.log(chalk.gray('─'.repeat(50)))\n const preview = resolution.resolvedContent.slice(0, 800)\n console.log(preview)\n if (resolution.resolvedContent.length > 800) console.log(chalk.gray('...'))\n console.log(chalk.gray('─'.repeat(50)))\n console.log(chalk.gray(`Strategy: ${resolution.strategy}`))\n console.log(chalk.gray(`Reason: ${resolution.explanation}`))\n\n // Ask for confirmation\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('\\nAccept this resolution? (y/n/s to skip) '), resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() === 'y') {\n fs.writeFileSync(filePath, resolution.resolvedContent)\n await git.add(file)\n console.log(chalk.green(`✓ Resolved ${file}`))\n } else if (answer.toLowerCase() === 's') {\n console.log(chalk.yellow(`⏭ Skipped ${file}`))\n } else {\n console.log(chalk.yellow(`✗ Rejected - resolve manually: ${file}`))\n }\n } catch (error) {\n spinner.fail('AI resolution failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n console.log(chalk.yellow(`Please resolve manually: ${file}`))\n }\n }\n\n // Check remaining conflicts\n const finalStatus = await git.status()\n if (finalStatus.conflicted.length > 0) {\n console.log(chalk.yellow(`\\n⚠ ${finalStatus.conflicted.length} conflict(s) remaining`))\n console.log(chalk.gray('Resolve manually and run: git add <files> && git commit'))\n } else if (options.commit !== false) {\n await git.commit(`Merge branch '${branch}' into ${currentBranch}`)\n console.log(chalk.green('\\n✓ All conflicts resolved and committed'))\n } else {\n console.log(chalk.green('\\n✓ All conflicts resolved'))\n console.log(chalk.gray('Run: git commit'))\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { generateChangelog, Changelog } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst CHANGELOG_PATHS = [\n '.gut/changelog-template.md',\n '.gut/CHANGELOG.md',\n 'CHANGELOG.md',\n 'HISTORY.md',\n 'CHANGES.md',\n 'changelog.md',\n 'docs/CHANGELOG.md'\n]\n\nfunction findChangelog(repoRoot: string): string | null {\n for (const changelogPath of CHANGELOG_PATHS) {\n const fullPath = join(repoRoot, changelogPath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nfunction formatChangelog(changelog: Changelog): string {\n const lines: string[] = []\n\n const header = changelog.version\n ? `## [${changelog.version}] - ${changelog.date}`\n : `## ${changelog.date}`\n\n lines.push(header)\n lines.push('')\n\n if (changelog.summary) {\n lines.push(changelog.summary)\n lines.push('')\n }\n\n for (const section of changelog.sections) {\n if (section.items.length > 0) {\n lines.push(`### ${section.type}`)\n for (const item of section.items) {\n lines.push(`- ${item}`)\n }\n lines.push('')\n }\n }\n\n return lines.join('\\n')\n}\n\nexport const changelogCommand = new Command('changelog')\n .description('Generate a changelog from commits between refs')\n .argument('[from]', 'Starting ref (tag, branch, commit)', 'HEAD~10')\n .argument('[to]', 'Ending ref', 'HEAD')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-t, --tag <tag>', 'Generate changelog since this tag')\n .option('--json', 'Output as JSON')\n .action(async (from, to, options) => {\n const git = simpleGit()\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n const spinner = ora('Analyzing commits...').start()\n\n try {\n // Handle --tag option\n let fromRef = from\n let toRef = to\n\n if (options.tag) {\n fromRef = options.tag\n toRef = 'HEAD'\n }\n\n // Get commits\n const log = await git.log({ from: fromRef, to: toRef })\n\n if (log.all.length === 0) {\n spinner.info('No commits found in range')\n process.exit(0)\n }\n\n spinner.text = `Found ${log.all.length} commits, generating changelog...`\n\n const commits = log.all.map((c) => ({\n hash: c.hash,\n message: c.message,\n author: c.author_name,\n date: c.date\n }))\n\n // Get diff\n const diff = await git.diff([`${fromRef}...${toRef}`])\n\n // Find existing changelog for style reference\n const repoRoot = await git.revparse(['--show-toplevel'])\n const existingChangelog = findChangelog(repoRoot.trim())\n\n // Extract template from existing changelog (first entry as reference)\n let template: string | undefined\n if (existingChangelog) {\n const firstEntryMatch = existingChangelog.match(/## \\[?[\\d.]+\\]?[\\s\\S]*?(?=## \\[?[\\d.]+\\]?|$)/)\n if (firstEntryMatch) {\n template = firstEntryMatch[0].slice(0, 1500)\n }\n spinner.text = 'Found existing changelog, matching style...'\n }\n\n const changelog = await generateChangelog(\n {\n commits,\n diff,\n fromRef,\n toRef,\n template\n },\n { provider, model: options.model }\n )\n\n spinner.stop()\n\n if (options.json) {\n console.log(JSON.stringify(changelog, null, 2))\n return\n }\n\n console.log(chalk.bold('\\n📋 Generated Changelog\\n'))\n console.log(chalk.gray('─'.repeat(50)))\n console.log(formatChangelog(changelog))\n console.log(chalk.gray('─'.repeat(50)))\n\n console.log(chalk.gray(`\\nRange: ${fromRef}..${toRef} (${commits.length} commits)`))\n\n if (existingChangelog) {\n console.log(chalk.gray('Style matched from existing CHANGELOG.md'))\n }\n } catch (error) {\n spinner.fail('Failed to generate changelog')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { execSync } from 'child_process'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { generateExplanation } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst CONTEXT_PATHS = [\n '.gut/explain.md'\n]\n\nfunction findExplainContext(repoRoot: string): string | null {\n for (const contextPath of CONTEXT_PATHS) {\n const fullPath = join(repoRoot, contextPath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nexport const aiExplainCommand = new Command('ai-explain')\n .alias('explain')\n .description('Get an AI-powered explanation of changes, commits, PRs, or files')\n .argument('[target]', 'Commit hash, PR number, PR URL, or file path (default: uncommitted changes)')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-s, --staged', 'Explain only staged changes')\n .option('-n, --commits <n>', 'Number of commits to analyze for file history (default: 1)', '1')\n .option('--history', 'Explain file change history instead of content')\n .option('--json', 'Output as JSON')\n .action(async (target, options) => {\n const git = simpleGit()\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const spinner = ora('Analyzing...').start()\n\n try {\n let context: ExplainContext\n\n // Handle staged-only or uncommitted changes (no target)\n if (!target || options.staged) {\n if (options.staged) {\n context = await getStagedContext(git, spinner)\n } else {\n context = await getUncommittedContext(git, spinner)\n }\n } else {\n // Detect target type: PR, file, or commit\n const isPR = target.match(/^#?\\d+$/) || target.includes('/pull/')\n const isFile = existsSync(target)\n\n if (isPR) {\n context = await getPRContext(target, spinner)\n } else if (isFile) {\n if (options.history) {\n context = await getFileHistoryContext(target, git, spinner, parseInt(options.commits, 10))\n } else {\n context = await getFileContentContext(target, spinner)\n }\n } else {\n context = await getCommitContext(target, git, spinner)\n }\n }\n\n // Find project context\n const projectContext = findExplainContext(repoRoot.trim())\n if (projectContext) {\n console.log(chalk.gray('Using project context...'))\n }\n\n spinner.text = 'AI is generating explanation...'\n\n const explanation = await generateExplanation(context, {\n provider,\n model: options.model\n }, projectContext || undefined)\n\n spinner.stop()\n\n if (options.json) {\n console.log(JSON.stringify(explanation, null, 2))\n return\n }\n\n printExplanation(explanation, context.type)\n } catch (error) {\n spinner.fail('Failed to generate explanation')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\ninterface ExplainContext {\n type: 'commit' | 'pr' | 'file-history' | 'file-content' | 'uncommitted' | 'staged'\n title: string\n diff?: string\n content?: string\n metadata: {\n hash?: string\n author?: string\n date?: string\n prNumber?: string\n prUrl?: string\n baseBranch?: string\n headBranch?: string\n commits?: string[]\n filePath?: string\n }\n}\n\nasync function getUncommittedContext(\n git: ReturnType<typeof simpleGit>,\n spinner: ReturnType<typeof ora>\n): Promise<ExplainContext> {\n spinner.text = 'Analyzing uncommitted changes...'\n\n const stagedDiff = await git.diff(['--cached'])\n const unstagedDiff = await git.diff()\n const diff = (stagedDiff + '\\n' + unstagedDiff).trim()\n\n if (!diff) {\n throw new Error('No uncommitted changes to analyze')\n }\n\n return {\n type: 'uncommitted',\n title: 'Uncommitted changes',\n diff,\n metadata: {}\n }\n}\n\nasync function getStagedContext(\n git: ReturnType<typeof simpleGit>,\n spinner: ReturnType<typeof ora>\n): Promise<ExplainContext> {\n spinner.text = 'Analyzing staged changes...'\n\n const diff = await git.diff(['--cached'])\n\n if (!diff.trim()) {\n throw new Error('No staged changes to analyze')\n }\n\n return {\n type: 'staged',\n title: 'Staged changes',\n diff,\n metadata: {}\n }\n}\n\nasync function getCommitContext(\n hash: string,\n git: ReturnType<typeof simpleGit>,\n spinner: ReturnType<typeof ora>\n): Promise<ExplainContext> {\n spinner.text = `Analyzing commit ${hash.slice(0, 7)}...`\n\n // Get commit info\n const log = await git.log({ from: `${hash}^`, to: hash, maxCount: 1 })\n const commit = log.latest\n\n if (!commit) {\n throw new Error(`Commit not found: ${hash}`)\n }\n\n // Get diff\n const diff = await git.diff([`${hash}^`, hash])\n\n return {\n type: 'commit',\n title: commit.message.split('\\n')[0],\n diff,\n metadata: {\n hash: commit.hash,\n author: commit.author_name,\n date: commit.date\n }\n }\n}\n\nasync function getFileContentContext(\n filePath: string,\n spinner: ReturnType<typeof ora>\n): Promise<ExplainContext> {\n spinner.text = `Reading ${filePath}...`\n\n const content = readFileSync(filePath, 'utf-8')\n\n return {\n type: 'file-content',\n title: filePath,\n content,\n metadata: {\n filePath\n }\n }\n}\n\nasync function getFileHistoryContext(\n filePath: string,\n git: ReturnType<typeof simpleGit>,\n spinner: ReturnType<typeof ora>,\n numCommits: number\n): Promise<ExplainContext> {\n spinner.text = `Analyzing recent changes to ${filePath}...`\n\n // Get recent commits for this file\n const log = await git.log({ file: filePath, maxCount: numCommits })\n const commits = log.all\n\n if (commits.length === 0) {\n throw new Error(`No commits found for file: ${filePath}`)\n }\n\n // Get combined diff for all commits\n let diff: string\n if (numCommits === 1) {\n const hash = commits[0].hash\n diff = await git.diff([`${hash}^`, hash, '--', filePath])\n } else {\n // Get diff from oldest to newest commit\n const oldestHash = commits[commits.length - 1].hash\n const newestHash = commits[0].hash\n diff = await git.diff([`${oldestHash}^`, newestHash, '--', filePath])\n }\n\n const commitMessages = commits.map((c) => c.message.split('\\n')[0])\n\n return {\n type: 'file-history',\n title: numCommits === 1 ? commitMessages[0] : `${numCommits} recent changes to ${filePath}`,\n diff,\n metadata: {\n filePath,\n hash: commits[0].hash,\n author: commits[0].author_name,\n date: commits[0].date,\n commits: commitMessages\n }\n }\n}\n\nasync function getPRContext(\n target: string,\n spinner: ReturnType<typeof ora>\n): Promise<ExplainContext> {\n // Extract PR number\n let prNumber: string\n if (target.includes('/pull/')) {\n const match = target.match(/\\/pull\\/(\\d+)/)\n prNumber = match ? match[1] : target\n } else {\n prNumber = target.replace(/^#/, '')\n }\n\n spinner.text = `Fetching PR #${prNumber}...`\n\n // Get PR info using gh CLI\n let prInfo: {\n title: string\n url: string\n baseRefName: string\n headRefName: string\n commits: { nodes: Array<{ commit: { message: string } }> }\n }\n\n try {\n const prJson = execSync(\n `gh pr view ${prNumber} --json title,url,baseRefName,headRefName,commits`,\n { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] }\n )\n prInfo = JSON.parse(prJson)\n } catch {\n throw new Error(`Failed to fetch PR #${prNumber}. Make sure gh CLI is installed and authenticated.`)\n }\n\n spinner.text = `Getting diff for PR #${prNumber}...`\n\n // Get PR diff\n let diff: string\n try {\n diff = execSync(`gh pr diff ${prNumber}`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n maxBuffer: 10 * 1024 * 1024\n })\n } catch {\n throw new Error(`Failed to get diff for PR #${prNumber}`)\n }\n\n const commits = prInfo.commits.nodes.map((n) => n.commit.message.split('\\n')[0])\n\n return {\n type: 'pr',\n title: prInfo.title,\n diff,\n metadata: {\n prNumber,\n prUrl: prInfo.url,\n baseBranch: prInfo.baseRefName,\n headBranch: prInfo.headRefName,\n commits\n }\n }\n}\n\ninterface Explanation {\n summary: string\n purpose: string\n changes: Array<{ file: string; description: string }>\n impact: string\n notes?: string[]\n}\n\nfunction printExplanation(explanation: Explanation, type: 'commit' | 'pr' | 'file-history' | 'file-content' | 'uncommitted' | 'staged') {\n const icons: Record<string, string> = {\n pr: '🔀',\n 'file-content': '📄',\n 'file-history': '📜',\n commit: '📝',\n uncommitted: '✏️',\n staged: '📋'\n }\n const icon = icons[type] || '📝'\n console.log(chalk.bold(`\\n${icon} Explanation\\n`))\n\n // Summary\n console.log(chalk.cyan('Summary:'))\n console.log(` ${explanation.summary}\\n`)\n\n // Purpose\n console.log(chalk.cyan('Purpose:'))\n console.log(` ${explanation.purpose}\\n`)\n\n // Changes / Components\n if (explanation.changes.length > 0) {\n const header = type === 'file-content' ? 'Components:' : 'Key Changes:'\n console.log(chalk.cyan(header))\n for (const change of explanation.changes) {\n console.log(` ${chalk.yellow(change.file)}`)\n console.log(` ${chalk.gray(change.description)}`)\n }\n console.log()\n }\n\n // Impact\n console.log(chalk.cyan('Impact:'))\n console.log(` ${explanation.impact}\\n`)\n\n // Notes\n if (explanation.notes && explanation.notes.length > 0) {\n console.log(chalk.cyan('Notes:'))\n for (const note of explanation.notes) {\n console.log(` ${chalk.gray('•')} ${note}`)\n }\n console.log()\n }\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { searchCommits, CommitSearchResult } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst CONTEXT_PATHS = ['.gut/find.md']\n\nfunction findProjectContext(repoRoot: string): string | null {\n for (const contextPath of CONTEXT_PATHS) {\n const fullPath = join(repoRoot, contextPath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nexport const aiFindCommand = new Command('ai-find')\n .alias('find')\n .description('Find commits matching a vague description using AI')\n .argument('<query>', 'Description of the change you are looking for (e.g., \"login feature added\")')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-n, --num <n>', 'Number of commits to search through', '100')\n .option('--path <path>', 'Limit search to commits affecting this path')\n .option('--author <author>', 'Limit search to commits by this author')\n .option('--since <date>', 'Limit search to commits after this date')\n .option('--until <date>', 'Limit search to commits before this date')\n .option('--max-results <n>', 'Maximum number of matching commits to return', '5')\n .option('--json', 'Output as JSON')\n .action(async (query, options) => {\n const git = simpleGit()\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const spinner = ora('Searching commits...').start()\n\n try {\n // Build log options\n const logOptions: string[] = [`-n`, options.num]\n\n if (options.path) {\n logOptions.push('--', options.path)\n }\n if (options.author) {\n logOptions.push(`--author=${options.author}`)\n }\n if (options.since) {\n logOptions.push(`--since=${options.since}`)\n }\n if (options.until) {\n logOptions.push(`--until=${options.until}`)\n }\n\n // Get commit history\n spinner.text = `Fetching last ${options.num} commits...`\n const log = await git.log(logOptions)\n\n if (log.all.length === 0) {\n spinner.fail('No commits found matching the criteria')\n process.exit(1)\n }\n\n spinner.text = `Analyzing ${log.all.length} commits with AI...`\n\n // Prepare commits for AI\n const commits = log.all.map((c) => ({\n hash: c.hash,\n message: c.message,\n author: c.author_name,\n email: c.author_email,\n date: c.date\n }))\n\n // Find project context\n const projectContext = findProjectContext(repoRoot.trim())\n\n // Search with AI\n const results = await searchCommits(\n query,\n commits,\n {\n provider,\n model: options.model\n },\n parseInt(options.maxResults, 10),\n projectContext || undefined\n )\n\n spinner.stop()\n\n if (results.matches.length === 0) {\n console.log(chalk.yellow('\\nNo matching commits found for your query.'))\n console.log(chalk.gray(`Searched ${commits.length} commits.`))\n process.exit(0)\n }\n\n if (options.json) {\n console.log(JSON.stringify(results, null, 2))\n return\n }\n\n printResults(results, query)\n } catch (error) {\n spinner.fail('Failed to search commits')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\nfunction printResults(results: CommitSearchResult, query: string) {\n console.log(chalk.bold(`\\n🔍 Found ${results.matches.length} matching commit(s)\\n`))\n console.log(chalk.gray(`Query: \"${query}\"\\n`))\n\n for (let i = 0; i < results.matches.length; i++) {\n const match = results.matches[i]\n const num = i + 1\n\n console.log(chalk.cyan(`📝 Commit ${num}`))\n console.log(` ${chalk.gray('Hash:')} ${chalk.yellow(match.hash.slice(0, 7))}`)\n console.log(` ${chalk.gray('Message:')} ${match.message.split('\\n')[0]}`)\n console.log(` ${chalk.gray('Author:')} ${match.author} <${match.email}>`)\n console.log(` ${chalk.gray('Date:')} ${match.date}`)\n console.log(` ${chalk.gray('Reason:')} ${chalk.green(match.reason)}`)\n\n if (match.relevance) {\n const relevanceColor =\n match.relevance === 'high' ? chalk.green : match.relevance === 'medium' ? chalk.yellow : chalk.gray\n console.log(` ${chalk.gray('Match:')} ${relevanceColor(match.relevance)}`)\n }\n\n console.log()\n }\n\n if (results.summary) {\n console.log(chalk.gray('---'))\n console.log(chalk.gray(`Summary: ${results.summary}`))\n }\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { existsSync, readFileSync } from 'fs'\nimport { join } from 'path'\nimport { execSync } from 'child_process'\nimport { generateBranchName } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nconst CONVENTION_PATHS = ['.gut/branch-convention.md', '.github/branch-convention.md']\n\nfunction findBranchConvention(repoRoot: string): string | null {\n for (const conventionPath of CONVENTION_PATHS) {\n const fullPath = join(repoRoot, conventionPath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n return null\n}\n\nfunction getIssueInfo(issueNumber: string): { title: string; body: string } | null {\n try {\n const result = execSync(`gh issue view ${issueNumber} --json title,body`, {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe']\n })\n return JSON.parse(result)\n } catch {\n return null\n }\n}\n\nexport const aiBranchCommand = new Command('ai-branch')\n .alias('branch')\n .description('Generate a branch name from issue number or description')\n .argument('[issue]', 'Issue number (e.g., 123 or #123)')\n .option('-d, --description <description>', 'Use description instead of issue')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-t, --type <type>', 'Branch type (feature, fix, hotfix, chore, refactor)')\n .option('-c, --checkout', 'Create and checkout the branch')\n .action(async (issue, options) => {\n const git = simpleGit()\n const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n let description: string\n let issueNumber: string | undefined\n\n if (options.description) {\n // Use provided description\n description = options.description\n } else if (issue) {\n // Fetch issue from GitHub\n issueNumber = issue.replace(/^#/, '')\n const spinner = ora(`Fetching issue #${issueNumber}...`).start()\n\n const issueInfo = getIssueInfo(issueNumber)\n if (!issueInfo) {\n spinner.fail(`Could not fetch issue #${issueNumber}`)\n console.log(chalk.gray('Make sure gh CLI is installed and you are authenticated'))\n process.exit(1)\n }\n\n spinner.stop()\n console.log(chalk.gray(`Issue: ${issueInfo.title}`))\n description = `${issueInfo.title}\\n\\n${issueInfo.body || ''}`\n } else {\n console.error(chalk.red('Error: Please provide an issue number or use -d for description'))\n console.log(chalk.gray('Usage:'))\n console.log(chalk.gray(' gut branch 123'))\n console.log(chalk.gray(' gut branch -d \"add user authentication\"'))\n process.exit(1)\n }\n\n const provider = options.provider.toLowerCase() as Provider\n const convention = findBranchConvention(repoRoot.trim())\n\n if (convention) {\n console.log(chalk.gray('Using branch convention from project...'))\n }\n\n const spinner = ora('Generating branch name...').start()\n\n try {\n const branchName = await generateBranchName(\n description,\n { provider, model: options.model },\n {\n type: options.type,\n issue: issueNumber,\n convention\n }\n )\n\n spinner.stop()\n\n console.log(chalk.bold('\\nGenerated branch name:\\n'))\n console.log(chalk.green(` ${branchName}`))\n console.log()\n\n if (options.checkout) {\n await git.checkoutLocalBranch(branchName)\n console.log(chalk.green(`✓ Created and checked out branch: ${branchName}`))\n } else {\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.cyan('Create and checkout this branch? (y/N) '), resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() === 'y') {\n await git.checkoutLocalBranch(branchName)\n console.log(chalk.green(`✓ Created and checked out branch: ${branchName}`))\n } else {\n console.log(chalk.gray('\\nTo create manually:'))\n console.log(chalk.gray(` git checkout -b ${branchName}`))\n }\n }\n } catch (error) {\n spinner.fail('Failed to generate branch name')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\n\nexport const syncCommand = new Command('sync')\n .description('Sync current branch with remote (fetch + rebase/merge)')\n .option('-m, --merge', 'Use merge instead of rebase')\n .option('-a, --all', 'Sync all branches')\n .option('--stash', 'Auto-stash changes before sync')\n .option('-f, --force', 'Force sync even with uncommitted changes')\n .action(async (options) => {\n const git = simpleGit()\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n const spinner = ora('Checking repository status...').start()\n\n try {\n // Check for uncommitted changes\n const status = await git.status()\n const hasChanges = !status.isClean()\n\n if (hasChanges && !options.stash && !options.force) {\n spinner.stop()\n console.log(chalk.yellow('You have uncommitted changes:'))\n if (status.modified.length > 0) {\n console.log(chalk.gray(` Modified: ${status.modified.length} file(s)`))\n }\n if (status.not_added.length > 0) {\n console.log(chalk.gray(` Untracked: ${status.not_added.length} file(s)`))\n }\n console.log()\n console.log(chalk.gray('Use --stash to auto-stash, or --force to sync anyway'))\n process.exit(1)\n }\n\n // Stash if needed\n let stashed = false\n if (hasChanges && options.stash) {\n spinner.text = 'Stashing changes...'\n await git.stash(['push', '-m', `gut-sync: auto-stash before sync`])\n stashed = true\n }\n\n // Fetch from remote\n spinner.text = 'Fetching from remote...'\n await git.fetch(['--all', '--prune'])\n\n const currentBranch = status.current\n if (!currentBranch) {\n spinner.fail('Could not determine current branch')\n process.exit(1)\n }\n\n // Check if branch has upstream\n const trackingBranch = status.tracking\n\n if (!trackingBranch) {\n spinner.warn(`Branch ${currentBranch} has no upstream tracking branch`)\n console.log(chalk.gray(`\\nTo set upstream: git push -u origin ${currentBranch}`))\n\n if (stashed) {\n await git.stash(['pop'])\n console.log(chalk.gray('Restored stashed changes'))\n }\n return\n }\n\n // Rebase or merge\n const strategy = options.merge ? 'merge' : 'rebase'\n spinner.text = `Syncing with ${trackingBranch} (${strategy})...`\n\n try {\n if (options.merge) {\n await git.merge([trackingBranch])\n } else {\n await git.rebase([trackingBranch])\n }\n } catch (error) {\n spinner.fail(`${strategy} failed - you may have conflicts`)\n console.log(chalk.yellow('\\nResolve conflicts and then:'))\n if (options.merge) {\n console.log(chalk.gray(' git add . && git commit'))\n } else {\n console.log(chalk.gray(' git add . && git rebase --continue'))\n }\n\n if (stashed) {\n console.log(chalk.yellow('\\nNote: You have stashed changes. Run `git stash pop` after resolving.'))\n }\n process.exit(1)\n }\n\n // Check if we're ahead and can push\n const newStatus = await git.status()\n const ahead = newStatus.ahead || 0\n const behind = newStatus.behind || 0\n\n spinner.succeed(chalk.green('Synced successfully'))\n\n if (ahead > 0) {\n console.log(chalk.cyan(` ↑ ${ahead} commit(s) ahead - run 'git push' to publish`))\n }\n if (behind > 0) {\n console.log(chalk.yellow(` ↓ ${behind} commit(s) behind`))\n }\n\n // Restore stash\n if (stashed) {\n spinner.start('Restoring stashed changes...')\n try {\n await git.stash(['pop'])\n spinner.succeed('Restored stashed changes')\n } catch {\n spinner.warn('Could not auto-restore stash (may have conflicts)')\n console.log(chalk.gray(' Run `git stash pop` manually'))\n }\n }\n\n } catch (error) {\n spinner.fail('Sync failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { generateStashName } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nexport const stashCommand = new Command('stash')\n .description('Stash changes with AI-generated name')\n .argument('[name]', 'Custom stash name (skips AI generation)')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-l, --list', 'List all stashes')\n .option('-a, --apply [index]', 'Apply stash (default: latest)')\n .option('--pop [index]', 'Pop stash (default: latest)')\n .option('-d, --drop [index]', 'Drop stash')\n .option('--clear', 'Clear all stashes')\n .action(async (name, options) => {\n const git = simpleGit()\n\n const isRepo = await git.checkIsRepo()\n if (!isRepo) {\n console.error(chalk.red('Error: Not a git repository'))\n process.exit(1)\n }\n\n // List stashes\n if (options.list) {\n const stashList = await git.stashList()\n if (stashList.all.length === 0) {\n console.log(chalk.gray('No stashes found'))\n return\n }\n console.log(chalk.bold('\\nStashes:\\n'))\n stashList.all.forEach((stash, index) => {\n console.log(` ${chalk.cyan(index.toString())} ${stash.message}`)\n })\n console.log()\n return\n }\n\n // Apply stash\n if (options.apply !== undefined) {\n const index = typeof options.apply === 'string' ? options.apply : '0'\n try {\n await git.stash(['apply', `stash@{${index}}`])\n console.log(chalk.green(`✓ Applied stash@{${index}}`))\n } catch (error) {\n console.error(chalk.red(`Failed to apply stash: ${error instanceof Error ? error.message : 'Unknown error'}`))\n process.exit(1)\n }\n return\n }\n\n // Pop stash\n if (options.pop !== undefined) {\n const index = typeof options.pop === 'string' ? options.pop : '0'\n try {\n await git.stash(['pop', `stash@{${index}}`])\n console.log(chalk.green(`✓ Popped stash@{${index}}`))\n } catch (error) {\n console.error(chalk.red(`Failed to pop stash: ${error instanceof Error ? error.message : 'Unknown error'}`))\n process.exit(1)\n }\n return\n }\n\n // Drop stash\n if (options.drop !== undefined) {\n const index = typeof options.drop === 'string' ? options.drop : '0'\n try {\n await git.stash(['drop', `stash@{${index}}`])\n console.log(chalk.green(`✓ Dropped stash@{${index}}`))\n } catch (error) {\n console.error(chalk.red(`Failed to drop stash: ${error instanceof Error ? error.message : 'Unknown error'}`))\n process.exit(1)\n }\n return\n }\n\n // Clear all stashes\n if (options.clear) {\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(chalk.yellow('Clear all stashes? This cannot be undone. (y/N) '), resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() === 'y') {\n await git.stash(['clear'])\n console.log(chalk.green('✓ Cleared all stashes'))\n } else {\n console.log(chalk.gray('Cancelled'))\n }\n return\n }\n\n // Create new stash\n const status = await git.status()\n if (status.isClean()) {\n console.log(chalk.yellow('No changes to stash'))\n return\n }\n\n let stashName: string\n\n if (name) {\n // Use provided name\n stashName = name\n } else {\n // Generate name with AI\n const provider = options.provider.toLowerCase() as Provider\n const diff = await git.diff()\n const stagedDiff = await git.diff(['--cached'])\n const fullDiff = diff + '\\n' + stagedDiff\n\n if (!fullDiff.trim()) {\n // Only untracked files\n stashName = `WIP: untracked files (${status.not_added.length} files)`\n } else {\n const spinner = ora('Generating stash name...').start()\n try {\n stashName = await generateStashName(fullDiff, { provider, model: options.model })\n spinner.stop()\n } catch (error) {\n spinner.fail('Failed to generate name, using default')\n stashName = `WIP: ${status.modified.length} modified, ${status.not_added.length} untracked`\n }\n }\n }\n\n // Include untracked files\n await git.stash(['push', '-u', '-m', stashName])\n console.log(chalk.green(`✓ Stashed: ${stashName}`))\n })\n"],"mappings":"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","names":["Command","Command","chalk","chalk","Command","Command","chalk","ora","simpleGit","result","Command","simpleGit","chalk","ora","execSync","fs","path","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","join","existsSync","readFileSync","Command","simpleGit","chalk","ora","execSync","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","join","existsSync","readFileSync","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","execSync","existsSync","readFileSync","join","join","existsSync","readFileSync","Command","simpleGit","chalk","ora","execSync","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","CONTEXT_PATHS","join","existsSync","readFileSync","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","execSync","CONVENTION_PATHS","join","existsSync","readFileSync","execSync","Command","simpleGit","chalk","spinner","ora","Command","chalk","ora","simpleGit","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gut-cli",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Git Utility Tool - AI-powered git commands for smarter workflows",
5
5
  "type": "module",
6
6
  "bin": {