/. * Wir suchen den Repo-Root, indem wir aus dem Modul-Pfad (v2-modules/) zwei Ebenen hoch gehen. */ function check_shared_assets(string $moduleDir, array $m, Report $r): void { if (empty($m['sharedAssets'])) { $r->ok("sharedAssets: keine deklariert (ok)"); return; } if (!is_array($m['sharedAssets'])) { $r->fail("sharedAssets muss ein Objekt sein"); return; } // Repo-Root finden (v2-modules/ → ..) $repoRoot = realpath($moduleDir . '/../../'); if (!$repoRoot) { $r->warn("Repo-Root nicht auflösbar — sharedAssets-Check übersprungen"); return; } $poolBase = $repoRoot . '/v2-platform/assets/shared'; if (!is_dir($poolBase)) { $r->warn("Shared-Pool fehlt im Repository: $poolBase"); return; } // Erlaubte Extensions pro Kategorie $extByCategory = [ 'cities' => ['png', 'jpg', 'webp'], 'icons' => ['svg', 'png'], 'glossar' => ['png', 'svg', 'jpg'], 'bg-music' => ['mp3', 'ogg'], 'ui-sounds' => ['mp3', 'ogg', 'wav'], ]; $missing = []; $checked = 0; foreach ($m['sharedAssets'] as $category => $slugs) { if (!is_array($slugs)) { $r->fail("sharedAssets.$category muss ein Array sein"); continue; } $categoryDir = "$poolBase/$category"; if (!is_dir($categoryDir)) { $r->fail("Pool-Kategorie '$category' existiert nicht: $categoryDir"); continue; } $exts = $extByCategory[$category] ?? ['png', 'svg', 'jpg', 'mp3']; foreach ($slugs as $slug) { $checked++; $found = false; foreach ($exts as $ext) { if (file_exists("$categoryDir/$slug.$ext")) { $found = true; break; } } if (!$found) { $missing[] = "$category/$slug (geprüfte Extensions: " . implode('|', $exts) . ")"; } } } if ($missing) { $r->fail("Fehlende Shared-Assets — bei Atlas in _inbox/zentrale/ bestellen", $missing); } else { $r->ok("Alle $checked Shared-Assets im Pool gefunden"); } }