feat(dashboard): Add dedicated tabs for Tasks, Quality Gates, and Metrics - #169
Conversation
…rics Refactor Dashboard to reduce Overview tab clutter by creating focused tabs: - Tasks tab: Task Statistics, Issues & Tasks, Blockers, Review panels, Lint Trend - Quality Gates tab: Quality Gates panel with ErrorBoundary - Metrics tab: Cost Dashboard Tab order follows natural workflow: Overview → Tasks → Quality Gates → Checkpoints → Metrics → Context Benefits: - Overview reduced from ~15 panels to 7 panels - Lazy loading improves performance (only active tab renders) - Better UX with focused views per feature area - Maintains all existing data-testid attributes for E2E compatibility Updated 4 tests to navigate to appropriate tabs before testing panel content.
WalkthroughRefactors Dashboard into a tabbed interface (Overview, Tasks, Quality Gates, Metrics, Context, Checkpoints); moves Task Statistics and Issues into Tasks; adds Recent Activity and Metrics panels; wraps Quality Gates with an ErrorBoundary and fallback; updates types and tests to click tabs before asserting tab-specific content. Changes
Sequence DiagramsequenceDiagram
autonumber
actor User
participant TabNav as Tab Navigation
participant Dashboard
participant Panel as Active Panel
participant EB as ErrorBoundary
User->>TabNav: Click tab (e.g., "tasks" / "quality-gates" / "metrics")
TabNav->>Dashboard: setActiveTab(tab)
Dashboard->>Panel: determine & mount active panel
alt tab == "quality-gates"
Dashboard->>EB: mount QualityGatesPanel
EB->>Panel: render Quality Gates UI
Note right of EB `#dfeffd`: Fallback offers Retry / Dismiss
else tab == "tasks"
Dashboard->>Panel: render TasksPanel (Stats, Issues, Blockers, Recent Activity, etc.)
else tab == "metrics"
Dashboard->>Panel: render MetricsPanel (CostDashboard)
end
Panel->>User: visible updated panel content
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related issues
Possibly related PRs
Poem
Pre-merge checks and finishing touches✅ Passed checks (3 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Comment |
Code Review - PR #169: Dashboard Tab RefactorSummaryThis PR successfully refactors the Dashboard to reduce cognitive load by splitting content across focused tabs. The implementation is clean, well-tested, and follows the project's architectural patterns. ✅ Strengths
🔍 Issues & Recommendations1. Accessibility Concern - Tab NavigationThe tab navigation implementation looks good, but consider adding keyboard navigation support: // Add to tab buttons:
onKeyDown={(e) => {
if (e.key === 'ArrowRight') {
// Move to next tab
} else if (e.key === 'ArrowLeft') {
// Move to previous tab
}
}}Severity: Low - Current implementation is functional but could be more accessible 2. Potential Bug - Quality Gates Panel VisibilityIn the Quality Gates tab (web-ui/src/components/Dashboard.tsx:589-619), the panel checks
Recommendation: Consider either:
Severity: Medium - Could confuse users 3. Missing Test CoverageThe PR mentions manual verification needed but doesn't include E2E tests for:
Recommendation: Add E2E tests (using TestSprite/Playwright per docs/e2e-testing.md) for: // Example test scenario
test('should preserve panel state when switching tabs', async () => {
// Navigate to Tasks tab, interact with panel
// Switch to Metrics tab
// Return to Tasks tab
// Verify state is preserved
});Severity: Low - Manual testing may suffice for MVP, but E2E would provide confidence 4. Performance Consideration - useMemo for Tab ContentWhile lazy loading helps, the tab panels could benefit from memoization to prevent unnecessary re-renders: const tasksTabContent = useMemo(() => (
activeTab === 'tasks' && (
<div role="tabpanel" ...>
{/* Tab content */}
</div>
)
), [activeTab, /* other dependencies */]);Severity: Low - Not critical for current scale, but good optimization as complexity grows 5. Documentation Update NeededThe component JSDoc comment (web-ui/src/components/Dashboard.tsx:42-49) still references "Overview and Context tabs" but should be updated to reflect all 6 tabs. Severity: Low - Documentation accuracy 🔒 SecurityNo security concerns identified. The refactor is purely UI reorganization with no new data handling or API interactions. 🎯 Performance
📋 Test Plan ChecklistFrom PR description:
🎨 Code StyleFollows project conventions from CLAUDE.md:
Final VerdictApprove with minor recommendations This is a solid refactoring that meaningfully improves UX without introducing breaking changes. The identified issues are minor and can be addressed in follow-up PRs if desired. The lazy loading and logical tab organization are well-executed. Recommendations Priority:
Great work on maintaining test coverage and backward compatibility! 🎉 |
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (2)
web-ui/src/components/Dashboard.tsx (1)
74-82: Consider removing unused memoized variables.
_activeAgentsand_idleAgentsare computed withuseMemobut appear to be unused in the component (prefixed with_suggests they may be intentionally unused or deprecated). If these are no longer needed after the refactor, consider removing them to reduce unnecessary computation.#!/bin/bash # Verify if _activeAgents and _idleAgents are used anywhere in this file rg -n '_activeAgents|_idleAgents' web-ui/src/components/Dashboard.tsxweb-ui/__tests__/components/Dashboard.test.tsx (1)
1065-1079: Consider adding an actual debounce test.The debounce test currently only contains a comment about manual testing. While testing debounce timing in Jest can be tricky, you could use
jest.useFakeTimers()to verify the debounce behavior:🔎 Example approach for debounce testing
it('should debounce retry button clicks', async () => { jest.useFakeTimers(); // ... render and trigger error state to show fallback ... const retryButton = screen.getByRole('button', { name: /retry/i }); // Click rapidly fireEvent.click(retryButton); fireEvent.click(retryButton); fireEvent.click(retryButton); // Advance timers past debounce window jest.advanceTimersByTime(600); // Verify only one re-mount occurred (check via key change or render count) jest.useRealTimers(); });
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
web-ui/__tests__/components/Dashboard.test.tsxweb-ui/src/components/Dashboard.tsxweb-ui/src/types/dashboard.ts
🧰 Additional context used
📓 Path-based instructions (8)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Use TypeScript 5.3+ with strict mode for frontend development
Files:
web-ui/__tests__/components/Dashboard.test.tsxweb-ui/src/types/dashboard.tsweb-ui/src/components/Dashboard.tsx
web-ui/**/*.{css,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Use Tailwind CSS with Nova design system template for styling
Files:
web-ui/__tests__/components/Dashboard.test.tsxweb-ui/src/components/Dashboard.tsx
web-ui/{__tests__,tests}/**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Use npm test for frontend component testing in web-ui
Files:
web-ui/__tests__/components/Dashboard.test.tsx
web-ui/src/**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
web-ui/src/**/*.{ts,tsx}: Use React 18 with TypeScript and Context + useReducer pattern for state management
Use shadcn/ui components from @/components/ui/ directory
Use Hugeicons (@hugeicons/react) for all icons instead of lucide-react
Implement WebSocket automatic reconnection with exponential backoff (1s → 30s)
Files:
web-ui/src/types/dashboard.tsweb-ui/src/components/Dashboard.tsx
{codeframe/**/*.py,web-ui/src/**/*.{ts,tsx}}
📄 CodeRabbit inference engine (CLAUDE.md)
{codeframe/**/*.py,web-ui/src/**/*.{ts,tsx}}: Use WebSockets for real-time updates between frontend and backend
Use last-write-wins strategy with backend timestamps for timestamp conflict resolution in multi-agent scenarios
Files:
web-ui/src/types/dashboard.tsweb-ui/src/components/Dashboard.tsx
web-ui/src/**/*.{tsx,css}
📄 CodeRabbit inference engine (CLAUDE.md)
Use Nova color palette variables (bg-card, text-foreground, etc.) instead of hardcoded color values
Files:
web-ui/src/components/Dashboard.tsx
web-ui/src/**/*.tsx
📄 CodeRabbit inference engine (CLAUDE.md)
web-ui/src/**/*.tsx: Use cn() utility for conditional Tailwind CSS classes
Wrap AgentStateProvider with ErrorBoundary component for graceful error handling
Use useMemo for derived state calculations in React components
Files:
web-ui/src/components/Dashboard.tsx
web-ui/src/components/**/*.tsx
📄 CodeRabbit inference engine (CLAUDE.md)
Implement React.memo on all Dashboard sub-components for performance optimization
Files:
web-ui/src/components/Dashboard.tsx
🧠 Learnings (6)
📚 Learning: 2025-12-24T04:24:43.825Z
Learnt from: CR
Repo: frankbria/codeframe PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-24T04:24:43.825Z
Learning: Applies to web-ui/{__tests__,tests}/**/*.{ts,tsx} : Use npm test for frontend component testing in web-ui
Applied to files:
web-ui/__tests__/components/Dashboard.test.tsx
📚 Learning: 2025-11-25T19:08:37.203Z
Learnt from: CR
Repo: frankbria/codeframe PR: 0
File: docs/CLAUDE.md:0-0
Timestamp: 2025-11-25T19:08:37.203Z
Learning: Applies to docs/web-ui/**/__tests__/**/*.test.{ts,tsx} : Create JavaScript test files colocated or in __tests__/ as *.test.ts
Applied to files:
web-ui/__tests__/components/Dashboard.test.tsx
📚 Learning: 2025-12-24T04:24:43.825Z
Learnt from: CR
Repo: frankbria/codeframe PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-24T04:24:43.825Z
Learning: Applies to web-ui/src/components/**/*.tsx : Implement React.memo on all Dashboard sub-components for performance optimization
Applied to files:
web-ui/__tests__/components/Dashboard.test.tsxweb-ui/src/components/Dashboard.tsx
📚 Learning: 2025-12-24T04:24:43.825Z
Learnt from: CR
Repo: frankbria/codeframe PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-24T04:24:43.825Z
Learning: Applies to web-ui/src/{contexts,reducers,hooks}/**/*.{ts,tsx} : Implement AgentStateContext with useReducer for multi-agent state management
Applied to files:
web-ui/src/types/dashboard.ts
📚 Learning: 2025-11-25T19:08:37.203Z
Learnt from: CR
Repo: frankbria/codeframe PR: 0
File: docs/CLAUDE.md:0-0
Timestamp: 2025-11-25T19:08:37.203Z
Learning: Applies to docs/web-ui/**/*.{ts,tsx} : Use Next.js 14 with React 18 App Router for the frontend
Applied to files:
web-ui/src/components/Dashboard.tsx
📚 Learning: 2025-12-24T04:24:43.825Z
Learnt from: CR
Repo: frankbria/codeframe PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-24T04:24:43.825Z
Learning: Applies to web-ui/src/**/*.{ts,tsx} : Use React 18 with TypeScript and Context + useReducer pattern for state management
Applied to files:
web-ui/src/components/Dashboard.tsx
🧬 Code graph analysis (1)
web-ui/src/components/Dashboard.tsx (1)
web-ui/src/components/metrics/CostDashboard.tsx (1)
CostDashboard(173-644)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: Frontend Unit Tests
- GitHub Check: Backend Unit Tests
- GitHub Check: E2E Smoke Tests (Chromium)
- GitHub Check: claude-review
🔇 Additional comments (9)
web-ui/src/components/Dashboard.tsx (4)
292-379: Tab navigation implementation looks good.The tab structure follows proper accessibility patterns with
role="tab",aria-selected, andaria-controlsattributes. The tab order matches the PR objective (Overview → Tasks → Quality Gates → Checkpoints → Metrics → Context).
497-527: Recent Activity section implementation is clean.The activity rendering handles the empty state gracefully and uses appropriate emoji indicators for different activity types. The timestamp formatting and layout are consistent with the design system.
530-587: Tasks tab panel consolidates related content effectively.This panel brings together Task Statistics, Issues & Tasks, Blockers, Review Results, Lint Trend, and Review Findings - reducing Overview clutter as intended. The structure is well-organized.
589-617: Quality Gates panel with ErrorBoundary is well-implemented.Good defensive programming with the ErrorBoundary wrapper, debounced retry handler, and dismiss functionality. The hidden state with "Click to show" button provides a good recovery UX.
web-ui/src/types/dashboard.ts (1)
6-10: Type definitions align well with the implementation.The
DashboardTabunion correctly includes all six tabs, and theDashboardStateinterface properly captures bothactiveTabandselectedAgentId. The types are consistent with the Dashboard component's state management.web-ui/__tests__/components/Dashboard.test.tsx (4)
547-558: Test correctly navigates to Tasks tab before asserting blockers.The test update properly reflects the Sprint 10 refactor where BlockerPanel moved to the Tasks tab. The pattern of clicking the tab before asserting content ensures the test validates the actual user flow.
577-585: Empty blockers test correctly updated for tab navigation.Consistent with the previous test, this properly navigates to the Tasks tab before checking for the empty state message.
1045-1056: Quality Gates error boundary test updated for tab structure.The test now correctly navigates to the Quality Gates tab before verifying the panel is present. This ensures the error boundary behavior is tested in the context of the new tab-based layout.
1098-1108: Dismiss test properly navigates to Quality Gates tab.The test flow is correct for validating the dismiss functionality within the new tab structure.
Code Review: Dashboard Tab RefactorThis is a well-structured refactoring that improves the Dashboard's organization and UX. The changes are clean, focused, and maintain backward compatibility. Below is my detailed review: ✅ Strengths
🔍 Observations & Suggestions1. Tab Order LogicThe new tab order (Overview → Tasks → Quality Gates → Checkpoints → Metrics → Context) follows a "natural workflow" as described in the PR summary. This is good, but consider:
2. Data-testid InconsistencyIn the Checkpoints tab button (line 343), the
3. Quality Gates Panel ComplexityThe Quality Gates tab has conditional logic (
4. Lint Trend Panel Missing?The PR description mentions "Lint Trend" moving to the Tasks tab, but I don't see it in the diff. Was it removed, or is it part of another component (e.g.,
5. Coverage.xml AdditionThe
🛡️ Security & Performance
🧪 TestingTest Coverage: ✅ Excellent
Recommendation: Consider adding a test to verify tab switching behavior across all tabs. 📋 Manual Testing ChecklistBefore merging, verify:
🎯 VerdictLGTM with minor suggestions ✅ This is a high-quality refactoring that improves UX, performance, and maintainability. The code is clean, well-tested, and follows the project's conventions. The suggestions above are minor improvements, not blockers. Recommendation: Merge after addressing the data-testid inconsistency (#2) and verifying the Lint Trend panel location (#4). The other suggestions are optional enhancements. Great work on this refactor! The reduced cognitive load from 15 panels → 7 panels in Overview will make a significant difference for users. 🎉 |
Update E2E tests to work with Sprint 10 Dashboard tab refactoring: - test_dashboard.spec.ts: Navigate to Tasks/Metrics/Quality Gates tabs - test_metrics_ui.spec.ts: Navigate to Metrics tab in beforeEach - test_review_ui.spec.ts: Navigate to Tasks tab in beforeEach Panels moved: - review-findings-panel → Tasks tab - quality-gates-panel → Quality Gates tab - metrics-panel → Metrics tab - task statistics → Tasks tab
Code Review - Dashboard Tab Refactoring✅ Overall Assessment: Approve with Minor SuggestionsThis is a well-executed refactoring that significantly improves dashboard UX by organizing panels into focused tabs. The changes are clean, well-tested, and maintain backward compatibility. 🎯 Strengths
🔍 Issues & Recommendations1.
|
There was a problem hiding this comment.
Actionable comments posted: 0
🧹 Nitpick comments (5)
tests/e2e/test_review_ui.spec.ts (2)
35-42: Consider extracting tab navigation to a shared helper function.This navigation pattern (wait for tab → click → wait for panel) is duplicated across
test_review_ui.spec.ts,test_metrics_ui.spec.ts, andtest_dashboard.spec.ts. Extract it totest-utils.tsto reduce duplication and improve maintainability.🔎 Example implementation
Add to
test-utils.ts:export async function navigateToTab( page: Page, tabTestId: string, panelTestId?: string, timeout: number = 10000 ): Promise<void> { const tab = page.locator(`[data-testid="${tabTestId}"]`); await tab.waitFor({ state: 'visible', timeout }); await tab.click(); if (panelTestId) { await page.locator(`[data-testid="${panelTestId}"]`) .waitFor({ state: 'attached', timeout }) .catch(() => {}); } }Then simplify the beforeEach:
- // Navigate to Tasks tab where review findings now live (Sprint 10 Refactor) - const tasksTab = page.locator('[data-testid="tasks-tab"]'); - await tasksTab.waitFor({ state: 'visible', timeout: 10000 }); - await tasksTab.click(); - - // Wait for review findings panel to be visible - await page.locator('[data-testid="review-findings-panel"]').waitFor({ state: 'attached', timeout: 10000 }).catch(() => {}); + // Navigate to Tasks tab where review findings now live (Sprint 10 Refactor) + await navigateToTab(page, 'tasks-tab', 'review-findings-panel');
45-45: Remove redundant comment.The comment "Already on Tasks tab from beforeEach" is unnecessary since the beforeEach setup is clear and proximate. Redundant comments add noise without value.
🔎 Proposed change
test('should display review findings panel', async ({ page }) => { - // Already on Tasks tab from beforeEach (Sprint 10 Refactor) const reviewPanel = page.locator('[data-testid="review-findings-panel"]');tests/e2e/test_metrics_ui.spec.ts (1)
35-42: Extract duplicated tab navigation logic to a shared helper.This navigation pattern is identical to the one in
test_review_ui.spec.tsandtest_dashboard.spec.ts. Consolidating it into a shared helper function intest-utils.tswould improve maintainability and consistency across the test suite.Refer to the helper function suggestion in
test_review_ui.spec.ts(lines 35-42). The same refactor applies here:- // Navigate to Metrics tab (Sprint 10 Refactor - metrics now on dedicated tab) - const metricsTab = page.locator('[data-testid="metrics-tab"]'); - await metricsTab.waitFor({ state: 'visible', timeout: 10000 }); - await metricsTab.click(); - - // Wait for metrics panel to be visible - const metricsPanel = page.locator('[data-testid="metrics-panel"]'); - await metricsPanel.waitFor({ state: 'visible', timeout: 10000 }).catch(() => {}); + // Navigate to Metrics tab (Sprint 10 Refactor - metrics now on dedicated tab) + await navigateToTab(page, 'metrics-tab', 'metrics-panel'); + const metricsPanel = page.locator('[data-testid="metrics-panel"]');
tests/e2e/test_dashboard.spec.ts (2)
124-138: Good comprehensive tab navigation test, but consider using a helper.The sequential tab navigation correctly validates that all new tabs work. However, the repeated navigation pattern could benefit from the shared helper function suggested in other test files.
🔎 Proposed refactor using helper
- // Navigate to Tasks tab and verify review-findings-panel (Sprint 10 Refactor) - const tasksTab = page.locator('[data-testid="tasks-tab"]'); - await tasksTab.waitFor({ state: 'visible', timeout: 10000 }); - await tasksTab.click(); - const reviewPanel = page.locator('[data-testid="review-findings-panel"]'); - await reviewPanel.waitFor({ state: 'attached', timeout: 10000 }); - await expect(reviewPanel).toBeAttached(); - - // Navigate to Metrics tab and verify metrics-panel (Sprint 10 Refactor) - const metricsTab = page.locator('[data-testid="metrics-tab"]'); - await metricsTab.waitFor({ state: 'visible', timeout: 10000 }); - await metricsTab.click(); - const metricsPanel = page.locator('[data-testid="metrics-panel"]'); - await metricsPanel.waitFor({ state: 'attached', timeout: 10000 }); - await expect(metricsPanel).toBeAttached(); + // Navigate to Tasks tab and verify review-findings-panel (Sprint 10 Refactor) + await navigateToTab(page, 'tasks-tab', 'review-findings-panel'); + const reviewPanel = page.locator('[data-testid="review-findings-panel"]'); + await expect(reviewPanel).toBeAttached(); + + // Navigate to Metrics tab and verify metrics-panel (Sprint 10 Refactor) + await navigateToTab(page, 'metrics-tab', 'metrics-panel'); + const metricsPanel = page.locator('[data-testid="metrics-panel"]'); + await expect(metricsPanel).toBeAttached();
152-156: Consolidate duplicated tab navigation across multiple tests.The same tab navigation pattern appears in lines 152-156, 180-184, 227-230, and 333-337. This repetition increases maintenance burden and the risk of inconsistencies. Extract to a shared helper as suggested in earlier comments.
Each occurrence can be simplified. For example, lines 152-156:
- // Navigate to Tasks tab where review findings panel now lives (Sprint 10 Refactor) - const tasksTab = page.locator('[data-testid="tasks-tab"]'); - await tasksTab.waitFor({ state: 'visible', timeout: 10000 }); - await tasksTab.click(); - + // Navigate to Tasks tab where review findings panel now lives (Sprint 10 Refactor) + await navigateToTab(page, 'tasks-tab', 'review-findings-panel');Apply the same pattern to lines 180-184, 227-230, and 333-337.
Also applies to: 180-184, 227-230, 333-337
📜 Review details
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
tests/e2e/test_dashboard.spec.tstests/e2e/test_metrics_ui.spec.tstests/e2e/test_review_ui.spec.ts
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Use TypeScript 5.3+ with strict mode for frontend development
Files:
tests/e2e/test_dashboard.spec.tstests/e2e/test_review_ui.spec.tstests/e2e/test_metrics_ui.spec.ts
tests/**/*.{py,ts,tsx}
📄 CodeRabbit inference engine (CLAUDE.md)
Use TestSprite and Playwright for E2E testing of workflows
Files:
tests/e2e/test_dashboard.spec.tstests/e2e/test_review_ui.spec.tstests/e2e/test_metrics_ui.spec.ts
🧠 Learnings (4)
📓 Common learnings
Learnt from: CR
Repo: frankbria/codeframe PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-24T04:24:43.825Z
Learning: Applies to web-ui/src/components/**/*.tsx : Implement React.memo on all Dashboard sub-components for performance optimization
📚 Learning: 2025-12-24T04:24:43.825Z
Learnt from: CR
Repo: frankbria/codeframe PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-24T04:24:43.825Z
Learning: Applies to web-ui/{__tests__,tests}/**/*.{ts,tsx} : Use npm test for frontend component testing in web-ui
Applied to files:
tests/e2e/test_dashboard.spec.tstests/e2e/test_review_ui.spec.ts
📚 Learning: 2025-12-24T04:24:43.825Z
Learnt from: CR
Repo: frankbria/codeframe PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-12-24T04:24:43.825Z
Learning: Applies to tests/**/*.{py,ts,tsx} : Use TestSprite and Playwright for E2E testing of workflows
Applied to files:
tests/e2e/test_review_ui.spec.ts
📚 Learning: 2025-11-25T19:08:37.203Z
Learnt from: CR
Repo: frankbria/codeframe PR: 0
File: docs/CLAUDE.md:0-0
Timestamp: 2025-11-25T19:08:37.203Z
Learning: Applies to docs/web-ui/**/__tests__/**/*.test.{ts,tsx} : Create JavaScript test files colocated or in __tests__/ as *.test.ts
Applied to files:
tests/e2e/test_review_ui.spec.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: Frontend Unit Tests
- GitHub Check: Backend Unit Tests
- GitHub Check: E2E Smoke Tests (Chromium)
- GitHub Check: claude-review
Summary
Benefits
data-testidattributes for E2E compatibilityTest plan
npm run build)Summary by CodeRabbit
New Features
Tests
Chores
✏️ Tip: You can customize this high-level summary in your review settings.