Compare commits
151 Commits
1b20e480f4
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 0817d49dfc | |||
| 44cf2b3edc | |||
| 4acbd6b0b2 | |||
| 843bd145a8 | |||
| 98425b8fa8 | |||
| 5b6459a041 | |||
| d493734660 | |||
| 0aaa160b95 | |||
| 03184aa951 | |||
| 34bd42a009 | |||
| 897394e27e | |||
| 9ab914dbfb | |||
| 9659fe3f8a | |||
| 5cbf4fdfc0 | |||
| bd06efe05d | |||
| 23c3e40390 | |||
| 1201755077 | |||
| 162e2ef414 | |||
| 3f291c907c | |||
| 251647a6ab | |||
| 277254ebbd | |||
| f97bfeff47 | |||
| 02a778751a | |||
| af0ece8ded | |||
| 03fa74abba | |||
| 71aea3f41d | |||
| 16c8674eff | |||
| df5276abf2 | |||
| 636ecc9883 | |||
| 92950dbbe6 | |||
| 5c51664e6c | |||
| 3244efd5e0 | |||
| af02e14f2d | |||
| 8730ffa7db | |||
| f7d11ccf97 | |||
| 76e6cebd90 | |||
| dbbca96c69 | |||
| eea022b862 | |||
| 6de5b55810 | |||
| 07bd114df1 | |||
| 84d38f5eb5 | |||
| 9db85236ec | |||
| f2a6078421 | |||
| 568d9dbb32 | |||
| f620f46d15 | |||
| 46d3d7cf35 | |||
| cb22b1bb96 | |||
| 5544b04b07 | |||
| 49d8b205d7 | |||
| f296a076dc | |||
| 1caefe6603 | |||
| 6b690232ff | |||
| 309834d90c | |||
| 8b44edda90 | |||
| 255343145d | |||
| 5baa971b46 | |||
| e65384768f | |||
| beb20e0cf7 | |||
| 98c241fc64 | |||
| d4cc0eb77d | |||
| e0b1ce8836 | |||
| f18b002f4e | |||
| f8913f81b8 | |||
| 9195cdb14d | |||
| 3f4ba9eea9 | |||
| 92028d9e02 | |||
| bdb45eefe4 | |||
| 148b71db48 | |||
| c54ad3830d | |||
| d66bd63cc9 | |||
| 3b4e3db51d | |||
| 2d7046d0e3 | |||
| d9b5c6bfea | |||
| 91a8c38b25 | |||
| 19ba044ec0 | |||
| 9556e0ac67 | |||
| 4692bd186c | |||
| b11432df16 | |||
| 319cb52160 | |||
| a35dfa1434 | |||
| 237c71e5a0 | |||
| ec124e9acd | |||
| 0ab1807235 | |||
| 7cfdd06d1e | |||
| 544fbf792c | |||
| 18e619abfc | |||
| 5eeff24b3a | |||
| f13c2eb35b | |||
| 2662d4e82e | |||
| 574f8c470c | |||
| 9b4af2bb56 | |||
| 1a295c18c8 | |||
| 01bf440f21 | |||
| 7acd9ea4c2 | |||
| 30b53584f8 | |||
| c1327f3186 | |||
| 7a2c5700f9 | |||
| 5b8ef5ea2d | |||
| db58c24613 | |||
| edfe05cbe3 | |||
| 6feb139a46 | |||
| b94e0f2d9d | |||
| 8806d11e3c | |||
| a1bf93342e | |||
| 5887ac7b6c | |||
| 8aef46bba1 | |||
| 2489beab59 | |||
| f8820847fa | |||
| 345c329350 | |||
| d4aeba4666 | |||
| 9fe889b2c1 | |||
| 85ac1cae9c | |||
| dfaa2e8545 | |||
| bcabb86841 | |||
| 189ebc6565 | |||
| 83adb4ae07 | |||
| 54f91c7309 | |||
| a645bb4dbc | |||
| 691861a706 | |||
| ef5d4fdc81 | |||
| afad3c5a02 | |||
| 512eb730b0 | |||
| 8c1abaebad | |||
| 3428261bff | |||
| 34cab61567 | |||
| 4419e55ee1 | |||
| bd8899a829 | |||
| 8148ceb318 | |||
| 58454ec9af | |||
| 2e7078424d | |||
| 56ecee4cba | |||
| 9222ae7a1c | |||
| 9578b92e7a | |||
| f02e172ff0 | |||
| cef579f91b | |||
| c8655bfc7f | |||
| 28a7c5dc44 | |||
| b19f7cadb8 | |||
| cb6db36adb | |||
| 0e694341b8 | |||
| 2ab1840237 | |||
| 96bdc92723 | |||
| cee0a8437f | |||
| 2b05eebad9 | |||
| 9037b6ce1c | |||
| ec861b8f81 | |||
| 767d78af27 | |||
| 8a3ef98c44 | |||
| dc66dfb537 | |||
| ae39eb4637 | |||
| 64d749be3a |
Vendored
+41
@@ -0,0 +1,41 @@
|
|||||||
|
## 🚀 Identität & Arbeitsmodus (Chamäleon-Modus)
|
||||||
|
Du bist ein hochqualifizierter KI-Assistent für das Softwareprojekt "Meldestelle" von Stefan.
|
||||||
|
Ich weise dir in meinen Prompts Aufgaben zu. Nimm sofort die entsprechende Rolle an, beginne deine Antwort zwingend mit dem passenden Badge und passe dein Vokabular an:
|
||||||
|
|
||||||
|
* 🏗️ **[Lead Architect]:** System-Design, Gradle-Build-Logik, Modulstruktur.
|
||||||
|
* 📜 **[Rulebook Expert]:** Validiert Business-Rules gegen das ÖTO/FEI Regelwerk.
|
||||||
|
* 👷 **[Backend Developer]:** Kotlin & Spring Boot Experte.
|
||||||
|
* 🎨 **[Frontend Expert]:** KMP & Compose Desktop Spezialist.
|
||||||
|
* 🐧 **[DevOps Engineer]:** Infrastruktur (Docker, CI/CD, Proxmox).
|
||||||
|
|
||||||
|
**Arbeitsanweisung:** Bearbeite pro Antwort immer nur EINE fachliche Aufgabe.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 🏗️ Projekt-Strategie (Reality-Reset)
|
||||||
|
1. **Desktop-First & Offline-First:** Das Primärziel ist eine autarke Compose Desktop App (KMP). Sie muss auf Turnieren ohne Internet funktionieren (lokale Persistenz).
|
||||||
|
2. **Optionales Backend:** Ein Spring Boot Stack (PostgreSQL, Valkey, Keycloak) wird nur für Multi-Tenant-Verwaltung, Registrierung und P2P-Sync genutzt.
|
||||||
|
3. **Domain-Driven Design (DDD):** Die absolute Business-Hierarchie lautet: Veranstaltung -> Turnier -> Bewerb/Abteilung.
|
||||||
|
4. **Der System-Akteur:** Der primäre "Actor" in allen Use-Cases ist *nicht* der Veranstalter, sondern zwingend die Person, die die Meldestelle betreut (Actor = Meldestelle).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 🛠️ Der verbindliche Tech-Stack
|
||||||
|
Generiere Code ausschließlich für diese exakten Versionen und Paradigmen:
|
||||||
|
* **Frontend (KMP):** Kotlin 2.3.21, Compose Multiplatform 1.10.3, Ktor Client 3.4.1, SQLDelight.
|
||||||
|
* **Backend:** Spring Boot 3.5.9 (JDK 25), Ktor Server (wo spezifiziert), Exposed 1.1.1.
|
||||||
|
* **Infrastruktur:** Gitea (CI/CD), Docker, Pangolin Tunnel. (KEIN GitHub, KEIN Cloudflare).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 👁️ Anti-Halluzinations-Protokoll
|
||||||
|
Du bist an strikte, evidenzbasierte Entwicklung gebunden:
|
||||||
|
1. **Kein "Erledigt" ohne Beweis:** Ein Task ist erst abgeschlossen, wenn Test-Logs oder ein Build vorliegen.
|
||||||
|
2. **Verifikation ausstehend:** Generierter, ungetesteter Code muss diesen Vermerk zwingend tragen.
|
||||||
|
3. **Fakten-Check:** Wenn du den Code nicht im Kontext hast (z.B. eine spezifische Gradle-Datei), fordere sie aktiv vom User an, anstatt blind zu raten.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 🛡️ DSGVO & Lokale Ausführung (Nolik-Spezifika)
|
||||||
|
* Dein Name ist "Nolik". Du bist ein lokal gehosteter, datenschutzkonformer Senior-Architekt auf dem Server "Simka" (Proxmox VM 101).
|
||||||
|
* **Datensouveränität:** Du bist der Hüter der lokalen Daten. Generiere niemals Code, der Telemetrie, Tracking oder Logging an externe Cloud-Anbieter sendet.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
## 🚀 Identität & Arbeitsmodus (Chamäleon-Modus)
|
||||||
|
Du bist ein hochqualifizierter KI-Assistent für das Softwareprojekt "Meldestelle" von Stefan.
|
||||||
|
Ich weise dir in meinen Prompts Aufgaben zu. Nimm sofort die entsprechende Rolle an, beginne deine Antwort zwingend mit dem passenden Badge und passe dein Vokabular an:
|
||||||
|
|
||||||
|
* 🏗️ **[Lead Architect]:** System-Design, Gradle-Build-Logik, Modulstruktur.
|
||||||
|
* 📜 **[Rulebook Expert]:** Validiert Business-Rules gegen das ÖTO/FEI Regelwerk.
|
||||||
|
* 👷 **[Backend Developer]:** Kotlin & Spring Boot Experte.
|
||||||
|
* 🎨 **[Frontend Expert]:** KMP & Compose Desktop Spezialist.
|
||||||
|
* 🐧 **[DevOps Engineer]:** Infrastruktur (Docker, CI/CD, Proxmox).
|
||||||
|
|
||||||
|
**Arbeitsanweisung:** Bearbeite pro Antwort immer nur EINE fachliche Aufgabe.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
## ⚙️ Provider-Spezifika (Google Gemini / Web-Meta-Modus)
|
||||||
|
* Du agierst als "Gemini" über die Web-Oberfläche. Deine primäre Aufgabe ist die strategische Meta-Ebene, Architektur-Analyse, Review von CI/CD-Pipelines und das Sparring bei komplexen Refactoring-Plänen.
|
||||||
|
* **Antwort-Stil:** Antworte prägnant, strukturiert und nutze das bereitgestellte Formatierungstoolkit (Markdown, klare Hierarchien, Code-Blöcke). Vermeide unnötige Floskeln und komm direkt auf den technischen Punkt.
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
## ⚙️ Provider-Spezifika (JetBrains Junie / IDE-Modus)
|
||||||
|
* Dein Name ist "Junie". Du arbeitest als hochintegrierter KI-Assistent direkt innerhalb von IntelliJ IDEA.
|
||||||
|
* **Kontext-Fokus:** Nutze die lokalen Projektdateien, Indizes und das Git-Log intensiv. Wenn Refactorings oder Code-Generierungen anstehen, achte penibel darauf, dass bestehende Datei-Imports (Kotlin-Packages) nicht zerschossen werden.
|
||||||
|
* **Generierungs-Gate:** Halte dich strikt an die im Projekt hinterlegten Formatierungsregeln für Detekt und Ktlint.
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
## 🛡️ DSGVO & Lokale Ausführung (Nolik-Spezifika)
|
||||||
|
* Dein Name ist "Nolik". Du bist ein lokal gehosteter, datenschutzkonformer Senior-Architekt auf dem Server "Simka" (Proxmox VM 101).
|
||||||
|
* **Datensouveränität:** Du bist der Hüter der lokalen Daten. Generiere niemals Code, der Telemetrie, Tracking oder Logging an externe Cloud-Anbieter sendet.
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
## 🏗️ Projekt-Strategie (Reality-Reset)
|
||||||
|
1. **Desktop-First & Offline-First:** Das Primärziel ist eine autarke Compose Desktop App (KMP). Sie muss auf Turnieren ohne Internet funktionieren (lokale Persistenz).
|
||||||
|
2. **Optionales Backend:** Ein Spring Boot Stack (PostgreSQL, Valkey, Keycloak) wird nur für Multi-Tenant-Verwaltung, Registrierung und P2P-Sync genutzt.
|
||||||
|
3. **Domain-Driven Design (DDD):** Die absolute Business-Hierarchie lautet: Veranstaltung -> Turnier -> Bewerb/Abteilung.
|
||||||
|
4. **Der System-Akteur:** Der primäre "Actor" in allen Use-Cases ist *nicht* der Veranstalter, sondern zwingend die Person, die die Meldestelle betreut (Actor = Meldestelle).
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
## 🛠️ Der verbindliche Tech-Stack
|
||||||
|
Generiere Code ausschließlich für diese exakten Versionen und Paradigmen:
|
||||||
|
* **Frontend (KMP):** Kotlin 2.3.21, Compose Multiplatform 1.10.3, Ktor Client 3.4.1, SQLDelight.
|
||||||
|
* **Backend:** Spring Boot 3.5.9 (JDK 25), Ktor Server (wo spezifiziert), Exposed 1.1.1.
|
||||||
|
* **Infrastruktur:** Gitea (CI/CD), Docker, Pangolin Tunnel. (KEIN GitHub, KEIN Cloudflare).
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
## 👁️ Anti-Halluzinations-Protokoll
|
||||||
|
Du bist an strikte, evidenzbasierte Entwicklung gebunden:
|
||||||
|
1. **Kein "Erledigt" ohne Beweis:** Ein Task ist erst abgeschlossen, wenn Test-Logs oder ein Build vorliegen.
|
||||||
|
2. **Verifikation ausstehend:** Generierter, ungetesteter Code muss diesen Vermerk zwingend tragen.
|
||||||
|
3. **Fakten-Check:** Wenn du den Code nicht im Kontext hast (z.B. eine spezifische Gradle-Datei), fordere sie aktiv vom User an, anstatt blind zu raten.
|
||||||
Executable
+42
@@ -0,0 +1,42 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Nutze Junies robuste Pfad-Ermittlung
|
||||||
|
source "$(dirname "${BASH_SOURCE[0]}")/lib/common.sh"
|
||||||
|
REPO_ROOT="$(resolve_repo_root)"
|
||||||
|
cd "$REPO_ROOT"
|
||||||
|
|
||||||
|
AI_DIR=".ai"
|
||||||
|
DIST_DIR="$AI_DIR/dist"
|
||||||
|
|
||||||
|
mkdir -p "$DIST_DIR"
|
||||||
|
|
||||||
|
echo "[INFO] Generiere System-Prompts aus den Core-Rules..."
|
||||||
|
|
||||||
|
for PROVIDER_DIR in "$AI_DIR/providers/"*; do
|
||||||
|
if [ -d "$PROVIDER_DIR" ]; then
|
||||||
|
PROVIDER_NAME=$(basename "$PROVIDER_DIR")
|
||||||
|
OUTPUT_FILE="$DIST_DIR/${PROVIDER_NAME}-system-prompt.md"
|
||||||
|
|
||||||
|
echo "-> Baue Prompt für: $PROVIDER_NAME"
|
||||||
|
|
||||||
|
# 1. Basis-Identität schreiben
|
||||||
|
cat "$AI_DIR/prompts/system/base.md" > "$OUTPUT_FILE"
|
||||||
|
echo -e "\n\n" >> "$OUTPUT_FILE"
|
||||||
|
|
||||||
|
# 2. Alle globalen Regeln anhängen
|
||||||
|
for RULE_FILE in "$AI_DIR/rules/"*.md; do
|
||||||
|
if [ -f "$RULE_FILE" ]; then
|
||||||
|
cat "$RULE_FILE" >> "$OUTPUT_FILE"
|
||||||
|
echo -e "\n\n" >> "$OUTPUT_FILE"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# 3. Provider-Spezifika anhängen
|
||||||
|
if [ -f "$PROVIDER_DIR/overlay.md" ]; then
|
||||||
|
cat "$PROVIDER_DIR/overlay.md" >> "$OUTPUT_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "[OK] $OUTPUT_FILE erfolgreich erstellt."
|
||||||
|
fi
|
||||||
|
done
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
source "$SCRIPT_DIR/lib/common.sh"
|
||||||
|
|
||||||
|
REPO_ROOT="$(resolve_repo_root)"
|
||||||
|
cd "$REPO_ROOT"
|
||||||
|
|
||||||
|
# check-docs-drift.sh
|
||||||
|
# Zweck: sehr schlanke Drift-Checks gegen die neue Doku-Struktur.
|
||||||
|
# - Kein Guidelines-System mehr.
|
||||||
|
# - Single Source of Truth: `docs/`
|
||||||
|
|
||||||
|
err=0
|
||||||
|
|
||||||
|
has() { grep -q "$2" "$1" || { echo "[DRIFT] '$2' fehlt in $1"; err=1; }; }
|
||||||
|
miss() { grep -q "$2" "$1" && { echo "[DRIFT] Veralteter Begriff '$2' in $1"; err=1; }; }
|
||||||
|
|
||||||
|
# Harte Altlast-Pfade dürfen nicht mehr vorkommen
|
||||||
|
if git grep -n "docs/00_Domain/" -- docs >/dev/null 2>&1; then
|
||||||
|
echo "[DRIFT] Veralteter Pfad 'docs/00_Domain/' in docs/* gefunden"
|
||||||
|
err=1
|
||||||
|
fi
|
||||||
|
if git grep -n "docs/adr/" -- docs >/dev/null 2>&1; then
|
||||||
|
echo "[DRIFT] Veralteter Pfad 'docs/adr/' in docs/* gefunden"
|
||||||
|
err=1
|
||||||
|
fi
|
||||||
|
if git grep -n "docs/c4/" -- docs >/dev/null 2>&1; then
|
||||||
|
echo "[DRIFT] Veralteter Pfad 'docs/c4/' in docs/* gefunden"
|
||||||
|
err=1
|
||||||
|
fi
|
||||||
|
if git grep -n "docs/how-to/" -- docs >/dev/null 2>&1; then
|
||||||
|
echo "[DRIFT] Veralteter Pfad 'docs/how-to/' in docs/* gefunden"
|
||||||
|
err=1
|
||||||
|
fi
|
||||||
|
if git grep -n "docs/reference/" -- docs >/dev/null 2>&1; then
|
||||||
|
echo "[DRIFT] Veralteter Pfad 'docs/reference/' in docs/* gefunden"
|
||||||
|
err=1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Quelle der Wahrheit: Gateway-Technologie (sollte in Architektur/ADRs/C4 konsistent sein)
|
||||||
|
has docs/01_Architecture/ARCHITECTURE.md "Spring Cloud Gateway"
|
||||||
|
has docs/01_Architecture/adr/0007-api-gateway-pattern-de.md "Spring Cloud Gateway"
|
||||||
|
miss docs/01_Architecture/adr/0007-api-gateway-pattern-de.md "Ktor"
|
||||||
|
has docs/01_Architecture/c4/02-container-de.puml "Spring Cloud Gateway"
|
||||||
|
miss docs/01_Architecture/c4/02-container-de.puml "Ktor"
|
||||||
|
|
||||||
|
exit $err
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Common helpers for AI guardrail scripts
|
||||||
|
|
||||||
|
# Robustly resolve the repository root directory.
|
||||||
|
# Strategy: prefer Git; fallback to marker search upwards; last resort: current dir.
|
||||||
|
resolve_repo_root() {
|
||||||
|
local start
|
||||||
|
start="${1:-$(cd -- "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)}"
|
||||||
|
if command -v git >/dev/null 2>&1; then
|
||||||
|
if git -C "$start" rev-parse --show-toplevel >/dev/null 2>&1; then
|
||||||
|
git -C "$start" rev-parse --show-toplevel
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
local dir
|
||||||
|
dir="$(cd "$start" && pwd)"
|
||||||
|
while [ "$dir" != "/" ]; do
|
||||||
|
if [ -f "$dir/gradlew" ] || [ -f "$dir/settings.gradle.kts" ] || [ -d "$dir/.git" ]; then
|
||||||
|
echo "$dir"
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
dir="$(dirname "$dir")"
|
||||||
|
done
|
||||||
|
pwd
|
||||||
|
}
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
source "$SCRIPT_DIR/lib/common.sh"
|
||||||
|
|
||||||
|
REPO_ROOT="$(resolve_repo_root)"
|
||||||
|
cd "$REPO_ROOT"
|
||||||
|
|
||||||
|
mkdir -p build/diagrams
|
||||||
|
shopt -s nullglob
|
||||||
|
for f in docs/architecture/c4/*.puml; do
|
||||||
|
docker run --rm -v "$PWD":/data plantuml/plantuml -tsvg "/data/$f" -o "/data/build/diagrams"
|
||||||
|
echo "Rendered build/diagrams/$(basename "${f%.puml}").svg"
|
||||||
|
done
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
source "$SCRIPT_DIR/lib/common.sh"
|
||||||
|
|
||||||
|
REPO_ROOT="$(resolve_repo_root)"
|
||||||
|
cd "$REPO_ROOT"
|
||||||
|
|
||||||
|
QUICK_MODE=false
|
||||||
|
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
--quick)
|
||||||
|
QUICK_MODE=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--help|-h)
|
||||||
|
cat << 'EOF'
|
||||||
|
Docs Link-Validierung
|
||||||
|
|
||||||
|
USAGE:
|
||||||
|
./.ai/scripts/validate-links.sh [--quick]
|
||||||
|
|
||||||
|
BESCHREIBUNG:
|
||||||
|
Prüft Markdown-Links in `docs/**/*.md` auf gebrochene relative Pfade.
|
||||||
|
Ignoriert externe Links (http/https/mailto) sowie reine Anchors (#...).
|
||||||
|
|
||||||
|
OPTIONEN:
|
||||||
|
--quick Führt nur eine Teilmenge der Prüfungen durch (aktuell nicht implementiert).
|
||||||
|
EOF
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "[ERROR] Unbekannter Parameter: $1" >&2
|
||||||
|
exit 2
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
python3 - <<'PY'
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
from urllib.parse import unquote
|
||||||
|
|
||||||
|
root = Path.cwd()
|
||||||
|
docs_dir = root / "docs"
|
||||||
|
|
||||||
|
if not docs_dir.is_dir():
|
||||||
|
print(f"[ERROR] docs-Verzeichnis nicht gefunden: {docs_dir}", file=sys.stderr)
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
|
# Veraltete Pfad-Prüfungen wurden entfernt; Fokus auf Link-Integrität.
|
||||||
|
FORBIDDEN_SUBSTRINGS = []
|
||||||
|
|
||||||
|
md_files = sorted(docs_dir.rglob("*.md"))
|
||||||
|
|
||||||
|
link_pattern = re.compile(r"\]\(([^)]+)\)")
|
||||||
|
|
||||||
|
errors = 0
|
||||||
|
|
||||||
|
def is_external(target: str) -> bool:
|
||||||
|
t = target.lower()
|
||||||
|
return t.startswith("http://") or t.startswith("https://") or t.startswith("mailto:")
|
||||||
|
|
||||||
|
def strip_fragment_and_query(target: str) -> str:
|
||||||
|
target = target.split("#", 1)[0]
|
||||||
|
target = target.split("?", 1)[0]
|
||||||
|
return target
|
||||||
|
|
||||||
|
for f in md_files:
|
||||||
|
text = f.read_text(encoding="utf-8", errors="replace")
|
||||||
|
|
||||||
|
for forbidden in FORBIDDEN_SUBSTRINGS:
|
||||||
|
if forbidden in text:
|
||||||
|
print(f"[ERROR] Veralteter Pfad '{forbidden}' in {f}")
|
||||||
|
errors += 1
|
||||||
|
|
||||||
|
for match in link_pattern.finditer(text):
|
||||||
|
target = match.group(1).strip()
|
||||||
|
|
||||||
|
if not target:
|
||||||
|
continue
|
||||||
|
if is_external(target):
|
||||||
|
continue
|
||||||
|
if target.startswith("#"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if target.startswith("<") and target.endswith(">"):
|
||||||
|
target = target[1:-1]
|
||||||
|
|
||||||
|
target = unquote(strip_fragment_and_query(target))
|
||||||
|
|
||||||
|
if target.startswith("/"):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if ":" in target.split("/", 1)[0]:
|
||||||
|
# z.B. "vscode:..."
|
||||||
|
continue
|
||||||
|
|
||||||
|
resolved = (f.parent / target).resolve()
|
||||||
|
|
||||||
|
try:
|
||||||
|
resolved.relative_to(root.resolve())
|
||||||
|
except ValueError:
|
||||||
|
print(f"[ERROR] Link zeigt außerhalb des Repos: {f} -> {target}")
|
||||||
|
errors += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
if resolved.is_dir():
|
||||||
|
if not (resolved / "README.md").is_file():
|
||||||
|
print(f"[ERROR] Verlinktes Verzeichnis ohne README.md: {f} -> {target}")
|
||||||
|
errors += 1
|
||||||
|
continue
|
||||||
|
|
||||||
|
if not resolved.exists():
|
||||||
|
print(f"[ERROR] Broken link: {f} -> {target}")
|
||||||
|
errors += 1
|
||||||
|
|
||||||
|
if errors:
|
||||||
|
print(f"[ERROR] Link-Validierung fehlgeschlagen: {errors} Fehler")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print(f"[OK] Link-Validierung erfolgreich: {len(md_files)} Markdown-Dateien geprüft")
|
||||||
|
PY
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
apply: always
|
||||||
|
---
|
||||||
|
|
||||||
+1
-1
@@ -193,7 +193,7 @@ secrets/
|
|||||||
# ===================================================================
|
# ===================================================================
|
||||||
TODO*.md
|
TODO*.md
|
||||||
NOTES*.md
|
NOTES*.md
|
||||||
**/.junie/
|
.junie/
|
||||||
|
|
||||||
# ===================================================================
|
# ===================================================================
|
||||||
# Keep essential files (override exclusions)
|
# Keep essential files (override exclusions)
|
||||||
|
|||||||
@@ -0,0 +1,263 @@
|
|||||||
|
# ==========================================
|
||||||
|
# Meldestelle – Docker Compose Environment
|
||||||
|
# Single Source of Truth (SSoT)
|
||||||
|
# ==========================================
|
||||||
|
# WARNING: This file contains secrets (passwords).
|
||||||
|
# Do NOT commit this file to version control if it contains production secrets.
|
||||||
|
|
||||||
|
# --- PROJECT ---
|
||||||
|
PROJECT_NAME=meldestelle
|
||||||
|
|
||||||
|
# --- BACKUP ---
|
||||||
|
BACKUP_DIR=/home/stefan/backups/meldestelle
|
||||||
|
BACKUP_RETENTION_DAYS=7
|
||||||
|
|
||||||
|
# Docker build versions (optional overrides)
|
||||||
|
DOCKER_VERSION=1.0.0-SNAPSHOT
|
||||||
|
DOCKER_REGISTRY=git.mo-code.at/mocode-software/meldestelle
|
||||||
|
DOCKER_BUILD_DATE=2026-03-16T12:00:00Z
|
||||||
|
DOCKER_GRADLE_VERSION=9.3.1
|
||||||
|
DOCKER_JAVA_VERSION=25
|
||||||
|
DOCKER_NODE_VERSION=24.12.0
|
||||||
|
DOCKER_NGINX_VERSION=1.28.0-alpine
|
||||||
|
DOCKER_CADDY_VERSION=2.11-alpine
|
||||||
|
|
||||||
|
# JVM Power Flags (Lokal leer lassen, da Intel/AMD Architektur)
|
||||||
|
JVM_OPTS_ARM64=
|
||||||
|
|
||||||
|
# --- POSTGRES ---
|
||||||
|
POSTGRES_IMAGE=postgres:16-alpine
|
||||||
|
POSTGRES_SHARED_BUFFERS=256MB
|
||||||
|
POSTGRES_EFFECTIVE_CACHE_SIZE=768MB
|
||||||
|
POSTGRES_USER=pg-user
|
||||||
|
POSTGRES_PASSWORD=pg-password
|
||||||
|
POSTGRES_DB=pg-meldestelle-db
|
||||||
|
POSTGRES_PORT=5432:5432
|
||||||
|
POSTGRES_DB_URL=jdbc:postgresql://postgres:5432/pg-meldestelle-db
|
||||||
|
|
||||||
|
# --- VALKEY (formerly Redis) ---
|
||||||
|
VALKEY_IMAGE=valkey/valkey:9-alpine
|
||||||
|
VALKEY_PASSWORD=valkey-password
|
||||||
|
VALKEY_PORT=6379:6379
|
||||||
|
VALKEY_SERVER_HOSTNAME=valkey
|
||||||
|
VALKEY_SERVER_PORT=6379
|
||||||
|
VALKEY_SERVER_CONNECT_TIMEOUT=5s
|
||||||
|
VALKEY_POLICY=allkeys-lru
|
||||||
|
VALKEY_MAX_MEMORY=256MB
|
||||||
|
SPRING_DATA_VALKEY_HOST=localhost
|
||||||
|
SPRING_DATA_VALKEY_PORT=6379
|
||||||
|
SPRING_DATA_VALKEY_PASSWORD=valkey-password
|
||||||
|
|
||||||
|
# --- KEYCLOAK ---
|
||||||
|
KEYCLOAK_IMAGE_TAG=latest
|
||||||
|
KC_HEAP_MIN=512M
|
||||||
|
KC_HEAP_MAX=1024M
|
||||||
|
# Lokale Entwicklung: start-dev (kein Pre-Build nötig, kein --optimized)
|
||||||
|
# Server/Produktion: start --optimized --import-realm (nutzt das pre-built Registry-Image)
|
||||||
|
KC_COMMAND=start-dev --import-realm
|
||||||
|
# System-Admin (Master Console)
|
||||||
|
KC_BOOTSTRAP_ADMIN_USERNAME=kc-admin
|
||||||
|
KC_BOOTSTRAP_ADMIN_PASSWORD=kc-password
|
||||||
|
# Fach-Admin User Passwort (wird im Realm Import genutzt)
|
||||||
|
# Hinweis: Wenn du das hier änderst, müsstest du auch die JSON anpassen
|
||||||
|
# oder dort eine Variable nutzen.
|
||||||
|
|
||||||
|
KC_DB=postgres
|
||||||
|
KC_DB_SCHEMA=keycloak
|
||||||
|
KC_DB_URL=jdbc:postgresql://postgres:5432/pg-meldestelle-db
|
||||||
|
KC_DB_USERNAME=pg-user
|
||||||
|
KC_DB_PASSWORD=meldestelle
|
||||||
|
|
||||||
|
# Lokal: localhost | Server: echte IP oder Domain (z.B. 10.0.0.50 oder auth.meldestelle.at)
|
||||||
|
# WICHTIG: Nur den Hostnamen angeben, OHNE Port (Keycloak 26.x hostname v2)
|
||||||
|
KC_HOSTNAME=localhost
|
||||||
|
# false = Zugriff über beliebige Hostnamen erlaubt (nötig ohne TLS / für HTTP-Betrieb)
|
||||||
|
KC_HOSTNAME_STRICT=false
|
||||||
|
KC_HOSTNAME_STRICT_HTTPS=false
|
||||||
|
KC_PORT=8180:8080
|
||||||
|
KC_MANAGEMENT_PORT=9000:9000
|
||||||
|
|
||||||
|
KC_HTTP_ENABLE=true
|
||||||
|
|
||||||
|
KC_API_GATEWAY_CLIENT_SECRET=K5RqonwVOaxPKaXVH4mbthSRbjRh5tOK
|
||||||
|
# KC_POSTMAN_CLIENT_SECRET=postman-secret-123
|
||||||
|
# KC_BOOTSTRAP_ADMIN_PASSWORD=Admin#1234
|
||||||
|
KC_FRONTEND_URL=http://localhost:8180
|
||||||
|
KC_PROXY_HEADERS=xforwarded
|
||||||
|
|
||||||
|
# --- KEYCLOAK TOKEN VALIDATION ---
|
||||||
|
# Public Issuer URI (must match the token issuer from browser/postman)
|
||||||
|
# Lokal: http://localhost:8180 | Produktion: http://10.0.0.50:8180
|
||||||
|
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_ISSUER_URI=http://localhost:8180/realms/meldestelle
|
||||||
|
# Internal JWK Set URI (for service-to-service communication within Docker)
|
||||||
|
SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWK_SET_URI=http://keycloak:8080/realms/meldestelle/protocol/openid-connect/certs
|
||||||
|
|
||||||
|
# --- CONSUL ---
|
||||||
|
CONSUL_IMAGE=hashicorp/consul:1.22.1
|
||||||
|
CONSUL_PORT=8500:8500
|
||||||
|
CONSUL_UDP_PORT=8600:8600/udp
|
||||||
|
CONSUL_HOST=consul
|
||||||
|
CONSUL_HTTP_PORT=8500
|
||||||
|
SPRING_CLOUD_CONSUL_HOST=consul
|
||||||
|
SPRING_CLOUD_CONSUL_PORT=8500
|
||||||
|
SPRING_CLOUD_CONSUL_DISCOVERY_SERVICE_NAME=api-gateway
|
||||||
|
SPRING_CLOUD_CONSUL_DISCOVERY_PREFER_IP_ADDRESS=true
|
||||||
|
|
||||||
|
# --- Zipkin ---
|
||||||
|
ZIPKIN_IMAGE=openzipkin/zipkin:3
|
||||||
|
ZIPKIN_MIN_HEAP=256M
|
||||||
|
ZIPKIN_MAX_HEAP=512M
|
||||||
|
ZIPKIN_PORT=9411:9411
|
||||||
|
ZIPKIN_ENDPOINT=http://zipkin:9411/api/v2/spans
|
||||||
|
ZIPKIN_SAMPLING_PROBABILITY=1.0
|
||||||
|
|
||||||
|
# --- Mailpit ---
|
||||||
|
MAILPIT_IMAGE=axllent/mailpit:v1.29
|
||||||
|
MAILPIT_WEB_PORT=8025:8025
|
||||||
|
MAILPIT_SMTP_PORT=1025:1025
|
||||||
|
|
||||||
|
# --- PGADMIN ---
|
||||||
|
PGADMIN_IMAGE=dpage/pgadmin4:8
|
||||||
|
PGADMIN_EMAIL=meldestelle@mo-code.at
|
||||||
|
PGADMIN_PASSWORD=pgadmin
|
||||||
|
PGADMIN_PORT=8888:80
|
||||||
|
|
||||||
|
# --- POSTGRES-EXPORTER ---
|
||||||
|
POSTGRES_EXPORTER_IMAGE=prometheuscommunity/postgres-exporter:v0.18.0
|
||||||
|
|
||||||
|
# --- ALERTMANAGER ---
|
||||||
|
ALERTMANAGER_IMAGE=prom/alertmanager:v0.29.0
|
||||||
|
ALERTMANAGER_PORT=9093:9093
|
||||||
|
|
||||||
|
# --- PROMETHEUS ---
|
||||||
|
PROMETHEUS_IMAGE=prom/prometheus:v3.7.3
|
||||||
|
PROMETHEUS_PORT=9090:9090
|
||||||
|
|
||||||
|
# --- GRAFANA ---
|
||||||
|
GF_IMAGE=grafana/grafana:12.3
|
||||||
|
GF_ADMIN_USER=gf-admin
|
||||||
|
GF_ADMIN_PASSWORD=gf-password
|
||||||
|
GF_PORT=3000:3000
|
||||||
|
|
||||||
|
# --- API-GATEWAY ---
|
||||||
|
GATEWAY_PORT=8081:8081
|
||||||
|
GATEWAY_DEBUG_PORT=5005:5005
|
||||||
|
GATEWAY_SERVER_PORT=8081
|
||||||
|
GATEWAY_SPRING_PROFILES_ACTIVE=docker
|
||||||
|
GATEWAY_DEBUG=true
|
||||||
|
GATEWAY_SERVICE_NAME=api-gateway
|
||||||
|
GATEWAY_CONSUL_PREFER_IP=true
|
||||||
|
|
||||||
|
# --- PING-SERVICE ---
|
||||||
|
PING_SPRING_PROFILES_ACTIVE=docker
|
||||||
|
PING_PORT=8082:8082
|
||||||
|
PING_DEBUG_PORT=5006:5006
|
||||||
|
PING_SERVER_PORT=8082
|
||||||
|
PING_DEBUG=true
|
||||||
|
PING_SERVICE_NAME=ping-service
|
||||||
|
PING_CONSUL_PREFER_IP=true
|
||||||
|
|
||||||
|
# --- MAIL-SERVICE ---
|
||||||
|
MAIL_PORT=8083:8083
|
||||||
|
MAIL_DEBUG_PORT=5014:5014
|
||||||
|
MAIL_SERVER_PORT=8083
|
||||||
|
MAIL_SERVICE_URL=http://10.0.0.50:8092
|
||||||
|
|
||||||
|
MAIL_SPRING_PROFILES_ACTIVE=docker
|
||||||
|
MAIL_DEBUG=true
|
||||||
|
MAIL_SERVICE_NAME=mail-service
|
||||||
|
MAIL_CONSUL_PREFER_IP=true
|
||||||
|
MAIL_SMTP_HOST=smtp.world4you.com
|
||||||
|
MAIL_SMTP_PORT=587
|
||||||
|
MAIL_SMTP_USER=online-nennen@mo-code.at
|
||||||
|
MAIL_SMTP_PASSWORD=Mogi#2reiten
|
||||||
|
MAIL_SMTP_AUTH=true
|
||||||
|
MAIL_SMTP_STARTTLS=true
|
||||||
|
|
||||||
|
SPRING_MAIL_HOST=smtp.world4you.com
|
||||||
|
SPRING_MAIL_PORT=587
|
||||||
|
SPRING_MAIL_USERNAME=online-nennen@mo-code.at
|
||||||
|
SPRING_MAIL_PASSWORD=Mogi#2reiten
|
||||||
|
SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH=false
|
||||||
|
SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE=false
|
||||||
|
SPRING_CLOUD_CONSUL_DISCOVERY_ENABLED=false
|
||||||
|
SPRING_CLOUD_CONSUL_ENABLED=false
|
||||||
|
MAIL_POLLING_ENABLED=false
|
||||||
|
|
||||||
|
|
||||||
|
# --- MASTERDATA-SERVICE ---
|
||||||
|
MASTERDATA_PORT=8086:8086
|
||||||
|
MASTERDATA_DEBUG_PORT=5007:5007
|
||||||
|
MASTERDATA_SERVER_PORT=8086
|
||||||
|
MASTERDATA_KTOR_PORT=8091
|
||||||
|
MASTERDATA_SPRING_PROFILES_ACTIVE=docker
|
||||||
|
MASTERDATA_DEBUG=true
|
||||||
|
MASTERDATA_SERVICE_NAME=masterdata-service
|
||||||
|
MASTERDATA_CONSUL_PREFER_IP=true
|
||||||
|
MASTERDATA_SERVICE_HOSTNAME=masterdata-service
|
||||||
|
|
||||||
|
# --- EVENTS-SERVICE ---
|
||||||
|
EVENTS_PORT=8085:8085
|
||||||
|
EVENTS_DEBUG_PORT=5008:5008
|
||||||
|
EVENTS_SERVER_PORT=8085
|
||||||
|
EVENTS_SPRING_PROFILES_ACTIVE=docker
|
||||||
|
EVENTS_DEBUG=true
|
||||||
|
EVENTS_SERVICE_NAME=events-service
|
||||||
|
EVENTS_CONSUL_PREFER_IP=true
|
||||||
|
|
||||||
|
# --- ZNS-IMPORT-SERVICE ---
|
||||||
|
ZNS_IMPORT_PORT=8095:8095
|
||||||
|
ZNS_IMPORT_DEBUG_PORT=5009:5009
|
||||||
|
ZNS_IMPORT_SERVER_PORT=8095
|
||||||
|
ZNS_IMPORT_SPRING_PROFILES_ACTIVE=docker
|
||||||
|
ZNS_IMPORT_DEBUG=true
|
||||||
|
ZNS_IMPORT_SERVICE_NAME=zns-import-service
|
||||||
|
ZNS_IMPORT_CONSUL_PREFER_IP=true
|
||||||
|
|
||||||
|
# --- RESULTS-SERVICE ---
|
||||||
|
RESULTS_PORT=8088:8088
|
||||||
|
RESULTS_DEBUG_PORT=5010:5010
|
||||||
|
RESULTS_SERVER_PORT=8088
|
||||||
|
RESULTS_SPRING_PROFILES_ACTIVE=docker
|
||||||
|
RESULTS_DEBUG=true
|
||||||
|
RESULTS_SERVICE_NAME=results-service
|
||||||
|
RESULTS_CONSUL_PREFER_IP=true
|
||||||
|
|
||||||
|
# --- BILLING-SERVICE ---
|
||||||
|
BILLING_PORT=8087:8087
|
||||||
|
BILLING_DEBUG_PORT=5012:5012
|
||||||
|
BILLING_SERVER_PORT=8087
|
||||||
|
BILLING_SPRING_PROFILES_ACTIVE=docker
|
||||||
|
BILLING_DEBUG=true
|
||||||
|
BILLING_SERVICE_NAME=billing-service
|
||||||
|
BILLING_CONSUL_PREFER_IP=true
|
||||||
|
|
||||||
|
# --- SCHEDULING-SERVICE ---
|
||||||
|
SCHEDULING_PORT=8084:8084
|
||||||
|
SCHEDULING_DEBUG_PORT=5013:5013
|
||||||
|
SCHEDULING_SERVER_PORT=8084
|
||||||
|
SCHEDULING_SPRING_PROFILES_ACTIVE=docker
|
||||||
|
SCHEDULING_DEBUG=true
|
||||||
|
SCHEDULING_SERVICE_NAME=scheduling-service
|
||||||
|
SCHEDULING_CONSUL_PREFER_IP=true
|
||||||
|
|
||||||
|
# --- SERIES-SERVICE ---
|
||||||
|
SERIES_PORT=8089:8089
|
||||||
|
SERIES_DEBUG_PORT=5011:5011
|
||||||
|
SERIES_SERVER_PORT=8089
|
||||||
|
SERIES_SPRING_PROFILES_ACTIVE=docker
|
||||||
|
SERIES_DEBUG=true
|
||||||
|
SERIES_SERVICE_NAME=series-service
|
||||||
|
SERIES_CONSUL_PREFER_IP=true
|
||||||
|
|
||||||
|
# --- WEB-APP ---
|
||||||
|
CADDY_VERSION=2.11-alpine
|
||||||
|
WEB_APP_PORT=8080:80
|
||||||
|
WEB_BUILD_PROFILE=dev
|
||||||
|
# Lokal: http://localhost:8081 | Produktion: http://10.0.0.50:8081
|
||||||
|
WEB_APP_API_URL=http://localhost:8081
|
||||||
|
WEB_APP_KEYCLOAK_URL=http://auth.mo-code.at
|
||||||
|
|
||||||
|
# --- DESKTOP-APP ---
|
||||||
|
DESKTOP_APP_VNC_PORT=5901:5901
|
||||||
|
DESKTOP_APP_NOVNC_PORT=6080:6080
|
||||||
@@ -1,13 +1,24 @@
|
|||||||
name: Desktop CI — Headless Tests & Build
|
name: Desktop CI — Headless Tests & Build
|
||||||
|
|
||||||
on:
|
on:
|
||||||
|
# Nur ausführen, wenn explizit das Desktop-Shell-Modul geändert wurde
|
||||||
push:
|
push:
|
||||||
branches: [ main, master ]
|
branches: [ main, master ]
|
||||||
|
paths:
|
||||||
|
- 'frontend/shells/meldestelle-desktop/**'
|
||||||
|
- '.gitea/workflows/desktop-tests.yml'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ main, master ]
|
branches: [ main, master ]
|
||||||
|
paths:
|
||||||
|
- 'frontend/shells/meldestelle-desktop/**'
|
||||||
|
# Manuell startbar, falls benötigt
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
desktop-tests:
|
desktop-tests:
|
||||||
|
# Komplett deaktivierbar über Repo-Variable: Settings → Variables → DESKTOP_CI_ENABLED=true
|
||||||
|
# Zusätzlich: Für Plan‑B‑Builds überspringen, wenn Commit-Message [planb] enthält
|
||||||
|
if: ${{ vars.DESKTOP_CI_ENABLED == 'true' && !contains(gitea.event.head_commit.message, '[planb]') }}
|
||||||
name: Compose Desktop — Tests (headless) & Build
|
name: Compose Desktop — Tests (headless) & Build
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
@@ -38,12 +49,12 @@ jobs:
|
|||||||
- name: Show Gradle version
|
- name: Show Gradle version
|
||||||
run: ./gradlew --version
|
run: ./gradlew --version
|
||||||
|
|
||||||
- name: Run Desktop tests headless (Xvfb)
|
- name: Run Desktop tests headless (xvfb)
|
||||||
env:
|
env:
|
||||||
_JAVA_OPTIONS: -Djava.awt.headless=true
|
_JAVA_OPTIONS: -Djava.awt.headless=true
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update -y
|
sudo apt-get update -y
|
||||||
sudo apt-get install -y Xvfb
|
sudo apt-get install -y xvfb xauth
|
||||||
xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" \
|
xvfb-run --auto-servernum --server-args="-screen 0 1920x1080x24" \
|
||||||
./gradlew :frontend:shells:meldestelle-desktop:jvmTest --stacktrace --no-daemon
|
./gradlew :frontend:shells:meldestelle-desktop:jvmTest --stacktrace --no-daemon
|
||||||
|
|
||||||
|
|||||||
@@ -33,18 +33,11 @@ jobs:
|
|||||||
max-parallel: 1
|
max-parallel: 1
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- service: keycloak
|
# Plan-B fokussiert: Nur Mail-Service + Web-App bauen/pushen (beschleunigt CI deutlich)
|
||||||
|
- service: mail-service
|
||||||
context: .
|
context: .
|
||||||
dockerfile: config/docker/keycloak/Dockerfile
|
dockerfile: backend/services/mail/Dockerfile
|
||||||
image: keycloak
|
image: mail-service
|
||||||
- service: api-gateway
|
|
||||||
context: .
|
|
||||||
dockerfile: backend/infrastructure/gateway/Dockerfile
|
|
||||||
image: api-gateway
|
|
||||||
- service: ping-service
|
|
||||||
context: .
|
|
||||||
dockerfile: backend/services/ping/Dockerfile
|
|
||||||
image: ping-service
|
|
||||||
- service: web-app
|
- service: web-app
|
||||||
context: .
|
context: .
|
||||||
dockerfile: config/docker/caddy/web-app/Dockerfile
|
dockerfile: config/docker/caddy/web-app/Dockerfile
|
||||||
@@ -61,43 +54,42 @@ jobs:
|
|||||||
distribution: "temurin"
|
distribution: "temurin"
|
||||||
cache: gradle
|
cache: gradle
|
||||||
|
|
||||||
- name: Setup Gradle Cache
|
# --- SCHRITT 1: Build mit radikalem Clean (gegen die März-Leichen) ---
|
||||||
uses: actions/cache@v4
|
- name: Build Frontend (Wasm JS)
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
~/.gradle/caches
|
|
||||||
~/.gradle/wrapper
|
|
||||||
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
|
||||||
restore-keys: |
|
|
||||||
${{ runner.os }}-gradle-
|
|
||||||
|
|
||||||
# Verhindert mysteriöse Build-Fehler durch korrupte Node/Kotlin-Caches (nur web-app relevant)
|
|
||||||
- name: Cleanup stale build caches
|
|
||||||
if: matrix.service == 'web-app'
|
|
||||||
run: |
|
|
||||||
rm -rf frontend/shells/meldestelle-portal/build/js/node_modules/.cache || true
|
|
||||||
rm -rf frontend/shells/meldestelle-portal/build/js/.yarn/cache || true
|
|
||||||
rm -rf ~/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-compiler-embeddable || true
|
|
||||||
|
|
||||||
- name: Build Frontend (Kotlin JS)
|
|
||||||
if: matrix.service == 'web-app'
|
if: matrix.service == 'web-app'
|
||||||
run: |
|
run: |
|
||||||
chmod +x gradlew
|
chmod +x gradlew
|
||||||
./gradlew :frontend:shells:meldestelle-portal:jsBrowserDistribution \
|
# Löscht alte Build-Stände komplett
|
||||||
|
./gradlew :frontend:shells:meldestelle-web:clean
|
||||||
|
|
||||||
|
./gradlew :frontend:shells:meldestelle-web:wasmJsBrowserDistribution \
|
||||||
-Pproduction=true \
|
-Pproduction=true \
|
||||||
--max-workers=4 \
|
--max-workers=4 \
|
||||||
-Dkotlin.daemon.jvm.options="-Xmx4g"
|
-Dkotlin.daemon.jvm.options="-Xmx4g"
|
||||||
|
|
||||||
# Pangolin-Bypass: Credentials direkt in config.json schreiben.
|
# --- SCHRITT 2: Staging ohne rsync (Fix für dein Log-Fehler) ---
|
||||||
# Kein "docker login" → kein Daemon-Ping → kein HTTPS-Fehler.
|
- name: Stage Web Assets for Docker build
|
||||||
# BuildKit liest ~/.docker/config.json und verwendet diese Credentials beim Push.
|
if: matrix.service == 'web-app'
|
||||||
# - name: Registry-Credentials konfigurieren (kein Daemon-Kontakt)
|
run: |
|
||||||
# run: |
|
set -e
|
||||||
# mkdir -p ~/.docker
|
DIST_DIR="frontend/shells/meldestelle-web/build/dist/wasmJs/productionExecutable"
|
||||||
# AUTH=$(echo -n "${{ secrets.REGISTRY_USER }}:${{ secrets.REGISTRY_TOKEN }}" | base64 -w 0)
|
TARGET_DIR="config/docker/caddy/web-app/_site"
|
||||||
# printf '{"auths":{"%s":{"auth":"%s"}}}\n' "${{ env.REGISTRY_INTERNAL }}" "${AUTH}" > ~/.docker/config.json
|
|
||||||
# echo "✓ Credentials für ${{ env.REGISTRY_INTERNAL }} gespeichert"
|
|
||||||
|
|
||||||
|
if [ ! -d "$DIST_DIR" ]; then
|
||||||
|
echo "❌ Fehler: Build-Verzeichnis nicht gefunden!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ersetzt rsync durch sicheres Löschen & Kopieren
|
||||||
|
rm -rf "$TARGET_DIR"
|
||||||
|
mkdir -p "$TARGET_DIR"
|
||||||
|
cp -r "$DIST_DIR"/. "$TARGET_DIR/"
|
||||||
|
# Kopiere Turnier-Ausschreibungen (PDFs) für Plan-B
|
||||||
|
cp docs/Neumarkt2026/*.pdf "$TARGET_DIR/" || true
|
||||||
|
|
||||||
|
echo "✓ Assets für Docker vorbereitet (Stand: $(date))"
|
||||||
|
|
||||||
|
# --- SCHRITT 3: Login & BuildX ---
|
||||||
# NEU (sauber, nach daemon.json-Fix):
|
# NEU (sauber, nach daemon.json-Fix):
|
||||||
- name: Login to Gitea Registry
|
- name: Login to Gitea Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
@@ -122,7 +114,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
images: ${{ env.REGISTRY_INTERNAL }}/${{ env.IMAGE_PREFIX }}/${{ matrix.image }}
|
images: ${{ env.REGISTRY_INTERNAL }}/${{ env.IMAGE_PREFIX }}/${{ matrix.image }}
|
||||||
tags: |
|
tags: |
|
||||||
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
|
type=raw,value=latest
|
||||||
type=sha,format=long
|
type=sha,format=long
|
||||||
|
|
||||||
- name: Build and push Docker image
|
- name: Build and push Docker image
|
||||||
@@ -137,9 +129,5 @@ jobs:
|
|||||||
provenance: false
|
provenance: false
|
||||||
sbom: false
|
sbom: false
|
||||||
build-args: |
|
build-args: |
|
||||||
DOCKER_BUILD_DATE=$(date -u +'%Y-%m-%dT%H:%M:%SZ')
|
BUILD_DATE=${{ github.event.head_commit.timestamp || 'unknown' }}
|
||||||
VERSION=${{ github.sha }}
|
VERSION=${{ github.sha }}
|
||||||
GRADLE_VERSION=${{ env.GRADLE_VERSION }}
|
|
||||||
JAVA_VERSION=${{ env.JAVA_VERSION }}
|
|
||||||
KEYCLOAK_IMAGE_TAG=${{ env.KEYCLOAK_IMAGE_TAG }}
|
|
||||||
JVM_OPTS_APPEND=${{ env.JVM_OPTS_ARM64 }}
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ on:
|
|||||||
branches: [ "**" ]
|
branches: [ "**" ]
|
||||||
jobs:
|
jobs:
|
||||||
no-hardcoded-versions:
|
no-hardcoded-versions:
|
||||||
|
# Für Plan-B-Builds überspringen: Commit-Message enthält [planb]
|
||||||
|
if: ${{ !contains(gitea.event.head_commit.message, '[planb]') }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|||||||
@@ -22,6 +22,8 @@ jobs:
|
|||||||
# =============================================================
|
# =============================================================
|
||||||
tag-release:
|
tag-release:
|
||||||
name: 🏷️ Git-Tag setzen
|
name: 🏷️ Git-Tag setzen
|
||||||
|
# Für Plan-B-Builds überspringen: Commit-Message enthält [planb]
|
||||||
|
if: ${{ !contains(gitea.event.head_commit.message, '[planb]') }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
version: ${{ steps.read-version.outputs.version }}
|
version: ${{ steps.read-version.outputs.version }}
|
||||||
@@ -62,7 +64,7 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Git-Tag erstellen & pushen
|
- name: Git-Tag erstellen & pushen
|
||||||
if: steps.check-tag.outputs.already_tagged == 'false' && github.event.inputs.dry_run != 'true'
|
if: steps.check-tag.outputs.already_tagged == 'false' && gitea.event.inputs.dry_run != 'true'
|
||||||
run: |
|
run: |
|
||||||
TAG="${{ steps.read-version.outputs.tag }}"
|
TAG="${{ steps.read-version.outputs.tag }}"
|
||||||
VERSION="${{ steps.read-version.outputs.version }}"
|
VERSION="${{ steps.read-version.outputs.version }}"
|
||||||
@@ -77,6 +79,8 @@ jobs:
|
|||||||
# =============================================================
|
# =============================================================
|
||||||
package-linux:
|
package-linux:
|
||||||
name: 📦 Linux .deb Packaging
|
name: 📦 Linux .deb Packaging
|
||||||
|
# Nur ausführen, wenn Desktop-CI explizit aktiviert ist UND kein Plan‑B Commit
|
||||||
|
if: ${{ vars.DESKTOP_CI_ENABLED == 'true' && !contains(gitea.event.head_commit.message, '[planb]') }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: tag-release
|
needs: tag-release
|
||||||
|
|
||||||
@@ -84,11 +88,11 @@ jobs:
|
|||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup JDK 21 (Temurin)
|
- name: Setup JDK 25 (Temurin)
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: temurin
|
distribution: temurin
|
||||||
java-version: '21'
|
java-version: '25'
|
||||||
|
|
||||||
- name: Gradle cache
|
- name: Gradle cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -123,6 +127,8 @@ jobs:
|
|||||||
# =============================================================
|
# =============================================================
|
||||||
package-windows:
|
package-windows:
|
||||||
name: 📦 Windows .msi Packaging
|
name: 📦 Windows .msi Packaging
|
||||||
|
# Nur ausführen, wenn Desktop-CI explizit aktiviert ist UND kein Plan‑B Commit
|
||||||
|
if: ${{ vars.DESKTOP_CI_ENABLED == 'true' && !contains(gitea.event.head_commit.message, '[planb]') }}
|
||||||
runs-on: windows-latest
|
runs-on: windows-latest
|
||||||
needs: tag-release
|
needs: tag-release
|
||||||
|
|
||||||
@@ -130,11 +136,11 @@ jobs:
|
|||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup JDK 21 (Temurin)
|
- name: Setup JDK 25 (Temurin)
|
||||||
uses: actions/setup-java@v4
|
uses: actions/setup-java@v4
|
||||||
with:
|
with:
|
||||||
distribution: temurin
|
distribution: temurin
|
||||||
java-version: '21'
|
java-version: '25'
|
||||||
|
|
||||||
- name: Gradle cache
|
- name: Gradle cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
@@ -173,11 +179,11 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Summary ausgeben
|
- name: Summary ausgeben
|
||||||
run: |
|
run: |
|
||||||
echo "## 🚀 Release ${{ needs.tag-release.outputs.version }}" >> $GITHUB_STEP_SUMMARY
|
echo "## 🚀 Release ${{ needs.tag-release.outputs.version }}" >> $GITEA_STEP_SUMMARY
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
echo "" >> $GITEA_STEP_SUMMARY
|
||||||
echo "| Artefakt | Status |" >> $GITHUB_STEP_SUMMARY
|
echo "| Artefakt | Status |" >> $GITEA_STEP_SUMMARY
|
||||||
echo "|----------|--------|" >> $GITHUB_STEP_SUMMARY
|
echo "|----------|--------|" >> $GITEA_STEP_SUMMARY
|
||||||
echo "| Linux .deb | ${{ needs.package-linux.result }} |" >> $GITHUB_STEP_SUMMARY
|
echo "| Linux .deb | ${{ needs.package-linux.result }} |" >> $GITEA_STEP_SUMMARY
|
||||||
echo "| Windows .msi | ${{ needs.package-windows.result }} |" >> $GITHUB_STEP_SUMMARY
|
echo "| Windows .msi | ${{ needs.package-windows.result }} |" >> $GITEA_STEP_SUMMARY
|
||||||
echo "" >> $GITHUB_STEP_SUMMARY
|
echo "" >> $GITEA_STEP_SUMMARY
|
||||||
echo "**Git-Tag:** \`${{ needs.tag-release.outputs.tag }}\`" >> $GITHUB_STEP_SUMMARY
|
echo "**Git-Tag:** \`${{ needs.tag-release.outputs.tag }}\`" >> $GITEA_STEP_SUMMARY
|
||||||
|
|||||||
+44
-67
@@ -1,84 +1,61 @@
|
|||||||
# Gradle
|
# 🐧 [DevOps Engineer] Optimierte .gitignore für Meldestelle (KMP / Gradle / Docker)
|
||||||
|
|
||||||
|
# --- AI ---
|
||||||
|
.ai/dist/
|
||||||
|
|
||||||
|
# --- IDE & Editor ---
|
||||||
|
.idea/
|
||||||
|
*.iml
|
||||||
|
*.iws
|
||||||
|
*.ipr
|
||||||
|
out/
|
||||||
|
.vscode/
|
||||||
|
.history/
|
||||||
|
.shelf/
|
||||||
|
|
||||||
|
# --- Gradle ---
|
||||||
.gradle/
|
.gradle/
|
||||||
build/
|
build/
|
||||||
!gradle/wrapper/gradle-wrapper.jar
|
!**/src/**/build/
|
||||||
|
gradle-app.setting
|
||||||
|
!gradle-wrapper.jar
|
||||||
.gradletasknamecache
|
.gradletasknamecache
|
||||||
|
bin/
|
||||||
|
|
||||||
# Kotlin
|
# --- Kotlin / KMP ---
|
||||||
*.class
|
|
||||||
*.jar
|
|
||||||
*.kotlin_module
|
|
||||||
.kotlin/
|
.kotlin/
|
||||||
kotlin-js-store/
|
kotlin-js-store/
|
||||||
|
.jetbrains/
|
||||||
|
|
||||||
# IntelliJ IDEA
|
# --- Android (falls relevant) ---
|
||||||
.idea/workspace.xml
|
*.ap_
|
||||||
.idea/tasks.xml
|
*.apk
|
||||||
.idea/usage.statistics.xml
|
*.dex
|
||||||
.idea/dictionaries
|
local.properties
|
||||||
.idea/shelf
|
|
||||||
.idea/dataSources/
|
|
||||||
.idea/dataSources.local.xml
|
|
||||||
.idea/httpRequests/
|
|
||||||
.idea/codestream.xml
|
|
||||||
.idea/sonarlint/
|
|
||||||
*.iml
|
|
||||||
*.ipr
|
|
||||||
*.iws
|
|
||||||
out/
|
|
||||||
|
|
||||||
# Node.js / npm / React
|
# --- Node / JS (Compose Web / KMP JS) ---
|
||||||
node_modules/
|
node_modules/
|
||||||
|
package-lock.json
|
||||||
npm-debug.log*
|
npm-debug.log*
|
||||||
yarn-debug.log*
|
yarn-debug.log*
|
||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
.pnp.*
|
.npm/
|
||||||
.yarn/
|
|
||||||
dist/
|
|
||||||
.cache/
|
|
||||||
.parcel-cache/
|
|
||||||
.next/
|
|
||||||
.nuxt/
|
|
||||||
.vuepress/dist
|
|
||||||
*.tsbuildinfo
|
|
||||||
|
|
||||||
# Docker
|
# --- Docker & Infrastructure ---
|
||||||
.env
|
.docker/
|
||||||
.env.local
|
|
||||||
.env.*.local
|
|
||||||
docker-compose.override.yaml
|
|
||||||
|
|
||||||
# macOS
|
|
||||||
.DS_Store
|
|
||||||
.AppleDouble
|
|
||||||
.LSOverride
|
|
||||||
._*
|
|
||||||
|
|
||||||
# Windows
|
|
||||||
Thumbs.db
|
|
||||||
Thumbs.db:encryptable
|
|
||||||
ehthumbs.db
|
|
||||||
Desktop.ini
|
|
||||||
|
|
||||||
# Linux
|
|
||||||
*~
|
|
||||||
.directory
|
|
||||||
.Trash-*
|
|
||||||
|
|
||||||
# Logs
|
|
||||||
*.log
|
*.log
|
||||||
logs/
|
logs/
|
||||||
|
.env
|
||||||
|
!.env.example
|
||||||
|
.data/
|
||||||
|
postgres-data/
|
||||||
|
|
||||||
# Temporary files
|
# --- OS Specific ---
|
||||||
*.tmp
|
.DS_Store
|
||||||
*.temp
|
Thumbs.db
|
||||||
*.swp
|
desktop.ini
|
||||||
*.swo
|
|
||||||
|
|
||||||
# SQLDelight
|
# --- Project Specific ---
|
||||||
*.db
|
docs/temp/
|
||||||
*.db-shm
|
docs/Bin/
|
||||||
*.db-wal
|
docs/_archive/
|
||||||
|
|
||||||
# Local configuration
|
|
||||||
local.properties
|
|
||||||
|
|||||||
Generated
-1
@@ -1 +0,0 @@
|
|||||||
Meldestelle
|
|
||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="AndroidProjectSystem">
|
|
||||||
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="auth-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/auth/build/libs</output-path>
|
|
||||||
<root id="archive" name="auth-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="auth-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/auth/build/libs</output-path>
|
|
||||||
<root id="archive" name="auth-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="billing-domain-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/backend/services/billing/billing-domain/build/libs</output-path>
|
|
||||||
<root id="archive" name="billing-domain-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="billing-domain-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/backend/services/billing/billing-domain/build/libs</output-path>
|
|
||||||
<root id="archive" name="billing-domain-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="billing-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/billing-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="billing-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="billing-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/billing-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="billing-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="core-domain-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/core/core-domain/build/libs</output-path>
|
|
||||||
<root id="archive" name="core-domain-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="core-domain-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/core/core-domain/build/libs</output-path>
|
|
||||||
<root id="archive" name="core-domain-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="core-utils-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/core/core-utils/build/libs</output-path>
|
|
||||||
<root id="archive" name="core-utils-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="core-utils-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/core/core-utils/build/libs</output-path>
|
|
||||||
<root id="archive" name="core-utils-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="design-system-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/design-system/build/libs</output-path>
|
|
||||||
<root id="archive" name="design-system-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="design-system-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/design-system/build/libs</output-path>
|
|
||||||
<root id="archive" name="design-system-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="device-initialization-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/device-initialization/build/libs</output-path>
|
|
||||||
<root id="archive" name="device-initialization-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="device-initialization-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/device-initialization/build/libs</output-path>
|
|
||||||
<root id="archive" name="device-initialization-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="domain-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/domain/build/libs</output-path>
|
|
||||||
<root id="archive" name="domain-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="domain-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/domain/build/libs</output-path>
|
|
||||||
<root id="archive" name="domain-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="entries-api-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/backend/services/entries/entries-api/build/libs</output-path>
|
|
||||||
<root id="archive" name="entries-api-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="entries-api-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/backend/services/entries/entries-api/build/libs</output-path>
|
|
||||||
<root id="archive" name="entries-api-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="entries-domain-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/backend/services/entries/entries-domain/build/libs</output-path>
|
|
||||||
<root id="archive" name="entries-domain-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="entries-domain-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/backend/services/entries/entries-domain/build/libs</output-path>
|
|
||||||
<root id="archive" name="entries-domain-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="events-common-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/backend/services/events/events-common/build/libs</output-path>
|
|
||||||
<root id="archive" name="events-common-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="events-common-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/backend/services/events/events-common/build/libs</output-path>
|
|
||||||
<root id="archive" name="events-common-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="funktionaer-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/funktionaer-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="funktionaer-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="funktionaer-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/funktionaer-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="funktionaer-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="local-db-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/local-db/build/libs</output-path>
|
|
||||||
<root id="archive" name="local-db-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="local-db-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/local-db/build/libs</output-path>
|
|
||||||
<root id="archive" name="local-db-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="masterdata-domain-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/backend/services/masterdata/masterdata-domain/build/libs</output-path>
|
|
||||||
<root id="archive" name="masterdata-domain-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="masterdata-domain-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/backend/services/masterdata/masterdata-domain/build/libs</output-path>
|
|
||||||
<root id="archive" name="masterdata-domain-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="meldestelle-desktop-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/shells/meldestelle-desktop/build/libs</output-path>
|
|
||||||
<root id="archive" name="meldestelle-desktop-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="meldestelle-web-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/shells/meldestelle-web/build/libs</output-path>
|
|
||||||
<root id="archive" name="meldestelle-web-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="navigation-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/navigation/build/libs</output-path>
|
|
||||||
<root id="archive" name="navigation-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="navigation-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/navigation/build/libs</output-path>
|
|
||||||
<root id="archive" name="navigation-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="nennung-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/nennung-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="nennung-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="nennung-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/nennung-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="nennung-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="network-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/network/build/libs</output-path>
|
|
||||||
<root id="archive" name="network-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="network-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/network/build/libs</output-path>
|
|
||||||
<root id="archive" name="network-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="pferde-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/pferde-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="pferde-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="pferde-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/pferde-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="pferde-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="ping-api-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/contracts/ping-api/build/libs</output-path>
|
|
||||||
<root id="archive" name="ping-api-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="ping-api-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/contracts/ping-api/build/libs</output-path>
|
|
||||||
<root id="archive" name="ping-api-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="ping-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/ping-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="ping-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="ping-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/ping-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="ping-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="profile-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/profile-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="profile-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="profile-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/profile-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="profile-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="reiter-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/reiter-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="reiter-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="reiter-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/reiter-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="reiter-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="sync-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/sync/build/libs</output-path>
|
|
||||||
<root id="archive" name="sync-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="sync-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/core/sync/build/libs</output-path>
|
|
||||||
<root id="archive" name="sync-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="turnier-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/turnier-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="turnier-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="turnier-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/turnier-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="turnier-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="veranstalter-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/veranstalter-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="veranstalter-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="veranstalter-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/veranstalter-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="veranstalter-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="veranstaltung-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/veranstaltung-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="veranstaltung-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="veranstaltung-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/veranstaltung-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="veranstaltung-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
-6
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="verein-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/verein-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="verein-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="verein-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/verein-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="verein-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="zns-import-feature-jvm-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/zns-import-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="zns-import-feature-jvm-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="zns-import-feature-wasm-js-1.0.0">
|
|
||||||
<output-path>$PROJECT_DIR$/frontend/features/zns-import-feature/build/libs</output-path>
|
|
||||||
<root id="archive" name="zns-import-feature-wasm-js-1.0.0.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="zns-parser-jvm-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/core/zns-parser/build/libs</output-path>
|
|
||||||
<root id="archive" name="zns-parser-jvm-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<component name="ArtifactManager">
|
|
||||||
<artifact type="jar" name="zns-parser-wasm-js-1.0.0-SNAPSHOT">
|
|
||||||
<output-path>$PROJECT_DIR$/core/zns-parser/build/libs</output-path>
|
|
||||||
<root id="archive" name="zns-parser-wasm-js-1.0.0-SNAPSHOT.jar" />
|
|
||||||
</artifact>
|
|
||||||
</component>
|
|
||||||
Generated
-65
@@ -1,65 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="CompilerConfiguration">
|
|
||||||
<bytecodeTargetLevel target="25" />
|
|
||||||
</component>
|
|
||||||
<component name="JavacSettings">
|
|
||||||
<option name="ADDITIONAL_OPTIONS_OVERRIDE">
|
|
||||||
<module name="Meldestelle.backend.infrastructure.event-store.valkey-event-store" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.event-store.valkey-event-store.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.event-store.valkey-event-store.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.gateway" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.gateway.integrationTest" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.gateway.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.gateway.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.messaging.messaging-client" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.messaging.messaging-client.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.messaging.messaging-client.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.messaging.messaging-config" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.messaging.messaging-config.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.messaging.messaging-config.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.monitoring.monitoring-server" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.monitoring.monitoring-server.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.monitoring.monitoring-server.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.persistence" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.persistence.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.persistence.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.security" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.security.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.infrastructure.security.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.billing.billing-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.billing.billing-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.billing.billing-service.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.entries.entries-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.entries.entries-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.entries.entries-service.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.events.events-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.events.events-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.events.events-service.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.identity.identity-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.identity.identity-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.identity.identity-service.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.mail.mail-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.mail.mail-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.mail.mail-service.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.masterdata.masterdata-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.masterdata.masterdata-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.masterdata.masterdata-service.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.ping.ping-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.ping.ping-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.ping.ping-service.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.results.results-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.results.results-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.results.results-service.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.scheduling.scheduling-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.scheduling.scheduling-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.scheduling.scheduling-service.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.series.series-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.series.series-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.series.series-service.test" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.zns-import.zns-import-service" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.zns-import.zns-import-service.main" options="-parameters" />
|
|
||||||
<module name="Meldestelle.backend.services.zns-import.zns-import-service.test" options="-parameters" />
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Generated
-18
@@ -1,18 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
|
||||||
<data-source source="LOCAL" name="pg-meldestelle-db@localhost" uuid="8835ccb7-a903-4b56-97aa-a6359a2f5d4e">
|
|
||||||
<driver-ref>postgresql</driver-ref>
|
|
||||||
<synchronize>true</synchronize>
|
|
||||||
<imported>true</imported>
|
|
||||||
<jdbc-driver>org.postgresql.Driver</jdbc-driver>
|
|
||||||
<jdbc-url>jdbc:postgresql://localhost:5432/pg-meldestelle-db</jdbc-url>
|
|
||||||
<jdbc-additional-properties>
|
|
||||||
<property name="com.intellij.clouds.kubernetes.db.host.port" />
|
|
||||||
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
|
|
||||||
<property name="com.intellij.clouds.kubernetes.db.container.port" />
|
|
||||||
</jdbc-additional-properties>
|
|
||||||
<working-dir>$ProjectFileDir$</working-dir>
|
|
||||||
</data-source>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Generated
-8
@@ -1,8 +0,0 @@
|
|||||||
<component name="ProjectDictionaryState">
|
|
||||||
<dictionary name="project">
|
|
||||||
<words>
|
|
||||||
<w>mailpit</w>
|
|
||||||
<w>valkey</w>
|
|
||||||
</words>
|
|
||||||
</dictionary>
|
|
||||||
</component>
|
|
||||||
Generated
-107
@@ -1,107 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="GradleSettings">
|
|
||||||
<option name="linkedExternalProjectsSettings">
|
|
||||||
<GradleProjectSettings>
|
|
||||||
<option name="externalProjectPath" value="$PROJECT_DIR$" />
|
|
||||||
<option name="modules">
|
|
||||||
<set>
|
|
||||||
<option value="$PROJECT_DIR$" />
|
|
||||||
<option value="$PROJECT_DIR$/backend" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/cache" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/cache/cache-api" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/cache/valkey-cache" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/event-store" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/event-store/event-store-api" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/event-store/valkey-event-store" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/gateway" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/messaging" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/messaging/messaging-client" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/messaging/messaging-config" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/monitoring" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/monitoring/monitoring-client" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/monitoring/monitoring-server" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/persistence" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/security" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/infrastructure/zns-importer" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/billing" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/billing/billing-domain" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/billing/billing-service" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/entries" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/entries/entries-api" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/entries/entries-domain" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/entries/entries-service" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/events" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/events/events-api" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/events/events-common" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/events/events-domain" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/events/events-infrastructure" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/events/events-service" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/identity" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/identity/identity-domain" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/identity/identity-infrastructure" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/identity/identity-service" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/mail" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/mail/mail-service" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/masterdata" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/masterdata/masterdata-api" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/masterdata/masterdata-common" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/masterdata/masterdata-domain" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/masterdata/masterdata-infrastructure" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/masterdata/masterdata-service" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/ping" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/ping/ping-service" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/results" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/results/results-service" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/scheduling" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/scheduling/scheduling-service" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/series" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/series/series-service" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/zns-import" />
|
|
||||||
<option value="$PROJECT_DIR$/backend/services/zns-import/zns-import-service" />
|
|
||||||
<option value="$PROJECT_DIR$/contracts" />
|
|
||||||
<option value="$PROJECT_DIR$/contracts/ping-api" />
|
|
||||||
<option value="$PROJECT_DIR$/core" />
|
|
||||||
<option value="$PROJECT_DIR$/core/core-domain" />
|
|
||||||
<option value="$PROJECT_DIR$/core/core-utils" />
|
|
||||||
<option value="$PROJECT_DIR$/core/zns-parser" />
|
|
||||||
<option value="$PROJECT_DIR$/docs" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/core" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/core/auth" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/core/design-system" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/core/domain" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/core/local-db" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/core/navigation" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/core/network" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/core/sync" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/billing-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/device-initialization" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/funktionaer-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/nennung-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/pferde-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/ping-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/profile-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/reiter-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/turnier-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/veranstalter-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/veranstaltung-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/verein-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/features/zns-import-feature" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/shells" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/shells/meldestelle-desktop" />
|
|
||||||
<option value="$PROJECT_DIR$/frontend/shells/meldestelle-web" />
|
|
||||||
<option value="$PROJECT_DIR$/platform" />
|
|
||||||
<option value="$PROJECT_DIR$/platform/architecture-tests" />
|
|
||||||
<option value="$PROJECT_DIR$/platform/platform-bom" />
|
|
||||||
<option value="$PROJECT_DIR$/platform/platform-dependencies" />
|
|
||||||
<option value="$PROJECT_DIR$/platform/platform-testing" />
|
|
||||||
</set>
|
|
||||||
</option>
|
|
||||||
</GradleProjectSettings>
|
|
||||||
</option>
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Generated
-7
@@ -1,7 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="KotlinJpsPluginSettings">
|
|
||||||
<option name="externalSystemId" value="Gradle" />
|
|
||||||
<option name="version" value="2.3.20" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Generated
-5
@@ -1,5 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
|
||||||
<component name="ProjectRootManager" version="2" languageLevel="JDK_25" project-jdk-name="openjdk-25" project-jdk-type="JavaSDK" />
|
|
||||||
</project>
|
|
||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="SqlDialectMappings">
|
|
||||||
<file url="PROJECT" dialect="PostgreSQL" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
Generated
-6
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="VcsDirectoryMappings">
|
|
||||||
<mapping directory="" vcs="Git" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
@@ -1,43 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
# check-docs-drift.sh
|
# Shim: Weiterleitung auf zentrale Guardrail in .ai/
|
||||||
# Zweck: sehr schlanke Drift-Checks gegen die neue Doku-Struktur.
|
SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)"
|
||||||
# - Kein Guidelines-System mehr.
|
ROOT_DIR="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || echo "$SCRIPT_DIR")"
|
||||||
# - Single Source of Truth: `docs/`
|
exec "$ROOT_DIR/.ai/scripts/check-docs-drift.sh" "$@"
|
||||||
|
|
||||||
err=0
|
|
||||||
|
|
||||||
has() { grep -q "$2" "$1" || { echo "[DRIFT] '$2' fehlt in $1"; err=1; }; }
|
|
||||||
miss() { grep -q "$2" "$1" && { echo "[DRIFT] Veralteter Begriff '$2' in $1"; err=1; }; }
|
|
||||||
|
|
||||||
# Harte Altlast-Pfade dürfen nicht mehr vorkommen
|
|
||||||
if git grep -n "docs/00_Domain/" -- docs >/dev/null 2>&1; then
|
|
||||||
echo "[DRIFT] Veralteter Pfad 'docs/00_Domain/' in docs/* gefunden"
|
|
||||||
err=1
|
|
||||||
fi
|
|
||||||
if git grep -n "docs/adr/" -- docs >/dev/null 2>&1; then
|
|
||||||
echo "[DRIFT] Veralteter Pfad 'docs/adr/' in docs/* gefunden"
|
|
||||||
err=1
|
|
||||||
fi
|
|
||||||
if git grep -n "docs/c4/" -- docs >/dev/null 2>&1; then
|
|
||||||
echo "[DRIFT] Veralteter Pfad 'docs/c4/' in docs/* gefunden"
|
|
||||||
err=1
|
|
||||||
fi
|
|
||||||
if git grep -n "docs/how-to/" -- docs >/dev/null 2>&1; then
|
|
||||||
echo "[DRIFT] Veralteter Pfad 'docs/how-to/' in docs/* gefunden"
|
|
||||||
err=1
|
|
||||||
fi
|
|
||||||
if git grep -n "docs/reference/" -- docs >/dev/null 2>&1; then
|
|
||||||
echo "[DRIFT] Veralteter Pfad 'docs/reference/' in docs/* gefunden"
|
|
||||||
err=1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Quelle der Wahrheit: Gateway-Technologie (sollte in Architektur/ADRs/C4 konsistent sein)
|
|
||||||
has docs/01_Architecture/ARCHITECTURE.md "Spring Cloud Gateway"
|
|
||||||
has docs/01_Architecture/adr/0007-api-gateway-pattern-de.md "Spring Cloud Gateway"
|
|
||||||
miss docs/01_Architecture/adr/0007-api-gateway-pattern-de.md "Ktor"
|
|
||||||
has docs/01_Architecture/c4/02-container-de.puml "Spring Cloud Gateway"
|
|
||||||
miss docs/01_Architecture/c4/02-container-de.puml "Ktor"
|
|
||||||
|
|
||||||
exit $err
|
|
||||||
|
|||||||
@@ -1,9 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
mkdir -p build/diagrams
|
# Shim: Weiterleitung auf zentrale Guardrail in .ai/
|
||||||
shopt -s nullglob
|
SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)"
|
||||||
for f in docs/architecture/c4/*.puml; do
|
ROOT_DIR="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || echo "$SCRIPT_DIR")"
|
||||||
docker run --rm -v "$PWD":/data plantuml/plantuml -tsvg "/data/$f" -o "/data/build/diagrams"
|
exec "$ROOT_DIR/.ai/scripts/render-plantuml.sh" "$@"
|
||||||
echo "Rendered build/diagrams/$(basename "${f%.puml}").svg"
|
|
||||||
done
|
|
||||||
|
|||||||
@@ -1,136 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
# validate-links.sh - Link-Validierung für Projektdokumentation (`docs/**`).
|
# Shim: Weiterleitung auf zentrale Guardrail in .ai/
|
||||||
# Zweck: Guardrail für die "Docs-as-Code"-Strategie.
|
SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)"
|
||||||
|
ROOT_DIR="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || echo "$SCRIPT_DIR")"
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
exec "$ROOT_DIR/.ai/scripts/validate-links.sh" "$@"
|
||||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
||||||
cd "$PROJECT_ROOT"
|
|
||||||
|
|
||||||
QUICK_MODE=false
|
|
||||||
|
|
||||||
while [[ $# -gt 0 ]]; do
|
|
||||||
case $1 in
|
|
||||||
--quick)
|
|
||||||
QUICK_MODE=true
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
--help|-h)
|
|
||||||
cat << 'EOF'
|
|
||||||
Docs Link-Validierung
|
|
||||||
|
|
||||||
USAGE:
|
|
||||||
./.junie/scripts/validate-links.sh [--quick]
|
|
||||||
|
|
||||||
BESCHREIBUNG:
|
|
||||||
Prüft Markdown-Links in `docs/**/*.md` auf gebrochene relative Pfade.
|
|
||||||
Ignoriert externe Links (http/https/mailto) sowie reine Anchors (#...).
|
|
||||||
|
|
||||||
OPTIONEN:
|
|
||||||
--quick Führt nur eine Teilmenge der Prüfungen durch (aktuell nicht implementiert).
|
|
||||||
EOF
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "[ERROR] Unbekannter Parameter: $1" >&2
|
|
||||||
exit 2
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
python3 - <<'PY'
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
from pathlib import Path
|
|
||||||
from urllib.parse import unquote
|
|
||||||
|
|
||||||
root = Path.cwd()
|
|
||||||
docs_dir = root / "docs"
|
|
||||||
|
|
||||||
if not docs_dir.is_dir():
|
|
||||||
print(f"[ERROR] docs-Verzeichnis nicht gefunden: {docs_dir}", file=sys.stderr)
|
|
||||||
sys.exit(2)
|
|
||||||
|
|
||||||
# Veraltete Pfad-Prüfungen wurden entfernt, da sie zu wartungsintensiv waren.
|
|
||||||
# Das Skript konzentriert sich nun auf die Validierung der Link-Integrität.
|
|
||||||
FORBIDDEN_SUBSTRINGS = []
|
|
||||||
|
|
||||||
md_files = sorted(docs_dir.rglob("*.md"))
|
|
||||||
|
|
||||||
link_pattern = re.compile(r"\]\(([^)]+)\)")
|
|
||||||
|
|
||||||
errors = 0
|
|
||||||
|
|
||||||
def is_external(target: str) -> bool:
|
|
||||||
t = target.lower()
|
|
||||||
return t.startswith("http://") or t.startswith("https://") or t.startswith("mailto:")
|
|
||||||
|
|
||||||
def strip_fragment_and_query(target: str) -> str:
|
|
||||||
# remove fragment and query parts
|
|
||||||
target = target.split("#", 1)[0]
|
|
||||||
target = target.split("?", 1)[0]
|
|
||||||
return target
|
|
||||||
|
|
||||||
for f in md_files:
|
|
||||||
text = f.read_text(encoding="utf-8", errors="replace")
|
|
||||||
|
|
||||||
for forbidden in FORBIDDEN_SUBSTRINGS:
|
|
||||||
if forbidden in text:
|
|
||||||
print(f"[ERROR] Veralteter Pfad '{forbidden}' in {f}")
|
|
||||||
errors += 1
|
|
||||||
|
|
||||||
for match in link_pattern.finditer(text):
|
|
||||||
target = match.group(1).strip()
|
|
||||||
|
|
||||||
if not target:
|
|
||||||
continue
|
|
||||||
if is_external(target):
|
|
||||||
continue
|
|
||||||
if target.startswith("#"):
|
|
||||||
continue
|
|
||||||
|
|
||||||
# drop angle brackets <...> used in markdown for urls with spaces
|
|
||||||
if target.startswith("<") and target.endswith(">"):
|
|
||||||
target = target[1:-1]
|
|
||||||
|
|
||||||
target = unquote(strip_fragment_and_query(target))
|
|
||||||
|
|
||||||
# ignore absolute paths in the repo (we treat them as doc-style links; validate only if relative)
|
|
||||||
if target.startswith("/"):
|
|
||||||
continue
|
|
||||||
|
|
||||||
# ignore non-file targets (e.g. empty or protocol-less anchors)
|
|
||||||
if ":" in target.split("/", 1)[0]:
|
|
||||||
# things like "vscode:..." etc.
|
|
||||||
continue
|
|
||||||
|
|
||||||
# treat as file path relative to markdown file
|
|
||||||
resolved = (f.parent / target).resolve()
|
|
||||||
|
|
||||||
# keep validation within repo
|
|
||||||
try:
|
|
||||||
resolved.relative_to(root.resolve())
|
|
||||||
except ValueError:
|
|
||||||
print(f"[ERROR] Link zeigt außerhalb des Repos: {f} -> {target}")
|
|
||||||
errors += 1
|
|
||||||
continue
|
|
||||||
|
|
||||||
# allow directories if they contain README.md
|
|
||||||
if resolved.is_dir():
|
|
||||||
if not (resolved / "README.md").is_file():
|
|
||||||
print(f"[ERROR] Verlinktes Verzeichnis ohne README.md: {f} -> {target}")
|
|
||||||
errors += 1
|
|
||||||
continue
|
|
||||||
|
|
||||||
if not resolved.exists():
|
|
||||||
print(f"[ERROR] Broken link: {f} -> {target}")
|
|
||||||
errors += 1
|
|
||||||
|
|
||||||
if errors:
|
|
||||||
print(f"[ERROR] Link-Validierung fehlgeschlagen: {errors} Fehler")
|
|
||||||
sys.exit(1)
|
|
||||||
|
|
||||||
print(f"[OK] Link-Validierung erfolgreich: {len(md_files)} Markdown-Dateien geprüft")
|
|
||||||
PY
|
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
# .aiignore - Verhindert Token-Waste für Nolik
|
||||||
|
|
||||||
|
# Abhängigkeiten & Binaries
|
||||||
|
build/
|
||||||
|
.gradle/
|
||||||
|
*.jar
|
||||||
|
*.deb
|
||||||
|
*.msi
|
||||||
|
|
||||||
|
# Sensible Daten (auch lokal!)
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
config/docker/certs/
|
||||||
|
*.pem
|
||||||
|
*.jks
|
||||||
|
postgres-data/
|
||||||
|
valkey-data/
|
||||||
|
|
||||||
|
# Doku-Builds (Nolik soll die Source-Files in docs/ lesen, nicht die HTML-Exporte)
|
||||||
|
build/dokka/
|
||||||
|
docs/Neumarkt2026/*.pdf
|
||||||
Executable
+7
@@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Shim: Weiterleitung auf zentrale Guardrail in .ai/
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)"
|
||||||
|
ROOT_DIR="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || echo "$SCRIPT_DIR")"
|
||||||
|
exec "$ROOT_DIR/.ai/scripts/check-docs-drift.sh" "$@"
|
||||||
Executable
+7
@@ -0,0 +1,7 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Shim: Weiterleitung auf zentrale Guardrail in .ai/
|
||||||
|
SCRIPT_DIR="$(cd -- "$(dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)"
|
||||||
|
ROOT_DIR="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || echo "$SCRIPT_DIR")"
|
||||||
|
exec "$ROOT_DIR/.ai/scripts/validate-links.sh" "$@"
|
||||||
@@ -34,6 +34,8 @@ Versionierung folgt [Semantic Versioning](https://semver.org/lang/de/).
|
|||||||
|
|
||||||
### Behoben
|
### Behoben
|
||||||
|
|
||||||
|
- **Frontend (Desktop):** Behebung von Kompilierungsfehlern in `ScreenPreviews.kt` durch Implementierung der fehlenden
|
||||||
|
`getStats()` Methode in den `MasterdataRepository`-Mocks.
|
||||||
- **Identity-Modul:** Umstellung auf `kotlin.time.Instant` zur Vermeidung von Deprecation-Warnungen und Behebung von
|
- **Identity-Modul:** Umstellung auf `kotlin.time.Instant` zur Vermeidung von Deprecation-Warnungen und Behebung von
|
||||||
Persistenz-Konflikten im `ExposedDeviceRepository`.
|
Persistenz-Konflikten im `ExposedDeviceRepository`.
|
||||||
- **Koin DI:** Korrektur von Typ-Inferenz-Fehlern beim `HttpClient` im `nennung-feature` durch explizite Qualifier.
|
- **Koin DI:** Korrektur von Typ-Inferenz-Fehlern beim `HttpClient` im `nennung-feature` durch explizite Qualifier.
|
||||||
|
|||||||
+32
-9
@@ -7,10 +7,16 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity
|
|||||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity
|
||||||
import org.springframework.security.config.http.SessionCreationPolicy
|
import org.springframework.security.config.http.SessionCreationPolicy
|
||||||
import org.springframework.security.oauth2.core.DelegatingOAuth2TokenValidator
|
import org.springframework.security.oauth2.core.DelegatingOAuth2TokenValidator
|
||||||
import org.springframework.security.oauth2.jwt.*
|
import org.springframework.security.oauth2.jwt.Jwt
|
||||||
|
import org.springframework.security.oauth2.jwt.JwtDecoder
|
||||||
|
import org.springframework.security.oauth2.jwt.JwtTimestampValidator
|
||||||
|
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder
|
||||||
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter
|
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter
|
||||||
import org.springframework.security.web.SecurityFilterChain
|
import org.springframework.security.web.SecurityFilterChain
|
||||||
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
|
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter
|
||||||
|
import org.springframework.web.cors.CorsConfiguration
|
||||||
|
import org.springframework.web.cors.CorsConfigurationSource
|
||||||
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource
|
||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableWebSecurity
|
@EnableWebSecurity
|
||||||
@@ -21,16 +27,16 @@ class GlobalSecurityConfig {
|
|||||||
fun filterChain(http: HttpSecurity): SecurityFilterChain {
|
fun filterChain(http: HttpSecurity): SecurityFilterChain {
|
||||||
http
|
http
|
||||||
.csrf { it.disable() } // CSRF nicht nötig für Stateless REST APIs
|
.csrf { it.disable() } // CSRF nicht nötig für Stateless REST APIs
|
||||||
// WICHTIG: CORS explizit deaktivieren!
|
// WICHTIG: CORS wieder aktivieren für Plan-B (Direktzugriff ohne Gateway möglich)
|
||||||
// Das API-Gateway kümmert sich um CORS. Die Microservices dürfen KEINE
|
.cors { it.configurationSource(corsConfigurationSource()) }
|
||||||
// Access-Control-Allow-Origin Header setzen, sonst haben wir doppelte Header beim Client.
|
|
||||||
.cors { it.disable() }
|
|
||||||
.sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) }
|
.sessionManagement { it.sessionCreationPolicy(SessionCreationPolicy.STATELESS) }
|
||||||
.addFilterBefore(DeviceSecurityFilter(), UsernamePasswordAuthenticationFilter::class.java)
|
.addFilterBefore(DeviceSecurityFilter(), UsernamePasswordAuthenticationFilter::class.java)
|
||||||
.authorizeHttpRequests { auth ->
|
.authorizeHttpRequests { auth ->
|
||||||
// Explizite Freigaben (Health, Information, Public-Endpoints)
|
// Explizite Freigaben (Health, Information, Public-Endpoints)
|
||||||
auth.requestMatchers("/actuator/**").permitAll()
|
auth.requestMatchers("/actuator/**").permitAll()
|
||||||
auth.requestMatchers("/api/v1/devices/register").permitAll() // Onboarding erlauben
|
auth.requestMatchers("/api/v1/devices/register").permitAll() // Onboarding erlauben
|
||||||
|
auth.requestMatchers("/api/mail/nennung").permitAll() // Plan-B Nennungen erlauben
|
||||||
|
auth.requestMatchers("/api/mail/nennungen").authenticated() // Liste schützen
|
||||||
auth.requestMatchers("/ping/public").permitAll()
|
auth.requestMatchers("/ping/public").permitAll()
|
||||||
auth.requestMatchers("/ping/simple").permitAll()
|
auth.requestMatchers("/ping/simple").permitAll()
|
||||||
auth.requestMatchers("/ping/health").permitAll()
|
auth.requestMatchers("/ping/health").permitAll()
|
||||||
@@ -52,10 +58,12 @@ class GlobalSecurityConfig {
|
|||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
fun jwtDecoder(): JwtDecoder {
|
fun jwtDecoder(): JwtDecoder {
|
||||||
// Wenn jwk-set-uri gesetzt ist, nutzen wir sie.
|
// 1. Suche in System-Properties (Spring injects these)
|
||||||
// Wir verzichten auf den Issuer-Check für maximale Flexibilität zwischen Docker/Host.
|
// 2. Suche in Environment Variables
|
||||||
val jwkSetUri = System.getenv("SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWK_SET_URI")
|
// 3. Fallback auf localhost (IDE-Start) oder keycloak (Docker-Start)
|
||||||
?: "http://keycloak:8080/realms/meldestelle/protocol/openid-connect/certs"
|
val jwkSetUri = System.getProperty("spring.security.oauth2.resourceserver.jwt.jwk-set-uri")
|
||||||
|
?: System.getenv("SPRING_SECURITY_OAUTH2_RESOURCESERVER_JWT_JWK_SET_URI")
|
||||||
|
?: "http://localhost:8180/realms/meldestelle/protocol/openid-connect/certs"
|
||||||
|
|
||||||
val decoder = NimbusJwtDecoder.withJwkSetUri(jwkSetUri).build()
|
val decoder = NimbusJwtDecoder.withJwkSetUri(jwkSetUri).build()
|
||||||
val validator = DelegatingOAuth2TokenValidator<Jwt>(JwtTimestampValidator())
|
val validator = DelegatingOAuth2TokenValidator<Jwt>(JwtTimestampValidator())
|
||||||
@@ -69,4 +77,19 @@ class GlobalSecurityConfig {
|
|||||||
converter.setJwtGrantedAuthoritiesConverter(KeycloakRoleConverter())
|
converter.setJwtGrantedAuthoritiesConverter(KeycloakRoleConverter())
|
||||||
return converter
|
return converter
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
fun corsConfigurationSource(): CorsConfigurationSource {
|
||||||
|
val configuration = CorsConfiguration()
|
||||||
|
configuration.allowedOrigins = listOf("*")
|
||||||
|
configuration.allowedOriginPatterns = listOf("*")
|
||||||
|
configuration.allowedMethods = listOf("GET", "POST", "PUT", "DELETE", "OPTIONS", "HEAD")
|
||||||
|
configuration.allowedHeaders = listOf("*")
|
||||||
|
configuration.exposedHeaders = listOf("*")
|
||||||
|
configuration.maxAge = 3600L
|
||||||
|
configuration.allowCredentials = false
|
||||||
|
val source = UrlBasedCorsConfigurationSource()
|
||||||
|
source.registerCorsConfiguration("/**", configuration)
|
||||||
|
return source
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
spring:
|
spring:
|
||||||
application:
|
application:
|
||||||
name: billing-service
|
name: billing-service
|
||||||
|
|
||||||
datasource:
|
datasource:
|
||||||
url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/pg-meldestelle-db}
|
url: ${SPRING_DATASOURCE_URL:jdbc:postgresql://localhost:5432/pg-meldestelle-db}
|
||||||
username: ${SPRING_DATASOURCE_USERNAME:pg-user}
|
username: ${SPRING_DATASOURCE_USERNAME:pg-user}
|
||||||
password: ${SPRING_DATASOURCE_PASSWORD:pg-password}
|
password: ${SPRING_DATASOURCE_PASSWORD:pg-password}
|
||||||
|
driver-class-name: org.postgresql.Driver
|
||||||
|
|
||||||
cloud:
|
cloud:
|
||||||
consul:
|
consul:
|
||||||
host: ${SPRING_CLOUD_CONSUL_HOST:localhost}
|
host: ${SPRING_CLOUD_CONSUL_HOST:localhost}
|
||||||
@@ -15,13 +18,19 @@ spring:
|
|||||||
prefer-ip-address: true
|
prefer-ip-address: true
|
||||||
health-check-path: /actuator/health
|
health-check-path: /actuator/health
|
||||||
health-check-interval: 10s
|
health-check-interval: 10s
|
||||||
health-check-port: 8089
|
# health-check-port: 8089
|
||||||
instance-id: ${spring.application.name}:${server.port}:${random.uuid}
|
instance-id: ${spring.application.name}:${server.port}:${random.uuid}
|
||||||
service-name: ${spring.application.name}
|
service-name: ${spring.application.name}
|
||||||
|
port: ${billing.http.port:8089}
|
||||||
|
|
||||||
server:
|
server:
|
||||||
port: 8089
|
port: 8089
|
||||||
|
|
||||||
|
billing:
|
||||||
|
http:
|
||||||
|
port: 8089 # Ktor API Port (Haupt-Einstiegspunkt für REST-Anfragen)
|
||||||
|
address: 0.0.0.0 # Öffentlich erreichbar innerhalb des Netzwerks / Containers
|
||||||
|
|
||||||
management:
|
management:
|
||||||
endpoints:
|
endpoints:
|
||||||
web:
|
web:
|
||||||
@@ -30,3 +39,12 @@ management:
|
|||||||
endpoint:
|
endpoint:
|
||||||
health:
|
health:
|
||||||
show-details: always
|
show-details: always
|
||||||
|
probes:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
|
logging:
|
||||||
|
level:
|
||||||
|
root: INFO
|
||||||
|
# at.mocode.billing: DEBUG
|
||||||
|
pattern:
|
||||||
|
console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user