84 lines
2.4 KiB
TypeScript
84 lines
2.4 KiB
TypeScript
/**
|
|
* Auto-commit and push for clone tasks
|
|
*
|
|
* After a successful workflow completion in a shared clone,
|
|
* automatically stages all changes, creates a commit, and
|
|
* pushes to origin so the branch is reflected in the main repo.
|
|
* No co-author trailer is added.
|
|
*/
|
|
|
|
import { execFileSync } from 'node:child_process';
|
|
import { createLogger } from '../utils/debug.js';
|
|
import { getErrorMessage } from '../utils/error.js';
|
|
import { stageAndCommit } from './git.js';
|
|
|
|
const log = createLogger('autoCommit');
|
|
|
|
export interface AutoCommitResult {
|
|
/** Whether the commit was created successfully */
|
|
success: boolean;
|
|
/** The short commit hash (if committed) */
|
|
commitHash?: string;
|
|
/** Human-readable message */
|
|
message: string;
|
|
}
|
|
|
|
/**
|
|
* Handles auto-commit and push operations for clone tasks.
|
|
*/
|
|
export class AutoCommitter {
|
|
/**
|
|
* Auto-commit all changes and push to the main project.
|
|
*
|
|
* Steps:
|
|
* 1. Stage all changes (git add -A)
|
|
* 2. Check if there are staged changes
|
|
* 3. If changes exist, create a commit with "takt: {taskName}"
|
|
* 4. Push to the main project directory
|
|
*/
|
|
commitAndPush(cloneCwd: string, taskName: string, projectDir: string): AutoCommitResult {
|
|
log.info('Auto-commit starting', { cwd: cloneCwd, taskName });
|
|
|
|
try {
|
|
const commitMessage = `takt: ${taskName}`;
|
|
const commitHash = stageAndCommit(cloneCwd, commitMessage);
|
|
|
|
if (!commitHash) {
|
|
log.info('No changes to commit');
|
|
return { success: true, message: 'No changes to commit' };
|
|
}
|
|
|
|
log.info('Auto-commit created', { commitHash, message: commitMessage });
|
|
|
|
execFileSync('git', ['push', projectDir, 'HEAD'], {
|
|
cwd: cloneCwd,
|
|
stdio: 'pipe',
|
|
});
|
|
|
|
log.info('Pushed to main repo', { projectDir });
|
|
|
|
return {
|
|
success: true,
|
|
commitHash,
|
|
message: `Committed & pushed: ${commitHash} - ${commitMessage}`,
|
|
};
|
|
} catch (err) {
|
|
const errorMessage = getErrorMessage(err);
|
|
log.error('Auto-commit failed', { error: errorMessage });
|
|
|
|
return {
|
|
success: false,
|
|
message: `Auto-commit failed: ${errorMessage}`,
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
// ---- Backward-compatible module-level function ----
|
|
|
|
const defaultCommitter = new AutoCommitter();
|
|
|
|
export function autoCommitAndPush(cloneCwd: string, taskName: string, projectDir: string): AutoCommitResult {
|
|
return defaultCommitter.commitAndPush(cloneCwd, taskName, projectDir);
|
|
}
|