Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
6f8a521
feat(ui): Phase 1 — shadcn/ui foundation and panel-based layout shell
aksOps Apr 1, 2026
c2982a7
test(ui): add Playwright E2E test suite for Phase 7 UI redesign
aksOps Apr 1, 2026
0292d8d
feat: add GET /api/file-tree endpoint for hierarchical codebase struc…
aksOps Apr 1, 2026
f3de21b
feat(ui): Phase 2 — Project Explorer file tree in left sidebar
aksOps Apr 1, 2026
7cec5fd
fix(detection): fix TopicLinker SENDS_TO gap, ConfigDefDetector, Kafk…
aksOps Apr 1, 2026
8c021b1
perf: fix Neo4j query hotspots — fulltext index, N+1 batch, single-tx…
aksOps Apr 1, 2026
ee7277c
feat(ui): Phase 3 — Replace D3 treemap with @antv/g6 v5 graph visuali…
aksOps Apr 1, 2026
908a598
feat(ui): Phase 4 — Contextual right-panel node details view
aksOps Apr 1, 2026
9750d27
feat(ui): Phase 5 — Dashboard & stats redesign with shadcn/ui
aksOps Apr 1, 2026
695344c
fix(detection): address CTO code review — 5 issues from PR #20
aksOps Apr 1, 2026
af54701
Revert "fix(detection): address CTO code review — 5 issues from PR #20"
aksOps Apr 1, 2026
8415eb9
feat(ui): add @radix-ui/react-accordion and @radix-ui/react-tabs for …
aksOps Apr 1, 2026
d9a955d
feat(ui): add shadcn/ui accordion, input, dialog, tabs, scroll-area p…
aksOps Apr 1, 2026
87da9b9
feat(ui): extract MCP tool catalogue to shared mcp-tools.ts (36 tools)
aksOps Apr 1, 2026
18cead1
feat(ui): redesign MCP Console with accordion, command palette, inlin…
aksOps Apr 1, 2026
df4d7ed
feat(ui): redesign API Docs with Tabs — Swagger UI + MCP Tools Reference
aksOps Apr 1, 2026
c0dbb5b
build(ui): rebuild frontend for Phase 6 MCP Console & API Docs redesign
aksOps Apr 1, 2026
12a223d
fix(ui): address PE code review findings — read-only contract, race c…
aksOps Apr 1, 2026
658bd5a
fix(ui): remove read-only contract violations and stale build artifacts
aksOps Apr 1, 2026
7b8bf32
fix(ui): lazy-load G6 graph and remove dead D3 dependency
aksOps Apr 1, 2026
9f90681
checkpoint: pre-yolo 20260402-014120
aksOps Apr 2, 2026
15ce115
checkpoint: pre-yolo 20260402-204358
aksOps Apr 2, 2026
9155a45
fix: address CTO review — XSS, G6 leak, ARIA, hooks, and stale state
aksOps Apr 3, 2026
38fa346
fix(api): harden GET /api/file-tree — depth cap, heap limit, caching
aksOps Apr 3, 2026
a580ae4
fix(ui): fix FileTree type mismatch and add ErrorBoundary
aksOps Apr 3, 2026
fb9ede9
fix(frontend): fix FileTree type mismatch and add ErrorBoundary
aksOps Apr 3, 2026
e514ea9
test(ui): harden gotoRoute — patch stale JAR index.html + extend timeout
aksOps Apr 3, 2026
315311d
checkpoint: pre-yolo 20260403-083943
aksOps Apr 3, 2026
c8a55bd
checkpoint: pre-yolo 20260403-091754
aksOps Apr 3, 2026
ff30577
fix(ui): add data-testid contract and afterrender hook to CodeGraphView
aksOps Apr 3, 2026
4ec484d
fix(ui): fix global search — role=searchbox, keyboard nav, asset bund…
aksOps Apr 3, 2026
95a8342
fix: NestJS discriminator guards, EXPOSES target, GuardLinker, and in…
aksOps Apr 3, 2026
bfcb543
fix(ui): fix global search — spinner/dropdown separation, keyboard na…
aksOps Apr 3, 2026
94fd9e6
fix(detector): fix ReactComponentDetector sibling RENDERS edges dropped
aksOps Apr 3, 2026
2b9a510
fix(kafka): update CLASS_RE to match Kotlin object declarations and m…
aksOps Apr 3, 2026
59481af
fix(query): add path field to buildTreeOutput for FileTreeNode compat…
aksOps Apr 3, 2026
f87b212
fix(detection): backport CTO-reviewed detector fixes into phase5 branch
aksOps Apr 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,085 changes: 708 additions & 377 deletions src/main/frontend/package-lock.json

Large diffs are not rendered by default.

18 changes: 14 additions & 4 deletions src/main/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,39 @@
"scripts": {
"dev": "vite",
"build": "tsc -b && vite build",
"preview": "vite preview"
"preview": "vite preview",
"test:e2e": "playwright test",
"test:e2e:headed": "playwright test --headed",
"test:e2e:report": "playwright show-report"
},
"dependencies": {
"@antv/g6": "^5.1.0",
"@monaco-editor/react": "^4.7.0",
"@radix-ui/react-accordion": "^1.2.12",
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-dropdown-menu": "^2.1.6",
"@radix-ui/react-scroll-area": "^1.2.3",
"@radix-ui/react-select": "^2.1.6",
"@radix-ui/react-tabs": "^1.1.13",
"@radix-ui/react-tooltip": "^1.1.8",
"@types/d3": "^7.4.3",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"d3": "^7.9.0",
"lucide-react": "^0.474.0",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-resizable-panels": "^4.8.0",
"react-router-dom": "^7.1.5",
"swagger-ui-react": "^5.21.0",
"tailwind-merge": "^3.0.2"
"tailwind-merge": "^3.0.2",
"tailwindcss-animate": "^1.0.7"
},
"overrides": {
"dompurify": "^3.3.3"
},
"devDependencies": {
"@axe-core/playwright": "^4.10.1",
"@playwright/test": "^1.51.1",
"@types/node": "^22.0.0",
"@types/react": "^18.3.18",
"@types/react-dom": "^18.3.5",
"@types/swagger-ui-react": "^4.18.3",
Expand Down
90 changes: 90 additions & 0 deletions src/main/frontend/playwright-report/index.html

Large diffs are not rendered by default.

76 changes: 76 additions & 0 deletions src/main/frontend/playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/// <reference types="node" />
import { defineConfig, devices } from '@playwright/test';

/**
* Playwright E2E test configuration for Code IQ UI Redesign (Phase 7).
*
* Prerequisites:
* - `code-iq serve` running on localhost:8080 (Neo4j graph loaded)
* - Or use `webServer` below to start the Vite dev server pointing at a real backend
*
* Run all tests: npm run test:e2e
* Run headed: npm run test:e2e:headed
* Show HTML report: npm run test:e2e:report
*/
export default defineConfig({
testDir: './tests/e2e',
// Use the test-specific tsconfig that includes @types/node
tsconfig: './tsconfig.test.json',
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
workers: process.env.CI ? 1 : undefined,
reporter: [['html', { outputFolder: 'playwright-report' }], ['line']],

use: {
baseURL: process.env.BASE_URL ?? 'http://localhost:8080',
trace: 'on-first-retry',
screenshot: 'only-on-failure',
video: 'retain-on-failure',
},

// Performance threshold constants (ms) shared via env so specs can read them
// Actual assertions live in performance.spec.ts
// PERF_THRESHOLD_100 = 500
// PERF_THRESHOLD_1K = 2000
// PERF_THRESHOLD_10K = 3000

projects: [
// P0 — required for release sign-off
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
{
name: 'firefox',
use: { ...devices['Desktop Firefox'] },
},

// P1 — run in CI when available
{
name: 'edge',
use: { ...devices['Desktop Edge'], channel: 'msedge' },
},
{
name: 'webkit',
use: { ...devices['Desktop Safari'] },
},

// Responsive breakpoints (chromium only — layout logic is shared)
{
name: 'desktop-1920',
use: { ...devices['Desktop Chrome'], viewport: { width: 1920, height: 1080 } },
testMatch: '**/responsive.spec.ts',
},
{
name: 'laptop-1440',
use: { ...devices['Desktop Chrome'], viewport: { width: 1440, height: 900 } },
testMatch: '**/responsive.spec.ts',
},
{
name: 'tablet-768',
use: { ...devices['Desktop Chrome'], viewport: { width: 768, height: 1024 } },
testMatch: '**/responsive.spec.ts',
},
],
});
10 changes: 8 additions & 2 deletions src/main/frontend/src/App.tsx
Original file line number Diff line number Diff line change
@@ -1,17 +1,23 @@
import { lazy, Suspense } from 'react';
import { Routes, Route, Navigate } from 'react-router-dom';
import Layout from './components/Layout';
import Dashboard from './components/Dashboard';
import CodeGraphView from './components/CodeGraphView';
import ExplorerView from './components/ExplorerView';
import McpConsole from './components/McpConsole';
import SwaggerView from './components/SwaggerView';

const CodeGraphView = lazy(() => import('./components/CodeGraphView'));

export default function App() {
return (
<Routes>
<Route element={<Layout />}>
<Route path="/" element={<Dashboard />} />
<Route path="/graph" element={<CodeGraphView />} />
<Route path="/graph" element={
<Suspense fallback={<div className="flex items-center justify-center h-full text-muted-foreground">Loading graph…</div>}>
<CodeGraphView />
</Suspense>
} />
<Route path="/explorer" element={<ExplorerView />} />
<Route path="/explorer/:kind" element={<ExplorerView />} />
<Route path="/console" element={<McpConsole />} />
Expand Down
Loading
Loading