rename(mana-games): rebrand to Arcade

Rename games/mana-games/ to games/arcade/, update all package names
(@mana-games/* → @arcade/*), appIds, display names, docker-compose
service, root scripts, and documentation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Till JS 2026-03-29 18:31:37 +02:00
parent 2874e202ea
commit 9e82e40e16
105 changed files with 86 additions and 80 deletions

View file

@ -62,7 +62,7 @@ For comprehensive guidelines on code patterns and conventions, see the `.claude/
| Game | Description | Tech |
|------|-------------|------|
| **mana-games** | AI browser games platform (22+ games) | SvelteKit, NestJS, Gemini/Claude/GPT |
| **arcade** | AI browser games platform (22+ games) | SvelteKit, NestJS, Gemini/Claude/GPT |
| **voxelava** | Voxel game | SvelteKit |
| **whopixels** | Phaser.js pixel game | Phaser, JavaScript |
| **worldream** | World exploration game | SvelteKit |
@ -153,7 +153,7 @@ manacore-monorepo/
│ ├── uload/
│ └── wisekeep/
├── games/ # Game projects
│ ├── mana-games/ # AI browser games platform (SvelteKit + NestJS)
│ ├── arcade/ # AI browser games platform (SvelteKit + NestJS)
│ ├── voxelava/ # Voxel game
│ ├── whopixels/ # Phaser.js pixel game
│ └── worldream/ # World exploration game

View file

@ -1329,12 +1329,12 @@ services:
retries: 3
start_period: 20s
mana-games-web:
arcade-web:
build:
context: .
dockerfile: games/mana-games/apps/web/Dockerfile
image: mana-games-web:local
container_name: mana-app-mana-games-web
dockerfile: games/arcade/apps/web/Dockerfile
image: arcade-web:local
container_name: mana-app-arcade-web
restart: always
mem_limit: 128m
depends_on:

View file

@ -1,13 +1,13 @@
# Mana Games - CLAUDE.md
# Arcade - CLAUDE.md
AI-powered browser games platform mit 22+ Spielen und KI-Spielgenerierung.
## Projektstruktur
```
games/mana-games/
games/arcade/
├── apps/
│ ├── web/ # SvelteKit Web-App (@mana-games/web)
│ ├── web/ # SvelteKit Web-App (@arcade/web)
│ │ ├── src/
│ │ │ ├── routes/ # SvelteKit-Routen
│ │ │ │ ├── (app)/ # App-Routen mit PillNavigation
@ -27,12 +27,12 @@ games/mana-games/
│ │ ├── games/ # 22 HTML-Spiele
│ │ └── screenshots/ # Game-Thumbnails
│ ├── web-astro/ # Alte Astro-App (Referenz, zum Löschen)
│ └── backend/ # NestJS API (@mana-games/backend)
│ └── backend/ # NestJS API (@arcade/backend)
│ └── src/
│ ├── game-generator/ # AI-Spielgenerierung (Gemini, Claude, GPT-4)
│ ├── game-submission/ # Community-Einreichungen (GitHub API)
│ └── health/
└── package.json # Root (mana-games)
└── package.json # Root (arcade)
```
## Tech Stack
@ -53,16 +53,16 @@ games/mana-games/
```bash
# Alles starten (Web + Backend)
pnpm mana-games:dev
pnpm arcade:dev
# Nur Web (SvelteKit)
pnpm dev:mana-games:web
pnpm dev:arcade:web
# Nur Backend (NestJS)
pnpm dev:mana-games:backend
pnpm dev:arcade:backend
# Web + Backend zusammen
pnpm dev:mana-games:app
pnpm dev:arcade:app
```
**Ports:**
@ -126,7 +126,7 @@ MANA_GAMES_AZURE_OPENAI_API_KEY=your_key
MANA_GAMES_AZURE_OPENAI_DEPLOYMENT=gpt-4o
MANA_GAMES_GITHUB_TOKEN=your_token
MANA_GAMES_GITHUB_OWNER=tillschneider
MANA_GAMES_GITHUB_REPO=mana-games
MANA_GAMES_GITHUB_REPO=arcade
```
## Spiel hinzufügen

View file

@ -1,5 +1,5 @@
{
"name": "@mana-games/backend",
"name": "@arcade/backend",
"version": "1.0.0",
"private": true,
"scripts": {

View file

@ -32,6 +32,6 @@ async function bootstrap() {
const server = await app.listen(port);
server.setTimeout(120000);
console.log(`Mana Games backend running on http://localhost:${port}`);
console.log(`Arcade backend running on http://localhost:${port}`);
}
bootstrap();

View file

@ -4,21 +4,21 @@ FROM sveltekit-base:local AS builder
ARG PUBLIC_MANA_CORE_AUTH_URL=http://mana-auth:3001
ENV PUBLIC_MANA_CORE_AUTH_URL=$PUBLIC_MANA_CORE_AUTH_URL
COPY games/mana-games/apps/web ./games/mana-games/apps/web
COPY games/arcade/apps/web ./games/arcade/apps/web
RUN --mount=type=cache,id=pnpm,target=/root/.local/share/pnpm/store \
pnpm install --no-frozen-lockfile --ignore-scripts
WORKDIR /app/games/mana-games/apps/web
WORKDIR /app/games/arcade/apps/web
RUN pnpm exec svelte-kit sync
RUN NODE_OPTIONS="--max-old-space-size=4096" pnpm build
FROM node:20-alpine AS production
WORKDIR /app/games/mana-games/apps/web
WORKDIR /app/games/arcade/apps/web
COPY --from=builder /app/node_modules/.pnpm /app/node_modules/.pnpm
COPY --from=builder /app/games/mana-games/apps/web/node_modules ./node_modules
COPY --from=builder /app/games/mana-games/apps/web/build ./build
COPY --from=builder /app/games/mana-games/apps/web/package.json ./
COPY --from=builder /app/games/arcade/apps/web/node_modules ./node_modules
COPY --from=builder /app/games/arcade/apps/web/build ./build
COPY --from=builder /app/games/arcade/apps/web/package.json ./
EXPOSE 5210
ENV NODE_ENV=production PORT=5210 HOST=0.0.0.0

View file

@ -1,5 +1,5 @@
{
"name": "@mana-games/web",
"name": "@arcade/web",
"version": "0.1.0",
"private": true,
"scripts": {

View file

@ -2,7 +2,7 @@ import { initErrorTracking, handleSvelteError } from '@manacore/shared-error-tra
import type { HandleClientError } from '@sveltejs/kit';
initErrorTracking({
serviceName: 'mana-games-web',
serviceName: 'arcade-web',
dsn: (window as any).__PUBLIC_GLITCHTIP_DSN__,
environment: import.meta.env.MODE,
});

View file

@ -29,7 +29,7 @@ export interface LocalFavorite extends BaseRecord {
const SYNC_SERVER_URL = import.meta.env.PUBLIC_SYNC_SERVER_URL || 'http://localhost:3050';
export const gamesStore = createLocalStore({
appId: 'mana-games',
appId: 'arcade',
collections: [
{
name: 'gameStats',

View file

@ -11,7 +11,7 @@ register('en', () => import('./locales/en.json'));
function getInitialLocale(): SupportedLocale {
if (browser) {
const stored = localStorage.getItem('mana_games_locale');
const stored = localStorage.getItem('arcade_locale');
if (stored && supportedLocales.includes(stored as SupportedLocale)) {
return stored as SupportedLocale;
}
@ -31,7 +31,7 @@ init({
export function setLocale(newLocale: SupportedLocale) {
locale.set(newLocale);
if (browser) {
localStorage.setItem('mana_games_locale', newLocale);
localStorage.setItem('arcade_locale', newLocale);
}
}

View file

@ -1,6 +1,6 @@
{
"app": {
"name": "Mana Games",
"name": "Arcade",
"loading": "Wird geladen..."
},
"nav": {

View file

@ -1,6 +1,6 @@
{
"app": {
"name": "Mana Games",
"name": "Arcade",
"loading": "Loading..."
},
"nav": {

View file

@ -3,6 +3,6 @@ import { authStore } from '$lib/stores/auth.svelte';
export const feedbackService = createFeedbackService({
apiUrl: import.meta.env.DEV ? 'http://localhost:3001' : 'https://auth.mana.how',
appId: 'mana-games',
appId: 'arcade',
getAuthToken: async () => authStore.getAccessToken(),
});

View file

@ -5,7 +5,7 @@ const onboardingSteps: AppOnboardingStep[] = [
{
id: 'features',
type: 'info',
question: 'Willkommen bei Mana Games!',
question: 'Willkommen bei Arcade!',
description: 'Das erwartet dich:',
emoji: '🎮',
gradient: { from: 'green-500', to: 'green-700' },
@ -33,7 +33,7 @@ const onboardingSteps: AppOnboardingStep[] = [
];
export const gamesOnboarding = createAppOnboardingStore({
appId: 'mana-games',
appId: 'arcade',
steps: onboardingSteps,
userSettings,
onComplete: async () => {},

View file

@ -1,5 +1,5 @@
import { createSimpleNavigationStores } from '@manacore/shared-stores';
export const { isNavCollapsed } = createSimpleNavigationStores({
storageKey: 'mana-games',
storageKey: 'arcade',
});

View file

@ -1,6 +1,6 @@
import { createThemeStore } from '@manacore/shared-theme';
export const theme = createThemeStore({
appId: 'mana-games',
appId: 'arcade',
defaultVariant: 'lume',
});

View file

@ -12,7 +12,7 @@ function getAuthUrl(): string {
}
export const userSettings = createUserSettingsStore({
appId: 'mana-games',
appId: 'arcade',
authUrl: getAuthUrl,
getAccessToken: () => authStore.getAccessToken(),
});

View file

@ -40,12 +40,12 @@
let showGuestWelcome = $state(false);
function initGuestWelcome() {
if (!authStore.isAuthenticated && shouldShowGuestWelcome('mana-games')) {
if (!authStore.isAuthenticated && shouldShowGuestWelcome('arcade')) {
showGuestWelcome = true;
}
}
const appItems = getPillAppItems('mana-games');
const appItems = getPillAppItems('arcade');
let { children } = $props();
@ -134,7 +134,7 @@
];
const navItems = $derived(
filterHiddenNavItems('mana-games', baseNavItems, userSettings.nav?.hiddenNavItems || {})
filterHiddenNavItems('arcade', baseNavItems, userSettings.nav?.hiddenNavItems || {})
);
function handleKeydown(event: KeyboardEvent) {
@ -148,7 +148,7 @@
isCollapsed = collapsed;
collapsedStore.set(collapsed);
if (typeof localStorage !== 'undefined') {
localStorage.setItem('mana-games-nav-collapsed', String(collapsed));
localStorage.setItem('arcade-nav-collapsed', String(collapsed));
}
}
@ -174,7 +174,7 @@
tagMutations.startSync(getToken);
}
const savedCollapsed = localStorage.getItem('mana-games-nav-collapsed');
const savedCollapsed = localStorage.getItem('arcade-nav-collapsed');
if (savedCollapsed === 'true') {
isCollapsed = true;
collapsedStore.set(true);
@ -195,7 +195,7 @@
<PillNavigation
items={navItems}
currentPath={$page.url.pathname}
appName="Mana Games"
appName="Arcade"
homeRoute="/"
onToggleTheme={handleToggleTheme}
{isDark}
@ -244,11 +244,11 @@
</div>
{#if gamesOnboarding.shouldShow}
<MiniOnboardingModal store={gamesOnboarding} appName="Mana Games" appEmoji="🎮" />
<MiniOnboardingModal store={gamesOnboarding} appName="Arcade" appEmoji="🎮" />
{/if}
<GuestWelcomeModal
appId="mana-games"
appId="arcade"
visible={showGuestWelcome}
onClose={() => (showGuestWelcome = false)}
onLogin={() => goto('/login')}

View file

@ -3,7 +3,7 @@
</script>
<svelte:head>
<title>{$_('nav.community')} - Mana Games</title>
<title>{$_('nav.community')} - Arcade</title>
</svelte:head>
<div class="space-y-6">

View file

@ -100,7 +100,7 @@
</script>
<svelte:head>
<title>{$_('create.title')} - Mana Games</title>
<title>{$_('create.title')} - Arcade</title>
</svelte:head>
<div class="space-y-6">

View file

@ -5,7 +5,7 @@
</script>
<svelte:head>
<title>Feedback - Mana Games</title>
<title>Feedback - Arcade</title>
</svelte:head>
<FeedbackPage {feedbackService} appName="Mana Games" currentUserId={authStore.user?.id} />
<FeedbackPage {feedbackService} appName="Arcade" currentUserId={authStore.user?.id} />

View file

@ -1,5 +1,5 @@
<svelte:head>
<title>Hilfe - Mana Games</title>
<title>Hilfe - Arcade</title>
</svelte:head>
<div class="max-w-2xl mx-auto space-y-6">

View file

@ -1,5 +1,5 @@
<svelte:head>
<title>Mana - Mana Games</title>
<title>Mana - Arcade</title>
</svelte:head>
<div class="max-w-2xl mx-auto text-center py-12">

View file

@ -17,7 +17,7 @@
</script>
<svelte:head>
<title>Generierte Spiele - Mana Games</title>
<title>Generierte Spiele - Arcade</title>
</svelte:head>
<div class="space-y-6">

View file

@ -46,7 +46,7 @@
</script>
<svelte:head>
<title>{game?.title || 'Spiel'} - Mana Games</title>
<title>{game?.title || 'Spiel'} - Arcade</title>
</svelte:head>
{#if game}

View file

@ -5,7 +5,7 @@
</script>
<svelte:head>
<title>Profil - Mana Games</title>
<title>Profil - Arcade</title>
</svelte:head>
{#if authStore.isAuthenticated}

View file

@ -21,13 +21,13 @@
</script>
<svelte:head>
<title>{$_('nav.settings')} - Mana Games</title>
<title>{$_('nav.settings')} - Arcade</title>
</svelte:head>
<div class="settings-page">
<header class="mb-8">
<h1 class="text-2xl font-bold text-foreground">{$_('nav.settings')}</h1>
<p class="text-muted-foreground text-sm mt-1">Passe Mana Games an deine Bedürfnisse an</p>
<p class="text-muted-foreground text-sm mt-1">Passe Arcade an deine Bedürfnisse an</p>
</header>
<!-- Theme -->

View file

@ -30,7 +30,7 @@
</script>
<svelte:head>
<title>{$_('stats.title')} - Mana Games</title>
<title>{$_('stats.title')} - Arcade</title>
</svelte:head>
<div class="space-y-6">

View file

@ -66,7 +66,7 @@
</script>
<svelte:head>
<title>Spiel einreichen - Mana Games</title>
<title>Spiel einreichen - Arcade</title>
</svelte:head>
<div class="max-w-2xl mx-auto space-y-6">

View file

@ -1,5 +1,5 @@
<svelte:head>
<title>Tags - Mana Games</title>
<title>Tags - Arcade</title>
</svelte:head>
<div class="max-w-2xl mx-auto text-center py-12">

View file

@ -7,13 +7,13 @@
</script>
<svelte:head>
<title>Themes - Mana Games</title>
<title>Themes - Arcade</title>
</svelte:head>
<div class="max-w-4xl mx-auto space-y-6">
<div>
<h1 class="text-2xl font-bold text-foreground">Themes</h1>
<p class="text-muted-foreground mt-1">Wähle ein Theme für Mana Games</p>
<p class="text-muted-foreground mt-1">Wähle ein Theme für Arcade</p>
</div>
<div class="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-4 gap-3">

View file

@ -5,7 +5,7 @@
</script>
<svelte:head>
<title>Mana Games - Passwort vergessen</title>
<title>Arcade - Passwort vergessen</title>
</svelte:head>
<ForgotPasswordPage {authStore} {goto} appName="Mana Games" loginHref="/login" />
<ForgotPasswordPage {authStore} {goto} appName="Arcade" loginHref="/login" />

View file

@ -5,13 +5,13 @@
</script>
<svelte:head>
<title>Mana Games - Login</title>
<title>Arcade - Login</title>
</svelte:head>
<LoginPage
{authStore}
{goto}
appName="Mana Games"
appName="Arcade"
registerHref="/register"
forgotPasswordHref="/forgot-password"
primaryColor="#00ff88"

View file

@ -5,7 +5,7 @@
</script>
<svelte:head>
<title>Mana Games - Registrieren</title>
<title>Arcade - Registrieren</title>
</svelte:head>
<RegisterPage {authStore} {goto} appName="Mana Games" loginHref="/login" primaryColor="#00ff88" />
<RegisterPage {authStore} {goto} appName="Arcade" loginHref="/login" primaryColor="#00ff88" />

View file

@ -3,7 +3,7 @@
</script>
<svelte:head>
<title>Mana Games - Passwort zurücksetzen</title>
<title>Arcade - Passwort zurücksetzen</title>
</svelte:head>
<div class="min-h-screen flex items-center justify-center">

View file

@ -4,7 +4,7 @@ export const GET: RequestHandler = async () => {
return new Response(
JSON.stringify({
status: 'ok',
service: 'mana-games-web',
service: 'arcade-web',
timestamp: new Date().toISOString(),
}),
{

View file

Before

Width:  |  Height:  |  Size: 385 B

After

Width:  |  Height:  |  Size: 385 B

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 34 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 21 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 69 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 62 KiB

Before After
Before After

Some files were not shown because too many files have changed in this diff Show more