merge: develop into main (resolve dependabot workflow conflict)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
28
.github/workflows/ci.yml
vendored
|
|
@ -40,12 +40,12 @@ jobs:
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.PNPM_VERSION }}
|
version: ${{ env.PNPM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
@ -73,12 +73,12 @@ jobs:
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.PNPM_VERSION }}
|
version: ${{ env.PNPM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
@ -117,12 +117,12 @@ jobs:
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.PNPM_VERSION }}
|
version: ${{ env.PNPM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
@ -178,7 +178,7 @@ jobs:
|
||||||
|
|
||||||
- name: Upload coverage report
|
- name: Upload coverage report
|
||||||
if: always()
|
if: always()
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
name: test-coverage
|
name: test-coverage
|
||||||
path: coverage/
|
path: coverage/
|
||||||
|
|
@ -196,12 +196,12 @@ jobs:
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.PNPM_VERSION }}
|
version: ${{ env.PNPM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
@ -230,7 +230,7 @@ jobs:
|
||||||
echo "Build successful - BUILD_ID: $(cat .next/BUILD_ID)"
|
echo "Build successful - BUILD_ID: $(cat .next/BUILD_ID)"
|
||||||
|
|
||||||
- name: Upload build artifacts
|
- name: Upload build artifacts
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
name: build-output
|
name: build-output
|
||||||
path: |
|
path: |
|
||||||
|
|
@ -267,12 +267,12 @@ jobs:
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.PNPM_VERSION }}
|
version: ${{ env.PNPM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
@ -281,7 +281,7 @@ jobs:
|
||||||
run: pnpm install --frozen-lockfile
|
run: pnpm install --frozen-lockfile
|
||||||
|
|
||||||
- name: Download build artifacts
|
- name: Download build artifacts
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v7
|
||||||
with:
|
with:
|
||||||
name: build-output
|
name: build-output
|
||||||
path: .next/
|
path: .next/
|
||||||
|
|
@ -325,7 +325,7 @@ jobs:
|
||||||
|
|
||||||
- name: Upload Playwright report
|
- name: Upload Playwright report
|
||||||
if: always()
|
if: always()
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
name: playwright-report
|
name: playwright-report
|
||||||
path: playwright-report/
|
path: playwright-report/
|
||||||
|
|
|
||||||
2
.github/workflows/dependabot-auto-merge.yml
vendored
|
|
@ -20,7 +20,7 @@ jobs:
|
||||||
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
github-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
|
||||||
- name: Wait for CI to pass
|
- name: Wait for CI to pass
|
||||||
uses: lewagon/wait-on-check-action@v1.3.4
|
uses: lewagon/wait-on-check-action@v1.5.0
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
|
||||||
4
.github/workflows/deploy-production.yml
vendored
|
|
@ -114,12 +114,12 @@ jobs:
|
||||||
ref: ${{ needs.preflight.outputs.deploy_sha }}
|
ref: ${{ needs.preflight.outputs.deploy_sha }}
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.PNPM_VERSION }}
|
version: ${{ env.PNPM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
||||||
4
.github/workflows/deploy-staging.yml
vendored
|
|
@ -35,12 +35,12 @@ jobs:
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.PNPM_VERSION }}
|
version: ${{ env.PNPM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
||||||
14
.github/workflows/security.yml
vendored
|
|
@ -40,12 +40,12 @@ jobs:
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.PNPM_VERSION }}
|
version: ${{ env.PNPM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
@ -81,12 +81,12 @@ jobs:
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.PNPM_VERSION }}
|
version: ${{ env.PNPM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
@ -118,12 +118,12 @@ jobs:
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Setup pnpm
|
- name: Setup pnpm
|
||||||
uses: pnpm/action-setup@v3
|
uses: pnpm/action-setup@v4
|
||||||
with:
|
with:
|
||||||
version: ${{ env.PNPM_VERSION }}
|
version: ${{ env.PNPM_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4
|
uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
node-version: ${{ env.NODE_VERSION }}
|
node-version: ${{ env.NODE_VERSION }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
@ -141,7 +141,7 @@ jobs:
|
||||||
|
|
||||||
- name: Upload test results
|
- name: Upload test results
|
||||||
if: always()
|
if: always()
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v6
|
||||||
with:
|
with:
|
||||||
name: security-test-results
|
name: security-test-results
|
||||||
path: |
|
path: |
|
||||||
|
|
|
||||||
40
CLAUDE.md
|
|
@ -10,9 +10,9 @@ Multi-Tenant CMS für 3 aktive Websites unter einer Payload CMS 3.x Instanz:
|
||||||
|
|
||||||
## Tech Stack
|
## Tech Stack
|
||||||
|
|
||||||
- **CMS:** Payload CMS 3.76.1
|
- **CMS:** Payload CMS 3.77.0
|
||||||
- **Framework:** Next.js 16.2.0-canary.41
|
- **Framework:** Next.js 16.2.0-canary.58
|
||||||
- **React:** 19.2.3
|
- **React:** 19.2.4
|
||||||
- **Sprache:** TypeScript
|
- **Sprache:** TypeScript
|
||||||
- **Runtime:** Node.js 22.x
|
- **Runtime:** Node.js 22.x
|
||||||
- **Datenbank:** PostgreSQL 17.6 (separater Server)
|
- **Datenbank:** PostgreSQL 17.6 (separater Server)
|
||||||
|
|
@ -410,4 +410,36 @@ Credentials in `~/.pgpass` (chmod 600), nie Klartext in `.env`.
|
||||||
### Scripts & Backup
|
### Scripts & Backup
|
||||||
- `scripts/backup/README.md` - Backup-System Dokumentation
|
- `scripts/backup/README.md` - Backup-System Dokumentation
|
||||||
|
|
||||||
*Letzte Aktualisierung: 14.02.2026*
|
## Codex CLI — Remote-Orchestrierung (sv-frontend)
|
||||||
|
|
||||||
|
OpenAI Codex CLI (`v0.101.0`, Model `gpt-5.3-codex`) ist auf sv-frontend installiert und kann von sv-payload aus non-interaktiv gesteuert werden. **Nutze Codex für Frontend-Aufgaben um Arbeit zu parallelisieren.**
|
||||||
|
|
||||||
|
**Wichtig:** Mehrere Codex-Sessions können parallel laufen — nutze dies für unabhängige Aufgaben in verschiedenen Projekten.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Einzelne Aufgabe (JSON-Output für Parsing):
|
||||||
|
ssh sv-frontend "codex exec -s danger-full-access -C ~/frontend.blogwoman.de 'prompt' --json 2>&1"
|
||||||
|
|
||||||
|
# Aufgabe mit Ergebnis-Datei:
|
||||||
|
ssh sv-frontend "codex exec -s danger-full-access -C ~/projekt -o /tmp/result.txt 'prompt' 2>&1"
|
||||||
|
|
||||||
|
# Parallele Aufgaben (in separaten SSH-Sessions):
|
||||||
|
ssh sv-frontend "codex exec -s danger-full-access -C ~/frontend.blogwoman.de 'task1' --json" &
|
||||||
|
ssh sv-frontend "codex exec -s danger-full-access -C ~/frontend.porwoll.de 'task2' --json" &
|
||||||
|
wait
|
||||||
|
```
|
||||||
|
|
||||||
|
**Wann Codex delegieren:**
|
||||||
|
- Frontend-Komponenten erstellen/ändern
|
||||||
|
- Lint/Format-Fehler in Frontend-Repos beheben
|
||||||
|
- Code-Reviews in Frontend-Projekten
|
||||||
|
- Tests schreiben für Frontend-Code
|
||||||
|
- Refactoring in Frontend-Repos
|
||||||
|
|
||||||
|
**Einschränkungen:**
|
||||||
|
- **MUSS** `-s danger-full-access` verwenden (`workspace-write` hat Landlock-Fehler)
|
||||||
|
- `rg` (ripgrep) nicht installiert — Codex nutzt `find` als Fallback
|
||||||
|
- Keine `~/.codex/config.toml` — Konfiguration nur via CLI-Flags
|
||||||
|
- Kein Git-Commit durch Codex — nur Code-Änderungen, Commit/Push über SSH
|
||||||
|
|
||||||
|
*Letzte Aktualisierung: 22.02.2026*
|
||||||
|
|
|
||||||
43
docs/zweitmeinung/Website_Guide.md
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
Hier ist eine kurze Anleitung im Markdown-Format, die du direkt als System-Prompt oder Instruktion für eine Frontend-KI verwenden kannst, um hochwertige ("Premium") Webseiten zu generieren:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
# Anleitung für die Frontend-KI: Umsetzung von Premium-Webseiten
|
||||||
|
|
||||||
|
**Ziel:** Deine Aufgabe ist es, Webseiten zu generieren, die sofortiges Vertrauen aufbauen und professionell wirken. Die Website darf niemals "billig" oder hastig zusammengebaut wirken. Eine Premium-Website ist nicht lauter, sondern **klarer, ruhiger und bewusster**.
|
||||||
|
|
||||||
|
Halte dich bei der Generierung von Code, Layouts und Styles strikt an die folgenden Gestaltungsprinzipien:
|
||||||
|
|
||||||
|
## 1. Fundament & Erster Eindruck
|
||||||
|
|
||||||
|
- **Klare Botschaft "Above the Fold":** Der Besucher muss sofort und ohne zu scrollen verstehen, was angeboten wird, für wen es ist und warum es wichtig ist.
|
||||||
|
- **Absichtsvolles Layout (Kein "DIY-Look"):** Vermeide Layouts, die nach billigen Templates aussehen. Selbst die einfachsten Strukturen müssen bewusst und durchdacht wirken.
|
||||||
|
- **Vertrauenssignale:** Sorge durch visuelle Klarheit und ein professionelles Auftreten dafür, dass die Seite sofort seriös und sicher wirkt.
|
||||||
|
|
||||||
|
## 2. Visuelle Struktur & Grafiken
|
||||||
|
|
||||||
|
- **Maßgeschneiderte Optik statt Stock-Material:** Verzichte auf generische Stock-Icons. Nutze visuelle Elemente, die exakt zur Tonalität und Farbpalette der Marke passen.
|
||||||
|
- **Funktion vor reiner Dekoration:** Nutze Grafiken gezielt, um die Aufmerksamkeit zu lenken, Inhalte aufzulockern und Informationen leichter verdaulich zu machen. Vermeide absolutes visuelles Rauschen – jedes Element muss sich seinen Platz verdienen.
|
||||||
|
|
||||||
|
## 3. Markenstrategie (Farben & Typografie)
|
||||||
|
|
||||||
|
- **Farb-Minimalismus:** Implementiere ein kohärentes Farbsystem. Setze auf **Zurückhaltung statt Vielfalt** – wenige Farben, die souverän eingesetzt werden, sorgen für einen hochwertigen Look.
|
||||||
|
- **Exzellente Typografie:** Wähle anspruchsvolle, professionelle Schriftarten. **Lesbarkeit steht an erster Stelle** – verwende niemals schwer lesbare, veraltete oder unprofessionelle Fonts.
|
||||||
|
|
||||||
|
## 4. Subtile Animationen & Interaktionen
|
||||||
|
|
||||||
|
- **Lebendig, aber nicht chaotisch:** Nutze dezente, scrollbasierte Bewegungen, bei denen Elemente natürlich einblenden.
|
||||||
|
- **Feedback ohne Reibung:** Buttons und Links müssen auf Hover und Klicks flüssig reagieren.
|
||||||
|
- **Keine Spielereien:** Verzichte auf alles, was sich grundlos dreht, hüpft oder die Aufmerksamkeit vom eigentlichen Inhalt ablenkt. Animationen sollen den Nutzer führen, nicht verwirren.
|
||||||
|
|
||||||
|
## 5. User Experience (UX) & Call-to-Actions
|
||||||
|
|
||||||
|
- **Klare Nutzerführung (User Journey):** Jede Sektion und jede Seite muss natürlich zum nächsten logischen Schritt führen.
|
||||||
|
- **Keine Entscheidungsparalyse:** Der Besucher darf nie überlegen müssen, was er als Nächstes tun soll.
|
||||||
|
- **Sichtbare CTAs:** Call-to-Actions müssen offensichtlich platziert und leicht auffindbar sein.
|
||||||
|
- **Semantischer Aufbau:** Strukturiere den HTML-Code und die Seitenhierarchie logisch – optimiert für menschliche Besucher und SEO-Algorithmen.
|
||||||
|
|
||||||
|
## 6. Code-Wartbarkeit & Langlebigkeit
|
||||||
|
|
||||||
|
- **Keine "Black-Box":** Entwickle den Code sauber und modular, sodass spätere Aktualisierungen durch den Betreiber leicht möglich sind, ohne dass die Struktur zerbricht.
|
||||||
|
- Das Setup muss darauf ausgelegt sein, dass Seiten, Services und Inhalte in Zukunft unkompliziert erweitert werden können.
|
||||||
|
```
|
||||||
1212
docs/zweitmeinung/content-inventory-production.md
Normal file
1618
docs/zweitmeinung/migration-strapi-to-payload.md
Normal file
BIN
docs/zweitmeinung/screenshots/FAQ.jpeg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
docs/zweitmeinung/screenshots/Startseite.jpeg
Normal file
|
After Width: | Height: | Size: 506 KiB |
BIN
docs/zweitmeinung/screenshots/impressum.jpeg
Normal file
|
After Width: | Height: | Size: 721 KiB |
BIN
docs/zweitmeinung/screenshots/intensivmedizin.jpeg
Normal file
|
After Width: | Height: | Size: 977 KiB |
BIN
docs/zweitmeinung/screenshots/kardiologie.jpeg
Normal file
|
After Width: | Height: | Size: 986 KiB |
BIN
docs/zweitmeinung/screenshots/kontakt.jpeg
Normal file
|
After Width: | Height: | Size: 672 KiB |
BIN
docs/zweitmeinung/screenshots/motivation.jpeg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
docs/zweitmeinung/screenshots/news.png
Normal file
|
After Width: | Height: | Size: 849 KiB |
BIN
docs/zweitmeinung/screenshots/onkologie.jpeg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
docs/zweitmeinung/screenshots/ueberuns01.png
Normal file
|
After Width: | Height: | Size: 531 KiB |
BIN
docs/zweitmeinung/screenshots/ueberuns02.png
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
docs/zweitmeinung/screenshots/ueberuns03.jpeg
Normal file
|
After Width: | Height: | Size: 993 KiB |
BIN
docs/zweitmeinung/screenshots/ueberuns04.png
Normal file
|
After Width: | Height: | Size: 1.3 MiB |
BIN
docs/zweitmeinung/screenshots/ueberuns05.png
Normal file
|
After Width: | Height: | Size: 261 KiB |
BIN
docs/zweitmeinung/screenshots/warumunswaehlen.png
Normal file
|
After Width: | Height: | Size: 243 KiB |
82
package.json
|
|
@ -27,61 +27,61 @@
|
||||||
"prepare": "test -d .git && (ln -sf ../../scripts/detect-secrets.sh .git/hooks/pre-commit 2>/dev/null || true) || true"
|
"prepare": "test -d .git && (ln -sf ../../scripts/detect-secrets.sh .git/hooks/pre-commit 2>/dev/null || true) || true"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@anthropic-ai/sdk": "^0.71.2",
|
"@anthropic-ai/sdk": "^0.78.0",
|
||||||
"@fullcalendar/core": "^6.1.20",
|
"@fullcalendar/core": "^6.1.20",
|
||||||
"@fullcalendar/daygrid": "^6.1.20",
|
"@fullcalendar/daygrid": "^6.1.20",
|
||||||
"@fullcalendar/interaction": "^6.1.20",
|
"@fullcalendar/interaction": "^6.1.20",
|
||||||
"@fullcalendar/list": "^6.1.20",
|
"@fullcalendar/list": "^6.1.20",
|
||||||
"@fullcalendar/react": "^6.1.20",
|
"@fullcalendar/react": "^6.1.20",
|
||||||
"@fullcalendar/timegrid": "^6.1.20",
|
"@fullcalendar/timegrid": "^6.1.20",
|
||||||
"@payloadcms/db-postgres": "3.76.1",
|
"@payloadcms/db-postgres": "3.77.0",
|
||||||
"@payloadcms/next": "3.76.1",
|
"@payloadcms/next": "3.77.0",
|
||||||
"@payloadcms/plugin-form-builder": "3.76.1",
|
"@payloadcms/plugin-form-builder": "3.77.0",
|
||||||
"@payloadcms/plugin-multi-tenant": "3.76.1",
|
"@payloadcms/plugin-multi-tenant": "3.77.0",
|
||||||
"@payloadcms/plugin-nested-docs": "3.76.1",
|
"@payloadcms/plugin-nested-docs": "3.77.0",
|
||||||
"@payloadcms/plugin-redirects": "3.76.1",
|
"@payloadcms/plugin-redirects": "3.77.0",
|
||||||
"@payloadcms/plugin-seo": "3.76.1",
|
"@payloadcms/plugin-seo": "3.77.0",
|
||||||
"@payloadcms/richtext-lexical": "3.76.1",
|
"@payloadcms/richtext-lexical": "3.77.0",
|
||||||
"@payloadcms/translations": "3.76.1",
|
"@payloadcms/translations": "3.77.0",
|
||||||
"@payloadcms/ui": "3.76.1",
|
"@payloadcms/ui": "3.77.0",
|
||||||
"@types/pdfkit": "^0.17.4",
|
"@types/pdfkit": "^0.17.5",
|
||||||
"bullmq": "^5.65.1",
|
"bullmq": "^5.70.1",
|
||||||
"cross-env": "^7.0.3",
|
"cross-env": "^10.1.0",
|
||||||
"date-fns": "^4.1.0",
|
"date-fns": "^4.1.0",
|
||||||
"dotenv": "16.4.7",
|
"dotenv": "17.3.1",
|
||||||
"exceljs": "^4.4.0",
|
"exceljs": "^4.4.0",
|
||||||
"googleapis": "^170.0.0",
|
"googleapis": "^171.4.0",
|
||||||
"ioredis": "^5.8.2",
|
"ioredis": "^5.9.3",
|
||||||
"next": "16.2.0-canary.41",
|
"next": "16.2.0-canary.58",
|
||||||
"node-cron": "^4.2.1",
|
"node-cron": "^4.2.1",
|
||||||
"nodemailer": "^7.0.11",
|
"nodemailer": "^8.0.1",
|
||||||
"payload": "3.76.1",
|
"payload": "3.77.0",
|
||||||
"payload-oapi": "^0.2.5",
|
"payload-oapi": "^0.2.5",
|
||||||
"pdfkit": "^0.17.2",
|
"pdfkit": "^0.17.2",
|
||||||
"react": "19.2.3",
|
"react": "19.2.4",
|
||||||
"react-dom": "19.2.3",
|
"react-dom": "19.2.4",
|
||||||
"recharts": "^3.6.0",
|
"recharts": "^3.7.0",
|
||||||
"sharp": "0.34.5"
|
"sharp": "0.34.5"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@playwright/test": "1.57.0",
|
"@playwright/test": "1.58.2",
|
||||||
"@types/node": "^22.10.2",
|
"@types/node": "^25.3.0",
|
||||||
"@types/node-cron": "^3.0.11",
|
"@types/node-cron": "^3.0.11",
|
||||||
"@types/nodemailer": "^7.0.4",
|
"@types/nodemailer": "^7.0.11",
|
||||||
"@types/react": "19.2.7",
|
"@types/react": "19.2.14",
|
||||||
"@types/react-dom": "19.2.3",
|
"@types/react-dom": "19.2.3",
|
||||||
"@vitejs/plugin-react": "4.5.2",
|
"@vitejs/plugin-react": "5.1.4",
|
||||||
"@vitest/coverage-v8": "4.0.15",
|
"@vitest/coverage-v8": "4.0.18",
|
||||||
"drizzle-kit": "^0.31.8",
|
"drizzle-kit": "^0.31.9",
|
||||||
"eslint": "^9.39.2",
|
"eslint": "^9.39.3",
|
||||||
"eslint-config-next": "16.2.0-canary.41",
|
"eslint-config-next": "16.2.0-canary.58",
|
||||||
"jsdom": "26.1.0",
|
"jsdom": "28.1.0",
|
||||||
"playwright": "1.57.0",
|
"playwright": "1.58.2",
|
||||||
"prettier": "^3.7.4",
|
"prettier": "^3.8.1",
|
||||||
"tsx": "^4.21.0",
|
"tsx": "^4.21.0",
|
||||||
"typescript": "5.9.3",
|
"typescript": "5.9.3",
|
||||||
"vite-tsconfig-paths": "6.0.0",
|
"vite-tsconfig-paths": "6.1.1",
|
||||||
"vitest": "4.0.15"
|
"vitest": "4.0.18"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=20.9.0",
|
"node": ">=20.9.0",
|
||||||
|
|
@ -92,6 +92,12 @@
|
||||||
"sharp",
|
"sharp",
|
||||||
"esbuild",
|
"esbuild",
|
||||||
"unrs-resolver"
|
"unrs-resolver"
|
||||||
]
|
],
|
||||||
|
"overrides": {
|
||||||
|
"minimatch": ">=10.2.1",
|
||||||
|
"esbuild": ">=0.25.0",
|
||||||
|
"ajv": ">=8.18.0",
|
||||||
|
"ioredis": "5.9.3"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
3818
pnpm-lock.yaml
|
|
@ -208,8 +208,21 @@ async function seed() {
|
||||||
categorySlug: 'emergency',
|
categorySlug: 'emergency',
|
||||||
order: 1,
|
order: 1,
|
||||||
isFeatured: true,
|
isFeatured: true,
|
||||||
|
icon: 'activity',
|
||||||
shortDescription:
|
shortDescription:
|
||||||
'Unabhängige ärztliche Zweitmeinung bei laufender oder geplanter Intensivbehandlung. Wir prüfen medizinische Indikation, Patientenwille und Behandlungsalternativen – empathisch, neutral und fachlich fundiert.',
|
'Unabhängige ärztliche Zweitmeinung bei laufender oder geplanter Intensivbehandlung. Wir prüfen medizinische Indikation, Patientenwille und Behandlungsalternativen – empathisch, neutral und fachlich fundiert.',
|
||||||
|
features: [
|
||||||
|
{ title: 'Unabhängige Beurteilung durch erfahrene Intensivmediziner', description: 'Neutrale Einschätzung ohne wirtschaftliche Eigeninteressen – ausschließlich in Ihrem Interesse.', icon: 'shield' },
|
||||||
|
{ title: 'Vermeidung unnötiger Eingriffe bei fehlender Indikation', description: 'Schutz vor überflüssigen invasiven Behandlungen durch fundierte medizinische Bewertung.', icon: 'file-check' },
|
||||||
|
{ title: 'Besseres Verständnis der Risiken und Therapieziele', description: 'Umfassende Aufklärung über alle Behandlungsoptionen und deren Auswirkungen.', icon: 'users' },
|
||||||
|
{ title: 'Stärkung Ihrer Entscheidungssicherheit und Eigenverantwortung', description: 'Fundierte Basis für selbstbestimmte Entscheidungen über Ihre Versorgung.', icon: 'heart-handshake' },
|
||||||
|
],
|
||||||
|
detailSections: [
|
||||||
|
{ title: 'Strukturierte Beratung durch erfahrene Case Manager:innen', content: createRichText('Individuelle Betreuung für Ihre weitere Behandlungsplanung.') },
|
||||||
|
{ title: 'Unabhängige ärztliche Zweitmeinung inkl. schriftlichem Gutachten', content: createRichText('Fundierte Einschätzung durch Fachärzt:innen für Intensivmedizin.') },
|
||||||
|
{ title: 'Bewertung von Therapiezielen, Indikationen und Prognose', content: createRichText('Umfassende Analyse aller relevanten medizinischen Aspekte.') },
|
||||||
|
{ title: 'Unterstützung bei palliativer Umsteuerung bis Pflegeüberleitung', content: createRichText('Begleitung bei der Umsetzung der empfohlenen Maßnahmen.') },
|
||||||
|
],
|
||||||
description: createRichTextComplex([
|
description: createRichTextComplex([
|
||||||
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Intensiv – fundierte Beratung in kritischen Situationen' },
|
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Intensiv – fundierte Beratung in kritischen Situationen' },
|
||||||
{
|
{
|
||||||
|
|
@ -256,8 +269,21 @@ async function seed() {
|
||||||
categorySlug: 'consultation',
|
categorySlug: 'consultation',
|
||||||
order: 2,
|
order: 2,
|
||||||
isFeatured: true,
|
isFeatured: true,
|
||||||
|
icon: 'heart',
|
||||||
shortDescription:
|
shortDescription:
|
||||||
'Unabhängige ärztliche Zweitmeinung vor Herzkatheter, Stent oder OP. Fundierte Empfehlung durch erfahrene Kardiolog:innen – verständlich, sicher, neutral.',
|
'Unabhängige ärztliche Zweitmeinung vor Herzkatheter, Stent oder OP. Fundierte Empfehlung durch erfahrene Kardiolog:innen – verständlich, sicher, neutral.',
|
||||||
|
features: [
|
||||||
|
{ title: 'Unabhängige Beurteilung durch erfahrene Kardiolog:innen', description: 'Neutrale Einschätzung Ihrer kardiologischen Befunde ohne wirtschaftliche Interessen.', icon: 'shield' },
|
||||||
|
{ title: 'Vermeidung unnötiger Eingriffe bei fehlender Indikation', description: 'Schutz vor überflüssigen invasiven Behandlungen durch fundierte Bewertung.', icon: 'file-check' },
|
||||||
|
{ title: 'Besseres Verständnis der Risiken und Therapieziele', description: 'Umfassende Aufklärung über alle Behandlungsoptionen.', icon: 'users' },
|
||||||
|
{ title: 'Stärkung Ihrer Entscheidungssicherheit', description: 'Fundierte Basis für selbstbestimmte Entscheidungen über Ihre Herzgesundheit.', icon: 'heart-handshake' },
|
||||||
|
],
|
||||||
|
detailSections: [
|
||||||
|
{ title: 'Bewertung Ihrer Diagnosen und EKG-/Katheterbefunde', content: createRichText('Sach- und leitliniengerechte Beurteilung durch Fachärzt:innen.') },
|
||||||
|
{ title: 'Zweitmeinung bei geplanter PCI, Bypass-OP oder Umstellung', content: createRichText('Unabhängige Einschätzung aller kardiologischen Behandlungsoptionen.') },
|
||||||
|
{ title: 'Schriftliches ärztliches Gutachten mit klarer Empfehlung', content: createRichText('Nachvollziehbare, fundierte Empfehlung für Ihre Entscheidung.') },
|
||||||
|
{ title: 'Persönliche Erläuterung telefonisch oder per Video', content: createRichText('Direkter Austausch mit unseren Kardiologie-Expert:innen.') },
|
||||||
|
],
|
||||||
description: createRichTextComplex([
|
description: createRichTextComplex([
|
||||||
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Kardiologie – klare Empfehlungen bei Herzentscheidungen' },
|
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Kardiologie – klare Empfehlungen bei Herzentscheidungen' },
|
||||||
{
|
{
|
||||||
|
|
@ -289,8 +315,21 @@ async function seed() {
|
||||||
categorySlug: 'consultation',
|
categorySlug: 'consultation',
|
||||||
order: 3,
|
order: 3,
|
||||||
isFeatured: true,
|
isFeatured: true,
|
||||||
|
icon: 'flask-conical',
|
||||||
shortDescription:
|
shortDescription:
|
||||||
'Unabhängige ärztliche Zweitmeinung bei Krebs. Fundierte Einschätzung von Therapieoptionen durch erfahrene Onkolog:innen – empathisch, verständlich, individuell.',
|
'Unabhängige ärztliche Zweitmeinung bei Krebs. Fundierte Einschätzung von Therapieoptionen durch erfahrene Onkolog:innen – empathisch, verständlich, individuell.',
|
||||||
|
features: [
|
||||||
|
{ title: 'Unabhängige Beurteilung durch erfahrene Onkolog:innen', description: 'Neutrale Einschätzung Ihrer Krebsdiagnose und Therapieoptionen.', icon: 'shield' },
|
||||||
|
{ title: 'Bewertung von Wirksamkeit und Nebenwirkungen', description: 'Transparente Analyse aller Behandlungswege und deren Auswirkungen auf Ihre Lebensqualität.', icon: 'file-check' },
|
||||||
|
{ title: 'Einbindung von Case Management und Palliativberatung', description: 'Ganzheitliche Betreuung über die reine Diagnose hinaus.', icon: 'users' },
|
||||||
|
{ title: 'Stärkung Ihrer Entscheidungssicherheit', description: 'Fundierte Grundlage für informierte Therapieentscheidungen.', icon: 'heart-handshake' },
|
||||||
|
],
|
||||||
|
detailSections: [
|
||||||
|
{ title: 'Auswertung Ihrer Diagnose und Befunde', content: createRichText('Umfassende Prüfung durch erfahrene Fachärzt:innen.') },
|
||||||
|
{ title: 'Bewertung der geplanten Therapie', content: createRichText('Analyse von Wirksamkeit, Nebenwirkungen und Lebensqualität.') },
|
||||||
|
{ title: 'Schriftliches Zweitmeinungsgutachten', content: createRichText('Nachvollziehbare, medizinisch fundierte Empfehlung.') },
|
||||||
|
{ title: 'Optionales Gespräch per Telefon oder Video', content: createRichText('Persönliche Erläuterung und Beantwortung Ihrer Fragen.') },
|
||||||
|
],
|
||||||
description: createRichTextComplex([
|
description: createRichTextComplex([
|
||||||
{
|
{
|
||||||
type: 'heading',
|
type: 'heading',
|
||||||
|
|
@ -327,8 +366,21 @@ async function seed() {
|
||||||
categorySlug: 'consultation',
|
categorySlug: 'consultation',
|
||||||
order: 4,
|
order: 4,
|
||||||
isFeatured: false,
|
isFeatured: false,
|
||||||
|
icon: 'stethoscope',
|
||||||
shortDescription:
|
shortDescription:
|
||||||
'Unabhängige ärztliche Einschätzung bei Nierenerkrankungen, Dialyseempfehlung oder Transplantationsvorbereitung. Klar, neutral und verständlich erklärt.',
|
'Unabhängige ärztliche Einschätzung bei Nierenerkrankungen, Dialyseempfehlung oder Transplantationsvorbereitung. Klar, neutral und verständlich erklärt.',
|
||||||
|
features: [
|
||||||
|
{ title: 'Unabhängige Beurteilung durch erfahrene Nephrolog:innen', description: 'Neutrale Einschätzung Ihrer nephrologischen Diagnostik.', icon: 'shield' },
|
||||||
|
{ title: 'Prüfung der Dialyse-Notwendigkeit', description: 'Bewertung ob und wann eine Dialyse tatsächlich erforderlich ist.', icon: 'file-check' },
|
||||||
|
{ title: 'Bewertung konservativer Behandlungsoptionen', description: 'Prüfung alternativer Therapiewege vor invasiven Maßnahmen.', icon: 'users' },
|
||||||
|
{ title: 'Stärkung Ihrer Entscheidungssicherheit', description: 'Fundierte Basis für selbstbestimmte Entscheidungen.', icon: 'heart-handshake' },
|
||||||
|
],
|
||||||
|
detailSections: [
|
||||||
|
{ title: 'Prüfung der nephrologischen Diagnostik und Laborwerte', content: createRichText('Umfassende Analyse Ihrer Nierenfunktionswerte.') },
|
||||||
|
{ title: 'Zweitmeinung durch Fachärzt:innen für Nephrologie', content: createRichText('Unabhängige Einschätzung erfahrener Spezialist:innen.') },
|
||||||
|
{ title: 'Gutachten zur Notwendigkeit einer Dialyse', content: createRichText('Klare Empfehlung zum Zeitpunkt und zur Art der Behandlung.') },
|
||||||
|
{ title: 'Bewertung konservativer Behandlungsoptionen', content: createRichText('Prüfung aller verfügbaren Therapiealternativen.') },
|
||||||
|
],
|
||||||
description: createRichTextComplex([
|
description: createRichTextComplex([
|
||||||
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Nephrologie – Klarheit bei Nierenentscheidungen' },
|
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Nephrologie – Klarheit bei Nierenentscheidungen' },
|
||||||
{
|
{
|
||||||
|
|
@ -356,8 +408,21 @@ async function seed() {
|
||||||
categorySlug: 'consultation',
|
categorySlug: 'consultation',
|
||||||
order: 5,
|
order: 5,
|
||||||
isFeatured: false,
|
isFeatured: false,
|
||||||
|
icon: 'pill',
|
||||||
shortDescription:
|
shortDescription:
|
||||||
'Unabhängige ärztliche Zweitmeinung vor einer geplanten Gallenblasen-OP. Wir prüfen, ob der Eingriff medizinisch notwendig ist – verständlich, neutral und leitlinienbasiert.',
|
'Unabhängige ärztliche Zweitmeinung vor einer geplanten Gallenblasen-OP. Wir prüfen, ob der Eingriff medizinisch notwendig ist – verständlich, neutral und leitlinienbasiert.',
|
||||||
|
features: [
|
||||||
|
{ title: 'Unabhängige Beurteilung durch erfahrene Chirurg:innen', description: 'Neutrale Einschätzung der OP-Indikation.', icon: 'shield' },
|
||||||
|
{ title: 'Vermeidung unnötiger Operationen', description: 'Schutz vor überflüssigen Eingriffen durch fundierte Bewertung.', icon: 'file-check' },
|
||||||
|
{ title: 'Aufklärung über konservative Alternativen', description: 'Information über nicht-operative Behandlungsmöglichkeiten.', icon: 'users' },
|
||||||
|
{ title: 'Verständliche Erklärung der Befunde', description: 'Klare Darstellung von Risiken und Nutzen.', icon: 'heart-handshake' },
|
||||||
|
],
|
||||||
|
detailSections: [
|
||||||
|
{ title: 'Bewertung Ihrer Beschwerden und Untersuchungsergebnisse', content: createRichText('Sorgfältige Analyse aller vorliegenden Befunde.') },
|
||||||
|
{ title: 'Prüfung der OP-Indikation nach medizinischen Leitlinien', content: createRichText('Leitlinienbasierte Bewertung der Operationsnotwendigkeit.') },
|
||||||
|
{ title: 'Zweitmeinung durch Viszeralchirurg:innen oder Gastroenterolog:innen', content: createRichText('Unabhängige Einschätzung spezialisierter Fachärzt:innen.') },
|
||||||
|
{ title: 'Verständliches Gutachten mit klarer Empfehlung', content: createRichText('Nachvollziehbare Entscheidungsgrundlage.') },
|
||||||
|
],
|
||||||
description: createRichTextComplex([
|
description: createRichTextComplex([
|
||||||
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Gallenblase – unnötige Operationen vermeiden' },
|
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Gallenblase – unnötige Operationen vermeiden' },
|
||||||
{
|
{
|
||||||
|
|
@ -394,8 +459,21 @@ async function seed() {
|
||||||
categorySlug: 'consultation',
|
categorySlug: 'consultation',
|
||||||
order: 6,
|
order: 6,
|
||||||
isFeatured: false,
|
isFeatured: false,
|
||||||
|
icon: 'brain',
|
||||||
shortDescription:
|
shortDescription:
|
||||||
'Unabhängige ärztliche Einschätzung vor einer geplanten Schilddrüsen-OP. Fundierte Zweitmeinung durch erfahrene Endokrinolog:innen – individuell, neutral, verständlich.',
|
'Unabhängige ärztliche Einschätzung vor einer geplanten Schilddrüsen-OP. Fundierte Zweitmeinung durch erfahrene Endokrinolog:innen – individuell, neutral, verständlich.',
|
||||||
|
features: [
|
||||||
|
{ title: 'Unabhängige Beurteilung durch erfahrene Endokrinolog:innen', description: 'Neutrale Einschätzung Ihrer Schilddrüsenbefunde.', icon: 'shield' },
|
||||||
|
{ title: 'Prüfung der OP-Notwendigkeit', description: 'Bewertung ob eine Operation tatsächlich indiziert ist.', icon: 'file-check' },
|
||||||
|
{ title: 'Bewertung konservativer Alternativen', description: 'Prüfung medikamentöser oder abwartender Therapieoptionen.', icon: 'users' },
|
||||||
|
{ title: 'Verständliche Erklärung der Befunde', description: 'Nachvollziehbare Darstellung aller Optionen.', icon: 'heart-handshake' },
|
||||||
|
],
|
||||||
|
detailSections: [
|
||||||
|
{ title: 'Prüfung von Ultraschallbefunden, Szintigrammen, Laborwerten', content: createRichText('Umfassende Analyse aller diagnostischen Ergebnisse.') },
|
||||||
|
{ title: 'Zweitmeinung durch Endokrinolog:innen oder Schilddrüsenchirurg:innen', content: createRichText('Spezialisierte Fachärzt:innen bewerten Ihren Fall.') },
|
||||||
|
{ title: 'Schriftliches Gutachten mit nachvollziehbarer Empfehlung', content: createRichText('Fundierte Entscheidungsgrundlage für Sie und Ihre Ärzt:innen.') },
|
||||||
|
{ title: 'Bei Bedarf: telefonische Erläuterung', content: createRichText('Persönliches Gespräch zu allen offenen Fragen.') },
|
||||||
|
],
|
||||||
description: createRichTextComplex([
|
description: createRichTextComplex([
|
||||||
{
|
{
|
||||||
type: 'heading',
|
type: 'heading',
|
||||||
|
|
|
||||||
75
scripts/setup-github-protection.sh
Executable file
|
|
@ -0,0 +1,75 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Setup GitHub branch protection and auto-merge for Dependabot
|
||||||
|
# Repository: complexcaresolutions/cms.c2sgmbh
|
||||||
|
#
|
||||||
|
# Voraussetzungen:
|
||||||
|
# - gh CLI installiert und authentifiziert (gh auth login)
|
||||||
|
# - Admin-Rechte auf das Repository
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
REPO="complexcaresolutions/cms.c2sgmbh"
|
||||||
|
BRANCH="main"
|
||||||
|
|
||||||
|
echo "=== GitHub Repository Setup für Dependabot ==="
|
||||||
|
echo "Repository: $REPO"
|
||||||
|
echo "Branch: $BRANCH"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# 1. Prüfe gh CLI Auth
|
||||||
|
echo "[1/4] Prüfe GitHub CLI Authentifizierung..."
|
||||||
|
if ! gh auth status &>/dev/null; then
|
||||||
|
echo "FEHLER: gh CLI nicht authentifiziert. Bitte 'gh auth login' ausführen."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo " OK"
|
||||||
|
|
||||||
|
# 2. Auto-Merge aktivieren
|
||||||
|
echo "[2/4] Aktiviere Auto-Merge in Repository-Settings..."
|
||||||
|
gh api "repos/$REPO" \
|
||||||
|
--method PATCH \
|
||||||
|
--field allow_auto_merge=true \
|
||||||
|
--silent
|
||||||
|
echo " OK"
|
||||||
|
|
||||||
|
# 3. Branch Protection setzen
|
||||||
|
echo "[3/4] Setze Branch Protection auf '$BRANCH'..."
|
||||||
|
gh api "repos/$REPO/branches/$BRANCH/protection" \
|
||||||
|
--method PUT \
|
||||||
|
--input - <<'EOF'
|
||||||
|
{
|
||||||
|
"required_status_checks": {
|
||||||
|
"strict": true,
|
||||||
|
"contexts": ["CI Success"]
|
||||||
|
},
|
||||||
|
"enforce_admins": false,
|
||||||
|
"required_pull_request_reviews": {
|
||||||
|
"required_approving_review_count": 0,
|
||||||
|
"dismiss_stale_reviews": false,
|
||||||
|
"require_code_owner_reviews": false
|
||||||
|
},
|
||||||
|
"restrictions": null,
|
||||||
|
"allow_force_pushes": false,
|
||||||
|
"allow_deletions": false
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
echo " OK"
|
||||||
|
|
||||||
|
# 4. Verifizierung
|
||||||
|
echo "[4/4] Verifiziere Konfiguration..."
|
||||||
|
echo ""
|
||||||
|
echo "--- Auto-Merge ---"
|
||||||
|
gh api "repos/$REPO" --jq '" allow_auto_merge: \(.allow_auto_merge)"'
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "--- Branch Protection ($BRANCH) ---"
|
||||||
|
gh api "repos/$REPO/branches/$BRANCH/protection/required_status_checks" \
|
||||||
|
--jq '" strict: \(.strict)\n checks: \(.contexts | join(", "))"'
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Setup abgeschlossen ==="
|
||||||
|
echo ""
|
||||||
|
echo "Nächste Schritte:"
|
||||||
|
echo " - Dependabot erstellt ab morgen 04:00 automatisch PRs"
|
||||||
|
echo " - Patch-Updates werden nach CI-Success auto-gemergt"
|
||||||
|
echo " - Major/Minor-Updates erfordern manuelles Review"
|
||||||
|
|
@ -58,6 +58,7 @@ export const Users: CollectionConfig = {
|
||||||
type: 'checkbox',
|
type: 'checkbox',
|
||||||
label: 'Super Admin',
|
label: 'Super Admin',
|
||||||
defaultValue: false,
|
defaultValue: false,
|
||||||
|
saveToJWT: true,
|
||||||
access: {
|
access: {
|
||||||
read: superAdminFieldAccess,
|
read: superAdminFieldAccess,
|
||||||
create: superAdminFieldAccess,
|
create: superAdminFieldAccess,
|
||||||
|
|
|
||||||
|
|
@ -193,6 +193,8 @@ export default buildConfig({
|
||||||
'https://porwoll.de',
|
'https://porwoll.de',
|
||||||
'https://www.porwoll.de',
|
'https://www.porwoll.de',
|
||||||
'https://pl.porwoll.tech',
|
'https://pl.porwoll.tech',
|
||||||
|
'https://pl.c2sgmbh.de',
|
||||||
|
'https://cms.c2sgmbh.de',
|
||||||
],
|
],
|
||||||
// CSRF Protection
|
// CSRF Protection
|
||||||
csrf: [
|
csrf: [
|
||||||
|
|
@ -205,6 +207,8 @@ export default buildConfig({
|
||||||
'https://porwoll.de',
|
'https://porwoll.de',
|
||||||
'https://www.porwoll.de',
|
'https://www.porwoll.de',
|
||||||
'https://pl.porwoll.tech',
|
'https://pl.porwoll.tech',
|
||||||
|
'https://pl.c2sgmbh.de',
|
||||||
|
'https://cms.c2sgmbh.de',
|
||||||
],
|
],
|
||||||
collections: [
|
collections: [
|
||||||
Users,
|
Users,
|
||||||
|
|
|
||||||