Component Overview
Work-Wiki provides three complementary visualization components, each operating at a different granularity:Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β THREE VISUALIZATION COMPONENTS β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β COMPONENT 1: GitBlameViewer β
β Granularity: LINE-LEVEL β
β View: Who wrote each line? β
β AI Extension: AI attribution per commit line β
β β
β COMPONENT 2: GitDiffViewer β
β Granularity: HUNK-LEVEL β
β View: What changed in each hunk? β
β AI Extension: AI attribution per diff hunk β
β β
β COMPONENT 3: GitBranchDiagramViewer β
β Granularity: COMMIT-LEVEL β
β View: Branch history with micro-saves β
β AI Extension: Micro-save badges + Draft nodes β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GitBlameViewer: Line-Level Attribution
Architecture
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β GITBLAMEVIEWER ARCHITECTURE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Key Methods: β
β βββ loadData() - Fetch blame + AI attribution β
β βββ render() - Render blame table β
β βββ fetchWorkWikiAttributions() - Load AI data async β
β βββ getIndicatorColor() - 4-tier color mapping β
β βββ renderLine() - Render individual line β
β β
β Data Flow: β
β β
β βββββββββββββββ invoke() βββββββββββββββββββ β
β β loadData() ββββββββββββββββββΆβ git_blame β β
β ββββββββ¬βββββββ β (Tauri cmd) β β
β β ββββββββββ¬βββββββββ β
β β Phase 1 β β
β βΌ β β
β βββββββββββββββ β β
β β render() ββββββββββββββββββββββββββββ β
β ββββββββ¬βββββββ β
β β β
β β Phase 2 (async) β
β βΌ β
β βββββββββββββββββββββββββββββββ invoke() βββββββββββββββββββββββββββ β
β β fetchWorkWikiAttributions() ββββββββββββββββββΆβ work_wiki_get_ai_ β β
β ββββββββββββββββ¬βββββββββββββββ β attributions_batch β β
β β ββββββββββββββ¬βββββββββββββ β
β β β β
β βΌ β β
β βββββββββββββββ β β
β β render() ββββββββββββββββββββββββββββββββββββββββββββββββ β
β β (with AI) β β
β βββββββββββββββ β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Two-Phase Data Loading
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β TWO-PHASE DATA LOADING β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β PHASE 1: Immediate (Core Blame Data) β
β β
β async loadData() { β
β // 1. Fetch core blame data from git β
β this.data = await invoke('git_blame', { β
β filePath: this.filePath, β
β repoPath: this.repoPath β
β }); β
β β
β // 2. Render IMMEDIATELY (user sees data fast) β
β this.render(); // <-- Phase 1 complete β
β } β
β β
β β t=50ms β
β βΌ β
β β
β PHASE 2: Deferred (AI Attribution) β
β β
β // Non-blocking: fetch AI attributions and re-render β
β this.fetchWorkWikiAttributions( β
β this.data.commits.map(c => c.hash) β
β ).then(() => { β
β this.render(); // <-- Phase 2 re-render with AI data β
β }); β
β β
β β t=150ms β
β βΌ β
β β
β Timeline: β
β t=0ms loadData() called β
β t=50ms git_blame returns, Phase 1 render β
β t=50ms fetchWorkWikiAttributions() starts (async) β
β t=150ms AI data arrives, Phase 2 re-render β
β β
β User Experience: β
β - Blame data visible in 50ms β
β - AI indicators appear 100ms later β
β - No blocking, no spinner for AI data β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Agent Tooltip Display
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β AGENT TOOLTIP DISPLAY β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Visual Example: β
β β
β βββββββ¬βββββββββββββ¬βββββββββ¬ββββββββββββββββββββββββββββββββββββ β
β β AI% β Author β Time β Line Content β β
β βββββββΌβββββββββββββΌβββββββββΌββββββββββββββββββββββββββββββββββββ€ β
β β β β abc1234 β 2h ago β export function authenticate() { β β
β βββββββ΄βββββββββββββ΄βββββββββ΄ββββββββββββββββββββββββββββββββββββ β
β β β
β βββ Hover shows: "AI: 67% (Claude, Gemini)" β
β β
β Implementation: β
β title="AI: ${aiPct}%${agentNames ? ' (' + agentNames + ')' : ''}" β
β β
β Example Values: β
β aiPct = 67 β
β agentNames = "Claude, Gemini" β
β Result: "AI: 67% (Claude, Gemini)" β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GitDiffViewer: Hunk-Level Attribution
hunkMeta Coordinate System
The GitDiffViewer introduces a novel coordinate system for hunk attribution:Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β HUNKMETA COORDINATE SYSTEM β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β Problem: How to uniquely identify a hunk for AI attribution lookup? β
β β
β Diff lines have no inherent identity: β
β - Multiple files may have same line content β
β - Line numbers change between versions β
β - Hunk headers alone aren't unique across files β
β β
β Solution: hunkMeta = { filePath, hunkIndex } β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β File: src/auth.ts β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β β β
β β diff --git a/src/auth.ts b/src/auth.ts β β
β β @@ -1,5 +1,8 @@ β β
β β hunkMeta = { filePath: "src/auth.ts", hunkIndex: 0 } β β
β β +import { validateToken } from './auth'; β β
β β +import { refreshToken } from './refresh'; β β
β β function authenticate() { β β
β β @@ -20,3 +23,5 @@ β β
β β hunkMeta = { filePath: "src/auth.ts", hunkIndex: 1 } β β
β β + const token = getToken(); β β
β β + validateToken(token); β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β File: src/api.ts β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β β β
β β diff --git a/src/api.ts b/src/api.ts β β
β β @@ -1,3 +1,4 @@ β β
β β hunkMeta = { filePath: "src/api.ts", hunkIndex: 0 } β β
β β +import { fetchData } from './fetch'; β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Cache Key Format: "${filePath}:${hunkIndex}" β
β β
β Examples: β
β βββ "src/auth.ts:0" --> First hunk in auth.ts β
β βββ "src/auth.ts:1" --> Second hunk in auth.ts β
β βββ "src/api.ts:0" --> First hunk in api.ts β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
GitBranchDiagramViewer: Commit-Level
Micro-Save Badge
Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β MICRO-SAVE BADGE ANATOMY β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β SVG Structure: β
β β
β <g class="micro-save-badge" transform="translate(x, y-7)"> β
β βββ <rect> Pill-shaped background (rounded corners) β
β β Semi-transparent fill with colored border β
β β β
β βββ <text> Count display β
β β Centered with text-anchor="middle" β
β β Capped at "99+" for very high counts β
β β β
β βββ <title> Native SVG tooltip β
β "Work-Wiki: N micro-save(s) before this commit" β
β β
β Width Calculation: β
β 1-9 --> 18px (single digit) β
β 10-99 --> 22px (double digit) β
β 100+ --> 28px (shows "99+") β
β β
β Visual Examples: β
β [2] <-- gray (1-3 saves, subtle) β
β [7] <-- green (4-10 saves, normal) β
β [18] <-- yellow (11-25 saves, complex) β
β [42] <-- accent (25+ saves, major) β
β [99+] <-- accent (100+ saves, capped) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Draft Branch Node
The Draft Node represents uncommitted work - the βfutureβ of the codebase:Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β DRAFT NODE VISUAL STRUCTURE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β βββββββββββββββ βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β β β
β β β β β .draft-node-info β β
β β β β βββββββββββββββββββββββββββββββββββββββββββββ β β
β β (half-moon) β β β β β β
β β β β β DRAFT β β β
β βββββββββββββββ β β .draft-node-title β β β
β .draft-node-icon β β β β β
β β β 3 files | +145 -23 β β β
β β β .draft-node-stats β β β
β β β β β β
β β β [AI] 8 [H] 4 β β β
β β β .draft-node-attribution β β β
β β β β β β
β β βββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β .draft-node-connector β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β : β β
β β : (dashed line connecting to HEAD) β β
β β : β β
β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β Half-Moon Icon Meaning: β
β βββ Full circle = Complete (committed) β
β βββ Half circle = In progress (uncommitted) β
β βββ Empty circle = Planned (future) β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Cross-Component Patterns
Consistent 4-Tier Color System
All three viewers implement the same color thresholds:Copy
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 4-TIER COLOR SYSTEM COMPARISON β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β GitBlameViewer & GitDiffViewer (AI Percentage): β
β 0-25% AI --> green β
β 26-50% AI --> yellow β
β 51-75% AI --> accent β
β 76-100% AI --> purple β
β β
β GitBranchDiagramViewer (Micro-Save Count): β
β 1-3 saves --> gray β
β 4-10 saves --> green β
β 11-25 saves --> yellow β
β 25+ saves --> accent β
β β
β Note: Different thresholds for count vs percentage, β
β but same color vocabulary! β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Map-Based O(1) Caching
All three viewers use the same caching pattern:| Viewer | Cache Property | Key Format |
|---|---|---|
| GitBlameViewer | aiAttributionCache | commit_hash |
| GitDiffViewer | hunkAttributions | filePath:hunkIndex |
| GitBranchDiagramViewer | commitWorkCounts | commit_hash |
Two-Phase Rendering
All three viewers implement the same pattern:Copy
async loadData() {
// Phase 1: Core data (immediate)
this.data = await invoke('core_command', ...);
this.render(); // User sees data immediately
// Phase 2: AI attribution (deferred)
this.fetchWorkWikiData(...).then(() => {
this.render(); // Re-render with AI data
});
}
Component Comparison
| Aspect | GitBlameViewer | GitDiffViewer | GitBranchDiagramViewer |
|---|---|---|---|
| Granularity | Line | Hunk | Commit |
| Cache Key | commit_hash | filePath:hunkIndex | commit_hash |
| Primary Visual | AI % indicator | Hunk AI badge | Micro-save badge |
| Novel Feature | Agent tooltip | hunkMeta coordinate | Draft node (half-moon) |
| Default AI Display | Enabled | Enabled | Draft: Enabled |
THE CENTER
Key Findings
- All viewers use two-phase rendering - Non-blocking UX
- Consistent 4-tier color vocabulary - Unified visual language
- Map-based O(1) caching everywhere - Performance
- hunkMeta is a novel coordinate system - Unique contribution
- Draft node uses half-moon icon - Intuitive βin progressβ
- Agent names in tooltip - Native browser tooltip