{ "name": "termix", "private": true, "workspaces": [ "packages/*" ], "version": "26.10.0", "description": "Self-hosted, plugin-based server management.", "author": "Karmaa", "main": "electron/main.cjs", "engines": { "node": ">=22.12.0", "npm": ">=11" }, "scripts": { "format": "prettier --write .", "format:check": "prettier --check .", "postinstall": "node scripts/patch-app-builder-lib.cjs && node scripts/patch-better-sqlite3.cjs && node scripts/patch-nan.cjs && node scripts/patch-node-pty.cjs && node scripts/patch-ssh2-agent.cjs", "prepare": "husky || true", "prebuild": "node scripts/write-electron-build-info.cjs", "lint": "node scripts/generate-dialect-schema.cjs --check && eslint . && node scripts/check-importmap-csp.cjs && node scripts/check-core-plugin-ids.cjs && node scripts/check-sdk-ui-exports.cjs && node scripts/generate-settings-search-index.cjs --check && node scripts/check-test-locations.cjs && node scripts/check-changelog.cjs && node scripts/check-env-catalog.cjs", "lint:fix": "eslint --fix .", "type-check": "npm run build:sdk && tsc -b --force", "test": "vitest run", "verify:dialect": "tsx scripts/verify-dialects.mjs", "test:watch": "vitest", "test:ui": "vitest --ui", "test:coverage": "vitest run --coverage", "dev": "node scripts/dev.mjs", "dev:electron": "node scripts/dev.mjs electron", "dev:docker": "node scripts/dev.mjs docker", "dev:frontend": "vite", "build": "npm run build:sdk && vite build && tsc -p tsconfig.node.json && node -e \"require('fs').copyFileSync('src/backend/package.json','dist/backend/package.json')\" && npm run build:plugins", "build:backend": "npm run build:sdk && tsc -p tsconfig.node.json && node -e \"require('fs').copyFileSync('src/backend/package.json','dist/backend/package.json')\" && npm run build:plugins", "generate:openapi": "npm run build:sdk && node scripts/generate-openapi.mjs", "electron:rebuild": "electron-rebuild -f -o better-sqlite3,@serialport/bindings-cpp,node-pty", "build:win-portable": "npm run build && npm run electron:rebuild && electron-builder --win --dir", "build:win-installer": "npm run build && npm run electron:rebuild && electron-builder --win --publish=never", "build:linux-appimage": "npm run build && npm run electron:rebuild && electron-builder --linux AppImage", "build:linux-targz": "npm run build && npm run electron:rebuild && electron-builder --linux tar.gz", "build:mac": "npm run build && npm run electron:rebuild && electron-builder --mac --universal", "schema:generate": "node scripts/generate-dialect-schema.cjs", "schema:check": "node scripts/generate-dialect-schema.cjs --check", "schema:migrations": "drizzle-kit generate --config=drizzle.config.sqlite.ts && drizzle-kit generate --config=drizzle.config.pg.ts && drizzle-kit generate --config=drizzle.config.mysql.ts", "build:sdk": "npm run build --workspace @termix-ssh/plugin-sdk && node scripts/build-sdk-host.mjs", "build:plugins": "node scripts/build-plugins.cjs", "plugins:pin": "node scripts/pin-bundled-plugins.cjs" }, "dependencies": { "@tanstack/react-virtual": "^3.14.13", "@types/compression": "^1.8.1", "@types/semver": "^7.8.0", "axios": "^1.19.0", "bcryptjs": "^3.0.3", "better-sqlite3": "^13.0.3", "body-parser": "^2.3.0", "chalk": "^6.0.0", "compression": "^1.8.2", "cookie-parser": "^1.4.7", "cors": "^2.8.6", "dotenv": "^17.4.2", "drizzle-orm": "^0.45.2", "express": "^5.2.1", "jsonwebtoken": "^9.0.3", "motion": "^13.1.1", "multer": "^2.3.0", "mysql2": "^3.23.4", "nanoid": "^6.0.1", "node-pty": "^1.1.0", "pg": "^8.23.0", "semver": "^7.8.5", "serialport": "^13.0.0", "sharp": "^0.35.4", "socks": "^2.8.10", "ssh2": "^1.17.0", "sshpk": "^1.18.0", "tar": "^7.5.22", "undici": "^8.10.2", "ws": "^8.21.3" }, "devDependencies": { "@codemirror/theme-one-dark": "^6.1.3", "@codemirror/view": "^6.43.12", "@commitlint/cli": "^21.2.2", "@commitlint/config-conventional": "^21.2.0", "@deadendjs/swagger-jsdoc": "^8.1.2", "@electron/notarize": "^3.1.1", "@electron/rebuild": "^4.2.0", "@eslint/js": "^10.0.1", "@fontsource-variable/jetbrains-mono": "^5.3.0", "@fontsource/fira-code": "^5.3.0", "@fontsource/jetbrains-mono": "^5.3.0", "@fontsource/source-code-pro": "^5.3.0", "@peculiar/x509": "^2.1.0", "@radix-ui/react-alert-dialog": "^1.1.23", "@radix-ui/react-checkbox": "^1.3.11", "@radix-ui/react-label": "^2.1.15", "@radix-ui/react-popover": "^1.1.23", "@radix-ui/react-scroll-area": "^1.2.18", "@radix-ui/react-select": "^2.3.7", "@radix-ui/react-slider": "^1.4.7", "@radix-ui/react-slot": "^1.3.3", "@radix-ui/react-switch": "^1.3.7", "@radix-ui/react-tabs": "^1.1.21", "@tailwindcss/vite": "^4.3.3", "@testing-library/dom": "^10.4.2", "@testing-library/jest-dom": "^7.0.1", "@testing-library/react": "^16.3.3", "@testing-library/user-event": "^14.6.7", "@types/better-sqlite3": "^9.6.0", "@types/cookie-parser": "^1.4.10", "@types/cors": "^2.8.19", "@types/express": "^5.0.6", "@types/jsonwebtoken": "^9.0.10", "@types/multer": "^2.2.0", "@types/node": "^26.2.0", "@types/pg": "^8.23.1", "@types/react": "^19.2.18", "@types/react-dom": "^19.2.4", "@types/ssh2": "^1.15.6", "@types/sshpk": "^1.17.5", "@types/supertest": "^7.2.1", "@types/ws": "^8.18.1", "@uiw/react-codemirror": "^4.25.11", "@vitejs/plugin-react": "^6.1.1", "@vitest/coverage-v8": "^4.1.11", "@vitest/ui": "^4.1.11", "@xterm/addon-clipboard": "^0.2.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "drizzle-kit": "^0.31.10", "electron": "^43.4.1", "electron-builder": "^26.15.3", "eslint": "^10.8.1", "eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-refresh": "^0.5.7", "eslint-plugin-unused-imports": "^4.4.1", "globals": "^17.13.0", "husky": "^9.1.7", "i18next": "^26.4.2", "i18next-browser-languagedetector": "^8.2.1", "jsdom": "^30.0.1", "lint-staged": "^17.2.0", "lucide-react": "^1.33.0", "postcss-pxtorem": "^6.1.0", "prettier": "3.9.9", "radix-ui": "^1.6.7", "react": "^19.2.8", "react-dom": "^19.2.8", "react-i18next": "^17.0.14", "reflect-metadata": "^0.2.2", "sonner": "^2.0.8", "supertest": "^7.3.0", "tailwind-merge": "^3.5.0", "tailwindcss": "^4.2.4", "tw-animate-css": "^1.4.0", "typescript": "~6.0.3", "typescript-eslint": "^8.66.0", "vite": "^8.2.2", "vite-plugin-svgr": "^5.2.0", "vitest": "^4.1.11" }, "lint-staged": { "*.{ts,tsx}": [ "eslint --fix", "prettier --write" ], "*.{js,jsx,mjs,cjs,json,css,md}": [ "prettier --write" ] }, "overrides": { "@electron/asar": "^4.2.0", "@electron/get": "^5.0.0", "dompurify": "^3.4.1", "eslint-visitor-keys": "^4.2.1", "prebuild-install": "npm:@mmomtchev/prebuild-install@1.0.2", "rimraf": "file:vendor/rimraf-compat", "brace-expansion@1": "^1.1.18", "brace-expansion@2": "^2.1.4", "brace-expansion@5": "^5.0.9", "esbuild": "^0.28.1", "fast-uri@3": "^3.1.6", "ip-address": "^10.5.0", "js-yaml@4": "^4.3.2", "nanoid@3": "^3.3.18", "postcss": "^8.5.26", "tar": "^7.5.22", "undici@6": "^6.28.0", "undici@7": "^7.29.0", "@xmldom/xmldom": "^0.8.15", "browserslist": "^4.28.7", "qs": "^6.16.0" } }