0d056a45e9
Vue 3 + Vuetify 4 + TypeScript + Vue Router 4 + Pinia frontend, replacing the old Tailwind+Alpine.js static pages. Infrastructure (8 new files): - composables/useSnackbar.ts — centralized notifications - composables/useServerList.ts — server dropdown data - composables/useServerPagination.ts — paginated server table - types/api.ts — 14 typed API response interfaces - types/global.d.ts — Window augmentation - utils/status.ts — server status display helpers - utils/validation.ts — 8 form validation rules - components/MonacoEditor.vue — fullscreen code editor 14 pages rebuilt: - LoginPage, DashboardPage, ServersPage, TerminalPage - FilesPage, PushPage, ScriptsPage, CredentialsPage - SchedulesPage, RetriesPage, CommandsPage - AlertsPage, AuditPage, SettingsPage Critical fixes (from audit): - Files upload JWT auth (was missing Authorization header) - API Key reveal password verification dialog - 6 silent catch blocks → snackbar error feedback - 33 as any → 0 (typed interfaces + global.d.ts) - Dashboard: alerts/summary/categories/audit data loading - WebSocket reconnect timer cleanup + auth failure handling - Terminal ResizeObserver leak fix - PushPage timer cleanup on unmount - FilesPage path double-slash fix (joinPath helper) - Filter changes reset pagination to page 1 Features added: - Servers: batch operations, CSV export/import, detail panel - Push: sync modes, ZIP upload, WebSocket real-time progress, cancel - Scripts: quick execute panel, execution status tracking - Files: Monaco editor, context menu, batch delete, rename, chmod - Terminal: right-click menu, server sidebar, tab persistence - Settings: batch save, TOTP manual key, password TOTP verification - Dashboard: category distribution, recent audit, WS refresh Quality: - vue-tsc --noEmit zero errors - vite build passes (1613 modules) - Formal 8-step security audit passed (0 FINDING) - .gitignore: dist/ → **/dist/ to cover web/app/dist/ Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
45 lines
1.1 KiB
JSON
45 lines
1.1 KiB
JSON
{
|
|
"name": "frontend",
|
|
"private": true,
|
|
"type": "module",
|
|
"version": "0.0.0",
|
|
"scripts": {
|
|
"dev": "vite",
|
|
"build": "run-p type-check \"build-only {@}\" --",
|
|
"preview": "vite preview",
|
|
"build-only": "vite build",
|
|
"type-check": "vue-tsc --build --force"
|
|
},
|
|
"dependencies": {
|
|
"@fontsource/roboto": "^5.2.10",
|
|
"@mdi/font": "7.4.47",
|
|
"@xterm/addon-fit": "^0.11.0",
|
|
"@xterm/addon-web-links": "^0.12.0",
|
|
"@xterm/xterm": "^6.0.0",
|
|
"monaco-editor": "^0.55.1",
|
|
"pinia": "^3.0.4",
|
|
"vue": "^3.5.30",
|
|
"vue-router": "^4.6.4",
|
|
"vuetify": "^4.0.2"
|
|
},
|
|
"devDependencies": {
|
|
"@tsconfig/node22": "^22.0.5",
|
|
"@types/node": "^24.12.0",
|
|
"@vitejs/plugin-vue": "^6.0.5",
|
|
"@vue/tsconfig": "^0.9.0",
|
|
"npm-run-all2": "^8.0.4",
|
|
"playwright": "^1.60.0",
|
|
"sass-embedded": "^1.98.0",
|
|
"typescript": "~5.9.3",
|
|
"unplugin-fonts": "^1.4.0",
|
|
"vite": "^8.0.0",
|
|
"vite-plugin-vuetify": "^2.1.3",
|
|
"vue-tsc": "^3.2.5"
|
|
},
|
|
"overrides": {
|
|
"unplugin-fonts": {
|
|
"vite": "^8.0.0"
|
|
}
|
|
}
|
|
}
|