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 ', '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 { 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.'); }