# Extension: make install | make update | make sync-files (Claude-Sitzungen sofort abgleichen) # Server: make dev (lokal, Port $(PORT)) | make prod (auf dem Server) | make stop | make logs | make down | make test # Android: make apk (bauen) | make apk-install (aufs Handy per USB) UUID = desktop@marha.de SRC = $(CURDIR)/$(UUID) DEST = $(HOME)/.local/share/gnome-shell/extensions/$(UUID) VENV = backend/.venv PORT ?= 8040 SYNC_URL = https://planer.marha.de SYNC_JSON = $(HOME)/.local/share/desktop-app/sync.json .ONESHELL: .PHONY: install update enable sync-config reload sync-files venv dev prod stop logs down test apk apk-install install: @if [ -e "$(DEST)" ]; then echo "Schon installiert: $(DEST)" echo "Zum Aktualisieren: make update" exit 0 fi mkdir -p "$(dir $(DEST))" cp -r "$(SRC)" "$(DEST)" $(MAKE) --no-print-directory enable sync-config echo "Installiert. Jetzt ab- und wieder anmelden." update: @if [ ! -e "$(DEST)" ]; then echo "Nicht installiert. Zuerst: make install" exit 1 fi if [ -L "$(DEST)" ]; then echo "$(DEST) ist ein Symlink auf $(SRC), nichts zu kopieren." else rm -rf "$(DEST)" cp -r "$(SRC)" "$(DEST)" echo "Aktualisiert." fi $(MAKE) --no-print-directory sync-config reload echo "Neuer Code ist aktiv. Nur extension.js selbst wirkt erst nach dem nächsten Anmelden." # UUID in die aktiven Extensions eintragen, falls sie fehlt enable: @python3 dev/enable.py "$(UUID)" # sync.json aus der .env anlegen, falls sie fehlt. Ohne .env bleibt die Extension rein lokal. sync-config: @if [ -f "$(SYNC_JSON)" ]; then echo "Sync-Zugang vorhanden: $(SYNC_JSON)" elif [ -f .env ] && grep -q "^SYNC_TOKEN=.\+" .env; then mkdir -p "$(dir $(SYNC_JSON))" printf '{"url": "$(SYNC_URL)", "token": "%s"}\n' "$$(grep ^SYNC_TOKEN= .env | cut -d= -f2-)" > "$(SYNC_JSON)" chmod 600 "$(SYNC_JSON)" echo "Sync-Zugang angelegt: $(SYNC_JSON)" else echo "Kein Sync-Zugang: .env mit SYNC_TOKEN fehlt. Extension läuft lokal." fi # Extension aus- und einschalten, damit sie sync.json neu liest. Geht nur in einer laufenden Session. reload: @if gnome-extensions info $(UUID) 2>/dev/null | grep -q "ACTIVE"; then gnome-extensions disable $(UUID) && gnome-extensions enable $(UUID) echo "Extension neu gestartet." fi # Dateiabgleich (Claude-Sitzungen und Memory) sofort anstoßen, wartet bis er durch ist sync-files: @gdbus call --session --dest org.gnome.Shell --object-path /de/marha/desktop --method de.marha.Desktop.SyncFiles --timeout 3600 \ | sed -e "s/^('//" -e "s/',)$$//" # ── Server ─────────────────────────────────────────────────────────────────── venv: $(VENV)/bin/uvicorn $(VENV)/bin/uvicorn: backend/requirements.txt python3 -m venv $(VENV) $(VENV)/bin/pip install -q -r backend/requirements.txt # Lokal entwickeln. Token kommt aus .env (Vorlage: .env.example). dev: venv @[ -f .env ] || { echo ".env fehlt. Vorlage: cp .env.example .env, dann SYNC_TOKEN setzen."; exit 1; } set -a; . ./.env; set +a echo "Server: http://localhost:$(PORT)" cd backend && .venv/bin/uvicorn app.main:app --reload --port $(PORT) # Produktion (auf dem Server ausführen, im Projektverzeichnis) prod: @[ -f .env ] || { echo ".env fehlt. Vorlage: cp .env.example .env, dann SYNC_TOKEN setzen."; exit 1; } docker compose up -d --build echo "läuft: https://planer.marha.de" # [u] statt u: so trifft das Muster nicht die eigene Shell, die es im Aufruf trägt stop: -pkill -f "$(CURDIR)/$(VENV)/bin/python3 .venv/bin/[u]vicorn" 2>/dev/null echo "gestoppt." logs: docker compose logs -f down: docker compose down test: venv cd backend && .venv/bin/python -m pytest -q # ── Android ────────────────────────────────────────────────────────────────── APK = android/app/build/outputs/apk/debug/app-debug.apk # Werkzeuge nach ~/Android holen (einmalig, ohne Root), dann bauen apk: @grep -q "^SYNC_TOKEN=.\+" .env 2>/dev/null || echo "Hinweis: .env ohne SYNC_TOKEN, der Zugang muss dann in der App eingetragen werden." [ -x "$$HOME/Android/jdk17/bin/java" ] || android/dev/setup.sh . android/dev/env.sh cd android && gradle assembleDebug -q echo "APK: $(APK)" # Aufs per USB verbundene Handy (Entwickleroptionen, USB-Debugging, Dialog am Handy bestätigen) apk-install: apk @. android/dev/env.sh PHONE=$$(adb devices | awk 'NR>1 && $$2=="device" && $$1 !~ /^emulator/ {print $$1}' | head -1) [ -n "$$PHONE" ] || { echo "Kein Handy gefunden. adb devices zeigt:"; adb devices; exit 1; } adb -s "$$PHONE" install -r "$(APK)" echo "Installiert auf $$PHONE. Server-Zugang aus .env ist eingebaut."