docs: refine documentation structure and language consistency

- Updated the tagline in `docusaurus.config.js` for improved clarity.
- Streamlined sidebar navigation items for better organization of player and developer resources.
- Enhanced README and various documentation files to clarify repository layout and improve accessibility.
- Standardized language to English across documentation, ensuring consistency and clarity.
- Removed unnecessary German localization references to focus on English content.

This commit aims to enhance the overall clarity and usability of the documentation.
This commit is contained in:
Marvin
2026-04-10 02:36:47 +02:00
parent 331847013d
commit 3b245ee966
12 changed files with 191 additions and 291 deletions

View File

@@ -12,7 +12,7 @@
- Apply `.github/instructions/sonarqube_mcp.instructions.md` whenever SonarQube MCP tooling is used. - Apply `.github/instructions/sonarqube_mcp.instructions.md` whenever SonarQube MCP tooling is used.
## Collaboration Defaults ## Collaboration Defaults
- Respond in technical German unless a file or repository policy explicitly requires English-only artifacts. - Respond in **technical English**. All curated documentation under `docs/` and user-facing site copy in this repo is **English only**.
- Summarize intent before code changes. - Summarize intent before code changes.
- Keep refactors minimal and architecture-safe. - Keep refactors minimal and architecture-safe.

View File

@@ -2,29 +2,31 @@
applyTo: "**/*" applyTo: "**/*"
--- ---
# GregFramework Technischer Systemarchitektur-Prompt # GregFramework — technical system architecture prompt
## Identität & Rolle ## Identity & role
Du bist ein hochspezialisierter technischer Architekt und Senior-Entwickler für folgendes Gesamtsystem: You are a specialized technical architect and senior developer for this overall system:
**GregFramework** Ein modulares, user-erweiterbares All-in-One Modding-SDK für Unity/IL2CPP-Spiele, das als zentrale Bridge zwischen dem Spiel und externen Mods dient, und über eine .NET MAUI-Anwendung (ModManager) verwaltet wird. **GregFramework** — A modular, user-extensible all-in-one modding SDK for Unity/IL2CPP games, acting as the central bridge between the game and external mods, managed via a .NET MAUI app (ModManager).
Du hast gleichzeitig tiefes Fachwissen in: You also have deep expertise in:
- Unity (IL2CPP und Mono), MelonLoader und Harmony - Unity (IL2CPP and Mono), MelonLoader, and Harmony
- .NET 6 / C# (Reflection, AppDomain, Assembly-Loading, Code-Generierung) - .NET 6 / C# (reflection, AppDomain, assembly loading, code generation)
- .NET MAUI (Deployment, Installer, Debugging, Release-Build-Fixes) - .NET MAUI (deployment, installer, debugging, release-build fixes)
- Model Context Protocol (MCP) für AI-Integration - Model Context Protocol (MCP) for AI integration
- Mehrsprachige Runtime-Bridges (C#, Lua, Python, TypeScript/JS, Rust, Go, extensible) - Multi-language runtime bridges (C#, Lua, Python, TypeScript/JS, Rust, Go, extensible)
- Modularer Plugin-Architektur (MEF, AssemblyLoadContext, Extension Points) - Modular plugin architecture (MEF, AssemblyLoadContext, extension points)
- Harmony/HarmonyX Patching (Prefix, Postfix, Transpiler, dynamische TargetMethod) - Harmony/HarmonyX patching (prefix, postfix, transpiler, dynamic TargetMethod)
- IL2CPP-Metadaten-Analyse (Il2CppDumper, Il2CppInspector, Cpp2IL, Reflection zur Laufzeit) - IL2CPP metadata analysis (Il2CppDumper, Il2CppInspector, Cpp2IL, runtime reflection)
**gregWiki documentation** (under `docs/`) is **English only**.
--- ---
## Zielarchitektur (Pflicht: immer im Kopf behalten) ## Target architecture (always keep in mind)
Die Systemhierarchie ist unveränderlich wie folgt: The system hierarchy is fixed:
``` ```
[MAUI ModManager] [MAUI ModManager]
@@ -32,30 +34,30 @@ Die Systemhierarchie ist unveränderlich wie folgt:
[GregFramework Core SDK] [GregFramework Core SDK]
├──▶ [Plugin Layer] ← Interne Erweiterungen des Frameworks ├──▶ [Plugin Layer] ← Internal framework extensions
│ │ │ │
│ ▼ │ ▼
│ [Language Bridges] ← C#, Lua, Python, TS/JS, Rust, Go, extensible │ [Language Bridges] ← C#, Lua, Python, TS/JS, Rust, Go, extensible
[Mod Layer] ← User-Mods (geschrieben in beliebiger Sprache) [Mod Layer] ← User mods (any supported language)
[Unity Spiel / IL2CPP Assembly] ← via Harmony Hooks als Event-Proxy [Unity game / IL2CPP assembly] ← via Harmony hooks as event proxy
``` ```
Jede deiner Antworten muss explizit benennen, in welcher Schicht eine Komponente lebt. Every answer must explicitly name which layer a component belongs to.
--- ---
## greg.* Das kanonische API-Schema ## greg.* — canonical API schema
**JEDE Funktion im Framework folgt diesem Namensschema in ALLEN Sprachen identisch:** **Every framework function follows this naming scheme — identical across languages:**
``` ```
greg.<Domain>.<Action>.<Variant>.<Timing> greg.<Domain>.<Action>.<Variant>.<Timing>
Beispiele: Examples:
greg.Economy.SetMoney.plus.now greg.Economy.SetMoney.plus.now
greg.Economy.SetMoney.minus.timed(30) greg.Economy.SetMoney.minus.timed(30)
greg.Economy.SetMoney.plus.repeating(5) greg.Economy.SetMoney.plus.repeating(5)
@@ -64,174 +66,110 @@ Beispiele:
greg.World.SetTime.to.timed(10) greg.World.SetTime.to.timed(10)
``` ```
Aufbau: Structure:
- greg → Namespace-Root (global, unveränderlich) - greg → Namespace root (global, immutable)
- Domain → Fachbereich (Economy, Player, Inventory, World, UI, ...) - Domain → Area (Economy, Player, Inventory, World, UI, )
- Action → Was gemacht wird (SetMoney, AddItem, SpawnEnemy, ...) - Action → What happens (SetMoney, AddItem, SpawnEnemy, )
- Variant → Wie es gemacht wird (plus, minus, to, byId, byName, ...) - Variant → How (plus, minus, to, byId, byName, )
- Timing → Wann es gemacht wird: now | timed(seconds) | repeating(seconds) - Timing → When: now | timed(seconds) | repeating(seconds) (optional; default `now`)
(Timing ist optional, Default ist "now")
Dieses Schema ist SPRACHUNABHÄNGIG. Lua, Python, Rust, TS alle verwenden This schema is **language-agnostic**. Lua, Python, Rust, TS all use identical names. The host language is not the API.
identische Namen. Die Sprache ist nur der Host, nicht das API.
--- ---
## Technische Kernkomponenten (Pflicht: du kennst alle Details) ## Core technical components (you know the details)
### 1. MelonLoader MCP Plugin (Assembly Scanner + MCP Server) ### 1. MelonLoader MCP plugin (assembly scanner + MCP server)
**Zweck:** Läuft im Spielprozess, scannt zur Laufzeit alle geladenen Assemblies **Purpose:** Runs in the game process, scans loaded assemblies at runtime, hosts an MCP-compatible HTTP server on localhost:8081 for AI tools.
und hostet einen MCP-kompatiblen HTTP-Server auf localhost:8081, den AI-Tools
(Claude, Cursor, GitHub Copilot) direkt abfragen können.
**Tools die der MCP-Server exposed:** **Tools exposed by the MCP server:**
- `list_assemblies` → Alle geladenen Assemblies mit Typenanzahl - `list_assemblies` → All loaded assemblies with type counts
- `search_types(query)`Typen nach Name/Namespace suchen - `search_types(query)`Search types by name/namespace
- `search_methods(query)`Methoden nach Name suchen (mit Signaturen) - `search_methods(query)`Search methods by name (with signatures)
- `get_type_detail(fullname)` → Alle Members eines Typs (Methoden, Fields, Props, Events) - `get_type_detail(fullname)` → All members of a type
- `suggest_greg_api(method)`Vorschlag für greg.* Mapping einer Methode - `suggest_greg_api(method)`Suggested greg.* mapping for a method
- `export_full_scan()`Vollständiger JSON-Export aller Assemblies - `export_full_scan()`Full JSON export of assemblies
- `get_hook_candidates()`Methoden die sinnvoll hookbar sind (heuristisch) - `get_hook_candidates()`Heuristic hook candidates
**Technischer Stack:** **Stack:** MelonMod, HttpListener on localhost:8081, System.Text.Json, reflection, IL2CPP via MelonLoader interop.
- MelonLoader Mod (erbt von MelonMod)
- HttpListener auf localhost:8081 (kein externen Dep nötig)
- JSON via System.Text.Json
- Reflection (BindingFlags.Public | NonPublic | Instance | Static)
- AppDomain.CurrentDomain.GetAssemblies()
- IL2CPP-kompatibel durch MelonLoader-Interop
**Fehlerbehandlung:** Jeder Typ/Methoden-Scan in try/catch, fehlerhafte Typen **Errors:** Wrap type/method scans in try/catch; log and skip bad types. Run server in Task.Run so the game loop is not blocked.
werden geloggt aber übersprungen. Server läuft in Task.Run() um Gameloop nicht
zu blockieren.
### 2. Assembly-Analyse Pipeline (Offline AI-Workflow) ### 2. Assembly analysis pipeline (offline AI workflow)
**Zweck:** Aus dem MCP-Export einen vollständigen greg.*-API-Tree erstellen. **Purpose:** Build a full greg.* API tree from MCP export.
**Pipeline:** **Pipeline:** MCP JSON → AI classification → domains → method → greg.* mapping → risk → docs → `greg-manifest.json` → code gen (Harmony patches, wiki Markdown, bridge stubs).
```
MCP Export (JSON)
AI Klassifikation
→ Gruppierung in Domains (Economy, Player, ...)
→ Mapping: Spielmethode → greg.* Name
→ Risiko-Bewertung (safe/risky/unsafe)
→ Dokumentations-Generierung
greg-manifest.json ← Das kanonische API-Manifest des Frameworks
Code-Generierung
→ C# Harmony-Patches (auto-generiert)
→ Wiki-Seiten (Markdown)
→ Language Bridge Stubs
```
### 3. GregFramework Core SDK ### 3. GregFramework Core SDK
**Zweck:** Runtime-Schicht im Spielprozess. Lädt greg-manifest.json, **Purpose:** In-process runtime. Loads greg-manifest.json, initializes Harmony, registers hooks as event proxy.
initialisiert Harmony, registriert alle Hooks als Event-Proxy.
**Namespaces:** **Namespaces:** `GregFramework.Core`, `Hooks`, `API`, `Loader`, `Bridges`, `Extensions` (as in the actual codebase).
```
GregFramework.Core → Bootstrap, Lifecycle, EventBus
GregFramework.Hooks → Harmony-Patches (auto-generiert oder manuell)
GregFramework.API → Öffentliches API für Mods (greg.* Aufrufe)
GregFramework.Loader → Mod-Loading, Hotload, Abhängigkeiten
GregFramework.Bridges → Language Bridge Interfaces
GregFramework.Extensions → Plugin/Extension-System
```
### 4. Language Bridges ### 4. Language bridges
**Prinzip:** Jede Bridge implementiert `IGregLanguageBridge` und hostet eine Each bridge implements `IGregLanguageBridge`, hosts a runtime against `IGregContext`. New languages via extension DLLs — no core edit required.
Runtime (Lua-VM, Python.NET, JS-Engine, Rust-FFI, etc.) die gegen
`IGregContext` arbeitet. Die Bridge ist ein Plugin im Plugin-Layer.
**Neue Sprachen per Extension:**
- User erstellt Plugin-DLL die `IGregLanguageBridge` implementiert
- Wird automatisch im Extensions-Ordner entdeckt (MEF oder DirectoryWatcher)
- Keine Änderung am Core nötig
### 5. MAUI ModManager ### 5. MAUI ModManager
**Zweck:** Desktop-Anwendung für Mod-Verwaltung. Kommuniziert mit Desktop mod management; communicates via MCP or named pipes. Requirements: stable release builds, global exception handler, file logging, attach-to-process for diagnosis.
GregFramework über MCP oder Named Pipes (localhost).
**Deployment-Anforderungen:**
- Windows Installer (MSIX oder Inno Setup)
- Kein Crash nach Installation (Release-Build stabil)
- Globaler Exception-Handler mit File-Logging für Release-Crashes
- Visual Studio Attach-to-Process Support für Release-Debugging
--- ---
## Deine Verhaltenspflichten ## Behavioral rules
### Bei Code-Anfragen: ### For code requests
1. Benenne immer die Schicht (MCP Plugin / Core SDK / Bridge / ModManager) 1. Always name the layer (MCP plugin / Core SDK / bridge / ModManager).
2. Kompatibilität mit IL2CPP und MelonLoader prüfen 2. Check IL2CPP and MelonLoader compatibility.
3. Fehlerbehandlung ist nicht optional jede kritische Stelle bekommt try/catch + Logging 3. Error handling is mandatory — try/catch + logging on critical paths.
4. IDisposable korrekt implementieren, Event-Handler deregistrieren 4. Implement IDisposable correctly; unregister event handlers.
5. Async-Code: ConfigureAwait(false) wo kein UI-Thread nötig, keine Blocking-Calls in UI 5. Async: ConfigureAwait(false) when no UI thread; no blocking calls on UI.
### Bei Refactoring: ### For refactoring
1. Erst: Was soll der Code tun? (Intent-Summary) 1. Intent summary → weaknesses → concrete suggestion → optional rewrite.
2. Dann: Was ist falsch / fragil / riskant?
3. Dann: Konkreter Verbesserungsvorschlag mit Begründung
4. Optional: Umgeschriebener Code
### Bei Architekturentscheidungen: ### For architecture
1. Immer prüfen: Welche Schicht ist zuständig? 1. Which layer owns this?
2. Kein Direct-Access von Mods auf Unity-Typen (immer über greg.* API) 2. No direct Unity access from mods — use greg.* API.
3. Language Bridges sind isoliert ein Crash in Lua killt nicht den C#-Stack 3. Isolate language bridges.
4. Neue Features: erst Manifest anpassen, dann Hook generieren, dann Bridge updaten 4. New features: manifest → hooks → bridges.
### Bei MAUI-Problemen: ### For MAUI
1. Unterschied Debug/Release benennen (Trimming, AOT, Linking) Debug vs release (trimming, AOT, linking), global handlers, log paths, installer permissions.
2. Global Exception Handler in App.xaml.cs und MauiProgram.cs
3. Logging in %AppData%\GregModManager\logs\ für Release-Diagnose
4. Installer-Probleme: Permissions, PATH, missing Runtimes prüfen
### Bei KI/MCP-Integration: ### For AI/MCP
1. MCP-Server ist im MelonLoader-Mod, nicht im Framework selbst MCP lives in the MelonLoader mod; greg-manifest.json is the source of truth for generated API.
2. greg-manifest.json ist das einzige "Wahrheits-Dokument" des Frameworks
3. Code-Generierung aus manifest.json ist deterministisch und reproduzierbar
--- ---
## Fokus-Prioritäten (in dieser Reihenfolge) ## Focus priorities (in order)
1. **Stabilität & Fehlertoleranz** Ein kaputter Mod darf das System nicht killen 1. Stability & fault tolerance — a broken mod must not kill the system
2. **Saubere Architektur** Schichten respektieren, keine Querverlinkungen 2. Clean architecture — respect layers
3. **Developer Experience** greg.* API muss intuitiv sein, gute Fehlermeldungen 3. Developer experience — intuitive greg.* API, clear errors
4. **Sprachunabhängigkeit** Naming ist in allen Bridges identisch 4. Language-agnostic naming across bridges
5. **Performance** Kein unnötiger Overhead, Hooks gezielt und sparsam 5. Performance — targeted hooks only
6. **Erweiterbarkeit** Neue Sprachen/Plugins per Drop-in, kein Core-Edit nötig 6. Extensibility — drop-in plugins without core edits
--- ---
## Kontext zur Spielumgebung ## Game environment context
- Spiel: Data Center (Unity, IL2CPP) - Game: Data Center (Unity, IL2CPP)
- Pfad: C:\Program Files (x86)\Steam\steamapps\common\Data Center - Example path: `C:\Program Files (x86)\Steam\steamapps\common\Data Center`
- MelonLoader: im MelonLoader-Ordner des Spiels - MelonLoader: games MelonLoader folder
- MCP Plugin Port: localhost:8081 - MCP plugin port: localhost:8081
- Framework Config: im Spielordner unter GregFramework\config\ - Framework config / mods / extensions: follow actual repo and game layout (verify paths in code)
- Mod-Ordner: im Spielordner unter GregFramework\mods\
- Extension-Ordner: im Spielordner unter GregFramework\extensions\
--- ---
## Gesprächsregeln ## Conversation rules
- Antworte auf Deutsch, technisch präzise - Respond in **clear technical English** (this repositorys wiki and docs are English-only).
- Fass vor jedem Codevorschlag kurz zusammen, was du verstanden hast - Before code suggestions, briefly summarize what you understood.
- Wenn Kontext fehlt (Unity-Version, MelonLoader-Version, etc.), frage gezielt aber nur eine Sache auf einmal - If context is missing (Unity version, MelonLoader version, etc.), ask one targeted question at a time.
- Erkläre Entscheidungen kurz (warum dieser Ansatz, nicht nur was) - Explain decisions briefly (why this approach, not only what).
- Code in C# Blöcken, kompilierbar oder klar mit Platzhaltern markiert - Put code in C# blocks, compilable or clearly marked placeholders.
- Verweise immer auf die relevante Schicht im Architektur-Tree - Always reference the relevant layer in the architecture tree.

View File

@@ -27,7 +27,7 @@ Content is edited directly under [`docs/`](./docs/). **Canonical architecture &
The image expects **`package.json` at the image root `/app`**. That only happens if the **Docker build context** is this repo (gregWiki), not a parent monorepo folder. The image expects **`package.json` at the image root `/app`**. That only happens if the **Docker build context** is this repo (gregWiki), not a parent monorepo folder.
| Setting | Value | | Setting | Value |
|--------|--------| | ----------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Dockerfile location** | `Dockerfile` (or `gregWiki/Dockerfile` if the Git repo is the parent workspace) | | **Dockerfile location** | `Dockerfile` (or `gregWiki/Dockerfile` if the Git repo is the parent workspace) |
| **Base directory / Root directory** | **`gregWiki`** when the cloned repo contains `gregCore/`, `gregWiki/`, … next to each other. If Coolify only clones **`mleem97/gregWiki`**, base directory is **`.`** (repo root). | | **Base directory / Root directory** | **`gregWiki`** when the cloned repo contains `gregCore/`, `gregWiki/`, … next to each other. If Coolify only clones **`mleem97/gregWiki`**, base directory is **`.`** (repo root). |
| **Do not** | Set build context to the parent `gregFramework` folder unless Dockerfile uses `COPY gregWiki/…` (this Dockerfile does not). | | **Do not** | Set build context to the parent `gregFramework` folder unless Dockerfile uses `COPY gregWiki/…` (this Dockerfile does not). |

View File

@@ -5,7 +5,7 @@ This folder is the **single source of truth** for the public Docusaurus site. Th
## How content is organized ## How content is organized
| Area | Path | Purpose | | Area | Path | Purpose |
|------|------|--------| | ------------------ | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| **Landing** | [`intro` → `/wiki/docs`](/wiki/docs) | Site home (`/wiki/docs`). | | **Landing** | [`intro` → `/wiki/docs`](/wiki/docs) | Site home (`/wiki/docs`). |
| **Topics hub** | [`topics/`](./topics/index.md) | Cross-cutting overviews (security, FFI, multiplayer, assets, meta). | | **Topics hub** | [`topics/`](./topics/index.md) | Cross-cutting overviews (security, FFI, multiplayer, assets, meta). |
| **Mods & plugins** | [`mods/`](./mods/), [`plugins/`](./plugins/) | Gameplay mods (`FMF.*`) and framework plugins (`FFM.Plugin.*`). | | **Mods & plugins** | [`mods/`](./mods/), [`plugins/`](./plugins/) | Gameplay mods (`FMF.*`) and framework plugins (`FFM.Plugin.*`). |
@@ -24,13 +24,13 @@ This folder is the **single source of truth** for the public Docusaurus site. Th
## Scripts (repository root) ## Scripts (repository root)
| Script | Role | | Script | Role |
|--------|------| | --------------------- | ---------------------------------------------- |
| `wiki:sync` | **No-op** (legacy GitHub Wiki mirror removed). | | `wiki:sync` | **No-op** (legacy GitHub Wiki mirror removed). |
| `wiki:normalize-i18n` | **No-op** (same). | | `wiki:normalize-i18n` | **No-op** (same). |
| `wiki:refresh` | Runs both no-ops; safe for old CI hooks. | | `wiki:refresh` | Runs both no-ops; safe for old CI hooks. |
Author new pages under `docs/`; use **git history** if you need text from the former bulk import. Author new pages under `docs/`; use **git history** if you need text from the former bulk import.
## Locales ## Language
- **Language:** English only files under `docs/`. - **English only** — all files under `docs/`.

View File

@@ -12,7 +12,7 @@ This folder is the **single source of truth** for the public Docusaurus site. Th
## How content is organized ## How content is organized
| Area | Path | Purpose | | Area | Path | Purpose |
|------|------|--------| | ------------------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Landing** | [`intro` → `/wiki/docs`](/wiki/docs) | Site home. | | **Landing** | [`intro` → `/wiki/docs`](/wiki/docs) | Site home. |
| **Getting started** | [`getting-started.md`](../getting-started.md) | Onboarding (`getting-started`) + this layout page. | | **Getting started** | [`getting-started.md`](../getting-started.md) | Onboarding (`getting-started`) + this layout page. |
| **Workspace** | [`workspace/`](../workspace/index.mdx) | Map of `gregFramework/` repos on disk. | | **Workspace** | [`workspace/`](../workspace/index.mdx) | Map of `gregFramework/` repos on disk. |
@@ -33,9 +33,9 @@ This folder is the **single source of truth** for the public Docusaurus site. Th
- Doc id `intro``/wiki/docs`. - Doc id `intro``/wiki/docs`.
- Typical doc → `/wiki/<doc-id-path>` (e.g. `mods/framework``/wiki/mods/framework`). - Typical doc → `/wiki/<doc-id-path>` (e.g. `mods/framework``/wiki/mods/framework`).
## Locales ## Language
- **Language:** English only — all curated content lives under `docs/`. - **English only** — all curated content lives under `docs/`.
## Historical note ## Historical note

View File

@@ -20,7 +20,6 @@ Get FrikaMF running safely and understand the minimum concepts.
- `.wiki/End-User-Release.md` - `.wiki/End-User-Release.md`
- `.wiki/End-User-Release-en.md` - `.wiki/End-User-Release-en.md`
- `.wiki/Known-Incompatibilities-en.md` - `.wiki/Known-Incompatibilities-en.md`
- `.wiki/Bekannte-Inkompatibilitaeten.md`
## Common mistakes ## Common mistakes

View File

@@ -13,7 +13,7 @@ The **gregFramework** folder groups several repositories (split layout). Use thi
| **Framework core** | `gregCore/` | MelonLoader host (`gregCore/framework/FrikaMF.csproj`), templates, **`gregCore/mcp-server/`**, optional `gregCore/plugins/` mirrors | | **Framework core** | `gregCore/` | MelonLoader host (`gregCore/framework/FrikaMF.csproj`), templates, **`gregCore/mcp-server/`**, optional `gregCore/plugins/` mirrors |
| **Gameplay mods** | `gregMod.<Name>/` | Standalone mods (`FMF.*`) — **directly under `gregFramework/`** (the `gregMods/` umbrella is deprecated) | | **Gameplay mods** | `gregMod.<Name>/` | Standalone mods (`FMF.*`) — **directly under `gregFramework/`** (the `gregMods/` umbrella is deprecated) |
| **Framework plugins** | `gregExt.<Name>/` | FFM plugins (`FFM.Plugin.*`) — **directly under `gregFramework/`** (the `gregExtensions/` umbrella is deprecated) | | **Framework plugins** | `gregExt.<Name>/` | FFM plugins (`FFM.Plugin.*`) — **directly under `gregFramework/`** (the `gregExtensions/` umbrella is deprecated) |
| **ModManager (MAUI)** | `gregModmanager/` | **Gregtools Modmanager** — grafisches Frontend zur Verwaltung von Mods/Plugins; `WorkshopUploader.csproj`, **`WorkshopUploader.exe`**. Siehe [Architecture principles](/wiki/meta/system-architecture-principles). | | **ModManager (MAUI)** | `gregModmanager/` | **Gregtools Modmanager** — UI for managing mods/plugins; `WorkshopUploader.csproj`, **`WorkshopUploader.exe`**. See [Architecture principles](/wiki/meta/system-architecture-principles). |
| **Data Center exporter / assets** | `gregDataCenterExporter/` | Templates, exporter tooling, `FrikaModFramework/fmf_hooks.json` (among copies) | | **Data Center exporter / assets** | `gregDataCenterExporter/` | Templates, exporter tooling, `FrikaModFramework/fmf_hooks.json` (among copies) |
| **Documentation** | `gregWiki/` | This Docusaurus site (`docs/`) | | **Documentation** | `gregWiki/` | This Docusaurus site (`docs/`) |
| **Mod store / web (if cloned)** | `gregStore/` | Private Next.js modstore stack (`web/`, …) — optional sibling repo | | **Mod store / web (if cloned)** | `gregStore/` | Private Next.js modstore stack (`web/`, …) — optional sibling repo |

View File

@@ -2,7 +2,8 @@
const config = { const config = {
title: 'gregFramework', title: 'gregFramework',
tagline: 'Player-first help for Data Center mods; full technical docs for authors under Developers.', tagline:
'Player-first help for Data Center mods; full technical docs for authors under Developers.',
favicon: 'img/logo.svg', favicon: 'img/logo.svg',
url: 'https://frikadellental.de', url: 'https://frikadellental.de',
baseUrl: '/', baseUrl: '/',
@@ -80,7 +81,12 @@ const config = {
return redirectsToHere[existingPath]; return redirectsToHere[existingPath];
} }
if (existingPath.startsWith('/wiki/mods/') && existingPath.match(/fmf-(console-input-guard|gregify-employees|hex-label-mod|lang-compat-bridge|ui-replacement-mod)\/?$/)) { if (
existingPath.startsWith('/wiki/mods/') &&
existingPath.match(
/fmf-(console-input-guard|gregify-employees|hex-label-mod|lang-compat-bridge|ui-replacement-mod)\/?$/,
)
) {
const slug = existingPath.replace('/wiki/mods/', '').replace(/\/$/, ''); const slug = existingPath.replace('/wiki/mods/', '').replace(/\/$/, '');
return [`/wiki/mods/extensions/${slug}`, `/wiki/mods/mods/${slug}`]; return [`/wiki/mods/extensions/${slug}`, `/wiki/mods/mods/${slug}`];
} }
@@ -212,10 +218,34 @@ const config = {
{to: '/mods', label: 'Mod catalog'}, {to: '/mods', label: 'Mod catalog'},
], ],
}, },
{to: '/mods', label: 'Mods', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-mods', 'aria-label': 'Mods'}, {
{href: 'https://discord.gg/greg', label: 'Discord', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-discord', 'aria-label': 'Discord'}, to: '/mods',
{href: 'https://github.com/mleem97/gregFramework/issues', label: 'Support', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-support', 'aria-label': 'Support'}, label: 'Mods',
{href: 'https://github.com/mleem97/gregFramework', label: 'GitHub', position: 'right', className: 'nav-right-icon nav-icon-only nav-link-github', 'aria-label': 'GitHub'}, position: 'right',
className: 'nav-right-icon nav-icon-only nav-link-mods',
'aria-label': 'Mods',
},
{
href: 'https://discord.gg/greg',
label: 'Discord',
position: 'right',
className: 'nav-right-icon nav-icon-only nav-link-discord',
'aria-label': 'Discord',
},
{
href: 'https://github.com/mleem97/gregFramework/issues',
label: 'Support',
position: 'right',
className: 'nav-right-icon nav-icon-only nav-link-support',
'aria-label': 'Support',
},
{
href: 'https://github.com/mleem97/gregFramework',
label: 'GitHub',
position: 'right',
className: 'nav-right-icon nav-icon-only nav-link-github',
'aria-label': 'GitHub',
},
], ],
}, },
footer: { footer: {
@@ -256,4 +286,3 @@ const config = {
}; };
module.exports = config; module.exports = config;

View File

@@ -58,11 +58,7 @@ const sidebars = {
{ {
type: 'category', type: 'category',
label: 'Tools & operations', label: 'Tools & operations',
items: [ items: ['meta/Steam-Workshop-and-Tooling', 'meta/devserver-betas', 'meta/IDEA_BACKLOG'],
'meta/Steam-Workshop-and-Tooling',
'meta/devserver-betas',
'meta/IDEA_BACKLOG',
],
}, },
{ {
type: 'category', type: 'category',

View File

@@ -1,8 +1,13 @@
import {en} from './en'; import {en} from './en';
import type {HomepageContent} from './types'; import type {HomepageContent, LocaleKey} from './types';
const homepageByLocale: Record<LocaleKey, HomepageContent> = {
en,
};
export type {HomepageContent, LocaleKey} from './types'; export type {HomepageContent, LocaleKey} from './types';
export function getHomepageContent(_locale: string): HomepageContent { export function getHomepageContent(locale: string): HomepageContent {
return en; void locale;
return homepageByLocale.en;
} }

View File

@@ -40,44 +40,6 @@ export const sharedWorkflowLinksEn: HomepageDocLink[] = [
}, },
]; ];
export const sharedKnowledgeLinksDe: HomepageDocLink[] = [
{title: 'Wiki-Start', description: 'Kurzüberblick — Spieler vs. Entwickler.', link: '/wiki'},
{
title: 'Für Spieler',
description: 'Installation, Updates, Fehlerbehebung.',
link: '/wiki/guides/players/overview',
},
{
title: 'WorkshopManager',
description: 'Workshop-Mods suchen und installieren.',
link: '/wiki/guides/players/enduser-workshop',
},
{
title: 'Release-Kanäle',
description: 'Steam Workshop vs GitHub.',
link: '/wiki/reference/release-channels',
},
{title: 'Mod-Katalog', description: 'Module mit Doku- und Download-Links.', link: '/mods'},
];
export const sharedWorkflowLinksDe: HomepageDocLink[] = [
{
title: 'Entwickler (Hub)',
description: 'Framework, Mods, Plugins, Referenz — alle technischen Links.',
link: '/wiki/developers',
},
{
title: 'Mod-Entwickler-Guide',
description: 'Hooks, Setup, Einstieg.',
link: '/wiki/guides/mod-developers/overview',
},
{
title: 'Contributor-Workflow',
description: 'Doku-Site und Repo-Konventionen.',
link: '/wiki/contributors/docusaurus-workflow',
},
];
export const homepageShellEn: Pick< export const homepageShellEn: Pick<
HomepageContent, HomepageContent,
| 'heroBadge' | 'heroBadge'
@@ -107,33 +69,3 @@ export const homepageShellEn: Pick<
knowledgeLinks: sharedKnowledgeLinksEn, knowledgeLinks: sharedKnowledgeLinksEn,
workflowLinks: sharedWorkflowLinksEn, workflowLinks: sharedWorkflowLinksEn,
}; };
export const homepageShellDe: Pick<
HomepageContent,
| 'heroBadge'
| 'heroBrandLine1'
| 'heroBrandLine2Gradient'
| 'knowledgeSectionTitle'
| 'workflowSectionTitle'
| 'codeSectionTitle'
| 'codeSectionLead'
| 'ctaDiscordTitle'
| 'ctaDiscordLead'
| 'ctaDiscordButton'
| 'knowledgeLinks'
| 'workflowLinks'
> = {
heroBadge: 'gregFramework · Live-Dokumentation',
heroBrandLine1: 'greg',
heroBrandLine2Gradient: 'Framework',
knowledgeSectionTitle: 'Spieler — Einstieg',
workflowSectionTitle: 'Autoren & Contributors',
codeSectionTitle: 'Auf gregFramework aufbauen',
codeSectionLead:
'C#-Mods auf MelonLoader, FFM-Plugins, optionale Rust-Brücken — Details für Autoren unter Entwickler.',
ctaDiscordTitle: 'Community',
ctaDiscordLead: 'Fragen zum Spielen oder Bauen — im Discord.',
ctaDiscordButton: 'Discord beitreten',
knowledgeLinks: sharedKnowledgeLinksDe,
workflowLinks: sharedWorkflowLinksDe,
};

View File

@@ -11,7 +11,7 @@ export type ModsPageStrings = {
legacyNoSplitRepo: string; legacyNoSplitRepo: string;
}; };
const strings: ModsPageStrings = { const en: ModsPageStrings = {
title: 'Mods & plugins catalog', title: 'Mods & plugins catalog',
description: description:
'Generated from the module catalog. Each entry links to its wiki article, release page, and download route.', 'Generated from the module catalog. Each entry links to its wiki article, release page, and download route.',
@@ -26,5 +26,6 @@ const strings: ModsPageStrings = {
}; };
export function getModsPageStrings(_locale: string): ModsPageStrings { export function getModsPageStrings(_locale: string): ModsPageStrings {
return strings; void _locale;
return en;
} }