gut-cli 0.1.11 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -513,7 +513,8 @@ async function generateChangelog(context, options, template) {
513
513
  fromRef: context.fromRef,
514
514
  toRef: context.toRef,
515
515
  commits: commitList,
516
- diff: context.diff.slice(0, 8e3)
516
+ diff: context.diff.slice(0, 8e3),
517
+ todayDate: (/* @__PURE__ */ new Date()).toISOString().split("T")[0]
517
518
  });
518
519
  const result = await generateObject({
519
520
  model,
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/commit.ts","../src/lib/ai.ts","../src/lib/config.ts","../src/commands/pr.ts","../src/lib/gh.ts","../src/commands/review.ts","../src/commands/merge.ts","../src/commands/changelog.ts","../src/commands/explain.ts","../src/commands/find.ts","../src/commands/branch.ts","../src/commands/checkout.ts","../src/commands/sync.ts","../src/commands/stash.ts","../src/commands/summary.ts","../src/commands/config.ts","../src/commands/lang.ts","../src/commands/init.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { cleanupCommand } from './commands/cleanup.js'\nimport { authCommand } from './commands/auth.js'\nimport { commitCommand } from './commands/commit.js'\nimport { prCommand } from './commands/pr.js'\nimport { reviewCommand } from './commands/review.js'\nimport { mergeCommand } from './commands/merge.js'\nimport { changelogCommand } from './commands/changelog.js'\nimport { explainCommand } from './commands/explain.js'\nimport { findCommand } from './commands/find.js'\nimport { branchCommand } from './commands/branch.js'\nimport { checkoutCommand } from './commands/checkout.js'\nimport { syncCommand } from './commands/sync.js'\nimport { stashCommand } from './commands/stash.js'\nimport { summaryCommand } from './commands/summary.js'\nimport { configCommand } from './commands/config.js'\nimport { langCommand } from './commands/lang.js'\nimport { initCommand } from './commands/init.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(commitCommand)\nprogram.addCommand(prCommand)\nprogram.addCommand(reviewCommand)\nprogram.addCommand(mergeCommand)\nprogram.addCommand(changelogCommand)\nprogram.addCommand(explainCommand)\nprogram.addCommand(findCommand)\nprogram.addCommand(branchCommand)\nprogram.addCommand(checkoutCommand)\nprogram.addCommand(syncCommand)\nprogram.addCommand(stashCommand)\nprogram.addCommand(summaryCommand)\n\n// Configuration\nprogram.addCommand(configCommand)\nprogram.addCommand(langCommand)\nprogram.addCommand(initCommand)\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 { generateCommitMessage, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nexport const commitCommand = new Command('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 status = await git.status()\n const unstaged = await git.diff()\n const hasUntracked = status.not_added.length > 0 || status.created.length > 0\n\n if (!unstaged.trim() && !hasUntracked) {\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 template\n const template = findTemplate(repoRoot.trim(), 'commit')\n if (template) {\n console.log(chalk.gray('Using template 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 template || 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 { existsSync, readFileSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { fileURLToPath } from 'url'\nimport { getApiKey, Provider } from './credentials.js'\nimport { getLanguage, getLanguageInstruction } from './config.js'\n\nexport interface AIOptions {\n provider: Provider\n model?: string\n}\n\n// Get the directory where gut is installed (for reading default templates)\n// After bundling with tsup, the output is dist/index.js, so we go up one level\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\nconst GUT_ROOT = join(__dirname, '..')\n\n/**\n * Load a default template from gut's own .gut/ folder\n */\nfunction loadTemplate(name: string): string {\n const templatePath = join(GUT_ROOT, '.gut', `${name}.md`)\n if (existsSync(templatePath)) {\n return readFileSync(templatePath, 'utf-8')\n }\n throw new Error(`Template not found: ${templatePath}`)\n}\n\n/**\n * Find a user's project template from .gut/ folder\n * @param repoRoot - The root directory of the user's repository\n * @param templateName - Name of the template file (without .md extension)\n * @returns Template content if found, null otherwise\n */\nexport function findTemplate(repoRoot: string, templateName: string): string | null {\n const templatePath = join(repoRoot, '.gut', `${templateName}.md`)\n if (existsSync(templatePath)) {\n return readFileSync(templatePath, 'utf-8')\n }\n return null\n}\n\n/**\n * Replace template variables in the format {{variable}}\n * Also supports conditional sections: {{#var}}content{{/var}} (rendered if var exists)\n *\n * @param userTemplate - User-provided template string or null/undefined\n * @param templateName - Name of the default template file in .gut/ (without .md extension)\n * @param variables - Variables to replace in the template\n * @returns Processed template with language instruction appended\n */\nfunction applyTemplate(\n userTemplate: string | null | undefined,\n templateName: string,\n variables: Record<string, string | undefined>\n): string {\n const langInstruction = getLanguageInstruction(getLanguage())\n\n // Priority: user template > .gut/ template\n let result = userTemplate || loadTemplate(templateName)\n\n // Handle conditional sections: {{#var}}content{{/var}}\n result = result.replace(/\\{\\{#(\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/\\1\\}\\}/g, (_, key, content) => {\n return variables[key] ? content : ''\n })\n\n // Replace simple variables: {{var}}\n for (const [key, value] of Object.entries(variables)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value || '')\n }\n\n // Always append language instruction (for both user and default templates)\n if (langInstruction) {\n result += langInstruction\n }\n\n return result\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 template?: string\n): Promise<string> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'commit', {\n diff: diff.slice(0, 8000)\n })\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 },\n options: AIOptions,\n template?: string\n): Promise<{ title: string; body: string }> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'pr', {\n baseBranch: context.baseBranch,\n currentBranch: context.currentBranch,\n commits: context.commits.map((c) => `- ${c}`).join('\\n'),\n diff: context.diff.slice(0, 6000)\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 template?: string\n): Promise<CodeReview> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'review', {\n diff: diff.slice(0, 10000)\n })\n\n const result = await generateObject({\n model,\n schema: CodeReviewSchema,\n prompt\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 },\n options: AIOptions,\n template?: string\n): Promise<Changelog> {\n const model = await getModel(options)\n\n const commitList = context.commits\n .map((c) => `- ${c.hash.slice(0, 7)} ${c.message} (${c.author})`)\n .join('\\n')\n\n const prompt = applyTemplate(template, 'changelog', {\n fromRef: context.fromRef,\n toRef: context.toRef,\n commits: commitList,\n diff: context.diff.slice(0, 8000)\n })\n\n const result = await generateObject({\n model,\n schema: ChangelogSchema,\n prompt\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 template?: string\n): Promise<Explanation> {\n const model = await getModel(options)\n\n // Handle file content explanation\n if (context.type === 'file-content') {\n const prompt = applyTemplate(template, 'explain-file', {\n filePath: context.metadata.filePath || '',\n content: context.content?.slice(0, 15000) || ''\n })\n\n const result = await generateObject({\n model,\n schema: ExplanationSchema,\n prompt\n })\n return result.object\n }\n\n // Build context info for diff-based explanations\n let contextInfo: string\n let targetType: string\n\n if (context.type === 'pr') {\n contextInfo = `Pull 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 targetType = 'pull request'\n } else if (context.type === 'file-history') {\n contextInfo = `File: ${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 targetType = 'file changes'\n } else if (context.type === 'uncommitted' || context.type === 'staged') {\n contextInfo = context.type === 'staged' ? 'Staged changes (ready to commit)' : 'Uncommitted changes (work in progress)'\n targetType = context.type === 'staged' ? 'staged changes' : 'uncommitted changes'\n } else {\n contextInfo = `Commit: ${context.metadata.hash?.slice(0, 7)}\nMessage: ${context.title}\nAuthor: ${context.metadata.author}\nDate: ${context.metadata.date}`\n targetType = 'commit'\n }\n\n const prompt = applyTemplate(template, 'explain', {\n targetType,\n context: contextInfo,\n diff: context.diff?.slice(0, 12000) || ''\n })\n\n const result = await generateObject({\n model,\n schema: ExplanationSchema,\n prompt\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 template?: string\n): Promise<CommitSearchResult> {\n const model = await getModel(options)\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 prompt = applyTemplate(template, 'find', {\n query,\n commits: commitList,\n maxResults: String(maxResults)\n })\n\n const result = await generateObject({\n model,\n schema: CommitSearchSchema,\n prompt\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 },\n template?: string\n): Promise<string> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'branch', {\n description,\n type: context?.type,\n issue: context?.issue\n })\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 generateBranchNameFromDiff(\n diff: string,\n options: AIOptions,\n template?: string | null\n): Promise<string> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'checkout', {\n diff: diff.slice(0, 8000)\n })\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 template?: string\n): Promise<string> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'stash', {\n diff: diff.slice(0, 4000)\n })\n\n const result = await generateText({\n model,\n prompt,\n maxTokens: 100\n })\n\n return result.text.trim()\n}\n\nconst WorkSummarySchema = z.object({\n title: z.string().describe('One-line title for the summary'),\n overview: z.string().describe('Brief overview of what was accomplished'),\n highlights: z.array(z.string()).describe('Key accomplishments or highlights'),\n details: z.array(\n z.object({\n category: z.string().describe('Category (e.g., Feature, Bug Fix, Refactor)'),\n items: z.array(z.string()).describe('List of items in this category')\n })\n ),\n stats: z.object({\n commits: z.number(),\n filesChanged: z.number().optional(),\n additions: z.number().optional(),\n deletions: z.number().optional()\n }).optional()\n})\n\nexport type WorkSummary = z.infer<typeof WorkSummarySchema>\n\nexport async function generateWorkSummary(\n context: {\n commits: Array<{ hash: string; message: string; date: string }>\n author: string\n since: string\n until?: string\n diff?: string\n },\n options: AIOptions,\n format: 'daily' | 'weekly' | 'custom' = 'custom',\n template?: string\n): Promise<WorkSummary> {\n const model = await getModel(options)\n\n const commitList = context.commits\n .map((c) => `- ${c.hash.slice(0, 7)} ${c.message.split('\\n')[0]} (${c.date.split('T')[0]})`)\n .join('\\n')\n\n const formatHint = format === 'daily'\n ? 'This is a daily report. Focus on today\\'s accomplishments.'\n : format === 'weekly'\n ? 'This is a weekly report. Summarize the week\\'s work at a higher level.'\n : `This is a summary from ${context.since}${context.until ? ` to ${context.until}` : ''}.`\n\n const period = `${context.since}${context.until ? ` to ${context.until}` : ' to now'}`\n\n const prompt = applyTemplate(template, 'summary', {\n author: context.author,\n period,\n format: formatHint,\n commits: commitList,\n diff: context.diff?.slice(0, 6000)\n })\n\n const result = await generateObject({\n model,\n schema: WorkSummarySchema,\n prompt\n })\n\n return {\n ...result.object,\n stats: {\n commits: context.commits.length,\n ...result.object.stats\n }\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 template?: string\n): Promise<ConflictResolution> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'merge', {\n filename: context.filename,\n oursRef: context.oursRef,\n theirsRef: context.theirsRef,\n content: conflictedContent\n })\n\n const result = await generateObject({\n model,\n schema: ConflictResolutionSchema,\n prompt\n })\n\n return result.object\n}\n","import { homedir } from 'os'\nimport { join } from 'path'\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { execSync } from 'child_process'\n\nexport type Language = 'en' | 'ja'\n\nexport interface GutConfig {\n lang: Language\n}\n\nconst DEFAULT_CONFIG: GutConfig = {\n lang: 'en'\n}\n\nfunction getGlobalConfigPath(): string {\n const configDir = join(homedir(), '.config', 'gut')\n return join(configDir, 'config.json')\n}\n\nfunction getRepoRoot(): string | null {\n try {\n return execSync('git rev-parse --show-toplevel', { encoding: 'utf-8' }).trim()\n } catch {\n return null\n }\n}\n\nfunction getLocalConfigPath(): string | null {\n const repoRoot = getRepoRoot()\n if (!repoRoot) return null\n return join(repoRoot, '.gut', 'config.json')\n}\n\nfunction ensureGlobalConfigDir(): void {\n const configDir = join(homedir(), '.config', 'gut')\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true })\n }\n}\n\nfunction ensureLocalConfigDir(): void {\n const repoRoot = getRepoRoot()\n if (!repoRoot) return\n const gutDir = join(repoRoot, '.gut')\n if (!existsSync(gutDir)) {\n mkdirSync(gutDir, { recursive: true })\n }\n}\n\nfunction readConfigFile(path: string): Partial<GutConfig> {\n if (!existsSync(path)) return {}\n try {\n return JSON.parse(readFileSync(path, 'utf-8'))\n } catch {\n return {}\n }\n}\n\nexport function getGlobalConfig(): GutConfig {\n const globalPath = getGlobalConfigPath()\n return { ...DEFAULT_CONFIG, ...readConfigFile(globalPath) }\n}\n\nexport function getLocalConfig(): Partial<GutConfig> {\n const localPath = getLocalConfigPath()\n if (!localPath) return {}\n return readConfigFile(localPath)\n}\n\nexport function getConfig(): GutConfig {\n // Local config overrides global config\n const globalConfig = getGlobalConfig()\n const localConfig = getLocalConfig()\n return { ...globalConfig, ...localConfig }\n}\n\nexport function setGlobalConfig<K extends keyof GutConfig>(key: K, value: GutConfig[K]): void {\n ensureGlobalConfigDir()\n const config = getGlobalConfig()\n config[key] = value\n writeFileSync(getGlobalConfigPath(), JSON.stringify(config, null, 2))\n}\n\nexport function setLocalConfig<K extends keyof GutConfig>(key: K, value: GutConfig[K]): void {\n const localPath = getLocalConfigPath()\n if (!localPath) {\n throw new Error('Not in a git repository')\n }\n ensureLocalConfigDir()\n const config = getLocalConfig()\n config[key] = value\n writeFileSync(localPath, JSON.stringify(config, null, 2))\n}\n\nexport function getLanguage(): Language {\n return getConfig().lang\n}\n\nexport function setLanguage(lang: Language, local: boolean = false): void {\n if (local) {\n setLocalConfig('lang', lang)\n } else {\n setGlobalConfig('lang', lang)\n }\n}\n\nexport function getLanguageInstruction(lang: Language): string {\n switch (lang) {\n case 'ja':\n return '\\n\\nIMPORTANT: Respond in Japanese (日本語で回答してください).'\n case 'en':\n default:\n return ''\n }\n}\n\nexport const VALID_LANGUAGES: Language[] = ['en', 'ja']\n\nexport function isValidLanguage(lang: string): lang is Language {\n return VALID_LANGUAGES.includes(lang as Language)\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 { generatePRDescription, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport { isGhCliInstalled, printGhNotInstalledMessage } from '../lib/gh.js'\n\n// GitHub's conventional PR template paths (prioritized)\nconst GITHUB_PR_TEMPLATE_PATHS = [\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 // First, check for GitHub's PR template\n for (const templatePath of GITHUB_PR_TEMPLATE_PATHS) {\n const fullPath = join(repoRoot, templatePath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n // Fall back to .gut/pr.md\n return findTemplate(repoRoot, 'pr')\n}\n\n\nexport const prCommand = new Command('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 },\n { provider, model: options.model },\n template || undefined\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 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 // Check if gh CLI is installed\n const ghInstalled = isGhCliInstalled()\n\n if (!ghInstalled) {\n console.log(chalk.yellow('\\n⚠ GitHub CLI (gh) is not installed'))\n console.log(chalk.gray(' To create PRs directly from gut, install gh CLI:'))\n console.log(chalk.gray(' brew install gh (macOS)'))\n console.log(chalk.gray(' https://cli.github.com/'))\n if (!options.copy) {\n console.log(chalk.gray('\\nTip: Use --copy to copy to clipboard'))\n }\n } else {\n // Always ask about creating PR\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const promptMessage = options.create\n ? chalk.cyan('\\nCreate PR with this description? (y/N) ')\n : chalk.cyan('\\nCreate PR with gh CLI? (y/N) ')\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(promptMessage, resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() === 'y') {\n const createSpinner = ora('Creating PR...').start()\n try {\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 authenticated: gh auth login'))\n }\n } else if (!options.copy) {\n console.log(chalk.gray('\\nTip: Use --copy to copy to clipboard'))\n }\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 { execSync } from 'child_process'\nimport chalk from 'chalk'\n\nlet ghInstalledCache: boolean | null = null\n\nexport function isGhCliInstalled(): boolean {\n if (ghInstalledCache !== null) {\n return ghInstalledCache\n }\n try {\n execSync('gh --version', { stdio: 'pipe' })\n ghInstalledCache = true\n return true\n } catch {\n ghInstalledCache = false\n return false\n }\n}\n\nexport function printGhNotInstalledMessage(): void {\n console.log(chalk.yellow('\\n⚠ GitHub CLI (gh) is not installed'))\n console.log(chalk.gray(' This command requires gh CLI. Install it:'))\n console.log(chalk.gray(' brew install gh (macOS)'))\n console.log(chalk.gray(' https://cli.github.com/'))\n}\n\nexport function requireGhCli(): boolean {\n if (!isGhCliInstalled()) {\n printGhNotInstalledMessage()\n return false\n }\n return true\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, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport { requireGhCli } from '../lib/gh.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 reviewCommand = new Command('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 - check gh CLI first\n spinner.stop()\n if (!requireGhCli()) {\n process.exit(1)\n }\n spinner.start(`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 repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const template = findTemplate(repoRoot.trim(), 'review')\n\n const review = await generateCodeReview(\n diff,\n { provider, model: options.model },\n template || undefined\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, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nexport const mergeCommand = new Command('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 template\n const template = findTemplate(rootDir.trim(), 'merge')\n if (template) {\n console.log(chalk.gray('Using merge template 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 }, template || 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 { generateChangelog, Changelog, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\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 template\n const repoRoot = await git.revparse(['--show-toplevel'])\n const template = findTemplate(repoRoot.trim(), 'changelog')\n\n if (template) {\n spinner.text = 'Using template from project...'\n }\n\n const changelog = await generateChangelog(\n { commits, diff, fromRef, toRef },\n { provider, model: options.model },\n template || undefined\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 (template) {\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 { generateExplanation, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport { requireGhCli } from '../lib/gh.js'\n\nexport const explainCommand = new Command('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 // Check gh CLI first\n spinner.stop()\n if (!requireGhCli()) {\n process.exit(1)\n }\n spinner.start()\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 template\n const isFileContent = context.type === 'file-content'\n const templateName = isFileContent ? 'explain-file' : 'explain'\n const template = findTemplate(repoRoot.trim(), templateName)\n if (template) {\n console.log(chalk.gray('Using template from project...'))\n }\n\n spinner.text = 'AI is generating explanation...'\n\n const explanation = await generateExplanation(\n context,\n { provider, model: options.model },\n template || undefined\n )\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 { searchCommits, CommitSearchResult, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nexport const findCommand = new Command('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 template\n const template = findTemplate(repoRoot.trim(), 'find')\n\n // Search with AI\n const results = await searchCommits(\n query,\n commits,\n { provider, model: options.model },\n parseInt(options.maxResults, 10),\n template || 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 { execSync } from 'child_process'\nimport { generateBranchName, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport { requireGhCli } from '../lib/gh.js'\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 branchCommand = new Command('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 - check gh CLI first\n if (!requireGhCli()) {\n process.exit(1)\n }\n\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 you are authenticated: gh auth login'))\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 template = findTemplate(repoRoot.trim(), 'branch')\n\n if (template) {\n console.log(chalk.gray('Using template 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 { type: options.type, issue: issueNumber },\n template || undefined\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'\nimport { generateBranchNameFromDiff, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nexport const checkoutCommand = new Command('checkout')\n .description('Generate a branch name from current diff and checkout')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-y, --yes', 'Skip confirmation and checkout directly')\n .option('-s, --staged', 'Use staged changes only instead of all 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 repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n\n // Get diff\n const spinner = ora('Analyzing changes...').start()\n\n const status = await git.status()\n\n let diff: string\n if (options.staged) {\n diff = await git.diff(['--cached'])\n } else {\n // Get both staged and unstaged changes\n const stagedDiff = await git.diff(['--cached'])\n const unstagedDiff = await git.diff()\n diff = stagedDiff + '\\n' + unstagedDiff\n }\n\n // Check if there are any changes (including untracked files)\n const hasChanges = diff.trim() || status.not_added.length > 0 || status.created.length > 0\n\n if (!hasChanges) {\n spinner.fail('No changes found')\n console.log(chalk.gray('Make some changes first, then run gut checkout'))\n process.exit(1)\n }\n\n // If only untracked files, add them to context\n if (!diff.trim() && (status.not_added.length > 0 || status.created.length > 0)) {\n const untrackedFiles = [...status.not_added, ...status.created]\n diff = `New files:\\n${untrackedFiles.map(f => `+ ${f}`).join('\\n')}`\n }\n\n spinner.text = 'Generating branch name...'\n\n const provider = options.provider.toLowerCase() as Provider\n const template = findTemplate(repoRoot.trim(), 'checkout')\n\n if (template) {\n console.log(chalk.gray('\\nUsing template from project...'))\n }\n\n try {\n const branchName = await generateBranchNameFromDiff(\n diff,\n { provider, model: options.model },\n template\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.yes) {\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('--no-push', 'Skip push after syncing')\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 (behind > 0) {\n console.log(chalk.yellow(` ↓ ${behind} commit(s) behind`))\n }\n\n if (ahead > 0) {\n if (options.push !== false) {\n const pushSpinner = ora('Pushing to remote...').start()\n try {\n await git.push()\n pushSpinner.succeed(chalk.green(`Pushed ${ahead} commit(s)`))\n } catch (error) {\n pushSpinner.fail('Push failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n }\n } else {\n console.log(chalk.cyan(` ↑ ${ahead} commit(s) ahead`))\n }\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, findTemplate } 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 const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const template = findTemplate(repoRoot.trim(), 'stash')\n stashName = await generateStashName(fullDiff, { provider, model: options.model }, template || undefined)\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","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { generateWorkSummary, WorkSummary, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nexport const summaryCommand = new Command('summary')\n .description('Generate a work summary from your commits (for daily/weekly reports)')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('--since <date>', 'Start date (default: today)', 'today')\n .option('--until <date>', 'End date')\n .option('--author <author>', 'Filter by author (default: current user)')\n .option('--daily', 'Generate daily report (alias for --since today)')\n .option('--weekly', 'Generate weekly report (alias for --since \"1 week ago\")')\n .option('--with-diff', 'Include diff analysis for more detail')\n .option('--markdown', 'Output as markdown')\n .option('--json', 'Output as JSON')\n .option('--copy', 'Copy to clipboard')\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 provider = options.provider.toLowerCase() as Provider\n const spinner = ora('Generating summary...').start()\n\n try {\n // Get current user if no author specified\n let author = options.author\n if (!author) {\n const config = await git.listConfig()\n author = config.all['user.name'] as string || ''\n if (!author) {\n spinner.fail('Could not determine git user. Use --author to specify.')\n process.exit(1)\n }\n }\n\n // Determine date range\n let since = options.since\n let format: 'daily' | 'weekly' | 'custom' = 'custom'\n\n if (options.daily) {\n since = 'today'\n format = 'daily'\n } else if (options.weekly) {\n since = '1 week ago'\n format = 'weekly'\n } else if (since === 'today') {\n format = 'daily'\n }\n\n // Convert relative dates to absolute for better compatibility\n const sinceDate = resolveDate(since)\n\n spinner.text = `Fetching commits by ${author} since ${since}...`\n\n // Build log options\n const logOptions: string[] = [`--author=${author}`, `--since=${sinceDate}`]\n if (options.until) {\n logOptions.push(`--until=${resolveDate(options.until)}`)\n }\n\n const log = await git.log(logOptions)\n\n if (log.all.length === 0) {\n spinner.info(`No commits found for ${author} since ${since}`)\n process.exit(0)\n }\n\n spinner.text = `Analyzing ${log.all.length} commits...`\n\n // Get diff if requested\n let diff: string | undefined\n if (options.withDiff && log.all.length > 0) {\n const oldest = log.all[log.all.length - 1].hash\n const newest = log.all[0].hash\n try {\n diff = await git.diff([`${oldest}^`, newest])\n } catch {\n // If oldest^ doesn't exist (first commit), skip diff\n }\n }\n\n const commits = log.all.map((c) => ({\n hash: c.hash,\n message: c.message,\n date: c.date\n }))\n\n const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const template = findTemplate(repoRoot.trim(), 'summary')\n\n const summary = await generateWorkSummary(\n { commits, author, since, until: options.until, diff },\n { provider, model: options.model },\n format,\n template || undefined\n )\n\n spinner.stop()\n\n if (options.json) {\n console.log(JSON.stringify(summary, null, 2))\n return\n }\n\n const output = options.markdown ? formatMarkdown(summary, author, since, options.until) : null\n\n if (options.copy) {\n const textToCopy = output || formatMarkdown(summary, author, since, options.until)\n const { execSync } = await import('child_process')\n try {\n execSync('pbcopy', { input: textToCopy })\n console.log(chalk.green('Summary copied to clipboard!'))\n console.log()\n } catch {\n console.log(chalk.yellow('Could not copy to clipboard'))\n }\n }\n\n if (options.markdown) {\n console.log(output)\n } else {\n printSummary(summary, author, since, options.until)\n }\n } catch (error) {\n spinner.fail('Failed to generate summary')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\nfunction formatMarkdown(summary: WorkSummary, author: string, since: string, until?: string): string {\n const lines: string[] = []\n const period = until ? `${since} - ${until}` : `${since} - now`\n\n lines.push(`# ${summary.title}`)\n lines.push('')\n lines.push(`**Author:** ${author}`)\n lines.push(`**Period:** ${period}`)\n if (summary.stats) {\n lines.push(`**Commits:** ${summary.stats.commits}`)\n }\n lines.push('')\n lines.push('## Overview')\n lines.push(summary.overview)\n lines.push('')\n\n if (summary.highlights.length > 0) {\n lines.push('## Highlights')\n for (const highlight of summary.highlights) {\n lines.push(`- ${highlight}`)\n }\n lines.push('')\n }\n\n if (summary.details.length > 0) {\n lines.push('## Details')\n for (const section of summary.details) {\n lines.push(`### ${section.category}`)\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\nfunction resolveDate(dateStr: string): string {\n const now = new Date()\n\n if (dateStr === 'today') {\n return formatDate(now)\n } else if (dateStr === 'yesterday') {\n const d = new Date(now)\n d.setDate(d.getDate() - 1)\n return formatDate(d)\n } else if (dateStr.match(/^(\\d+)\\s+(day|days)\\s+ago$/i)) {\n const match = dateStr.match(/^(\\d+)\\s+(day|days)\\s+ago$/i)!\n const days = parseInt(match[1], 10)\n const d = new Date(now)\n d.setDate(d.getDate() - days)\n return formatDate(d)\n } else if (dateStr.match(/^(\\d+)\\s+(week|weeks)\\s+ago$/i)) {\n const match = dateStr.match(/^(\\d+)\\s+(week|weeks)\\s+ago$/i)!\n const weeks = parseInt(match[1], 10)\n const d = new Date(now)\n d.setDate(d.getDate() - weeks * 7)\n return formatDate(d)\n }\n\n // Return as-is if it's already a date string\n return dateStr\n}\n\nfunction formatDate(d: Date): string {\n const year = d.getFullYear()\n const month = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${year}-${month}-${day} 00:00:00`\n}\n\nfunction printSummary(summary: WorkSummary, author: string, since: string, until?: string) {\n const period = until ? `${since} - ${until}` : `${since} - now`\n\n console.log(chalk.bold(`\\n📊 ${summary.title}\\n`))\n console.log(chalk.gray(`Author: ${author}`))\n console.log(chalk.gray(`Period: ${period}`))\n if (summary.stats) {\n console.log(chalk.gray(`Commits: ${summary.stats.commits}`))\n }\n console.log()\n\n console.log(chalk.cyan('Overview:'))\n console.log(` ${summary.overview}`)\n console.log()\n\n if (summary.highlights.length > 0) {\n console.log(chalk.cyan('Highlights:'))\n for (const highlight of summary.highlights) {\n console.log(` ${chalk.green('★')} ${highlight}`)\n }\n console.log()\n }\n\n if (summary.details.length > 0) {\n console.log(chalk.cyan('Details:'))\n for (const section of summary.details) {\n console.log(` ${chalk.yellow(section.category)}`)\n for (const item of section.items) {\n console.log(` • ${item}`)\n }\n }\n console.log()\n }\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport {\n getConfig,\n getGlobalConfig,\n getLocalConfig,\n setLanguage,\n isValidLanguage,\n VALID_LANGUAGES,\n type GutConfig\n} from '../lib/config.js'\n\nexport const configCommand = new Command('config')\n .description('Manage gut configuration')\n\nconfigCommand\n .command('set <key> <value>')\n .description('Set a configuration value')\n .option('--local', 'Set for current repository only')\n .action((key: string, value: string, options: { local?: boolean }) => {\n if (key === 'lang') {\n if (!isValidLanguage(value)) {\n console.error(chalk.red(`Invalid language: ${value}`))\n console.error(chalk.gray(`Valid languages: ${VALID_LANGUAGES.join(', ')}`))\n process.exit(1)\n }\n try {\n setLanguage(value, options.local ?? false)\n const scope = options.local ? '(local)' : '(global)'\n console.log(chalk.green(`✓ Language set to: ${value} ${scope}`))\n } catch (err) {\n console.error(chalk.red((err as Error).message))\n process.exit(1)\n }\n } else {\n console.error(chalk.red(`Unknown config key: ${key}`))\n console.error(chalk.gray('Available keys: lang'))\n process.exit(1)\n }\n })\n\nconfigCommand\n .command('get <key>')\n .description('Get a configuration value')\n .action((key: string) => {\n const config = getConfig()\n if (key in config) {\n console.log(config[key as keyof GutConfig])\n } else {\n console.error(chalk.red(`Unknown config key: ${key}`))\n process.exit(1)\n }\n })\n\nconfigCommand\n .command('list')\n .description('List all configuration values')\n .action(() => {\n const globalConfig = getGlobalConfig()\n const localConfig = getLocalConfig()\n const effectiveConfig = getConfig()\n\n console.log(chalk.bold('Configuration:'))\n console.log()\n\n for (const key of Object.keys(effectiveConfig) as (keyof GutConfig)[]) {\n const value = effectiveConfig[key]\n const isLocal = key in localConfig\n const scope = isLocal ? chalk.cyan(' (local)') : chalk.gray(' (global)')\n console.log(` ${chalk.cyan(key)}: ${value}${scope}`)\n }\n\n if (Object.keys(localConfig).length > 0) {\n console.log()\n console.log(chalk.gray('Local config: .gut/config.json'))\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport {\n getLanguage,\n setLanguage,\n isValidLanguage,\n VALID_LANGUAGES,\n getLocalConfig\n} from '../lib/config.js'\n\nexport const langCommand = new Command('lang')\n .description('Set or show output language')\n .argument('[language]', `Language to set (${VALID_LANGUAGES.join(', ')})`)\n .option('--local', 'Set for current repository only')\n .action((language: string | undefined, options: { local?: boolean }) => {\n if (!language) {\n // Show current language\n const lang = getLanguage()\n const localConfig = getLocalConfig()\n const isLocal = 'lang' in localConfig\n const scope = isLocal ? chalk.cyan('(local)') : chalk.gray('(global)')\n console.log(`${lang} ${scope}`)\n return\n }\n\n if (!isValidLanguage(language)) {\n console.error(chalk.red(`Invalid language: ${language}`))\n console.error(chalk.gray(`Valid languages: ${VALID_LANGUAGES.join(', ')}`))\n process.exit(1)\n }\n\n try {\n setLanguage(language, options.local ?? false)\n const scope = options.local ? '(local)' : '(global)'\n console.log(chalk.green(`✓ Language set to: ${language} ${scope}`))\n } catch (err) {\n console.error(chalk.red((err as Error).message))\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 { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { fileURLToPath } from 'url'\nimport { generateText } from 'ai'\nimport { createGoogleGenerativeAI } from '@ai-sdk/google'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { createAnthropic } from '@ai-sdk/anthropic'\nimport { getApiKey, Provider } from '../lib/credentials.js'\nimport { getLanguage } from '../lib/config.js'\n\n// Get gut's root directory\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\nconst GUT_ROOT = join(__dirname, '..')\n\nconst TEMPLATE_FILES = [\n 'branch.md',\n 'changelog.md',\n 'checkout.md',\n 'commit.md',\n 'explain.md',\n 'explain-file.md',\n 'find.md',\n 'merge.md',\n 'pr.md',\n 'review.md',\n 'stash.md',\n 'summary.md'\n]\n\nasync function translateTemplate(\n content: string,\n targetLang: string,\n provider: Provider\n): Promise<string> {\n const apiKey = await getApiKey(provider)\n if (!apiKey) {\n throw new Error(`No API key found for ${provider}`)\n }\n\n const modelName = provider === 'gemini' ? 'gemini-2.0-flash' :\n provider === 'openai' ? 'gpt-4o-mini' : 'claude-sonnet-4-20250514'\n\n let model\n switch (provider) {\n case 'gemini': {\n const google = createGoogleGenerativeAI({ apiKey })\n model = google(modelName)\n break\n }\n case 'openai': {\n const openai = createOpenAI({ apiKey })\n model = openai(modelName)\n break\n }\n case 'anthropic': {\n const anthropic = createAnthropic({ apiKey })\n model = anthropic(modelName)\n break\n }\n }\n\n const langNames: Record<string, string> = {\n ja: 'Japanese',\n en: 'English',\n zh: 'Chinese',\n ko: 'Korean',\n es: 'Spanish',\n fr: 'French',\n de: 'German'\n }\n\n const targetLangName = langNames[targetLang] || targetLang\n\n const { text } = await generateText({\n model,\n prompt: `Translate the following prompt template to ${targetLangName}.\nKeep all {{variable}} placeholders exactly as they are - do not translate them.\nKeep the markdown formatting intact.\nOnly translate the instructional text.\n\nTemplate to translate:\n${content}\n\nTranslated template:`\n })\n\n return text.trim()\n}\n\nexport const initCommand = new Command('init')\n .description('Initialize .gut/ templates in your project')\n .option('-p, --provider <provider>', 'AI provider for translation (gemini, openai, anthropic)', 'gemini')\n .option('-f, --force', 'Overwrite existing templates')\n .option('--no-translate', 'Skip translation even if language is not English')\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 repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const targetDir = join(repoRoot.trim(), '.gut')\n const sourceDir = join(GUT_ROOT, '.gut')\n\n // Create .gut directory if it doesn't exist\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true })\n console.log(chalk.green(`Created ${targetDir}`))\n }\n\n const lang = getLanguage()\n const needsTranslation = options.translate !== false && lang !== 'en'\n const provider = options.provider.toLowerCase() as Provider\n\n if (needsTranslation) {\n console.log(chalk.gray(`Language: ${lang} - templates will be translated\\n`))\n }\n\n const spinner = ora()\n let copied = 0\n let skipped = 0\n\n for (const filename of TEMPLATE_FILES) {\n const sourcePath = join(sourceDir, filename)\n const targetPath = join(targetDir, filename)\n\n if (!existsSync(sourcePath)) {\n continue\n }\n\n if (existsSync(targetPath) && !options.force) {\n console.log(chalk.gray(` Skipped: ${filename} (already exists)`))\n skipped++\n continue\n }\n\n let content = readFileSync(sourcePath, 'utf-8')\n\n if (needsTranslation) {\n spinner.start(`Translating ${filename}...`)\n try {\n content = await translateTemplate(content, lang, provider)\n spinner.succeed(`Translated: ${filename}`)\n } catch (error) {\n spinner.fail(`Failed to translate ${filename}`)\n console.error(chalk.red(` ${error instanceof Error ? error.message : 'Unknown error'}`))\n // Fall back to original content\n console.log(chalk.gray(` Using original English template`))\n }\n } else {\n console.log(chalk.green(` Copied: ${filename}`))\n }\n\n writeFileSync(targetPath, content)\n copied++\n }\n\n console.log()\n if (copied > 0) {\n console.log(chalk.green(`✓ ${copied} template(s) initialized in .gut/`))\n }\n if (skipped > 0) {\n console.log(chalk.gray(` ${skipped} template(s) skipped (use --force to overwrite)`))\n }\n\n console.log(chalk.gray('\\nYou can now customize these templates for your project.'))\n })\n"],"mappings":"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","names":["Command","Command","chalk","chalk","Command","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","path","join","existsSync","readFileSync","prompt","result","Command","simpleGit","chalk","ora","execSync","fs","path","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","execSync","execSync","chalk","join","existsSync","readFileSync","Command","simpleGit","chalk","ora","execSync","Command","chalk","ora","simpleGit","execSync","execSync","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","execSync","existsSync","readFileSync","Command","simpleGit","chalk","ora","existsSync","readFileSync","execSync","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","execSync","execSync","Command","simpleGit","chalk","spinner","ora","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","execSync","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","ora","simpleGit","existsSync","mkdirSync","readFileSync","writeFileSync","join","dirname","fileURLToPath","generateText","createGoogleGenerativeAI","createOpenAI","createAnthropic","__filename","fileURLToPath","__dirname","dirname","GUT_ROOT","join","createGoogleGenerativeAI","createOpenAI","createAnthropic","generateText","Command","simpleGit","chalk","existsSync","mkdirSync","ora","readFileSync","writeFileSync","Command"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/commands/cleanup.ts","../src/commands/auth.ts","../src/lib/credentials.ts","../src/commands/commit.ts","../src/lib/ai.ts","../src/lib/config.ts","../src/commands/pr.ts","../src/lib/gh.ts","../src/commands/review.ts","../src/commands/merge.ts","../src/commands/changelog.ts","../src/commands/explain.ts","../src/commands/find.ts","../src/commands/branch.ts","../src/commands/checkout.ts","../src/commands/sync.ts","../src/commands/stash.ts","../src/commands/summary.ts","../src/commands/config.ts","../src/commands/lang.ts","../src/commands/init.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { cleanupCommand } from './commands/cleanup.js'\nimport { authCommand } from './commands/auth.js'\nimport { commitCommand } from './commands/commit.js'\nimport { prCommand } from './commands/pr.js'\nimport { reviewCommand } from './commands/review.js'\nimport { mergeCommand } from './commands/merge.js'\nimport { changelogCommand } from './commands/changelog.js'\nimport { explainCommand } from './commands/explain.js'\nimport { findCommand } from './commands/find.js'\nimport { branchCommand } from './commands/branch.js'\nimport { checkoutCommand } from './commands/checkout.js'\nimport { syncCommand } from './commands/sync.js'\nimport { stashCommand } from './commands/stash.js'\nimport { summaryCommand } from './commands/summary.js'\nimport { configCommand } from './commands/config.js'\nimport { langCommand } from './commands/lang.js'\nimport { initCommand } from './commands/init.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(commitCommand)\nprogram.addCommand(prCommand)\nprogram.addCommand(reviewCommand)\nprogram.addCommand(mergeCommand)\nprogram.addCommand(changelogCommand)\nprogram.addCommand(explainCommand)\nprogram.addCommand(findCommand)\nprogram.addCommand(branchCommand)\nprogram.addCommand(checkoutCommand)\nprogram.addCommand(syncCommand)\nprogram.addCommand(stashCommand)\nprogram.addCommand(summaryCommand)\n\n// Configuration\nprogram.addCommand(configCommand)\nprogram.addCommand(langCommand)\nprogram.addCommand(initCommand)\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 { generateCommitMessage, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nexport const commitCommand = new Command('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 status = await git.status()\n const unstaged = await git.diff()\n const hasUntracked = status.not_added.length > 0 || status.created.length > 0\n\n if (!unstaged.trim() && !hasUntracked) {\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 template\n const template = findTemplate(repoRoot.trim(), 'commit')\n if (template) {\n console.log(chalk.gray('Using template 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 template || 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 { existsSync, readFileSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { fileURLToPath } from 'url'\nimport { getApiKey, Provider } from './credentials.js'\nimport { getLanguage, getLanguageInstruction } from './config.js'\n\nexport interface AIOptions {\n provider: Provider\n model?: string\n}\n\n// Get the directory where gut is installed (for reading default templates)\n// After bundling with tsup, the output is dist/index.js, so we go up one level\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\nconst GUT_ROOT = join(__dirname, '..')\n\n/**\n * Load a default template from gut's own .gut/ folder\n */\nfunction loadTemplate(name: string): string {\n const templatePath = join(GUT_ROOT, '.gut', `${name}.md`)\n if (existsSync(templatePath)) {\n return readFileSync(templatePath, 'utf-8')\n }\n throw new Error(`Template not found: ${templatePath}`)\n}\n\n/**\n * Find a user's project template from .gut/ folder\n * @param repoRoot - The root directory of the user's repository\n * @param templateName - Name of the template file (without .md extension)\n * @returns Template content if found, null otherwise\n */\nexport function findTemplate(repoRoot: string, templateName: string): string | null {\n const templatePath = join(repoRoot, '.gut', `${templateName}.md`)\n if (existsSync(templatePath)) {\n return readFileSync(templatePath, 'utf-8')\n }\n return null\n}\n\n/**\n * Replace template variables in the format {{variable}}\n * Also supports conditional sections: {{#var}}content{{/var}} (rendered if var exists)\n *\n * @param userTemplate - User-provided template string or null/undefined\n * @param templateName - Name of the default template file in .gut/ (without .md extension)\n * @param variables - Variables to replace in the template\n * @returns Processed template with language instruction appended\n */\nfunction applyTemplate(\n userTemplate: string | null | undefined,\n templateName: string,\n variables: Record<string, string | undefined>\n): string {\n const langInstruction = getLanguageInstruction(getLanguage())\n\n // Priority: user template > .gut/ template\n let result = userTemplate || loadTemplate(templateName)\n\n // Handle conditional sections: {{#var}}content{{/var}}\n result = result.replace(/\\{\\{#(\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/\\1\\}\\}/g, (_, key, content) => {\n return variables[key] ? content : ''\n })\n\n // Replace simple variables: {{var}}\n for (const [key, value] of Object.entries(variables)) {\n result = result.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, 'g'), value || '')\n }\n\n // Always append language instruction (for both user and default templates)\n if (langInstruction) {\n result += langInstruction\n }\n\n return result\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 template?: string\n): Promise<string> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'commit', {\n diff: diff.slice(0, 8000)\n })\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 },\n options: AIOptions,\n template?: string\n): Promise<{ title: string; body: string }> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'pr', {\n baseBranch: context.baseBranch,\n currentBranch: context.currentBranch,\n commits: context.commits.map((c) => `- ${c}`).join('\\n'),\n diff: context.diff.slice(0, 6000)\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 template?: string\n): Promise<CodeReview> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'review', {\n diff: diff.slice(0, 10000)\n })\n\n const result = await generateObject({\n model,\n schema: CodeReviewSchema,\n prompt\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 },\n options: AIOptions,\n template?: string\n): Promise<Changelog> {\n const model = await getModel(options)\n\n const commitList = context.commits\n .map((c) => `- ${c.hash.slice(0, 7)} ${c.message} (${c.author})`)\n .join('\\n')\n\n const prompt = applyTemplate(template, 'changelog', {\n fromRef: context.fromRef,\n toRef: context.toRef,\n commits: commitList,\n diff: context.diff.slice(0, 8000),\n todayDate: new Date().toISOString().split('T')[0]\n })\n\n const result = await generateObject({\n model,\n schema: ChangelogSchema,\n prompt\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 template?: string\n): Promise<Explanation> {\n const model = await getModel(options)\n\n // Handle file content explanation\n if (context.type === 'file-content') {\n const prompt = applyTemplate(template, 'explain-file', {\n filePath: context.metadata.filePath || '',\n content: context.content?.slice(0, 15000) || ''\n })\n\n const result = await generateObject({\n model,\n schema: ExplanationSchema,\n prompt\n })\n return result.object\n }\n\n // Build context info for diff-based explanations\n let contextInfo: string\n let targetType: string\n\n if (context.type === 'pr') {\n contextInfo = `Pull 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 targetType = 'pull request'\n } else if (context.type === 'file-history') {\n contextInfo = `File: ${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 targetType = 'file changes'\n } else if (context.type === 'uncommitted' || context.type === 'staged') {\n contextInfo = context.type === 'staged' ? 'Staged changes (ready to commit)' : 'Uncommitted changes (work in progress)'\n targetType = context.type === 'staged' ? 'staged changes' : 'uncommitted changes'\n } else {\n contextInfo = `Commit: ${context.metadata.hash?.slice(0, 7)}\nMessage: ${context.title}\nAuthor: ${context.metadata.author}\nDate: ${context.metadata.date}`\n targetType = 'commit'\n }\n\n const prompt = applyTemplate(template, 'explain', {\n targetType,\n context: contextInfo,\n diff: context.diff?.slice(0, 12000) || ''\n })\n\n const result = await generateObject({\n model,\n schema: ExplanationSchema,\n prompt\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 template?: string\n): Promise<CommitSearchResult> {\n const model = await getModel(options)\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 prompt = applyTemplate(template, 'find', {\n query,\n commits: commitList,\n maxResults: String(maxResults)\n })\n\n const result = await generateObject({\n model,\n schema: CommitSearchSchema,\n prompt\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 },\n template?: string\n): Promise<string> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'branch', {\n description,\n type: context?.type,\n issue: context?.issue\n })\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 generateBranchNameFromDiff(\n diff: string,\n options: AIOptions,\n template?: string | null\n): Promise<string> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'checkout', {\n diff: diff.slice(0, 8000)\n })\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 template?: string\n): Promise<string> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'stash', {\n diff: diff.slice(0, 4000)\n })\n\n const result = await generateText({\n model,\n prompt,\n maxTokens: 100\n })\n\n return result.text.trim()\n}\n\nconst WorkSummarySchema = z.object({\n title: z.string().describe('One-line title for the summary'),\n overview: z.string().describe('Brief overview of what was accomplished'),\n highlights: z.array(z.string()).describe('Key accomplishments or highlights'),\n details: z.array(\n z.object({\n category: z.string().describe('Category (e.g., Feature, Bug Fix, Refactor)'),\n items: z.array(z.string()).describe('List of items in this category')\n })\n ),\n stats: z.object({\n commits: z.number(),\n filesChanged: z.number().optional(),\n additions: z.number().optional(),\n deletions: z.number().optional()\n }).optional()\n})\n\nexport type WorkSummary = z.infer<typeof WorkSummarySchema>\n\nexport async function generateWorkSummary(\n context: {\n commits: Array<{ hash: string; message: string; date: string }>\n author: string\n since: string\n until?: string\n diff?: string\n },\n options: AIOptions,\n format: 'daily' | 'weekly' | 'custom' = 'custom',\n template?: string\n): Promise<WorkSummary> {\n const model = await getModel(options)\n\n const commitList = context.commits\n .map((c) => `- ${c.hash.slice(0, 7)} ${c.message.split('\\n')[0]} (${c.date.split('T')[0]})`)\n .join('\\n')\n\n const formatHint = format === 'daily'\n ? 'This is a daily report. Focus on today\\'s accomplishments.'\n : format === 'weekly'\n ? 'This is a weekly report. Summarize the week\\'s work at a higher level.'\n : `This is a summary from ${context.since}${context.until ? ` to ${context.until}` : ''}.`\n\n const period = `${context.since}${context.until ? ` to ${context.until}` : ' to now'}`\n\n const prompt = applyTemplate(template, 'summary', {\n author: context.author,\n period,\n format: formatHint,\n commits: commitList,\n diff: context.diff?.slice(0, 6000)\n })\n\n const result = await generateObject({\n model,\n schema: WorkSummarySchema,\n prompt\n })\n\n return {\n ...result.object,\n stats: {\n commits: context.commits.length,\n ...result.object.stats\n }\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 template?: string\n): Promise<ConflictResolution> {\n const model = await getModel(options)\n\n const prompt = applyTemplate(template, 'merge', {\n filename: context.filename,\n oursRef: context.oursRef,\n theirsRef: context.theirsRef,\n content: conflictedContent\n })\n\n const result = await generateObject({\n model,\n schema: ConflictResolutionSchema,\n prompt\n })\n\n return result.object\n}\n","import { homedir } from 'os'\nimport { join } from 'path'\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { execSync } from 'child_process'\n\nexport type Language = 'en' | 'ja'\n\nexport interface GutConfig {\n lang: Language\n}\n\nconst DEFAULT_CONFIG: GutConfig = {\n lang: 'en'\n}\n\nfunction getGlobalConfigPath(): string {\n const configDir = join(homedir(), '.config', 'gut')\n return join(configDir, 'config.json')\n}\n\nfunction getRepoRoot(): string | null {\n try {\n return execSync('git rev-parse --show-toplevel', { encoding: 'utf-8' }).trim()\n } catch {\n return null\n }\n}\n\nfunction getLocalConfigPath(): string | null {\n const repoRoot = getRepoRoot()\n if (!repoRoot) return null\n return join(repoRoot, '.gut', 'config.json')\n}\n\nfunction ensureGlobalConfigDir(): void {\n const configDir = join(homedir(), '.config', 'gut')\n if (!existsSync(configDir)) {\n mkdirSync(configDir, { recursive: true })\n }\n}\n\nfunction ensureLocalConfigDir(): void {\n const repoRoot = getRepoRoot()\n if (!repoRoot) return\n const gutDir = join(repoRoot, '.gut')\n if (!existsSync(gutDir)) {\n mkdirSync(gutDir, { recursive: true })\n }\n}\n\nfunction readConfigFile(path: string): Partial<GutConfig> {\n if (!existsSync(path)) return {}\n try {\n return JSON.parse(readFileSync(path, 'utf-8'))\n } catch {\n return {}\n }\n}\n\nexport function getGlobalConfig(): GutConfig {\n const globalPath = getGlobalConfigPath()\n return { ...DEFAULT_CONFIG, ...readConfigFile(globalPath) }\n}\n\nexport function getLocalConfig(): Partial<GutConfig> {\n const localPath = getLocalConfigPath()\n if (!localPath) return {}\n return readConfigFile(localPath)\n}\n\nexport function getConfig(): GutConfig {\n // Local config overrides global config\n const globalConfig = getGlobalConfig()\n const localConfig = getLocalConfig()\n return { ...globalConfig, ...localConfig }\n}\n\nexport function setGlobalConfig<K extends keyof GutConfig>(key: K, value: GutConfig[K]): void {\n ensureGlobalConfigDir()\n const config = getGlobalConfig()\n config[key] = value\n writeFileSync(getGlobalConfigPath(), JSON.stringify(config, null, 2))\n}\n\nexport function setLocalConfig<K extends keyof GutConfig>(key: K, value: GutConfig[K]): void {\n const localPath = getLocalConfigPath()\n if (!localPath) {\n throw new Error('Not in a git repository')\n }\n ensureLocalConfigDir()\n const config = getLocalConfig()\n config[key] = value\n writeFileSync(localPath, JSON.stringify(config, null, 2))\n}\n\nexport function getLanguage(): Language {\n return getConfig().lang\n}\n\nexport function setLanguage(lang: Language, local: boolean = false): void {\n if (local) {\n setLocalConfig('lang', lang)\n } else {\n setGlobalConfig('lang', lang)\n }\n}\n\nexport function getLanguageInstruction(lang: Language): string {\n switch (lang) {\n case 'ja':\n return '\\n\\nIMPORTANT: Respond in Japanese (日本語で回答してください).'\n case 'en':\n default:\n return ''\n }\n}\n\nexport const VALID_LANGUAGES: Language[] = ['en', 'ja']\n\nexport function isValidLanguage(lang: string): lang is Language {\n return VALID_LANGUAGES.includes(lang as Language)\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 { generatePRDescription, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport { isGhCliInstalled, printGhNotInstalledMessage } from '../lib/gh.js'\n\n// GitHub's conventional PR template paths (prioritized)\nconst GITHUB_PR_TEMPLATE_PATHS = [\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 // First, check for GitHub's PR template\n for (const templatePath of GITHUB_PR_TEMPLATE_PATHS) {\n const fullPath = join(repoRoot, templatePath)\n if (existsSync(fullPath)) {\n return readFileSync(fullPath, 'utf-8')\n }\n }\n // Fall back to .gut/pr.md\n return findTemplate(repoRoot, 'pr')\n}\n\n\nexport const prCommand = new Command('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 },\n { provider, model: options.model },\n template || undefined\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 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 // Check if gh CLI is installed\n const ghInstalled = isGhCliInstalled()\n\n if (!ghInstalled) {\n console.log(chalk.yellow('\\n⚠ GitHub CLI (gh) is not installed'))\n console.log(chalk.gray(' To create PRs directly from gut, install gh CLI:'))\n console.log(chalk.gray(' brew install gh (macOS)'))\n console.log(chalk.gray(' https://cli.github.com/'))\n if (!options.copy) {\n console.log(chalk.gray('\\nTip: Use --copy to copy to clipboard'))\n }\n } else {\n // Always ask about creating PR\n const readline = await import('readline')\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n })\n\n const promptMessage = options.create\n ? chalk.cyan('\\nCreate PR with this description? (y/N) ')\n : chalk.cyan('\\nCreate PR with gh CLI? (y/N) ')\n\n const answer = await new Promise<string>((resolve) => {\n rl.question(promptMessage, resolve)\n })\n rl.close()\n\n if (answer.toLowerCase() === 'y') {\n const createSpinner = ora('Creating PR...').start()\n try {\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 authenticated: gh auth login'))\n }\n } else if (!options.copy) {\n console.log(chalk.gray('\\nTip: Use --copy to copy to clipboard'))\n }\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 { execSync } from 'child_process'\nimport chalk from 'chalk'\n\nlet ghInstalledCache: boolean | null = null\n\nexport function isGhCliInstalled(): boolean {\n if (ghInstalledCache !== null) {\n return ghInstalledCache\n }\n try {\n execSync('gh --version', { stdio: 'pipe' })\n ghInstalledCache = true\n return true\n } catch {\n ghInstalledCache = false\n return false\n }\n}\n\nexport function printGhNotInstalledMessage(): void {\n console.log(chalk.yellow('\\n⚠ GitHub CLI (gh) is not installed'))\n console.log(chalk.gray(' This command requires gh CLI. Install it:'))\n console.log(chalk.gray(' brew install gh (macOS)'))\n console.log(chalk.gray(' https://cli.github.com/'))\n}\n\nexport function requireGhCli(): boolean {\n if (!isGhCliInstalled()) {\n printGhNotInstalledMessage()\n return false\n }\n return true\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, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport { requireGhCli } from '../lib/gh.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 reviewCommand = new Command('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 - check gh CLI first\n spinner.stop()\n if (!requireGhCli()) {\n process.exit(1)\n }\n spinner.start(`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 repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const template = findTemplate(repoRoot.trim(), 'review')\n\n const review = await generateCodeReview(\n diff,\n { provider, model: options.model },\n template || undefined\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, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport * as fs from 'fs'\nimport * as path from 'path'\n\nexport const mergeCommand = new Command('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 template\n const template = findTemplate(rootDir.trim(), 'merge')\n if (template) {\n console.log(chalk.gray('Using merge template 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 }, template || 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 { generateChangelog, Changelog, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\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 template\n const repoRoot = await git.revparse(['--show-toplevel'])\n const template = findTemplate(repoRoot.trim(), 'changelog')\n\n if (template) {\n spinner.text = 'Using template from project...'\n }\n\n const changelog = await generateChangelog(\n { commits, diff, fromRef, toRef },\n { provider, model: options.model },\n template || undefined\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 (template) {\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 { generateExplanation, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport { requireGhCli } from '../lib/gh.js'\n\nexport const explainCommand = new Command('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 // Check gh CLI first\n spinner.stop()\n if (!requireGhCli()) {\n process.exit(1)\n }\n spinner.start()\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 template\n const isFileContent = context.type === 'file-content'\n const templateName = isFileContent ? 'explain-file' : 'explain'\n const template = findTemplate(repoRoot.trim(), templateName)\n if (template) {\n console.log(chalk.gray('Using template from project...'))\n }\n\n spinner.text = 'AI is generating explanation...'\n\n const explanation = await generateExplanation(\n context,\n { provider, model: options.model },\n template || undefined\n )\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 { searchCommits, CommitSearchResult, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nexport const findCommand = new Command('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 template\n const template = findTemplate(repoRoot.trim(), 'find')\n\n // Search with AI\n const results = await searchCommits(\n query,\n commits,\n { provider, model: options.model },\n parseInt(options.maxResults, 10),\n template || 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 { execSync } from 'child_process'\nimport { generateBranchName, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\nimport { requireGhCli } from '../lib/gh.js'\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 branchCommand = new Command('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 - check gh CLI first\n if (!requireGhCli()) {\n process.exit(1)\n }\n\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 you are authenticated: gh auth login'))\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 template = findTemplate(repoRoot.trim(), 'branch')\n\n if (template) {\n console.log(chalk.gray('Using template 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 { type: options.type, issue: issueNumber },\n template || undefined\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'\nimport { generateBranchNameFromDiff, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nexport const checkoutCommand = new Command('checkout')\n .description('Generate a branch name from current diff and checkout')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('-y, --yes', 'Skip confirmation and checkout directly')\n .option('-s, --staged', 'Use staged changes only instead of all 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 repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n\n // Get diff\n const spinner = ora('Analyzing changes...').start()\n\n const status = await git.status()\n\n let diff: string\n if (options.staged) {\n diff = await git.diff(['--cached'])\n } else {\n // Get both staged and unstaged changes\n const stagedDiff = await git.diff(['--cached'])\n const unstagedDiff = await git.diff()\n diff = stagedDiff + '\\n' + unstagedDiff\n }\n\n // Check if there are any changes (including untracked files)\n const hasChanges = diff.trim() || status.not_added.length > 0 || status.created.length > 0\n\n if (!hasChanges) {\n spinner.fail('No changes found')\n console.log(chalk.gray('Make some changes first, then run gut checkout'))\n process.exit(1)\n }\n\n // If only untracked files, add them to context\n if (!diff.trim() && (status.not_added.length > 0 || status.created.length > 0)) {\n const untrackedFiles = [...status.not_added, ...status.created]\n diff = `New files:\\n${untrackedFiles.map(f => `+ ${f}`).join('\\n')}`\n }\n\n spinner.text = 'Generating branch name...'\n\n const provider = options.provider.toLowerCase() as Provider\n const template = findTemplate(repoRoot.trim(), 'checkout')\n\n if (template) {\n console.log(chalk.gray('\\nUsing template from project...'))\n }\n\n try {\n const branchName = await generateBranchNameFromDiff(\n diff,\n { provider, model: options.model },\n template\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.yes) {\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('--no-push', 'Skip push after syncing')\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 (behind > 0) {\n console.log(chalk.yellow(` ↓ ${behind} commit(s) behind`))\n }\n\n if (ahead > 0) {\n if (options.push !== false) {\n const pushSpinner = ora('Pushing to remote...').start()\n try {\n await git.push()\n pushSpinner.succeed(chalk.green(`Pushed ${ahead} commit(s)`))\n } catch (error) {\n pushSpinner.fail('Push failed')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n }\n } else {\n console.log(chalk.cyan(` ↑ ${ahead} commit(s) ahead`))\n }\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, findTemplate } 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 const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const template = findTemplate(repoRoot.trim(), 'stash')\n stashName = await generateStashName(fullDiff, { provider, model: options.model }, template || undefined)\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","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport ora from 'ora'\nimport { simpleGit } from 'simple-git'\nimport { generateWorkSummary, WorkSummary, findTemplate } from '../lib/ai.js'\nimport { Provider } from '../lib/credentials.js'\n\nexport const summaryCommand = new Command('summary')\n .description('Generate a work summary from your commits (for daily/weekly reports)')\n .option('-p, --provider <provider>', 'AI provider (gemini, openai, anthropic)', 'gemini')\n .option('-m, --model <model>', 'Model to use (provider-specific)')\n .option('--since <date>', 'Start date (default: today)', 'today')\n .option('--until <date>', 'End date')\n .option('--author <author>', 'Filter by author (default: current user)')\n .option('--daily', 'Generate daily report (alias for --since today)')\n .option('--weekly', 'Generate weekly report (alias for --since \"1 week ago\")')\n .option('--with-diff', 'Include diff analysis for more detail')\n .option('--markdown', 'Output as markdown')\n .option('--json', 'Output as JSON')\n .option('--copy', 'Copy to clipboard')\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 provider = options.provider.toLowerCase() as Provider\n const spinner = ora('Generating summary...').start()\n\n try {\n // Get current user if no author specified\n let author = options.author\n if (!author) {\n const config = await git.listConfig()\n author = config.all['user.name'] as string || ''\n if (!author) {\n spinner.fail('Could not determine git user. Use --author to specify.')\n process.exit(1)\n }\n }\n\n // Determine date range\n let since = options.since\n let format: 'daily' | 'weekly' | 'custom' = 'custom'\n\n if (options.daily) {\n since = 'today'\n format = 'daily'\n } else if (options.weekly) {\n since = '1 week ago'\n format = 'weekly'\n } else if (since === 'today') {\n format = 'daily'\n }\n\n // Convert relative dates to absolute for better compatibility\n const sinceDate = resolveDate(since)\n\n spinner.text = `Fetching commits by ${author} since ${since}...`\n\n // Build log options\n const logOptions: string[] = [`--author=${author}`, `--since=${sinceDate}`]\n if (options.until) {\n logOptions.push(`--until=${resolveDate(options.until)}`)\n }\n\n const log = await git.log(logOptions)\n\n if (log.all.length === 0) {\n spinner.info(`No commits found for ${author} since ${since}`)\n process.exit(0)\n }\n\n spinner.text = `Analyzing ${log.all.length} commits...`\n\n // Get diff if requested\n let diff: string | undefined\n if (options.withDiff && log.all.length > 0) {\n const oldest = log.all[log.all.length - 1].hash\n const newest = log.all[0].hash\n try {\n diff = await git.diff([`${oldest}^`, newest])\n } catch {\n // If oldest^ doesn't exist (first commit), skip diff\n }\n }\n\n const commits = log.all.map((c) => ({\n hash: c.hash,\n message: c.message,\n date: c.date\n }))\n\n const repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const template = findTemplate(repoRoot.trim(), 'summary')\n\n const summary = await generateWorkSummary(\n { commits, author, since, until: options.until, diff },\n { provider, model: options.model },\n format,\n template || undefined\n )\n\n spinner.stop()\n\n if (options.json) {\n console.log(JSON.stringify(summary, null, 2))\n return\n }\n\n const output = options.markdown ? formatMarkdown(summary, author, since, options.until) : null\n\n if (options.copy) {\n const textToCopy = output || formatMarkdown(summary, author, since, options.until)\n const { execSync } = await import('child_process')\n try {\n execSync('pbcopy', { input: textToCopy })\n console.log(chalk.green('Summary copied to clipboard!'))\n console.log()\n } catch {\n console.log(chalk.yellow('Could not copy to clipboard'))\n }\n }\n\n if (options.markdown) {\n console.log(output)\n } else {\n printSummary(summary, author, since, options.until)\n }\n } catch (error) {\n spinner.fail('Failed to generate summary')\n console.error(chalk.red(error instanceof Error ? error.message : 'Unknown error'))\n process.exit(1)\n }\n })\n\nfunction formatMarkdown(summary: WorkSummary, author: string, since: string, until?: string): string {\n const lines: string[] = []\n const period = until ? `${since} - ${until}` : `${since} - now`\n\n lines.push(`# ${summary.title}`)\n lines.push('')\n lines.push(`**Author:** ${author}`)\n lines.push(`**Period:** ${period}`)\n if (summary.stats) {\n lines.push(`**Commits:** ${summary.stats.commits}`)\n }\n lines.push('')\n lines.push('## Overview')\n lines.push(summary.overview)\n lines.push('')\n\n if (summary.highlights.length > 0) {\n lines.push('## Highlights')\n for (const highlight of summary.highlights) {\n lines.push(`- ${highlight}`)\n }\n lines.push('')\n }\n\n if (summary.details.length > 0) {\n lines.push('## Details')\n for (const section of summary.details) {\n lines.push(`### ${section.category}`)\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\nfunction resolveDate(dateStr: string): string {\n const now = new Date()\n\n if (dateStr === 'today') {\n return formatDate(now)\n } else if (dateStr === 'yesterday') {\n const d = new Date(now)\n d.setDate(d.getDate() - 1)\n return formatDate(d)\n } else if (dateStr.match(/^(\\d+)\\s+(day|days)\\s+ago$/i)) {\n const match = dateStr.match(/^(\\d+)\\s+(day|days)\\s+ago$/i)!\n const days = parseInt(match[1], 10)\n const d = new Date(now)\n d.setDate(d.getDate() - days)\n return formatDate(d)\n } else if (dateStr.match(/^(\\d+)\\s+(week|weeks)\\s+ago$/i)) {\n const match = dateStr.match(/^(\\d+)\\s+(week|weeks)\\s+ago$/i)!\n const weeks = parseInt(match[1], 10)\n const d = new Date(now)\n d.setDate(d.getDate() - weeks * 7)\n return formatDate(d)\n }\n\n // Return as-is if it's already a date string\n return dateStr\n}\n\nfunction formatDate(d: Date): string {\n const year = d.getFullYear()\n const month = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${year}-${month}-${day} 00:00:00`\n}\n\nfunction printSummary(summary: WorkSummary, author: string, since: string, until?: string) {\n const period = until ? `${since} - ${until}` : `${since} - now`\n\n console.log(chalk.bold(`\\n📊 ${summary.title}\\n`))\n console.log(chalk.gray(`Author: ${author}`))\n console.log(chalk.gray(`Period: ${period}`))\n if (summary.stats) {\n console.log(chalk.gray(`Commits: ${summary.stats.commits}`))\n }\n console.log()\n\n console.log(chalk.cyan('Overview:'))\n console.log(` ${summary.overview}`)\n console.log()\n\n if (summary.highlights.length > 0) {\n console.log(chalk.cyan('Highlights:'))\n for (const highlight of summary.highlights) {\n console.log(` ${chalk.green('★')} ${highlight}`)\n }\n console.log()\n }\n\n if (summary.details.length > 0) {\n console.log(chalk.cyan('Details:'))\n for (const section of summary.details) {\n console.log(` ${chalk.yellow(section.category)}`)\n for (const item of section.items) {\n console.log(` • ${item}`)\n }\n }\n console.log()\n }\n}\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport {\n getConfig,\n getGlobalConfig,\n getLocalConfig,\n setLanguage,\n isValidLanguage,\n VALID_LANGUAGES,\n type GutConfig\n} from '../lib/config.js'\n\nexport const configCommand = new Command('config')\n .description('Manage gut configuration')\n\nconfigCommand\n .command('set <key> <value>')\n .description('Set a configuration value')\n .option('--local', 'Set for current repository only')\n .action((key: string, value: string, options: { local?: boolean }) => {\n if (key === 'lang') {\n if (!isValidLanguage(value)) {\n console.error(chalk.red(`Invalid language: ${value}`))\n console.error(chalk.gray(`Valid languages: ${VALID_LANGUAGES.join(', ')}`))\n process.exit(1)\n }\n try {\n setLanguage(value, options.local ?? false)\n const scope = options.local ? '(local)' : '(global)'\n console.log(chalk.green(`✓ Language set to: ${value} ${scope}`))\n } catch (err) {\n console.error(chalk.red((err as Error).message))\n process.exit(1)\n }\n } else {\n console.error(chalk.red(`Unknown config key: ${key}`))\n console.error(chalk.gray('Available keys: lang'))\n process.exit(1)\n }\n })\n\nconfigCommand\n .command('get <key>')\n .description('Get a configuration value')\n .action((key: string) => {\n const config = getConfig()\n if (key in config) {\n console.log(config[key as keyof GutConfig])\n } else {\n console.error(chalk.red(`Unknown config key: ${key}`))\n process.exit(1)\n }\n })\n\nconfigCommand\n .command('list')\n .description('List all configuration values')\n .action(() => {\n const globalConfig = getGlobalConfig()\n const localConfig = getLocalConfig()\n const effectiveConfig = getConfig()\n\n console.log(chalk.bold('Configuration:'))\n console.log()\n\n for (const key of Object.keys(effectiveConfig) as (keyof GutConfig)[]) {\n const value = effectiveConfig[key]\n const isLocal = key in localConfig\n const scope = isLocal ? chalk.cyan(' (local)') : chalk.gray(' (global)')\n console.log(` ${chalk.cyan(key)}: ${value}${scope}`)\n }\n\n if (Object.keys(localConfig).length > 0) {\n console.log()\n console.log(chalk.gray('Local config: .gut/config.json'))\n }\n })\n","import { Command } from 'commander'\nimport chalk from 'chalk'\nimport {\n getLanguage,\n setLanguage,\n isValidLanguage,\n VALID_LANGUAGES,\n getLocalConfig\n} from '../lib/config.js'\n\nexport const langCommand = new Command('lang')\n .description('Set or show output language')\n .argument('[language]', `Language to set (${VALID_LANGUAGES.join(', ')})`)\n .option('--local', 'Set for current repository only')\n .action((language: string | undefined, options: { local?: boolean }) => {\n if (!language) {\n // Show current language\n const lang = getLanguage()\n const localConfig = getLocalConfig()\n const isLocal = 'lang' in localConfig\n const scope = isLocal ? chalk.cyan('(local)') : chalk.gray('(global)')\n console.log(`${lang} ${scope}`)\n return\n }\n\n if (!isValidLanguage(language)) {\n console.error(chalk.red(`Invalid language: ${language}`))\n console.error(chalk.gray(`Valid languages: ${VALID_LANGUAGES.join(', ')}`))\n process.exit(1)\n }\n\n try {\n setLanguage(language, options.local ?? false)\n const scope = options.local ? '(local)' : '(global)'\n console.log(chalk.green(`✓ Language set to: ${language} ${scope}`))\n } catch (err) {\n console.error(chalk.red((err as Error).message))\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 { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'fs'\nimport { join, dirname } from 'path'\nimport { fileURLToPath } from 'url'\nimport { generateText } from 'ai'\nimport { createGoogleGenerativeAI } from '@ai-sdk/google'\nimport { createOpenAI } from '@ai-sdk/openai'\nimport { createAnthropic } from '@ai-sdk/anthropic'\nimport { getApiKey, Provider } from '../lib/credentials.js'\nimport { getLanguage } from '../lib/config.js'\n\n// Get gut's root directory\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = dirname(__filename)\nconst GUT_ROOT = join(__dirname, '..')\n\nconst TEMPLATE_FILES = [\n 'branch.md',\n 'changelog.md',\n 'checkout.md',\n 'commit.md',\n 'explain.md',\n 'explain-file.md',\n 'find.md',\n 'merge.md',\n 'pr.md',\n 'review.md',\n 'stash.md',\n 'summary.md'\n]\n\nasync function translateTemplate(\n content: string,\n targetLang: string,\n provider: Provider\n): Promise<string> {\n const apiKey = await getApiKey(provider)\n if (!apiKey) {\n throw new Error(`No API key found for ${provider}`)\n }\n\n const modelName = provider === 'gemini' ? 'gemini-2.0-flash' :\n provider === 'openai' ? 'gpt-4o-mini' : 'claude-sonnet-4-20250514'\n\n let model\n switch (provider) {\n case 'gemini': {\n const google = createGoogleGenerativeAI({ apiKey })\n model = google(modelName)\n break\n }\n case 'openai': {\n const openai = createOpenAI({ apiKey })\n model = openai(modelName)\n break\n }\n case 'anthropic': {\n const anthropic = createAnthropic({ apiKey })\n model = anthropic(modelName)\n break\n }\n }\n\n const langNames: Record<string, string> = {\n ja: 'Japanese',\n en: 'English',\n zh: 'Chinese',\n ko: 'Korean',\n es: 'Spanish',\n fr: 'French',\n de: 'German'\n }\n\n const targetLangName = langNames[targetLang] || targetLang\n\n const { text } = await generateText({\n model,\n prompt: `Translate the following prompt template to ${targetLangName}.\nKeep all {{variable}} placeholders exactly as they are - do not translate them.\nKeep the markdown formatting intact.\nOnly translate the instructional text.\n\nTemplate to translate:\n${content}\n\nTranslated template:`\n })\n\n return text.trim()\n}\n\nexport const initCommand = new Command('init')\n .description('Initialize .gut/ templates in your project')\n .option('-p, --provider <provider>', 'AI provider for translation (gemini, openai, anthropic)', 'gemini')\n .option('-f, --force', 'Overwrite existing templates')\n .option('--no-translate', 'Skip translation even if language is not English')\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 repoRoot = await git.revparse(['--show-toplevel']).catch(() => process.cwd())\n const targetDir = join(repoRoot.trim(), '.gut')\n const sourceDir = join(GUT_ROOT, '.gut')\n\n // Create .gut directory if it doesn't exist\n if (!existsSync(targetDir)) {\n mkdirSync(targetDir, { recursive: true })\n console.log(chalk.green(`Created ${targetDir}`))\n }\n\n const lang = getLanguage()\n const needsTranslation = options.translate !== false && lang !== 'en'\n const provider = options.provider.toLowerCase() as Provider\n\n if (needsTranslation) {\n console.log(chalk.gray(`Language: ${lang} - templates will be translated\\n`))\n }\n\n const spinner = ora()\n let copied = 0\n let skipped = 0\n\n for (const filename of TEMPLATE_FILES) {\n const sourcePath = join(sourceDir, filename)\n const targetPath = join(targetDir, filename)\n\n if (!existsSync(sourcePath)) {\n continue\n }\n\n if (existsSync(targetPath) && !options.force) {\n console.log(chalk.gray(` Skipped: ${filename} (already exists)`))\n skipped++\n continue\n }\n\n let content = readFileSync(sourcePath, 'utf-8')\n\n if (needsTranslation) {\n spinner.start(`Translating ${filename}...`)\n try {\n content = await translateTemplate(content, lang, provider)\n spinner.succeed(`Translated: ${filename}`)\n } catch (error) {\n spinner.fail(`Failed to translate ${filename}`)\n console.error(chalk.red(` ${error instanceof Error ? error.message : 'Unknown error'}`))\n // Fall back to original content\n console.log(chalk.gray(` Using original English template`))\n }\n } else {\n console.log(chalk.green(` Copied: ${filename}`))\n }\n\n writeFileSync(targetPath, content)\n copied++\n }\n\n console.log()\n if (copied > 0) {\n console.log(chalk.green(`✓ ${copied} template(s) initialized in .gut/`))\n }\n if (skipped > 0) {\n console.log(chalk.gray(` ${skipped} template(s) skipped (use --force to overwrite)`))\n }\n\n console.log(chalk.gray('\\nYou can now customize these templates for your project.'))\n })\n"],"mappings":"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","names":["Command","Command","chalk","chalk","Command","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","path","join","existsSync","readFileSync","prompt","result","Command","simpleGit","chalk","ora","execSync","fs","path","Command","chalk","ora","simpleGit","existsSync","readFileSync","join","execSync","execSync","chalk","join","existsSync","readFileSync","Command","simpleGit","chalk","ora","execSync","Command","chalk","ora","simpleGit","execSync","execSync","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","execSync","existsSync","readFileSync","Command","simpleGit","chalk","ora","existsSync","readFileSync","execSync","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","execSync","execSync","Command","simpleGit","chalk","spinner","ora","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","Command","chalk","ora","simpleGit","Command","simpleGit","chalk","ora","execSync","Command","chalk","Command","chalk","Command","chalk","Command","chalk","Command","chalk","ora","simpleGit","existsSync","mkdirSync","readFileSync","writeFileSync","join","dirname","fileURLToPath","generateText","createGoogleGenerativeAI","createOpenAI","createAnthropic","__filename","fileURLToPath","__dirname","dirname","GUT_ROOT","join","createGoogleGenerativeAI","createOpenAI","createAnthropic","generateText","Command","simpleGit","chalk","existsSync","mkdirSync","ora","readFileSync","writeFileSync","Command"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gut-cli",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "Git Utility Tool - AI-powered git commands for smarter workflows",
5
5
  "type": "module",
6
6
  "bin": {