agent-ecosystem/src/renderer/components/team/review/ChangeStatsBadge.tsx
iliya 190cafdb8e feat: implement diff view with 4 phases — review, accept/reject, task scoping, enhanced UX
Phase 1: Core diff extraction and display
- ChangeExtractorService: JSONL streaming parser with snippet extraction
- FileContentResolver: 3-level content resolution (file-history → snippets → disk)
- ReviewApplierService: hunk-level accept/reject with conflict detection
- CodeMirrorDiffView: unified merge view with syntax highlighting
- ReviewFileTree: file browser with status indicators
- changeReviewSlice: Zustand state for review workflow

Phase 2: Interactive review with accept/reject
- Per-hunk and per-file accept/reject decisions
- Conflict checking before apply
- ReviewToolbar with bulk actions
- DiffErrorBoundary for graceful degradation

Phase 3: Per-task change scoping
- TaskBoundaryParser: detects task boundaries in JSONL (Tier 1-4 confidence)
- TaskChangeSetV2 with scope + warnings
- ConfidenceBadge and ScopeWarningBanner components

Phase 4: Enhanced features
- Keyboard navigation (j/k/n/p/a/x shortcuts via useDiffNavigation)
- Viewed file tracking (localStorage + useViewedFiles hook)
- File edit timeline (chronological events per file)
- Git fallback (GitDiffFallback service for incomplete JSONL data)
- Auto-viewed detection (IntersectionObserver sentinel)
2026-02-24 23:39:41 +02:00

20 lines
563 B
TypeScript

interface ChangeStatsBadgeProps {
linesAdded: number;
linesRemoved: number;
className?: string;
}
export const ChangeStatsBadge = ({
linesAdded,
linesRemoved,
className = '',
}: ChangeStatsBadgeProps) => {
if (linesAdded === 0 && linesRemoved === 0) return null;
return (
<span className={`inline-flex items-center gap-1 font-mono text-[11px] ${className}`}>
{linesAdded > 0 && <span className="text-green-400">+{linesAdded}</span>}
{linesRemoved > 0 && <span className="text-red-400">-{linesRemoved}</span>}
</span>
);
};