diff --git a/frontend/src/pages/HostDetailPage.tsx b/frontend/src/pages/HostDetailPage.tsx
index 7c35857..03a3d10 100644
--- a/frontend/src/pages/HostDetailPage.tsx
+++ b/frontend/src/pages/HostDetailPage.tsx
@@ -1071,7 +1071,7 @@ export default function HostDetailPage() {
- {check.last_result?.latency_ms != null ? `${check.last_result.latency_ms} ms` : '—'}
+ {check.last_result?.latency_ms !== null && check.last_result?.latency_ms !== undefined ? `${check.last_result.latency_ms} ms` : '—'}
{check.last_result?.checked_at
diff --git a/frontend/src/pages/HostsPage.tsx b/frontend/src/pages/HostsPage.tsx
index 91e255a..3b0c8de 100644
--- a/frontend/src/pages/HostsPage.tsx
+++ b/frontend/src/pages/HostsPage.tsx
@@ -4,8 +4,7 @@ import {
Paper, Table, TableBody, TableCell, TableContainer, TableHead,
TableRow, TextField, Toolbar, Tooltip, Typography,
} from '@mui/material'
-import { Add as AddIcon, Refresh as RefreshIcon, Delete as DeleteIcon } from '@mui/icons-material'
-import { CheckCircle as CheckCircleIcon, Cancel as CancelIcon, Remove as RemoveIcon } from '@mui/icons-material'
+import { Add as AddIcon, Refresh as RefreshIcon, Delete as DeleteIcon, CheckCircle as CheckCircleIcon, Cancel as CancelIcon, Remove as RemoveIcon } from '@mui/icons-material'
import { useNavigate } from 'react-router-dom'
import { apiClient, hostsApi } from '../api/client'
import type { Host, HostHealthStatus } from '../types'
diff --git a/frontend/src/pages/PatchDeploymentPage.tsx b/frontend/src/pages/PatchDeploymentPage.tsx
index f1f1205..e17e371 100644
--- a/frontend/src/pages/PatchDeploymentPage.tsx
+++ b/frontend/src/pages/PatchDeploymentPage.tsx
@@ -24,8 +24,7 @@ import {
Typography,
Tooltip,
} from '@mui/material'
-import { Search as SearchIcon } from '@mui/icons-material'
-import { CheckCircle as CheckCircleIcon, Cancel as CancelIcon, Remove as RemoveIcon } from '@mui/icons-material'
+import { Search as SearchIcon, CheckCircle as CheckCircleIcon, Cancel as CancelIcon, Remove as RemoveIcon } from '@mui/icons-material'
import { useNavigate } from 'react-router-dom'
import { hostsApi, jobsApi } from '../api/client'
import type { Host, HostHealthStatus } from '../types'
diff --git a/scripts/git-hooks/pre-commit b/scripts/git-hooks/pre-commit
index b1c92d6..fd04c9b 100755
--- a/scripts/git-hooks/pre-commit
+++ b/scripts/git-hooks/pre-commit
@@ -2,8 +2,8 @@
# =============================================================================
# Linux Patch Manager — Pre-Commit Hook
# =============================================================================
-# Auto-formats Rust code and runs frontend type check before each commit.
-# Prevents CI format-check failures by ensuring code is always formatted.
+# Auto-formats Rust code and runs frontend checks before each commit.
+# Prevents CI format-check and lint failures by catching issues locally.
# Install: ./scripts/git-hooks/install.sh
# =============================================================================
@@ -16,17 +16,20 @@ if [[ -f "${REPO_ROOT}/Cargo.toml" ]]; then
echo "[pre-commit] Running cargo fmt --all ..."
cargo fmt --all --manifest-path "${REPO_ROOT}/Cargo.toml" 2>/dev/null
- # Re-stage any files that cargo fmt reformatted (including previously unstaged)
+ # Re-stage any files that cargo fmt reformatted
STAGED_RS=$(git diff --name-only --diff-filter=ACM -- '*.rs')
if [[ -n "${STAGED_RS}" ]]; then
git add ${STAGED_RS}
fi
fi
-# ── Frontend type check ─────────────────────────────────────────────────────
+# ── Frontend checks ──────────────────────────────────────────────────────────
if [[ -f "${REPO_ROOT}/frontend/package.json" ]]; then
- echo "[pre-commit] Running TypeScript type check ..."
+ echo "[pre-commit] Running ESLint ..."
cd "${REPO_ROOT}/frontend"
+ npx eslint src/ --ext .ts,.tsx --max-warnings 0 2>/dev/null
+
+ echo "[pre-commit] Running TypeScript type check ..."
npx tsc --noEmit 2>/dev/null
fi
diff --git a/scripts/git-hooks/pre-push b/scripts/git-hooks/pre-push
index 3b06173..cde0997 100755
--- a/scripts/git-hooks/pre-push
+++ b/scripts/git-hooks/pre-push
@@ -2,7 +2,7 @@
# =============================================================================
# Linux Patch Manager — Pre-Push Hook
# =============================================================================
-# Safety net: verifies cargo fmt and frontend build pass before pushing.
+# Safety net: verifies cargo fmt, ESLint, and TypeScript pass before pushing.
# Install: ./scripts/git-hooks/install.sh
# =============================================================================
@@ -20,6 +20,15 @@ if [[ -f "${REPO_ROOT}/Cargo.toml" ]]; then
fi
fi
+# ── Frontend ESLint ──────────────────────────────────────────────────────────
+if [[ -f "${REPO_ROOT}/frontend/package.json" ]]; then
+ echo "[pre-push] Running ESLint ..."
+ if ! (cd "${REPO_ROOT}/frontend" && npx eslint src/ --ext .ts,.tsx --max-warnings 0 2>/dev/null); then
+ echo "[pre-push] ❌ ESLint check FAILED."
+ FAILED=1
+ fi
+fi
+
# ── Frontend type check ─────────────────────────────────────────────────────
if [[ -f "${REPO_ROOT}/frontend/package.json" ]]; then
echo "[pre-push] Checking TypeScript types ..."