GitNexus/gitnexus/src/cli/detect-changes-format.ts

86 lines
2.5 KiB
TypeScript

import { t } from './i18n/index.js';
type DetectChangesSummary = {
changed_files?: number;
changed_count?: number;
affected_count?: number;
risk_level?: string;
};
type ChangedSymbol = {
type?: string;
name?: string;
filePath?: string;
};
type ChangedStep = {
symbol?: string;
};
type AffectedProcess = {
name?: string;
step_count?: number;
changed_steps?: ChangedStep[];
};
type DetectChangesResult = {
error?: unknown;
summary?: DetectChangesSummary;
changed_symbols?: ChangedSymbol[];
affected_processes?: AffectedProcess[];
};
export function formatDetectChangesResult(result: unknown): string {
const payload = (result ?? {}) as DetectChangesResult;
if (payload.error) return t('common.error', { message: String(payload.error) });
const summary = payload.summary ?? {};
if ((summary.changed_count ?? 0) === 0) {
return t('tool.detectChanges.noChanges');
}
const lines: string[] = [];
lines.push(
t('tool.detectChanges.changesSummary', {
files: summary.changed_files ?? 0,
symbols: summary.changed_count ?? 0,
}),
);
lines.push(t('tool.detectChanges.affectedProcesses', { count: summary.affected_count ?? 0 }));
lines.push(
t('tool.detectChanges.riskLevel', {
risk: summary.risk_level || t('tool.detectChanges.unknownRisk'),
}),
);
lines.push('');
const changed = Array.isArray(payload.changed_symbols) ? payload.changed_symbols : [];
if (changed.length > 0) {
lines.push(t('tool.detectChanges.changedSymbols'));
for (const symbol of changed.slice(0, 15)) {
lines.push(` ${symbol.type ?? 'Symbol'} ${symbol.name ?? '?'} → ${symbol.filePath ?? '?'}`);
}
if (changed.length > 15) {
lines.push(t('tool.detectChanges.overflowMore', { count: changed.length - 15 }));
}
lines.push('');
}
const affected = Array.isArray(payload.affected_processes) ? payload.affected_processes : [];
if (affected.length > 0) {
lines.push(t('tool.detectChanges.affectedExecutionFlows'));
for (const processInfo of affected.slice(0, 10)) {
const changedSteps = Array.isArray(processInfo.changed_steps)
? processInfo.changed_steps
: [];
const steps = changedSteps.map((step) => step.symbol ?? '?').join(', ');
lines.push(
` • ${processInfo.name ?? '?'} (${t('tool.detectChanges.steps', {
count: processInfo.step_count ?? 0,
})}) — ${t('tool.detectChanges.changedSteps', { steps })}`,
);
}
}
return lines.join('\n').trim();
}