relaycode
Version:
A developer assistant that automates applying code changes from LLMs.
1 lines • 8.47 kB
Source Map (JSON)
{"version":3,"sources":["../../src/commands/git-commit.ts"],"names":["gitCommitCommand","options","cwd","prompter","getConfirmation","createConfirmationHandler","logger","executeShellCommand","lastCommitTimeResult","lastCommitTimestamp","newTransactions","readAllStateFiles","tx","isNewerThanLastCommit","hasNotBeenGitCommitted","a","b","commitMessages","normalizeGitCommitMsg","msg","mergedCommitMessage","formatTransactionDetails","line","commitMessagePreview","chalk","addResult","commitCmd","commitResult","transactionUuids","markTransactionsAsGitCommitted"],"mappings":"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","file":"git-commit.cjs","sourcesContent":["import { readAllStateFiles, markTransactionsAsGitCommitted } from '../core/state';\nimport { logger } from '../utils/logger';\nimport { executeShellCommand } from '../utils/shell';\nimport { createConfirmationHandler, type Prompter } from '../utils/prompt';\nimport { formatTransactionDetails } from '../utils/formatters';\nimport { normalizeGitCommitMsg } from 'relaycode-core';\nimport chalk from 'chalk';\n\nexport const gitCommitCommand = async (options: { yes?: boolean } = {}, cwd: string = process.cwd(), prompter?: Prompter): Promise<void> => {\n const getConfirmation = createConfirmationHandler(options, prompter);\n\n logger.info('Looking for new transactions to commit...');\n\n // 1. Check if it's a git repository\n const gitCheck = await executeShellCommand('git rev-parse --is-inside-work-tree', cwd);\n if (gitCheck.exitCode !== 0) {\n logger.error('This does not appear to be a git repository. Aborting commit.');\n return;\n }\n\n // 2. Get the timestamp of the last commit\n const lastCommitTimeResult = await executeShellCommand('git log -1 --format=%ct', cwd);\n const lastCommitTimestamp = lastCommitTimeResult.exitCode === 0 ? parseInt(lastCommitTimeResult.stdout, 10) * 1000 : 0;\n \n // 3. Find all transactions newer than the last commit that haven't been git-committed yet\n const allTransactions = await readAllStateFiles(cwd) ?? [];\n const newTransactions = allTransactions\n .filter(tx => {\n // Only include transactions that:\n // 1. Are newer than the last git commit, OR\n // 2. Have never been git-committed (for new repos with no commits)\n const isNewerThanLastCommit = new Date(tx.createdAt).getTime() > lastCommitTimestamp;\n const hasNotBeenGitCommitted = !(tx as any).gitCommittedAt;\n return (isNewerThanLastCommit || lastCommitTimestamp === 0) && hasNotBeenGitCommitted;\n })\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()); // Sort oldest to newest\n\n if (newTransactions.length === 0) {\n logger.info('No new transactions to commit since the last git commit.');\n return;\n }\n\n const commitMessages = newTransactions.map(tx => normalizeGitCommitMsg(tx.gitCommitMsg)).filter((msg): msg is string => !!msg);\n\n if (commitMessages.length === 0) {\n logger.warn('No new transactions with git commit messages found.');\n return;\n }\n\n // 4. Merge commit messages with proper spacing\n const mergedCommitMessage = commitMessages\n .map(msg => msg.trim()) // Clean up whitespace\n .filter(msg => msg.length > 0) // Remove empty messages\n .join('\\n\\n');\n\n logger.log('Found new transactions to commit:');\n newTransactions.forEach(tx => {\n formatTransactionDetails(tx).forEach(line => logger.log(line));\n });\n\n const commitMessagePreview = mergedCommitMessage.split('\\n').map(line => ` ${line}`).join('\\n');\n const confirmed = await getConfirmation(`\\nDo you want to run 'git add .' and commit with the following message?\\n\\n${chalk.yellow(commitMessagePreview)}\\n\\n(y/N)`);\n\n if (!confirmed) {\n logger.info('Commit operation cancelled.');\n return;\n }\n\n // 5. Execute git commands\n logger.info(`Running ${chalk.magenta(\"'git add .'\")}...`);\n const addResult = await executeShellCommand('git add .', cwd);\n if (addResult.exitCode !== 0) {\n logger.error(`${chalk.magenta(\"'git add .'\")} failed with exit code ${chalk.red(addResult.exitCode)}.`);\n logger.error(addResult.stderr);\n return;\n }\n logger.success(`${chalk.magenta(\"'git add .'\")} completed successfully.`);\n\n // Use git commit with multiple -m flags to avoid shell escaping issues\n const commitCmd = `git commit${mergedCommitMessage.split('\\n\\n').map(msg => ` -m \"${msg.replace(/\"/g, '\\\\\"')}\"`).join('')}`;\n logger.info(`Running commit command...`);\n const commitResult = await executeShellCommand(commitCmd, cwd);\n\n if (commitResult.exitCode !== 0) {\n logger.error(`${chalk.magenta(\"'git commit'\")} failed with exit code ${chalk.red(commitResult.exitCode)}.`);\n logger.error(commitResult.stderr);\n if (commitResult.stdout) logger.log(commitResult.stdout);\n logger.warn('You may need to resolve commit issues manually.');\n return;\n }\n \n // 6. Mark transactions as git-committed\n const transactionUuids = newTransactions.map(tx => tx.uuid);\n await markTransactionsAsGitCommitted(cwd, transactionUuids);\n \n logger.success('✅ Git commit successful!');\n logger.log(commitResult.stdout);\n};"]}