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)
20 lines
563 B
TypeScript
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>
|
|
);
|
|
};
|