Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
2571ac0
chore: bump version to 1.7.2 / versionCode 68
S540d Jul 8, 2026
46a7955
Merge pull request #275 from S540d/chore/version-1.7.2
S540d Jul 8, 2026
eb37133
fix: expo-file-system/expo-sharing auf SDK-55-Versionen anheben
S540d Jul 8, 2026
7314e00
Merge pull request #277 from S540d/build/v1.7.2-vc68
S540d Jul 9, 2026
fb77a24
docs: Play-Store-Listing-Vorlage (Titel, Kurz- & Langbeschreibung) un…
claude Jul 12, 2026
c9089a6
Merge pull request #280 from S540d/claude/app-growth-strategy-534t2a
S540d Jul 12, 2026
3b5c294
feat: SEO- und Trust-Ausbau der gh-pages-Demo (Issue #279, 3.4)
claude Jul 12, 2026
1e5227a
Merge pull request #282 from S540d/claude/issue-279-point-3-4-culcs9
S540d Jul 12, 2026
402feaf
Android Large-Screen-Kompatibilität für Play Store (Issue #278) (#281)
S540d Jul 12, 2026
a43afcc
chore: project-templates sync (GLOBAL POLICY + commands) (#283)
S540d Jul 12, 2026
943b291
feat: Mascot + einheitliches Fortschrittssystem, Altersstufen-Auswahl…
S540d Jul 14, 2026
2c48bf1
docs: Illustrations-Stilguide für Level-SVGs (Issue #279, 2.1) (#285)
S540d Jul 14, 2026
c93e264
Add Natur/Märchen/Essen v1 theme packs (Issue #279, 1.5) (#288)
S540d Jul 14, 2026
5c9203f
Fix: PR #286/#287 Inhalte (Lottie/Icon-Refresh, Tablet-Landscape) nac…
S540d Jul 14, 2026
03458e1
fix: expo-file-system auf 55.0.24 heben (Kotlin-Kompilierungsfehler)
S540d Jul 15, 2026
fbd6386
chore: expo-Module auf SDK-55-Sollstand + foojay-Gradle-9-Fix (Issue …
S540d Jul 15, 2026
d71f7d8
chore: android/ + ios/ in .gitignore (Expo CNG/Prebuild-Workflow)
S540d Jul 15, 2026
90bebd8
feat: build-doctor Preflight-Skript für lokale Android-Builds
S540d Jul 15, 2026
8c8a5ba
feat: SEO basics for web landing page (#291)
S540d Jul 15, 2026
8b606cd
chore: bump version to 1.8.0 / versionCode 69
S540d Jul 16, 2026
1e30e91
fix: PR #293 Review-Findings beheben (Titel-Overwrite, fehlendes onRe…
S540d Jul 16, 2026
0ab9366
feat: Micro-Animationen + klarere Nutzerführung auf Kern-Screens
claude Jul 19, 2026
03112a8
fix: First-Run-Führung robuster + TypeScript-Fehler in ShareService.n…
claude Jul 19, 2026
d322a00
Merge pull request #294 from S540d/claude/app-design-micro-animations…
S540d Jul 21, 2026
72b43e1
Startbildschirm/Einstellungen: Label & Icon-Anpassungen (APK-Testing-…
S540d Jul 22, 2026
1ec6e62
feat(web): Auffindbarkeit außerhalb des Play Stores verbessern (#296)
S540d Jul 29, 2026
daccc32
chore: Codepflege — package-lock.json Versionsstempel synchronisieren…
S540d Jul 29, 2026
a678695
fix(security): npm audit fix für high-severity brace-expansion DoS
claude Aug 4, 2026
bc73a53
Merge pull request #299 from S540d/claude/security-audit-qnpjxn
S540d Aug 4, 2026
f4651ac
CI-Workflows nur noch bei PRs gegen main triggern (#300)
S540d Aug 4, 2026
8dbe4f1
chore: bump version to 1.9.0 / versionCode 70
S540d Aug 24, 2026
d61c997
fix(security): image-size DoS über veraltetes metro 0.83.7 beheben
S540d Aug 24, 2026
31e5cb6
Merge origin/main in testing (Squash-Merge-Artefakte auflösen)
S540d Aug 24, 2026
2258f57
Icon- und Startbildschirm-Inkonsistenz beheben (Issue #304) (#305)
S540d Aug 28, 2026
2fe045c
docs(#34): ARCHITECTURE.md ergänzen (#307)
S540d Aug 29, 2026
d448bd7
Split LevelImageDisplay.tsx into per-image render files (#309)
S540d Aug 30, 2026
a93d6d8
ci(#308): Security-Scanning aktivieren (Dependabot + CodeQL) (#310)
S540d Aug 30, 2026
98d8035
docs(CLAUDE.md): reflect LevelImageDisplay.tsx split into levelImages…
S540d Aug 30, 2026
2e22703
test(#312): coverageThreshold auf den Ist-Stand anheben (#313)
S540d Aug 31, 2026
ad3fe6f
ci: reusable-actionlint.yml einbinden + peaceiris v3→v4 (Issue #122) …
S540d Sep 5, 2026
bb25816
docs: Kurzverweis auf Code-Health-Audit-Standard in GLOBAL POLICY (#317)
S540d Sep 6, 2026
67c9118
fix: CI für PRs gegen testing aktivieren, tsc-Fehler nicht mehr maski…
S540d Sep 6, 2026
182e3be
chore: ungenutzte Dependency react-native-svg-web entfernen (#321)
S540d Sep 6, 2026
5bee5ac
refactor: DailyChallengeManager/OnboardingManager auf StorageManager …
S540d Sep 6, 2026
70b9498
fix: TS18048 in GamePhaseComponents.test.tsx (#324)
S540d Sep 6, 2026
9a945a5
fix: npm audit fix gegen High-Severity in browserslist (#323)
S540d Sep 6, 2026
14aace3
ci: Dependabot-PRs gegen testing statt main richten (#315)
S540d Sep 6, 2026
f9ea0e7
docs: CLAUDE.md auf v1.9.0-Stand synchronisieren (#326)
S540d Sep 7, 2026
23921e7
chore: Dependabot drosseln – monatlich, gruppiert, gegen testing (#327)
S540d Sep 7, 2026
857ce38
feat: IMPRESSUM_URL zur zentralen Link-Quelle ergänzen (Issue #330)
S540d Sep 16, 2026
950b26b
feat: Impressum + Datenschutz im Über-Modal ergänzen (Issue #330)
S540d Sep 16, 2026
6f332c8
i18n: impressumLabel/openLink ergänzen (DE, Issue #330)
S540d Sep 16, 2026
eaf5627
i18n: impressumLabel/openLink ergänzen (EN, Issue #330)
S540d Sep 16, 2026
96e1bea
i18n: impressumLabel/openLink ergänzen (ES, Issue #330)
S540d Sep 16, 2026
efdfb3f
i18n: impressumLabel/openLink ergänzen (FR, Issue #330)
S540d Sep 16, 2026
bb7c10b
i18n: impressumLabel/openLink ergänzen (IT, Issue #330)
S540d Sep 16, 2026
f6e6282
i18n: impressumLabel/openLink ergänzen (NL, Issue #330)
S540d Sep 16, 2026
f67e70f
i18n: impressumLabel/openLink ergänzen (PL, Issue #330)
S540d Sep 16, 2026
c226efb
Merge pull request #331 from S540d/feature/issue-330-about-impressum
S540d Sep 16, 2026
cdb9e8d
fix: npm audit fix gegen High-Severity in js-yaml (GHSA-2883-xcg3-v3hh)
S540d Sep 20, 2026
a9c4383
Merge pull request #333 from S540d/fix/js-yaml-security-audit
S540d Sep 20, 2026
90063ae
fix: .gitignore-Muster .claude/memory/ auf .claude/memory.md korrigie…
S540d Sep 20, 2026
3b72008
Merge pull request #339 from S540d/fix/gitignore-claude-memory-pattern
S540d Sep 20, 2026
fcf5a6e
fix(tests): coverageThreshold auf Ist-Stand kalibrieren (#312)
claude Sep 21, 2026
dfd3b34
fix(dark-mode): Strichmännchen und Outline-Modus im Darkmode sichtbar…
claude Sep 21, 2026
c220364
fix(icon): neues App-Icon/Adaptive-Icon/Splash statt Frosch-Symbol (#…
claude Sep 21, 2026
801e188
fix(theme): Design-System auf Blau statt Violett vereinheitlichen (#306)
claude Sep 21, 2026
5c28569
Merge remote-tracking branch 'origin/testing' into claude/issues-304-…
claude Sep 21, 2026
31e5d85
fix(ci): pull_request-Trigger deckt wieder testing ab
claude Sep 21, 2026
3abf7b4
Merge pull request #340 from S540d/claude/issues-304-plan-vxha3g
S540d Sep 22, 2026
f2d127c
refactor(settings): Einstellungen thematisch clustern (#336)
claude Sep 22, 2026
1b0caab
feat(game): Pause-Vorschlag alle 5 Level (#337)
claude Sep 22, 2026
d121666
Merge pull request #341 from S540d/claude/issue-336-settings-cluster
S540d Sep 22, 2026
5313922
Merge pull request #342 from S540d/claude/issue-337-pause-dialog
S540d Sep 22, 2026
b1354cd
refactor: Code-Health-Audit-Befunde beheben (Farb-Tokens, toter Code,…
claude Sep 23, 2026
827c4ca
style: prettier-Formatierung für app/index.tsx nachziehen
claude Sep 23, 2026
3df17cd
Merge pull request #343 from S540d/claude/issue-334-review-h6grtf
S540d Sep 24, 2026
fe715b6
docs: CLAUDE.md-Wartungsregel umsetzen (project-templates Issue #160)
claude Sep 27, 2026
ab81f36
Merge pull request #344 from S540d/claude/issue-160-drawfrommemory-41…
S540d Sep 27, 2026
8d37187
docs: README auf Nutzer ausrichten (project-templates#156) (#346)
S540d Oct 2, 2026
04689b2
fix: npm audit fix (brace-expansion DoS) (#347)
S540d Oct 2, 2026
679caef
chore: Standards synchronisieren (sync-standards.sh, project-template…
S540d Oct 4, 2026
e65b45c
ci: reusable-Workflows von @v1 auf @v2 (project-templates#113)
S540d Oct 4, 2026
1fa7d12
Merge pull request #349 from S540d/chore/sync-standards-2026-10-04
S540d Oct 4, 2026
c858100
Merge pull request #350 from S540d/chore/reusable-v1-to-v2
S540d Oct 4, 2026
d2d7bc8
ci: Audit-Gate mit befristeter Allowlist (#348) (#351)
S540d Oct 4, 2026
f181ca6
feat: Startseite entschlacken, ruhiger Merke-Timer, Icon-Farbe & -Ass…
claude Oct 11, 2026
aa081c4
fix(deps): npm audit fix für neue high/critical Advisories (compressi…
claude Oct 11, 2026
de04165
Merge pull request #354 from S540d/feature/home-declutter
S540d Oct 11, 2026
170f4fe
feat: Web-Install-Hinweis verkleinern, Store-Grafik mit Haus-Motiv
claude Oct 11, 2026
ccf7899
refactor: Simplify-Audit — toter Code, Helper-Reuse, Render-/Storage-…
claude Oct 11, 2026
7429b12
fix: Galerie-Status bei Neustart ab Level 1 zurücksetzen, Ergebnis-Fe…
claude Oct 11, 2026
81fe0ba
Merge pull request #355 from S540d/feature/web-banner-feature-graphic
S540d Oct 12, 2026
2004ca6
Merge pull request #356 from S540d/chore/simplify-audit
S540d Oct 12, 2026
8457f99
Merge pull request #357 from S540d/fix/restart-and-feedback
S540d Oct 12, 2026
d2283b4
perf: Web-Canvas cached fertige Zeichnung, Live-Strich ohne Komplett-…
claude Oct 12, 2026
c2cca20
Merge pull request #361 from S540d/perf/web-canvas-cache
S540d Oct 12, 2026
8d9e1e4
perf: Replay mit stabiler Skalierung und wiederverwendeten Pfaden/Fil…
claude Oct 22, 2026
a961814
fix: Web-Canvas mit ganzzahligen Pixelmaßen, Fills verschwanden bei g…
claude Oct 22, 2026
f57102d
Merge pull request #367 from S540d/perf/replay-fill-cache
S540d Oct 22, 2026
97556b5
Merge origin/testing into fix/web-canvas-fractional-size
claude Oct 22, 2026
021c0c0
Merge pull request #368 from S540d/fix/web-canvas-fractional-size
S540d Oct 22, 2026
10208de
refactor: confirmDestructive()-Helper statt dreifach kopiertem Web/Na…
claude Oct 22, 2026
2af96f1
refactor: computeFitTransform() statt vierfach kopierter Einpass-Logi…
claude Oct 22, 2026
ec9cb28
Merge pull request #370 from S540d/refactor/fit-transform
S540d Oct 23, 2026
6965cb3
Merge origin/testing into refactor/confirm-destructive
claude Oct 23, 2026
34ebd97
Merge pull request #369 from S540d/refactor/confirm-destructive
S540d Oct 23, 2026
42e6a30
fix: Konfetti/Abzeichen-Prüfung auch bei gleicher Sternzahl in Folger…
claude Oct 23, 2026
049fddd
chore: ungenutzte Entwurfsbilder aus assets/icons entfernen (~5 MB)
claude Oct 23, 2026
4c76c49
Merge pull request #371 from S540d/fix/feedback-repeat-rating
S540d Oct 23, 2026
db3cd6a
chore: Release 1.9.0 (versionCode 71) auf testing vorbereiten
claude Oct 23, 2026
b2db5c7
chore: generisches prepare-release.sh entfernen
claude Oct 24, 2026
1e653e6
fix(deps): zod-Advisory GHSA-mrhx-c7xc-m3w5 (high) adressieren
claude Oct 24, 2026
c6e0eba
Merge pull request #372 from S540d/chore/release-prep-1.9.0
S540d Oct 24, 2026
445e91f
fix(deps): node-forge 1.4.0 → 1.4.2 (5 high Advisories)
S540d Nov 3, 2026
a537c12
chore(audit): decode-uri-component befristet zulassen, erledigten nod…
S540d Nov 3, 2026
35aae85
Merge pull request #374 from S540d/fix/audit-node-forge-2026-11
S540d Nov 3, 2026
5650d48
docs: CHANGELOG-Datum für 1.9.0 setzen
S540d Nov 3, 2026
c956b57
Merge pull request #376 from S540d/chore/changelog-1.9.0-date
S540d Nov 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .audit-allowlist.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"_comment": "Befristete Ausnahmen für scripts/audit-gate.mjs. Grundsätzlich nur Findings ohne Upstream-Fix im Build-Tooling (nicht im App-Bundle); Ausnahmen davon sind im reason begründet. Nach Ablauf schlägt das Gate fehl -> neu bewerten (DrawFromMemory#348).",
"advisories": [
{
"id": "GHSA-mrhx-c7xc-m3w5",
"package": "zod",
"reason": "Speicher-DoS bei übergroßen Collections: nur noch zod@3 via expo -> @expo/cli (Build-Tooling, validiert lokale Konfiguration); kein gepatchter 3.x-Release, @expo/cli verlangt ^3.25.76. Root-zod (eslint-plugin-react-hooks) auf 4.6.7 gehoben.",
"expires": "2026-12-31"
},
{
"id": "GHSA-qr28-fpjm-wq7f",
"package": "decode-uri-component",
"reason": "Quadratische Laufzeit bei langen %-kodierten Sequenzen. AUSNAHME: im App-Bundle (expo-router -> query-string@7 -> decode-uri-component@0.2.2). Fix erst in 0.5.1 (ESM-only, inkompatibel mit query-string@7); npm audit schlägt nur expo-router 58 (SDK-Major) vor. Risiko gering: betrifft nur das Parsen von App-URLs/Deep-Links auf dem Gerät des Nutzers selbst (kein Server). Mit dem nächsten SDK-Upgrade auflösen.",
"expires": "2026-12-31"
}
]
}
83 changes: 80 additions & 3 deletions .claude/commands/aufräumen.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ Führe den täglichen Cleanup-Workflow durch:

## 0. Branch-Übersicht: testing vs. main (alle Repos)

**Nur lokal anwendbar** — der Pfad `/Users/svenstrohkark/...` existiert nur auf
diesem Mac. In Remote-Execution-Sessions trifft `[ -d "$dir/.git" ]` nie zu, die
Schleife läuft ohne Ausgabe und ohne Fehler durch. Läuft die Session nicht lokal
auf diesem Rechner: Abschnitt überspringen und dem Nutzer explizit sagen, dass
diese Prüfung hier nicht durchgeführt werden konnte — nicht stillschweigend
weiterlaufen.

Erstelle zu Beginn eine Tabelle aller Repositories mit dem Stand von `testing` gegenüber `main`:

```bash
Expand Down Expand Up @@ -40,9 +47,47 @@ Zeige das Ergebnis als Markdown-Tabelle:

## 2. Branches aufräumen

- Liste alle merged Feature Branches (lokal und remote)
- Frage ob diese gelöscht werden sollen
- Lösche approved Branches
**Wichtig:** `git branch --merged` und `git merge-base --is-ancestor` sind bei
Squash-Merge-Policy unbrauchbar — sie melden gemergte Branches als „nicht gemergt".
Maßgeblich ist die PR-Historie, und dort das Feld `merged_at` (nicht `merged`;
letzteres ist über MCP-GitHub-Tools unzuverlässig und liefert teils `false`
auch bei nachweislich gemergten PRs).

```bash
git fetch --all --prune -q
for b in $(git branch -r --format='%(refname:short)' \
| grep -vE 'origin/(HEAD|main|testing|staging|gh-pages)$'); do
br=${b#origin/}
pr=$(gh pr list --head "$br" --state merged --json number,mergedAt --limit 1)
if [ "$(echo "$pr" | jq 'length')" -gt 0 ]; then
echo "✅ $br → PR #$(echo "$pr" | jq -r '.[0].number') gemergt"
else
echo "⚠️ $br → kein gemergter PR — Inhalt prüfen"
fi
done
```

Bei `⚠️` zweite Stufe, bevor gelöscht wird — prüft, ob der Branch-Inhalt
inhaltlich schon im Ziel liegt (z.B. bei umbenanntem Squash-Commit):

```bash
mb=$(git merge-base origin/testing origin/$br)
files=$(git diff --name-only $mb origin/$br)
[ -n "$files" ] && git diff --name-only origin/testing origin/$br -- $files
# leere Ausgabe = Inhalt vollständig in testing → löschbar
```

- **Vor dem Löschen fragen**, nur bestätigte Branches löschen
- `main`, `testing`, `staging`, `gh-pages` **nie** löschen — auch nicht beim Bulk-Delete
- Schlägt `git push --delete` mit HTTP 403 fehl (Remote-Execution-Umgebungen):
Exit-Code ist trotzdem 0 und die letzte Zeile lautet „Everything up-to-date".
Nicht als Erfolg werten — stattdessen den fertigen Löschbefehl für die lokale
Ausführung ausgeben.
- Feature-Branches nach Merge löschen: `gh pr merge --delete-branch` explizit
verwenden. `scripts/apply-rulesets.sh` setzt `delete_branch_on_merge=false`
zentral (seit Issue #122 Korrektur 4, siehe `dev-standards/global-policy.md`,
„Merge-Methode zentral erzwingen") — GitHubs Auto-Delete löscht sonst auch
den Head-Branch von Release-PRs (`testing → main`), also `testing` selbst

## 3. GitHub Actions Status

Expand All @@ -62,6 +107,38 @@ Zeige das Ergebnis als Markdown-Tabelle:
- Zeige kürzlich geschlossene Issues (heute)
- Weise auf Issues ohne Label hin

### 5a. Erledigte Issues aufspüren (Issue #111)

`Closes #X` schließt ein Issue nur beim Merge in den **Default-Branch** (`main`).
Da alle PRs nach `testing` gehen, greift das Keyword faktisch nie — Issues bleiben
offen, obwohl der Code längst gemergt ist.

Gemergte `testing`-PRs gegen die offenen Issues abgleichen:

```bash
SLUG=$(git remote get-url origin | sed -E 's#.*github.com[:/]##; s#\.git$##')
OPEN=$(gh issue list -R "$SLUG" --state open --limit 100 --json number -q '.[].number' | tr '\n' ' ')
gh pr list -R "$SLUG" --state merged --base testing --limit 60 --json number,body \
--jq '.[] | (.body // "") as $b
| ($b|[scan("(?i)(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\\s+#(\\d+)")]|flatten|unique) as $r
| select($r|length>0) | "\(.number) \($r|join(" "))"' |
while read -r pr refs; do
for i in $refs; do
case " $OPEN " in *" $i "*) echo "Issue #$i erledigt durch PR #$pr";; esac
done
done
```

**Nur vorschlagen, nicht automatisch schließen.** Sammel-/Meta-Issues ("Backlog",
"Maßnahmenkatalog", "Tracking") werden von Teil-PRs oft fälschlich mit `Closes`
referenziert, sind aber nicht erledigt. Vor dem Schließen den Issue-Titel lesen.

Beim Schließen den Grund vermerken, damit die Historie nachvollziehbar bleibt:

```bash
gh issue close -R "$SLUG" <N> -c "Umgesetzt in #<PR>, gemergt nach \`testing\`."
```

## 6. Dependencies & Security

- Prüfe ob `package.json` Updates braucht (via npm outdated)
Expand Down
34 changes: 34 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Dependabot – kostenlose Dependency-Updates + Security-Alerts.
# Ersetzt zusammen mit codeql.yml den kostenpflichtigen Anthropic-API-Scan.

version: 2
updates:
# GitHub-Actions-Versionen (gilt für ALLE Repos, auch ohne package.json).
- package-ecosystem: 'github-actions'
directory: '/'
target-branch: 'testing'
schedule:
interval: 'monthly'
open-pull-requests-limit: 5
commit-message:
prefix: 'ci'
groups:
# Kein update-types-Filter → Major landet mit im Sammel-PR.
actions-all:
patterns:
- '*'

# NPM/Yarn/PNPM-Abhängigkeiten.
- package-ecosystem: 'npm'
directory: '/'
target-branch: 'testing'
schedule:
interval: 'monthly'
open-pull-requests-limit: 5
commit-message:
prefix: 'chore'
groups:
# Kein update-types-Filter → Major landet mit im Sammel-PR.
npm-all:
patterns:
- '*'
16 changes: 12 additions & 4 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,20 @@ on:
push:
branches: [main, testing]
pull_request:
branches: [main]
branches: [main, testing]

# Security: Explicitly set minimal permissions
permissions:
contents: read

jobs:
# ============================================================================
# JOB 0: Workflow-Linting (Issue #445)
# ============================================================================
actionlint:
name: ⚙️ Workflow Linting
uses: S540d/project-templates/.github/workflows/reusable-actionlint.yml@v2

# ============================================================================
# JOB 1: Code Quality & Linting
# ============================================================================
Expand Down Expand Up @@ -82,7 +89,7 @@ jobs:
run: npm run validate:svg-counts

- name: TypeScript Type Check
run: npx tsc --noEmit || true
run: npx tsc --noEmit

# ============================================================================
# JOB 2: Unit Tests & Coverage
Expand Down Expand Up @@ -196,8 +203,9 @@ jobs:
with:
node-version: '20'

- name: Run npm audit
run: npm audit --audit-level=high
# Gate mit befristeter Allowlist (.audit-allowlist.json) für Findings ohne Upstream-Fix (#348).
- name: Run npm audit (Gate)
run: node scripts/audit-gate.mjs --level=high

- name: Check for sensitive data
run: |
Expand Down
53 changes: 53 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: 'CodeQL'

# Kostenlose statische Code-Analyse (SAST) via GitHub CodeQL.
# Zusammen mit .github/dependabot.yml der Ersatz für den kostenpflichtigen
# Anthropic-API-Scan. build-mode: none — CodeQL analysiert den Quellcode
# direkt, ohne Autobuild (bei RN-/Expo-Projekten schlägt Autobuild sonst fehl).

on:
push:
branches: [main]
pull_request:
branches: [main, testing]
schedule:
# Wöchentlicher Full-Scan: fängt neu bekannt gewordene CVEs ohne Code-Änderung.
- cron: '30 5 * * 1'

permissions:
actions: read
contents: read
security-events: write

jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write

strategy:
fail-fast: false
matrix:
include:
- language: javascript-typescript
build-mode: none
- language: actions
build-mode: none

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
build-mode: ${{ matrix.build-mode }}

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: '/language:${{matrix.language}}'
2 changes: 1 addition & 1 deletion .github/workflows/deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ jobs:
run: node scripts/update-cache-version.js

- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dist
Expand Down
6 changes: 3 additions & 3 deletions .github/workflows/standards-audit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,12 @@ permissions:

jobs:
security-scan:
uses: S540d/project-templates/.github/workflows/reusable-security-scan.yml@v1
uses: S540d/project-templates/.github/workflows/reusable-security-scan.yml@v2
with:
fail_on_findings: true

gitignore-audit:
uses: S540d/project-templates/.github/workflows/reusable-gitignore-audit.yml@v1
uses: S540d/project-templates/.github/workflows/reusable-gitignore-audit.yml@v2
with:
fail_on_missing: true

Expand All @@ -35,4 +35,4 @@ jobs:
# auf uses:-Jobs nicht erlaubt – die Non-Blocking-Semantik muss daher im Template
# bleiben; security-scan und gitignore-audit (fail_on_*: true) gaten den Merge.
dev-standards-audit:
uses: S540d/project-templates/.github/workflows/reusable-dev-standards-audit.yml@v1
uses: S540d/project-templates/.github/workflows/reusable-dev-standards-audit.yml@v2
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ yarn-error.log*
.claude/CLAUDE.md
.claude/settings.json
.claude/settings.local.json
.claude/memory/
.claude/memory.md
.claude/todos/
.claude/cache/
.claude/data/
Expand Down
35 changes: 31 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,47 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [1.9.0] - 2026-11-03 (versionCode 71)

Änderungen seit der Play-Store-Version 1.8.0 (versionCode 69).

### Added

- Auffindbarkeit außerhalb des Play Stores: Play-Store-Badge + deutsche Kurzbeschreibung im README, Web-only Install-Banner (`WebInstallBanner`) im sichtbaren Bereich der Startseite, deutsche Keywords/Open-Graph-/JSON-LD-Auszeichnung der Landing Page
- Pause-Vorschlag nach jedem 5. abgeschlossenen Level (5, 10, 15) mit „Hauptmenü" und „Weiter" (#337)
- Impressum und Datenschutz im Über-Dialog der Einstellungen, in allen 7 Sprachen (#330)
- Micro-Animationen auf den Kern-Screens: Press-Feedback auf Kacheln und Buttons, `prefers-reduced-motion`-aware (`PressableScale`, `PulseView`)
- Auffindbarkeit außerhalb des Play Stores: Play-Store-Badge + deutsche Kurzbeschreibung im README, Web-only Install-Hinweis auf der Startseite, deutsche Keywords/Open-Graph-/JSON-LD-Auszeichnung der Landing Page
- Attributions-Parameter (`referrer` mit UTM-Tags) an allen Play-Store-Links — Installationen aus der Web-Demo werden in der Play Console als eigene Quelle sichtbar (`constants/ExternalLinks.ts`)
- Crawlbarer `<noscript>`-Inhalt der Landing Page inkl. echtem Play-Store-Link statt Expos „You need to enable JavaScript"-Platzhalter
- `docs/WEB_DISCOVERABILITY.md` — Trichter, Attribution und Rendering-Besonderheiten des Web-Builds

### Changed

- Neues App-Icon, Adaptive-Icon und Splash-Screen (Haus-Motiv statt Frosch) in ruhigerem, entsättigtem Hellblau `#A9DCEB` statt `#60D5FA`; nativer Splash über das `expo-splash-screen`-Plugin (#304, #338)
- Design-System einheitlich auf Blau statt Violett (Primärfarbe kontraststark `#0585AD`, WCAG-tauglich für Text/Buttons) (#306)
- Einstellungen thematisch gruppiert: Erscheinungsbild, Personalisieren, Elternbereich (#336)
- Startseite entschlackt: „Spiel starten" ist die einzige auffällige Aktion (ohne Dauer-Puls); Tägliche Challenge als dezenter Textlink darunter; Level/Galerie/Freies Malen als einfarbige Textlinks im Footer; Statistik als eine Textzeile statt drei Emoji-Karten; Streak-Badge und schwebende Sterne entfernt — die Serie steht nur noch in Malis Begrüßung
- Merke-Phase: dünner, einfarbiger Restzeit-Balken statt 80px-Countdown-Kreis mit Gelb/Rot-Warnfarben (war bei 3 s Anzeigezeit dauerhaft im Warnmodus)
- Replay: Die Skalierung der Zeichnung wird aus der **gesamten** Zeichnung berechnet — die Zeichnung erscheint von Anfang an in Endgröße und wandert nicht mehr mit. Fertige Pfade und Fills werden in Web und Android zwischen den Frames wiederverwendet (pro Frame höchstens 2 statt N Flood-Fills) (#366)
- Web-Zeichenfläche: Beim Malen wird nur noch der Live-Strich über einen gecachten Snapshot der fertigen Zeichnung gelegt statt bei jeder Mausbewegung alle Striche und Flood-Fills neu zu zeichnen (#358)
- Web-Install-Hinweis auf der Startseite als dezente Textzeile statt umrahmter Karte; Store-/OG-Grafik zeigt eine Denkblase mit dem Haus-Motiv des App-Icons
- Intern: `LevelImageDisplay.tsx` in einzelne Render-Dateien unter `components/levelImages/` aufgeteilt (#309); `computeFitTransform()` (#359) und `confirmDestructive()` (#360) ersetzen mehrfach kopierte Logik; Daily-Challenge-/Onboarding-Speicherung nutzt den gemeinsamen `StorageManager`-Fallback (#320); ungenutzte Dependency `react-native-svg-web` entfernt (#321)

### Fixed

- PWA-/Homescreen-Tags (u. a. Apple-Touch-Icon) fehlten im Deployment: `app/+html.tsx` wird bei `web.output: "single"` nicht gerendert — die Tags werden jetzt im Post-Build injiziert
- `scripts/post-build.js` präfixierte bereits mit `/DrawFromMemory` beginnende Pfade ein zweites Mal
- `scripts/deploy-ghpages.sh` führte weder `post-build.js` noch `update-cache-version.js` aus — manuelle Deployments gingen ohne SEO-Tags und ohne Subpfad-Korrektur live
- Konfetti, Jubel-Sound und Abzeichen-Prüfung blieben aus, wenn zwei Runden hintereinander dieselbe Sternzahl bekamen (#371)
- Darkmode: Strichmännchen und „Nur Umriss merken"-Modus waren auf dunklem Hintergrund unsichtbar (#335)
- „Von Level 1 neu starten" setzt den Galerie-Speicherstatus zurück (vorher blieb „In Galerie speichern" ggf. gesperrt)
- Ergebnis-Feedback wechselte bei jedem Re-Render — jetzt einmal pro Bewertung; DE/EN-Texte für 1–2 Sterne laufen nicht mehr auseinander
- Web: Füllungen verschwanden (u. a. auf dem Ergebnis-Screen), wenn die Canvas-Breite nicht ganzzahlig war; die Pixelmaße der Web-Zeichenfläche werden jetzt abgerundet
- Web/PWA-Icon (`public/apple-touch-icon.png`) und OG-Bild (`public/feature-graphic.png`) zeigten alte bzw. abgeschnittene Motive; `apple-touch-icon`-Link ohne `/DrawFromMemory`-Basispfad
- PWA-/Homescreen-Tags fehlten im Deployment (`app/+html.tsx` wird bei `web.output: "single"` nicht gerendert — Tags werden jetzt im Post-Build injiziert); `scripts/post-build.js` präfixierte `/DrawFromMemory`-Pfade doppelt; `scripts/deploy-ghpages.sh` lief ohne `post-build.js`/`update-cache-version.js`
- Sitemap listet die beiden echten Datenschutzseiten statt nur der Startseite

### Security

- Abhängigkeiten per `npm audit fix` aktualisiert (u. a. `brace-expansion`, `js-yaml`, `browserslist`, `metro`/`image-size`, `compression`, `handlebars`, `shell-quote`, `source-map-js`); CI-Audit-Gate mit befristeter Allowlist für Findings ohne Upstream-Fix (#348)

## [1.3.4] - 2026-04-21

### Fixed
Expand Down
Loading
Loading