Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 1 addition & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -77,5 +77,4 @@ jobs:
run: pnpm install --no-frozen-lockfile

- name: Run tests
run: pnpm test || echo "⚠️ No tests configured"
continue-on-error: true
run: pnpm test
12 changes: 5 additions & 7 deletions e2e/conductor-mobile-rendering.spec.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import { test, expect } from '@playwright/test'

const BASE = process.env.HERMES_WORKSPACE_URL || 'http://localhost:3002'

test.describe('Conductor mobile rendering', () => {
test.use({
viewport: { width: 375, height: 667 }, // iPhone SE
})

test('conductor home page renders without clipping on mobile', async ({ page }) => {
await page.goto(`${BASE}/conductor`)
await page.goto('/conductor')
await page.waitForTimeout(2000)

// Check that the main container is present
Expand Down Expand Up @@ -40,7 +38,7 @@ test.describe('Conductor mobile rendering', () => {
})

test('conductor page has no horizontal overflow on mobile', async ({ page }) => {
await page.goto(`${BASE}/conductor`)
await page.goto('/conductor')
await page.waitForTimeout(2000)

// Check for horizontal overflow
Expand All @@ -51,7 +49,7 @@ test.describe('Conductor mobile rendering', () => {
})

test('conductor action buttons are present on mobile', async ({ page }) => {
await page.goto(`${BASE}/conductor`)
await page.goto('/conductor')
await page.waitForTimeout(2000)

// Check for action buttons — they should be visible and clickable
Expand All @@ -61,7 +59,7 @@ test.describe('Conductor mobile rendering', () => {
})

test('conductor main container has proper bottom padding on mobile', async ({ page }) => {
await page.goto(`${BASE}/conductor`)
await page.goto('/conductor')
await page.waitForTimeout(2000)

// Check the bottom padding of main elements
Expand All @@ -77,7 +75,7 @@ test.describe('Conductor mobile rendering', () => {
})

test('conductor page body fills full viewport height without clipping at bottom', async ({ page }) => {
await page.goto(`${BASE}/conductor`)
await page.goto('/conductor')
await page.waitForTimeout(2000)

// Verify body fills the viewport and can scroll
Expand Down
101 changes: 52 additions & 49 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
"start:dev": "vite dev",
"preview": "vite preview",
"test": "vitest run",
"test:e2e": "playwright test",
"test:e2e:ui": "playwright test --ui",
"smoke:managed": "node scripts/managed-companion-smoke.mjs",
"playground:ws": "node scripts/playground-ws.mjs",
"lint": "eslint",
Expand All @@ -27,79 +29,80 @@
"electron:bundle-server": "esbuild dist/server/server.js --bundle --platform=node --format=cjs --outfile=electron/server-bundle.cjs"
},
"dependencies": {
"@base-ui/react": "^1.1.0",
"@hugeicons/core-free-icons": "^3.1.1",
"@hugeicons/react": "^1.1.4",
"@lobehub/icons": "^5.0.1",
"@lobehub/icons-static-png": "^1.83.0",
"@base-ui/react": "^1.6.0",
"@hugeicons/core-free-icons": "^3.3.0",
"@hugeicons/react": "^1.1.9",
"@lobehub/icons": "^5.10.0",
"@lobehub/icons-static-png": "^1.91.0",
"@monaco-editor/react": "^4.7.0",
"@react-three/drei": "^10.7.7",
"@react-three/fiber": "^9.6.1",
"@react-three/postprocessing": "^3.0.4",
"@react-three/rapier": "^2.2.0",
"@tailwindcss/vite": "^4.1.18",
"@tailwindcss/vite": "^4.3.1",
"@tanstack/react-query": "5.90.21",
"@tanstack/react-router": "1.166.7",
"@tanstack/react-router-devtools": "1.166.7",
"@tanstack/react-router-ssr-query": "1.166.7",
"@tanstack/react-start": "1.166.8",
"@tanstack/router-plugin": "1.166.7",
"@tanstack/react-router": "1.167.1",
"@tanstack/react-router-devtools": "1.167.0",
"@tanstack/react-router-ssr-query": "1.167.1",
"@tanstack/react-start": "1.167.1",
"@tanstack/router-plugin": "1.167.1",
"@types/react-grid-layout": "^1.3.6",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"ecctrl": "^1.0.97",
"electron-updater": "^6.6.2",
"framer-motion": "^12.36.0",
"marked": "^17.0.1",
"motion": "^12.29.2",
"motion-dom": "^12.36.0",
"motion-utils": "^12.36.0",
"playwright": "^1.58.2",
"electron-updater": "^6.8.9",
"framer-motion": "^12.42.0",
"marked": "^17.0.6",
"motion": "^12.42.0",
"motion-dom": "^12.42.0",
"motion-utils": "^12.39.0",
"playwright": "^1.61.1",
"playwright-extra": "^4.3.6",
"postprocessing": "^6.39.1",
"puppeteer-extra-plugin-stealth": "^2.11.2",
"react": "^19.2.0",
"react-dom": "^19.2.0",
"react": "^19.2.7",
"react-dom": "^19.2.7",
"react-joyride": "^2.9.3",
"react-markdown": "^10.1.0",
"recharts": "^3.7.0",
"recharts": "^3.9.0",
"rehype-raw": "^7.0.0",
"rehype-sanitize": "^6.0.0",
"remark-breaks": "^4.0.0",
"remark-gfm": "^4.0.1",
"shiki": "^3.21.0",
"tailwind-merge": "^3.4.0",
"tailwindcss": "^4.1.18",
"shiki": "^3.23.0",
"tailwind-merge": "^3.6.0",
"tailwindcss": "^4.3.1",
"three": "^0.184.0",
"vite-tsconfig-paths": "^6.0.2",
"ws": "^8.20.1",
"xterm": "^5.3.0",
"xterm-addon-fit": "^0.8.0",
"xterm-addon-search": "^0.13.0",
"xterm-addon-web-links": "^0.9.0",
"yaml": "^2.8.2",
"vite-tsconfig-paths": "^6.1.1",
"ws": "^8.21.0",
"@xterm/addon-fit": "^0.11.0",
"@xterm/addon-search": "^0.16.0",
"@xterm/addon-web-links": "^0.12.0",
"@xterm/xterm": "^6.0.0",
"yaml": "^2.9.0",
"zod": "^3.25.76",
"zustand": "^5.0.11"
"zustand": "^5.0.14"
},
"devDependencies": {
"@playwright/test": "^1.61.1",
"@tanstack/eslint-config": "0.3.4",
"@testing-library/dom": "^10.4.0",
"@testing-library/react": "^16.2.0",
"@types/node": "^22.10.2",
"@types/react": "^19.2.0",
"@types/react-dom": "^19.2.0",
"@vitejs/plugin-react": "^5.0.4",
"@testing-library/dom": "^10.4.1",
"@testing-library/react": "^16.3.2",
"@types/node": "^22.20.0",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@vitejs/plugin-react": "^5.2.0",
"concurrently": "^8.2.2",
"electron": "^40.8.2",
"electron-builder": "^26.8.1",
"esbuild": "^0.27.0",
"eslint": "^10.2.0",
"jsdom": "^27.0.0",
"prettier": "^3.5.3",
"tsx": "^4.21.0",
"typescript": "^5.7.2",
"vite": "^7.3.2",
"vitest": "^3.0.5",
"web-vitals": "^5.1.0"
"electron": "^40.10.5",
"electron-builder": "^26.15.3",
"esbuild": "^0.27.7",
"eslint": "^10.5.0",
"jsdom": "^27.4.0",
"prettier": "^3.8.5",
"tsx": "^4.22.4",
"typescript": "^5.9.3",
"vite": "^8.1.0",
"vitest": "^4.0.0",
"web-vitals": "^5.3.0"
}
}
25 changes: 25 additions & 0 deletions playwright.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { defineConfig, devices } from '@playwright/test'

const baseURL =
process.env.HERMES_WORKSPACE_URL?.replace(/\/$/, '') ??
'http://127.0.0.1:3000'

export default defineConfig({
testDir: 'e2e',
fullyParallel: false,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 1 : 0,
workers: 1,
reporter: [['list']],
use: {
baseURL,
trace: 'on-first-retry',
screenshot: 'only-on-failure',
},
projects: [
{
name: 'chromium',
use: { ...devices['Desktop Chrome'] },
},
],
})
Loading