Files
git-agent-sync/src/commands/status.ts
7000pctAUTO abdbdc6bea
Some checks failed
/ test (push) Has been cancelled
feat: add status command
2026-02-03 09:04:23 +00:00

56 lines
3.0 KiB
TypeScript

import * as path from 'path';
import { Command } from 'commander';
import chalk from 'chalk';
import { getWorkspacePath, loadWorkspaceConfig, sanitizeAgentName } from '../utils/file-utils';
import { getWorktreeStatus, createGit, getCurrentBranch } from '../utils/git-utils';
import { formatChangesForReview, generateShortDiffSummary } from '../utils/diff-utils';
import { DiffResult } from '../types/index';
import { GitAgentSyncError, WorkspaceNotFoundError } from '../utils/errors';
export function createStatusCommand(): Command {
const cmd = new Command('status').alias('st').description('Show detailed changes for a specific agent workspace').argument('[agent-name]', 'Agent name').option('--short', 'Show short summary only').option('--output <file>', 'Export to file').action(async (agentName, options) => {
try {
const currentPath = process.cwd();
let workspacePath: string;
if (agentName) {
workspacePath = getWorkspacePath(currentPath, sanitizeAgentName(agentName));
} else {
workspacePath = await detectCurrentWorkspace(currentPath);
}
const config = await loadWorkspaceConfig(workspacePath);
if (!config) throw new WorkspaceNotFoundError(agentName || 'current');
const status = await getWorktreeStatus(workspacePath);
if (options.short) {
const diffResult: DiffResult = { agentName: config.agentName, branch: status.branch, comparedBranch: '', files: [], summary: { filesChanged: status.changes.length, additions: 0, deletions: 0 } };
console.log(chalk.white(`${config.agentName}: ${generateShortDiffSummary(diffResult)}`));
return;
}
console.log(chalk.cyan(`\n📊 Agent: ${config.agentName}`));
console.log(chalk.gray('─'.repeat(60)));
console.log(` Branch: ${chalk.white(status.branch)}`);
console.log(` Changes: ${chalk.white(status.uncommittedCount.toString())}`);
if (status.changes.length === 0) console.log(chalk.yellow('\n No changes detected.'));
else {
console.log(chalk.cyan('\n📝 Changed Files:'));
for (const change of status.changes) {
const statusIcon = change.status === 'added' ? chalk.green('✚') : change.status === 'modified' ? chalk.yellow('✎') : change.status === 'deleted' ? chalk.red('✖') : chalk.cyan('↔');
console.log(` ${statusIcon} ${chalk.white(change.file)}`);
}
}
} catch (error) {
const gitError = error instanceof GitAgentSyncError ? error : new GitAgentSyncError(String(error));
console.error(chalk.red(`\n❌ Error: ${gitError.message}`));
process.exit(1);
}
});
return cmd;
}
async function detectCurrentWorkspace(currentPath: string): Promise<string> {
const git = createGit(currentPath);
const branch = await getCurrentBranch(git);
if (branch.startsWith('agent-')) {
const agentName = branch.replace(/^agent-/, '');
return getWorkspacePath(currentPath, agentName);
}
throw new GitAgentSyncError('Not in an agent workspace. Please specify an agent name.');
}