Zwiscshenstand - laufende Version

Dieser Commit ist enthalten in:
Claude Project Manager
2025-09-27 13:11:39 +02:00
Ursprung 81e57ecff6
Commit 2689cd2d32
30 geänderte Dateien mit 1021 neuen und 459 gelöschten Zeilen

67
main.py
Datei anzeigen

@ -29,7 +29,62 @@ class SkillMateStarter:
if sys.platform != 'win32':
signal.signal(signal.SIGINT, self.signal_handler)
signal.signal(signal.SIGTERM, self.signal_handler)
def _has_local_binary(self, project_dir: Path, binary: str) -> bool:
"""Prüft, ob ein lokales NPM-Binary vorhanden ist (Windows .cmd / Unix ohne Endung)."""
bin_dir = project_dir / 'node_modules' / '.bin'
if sys.platform == 'win32':
return (bin_dir / f'{binary}.cmd').exists() or (bin_dir / f'{binary}.CMD').exists()
else:
return (bin_dir / binary).exists()
def _ensure_dependencies(self) -> bool:
"""Installiert fehlende Node-Abhängigkeiten in backend, frontend, admin-panel.
Rückgabe: True bei Erfolg, False wenn Installation irreparabel fehlschlägt.
"""
projects = [
(self.base_dir / 'backend', ['nodemon', 'ts-node']),
(self.base_dir / 'frontend', ['vite']),
(self.base_dir / 'admin-panel', ['vite'])
]
any_install = False
for proj_dir, required_bins in projects:
if not proj_dir.exists():
continue
needs_install = not (proj_dir / 'node_modules').exists()
if not needs_install:
# Prüfe konkrete Binaries
for b in required_bins:
if not self._has_local_binary(proj_dir, b):
needs_install = True
break
if needs_install:
any_install = True
print(f"🔧 Installiere Abhängigkeiten in {proj_dir.name}...")
# Bevorzugt npm ci, fallback auf npm install
try:
cmd_ci = ["cmd", "/c", "npm ci"] if sys.platform == 'win32' else ["npm", "ci"]
result = subprocess.run(cmd_ci, cwd=str(proj_dir), check=False)
if result.returncode != 0:
cmd_install = ["cmd", "/c", "npm install"] if sys.platform == 'win32' else ["npm", "install"]
result = subprocess.run(cmd_install, cwd=str(proj_dir), check=False)
if result.returncode != 0:
print(f"❌ Konnte Abhängigkeiten in {proj_dir.name} nicht installieren. Prüfen Sie Internet/Proxy.")
return False
except Exception as e:
print(f"❌ Fehler bei der Installation in {proj_dir.name}: {e}")
return False
if any_install:
print("✅ Abhängigkeiten installiert. Fahre mit dem Start fort...\n")
else:
print("✅ Abhängigkeiten geprüft – alles vorhanden.\n")
return True
def signal_handler(self, signum, frame):
"""Handle Strg+C und andere Signale"""
print("\n\n🛑 SkillMate wird beendet...")
@ -121,6 +176,12 @@ class SkillMateStarter:
for p in [self.backend_port, self.frontend_port, self.admin_port]:
self._free_port_windows(p)
# Abhängigkeiten sicherstellen, bevor Services gestartet werden
print(" Prüfe/Installiere Abhängigkeiten...")
if not self._ensure_dependencies():
print("❌ Abbruch: Abhängigkeiten konnten nicht installiert werden.")
return
# Backend
backend_dir = self.base_dir / "backend"
if self.mode == 'dev':
@ -136,7 +197,7 @@ class SkillMateStarter:
# Frontend
frontend_dir = self.base_dir / "frontend"
if self.mode == 'dev':
self._popen_new_console(frontend_dir, f"npm run dev -- --port {self.frontend_port}")
self._popen_new_console(frontend_dir, f"npm run dev -- --strictPort --port {self.frontend_port}")
else:
self._popen_new_console(frontend_dir, f"cmd /c npm run build && npm run preview -- --port {self.frontend_port}")
@ -144,7 +205,7 @@ class SkillMateStarter:
admin_dir = self.base_dir / "admin-panel"
if admin_dir.exists():
if self.mode == 'dev':
self._popen_new_console(admin_dir, f"npm run dev -- --port {self.admin_port}")
self._popen_new_console(admin_dir, f"npm run dev -- --strictPort --port {self.admin_port}")
else:
self._popen_new_console(admin_dir, f"cmd /c npm run build && npm run preview -- --port {self.admin_port}")