Commit graph

33 commits

Author SHA1 Message Date
Jens Reinemann
e73d3a11a0 ci: disable automatic CI triggers on push/PR
Both android-ci.yml and ci.yml now only run via workflow_dispatch
(manual trigger). Automatic builds on push/PR are disabled to stop
failing pipeline notifications.
2026-05-17 18:23:27 +02:00
Jens Reinemann
e0130910af chore: migrate server URLs from IP to bollwerk.online domain
Replace all HTTP references to 195.246.231.210 with bollwerk.online
across skills, prompts, scripts, and app default settings:

- Dockerfile: rename KRISENVORRAT_JWT_SECRET to BOLLWERK_JWT_SECRET
- SettingsKey.kt: default server URL now http://bollwerk.online:8080
- publish SKILL/prompt/script: HTTP URLs updated to bollwerk.online
- vps-deploy SKILL: Admin-UI and health-check URLs updated
- run-integration-tests.ps1: default BaseUrl updated

SSH commands (ssh/scp) intentionally kept on IP, as DNS is not
used for SSH access.
2026-05-17 18:22:17 +02:00
Jens Reinemann
83ef83f4e7 revert: Repo-Name zurueck auf bollwerk (der neue korrekte Name)
Mein vorheriger Commit hat faelschlicherweise bollwerk -> krisenvorrat
geaendert. Richtig ist: krisenvorrat (alt) -> bollwerk (neu).
2026-05-17 18:12:38 +02:00
Jens Reinemann
7c768be648 fix: Repo-Name in Skripten/Skills auf krisenvorrat korrigieren
- create-next-ticket.ps1, next-ticket.ps1, watch-pipeline.ps1: \
- SKILL.md (gh-tickets): Repo-Referenz + Issue-URL
- workflow-planning.prompt.md, workflow-block-planning.prompt.md: Issue-URL
2026-05-17 18:11:23 +02:00
Jens Reinemann
a5f89e6a69 rename: Krisenvorrat -> Bollwerk
- Package: de.krisenvorrat.* -> de.bollwerk.*
- Klassen: KrisenvorratApp/Database/Theme -> Bollwerk*
- ApplicationId: de.bollwerk.app
- Server: BOLLWERK_* Env-Vars, bollwerk HOCON-Config
- Docker: bollwerk-server/db/backup Container-Namen
- Room DB: bollwerk.db, SharedPrefs: bollwerk_secure_prefs
- Export-Dateien: bollwerk_export/inventar
- UI-Strings, HTML, Admin-UI: alle auf Bollwerk
- Docs, Skills, README angepasst
- Alle Tests gruen, Build erfolgreich
2026-05-17 17:44:02 +02:00
Jens Reinemann
bba4ac0086 fix: publish-apk.ps1 PowerShell 5.1 Kompatibilitaet
- En-Dash durch Hyphen ersetzt (UTF-8 Encoding-Problem)
- SSH-Befehle: && durch ; ersetzt (PS 5.1 kennt kein &&)
- 2>/dev/null aus PS-Parsing entfernt (String-Konkatenation)
- SSH-Array-Rueckgabe korrekt behandeln (letztes Element)
2026-05-17 15:39:12 +02:00
Jens Reinemann
5434c00f20 feat: automatischer Sync nach Login/Reconnect, manuelle Push/Pull-Buttons entfernen
- WebSocket Connected-Event löst jetzt automatisch pullSync() aus
  (nach Login = Full Sync, nach Reconnect = inkrementell)
- Push/Pull-Buttons ersetzt durch Hinweis 'Synchronisierung erfolgt
  automatisch' + Fallback-Button 'Jetzt synchronisieren'
- ServerUrl: Default-Wert (VPS-IP) als Konstante in SettingsKey,
  Reset-Button neben dem URL-Feld
- SettingsUiState: serverUrl Default = DEFAULT_SERVER_URL
- Tests angepasst (SettingsRepositoryImplTest)
2026-05-17 15:36:11 +02:00
Jens Reinemann
61ef56425d test(server): Server-Integrationstests vervollständigen
Auth: Expired-Token-Tests (Access + Refresh), fehlende Felder
Message-API: Send, Get Conversation, Blank Body, Receiver Not Found,
  Custom ID, Response-Format (9 Tests)
WebSocket: Connect mit gültigem/ungültigem/fehlendem/abgelaufenem Token,
  inventoryUpdated-Event, new_message-Event, Disconnect, undelivered
  Messages bei Connect (8 Tests)
CI-Pipeline: Auto-Trigger für push/PR auf app/shared/server-Pfade,
  Step-Label verdeutlicht (app + shared + server)

Server-Tests: 130 gesamt, 0 Failures

Closes #80
2026-05-17 04:02:34 +02:00
Jens Reinemann
95e262d009 chore: Backlog-Status in Board-Skripten ergaenzen
- set-board-status.ps1: 'Backlog' (4ce6ee37) als gueltigen Status erganzt
- create-next-ticket.ps1: -Status Parameter (Todo|Backlog, Default: Todo)
  Todo: Order = min - 1 (naechstes Ticket)
  Backlog: Order = max + 10 (ans Ende gestellt)
  Explizite Status-Setzung via gh project item-edit nach Board-Add
2026-05-17 01:51:18 +02:00
Jens Reinemann
56ac9b1425 feat: Messaging-System mit Offline-First und WebSocket-Push (#58)
## Server
- Messages-Tabelle (id, sender_id, receiver_id, body, sent_at, delivered_at)
- MessageRepository: save/getUndelivered/getConversation/markDelivered (JOIN statt N+1)
- POST /api/messages, GET /api/messages/{userId}: Nachrichten senden/abrufen
- GET /api/users: User-Liste fuer authentifizierte User (ohne eigenen Account)
- WebSocketManager: notifyNewMessage() + isOnline()
- WebSocketRoutes: unzugestellte Nachrichten bei Reconnect pushen
- LoginResponse: userId + username ergaenzt
- Server-Dependency: kotlinx.serialization fuer shared

## App
- MessageEntity + MessageDao (Room, Migration 3->4)
- KrisenvorratDatabase v4, Migrations.MIGRATION_3_4
- MessageRepositoryImpl: Offline-First (isPending), drain bei WebSocket-Connect
- WebSocketEvent.NewMessage -> MessageDto aus shared
- WebSocketClientImpl: new_message-Event parsen
- AUTH_USER_ID in SettingsKeys, SyncServiceImpl speichert userId bei Login
- UserListScreen + UserListViewModel: User-Liste anzeigen
- ChatScreen + ChatViewModel: WhatsApp-Style Chat (links/rechts, Zeitstempel)
- Navigation: Screen.UserList, Screen.Chat, MESSAGES in Bottom-Nav
- RepositoryModule: MessageRepository gebunden

## Tests
- 234 Tests, 0 Fehler
2026-05-16 23:35:25 +02:00
Jens Reinemann
db72a8b4ad ci: Android CI deaktivieren (nur noch manuell per workflow_dispatch) 2026-05-16 18:58:49 +02:00
Jens Reinemann
748140acbd docs: VPS-Deploy Skill hinzufügen (1984 Hosting, Docker, SSH) 2026-05-16 18:47:50 +02:00
Jens Reinemann
1236d61543 docs(device): Wireless ADB workflow und Screenshot-Pull dokumentiert
- Wireless ADB als bevorzugten Verbindungsweg dokumentiert
- Pull-Workflow für Screenshots (exec-out liefert über WLAN korrupte Bilder)
- Hinweis: adb -d nur USB, Wireless braucht adb -s <IP>:<PORT>
- Vollständiger Wireless-Deploy-Workflow (Build/Install/Launch)
2026-05-16 12:55:35 +02:00
Jens Reinemann
d97882cfd6 ci: add Android CI/CD workflow
.github/workflows/android-ci.yml:
- Triggers on push to main and pull requests
- Ubuntu-latest runner with Java 17 (Temurin)
- Gradle cache via gradle/actions/setup-gradle
- Jobs: assembleDebug build + unit tests (./gradlew test)
- Uploads debug APK as workflow artifact (14-day retention)

Closes #14
2026-05-14 21:48:16 +02:00
Jens Reinemann
a27660fd4a feat(ui): add category and location management screens
Closes #25

ui/category/:
- CategoryListViewModel: StateFlow-based ViewModel with add/delete
  dialog state management, backed by CategoryRepository
- CategoryListScreen: Material 3 Scaffold with LazyColumn, FAB for
  adding, delete confirmation dialog with CASCADE warning

ui/location/:
- LocationListViewModel: same pattern for LocationRepository
- LocationListScreen: same UI pattern for location management

Tests:
- CategoryListViewModelTest: 11 tests covering init, add, delete,
  dialog state, blank name rejection
- LocationListViewModelTest: 11 tests (same coverage)

Dependencies:
- Added lifecycle-runtime-compose for collectAsStateWithLifecycle
- Added kotlinx-coroutines-test for ViewModel unit tests
2026-05-14 00:56:36 +02:00
Jens Reinemann
b7cc8db80a chore(prompts): add autopilot prompt for iterative ticket processing
autopilot.prompt.md: new agent prompt (Claude Opus 4.6) that works
through the ticket backlog fully automatically. Each cycle:
1. Runs next-ticket.ps1 – stops cleanly when no tickets remain.
2. Invokes nextstep as a fresh, isolated sub-agent (Claude Opus 4.6)
   per ticket; no context is shared between iterations.
3. Commits with Conventional Commits after each successful ticket.
4. Repeats until queue is empty or an unresolvable error occurs.
2026-05-14 00:09:15 +02:00
Jens Reinemann
4aba9f24a4 chore: Dokumentation, SKILL.md und Drawables aktualisieren 2026-05-13 23:56:56 +02:00
Jens Reinemann
f52724ce0c fix(workflows): Board + Order-Zuweisung in [P]- und [B]-Workflows ergänzen
Beide Workflow-Prompts erstellten Sub-Tickets per gh issue create, setzten
aber weder Board-Zugehörigkeit (gh project item-add) noch Order-Wert
(gh project item-edit). Das führte dazu, dass neue Tickets auf dem Board
ohne Order-Wert blieben und von next-ticket.ps1 nicht gefunden wurden.

Lösung: In workflow-planning.prompt.md (Phase 4) und
workflow-block-planning.prompt.md (Phase 6) einen neuen Pflichtabschnitt
'Board & Order' ergänzt mit den konkreten gh-Befehlen und Verweis auf SKILL.md.
2026-05-13 22:59:56 +02:00
Jens Reinemann
74bf5ef060 fix(gh-tickets): set-board-status akzeptiert 'In Progress' mit Leerzeichen
- ValidateSet entfernt (war zu restriktiv - kein Agent-Fehler mehr bei 'In Progress')
- Normalisierung: 'In Progress' → 'InProgress' via .Trim()/-replace
- Fehlerdetails bei gh-Fehler sichtbar (kein Out-Null mehr)
- Null-Check auf content vor content.number-Vergleich (robuster gegen Draft-Items)
- Board-Fehler mit Exit 1 und Klartext-Meldung
- Getestet: alle 3 Status-Übergänge + 'In Progress' mit Leerzeichen + Fehlerfälle
2026-05-13 22:46:46 +02:00
Jens Reinemann
085d8685a8 docs(skills): align emulator and build docs with actual scripts
android-emulator SKILL.md:
- Added hot-reload and screenshot.ps1 to operations section
- Replaced broken 'exec-out > file' screenshot command with
  screenshot.ps1 reference and UTF-16 corruption warning
- Replaced blocking 'adb wait-for-device' with polling loop + timeout
  (consistent with android-dev.ps1 implementation)
- Added 30s PackageManager wait note after boot

android-build SKILL.md:
- Added screenshot.ps1 section with usage examples
- Documented PowerShell binary redirect UTF-16 bug as known issue

Motivation: docs diverged from scripts after GPU-mode, PM-wait,
screenshot.ps1 and hot-reload changes were added to the scripts.
2026-05-13 22:29:09 +02:00
Jens Reinemann
6603016369 feat(skills): add hot-reload action and robust screenshot script
android-dev.ps1:
- Added 'hot-reload' action: build + force-stop + install + launch on
  a running emulator/device without restart (saves 60-90s vs deploy-emulator)
- Removed 'screenshot' action (replaced by standalone script)

screenshot.ps1 (new):
- Uses adb pull instead of exec-out pipe to avoid PowerShell's UTF-16
  CRLF corruption of binary data (root cause of all broken screenshots)
- Validates PNG magic bytes after capture
- ADB commands wrapped with configurable timeout (prevents hangs)
- Optional -UiDump flag extracts visible text via uiautomator for
  automated verification without image viewing

SKILL.md:
- Documented hot-reload action

app/build.gradle.kts:
- Version bump 1.0 → 1.1 (versionCode 1 → 2)
2026-05-13 22:27:06 +02:00
Jens Reinemann
a9a999fd1e fix(skills): harden deploy scripts for GPU and timing issues
android-dev.ps1:
- Changed GPU mode from 'auto' to 'guest' (host/auto/swiftshader/angle
  all fail with 'OpenGL Core Profile not supported' on this machine)
- Added -no-snapshot-load flag (prevents corrupt snapshot issues)
- Increased PackageManager wait from 5s to 30s (PM needs ~30s after
  sys.boot_completed=1 before adb install succeeds)
- Replaced blocking 'adb wait-for-device' with polling loop (120s timeout)
- Improved emulator-stop with force-kill fallback for hung processes
- Simplified screenshot action: exec-out screencap instead of push/pull/rm
- Made all timing values configurable via variables at top of script

android-emulator SKILL.md:
- Updated manual start command to use -gpu guest
- Updated PM wait time reference from 5s to 30s
- Added known issue #3: OpenGL Core Profile not supported (documents
  symptoms, affected GPU modes, and workaround)
2026-05-13 22:16:11 +02:00
Jens Reinemann
9ea57f89a5 chore(skills): update paths after project move from OneDrive to X:\
android-build SKILL.md:
- Replaced all OneDrive path references with x:\krisenvorrat
- Changed 'OneDrive-Locks' terminology to 'File-Locks'

android-build android-dev.ps1:
- Changed 'OneDrive-Lock' comments to 'File-Lock'
- Script already used dynamic $PSScriptRoot path resolution, no path fix needed

android-emulator SKILL.md:
- Updated path references to new project location

Motivation: project was moved from C:\Users\JensR\OneDrive\Code\krisenvorrat
to x:\krisenvorrat to avoid OneDrive sync issues.
2026-05-13 21:57:13 +02:00
Jens Reinemann
906397fb4c docs(emulator): Pixel-Referenzen als SDK-Basisprofil klarstellen
pixel_7_pro ist nur das SDK-Hardwareprofil, kein Zielgerät. Erklärung
ergänzt, dass kein Samsung-Profil im SDK verfügbar ist und das AVD
über config.ini auf S24-Ultra-Werte angepasst wird.
2026-05-13 17:00:27 +02:00
Jens Reinemann
e2c77b4ba5 chore: temporäre Dateien in tmp/ speichern
Screenshots und andere temporäre Dateien werden jetzt nach tmp/ statt
ins Projekt-Root geschrieben. tmp/ ist in .gitignore eingetragen.
Betrifft android-dev.ps1 Screenshot-Aktion und Skill-Beispiele.
2026-05-13 16:59:26 +02:00
Jens Reinemann
6116a6c6ef docs: Android-Skills und Dev-Skript hinzufügen
Drei Copilot-Skills für den Android-Workflow:
- android-build: Gradle-Build, bekannte Issues (OneDrive, stderr)
- android-emulator: AVD-Verwaltung, Boot-Handling, S24Ultra_API35
- android-device: Physisches Gerät (Samsung S24 Ultra), USB/Wireless ADB

Zentrales PowerShell-Skript android-dev.ps1 mit 13 Aktionen:
build, clean, clean-build, emulator-start/stop, install-emulator/device,
launch, deploy-emulator/device, logcat, devices, screenshot.
Getestet: build, deploy-emulator, screenshot, emulator-stop.
2026-05-13 16:57:24 +02:00
Jens Reinemann
4514e5cef9 chore(prompts): Audit-Prompt für gh-tickets-Skripte
Dokumentiert die 3 in diesem Repo gefundenen Fehlerklassen als
wiederverwendbares Prüf-Prompt für andere Repos mit ähnlichen
gh-tickets PowerShell-Skripten.
2026-05-13 15:11:17 +02:00
Jens Reinemann
8a6882cc56 fix(gh-tickets skill): 3 Bugs in next-ticket + create-next-ticket korrigiert
next-ticket.ps1:
- --json-Flag: Leerzeichen nach Kommas entfernt ('number, title, labels'
  → 'number,title,labels'). gh CLI interpretierte die Felder als 3
  separate Argumente → Fehler 'accepts 1 arg(s), received 3'.
- gh project item-list ohne --limit ergänzt (--limit 200). Das
  Standard-Limit von 20 führt bei >20 Board-Items dazu, dass Tickets
  nicht gefunden werden.

create-next-ticket.ps1:
- Type-Label-Validierung war unvollständig: nur migration, tech-decision
  und infrastructure wurden akzeptiert. Alle 8 gültigen Typen ergänzt
  (block-planning, feature, refactoring, planning, test).
2026-05-13 15:10:28 +02:00
Jens Reinemann
cf05c54a42 chore: Grobplanung abgeschlossen, Planungs-Tickets #2-#11 angelegt 2026-05-13 14:38:58 +02:00
Jens Reinemann
fbac5fbcaf fix: remove spaces in gh CLI --json args (formatter artifact) 2026-05-13 14:02:38 +02:00
Jens Reinemann
5d4e139a2f docs: add original requirements document to Anforderungen/ 2026-05-13 13:54:21 +02:00
Jens Reinemann
f62d069555 chore: update all paths and IDs from kispielwiese to krisenvorrat repo 2026-05-13 13:49:40 +02:00
Jens Reinemann
60d1281b40 chore: initial project setup with Copilot config, skills, and workspace structure 2026-05-13 13:40:41 +02:00