mirror of
https://github.com/mleem97/gregWiki.git
synced 2026-04-11 03:29:19 +02:00
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:
2
.github/copilot-instructions.md
vendored
2
.github/copilot-instructions.md
vendored
@@ -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.
|
||||||
|
|
||||||
|
|||||||
@@ -2,60 +2,62 @@
|
|||||||
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]
|
||||||
│
|
│
|
||||||
▼
|
▼
|
||||||
[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: game’s 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 repository’s 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.
|
||||||
|
|||||||
10
README.md
10
README.md
@@ -26,12 +26,12 @@ 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). |
|
||||||
| **Volumes** | Do **not** bind-mount an empty host path over `/app` — that hides `package.json` from the image. |
|
| **Volumes** | Do **not** bind-mount an empty host path over `/app` — that hides `package.json` from the image. |
|
||||||
|
|
||||||
Symptom: `docker-entrypoint: ERROR: /app/package.json not found` → wrong build context or a bad volume on `/app`.
|
Symptom: `docker-entrypoint: ERROR: /app/package.json not found` → wrong build context or a bad volume on `/app`.
|
||||||
|
|
||||||
|
|||||||
@@ -4,17 +4,17 @@ 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.*`). |
|
||||||
| **Releases** | [`releases/`](./releases/) | Per-artifact release notes. |
|
| **Releases** | [`releases/`](./releases/) | Per-artifact release notes. |
|
||||||
| **Reference** | [`reference/`](./reference/) | Hooks, naming, MCP, generated catalogs. |
|
| **Reference** | [`reference/`](./reference/) | Hooks, naming, MCP, generated catalogs. |
|
||||||
| **Contributors** | [`contributors/`](./contributors/) | Repo layout, Docusaurus workflow, design system. |
|
| **Contributors** | [`contributors/`](./contributors/) | Repo layout, Docusaurus workflow, design system. |
|
||||||
| **Guides** | [`guides/`](./guides/players/overview.md) | Role-based paths (players, mod developers, contributors, sponsors). |
|
| **Guides** | [`guides/`](./guides/players/overview.md) | Role-based paths (players, mod developers, contributors, sponsors). |
|
||||||
| **Roadmap** | [`roadmap/`](./roadmap/) | Planning docs. |
|
| **Roadmap** | [`roadmap/`](./roadmap/) | Planning docs. |
|
||||||
| **Meta** | [`meta/`](./meta/) | Workshop, devserver, backlog; [architecture principles](./meta/system-architecture-principles.md) (ModManager → Framework → Plugins → Mods). |
|
| **Meta** | [`meta/`](./meta/) | Workshop, devserver, backlog; [architecture principles](./meta/system-architecture-principles.md) (ModManager → Framework → Plugins → Mods). |
|
||||||
|
|
||||||
## URLs
|
## URLs
|
||||||
|
|
||||||
@@ -23,14 +23,14 @@ 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/`.
|
||||||
|
|||||||
@@ -11,31 +11,31 @@ 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. |
|
||||||
| **Framework** | [`framework/`](../framework/architecture.md) | Architecture, hooks, Hexmod. |
|
| **Framework** | [`framework/`](../framework/architecture.md) | Architecture, hooks, Hexmod. |
|
||||||
| **Plugins** | [`plugins/`](../plugins/index.md) | `FFM.Plugin.*` assemblies; repos `gregExt.*` on disk. |
|
| **Plugins** | [`plugins/`](../plugins/index.md) | `FFM.Plugin.*` assemblies; repos `gregExt.*` on disk. |
|
||||||
| **Mods** | [`mods/`](../mods/index.md) | Gameplay mods (`FMF.*`); repos `gregMod.*` on disk. |
|
| **Mods** | [`mods/`](../mods/index.md) | Gameplay mods (`FMF.*`); repos `gregMod.*` on disk. |
|
||||||
| **Tools** | [`tools/`](../tools/workshop-uploader.md) | Workshop uploader and related. |
|
| **Tools** | [`tools/`](../tools/workshop-uploader.md) | Workshop uploader and related. |
|
||||||
| **Guides** | [`guides/`](../guides/players/overview.md) | Role-based paths (players, mod developers, contributors, sponsors). |
|
| **Guides** | [`guides/`](../guides/players/overview.md) | Role-based paths (players, mod developers, contributors, sponsors). |
|
||||||
| **Releases** | [`releases/`](../releases/index.mdx) | Per-artifact release notes. |
|
| **Releases** | [`releases/`](../releases/index.mdx) | Per-artifact release notes. |
|
||||||
| **Reference** | [`reference/`](../reference/wiki-mapping.md) | Naming, catalogs, MCP, release channels. |
|
| **Reference** | [`reference/`](../reference/wiki-mapping.md) | Naming, catalogs, MCP, release channels. |
|
||||||
| **Contributors** | [`contributors/`](../contributors/repo-inventory.md) | Repo inventory, Docusaurus workflow, design system. |
|
| **Contributors** | [`contributors/`](../contributors/repo-inventory.md) | Repo inventory, Docusaurus workflow, design system. |
|
||||||
| **Roadmap** | [`roadmap/`](../roadmap/unified-roadmap.md) | Planning docs. |
|
| **Roadmap** | [`roadmap/`](../roadmap/unified-roadmap.md) | Planning docs. |
|
||||||
| **Topics hub** | [`topics/`](../topics/index.md) | Cross-cutting overviews (assets, multiplayer, security, …). |
|
| **Topics hub** | [`topics/`](../topics/index.md) | Cross-cutting overviews (assets, multiplayer, security, …). |
|
||||||
| **Meta** | [`meta/`](../meta/Steam-Workshop-and-Tooling.md) | Workshop tooling notes, devserver API, backlog; **[architecture principles](../meta/system-architecture-principles.md)** (stack model & doc rules). |
|
| **Meta** | [`meta/`](../meta/Steam-Workshop-and-Tooling.md) | Workshop tooling notes, devserver API, backlog; **[architecture principles](../meta/system-architecture-principles.md)** (stack model & doc rules). |
|
||||||
|
|
||||||
## URLs
|
## URLs
|
||||||
|
|
||||||
- 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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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 |
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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',
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user