chore: initialize gregWiki standalone repository

This commit is contained in:
Marvin
2026-04-08 00:10:25 +02:00
commit d377ff70a8
186 changed files with 4885 additions and 0 deletions

5
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
github: [mleem97]
custom:
- https://github.com/sponsors/mleem97
- https://gregframework.eu
- https://datacentermods.com

21
.github/copilot-instructions.md vendored Normal file
View File

@@ -0,0 +1,21 @@
# Copilot Instructions
## Core Runtime Guardrails
- Keep all gameplay/runtime-facing components compatible with `.NET 6.x`.
- Do not retarget runtime projects beyond `net6.0` unless explicitly requested and validated for Unity IL2CPP + MelonLoader.
## Mandatory System Architecture Prompt
- Apply `.github/instructions/gregframework_system_architecture.instructions.md` to all implementation and design decisions.
- If constraints conflict, prioritize runtime stability, clean layered boundaries, and `.NET 6` compatibility.
## SonarQube MCP Rules
- Apply `.github/instructions/sonarqube_mcp.instructions.md` whenever SonarQube MCP tooling is used.
## Collaboration Defaults
- Respond in technical German unless a file or repository policy explicitly requires English-only artifacts.
- Summarize intent before code changes.
- Keep refactors minimal and architecture-safe.
## Wiki Currency Check (Mandatory)
- At the end of every change request, verify whether relevant wiki pages are up to date.
- If updates are required, list the pages and include them in follow-up recommendations.

View File

@@ -0,0 +1,237 @@
---
applyTo: "**/*"
---
# GregFramework Technischer Systemarchitektur-Prompt
## Identität & Rolle
Du bist ein hochspezialisierter technischer Architekt und Senior-Entwickler für folgendes Gesamtsystem:
**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.
Du hast gleichzeitig tiefes Fachwissen in:
- Unity (IL2CPP und Mono), MelonLoader und Harmony
- .NET 6 / C# (Reflection, AppDomain, Assembly-Loading, Code-Generierung)
- .NET MAUI (Deployment, Installer, Debugging, Release-Build-Fixes)
- Model Context Protocol (MCP) für AI-Integration
- Mehrsprachige Runtime-Bridges (C#, Lua, Python, TypeScript/JS, Rust, Go, extensible)
- Modularer Plugin-Architektur (MEF, AssemblyLoadContext, Extension Points)
- Harmony/HarmonyX Patching (Prefix, Postfix, Transpiler, dynamische TargetMethod)
- IL2CPP-Metadaten-Analyse (Il2CppDumper, Il2CppInspector, Cpp2IL, Reflection zur Laufzeit)
---
## Zielarchitektur (Pflicht: immer im Kopf behalten)
Die Systemhierarchie ist unveränderlich wie folgt:
```
[MAUI ModManager]
[GregFramework Core SDK]
├──▶ [Plugin Layer] ← Interne Erweiterungen des Frameworks
│ │
│ ▼
│ [Language Bridges] ← C#, Lua, Python, TS/JS, Rust, Go, extensible
[Mod Layer] ← User-Mods (geschrieben in beliebiger Sprache)
[Unity Spiel / IL2CPP Assembly] ← via Harmony Hooks als Event-Proxy
```
Jede deiner Antworten muss explizit benennen, in welcher Schicht eine Komponente lebt.
---
## greg.* Das kanonische API-Schema
**JEDE Funktion im Framework folgt diesem Namensschema in ALLEN Sprachen identisch:**
```
greg.<Domain>.<Action>.<Variant>.<Timing>
Beispiele:
greg.Economy.SetMoney.plus.now
greg.Economy.SetMoney.minus.timed(30)
greg.Economy.SetMoney.plus.repeating(5)
greg.Player.SetHealth.plus.now
greg.Inventory.AddItem.byId.now
greg.World.SetTime.to.timed(10)
```
Aufbau:
- greg → Namespace-Root (global, unveränderlich)
- Domain → Fachbereich (Economy, Player, Inventory, World, UI, ...)
- Action → Was gemacht wird (SetMoney, AddItem, SpawnEnemy, ...)
- Variant → Wie es gemacht wird (plus, minus, to, byId, byName, ...)
- Timing → Wann es gemacht wird: now | timed(seconds) | repeating(seconds)
(Timing ist optional, Default ist "now")
Dieses Schema ist SPRACHUNABHÄNGIG. Lua, Python, Rust, TS alle verwenden
identische Namen. Die Sprache ist nur der Host, nicht das API.
---
## Technische Kernkomponenten (Pflicht: du kennst alle Details)
### 1. MelonLoader MCP Plugin (Assembly Scanner + MCP Server)
**Zweck:** Läuft im Spielprozess, scannt zur Laufzeit alle geladenen Assemblies
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:**
- `list_assemblies` → Alle geladenen Assemblies mit Typenanzahl
- `search_types(query)` → Typen nach Name/Namespace suchen
- `search_methods(query)` → Methoden nach Name suchen (mit Signaturen)
- `get_type_detail(fullname)` → Alle Members eines Typs (Methoden, Fields, Props, Events)
- `suggest_greg_api(method)` → Vorschlag für greg.* Mapping einer Methode
- `export_full_scan()` → Vollständiger JSON-Export aller Assemblies
- `get_hook_candidates()` → Methoden die sinnvoll hookbar sind (heuristisch)
**Technischer Stack:**
- 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
werden geloggt aber übersprungen. Server läuft in Task.Run() um Gameloop nicht
zu blockieren.
### 2. Assembly-Analyse Pipeline (Offline AI-Workflow)
**Zweck:** Aus dem MCP-Export einen vollständigen greg.*-API-Tree erstellen.
**Pipeline:**
```
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
**Zweck:** Runtime-Schicht im Spielprozess. Lädt greg-manifest.json,
initialisiert Harmony, registriert alle Hooks als Event-Proxy.
**Namespaces:**
```
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
**Prinzip:** Jede Bridge implementiert `IGregLanguageBridge` und hostet eine
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
**Zweck:** Desktop-Anwendung für Mod-Verwaltung. Kommuniziert mit
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
### Bei Code-Anfragen:
1. Benenne immer die Schicht (MCP Plugin / Core SDK / Bridge / ModManager)
2. Kompatibilität mit IL2CPP und MelonLoader prüfen
3. Fehlerbehandlung ist nicht optional jede kritische Stelle bekommt try/catch + Logging
4. IDisposable korrekt implementieren, Event-Handler deregistrieren
5. Async-Code: ConfigureAwait(false) wo kein UI-Thread nötig, keine Blocking-Calls in UI
### Bei Refactoring:
1. Erst: Was soll der Code tun? (Intent-Summary)
2. Dann: Was ist falsch / fragil / riskant?
3. Dann: Konkreter Verbesserungsvorschlag mit Begründung
4. Optional: Umgeschriebener Code
### Bei Architekturentscheidungen:
1. Immer prüfen: Welche Schicht ist zuständig?
2. Kein Direct-Access von Mods auf Unity-Typen (immer über greg.* API)
3. Language Bridges sind isoliert ein Crash in Lua killt nicht den C#-Stack
4. Neue Features: erst Manifest anpassen, dann Hook generieren, dann Bridge updaten
### Bei MAUI-Problemen:
1. Unterschied Debug/Release benennen (Trimming, AOT, Linking)
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:
1. MCP-Server ist im MelonLoader-Mod, nicht im Framework selbst
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)
1. **Stabilität & Fehlertoleranz** Ein kaputter Mod darf das System nicht killen
2. **Saubere Architektur** Schichten respektieren, keine Querverlinkungen
3. **Developer Experience** greg.* API muss intuitiv sein, gute Fehlermeldungen
4. **Sprachunabhängigkeit** Naming ist in allen Bridges identisch
5. **Performance** Kein unnötiger Overhead, Hooks gezielt und sparsam
6. **Erweiterbarkeit** Neue Sprachen/Plugins per Drop-in, kein Core-Edit nötig
---
## Kontext zur Spielumgebung
- Spiel: Data Center (Unity, IL2CPP)
- Pfad: C:\Program Files (x86)\Steam\steamapps\common\Data Center
- MelonLoader: im MelonLoader-Ordner des Spiels
- MCP Plugin Port: localhost:8081
- Framework Config: im Spielordner unter GregFramework\config\
- Mod-Ordner: im Spielordner unter GregFramework\mods\
- Extension-Ordner: im Spielordner unter GregFramework\extensions\
---
## Gesprächsregeln
- Antworte auf Deutsch, technisch präzise
- Fass vor jedem Codevorschlag kurz zusammen, was du verstanden hast
- Wenn Kontext fehlt (Unity-Version, MelonLoader-Version, etc.), frage gezielt aber nur eine Sache auf einmal
- Erkläre Entscheidungen kurz (warum dieser Ansatz, nicht nur was)
- Code in C# Blöcken, kompilierbar oder klar mit Platzhaltern markiert
- Verweise immer auf die relevante Schicht im Architektur-Tree

120
.github/workflows/sponsor-tier-sync.yml vendored Normal file
View File

@@ -0,0 +1,120 @@
name: Sponsor Tier Sync
on:
workflow_dispatch:
schedule:
- cron: "17 * * * *"
permissions:
contents: write
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Export sponsor tiers
uses: actions/github-script@v7
env:
SPONSOR_OWNER: mleem97
SPONSOR_TOKEN: ${{ secrets.SPONSORS_READ_TOKEN }}
with:
github-token: ${{ secrets.SPONSORS_READ_TOKEN != '' && secrets.SPONSORS_READ_TOKEN || github.token }}
script: |
const fs = require('fs');
const path = require('path');
const core = require('@actions/core');
const owner = process.env.SPONSOR_OWNER || context.repo.owner;
const now = new Date().toISOString();
const outDir = path.join(process.cwd(), 'sponsors');
const outFile = path.join(outDir, 'sponsors.json');
const emptyPayload = {
generatedAt: now,
owner,
totals: { activeSponsors: 0, monthlyUsd: 0 },
tiers: {},
sponsors: []
};
fs.mkdirSync(outDir, { recursive: true });
const query = `
query($login: String!) {
user(login: $login) {
sponsorshipsAsMaintainer(first: 100, activeOnly: true) {
nodes {
sponsorEntity {
__typename
... on User { login url }
... on Organization { login url }
}
tier {
name
monthlyPriceInDollars
isOneTime
}
privacyLevel
createdAt
}
}
}
}
`;
try {
const result = await github.graphql(query, { login: owner });
const nodes = result?.user?.sponsorshipsAsMaintainer?.nodes || [];
const sponsors = nodes
.filter(n => n?.tier && !n.tier.isOneTime && n?.sponsorEntity?.login)
.map(n => ({
login: n.sponsorEntity.login,
url: n.sponsorEntity.url,
tierName: n.tier.name,
monthlyUsd: n.tier.monthlyPriceInDollars,
privacyLevel: n.privacyLevel,
createdAt: n.createdAt
}))
.sort((a, b) => b.monthlyUsd - a.monthlyUsd || a.login.localeCompare(b.login));
const tiers = {};
let monthlyUsd = 0;
for (const s of sponsors) {
monthlyUsd += s.monthlyUsd;
if (!tiers[s.monthlyUsd]) {
tiers[s.monthlyUsd] = { count: 0, sponsors: [] };
}
tiers[s.monthlyUsd].count += 1;
tiers[s.monthlyUsd].sponsors.push({ login: s.login, url: s.url, tierName: s.tierName });
}
const payload = {
generatedAt: now,
owner,
totals: { activeSponsors: sponsors.length, monthlyUsd },
tiers,
sponsors
};
fs.writeFileSync(outFile, JSON.stringify(payload, null, 2) + '\n', 'utf8');
core.notice(`Exported ${sponsors.length} active sponsors for ${owner}.`);
} catch (error) {
core.warning(`Sponsor export failed: ${error.message}`);
fs.writeFileSync(outFile, JSON.stringify(emptyPayload, null, 2) + '\n', 'utf8');
}
- name: Commit sponsor export
run: |
if [[ -n "$(git status --porcelain sponsors/sponsors.json)" ]]; then
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
git add sponsors/sponsors.json
git commit -m "chore(sponsors): sync sponsor tiers"
git push
else
echo "No sponsor changes detected."
fi

4
.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
bin/
obj/
node_modules/
.DS_Store

13
IDEA_BACKLOG.md Normal file
View File

@@ -0,0 +1,13 @@
# Idea backlog (Discord and manual)
Add one line per idea. Unchecked items can be turned into GitHub issues with `python tools/auto_issue_creator.py`.
## Pending
- [ ] (example) Add a smoke test for the FFI bridge.
## Process
1. Discord: `!request Your idea` (requires `DISCORD_BOT_TOKEN` and `tools/discord_bridge.py`).
2. Or edit this file manually.
3. Run `python tools/auto_issue_creator.py` to create issues from unchecked lines (requires `gh` CLI and auth).

12
README (2).md Normal file
View File

@@ -0,0 +1,12 @@
---
title: Monorepo wiki (curated stubs)
sidebar_label: Monorepo wiki
description: Small curated pages for the target monorepo layout — not the GitHub Wiki import.
---
# Monorepo wiki (curated)
This folder holds **short, maintained** pages that describe the **intended** repository layout (e.g. Hexmod, framework hooks). It is separate from **`docs/wiki-import/`**, which mirrors the **GitHub Wiki**.
- Prefer **new documentation** in [`topics/`](../topics/index.md) or [`reference/`](../reference/fmf-hook-naming.md) when the content is not tied to a single mod stub.
- Optional manifest: [`mods/mod-index.json`](./mods/mod-index.json) (for future tooling; not consumed by Docusaurus automatically yet).

46
README.md Normal file
View File

@@ -0,0 +1,46 @@
# Documentation layout (`docs/`)
This folder is the **single source of truth** for the public Docusaurus site. The app lives in [`wiki/`](../wiki/); built pages are served under the **`/wiki`** base path.
## How content is organized
| Area | Path | Purpose |
|------|------|--------|
| **Landing** | [`intro.md`](./intro.md) | Site home (`/wiki/docs`). |
| **Curated topics** | [`topics/`](./topics/) | Hubs: **Rollen** (Spieler, Moddevs, Contributor, Sponsoren → [`audiences/overview`](./topics/audiences/overview.md)), Roadmap, Security, Wiki-Import. |
| **Mods & plugins** | [`mods/`](./mods/) | Framework, plugin wiki, mod wiki, standalone index. |
| **Releases** | [`releases/`](./releases/) | Per-artifact release notes. |
| **Reference** | [`reference/`](./reference/) | Hooks, naming, MCP, generated catalogs. |
| **Contributors** | [`contributors/`](./contributors/) | Repo layout, Docusaurus workflow, design system. |
| **Audiences** | [`audiences/`](./audiences/) | Newbies / intermediates / professionals. |
| **Roadmap** | [`roadmap/`](./roadmap/) | Planning docs. |
| **Meta** | [`meta/`](./meta/) | Workshop, devserver, backlog. |
| **Monorepo wiki stubs** | [`wiki/`](./wiki/) | Short pages tied to the target repo layout (e.g. Hexmod). **Not** the GitHub Wiki import. |
| **Legacy GitHub Wiki import** | [`wiki-import/`](./wiki-import/) | Bulk import from `.wiki/` (see below). |
## Legacy GitHub Wiki (`docs/wiki-import/`)
Long-form pages that originally lived in the **GitHub Wiki** are mirrored here so they are searchable and versioned with the repo.
1. **Clone or update** the wiki working tree at the repo root as **`.wiki/`** (separate clone: `https://github.com/<org>/<repo>.wiki.git`).
2. From **`wiki/`**, refresh the mirror and split locales:
- `npm run wiki:refresh`
- Or stepwise: `npm run wiki:sync``npm run wiki:normalize-i18n` (optional `--dry-run` first).
3. **German** translations for paired pages live under `wiki/i18n/de/docusaurus-plugin-content-docs/current/wiki-import/` after normalization.
4. **New curated docs** should usually be added as normal Markdown under `docs/` (topics, reference, mods), not only under `wiki-import/`, so they stay easy to find. Use `wiki-import/` for bulk legacy material and incremental fixes; migrate important pages into `docs/topics/` or `docs/reference/` when you rewrite them.
Details: [`topics/wiki-import/overview.md`](./topics/wiki-import/overview.md).
## URLs
- Doc id `intro``/wiki/docs` (see front matter).
- Most docs → `/wiki/<doc-path>` (e.g. `mods/framework``/wiki/mods/framework`).
- The monorepo stub folder uses ids like `wiki/mods/hexmod``/wiki/wiki/mods/hexmod` (double `wiki` in the path). Prefer linking by **doc id** or stable titles rather than hand-typing URLs.
## Scripts (repo root / `wiki/`)
| Script | Location | Role |
|--------|------------|------|
| Sync `.wiki``docs/wiki-import/` | `wiki/scripts/sync-wiki-to-docs.mjs` | Copies `*.md` from `.wiki/`. |
| Split DE/EN pairs | `wiki/scripts/normalize-wiki-import-i18n.mjs` | EN default locale, DE under `wiki/i18n/de/...`. |
| Sidebar category keys | `wiki/scripts/write-wiki-import-category-keys.mjs` | Regenerates `_category_.json` keys under Guides/Reference/Troubleshooting. |

54
SPONSORS.md Normal file
View File

@@ -0,0 +1,54 @@
# Sponsors
Thank you for supporting the GregFramework ecosystem.
## Top Sponsor (VIP)
- **💎 The Ecosystem Architect ($50/month):** [@tobiasreichel](https://github.com/tobiasreichel)
Premium benefits currently assigned:
- Top sponsor placement on ecosystem-facing surfaces (Wiki front page + Mod Store footer)
- Private 1-on-1 Discord lounge
- Featured mod spotlight option
## Sponsorship Tiers
### ☕ $1 / month The Coffee Supporter
- GitHub sponsor badge
- Discord `Supporter` role
- Eternal gratitude
### 🥉 $5 / month Bronze Backer (Active Player)
Includes all previous perks, plus:
- Credits entry in GregTools Mod Manager (`Special Thanks / Sponsors`)
- Access to sponsor-only Discord chat for spoilers/WIP/dev updates
### 🥈 $15 / month Silver Tester (Early Access)
Includes all previous perks, plus:
- Early access to pre-release and beta builds
- Roadmap voting access for Silver+ backers
### 🥇 $25 / month Gold Developer (Pro Modder)
Includes all previous perks, plus:
- Priority handling for framework bug reports
- Official Gold sponsor mention in repository `README.md`
### 💎 $50 / month The Ecosystem Architect (Premium/VIP)
Includes all previous perks, plus:
- Top sponsor placement on Wiki front page and Mod Store footer
- Private 1-on-1 Discord lounge
- Featured mod spot on `datacentermods.com`
## Automation
Use a repository workflow file at `.github/workflows/sponsor-tier-sync.yml` to export current sponsor tiers and drive Discord/website sync jobs.

30
architecture.md Normal file
View File

@@ -0,0 +1,30 @@
---
title: Monorepo — Architecture
sidebar_label: Monorepo architecture
description: Core vs bindings vs mods; hook scanner; Game2Framework compatibility.
---
# Monorepo — Architecture
## Layers
| Layer | Role |
|------|------|
| **Core** | MelonLoader mod + event dispatch — today under `framework/FrikaMF/` (C#). Target layout: `FrikaModFramework/src/core/`. |
| **Bindings** | Language-specific surfaces — placeholders under `FrikaModFramework/src/bindings/`. |
| **Mods / plugins** | Shipped sources in `mods/` and `plugins/`; optional pilot tree `HexMod/` (VDF + hooks metadata). |
| **Docs** | Docusaurus consumes repo-root `docs/`; app lives in `wiki/`. |
## Hook registry
`FrikaModFramework/fmf_hooks.json` is the declarative **single source of truth** for documented `FMF.*` hooks. The runtime still exposes legacy `FFM.*` strings where not yet migrated.
## Tools
- **`tools/fmf-hook-scanner`** — emit the [FMF Hook Reference](./fmf-hooks) page from the registry.
- **`tools/game2framework-migrator`** — dry-run mapping using `tools/fmf-hook-scanner/mapping/game2framework-map.json`.
- **`mcp-server/`** — Model Context Protocol server (docs + registry) for IDEs; can run in Docker with the static wiki — see [MCP server](../../reference/mcp-server.md).
## Steam & Workshop
Workshop templates: `templates/workshop/`. CLI/upload scripts: `tools/steam-workshop-upload/`. Desktop uploader (Windows MAUI): `WorkshopUploader/` (see `WorkshopUploader/README.md`).

View File

@@ -0,0 +1,30 @@
---
id: intermediates
title: Intermediates
slug: /audiences/intermediates
---
## Goal
Build and debug your own mods with stable framework workflows.
## Learning path
1. Pick one track: C# or Rust.
2. Learn hooks/events flow.
3. Use verified targets from `HOOKS.md`.
4. Implement mod config and diagnostics.
## Read next
- `.wiki/Mod-Developer-Debug.md`
- `.wiki/Mod-Developer-Debug-en.md`
- `.wiki/Modding-Guide.md`
- `.wiki/FFI-Bridge-Reference.md`
- `.wiki/Web-UI-Bridge.md`
## Practical checkpoints
- Build passes in debug/release
- Hook target is verified in `HOOKS.md`
- Events are version-safe and documented

29
audiences/newbies.md Normal file
View File

@@ -0,0 +1,29 @@
---
id: newbies
title: Newbies
slug: /audiences/newbies
---
## Goal
Get FrikaMF running safely and understand the minimum concepts.
## Start here
1. Install MelonLoader and run the game once.
2. Copy `FrikaModdingFramework.dll` into `Data Center/Mods`.
3. Add the mod that depends on FrikaMF.
4. Check `MelonLoader/Latest.log`.
## Read next
- `.wiki/End-User-Release.md`
- `.wiki/End-User-Release-en.md`
- `.wiki/Known-Incompatibilities-en.md`
- `.wiki/Bekannte-Inkompatibilitaeten.md`
## Common mistakes
- Wrong folder (`Mods` vs `RustMods`)
- Missing first game start after MelonLoader install
- Mixing incompatible game/framework versions

View File

@@ -0,0 +1,32 @@
---
id: professionals
title: Pros
slug: /audiences/professionals
---
## Goal
Work on framework internals, ABI stability, CI quality, and long-term maintainability.
## Focus areas
- Runtime architecture and ownership boundaries
- C#↔Rust ABI evolution
- Compatibility arbitration and diagnostics
- Release assets and template integrity
- Security review pipeline for future Mod Store
## Read next
- `.wiki/Architecture.md`
- `.wiki/Framework-Features-Use-Cases.md`
- `.wiki/StandaloneMods.md`
- `.wiki/Repository-Status-2026-04-04.md`
- `.wiki/ROADMAP.md`
- `.wiki/TASKLIST.md`
## Professional quality gates
- Explicit migration notes for contracts/events
- Reproducible build and release pipelines
- Documented rollback and incompatibility strategy

View File

@@ -0,0 +1,40 @@
---
id: docusaurus-workflow
title: Docusaurus Contributor Workflow
slug: /contributors/docusaurus-workflow
---
## Local workflow
Markdown and MDX live in the repo-root `docs/` folder. The Docusaurus app is in `wiki/`.
```bash
cd wiki
npm install
npm run start
```
## Build workflow
```bash
cd wiki
npm run build
npm run serve
```
## Can we hide Docusaurus build stuff from non-contributors?
Short answer for a **public repo**: **not fully**.
What you can do:
- Keep generated output (`build/`, `.docusaurus/`, `node_modules/`) out of Git using `.gitignore`.
- Put docs tooling under `wiki/` so core runtime contributors can ignore it; content stays in `docs/`.
- Use path-based CODEOWNERS to limit review noise.
- Trigger docs CI on `docs/**` and `wiki/**` changes.
What you cannot do in a public repo:
- Fully hide tracked source files from non-contributors.
If you need true visibility restriction, use a private repo/submodule for docs infra.

View File

@@ -0,0 +1,97 @@
---
sidebar_label: Luminescent design system
description: Visual and interaction guidelines for the docs site (Luminescent Architect).
---
The **Frika Mod Framework** (FMF) is the product name for all Docusaurus branding (site title, navbar, page titles). **Luminescent Architect** names this visual design system only.
# Design System Specification: The Luminescent Architect
## 1. Overview & Creative North Star
**The Creative North Star: "The Luminescent Architect"**
This design system moves away from the "flat-and-boxy" utility of standard modding sites. It treats code and community interaction as an architectural feat. We achieve a high-end editorial feel through **Tonal Depth** and **Intentional Asymmetry**. Instead of rigid grids that feel like a spreadsheet, we use overlapping layers and "light-bleed" to guide the users eye. The goal is a digital environment that feels like a high-end laboratory: sterile, precise, yet pulsing with the energy of the teal primary accent.
## 2. Color & Atmospheric Theory
We do not use color simply to decorate; we use it to define space.
### The "No-Line" Rule
**Explicit Instruction:** Prohibit 1px solid borders for sectioning.
Boundaries are defined solely through background color shifts. For example, a `surface-container-low` section sitting on a `surface` background creates a natural edge. This "Editorial Bleed" makes the interface feel expansive and premium rather than boxed-in.
### Surface Hierarchy & Nesting
Treat the UI as physical layers of "Synthetic Glass."
- **Layer 0 (Base):** `surface` (#001110) - The deep abyss.
- **Layer 1 (Sub-sections):** `surface-container-low` (#001715).
- **Layer 2 (Cards/Containers):** `surface-container` (#001E1C).
- **Layer 3 (Modals/Popovers):** `surface-container-high` (#002422).
### The Glass & Gradient Rule
Floating elements (Navigation, Tooltips) must use **Glassmorphism**.
- **Formula:** `surface-container` at 80% opacity + `backdrop-filter: blur(12px)`.
- **Signature Texture:** Primary CTAs must utilize a subtle linear gradient from `primary` (#61F4D8) to `primary-container` (#08C1A6) at a 135-degree angle. This prevents "flatness" and gives the button a machined, metallic quality.
Implementation reference: `wiki/src/css/custom.css` (`@theme` tokens, `.btn-primary`, `.glass-card`, `.navbar`).
## 3. Typography: The Editorial Edge
The contrast between the technical precision of **Inter** and the geometric authority of **Space Grotesk** defines the brand.
- **Display & Headlines (Space Grotesk):** Use these for hero sections and documentation titles. High-contrast and slightly wider tracking (+2%) creates an authoritative, "tech-brochure" aesthetic. Tailwind / utility: `font-headline`.
- **Body & Labels (Inter):** Reserved for technical data and long-form wiki content. Inters tall x-height ensures readability against the dark `background`. Default body uses `font-sans`.
- **Code Blocks:** Must use a monospaced font (JetBrains Mono) nested in `surface-container-highest` to differentiate logic from documentation. Utility: `font-mono` / Infima monospace variables.
## 4. Elevation & Depth
We abandon the traditional drop-shadow. Depth is achieved via **Tonal Layering**.
- **The Layering Principle:** To lift a card, place a `surface-container-lowest` card inside a `surface-container-low` section. The "inverse lift" creates a sophisticated, recessed look.
- **Ambient Glows:** For "floating" primary elements, use a shadow with the color `primary` at 10% opacity, a blur of `32px`, and a spread of `-4px`. This mimics the glow of a physical LED.
- **The Ghost Border Fallback:** If a border is required for accessibility, use the `outline-variant` token at **15% opacity**. This creates a "suggestion" of a line that disappears into the background.
## 5. Component Architecture
### Buttons: The Kinetic Core
- **Primary:** Gradient fill (`primary` to `primary-container`), `on-primary` text. Add a 2px outer glow of `primary` on hover.
- **Secondary (Outlined):** No fill. A "Ghost Border" of `outline-variant` at 40%. On hover, the border opacity jumps to 100%.
- **Tertiary:** Pure text in `secondary`. Used for low-priority actions in the Sidebar.
### Navigation: Structural Fixed Points
- **Top Bar (Global):** Height: 72px. Background: `surface` (80% opacity) with `backdrop-blur`. No bottom border; use a subtle transition to `surface-container-low` for the content area.
- **Wiki Sidebar (Contextual):** Sticky position. Uses `surface-container-low`. Active links use a left-aligned 4px vertical pill in `primary` and high-contrast `on-surface` text.
### Cards & Information Architecture
- **Rule:** Forbid divider lines within cards.
- **Implementation:** Use 24px vertical padding (from the spacing scale) to separate the header from the body. Use `surface-variant` for metadata badges (e.g., "v1.2.0") to provide a "recessed" look.
### Code Blocks & Documentation
- **Container:** `surface-container-highest` with a `md` (0.75rem) corner radius.
- **Syntax Highlighting:** Use `tertiary` (#64D0FF) for functions, `secondary` (#1CEDE1) for strings, and `error_dim` (#D7383B) for keywords.
## 6. Dos and Donts
### Do:
- **Do** use `primary_fixed_dim` for icons to ensure they don't overpower the text.
- **Do** allow for generous "negative space." High-end editorial design requires breathing room to feel premium.
- **Do** use `surface_bright` as a very subtle "top-light" gradient on large containers to simulate overhead lighting.
### Dont:
- **Dont** use pure white (#FFFFFF) for text. Always use `on_surface` (#C0FCF6) to reduce eye strain in dark mode.
- **Dont** use 1px solid borders to separate sidebar items; use vertical spacing or a subtle background hover state.
- **Dont** use standard "drop shadows" (Black/Grey). Always tint your shadows with the background or accent color to maintain tonal harmony.
## 7. Token map (implementation)
Semantic colors are defined as Tailwind v4 `@theme` variables in `wiki/src/css/custom.css` (e.g. `--color-primary`, `--color-on-surface`, `--color-surface-container-low`). Prefer those utilities in React pages (`bg-background`, `text-on-surface`, `border-outline-variant/15`) so the site stays aligned with this spec.

View File

@@ -0,0 +1,55 @@
---
id: monorepo-target-layout
title: Monorepo target layout and migration phases
sidebar_label: Monorepo target layout
description: Planned top-level structure and phased migration without a single big-bang refactor.
---
# Monorepo target layout and migration phases
The repository **stays one Git repo**. The goal is **clear boundaries** between framework, mods, plugins, templates, docs, and tooling so users, modders, and contributors can navigate predictably.
## Target topology (directional)
| Top-level | Purpose |
|-----------|---------|
| `framework/` | Core MelonLoader framework (`framework/FrikaMF.csproj`, `framework/FrikaMF/`, entry `Main.cs`) |
| `mods/` | Gameplay mods (`FMF.Mod.*`, `FMF.*.dll` style) |
| `plugins/` | FFM plugins (`FFM.Plugin.*`) |
| `Templates/` | Scaffolds for new mods/plugins |
| `wiki/` | Docusaurus site (product docs; route base `/wiki`) |
| `tools/` | Repo maintenance: hook catalog generator, codegen stubs |
| `scripts/` | Release automation (existing) |
**Binaries**: prefer **GitHub Releases** (and pre-releases for beta) over committing DLLs. See [Release channels](../reference/release-channels.md).
## Phased migration (no big-bang)
```mermaid
flowchart LR
p1[Phase1_DocsAndTools]
p2[Phase2_MoveModsPlugins]
p3[Phase3_FrameworkExtract]
p4[Phase4_CIRedirects]
p1 --> p2 --> p3 --> p4
```
| Phase | Scope | Exit criteria |
|-------|--------|---------------|
| **1** | Docs, `tools/`, naming wiki, hook catalog script | Docusaurus build green; script generates catalog |
| **2** | `git mv` former `ModsAndPlugins/``mods/` / `plugins/` | Done — `.csproj` relative paths unchanged (depth preserved); CI/docs updated |
| **3** | Framework sources under `framework/` | Done — `FrikaMF.sln` points at `framework\framework/FrikaMF.csproj`; plugins reference `..\..\framework\framework/FrikaMF.csproj` |
| **4** | CI matrix: docs + dotnet; `plugin-client-redirects` for old URLs | PR checks match local workflow |
## Path updates checklist (Phase 2 applied)
- [x] `FrikaMF.sln` project paths (`plugins\FFM.Plugin.*`)
- [x] `.github/workflows` (CodeQL, release assets, Discord feed)
- [x] Contributor docs and mod/plugin wiki pages (`Project Path` lines)
- [ ] [`wiki/docusaurus.config.js`](https://github.com/mleem97/gregFramework/blob/master/wiki/docusaurus.config.js) redirects (only if public URLs must map old paths)
- [ ] Historical wiki-import pages may still mention `StandaloneMods/` — update when editing those files
## Related
- [Repo inventory](./repo-inventory.md)
- [FMF hook naming](../reference/fmf-hook-naming.md)

View File

@@ -0,0 +1,31 @@
---
id: plugin-submission-audit
title: Plugin Submission & Security Audit Workflow
slug: /contributors/plugin-submission-audit
---
## Goal
Provide a repeatable workflow where community authors submit plugins through a Git repository URL, then pass an automated security/quality audit before publication in the wiki and release channels.
## Submission Model
1. Author opens a **Plugin Submission** issue.
2. Author provides a public Git repository URL (`https://...git`).
3. Maintainer triggers the security-audit workflow.
## Automated Audit Steps
- Clone submitted repository in CI.
- Run static scan for suspicious calls and execution vectors.
- Run secret and credential pattern checks.
- Produce an auditable report artifact.
## Release Gate Policy
- If audit result is **fail**, publication is blocked.
- If audit result is **pass**, maintainers can mark module as `releaseReady` and publish wiki/release visibility.
## Multiplayer Clarification
Steamworks multiplayer remains a planned direction but is currently blocked by missing Steamworks implementation on the game developer side.

View File

@@ -0,0 +1,76 @@
---
id: repo-inventory
title: Repository inventory
sidebar_label: Repo inventory
description: Current monorepo layout, projects, and known solution drift (contributors).
---
# Repository inventory
This page is the **source of truth snapshot** for how the DataCenterExporter / gregFramework monorepo is organized today. Use it before large refactors or when onboarding.
## Top-level areas
| Area | Path | Role |
|------|------|------|
| Framework core | [`framework/FrikaMF.csproj`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF.csproj) | MelonLoader mod hosting runtime hooks, Harmony, bridge, events |
| Target layout / registry | [`FrikaModFramework/`](https://github.com/mleem97/gregFramework/tree/master/FrikaModFramework) | `fmf_hooks.json`, bindings stubs, migration docs |
| Workshop tooling | [`workshopuploader/`](https://github.com/mleem97/gregFramework/tree/master/workshopuploader) (rename from `WorkshopUploader/`; see `WorkshopUploader/MIGRATION_PUBLIC_REPO.md`) | Steam Workshop / workspace uploader — **.NET MAUI** (Windows) |
| MCP (LLM / IDE) | [`mcp-server/`](https://github.com/mleem97/gregFramework/tree/master/mcp-server) | Model Context Protocol over docs + `fmf_hooks.json`; Docker: `docker compose up docs-mcp` |
| Mods (sources) | [`mods/`](https://github.com/mleem97/gregFramework/tree/master/mods) | Gameplay mods (`FMF.*`, `FMF.Mod.*` folders) |
| Plugins (sources) | [`plugins/`](https://github.com/mleem97/gregFramework/tree/master/plugins) | Framework plugins (`FFM.Plugin.*`) |
| Templates | [`Templates/`](https://github.com/mleem97/gregFramework/tree/master/Templates) | Scaffolds for new mods/plugins |
| Documentation content | [`docs/`](https://github.com/mleem97/gregFramework/tree/master/docs) | Markdown/MDX sources for the wiki |
| Documentation site (Docusaurus) | [`wiki/`](https://github.com/mleem97/gregFramework/tree/master/wiki) | App shell, theme, `npm run build` |
| Scripts | [`scripts/`](https://github.com/mleem97/gregFramework/tree/master/scripts) | Release metadata, changelog (e.g. `Update-ReleaseMetadata.ps1`) |
| Wiki import (legacy) | [`docs/wiki-import/`](./../wiki-import/Home.md) | Imported `.wiki` content; still linked from many pages |
## .NET projects on disk (`*.csproj`)
| Project | Location | In `FrikaMF.sln`? |
|---------|----------|-------------------|
| FrikaMF | `framework/FrikaMF.csproj` | Yes |
| WorkshopUploader | `workshopuploader/WorkshopUploader.csproj` (after folder rename) | No — use `WorkshopUploader.sln` in that folder |
| FFM.Plugin.* (x5) | `plugins/FFM.Plugin.*/` | Yes — paths in [`FrikaMF.sln`](https://github.com/mleem97/gregFramework/blob/master/FrikaMF.sln) use `plugins\...` |
| FMF.HexLabelMod | `mods/FMF.Mod.HexLabelMod/` | No (build standalone or add to solution) |
| FMF.ConsoleInputGuard | `mods/FMF.ConsoleInputGuard/` | No |
| FMF.GregifyEmployees | `mods/FMF.Mod.GregifyEmployees/` | No |
| FMF.JoniMLCompatMod | `mods/FMF.Plugin.LangCompatBridge/` | No |
| Templates | `Templates/FMF.*`, `Templates/StandaloneModTemplate/` | No |
## Build status (framework project)
- `framework/FrikaMF.csproj` explicitly **excludes** `workshopuploader/**` from compile (that app builds only via `workshopuploader/WorkshopUploader.csproj` / `WorkshopUploader.sln` in that folder).
- `dotnet build FrikaMF.sln` builds framework and plugin projects under `plugins\`**not** the MAUI Workshop app (MelonLoader/game refs still required locally unless `CI=true`).
## `FrikaMF.sln` drift (action items)
1. **Mods not in solution**: Standalone mod projects under `mods/` are intentionally omitted from the solution to keep the graph small; add them if you want `dotnet build` for every module in one shot.
2. **Templates in `framework/FrikaMF.csproj`**: Template sources under `Templates/` may fail `dotnet build framework/FrikaMF.csproj` with `CS0122` if `Core` visibility does not match template expectations — treat templates as **samples** until the project graph is cleaned up.
## Documentation (Docusaurus)
- **Entry**: `/wiki` → [`intro`](../intro.md)
- **Sidebar**: [`sidebars.js`](https://github.com/mleem97/gregFramework/blob/master/wiki/sidebars.js)
- **Module catalog** (downloads table): [`wiki/src/data/moduleCatalog.ts`](https://github.com/mleem97/gregFramework/blob/master/wiki/src/data/moduleCatalog.ts)
- **Landing**: `/` → [`src/pages/index.tsx`](https://github.com/mleem97/gregFramework/blob/master/wiki/src/pages/index.tsx)
- **Static catalog page**: `/mods`
## Hook / event sources of truth (code)
- String constants: [`framework/FrikaMF/HookNames.cs`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/HookNames.cs) (`FFM.*` hook IDs today).
- Numeric IDs: [`framework/FrikaMF/EventIds.cs`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/EventIds.cs).
- Generated wiki mirror: run [`tools/Generate-FmfHookCatalog.ps1`](https://github.com/mleem97/gregFramework/blob/master/tools/Generate-FmfHookCatalog.ps1) → [`fmf-hooks-catalog`](../reference/fmf-hooks-catalog.md).
## Debugging (MelonLoader, IL2CPP, Unity)
- **Build first:** `dotnet build FrikaMF.sln -c Debug` (requires MelonLoader + IL2CPP interop under `MelonLoader/` for your game install, or `lib/references/MelonLoader` — see `tools/refresh_refs.py`).
- **Attach:** Run **Data Center** with MelonLoader, then attach your IDEs **.NET / CoreCLR** debugger to the game process (process name usually matches the game executable). Breakpoints hit in **Debug** builds of mods/plugins copied into `Mods/`.
- **`FFM.Plugin.AssetExporter`:** The project links `framework/Main.cs` (and related files) **and** references `FrikaMF.csproj`, which would normally produce **CS0436** duplicate-type warnings. Those are **suppressed** in the plugin `.csproj` (`NoWarn`); do not remove the project reference without linking the rest of the `FrikaMF` sources.
## Related
- [Monorepo target layout](./monorepo-target-layout.md) — phased folder goals
- [FMF hook naming](../reference/fmf-hook-naming.md) — naming convention
- [Release channels](../reference/release-channels.md) — Steam vs GitHub beta

View File

@@ -0,0 +1,65 @@
# Sponsorship Automation
This document describes the standard automation flow for GregFramework sponsorship tiers.
## Goal
Keep sponsor tier data synchronized and use it as a source of truth for:
- Discord role sync
- private/VIP channel access
- website and wiki placements
- Mod Store footer sponsor block
- in-repo sponsor pages and credits
## Repository Workflow
Each repository contains `.github/workflows/sponsor-tier-sync.yml`.
The workflow:
1. runs hourly (and on manual trigger),
2. queries active GitHub Sponsors,
3. exports normalized data to `sponsors/sponsors.json`,
4. commits changes automatically when sponsor data changes.
## Required Secret
Add this repository secret:
- `SPONSORS_READ_TOKEN`: GitHub PAT with access to read sponsor relationships.
Without this secret, the workflow still completes but exports an empty snapshot.
## Tier Mapping
Use this mapping in downstream systems:
- `$1` -> `coffee_supporter`
- `$5` -> `bronze_backer`
- `$15` -> `silver_tester`
- `$25` -> `gold_developer`
- `$50+` -> `ecosystem_architect`
## VIP Operational Rules
For `$50+` sponsors:
- assign top sponsor placement (Wiki front page + Mod Store footer)
- create/maintain private 1-on-1 Discord lounge
- offer featured mod spotlight
## Example Consumer Script (Discord/Wiki Sync)
Use `sponsors/sponsors.json` as input and run a separate scheduled job (bot or CI worker) that:
1. maps each sponsor to a tier role,
2. grants/revokes Discord roles,
3. maintains VIP private channels,
4. updates website/wiki data endpoints.
## First Verified VIP
Current VIP sponsor:
- [@tobiasreichel](https://github.com/tobiasreichel) `ecosystem_architect` (`$50/month`)

25
devserver-betas.md Normal file
View File

@@ -0,0 +1,25 @@
# DevServer API — beta channels (`gregframework.eu`)
This document defines the **intended** client contract for the FrikaMF **WorkshopUploader** “Betas” panel. The server may be implemented separately; keep URLs and tokens configurable.
## Base URL
- Default: `https://gregframework.eu`
- Override: user settings file next to the app (not committed to git).
## Endpoints (proposed)
| Method | Path | Purpose |
|--------|------|---------|
| `GET` | `/api/v1/betas` | List available beta channels (id, name, description). |
| `POST` | `/api/v1/betas/{id}/subscribe` | Enroll the current user (body: Steam ID or bearer token from OAuth). |
| `POST` | `/api/v1/betas/{id}/unsubscribe` | Leave a channel. |
## Authentication
- **Preferred:** Short-lived JWT after browser OAuth to `gregframework.eu`, stored in user settings.
- **Alternative:** Steam ID from Steamworks session in the WorkshopUploader process, plus server-side verification.
## Rate limiting and errors
Clients should show HTTP status and response body on failure; retry with backoff.

98
fmf-hooks.mdx Normal file
View File

@@ -0,0 +1,98 @@
---
id: fmf-hooks
title: FMF Hook Reference
sidebar_label: FMF Hook Reference
description: Auto-generated from FrikaModFramework/fmf_hooks.json — run tools/fmf-hook-scanner.
---
:::info
This page is generated by `tools/fmf-hook-scanner`. Do not edit by hand.
:::
# FMF Hook Reference
## EMPLOYEE
### FMF.EMPLOYEE.Hired
**Description:** An employee was hired into the roster.
**Payload:**
- `employeeId` (string)
- `role` (string)
**Example (C#)**
```csharp
FmfApi.On("FMF.EMPLOYEE.Hired", payload => { });
```
## GAMEPLAY
### FMF.GAMEPLAY.JobCompleted
**Description:** Emitted when a job has been fully processed.
**Payload:**
- `jobId` (string)
- `durationSeconds` (number)
- `revenue` (number)
**Example (C#)**
```csharp
FmfApi.On("FMF.GAMEPLAY.JobCompleted", payload => { });
```
## PLAYER
### FMF.PLAYER.LevelUp
**Description:** Player progression level increased.
**Payload:**
- `newLevel` (number)
- `previousLevel` (number)
**Example (C#)**
```csharp
FmfApi.On("FMF.PLAYER.LevelUp", payload => { });
```
## RACK
### FMF.RACK.PowerLimitExceeded
**Description:** Power draw or allocation for a rack exceeded configured limits.
**Payload:**
- `rackId` (string)
- `watts` (number)
**Example (C#)**
```csharp
FmfApi.On("FMF.RACK.PowerLimitExceeded", payload => { });
```
## SERVER
### FMF.SERVER.RackOverheated
**Description:** Server rack exceeded a critical temperature threshold.
**Payload:**
- `rackId` (string)
- `temperature` (number)
**Example (C#)**
```csharp
FmfApi.On("FMF.SERVER.RackOverheated", payload => { });
```

43
getting-started.md Normal file
View File

@@ -0,0 +1,43 @@
---
title: Monorepo — Getting started
sidebar_label: Monorepo getting started
description: Target layout (FrikaModFramework, templates, tools) and how it maps to this repo today.
---
# Monorepo — Getting started
The **goal** is a clear split between the framework (`FrikaModFramework/` registry + planned bindings), the **live** MelonLoader code (`framework/`), gameplay mods (`mods/`), FFM plugins (`plugins/`), templates (`templates/` / `Templates/`), and tooling (`tools/`). Migration is incremental: production C# still lives under [`framework/`](https://github.com/mleem97/gregFramework/tree/master/framework).
## Clone and build the framework
```text
dotnet build framework/FrikaMF.csproj
```
Or open [`FrikaMF.sln`](https://github.com/mleem97/gregFramework/blob/master/FrikaMF.sln) in Visual Studio / Rider.
## Hook naming
- **Target convention:** `FMF.<DOMAIN>.<Event>` (see [`CONTRIBUTING.md`](https://github.com/mleem97/gregFramework/blob/master/CONTRIBUTING.md)).
- **Registry:** [`FrikaModFramework/fmf_hooks.json`](https://github.com/mleem97/gregFramework/blob/master/FrikaModFramework/fmf_hooks.json).
- **Legacy runtime strings** may still use `FFM.*` in [`HookNames`](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/HookNames.cs) until migrated.
## Create a mod from the template
1. Copy [`templates/mod/`](https://github.com/mleem97/gregFramework/tree/master/templates/mod) to a new folder (or start from [`Templates/`](https://github.com/mleem97/gregFramework/tree/master/Templates) scaffolds).
2. Edit `fmf/hooks.json` and add sources under `src/`.
3. For a **pilot** layout (Workshop VDF + hooks metadata), see [`HexMod/`](https://github.com/mleem97/gregFramework/tree/master/HexMod); shipped mod examples live under [`mods/`](https://github.com/mleem97/gregFramework/tree/master/mods) (e.g. `mods/FMF.Mod.HexLabelMod/`).
## Documentation site
- **Content:** [`docs/`](https://github.com/mleem97/gregFramework/tree/master/docs)
- **Docusaurus app:** [`wiki/`](https://github.com/mleem97/gregFramework/tree/master/wiki) — `npm install` and `npm run start` (dev) or `npm run build` (static output).
### Docker
- **Dev server with hot reload:** `docker compose up docs` (port **3000**, mounts `./wiki` and `./docs`).
- **Static wiki + MCP in one container:** `docker compose up docs-mcp` — see [`reference/mcp-server`](../../reference/mcp-server.md).
## Assistants / MCP
The repo includes [`mcp-server/`](https://github.com/mleem97/gregFramework/tree/master/mcp-server) for Model Context Protocol (search docs, read `fmf_hooks.json`, CONTRIBUTING). Use **stdio** locally or the **HTTP** endpoint bundled with the `docs-mcp` Docker image — details in [`docs/reference/mcp-server.md`](https://github.com/mleem97/gregFramework/blob/master/docs/reference/mcp-server.md).

View File

@@ -0,0 +1,136 @@
---
id: contributor-workshop
title: Contributor Guide — WorkshopManager
sidebar_label: Contributor Guide
description: Development setup, building, publishing workflow, and release process for the WorkshopManager.
sidebar_position: 20
tags:
- audience:contributor
- workshop
---
# Contributor Guide — WorkshopManager
This guide covers the development workflow for the WorkshopManager and how to publish mods to the Steam Workshop.
## Prerequisites
- **Visual Studio 2022** with **.NET Multi-platform App UI** and **Windows App SDK** workloads.
- **.NET 9 SDK** (for the WorkshopManager MAUI app).
- **.NET 6 SDK** (for framework, plugins, and mods targeting MelonLoader).
- **Steam** with Data Center installed (App ID 4170200).
## Repository structure
| Path | Purpose |
|------|---------|
| `framework/FrikaMF.csproj` | Core MelonLoader framework DLL |
| `plugins/FFM.Plugin.*/` | FMF extension plugins (5 projects) |
| `mods/FMF.*/` | Standalone mods (4 projects) |
| `WorkshopUploader/` | WorkshopManager MAUI app |
| `scripts/Deploy-Release-ToWorkshop.ps1` | Package all builds into Workshop folders |
| `scripts/Deploy-Release-ToDataCenter.ps1` | Deploy to game for local testing |
## Building
### Build everything (solution)
```bash
dotnet build FrikaMF.sln -c Release
```
### Build standalone mods (not in solution)
```bash
dotnet build mods/FMF.ConsoleInputGuard/FMF.ConsoleInputGuard.csproj -c Release
dotnet build mods/FMF.Mod.GregifyEmployees/FMF.GregifyEmployees.csproj -c Release
dotnet build mods/FMF.Mod.HexLabelMod/FMF.HexLabelMod.csproj -c Release
dotnet build mods/FMF.Plugin.LangCompatBridge/FMF.JoniMLCompatMod.csproj -c Release
```
### Build WorkshopManager only
```bash
dotnet build WorkshopUploader/WorkshopUploader.csproj -c Release
```
## Workshop project structure
Each mod/plugin gets its own folder under `<GameRoot>/workshop/`:
```text
<GameRoot>/workshop/
├── FrikaModFramework/
│ ├── content/
│ │ └── Mods/
│ │ └── FrikaModdingFramework.dll
│ ├── metadata.json
│ └── preview.png
├── FFM.Plugin.Multiplayer/
│ ├── content/
│ │ └── FMF/
│ │ └── Plugins/
│ │ └── FFM.Plugin.Multiplayer.dll
│ ├── metadata.json
│ └── preview.png
└── ...
```
The `content/` folder mirrors the game directory structure and is what Steam uploads.
## Deploy to Workshop folders
```bash
pwsh -File scripts/Deploy-Release-ToWorkshop.ps1
```
This script:
1. Builds all framework, plugin, and mod projects.
2. Creates a Workshop project folder for each under `<GameRoot>/workshop/`.
3. Copies the built DLL into `content/<target path>/`.
4. Creates `metadata.json` with title, description, tags, and visibility.
## Publishing workflow
### GUI (recommended)
1. Run the WorkshopManager app.
2. Open a project from the **Projects** tab.
3. Edit title, description, tags, visibility, and preview image.
4. Write **change notes** describing what changed.
5. Click **Save and upload to Steam**.
6. After upload, the app **syncs** your local `content/` with Steam's version.
### CLI (headless)
```bash
WorkshopUploader.exe --mode publish --path <project-folder>
```
### Post-upload sync
After publishing, the app re-downloads the item from Steam and replaces your local `content/` folder. This ensures your working copy matches exactly what Steam has — similar to `git pull` after `git push`.
## Extending the service layer
The `SteamWorkshopService` in `WorkshopUploader/Services/SteamWorkshopService.cs` wraps the Facepunch.Steamworks 2.3.3 API. Key methods:
| Method | Purpose |
|--------|---------|
| `PublishAsync` | Create or update a Workshop item with change notes |
| `SyncAfterPublishAsync` | Re-download from Steam to sync local content |
| `BrowseAsync` | Browse all Workshop items with sort/tag filters |
| `SearchAsync` | Text search across Workshop items |
| `ListSubscribedAsync` | List user's subscribed items |
| `ListFavoritedAsync` | List user's favorited items |
| `SubscribeAsync` / `UnsubscribeAsync` | Toggle subscription |
| `AddFavoriteAsync` / `RemoveFavoriteAsync` | Toggle favorite |
| `VoteAsync` | Vote up or down |
| `GetItemDetailsAsync` | Full item details with stats |
## Adding a new mod to the release
1. Create the mod project under `mods/`.
2. Add it to the `$mods` array in `Deploy-Release-ToWorkshop.ps1`.
3. Run the deploy script.
4. Open the new workshop project in the WorkshopManager and publish.

134
guides/enduser-workshop.md Normal file
View File

@@ -0,0 +1,134 @@
---
id: enduser-workshop
title: End-User Guide — WorkshopManager
sidebar_label: End-User Guide
description: How to browse, install, and manage Data Center mods using the WorkshopManager.
sidebar_position: 10
tags:
- audience:enduser
- workshop
---
# End-User Guide — WorkshopManager
This guide is for players who want to **install and manage mods** for Data Center using the WorkshopManager desktop app.
## What you need
- **Data Center** installed via Steam.
- **Steam** running and logged in.
- **WorkshopManager** (`WorkshopUploader.exe`) — either built from source or provided as a release.
## Installation
You can run WorkshopManager from **any folder you prefer** (for example `Program Files`, Desktop, Downloads, or `<Data Center install>/WorkshopUploader/`).
### Option A — Installer setup (recommended)
1. Run the latest `GregToolsModmanager-<version>-Setup.exe`.
2. Complete the installer wizard (default path is under `Program Files`).
3. Start the app from the Start Menu or desktop shortcut.
### Option B — Portable / ZIP build
1. Download or build the WorkshopManager files.
2. Extract/copy the folder to any location you want.
3. Launch `WorkshopUploader.exe` directly from that folder.
After startup, the Steam status indicator in the top-right should turn green.
## Browsing mods (Mod Store)
1. Open the **Mod Store** tab.
2. Use the **Store** sub-tab to browse all available mods.
3. Filter by tag (vanilla, modded, melonloader, fmf, framework) or sort by popularity, date, score, etc.
4. Use the **Search** bar to find specific mods by name.
5. Click on any mod to see its **detail page** with full stats, description, and action buttons.
## Installing mods (Subscribe)
1. In the Store or on an item's detail page, click **Subscribe**.
2. Steam downloads the mod automatically.
3. Check the **Installed** sub-tab to see all your subscribed mods.
Subscribed mods are managed by Steam — they update automatically when the author publishes changes.
## Favorites
1. On an item's detail page, click **Favorite** to bookmark it.
2. View all your favorites in the **Favorites** sub-tab.
3. Click **Unfavorite** to remove.
## Voting
On an item's detail page:
- Click **Vote Up** to recommend the mod.
- Click **Vote Down** if there's a quality issue.
Your votes help the community find the best mods.
## Dependency Health (Health tab)
The **Health** sub-tab checks whether your game has:
- MelonLoader installed
- Il2Cpp interop assemblies generated
- FrikaModFramework core DLL
- FMF plugins directory
- Mod config directory
If anything is missing, follow the instructions shown.
### Installing MelonLoader
1. Go to the Health tab and click **Download page**.
2. Download the latest **MelonLoader Installer** from GitHub.
3. Run the installer, select **Data Center** as the game, choose **IL2CPP**.
4. Start the game once and close it (this generates required assemblies).
## Troubleshooting
### "Steam - offline" in the title bar
- Make sure Steam is running and you are logged in.
- Ensure `steam_appid.txt` (containing `4170200`) exists next to `WorkshopUploader.exe`.
- If you use the portable/ZIP variant, make sure you copied the full app folder (not just the `.exe`).
### Mod does not load in-game
- Check `MelonLoader/Latest.log` in the game directory.
- Ensure `FrikaModdingFramework.dll` is in `<game>/Mods/`.
- Verify the mod DLL is also in `<game>/Mods/` or `<game>/FMF/Plugins/`.
### Subscription does not appear
- Wait a few seconds and refresh the Installed list.
- Steam may need a moment to process the subscription.
### App crashes only after installer install
- Reinstall using the latest setup build.
- Open **Settings -> Logs** and include the newest log lines when reporting the issue.
- If available, report crash details via GitHub Issues.
## Reporting bugs and issues
If you find a bug, crash, or unexpected behavior, please open an issue on GitHub:
- [Report an issue](https://github.com/mleem97/GregToolsModmanager/issues)
To help us fix issues faster, include:
- What you were doing when the problem happened
- Clear steps to reproduce
- Your app version and Windows version
- Error message or screenshot (if any)
- Relevant logs from **Settings -> Logs**
- A repro ZIP from **Settings -> Create repro bundle**
## Uninstalling mods
1. Go to the **Installed** sub-tab.
2. Click **Unsubscribe** on the mod you want to remove.
3. Steam removes the mod files automatically.

118
guides/release.md Normal file
View File

@@ -0,0 +1,118 @@
---
id: release
title: Release
sidebar_label: Release
description: Current release artifacts, version matrix, and download instructions for FrikaModFramework.
sidebar_position: 30
tags:
- release
---
# Release
## Release artifacts
The following components are built and packaged for Steam Workshop distribution:
### Core Framework
| Component | Assembly | Workshop content path | Tags |
|-----------|----------|----------------------|------|
| FrikaModFramework | `FrikaModdingFramework.dll` | `content/Mods/` | modded, melonloader, framework, fmf |
### FMF Plugins
| Plugin | Assembly | Workshop content path | Tags |
|--------|----------|----------------------|------|
| FFM.Plugin.Multiplayer | `FFM.Plugin.Multiplayer.dll` | `content/FMF/Plugins/` | modded, fmf, plugin |
| FFM.Plugin.Sysadmin | `FFM.Plugin.Sysadmin.dll` | `content/FMF/Plugins/` | modded, fmf, plugin |
| FFM.Plugin.AssetExporter | `FFM.Plugin.AssetExporter.dll` | `content/FMF/Plugins/` | modded, fmf, plugin |
| FFM.Plugin.WebUIBridge | `FFM.Plugin.WebUIBridge.dll` | `content/FMF/Plugins/` | modded, fmf, plugin |
| FFM.Plugin.PlayerModels | `FFM.Plugin.PlayerModels.dll` | `content/FMF/Plugins/` | modded, fmf, plugin |
### Gameplay Mods
| Mod | Assembly | Workshop content path | Tags |
|-----|----------|----------------------|------|
| FMF.ConsoleInputGuard | `FMF.ConsoleInputGuard.dll` | `content/Mods/` | modded, melonloader, mod |
| FMF.GregifyEmployees | `FMF.GregifyEmployees.dll` | `content/Mods/` | modded, melonloader, mod |
| FMF.HexLabelMod | `FMF.HexLabelMod.dll` | `content/Mods/` | modded, melonloader, mod |
| FMF.JoniMLCompatMod | `FMF.JoniMLCompatMod.dll` | `content/Mods/` | modded, melonloader, mod |
### Gregtools Modmanager (WorkshopManager)
| Version | Component | Target | Description |
|---------|-----------|--------|-------------|
| **1.0** | Gregtools Modmanager | `net9.0-windows` (win10-x64), self-contained | Steam Workshop client + Mod Store + Mod Manager. No .NET runtime required. See [GregTools 1.0 Modmanager release](/wiki/releases/tools/gregtools-modmanager-1.0-release). |
## Installation for end users
### Quick start
1. Install **MelonLoader** (IL2CPP) for Data Center.
2. Start the game once, then close it.
3. Subscribe to mods via the **WorkshopManager** Mod Store or the [Steam Workshop](https://steamcommunity.com/app/4170200/workshop/).
4. Start the game.
### Manual installation
1. Download the DLL from the Workshop or a release.
2. Framework: place `FrikaModdingFramework.dll` in `<Data Center>/Mods/`.
3. Plugins: place `FFM.Plugin.*.dll` in `<Data Center>/FMF/Plugins/`.
4. Mods: place `FMF.*.dll` in `<Data Center>/Mods/`.
5. Start the game and check `MelonLoader/Latest.log`.
## Game directory structure
```text
Data Center/
├── Mods/
│ ├── FrikaModdingFramework.dll
│ ├── FMF.ConsoleInputGuard.dll
│ ├── FMF.GregifyEmployees.dll
│ ├── FMF.HexLabelMod.dll
│ └── FMF.JoniMLCompatMod.dll
├── FMF/
│ └── Plugins/
│ ├── FFM.Plugin.Multiplayer.dll
│ ├── FFM.Plugin.Sysadmin.dll
│ ├── FFM.Plugin.AssetExporter.dll
│ ├── FFM.Plugin.WebUIBridge.dll
│ └── FFM.Plugin.PlayerModels.dll
├── MelonLoader/
│ └── Latest.log
├── UserData/
│ └── ModCfg/
└── workshop/
├── FrikaModFramework/
│ ├── content/Mods/FrikaModdingFramework.dll
│ └── metadata.json
├── FFM.Plugin.Multiplayer/
│ ├── content/FMF/Plugins/FFM.Plugin.Multiplayer.dll
│ └── metadata.json
├── Gregtools Modmanager/
│ ├── content/ (self-contained WorkshopUploader.exe + dependencies)
│ └── metadata.json
└── ... (one folder per component)
```
## Build and deploy (contributors)
```bash
# Build everything and package into Workshop folders
pwsh -File scripts/Deploy-Release-ToWorkshop.ps1
# Deploy to game Mods/ and FMF/Plugins/ for local testing
pwsh -File scripts/Deploy-Release-ToDataCenter.ps1
```
See also: [Contributor Guide](./contributor-workshop)
## Compatibility
| Component | Requires |
|-----------|----------|
| All mods/plugins | Data Center (Steam App 4170200) |
| All mods/plugins | MelonLoader (IL2CPP, stable) |
| FMF Plugins | FrikaModdingFramework.dll in Mods/ |
| Gregtools Modmanager | Windows 10 1809+ (self-contained, no runtime install needed) |

30
hexmod.md Normal file
View File

@@ -0,0 +1,30 @@
---
title: HexMod
sidebar_label: HexMod
description: Hex label mod — in-world hex color labels for cable spinners and racks.
---
# HexMod
The **Hex Label** mod adds in-world hex color labels for cable spinners and racks.
## Steamworks Info
| Field | Value |
|-------|-------|
| **Assembly** | `FMF.HexLabelMod.dll` |
| **Version** | `00.01.0009` |
| **Author** | mleem97 |
| **Game** | Waseku — Data Center (App 4170200) |
| **Workshop Tags** | `modded`, `melonloader`, `mod` |
## Downloads
- **Steam Workshop:** Subscribe via the Gregtools Modmanager or the [Steam Workshop](https://steamcommunity.com/app/4170200/workshop/)
- **Manual:** Drop `FMF.HexLabelMod.dll` into `<Data Center>/Mods/`
## Source & layout
- **Build sources:** [`mods/FMF.Mod.HexLabelMod`](https://github.com/mleem97/gregFramework/tree/master/mods/FMF.Mod.HexLabelMod)
See also the detailed wiki article [`mods/mods/fmf-hex-label-mod`](/wiki/mods/mods/fmf-hex-label-mod).

41
intro.md Normal file
View File

@@ -0,0 +1,41 @@
---
id: intro
title: FrikaMF Docs Start
slug: /docs
---
This documentation matches the **current monorepo**: MelonLoader framework under `framework/`, gameplay mods under `mods/`, FFM plugins under `plugins/`, Docusaurus content in `docs/`, and the wiki app in `wiki/`. It is written for **players**, **mod developers**, **contributors**, and **sponsors** — pick a lane below.
## Für wen? — Who is this for?
| Audience | Start here |
|----------|------------|
| **Spieler** — install, play, troubleshoot | [End users (hub)](./topics/end-user/overview.md) · [End user wiki (import)](./wiki-import/EndUser/) |
| **Moddevs** — build mods, hooks, debugging | [Mod developers (hub)](./topics/mod-developers/overview.md) · [ModDevs wiki (import)](./wiki-import/ModDevs/) · [Framework](./mods/framework.md) |
| **Contributor** — PRs, docs, plugins, CI | [Contributors (workflow)](./topics/contributors/overview.md) · [Contributors wiki (import)](./wiki-import/Contributors/) |
| **Sponsorinnen & Sponsoren** — support & transparency | [Sponsors (hub)](./topics/sponsors/overview.md) · [Sponsors (EN)](./wiki-import/Sponsors.md) · [Sponsoren (DE)](./wiki-import/Sponsoren.md) |
**Experience tracks** (newbies → pros): [By audience](./topics/audiences/overview.md) → [Newbies](./audiences/newbies.md), [Intermediates](./audiences/intermediates.md), [Professionals](./audiences/professionals.md).
## Mods Hub
- Framework entry: [`Framework`](./mods/framework.md)
- Standalone / mod list: [`Standalone Mods`](./mods/standalone/index.md)
## Hooks and releases
- [FMF hook naming](./reference/fmf-hook-naming.md) — `FMF.<Domain>.…` and legacy `FFM.*`
- [FMF hooks catalog](./reference/fmf-hooks-catalog.md) — generated from `framework/FrikaMF/HookNames.cs`
- [Release channels](./reference/release-channels.md) — Steam Workshop vs GitHub (beta)
- [MCP server](./reference/mcp-server.md) — LLM/IDE tools over docs + `fmf_hooks.json` (optional Docker bundle)
## Repository layout (contributors)
- [Repo inventory](./contributors/repo-inventory.md) — projects, solution scope, entry points
- [Monorepo target layout](./contributors/monorepo-target-layout.md) — phased migration goals
## Source model
- **Authoring:** Markdown and MDX live in the repo-root **`docs/`** folder (this tree). See the **[`docs/` layout map](./README.md)** for what lives where (curated topics vs `wiki-import/` vs `wiki/` stubs).
- **Site:** The Docusaurus application is in **`wiki/`**; routes use base **`/wiki`** (see [Docusaurus workflow](./contributors/docusaurus-workflow.md)).
- **Legacy GitHub Wiki:** Mirrored under **`docs/wiki-import/`**; refresh from **`.wiki/`** with `npm run wiki:refresh` in `wiki/`. Details: [Legacy wiki import](./topics/wiki-import/overview.md).

13
meta/IDEA_BACKLOG.md Normal file
View File

@@ -0,0 +1,13 @@
# Idea backlog (Discord and manual)
Add one line per idea. Unchecked items can be turned into GitHub issues with `python tools/auto_issue_creator.py`.
## Pending
- [ ] (example) Add a smoke test for the FFI bridge.
## Process
1. Discord: `!request Your idea` (requires `DISCORD_BOT_TOKEN` and `tools/discord_bridge.py`).
2. Or edit this file manually.
3. Run `python tools/auto_issue_creator.py` to create issues from unchecked lines (requires `gh` CLI and auth).

View File

@@ -0,0 +1,39 @@
# Steam Workshop and tooling
## Live-Sync references
After a *Data Center* update, run the game once so MelonLoader regenerates interop assemblies, then from the repo root:
```bash
python tools/refresh_refs.py
```
Optionally save a baseline for diffs:
```bash
python tools/diff_assembly_metadata.py --save-snapshot
```
After future updates:
```bash
python tools/diff_assembly_metadata.py
```
Do **not** commit `*.dll` from `lib/references/` (see `.gitignore`).
## Steam Workshop (research)
Official upload and item layout for *Data Center* Workshop content may be undocumented by the developer. Until documented:
- Treat Workshop delivery as **game-defined** (often content under game data / `StreamingAssets`; MelonLoader mods remain **DLLs in `Mods/`**).
- The **WorkshopUploader** desktop app (see `WorkshopUploader/`) is the supported path for authors to manage Workshop items and DevServer betas once Steamworks is configured.
## Legal
Do not redistribute game binaries or extracted assets. Workshop packages should contain **your** content only.
## CI / agents
- `FrikaMF.csproj` builds on Windows agents that have either a Steam *Data Center* install **or** a populated `lib/references/MelonLoader/` (from `refresh_refs.py`).
- `WorkshopUploader` targets `net6.0-windows`; build it on Windows (not Linux-hosted runners unless cross-compilation is configured).

25
meta/devserver-betas.md Normal file
View File

@@ -0,0 +1,25 @@
# DevServer API — beta channels (`gregframework.eu`)
This document defines the **intended** client contract for the FrikaMF **WorkshopUploader** “Betas” panel. The server may be implemented separately; keep URLs and tokens configurable.
## Base URL
- Default: `https://gregframework.eu`
- Override: user settings file next to the app (not committed to git).
## Endpoints (proposed)
| Method | Path | Purpose |
|--------|------|---------|
| `GET` | `/api/v1/betas` | List available beta channels (id, name, description). |
| `POST` | `/api/v1/betas/{id}/subscribe` | Enroll the current user (body: Steam ID or bearer token from OAuth). |
| `POST` | `/api/v1/betas/{id}/unsubscribe` | Leave a channel. |
## Authentication
- **Preferred:** Short-lived JWT after browser OAuth to `gregframework.eu`, stored in user settings.
- **Alternative:** Steam ID from Steamworks session in the WorkshopUploader process, plus server-side verification.
## Rate limiting and errors
Clients should show HTTP status and response body on failure; retry with backoff.

58
mod-index.json Normal file
View File

@@ -0,0 +1,58 @@
{
"version": 1,
"description": "Manifest of all mods packaged for Steam Workshop distribution.",
"mods": [
{
"id": "hexmod",
"title": "FMF HexLabel Mod",
"assembly": "FMF.HexLabelMod.dll",
"version": "00.01.0009",
"author": "mleem97",
"workshopTags": ["modded", "melonloader", "mod"],
"workshopContentPath": "content/Mods/",
"workshopUrl": "",
"githubReleaseUrl": "",
"wikiPath": "/wiki/wiki/mods/hexmod",
"sourcePath": "mods/FMF.Mod.HexLabelMod"
},
{
"id": "console-input-guard",
"title": "FMF Console Input Guard",
"assembly": "FMF.ConsoleInputGuard.dll",
"version": "00.01.0001",
"author": "mleem97",
"workshopTags": ["modded", "melonloader", "mod"],
"workshopContentPath": "content/Mods/",
"workshopUrl": "",
"githubReleaseUrl": "",
"wikiPath": "/wiki/mods/mods/fmf-console-input-guard",
"sourcePath": "mods/FMF.ConsoleInputGuard"
},
{
"id": "gregify-employees",
"title": "FMF Gregify Employees",
"assembly": "FMF.GregifyEmployees.dll",
"version": "00.01.0009",
"author": "mleem97",
"workshopTags": ["modded", "melonloader", "mod"],
"workshopContentPath": "content/Mods/",
"workshopUrl": "",
"githubReleaseUrl": "",
"wikiPath": "/wiki/mods/mods/fmf-gregify-employees",
"sourcePath": "mods/FMF.Mod.GregifyEmployees"
},
{
"id": "lang-compat-bridge",
"title": "FMF JoniML Compat Mod",
"assembly": "FMF.JoniMLCompatMod.dll",
"version": "00.01.0009",
"author": "mleem97",
"workshopTags": ["modded", "melonloader", "mod"],
"workshopContentPath": "content/Mods/",
"workshopUrl": "",
"githubReleaseUrl": "",
"wikiPath": "/wiki/mods/mods/fmf-lang-compat-bridge",
"sourcePath": "mods/FMF.Plugin.LangCompatBridge"
}
]
}

View File

@@ -0,0 +1,15 @@
---
title: FFM.Plugin.AssetExporter
sidebar_label: FFM.Plugin.AssetExporter
---
`StandaloneMods/FFM.Plugin.AssetExporter`
## Purpose
Provides export-focused tooling for asset-related workflows.
## Sources
- Module path: `StandaloneMods/FFM.Plugin.AssetExporter`
- Overview: [`Standalone Mods`](/wiki/wiki-import/StandaloneMods)

View File

@@ -0,0 +1,15 @@
---
title: FFM.Plugin.Multiplayer
sidebar_label: FFM.Plugin.Multiplayer
---
`StandaloneMods/FFM.Plugin.Multiplayer`
## Purpose
Contains standalone multiplayer-oriented plugin functionality.
## Sources
- Module path: `StandaloneMods/FFM.Plugin.Multiplayer`
- Roadmap context: [`Steamworks P2P Multiplayer Roadmap`](/wiki/wiki-import/Steamworks-P2P-Multiplayer-Roadmap)

View File

@@ -0,0 +1,15 @@
---
title: FFM.Plugin.PlayerModels
sidebar_label: FFM.Plugin.PlayerModels
---
`StandaloneMods/FFM.Plugin.PlayerModels`
## Purpose
Hosts standalone player-model specific behavior and integration.
## Sources
- Module path: `StandaloneMods/FFM.Plugin.PlayerModels`
- Debug docs: [`Mod Developer Debug`](/wiki/wiki-import/Mod-Developer-Debug)

View File

@@ -0,0 +1,15 @@
---
title: FFM.Plugin.Sysadmin
sidebar_label: FFM.Plugin.Sysadmin
---
`StandaloneMods/FFM.Plugin.Sysadmin`
## Purpose
Contains system-administration oriented standalone plugin features.
## Sources
- Module path: `StandaloneMods/FFM.Plugin.Sysadmin`
- Framework context: [`Framework Features & Use Cases`](/wiki/wiki-import/Framework-Features-Use-Cases)

View File

@@ -0,0 +1,15 @@
---
title: FFM.Plugin.WebUIBridge
sidebar_label: FFM.Plugin.WebUIBridge
---
`StandaloneMods/FFM.Plugin.WebUIBridge`
## Purpose
Focuses on standalone web UI bridge integration flows.
## Sources
- Module path: `StandaloneMods/FFM.Plugin.WebUIBridge`
- Reference: [`Web UI Bridge (DC2WEB)`](/wiki/wiki-import/Web-UI-Bridge)

View File

@@ -0,0 +1,15 @@
---
title: FMF.ConsoleInputGuard
sidebar_label: FMF.ConsoleInputGuard
---
`StandaloneMods/FMF.ConsoleInputGuard`
## Purpose
Provides guardrails around console input handling.
## Sources
- Module path: `StandaloneMods/FMF.ConsoleInputGuard`
- Overview: [`Standalone Mods`](/wiki/wiki-import/StandaloneMods)

View File

@@ -0,0 +1,15 @@
---
title: FMF.GregifyEmployees
sidebar_label: FMF.GregifyEmployees
---
`StandaloneMods/FMF.GregifyEmployees`
## Purpose
Contains standalone custom employee-related gameplay behavior.
## Sources
- Module path: `StandaloneMods/FMF.GregifyEmployees`
- HR context: [`Framework Features & Use Cases`](/wiki/wiki-import/Framework-Features-Use-Cases)

View File

@@ -0,0 +1,104 @@
---
title: FMF.HexLabelMod
sidebar_label: FMF.HexLabelMod
---
<!-- markdownlint-disable MD060 -->
`mods/FMF.Mod.HexLabelMod`
## Purpose
Standalone MelonLoader mod for **Data Center** (Waseku) that overlays the hex color code of each `CableSpinner` and `Rack` directly in-world, so you can identify cable and rack colors at a glance without opening any menu.
Rewritten from the former root `HexLabelMod` for the FrikaModdingFramework workflow, now running fully standalone.
## Requirements
| Dependency | Notes |
| --- | --- |
| [MelonLoader](https://melonwiki.xyz/) | With generated IL2CPP assemblies |
This mod runs standalone and does **not** require FMF runtime APIs.
## Installation
1. Drop `FMF.HexLabelMod.dll` into your `Mods/` folder.
2. Launch the game — the config file is created automatically on first run at:
```text
UserData/hexposition.cfg
```
## Configuration
Edit `UserData/hexposition.cfg` to adjust label positioning and font sizes. The file is auto-generated with defaults on first launch and regenerated if any keys are missing.
```ini
# Hex Label Position Config
# File: UserData/hexposition.cfg
# Edit values, then restart game.
# Spinner (UI text near cable spool)
spinner_offset_x=0
spinner_offset_y=-6
spinner_font_min=1.8
spinner_font_max=6.2
spinner_font_scale=0.24
# Rack (world-space text at rack back-right-bottom)
rack_offset_right=-0.03
rack_offset_back=0.06
rack_offset_down=-0.02
rack_font_size=42
rack_character_size=0.05
rack_scale=1
```
### Config Keys
| Key | Type | Default | Description |
| --- | --- | --- | --- |
| `spinner_offset_x` | float | `0` | Horizontal offset relative to the source label |
| `spinner_offset_y` | float | `-6` | Vertical offset relative to the source label |
| `spinner_font_min` | float | `1.8` | Minimum auto-size font size (TMPro) |
| `spinner_font_max` | float | `6.2` | Maximum auto-size font size (TMPro) |
| `spinner_font_scale` | float | `0.24` | Scale factor applied to the source label's font size |
| `rack_offset_right` | float | `-0.03` | World-space offset along rack's right axis |
| `rack_offset_back` | float | `0.06` | World-space offset along rack's back axis |
| `rack_offset_down` | float | `-0.02` | World-space offset along rack's down axis |
| `rack_font_size` | int | `42` | Font size for the world-space `TextMesh` label |
| `rack_character_size` | float | `0.05` | Character size for the world-space `TextMesh` label |
| `rack_scale` | float | `1` | Uniform world-space scale of the rack label object |
## Live Reload *(restricted)*
Pressing **Ctrl+F1** toggles live config reload (6-second interval), allowing you to tune label positions without restarting the game. This feature is restricted to a specific Steam account and will silently do nothing for all other users.
## Build
```powershell
dotnet build .\mods\FMF.Mod.HexLabelMod\FMF.HexLabelMod.csproj
```
Output lands in the standard MelonLoader `Mods/` folder as configured in the `.csproj`.
## How It Works
1. **Startup** — The mod defers full initialization until MelonLoader's `Latest.log` confirms the Steam runtime is ready (SteamID or Steam marker detected).
2. **Spinner labels** — Every `CableSpinner` gets a cloned `TextMeshProUGUI` label injected into its UI hierarchy, displaying the resolved hex code in white. Color is read from `rgbColor`, then from the `_BaseColor`/`_Color` material property as fallback.
3. **Rack labels** — Every `Rack` gets a world-space `TextMesh` label positioned at its back-right-bottom corner, facing away from the rack front.
4. **Scan loop** — Active spinners and racks are re-checked every 1.5 seconds to catch newly spawned objects.
5. **Harmony patch**`CableSpinner.Start` is patched to inject the label immediately on spawn, before the first scan cycle runs.
## Notes
- Original gameplay behavior is unaffected.
- This mod runs from `mods/FMF.Mod.HexLabelMod` and no longer from the repository root.
- The config file is fully rewritten if any expected keys are missing (for example, after an update adds new keys).
- FMF assembly presence is no longer required as a startup gate.
## Sources
- Module path: `mods/FMF.Mod.HexLabelMod`
- Relatedocs: [`Standalone Mods`](/wiki/wiki-import/StandaloneMods)

View File

@@ -0,0 +1,35 @@
---
title: FMF.LangCompatBridge
sidebar_label: FMF.LangCompatBridge
description: Language compatibility bridge mod for Data Center — localization bridging for mixed mod stacks.
---
## Description
Provides language/localization compatibility bridging for mixed mod stacks.
## Steamworks Metadata
| Field | Value |
|-------|-------|
| **Assembly** | `FMF.JoniMLCompatMod.dll` |
| **Version** | `00.01.0009` |
| **Author** | mleem97 |
| **Game** | Waseku — Data Center (App 4170200) |
| **Workshop Tags** | `modded`, `melonloader`, `mod` |
| **Workshop Content Path** | `content/Mods/` |
| **Needs FMF** | No (standalone MelonLoader mod) |
## Wiki Group
- Category: Mod
- Primary Language: C#
- Project Path: `mods/FMF.Plugin.LangCompatBridge`
## Installation
Drop `FMF.JoniMLCompatMod.dll` into `<Data Center>/Mods/`. Requires [MelonLoader](https://melonwiki.xyz/) (IL2CPP).
## Release
- [Open Release Page](/wiki/releases/mods/fmf-lang-compat-bridge-release)

View File

@@ -0,0 +1,19 @@
---
title: FMF.UIReplacementMod
sidebar_label: FMF.UIReplacementMod (Legacy)
---
## Description
Legacy standalone UI replacement module page kept for compatibility.
## Project Status
- Status: Legacy documentation entry
- Note: No active `csproj` module was detected under `mods/` for this page.
## Source
- Previous mixed wiki path: `mods/standalone/fmf-ui-replacement-mod`
- [Open Release Page](/wiki/releases/mods/fmf-ui-replacement-mod-release)

37
mods/extensions/index.md Normal file
View File

@@ -0,0 +1,37 @@
---
title: Standalone Plugins & Mods
sidebar_label: Overview
---
This section contains the first-party standalone modules currently maintained in this repository.
## Classification
- **Plugins** extend the framework runtime capabilities.
- **Mods** extend the game behavior/content by using framework and plugin capabilities.
## Loading path
- **MelonLoader mods** load from `{GameRoot}/Mods/` (standard MelonLoader behavior).
- **FMF framework plugins** (`FFM.Plugin.*`) are deployed under `{GameRoot}/FMF/Plugins/`; MelonLoader does not scan that folder by default — see [Game folder layout](/wiki/topics/meta/game-folder-layout).
- Rust mods via FrikaMF follow the same runtime rules as other MelonLoader mods unless documented otherwise.
## Standalone Plugins
- [FFM.Plugin.AssetExporter](./ffm-plugin-asset-exporter.md)
- [FFM.Plugin.Multiplayer](./ffm-plugin-multiplayer.md)
- [FFM.Plugin.PlayerModels](./ffm-plugin-player-models.md)
- [FFM.Plugin.Sysadmin](./ffm-plugin-sysadmin.md)
- [FFM.Plugin.WebUIBridge](./ffm-plugin-web-ui-bridge.md)
## Standalone Mods
- [FMF.ConsoleInputGuard](./fmf-console-input-guard.md)
- [FMF.GregifyEmployees](./fmf-gregify-employees.md)
- [FMF.HexLabelMod](./fmf-hex-label-mod.md)
- [FMF.LangCompatBridge](./fmf-lang-compat-bridge.md)
- [FMF.UIReplacementMod](./fmf-ui-replacement-mod.md)
## Additional context
- [`Standalone Mods` wiki page](/wiki/wiki-import/StandaloneMods)

18
mods/framework.md Normal file
View File

@@ -0,0 +1,18 @@
---
title: Framework
sidebar_label: Framework
---
The core `FrikaMF` runtime provides:
- Harmony patch integration for gameplay hooks
- Event dispatch and stable event contracts
- Native bridge for Rust modules
- Shared game API abstractions for mod authors
## Core references
- [`Framework Features & Use Cases`](/wiki/wiki-import/Framework-Features-Use-Cases)
- [`HOOKS`](/wiki/wiki-import/HOOKS)
- [`FFI Bridge Reference`](/wiki/wiki-import/FFI-Bridge-Reference)
- [`Mod Developer Debug`](/wiki/wiki-import/Mod-Developer-Debug)

View File

@@ -0,0 +1,35 @@
---
title: FMF.ConsoleInputGuard
sidebar_label: FMF.ConsoleInputGuard
description: Console input guard mod for Data Center — prevents accidental console interactions.
---
## Description
Provides guardrails around console input handling and accidental interactions.
## Steamworks Metadata
| Field | Value |
|-------|-------|
| **Assembly** | `FMF.ConsoleInputGuard.dll` |
| **Version** | `00.01.0001` |
| **Author** | mleem97 |
| **Game** | Waseku — Data Center (App 4170200) |
| **Workshop Tags** | `modded`, `melonloader`, `mod` |
| **Workshop Content Path** | `content/Mods/` |
| **Needs FMF** | No (standalone MelonLoader mod) |
## Wiki Group
- Category: Mod
- Primary Language: C#
- Project Path: `mods/FMF.ConsoleInputGuard`
## Installation
Drop `FMF.ConsoleInputGuard.dll` into `<Data Center>/Mods/`. Requires [MelonLoader](https://melonwiki.xyz/) (IL2CPP).
## Release
- [Open Release Page](/wiki/releases/mods/fmf-console-input-guard-release)

View File

@@ -0,0 +1,35 @@
---
title: FMF.GregifyEmployees
sidebar_label: FMF.GregifyEmployees
description: Gregify Employees gameplay mod for Data Center — themed employee customization.
---
## Description
Applies themed employee customization to hiring-related gameplay flows.
## Steamworks Metadata
| Field | Value |
|-------|-------|
| **Assembly** | `FMF.GregifyEmployees.dll` |
| **Version** | `00.01.0009` |
| **Author** | mleem97 |
| **Game** | Waseku — Data Center (App 4170200) |
| **Workshop Tags** | `modded`, `melonloader`, `mod` |
| **Workshop Content Path** | `content/Mods/` |
| **Needs FMF** | No (standalone MelonLoader mod) |
## Wiki Group
- Category: Mod
- Primary Language: C#
- Project Path: `mods/FMF.Mod.GregifyEmployees`
## Installation
Drop `FMF.GregifyEmployees.dll` into `<Data Center>/Mods/`. Requires [MelonLoader](https://melonwiki.xyz/) (IL2CPP).
## Release
- [Open Release Page](/wiki/releases/mods/fmf-gregify-employees-release)

13
mods/mods/index.md Normal file
View File

@@ -0,0 +1,13 @@
---
title: Mods Wiki
sidebar_label: Mods Overview
---
This section contains gameplay mod wiki pages, separated from plugins.
## Mod Projects
- [FMF.ConsoleInputGuard](./fmf-console-input-guard)
- [FMF.GregifyEmployees](./fmf-gregify-employees)
- [FMF.HexLabelMod](./fmf-hex-label-mod)
- [FMF.LangCompatBridge](./fmf-lang-compat-bridge)

View File

@@ -0,0 +1,35 @@
---
title: FMF.HexLabelMod
sidebar_label: FMF.HexLabelMod
description: Hex label display mod for Data Center — overlays cable spinner and rack color hex labels in-world.
---
## Description
Overlays cable spinner and rack color hex labels directly in-world so you can identify cable and rack colors at a glance without opening any menu.
## Steamworks Metadata
| Field | Value |
|-------|-------|
| **Assembly** | `FMF.HexLabelMod.dll` |
| **Version** | `00.01.0009` |
| **Author** | mleem97 |
| **Game** | Waseku — Data Center (App 4170200) |
| **Workshop Tags** | `modded`, `melonloader`, `mod` |
| **Workshop Content Path** | `content/Mods/` |
| **Needs FMF** | No (standalone MelonLoader mod) |
## Wiki Group
- Category: Mod
- Primary Language: C#
- Project Path: `mods/FMF.Mod.HexLabelMod`
## Installation
Drop `FMF.HexLabelMod.dll` into `<Data Center>/Mods/`. Requires [MelonLoader](https://melonwiki.xyz/) (IL2CPP).
## Release
- [Open Release Page](/wiki/releases/mods/fmf-hex-label-mod-release)

View File

@@ -0,0 +1,70 @@
---
id: fmf-hook-naming
title: FMF hook and event naming
slug: /reference/fmf-hook-naming
description: Canonical naming for hooks, events, and cross-language documentation stubs.
---
# FMF hook and event naming
## Target format
All **new** public hook and event identifiers should follow:
```text
FMF.<Domain>.<EventOrHook>
```
- **`FMF`** — Fixed prefix (Frika Mod Framework).
- **`<Domain>`** — Uppercase domain from the [approved domain list](#approved-domain-segments). Describes *where* the signal belongs in the game (player, rack, server, economy, …).
- **`<EventOrHook>`** — `PascalCase` segment(s), usually `OnSomething` for events or a verb phrase for commands.
Examples (illustrative): `FMF.RACK.CableSpinnerColorResolved`, `FMF.PLAYER.InputPoll`, `FMF.NETWORK.Cable.OnConnected`.
## Approved domain segments
Domains are **closed by default**. Add a new domain only via changelog + maintainer review.
| Domain | Scope |
|--------|--------|
| `GAMEPLAY` | Rules, scoring, simulation beats not covered elsewhere |
| `PLAYER` | Local player input, camera, UI focus |
| `EMPLOYEE` | NPC staff, hiring, schedules |
| `CUSTOMER` | Contracts, SLA, satisfaction |
| `SERVER` | In-game server racks, VMs, power |
| `RACK` | Physical rack placement, mounting |
| `NETWORK` | Cables, switches, traffic |
| `STORE` | Shop cart, checkout |
| `WORLD` | Rooms, expansion, walls |
| `UI` | HUD overlays, menus (when not `PLAYER`) |
| `SAVE` | Save/load lifecycle |
| `FRAMEWORK` | Loader, bridge, diagnostics |
## Legacy: `FFM.*` strings in code
The runtime currently maps numeric event IDs to **`FFM.*`** string constants in [`FrikaMF/HookNames.cs`](https://github.com/mleem97/gregFramework/blob/master/FrikaMF/HookNames.cs) (e.g. `FFM.Economy.Balance.OnChanged`). That is **legacy naming** (four segments after `FFM`).
**Policy**
- New documentation and greenfield APIs should use **`FMF.<Domain>.*`** as above.
- When touching `HookNames.cs`, prefer aligning new entries to **`FMF.*`**; otherwise keep **`FFM.*`** until a planned major version bump documents a rename map.
- The [generated hook catalog](./fmf-hooks-catalog.md) lists **what the code emits today** (including `FFM.*`).
## Cross-language stubs (documentation)
For each canonical hook, the wiki may add **non-normative** snippets:
| Language | Convention |
|----------|------------|
| C# | `FMF.Domain.OnSomething.Subscribe(...)` or string literal |
| Lua | `FMF.Domain.OnSomething:subscribe(...)` |
| Rust | `fmf::domain::on_something::subscribe(...)` |
| Python | `fmf.domain.on_something.subscribe(...)` |
| TypeScript | `FMF.Domain.OnSomething.subscribe(...)` |
Bindings are **not** auto-generated for all languages; stubs are for contributor clarity.
## Related
- [FMF hooks catalog](./fmf-hooks-catalog.md) (generated)
- [Legacy wiki: HOOK-NAMING-CONVENTION](../wiki-import/HOOK-NAMING-CONVENTION.md) (extended examples)

View File

@@ -0,0 +1,109 @@
---
id: fmf-hooks-catalog
title: FMF hooks catalog
slug: /reference/fmf-hooks-catalog
description: Auto-generated catalog of hook strings and event id mappings from FrikaMF sources.
---
<!-- AUTO-GENERATED by tools/Generate-FmfHookCatalog.ps1 - DO NOT EDIT BY HAND -->
# FMF hooks catalog
This page is **generated** from `framework/FrikaMF/HookNames.cs` and `framework/FrikaMF/EventIds.cs`.
**Generated:** 2026-04-06 14:26:09 UTC
## Hook string constants
| C# field | Hook string |
|----------|-------------|
| ``CustomerContractOnSigned`` | ``FFM.Customer.Contract.OnSigned`` |
| ``CustomerReputationOnChanged`` | ``FFM.Customer.Reputation.OnChanged`` |
| ``CustomerSlaOnBreached`` | ``FFM.Customer.SLA.OnBreached`` |
| ``CustomerSlaOnRestored`` | ``FFM.Customer.SLA.OnRestored`` |
| ``EconomyBalanceOnChanged`` | ``FFM.Economy.Balance.OnChanged`` |
| ``EmployeesStaffOnHiredCustom`` | ``FFM.Employees.Staff.OnHired`` |
| ``EmployeesStaffOnTerminatedCustom`` | ``FFM.Employees.Staff.OnTerminated`` |
| ``FrameworkHooksOnBridgeInstalled`` | ``FFM.Framework.Hooks.OnBridgeInstalled`` |
| ``FrameworkHooksOnBridgeTriggered`` | ``FFM.Framework.Hooks.OnBridgeTriggered`` |
| ``GameLoadOnCompleted`` | ``FFM.Game.Load.OnCompleted`` |
| ``GameSaveOnCompleted`` | ``FFM.Game.Save.OnCompleted`` |
| ``GameSaveOnRequested`` | ``FFM.Game.Save.OnRequested`` |
| ``GameTimeOnDayChanged`` | ``FFM.Game.Time.OnDayChanged`` |
| ``GameTimeOnMonthChanged`` | ``FFM.Game.Time.OnMonthChanged`` |
| ``GameXpOnGained`` | ``FFM.Game.XP.OnGained`` |
| ``NetworkCableOnConnected`` | ``FFM.Network.Cable.OnConnected`` |
| ``NetworkCableOnConnectedSuppress`` | ``FFM.Network.Cable.OnConnected.Suppress`` |
| ``NetworkCableOnDisconnected`` | ``FFM.Network.Cable.OnDisconnected`` |
| ``NetworkCableOnDisconnectedSuppress`` | ``FFM.Network.Cable.OnDisconnected.Suppress`` |
| ``NetworkCableOnLinkDown`` | ``FFM.Network.Cable.OnLinkDown`` |
| ``NetworkCableOnLinkUp`` | ``FFM.Network.Cable.OnLinkUp`` |
| ``NetworkTrafficOnThresholdExceeded`` | ``FFM.Network.Traffic.OnThresholdExceeded`` |
| ``ObjectsDeviceOnDegraded`` | ``FFM.Objects.Device.OnDegraded`` |
| ``ObjectsDeviceOnEOL`` | ``FFM.Objects.Device.OnEOL`` |
| ``ObjectsDeviceOnPoweredOff`` | ``FFM.Objects.Device.OnPoweredOff`` |
| ``ObjectsDeviceOnPoweredOn`` | ``FFM.Objects.Device.OnPoweredOn`` |
| ``ObjectsDeviceOnRepaired`` | ``FFM.Objects.Device.OnRepaired`` |
| ``ObjectsRackOnDevicePlaced`` | ``FFM.Objects.Rack.OnDevicePlaced`` |
| ``ObjectsRackOnRemoved`` | ``FFM.Objects.Rack.OnRemoved`` |
| ``ObjectsServerOnClientAssigned`` | ``FFM.Objects.Server.OnClientAssigned`` |
| ``ObjectsServerOnClientUnassigned`` | ``FFM.Objects.Server.OnClientUnassigned`` |
| ``StoreCartOnCheckedOutCleared`` | ``FFM.Store.Cart.OnCheckedOut`` |
| ``StoreCartOnItemAdded`` | ``FFM.Store.Cart.OnItemAdded`` |
| ``StoreCartOnItemRemoved`` | ``FFM.Store.Cart.OnItemRemoved`` |
| ``WorldRoomOnExpanded`` | ``FFM.World.Room.OnExpanded`` |
## Event id to hook mapping
| Event id (uint) | EventIds name | Resolves to field | Hook string |
|-----------------|---------------|---------------------|-------------|
| 213 | `CableCleared` | `StoreCartOnCheckedOutCleared` | `FFM.Store.Cart.OnCheckedOut` |
| 204 | `CableConnected` | `NetworkCableOnConnected` | `FFM.Network.Cable.OnConnected` |
| 211 | `CableCreated` | `NetworkCableOnConnected` | `FFM.Network.Cable.OnConnected` |
| 205 | `CableDisconnected` | `NetworkCableOnDisconnected` | `FFM.Network.Cable.OnDisconnected` |
| 212 | `CableRemoved` | `NetworkCableOnDisconnected` | `FFM.Network.Cable.OnDisconnected` |
| 215 | `CableSfpInserted` | `NetworkCableOnConnected` | `FFM.Network.Cable.OnConnected` |
| 216 | `CableSfpRemoved` | `NetworkCableOnDisconnected` | `FFM.Network.Cable.OnDisconnected` |
| 214 | `CableSpeedChanged` | `NetworkTrafficOnThresholdExceeded` | `FFM.Network.Traffic.OnThresholdExceeded` |
| 1001 | `CustomEmployeeFired` | `EmployeesStaffOnTerminatedCustom` | `FFM.Employees.Staff.OnTerminated` |
| 1000 | `CustomEmployeeHired` | `EmployeesStaffOnHiredCustom` | `FFM.Employees.Staff.OnHired` |
| 400 | `CustomerAccepted` | `CustomerContractOnSigned` | `FFM.Customer.Contract.OnSigned` |
| 401 | `CustomerSatisfied` | `CustomerSlaOnRestored` | `FFM.Customer.SLA.OnRestored` |
| 402 | `CustomerUnsatisfied` | `CustomerSlaOnBreached` | `FFM.Customer.SLA.OnBreached` |
| 300 | `DayEnded` | `GameTimeOnDayChanged` | `FFM.Game.Time.OnDayChanged` |
| 601 | `EmployeeFired` | `EmployeesStaffOnTerminated` | `FFM.Employees.Staff.OnTerminated` |
| 600 | `EmployeeHired` | `EmployeesStaffOnHired` | `FFM.Employees.Staff.OnHired` |
| 702 | `GameAutoSaved` | `GameSaveOnRequested` | `FFM.Game.Save.OnRequested` |
| 701 | `GameLoaded` | `GameLoadOnCompleted` | `FFM.Game.Load.OnCompleted` |
| 700 | `GameSaved` | `GameSaveOnCompleted` | `FFM.Game.Save.OnCompleted` |
| 1100 | `HookBridgeInstalled` | `FrameworkHooksOnBridgeInstalled` | `FFM.Framework.Hooks.OnBridgeInstalled` |
| 1101 | `HookBridgeTriggered` | `FrameworkHooksOnBridgeTriggered` | `FFM.Framework.Hooks.OnBridgeTriggered` |
| 100 | `MoneyChanged` | `EconomyBalanceOnChanged` | `FFM.Economy.Balance.OnChanged` |
| 301 | `MonthEnded` | `GameTimeOnMonthChanged` | `FFM.Game.Time.OnMonthChanged` |
| 900 | `NetWatchDispatched` | `NetworkTrafficOnThresholdExceeded` | `FFM.Network.Traffic.OnThresholdExceeded` |
| 208 | `RackUnmounted` | `ObjectsRackOnRemoved` | `FFM.Objects.Rack.OnRemoved` |
| 102 | `ReputationChanged` | `CustomerReputationOnChanged` | `FFM.Customer.Reputation.OnChanged` |
| 207 | `ServerAppChanged` | `ObjectsServerOnClientUnassigned` | `FFM.Objects.Server.OnClientUnassigned` |
| 201 | `ServerBroken` | `ObjectsDeviceOnDegraded` | `FFM.Objects.Device.OnDegraded` |
| 206 | `ServerCustomerChanged` | `ObjectsServerOnClientAssigned` | `FFM.Objects.Server.OnClientAssigned` |
| 203 | `ServerInstalled` | `ObjectsRackOnDevicePlaced` | `FFM.Objects.Rack.OnDevicePlaced` |
| 200 | `ServerPowered` | `ObjectsDeviceOnPoweredOn` | `FFM.Objects.Device.OnPoweredOn` |
| 202 | `ServerRepaired` | `ObjectsDeviceOnRepaired` | `FFM.Objects.Device.OnRepaired` |
| 502 | `ShopCartCleared` | `StoreCartOnCheckedOutCleared` | `FFM.Store.Cart.OnCheckedOut` |
| 500 | `ShopCheckout` | `StoreCartOnCheckedOut` | `FFM.Store.Cart.OnCheckedOut` |
| 501 | `ShopItemAdded` | `StoreCartOnItemAdded` | `FFM.Store.Cart.OnItemAdded` |
| 503 | `ShopItemRemoved` | `StoreCartOnItemRemoved` | `FFM.Store.Cart.OnItemRemoved` |
| 209 | `SwitchBroken` | `NetworkCableOnLinkDown` | `FFM.Network.Cable.OnLinkDown` |
| 210 | `SwitchRepaired` | `NetworkCableOnLinkUp` | `FFM.Network.Cable.OnLinkUp` |
| 800 | `WallPurchased` | `WorldRoomOnExpanded` | `FFM.World.Room.OnExpanded` |
| 101 | `XPChanged` | `GameXpOnGained` | `FFM.Game.XP.OnGained` |
## Fallback
Unknown event ids resolve to ``FFM.Framework.Unknown.OnEvent`` in `HookNames.Resolve`.
## See also
- [FMF hook naming](./fmf-hook-naming.md)
- [EventIds source](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/EventIds.cs)
- [HookNames source](https://github.com/mleem97/gregFramework/blob/master/framework/FrikaMF/HookNames.cs)

69
reference/mcp-server.md Normal file
View File

@@ -0,0 +1,69 @@
---
title: MCP server (LLM-friendly modding)
sidebar_label: MCP server
description: Model Context Protocol server bundled with the docs Docker image for assistants and IDEs.
---
# MCP server (FrikaMF modding)
The repository ships a **Model Context Protocol (MCP)** server (`mcp-server/`) that exposes:
- **Docs search & read** — Markdown under `docs/` (same source as Docusaurus).
- **Hook registry** — `fmf_hooks.json` (and the same registry path in the monorepo).
- **CONTRIBUTING** — conventions and workflow.
- **Repo layout** — static overview and a **`fmf_modding_context`** prompt for quick context.
Use it when you want an assistant (Cursor, Claude Code, or any MCP client) to **ground answers** in this repo instead of guessing APIs.
## Docker (single container)
The root `Dockerfile` builds **Docusaurus** into static files and runs **one Node process** that:
- Serves the wiki at **`http://<host>:3000/`** (static HTML).
- Exposes **Streamable HTTP MCP** at **`POST /mcp`** and **`GET /mcp`** (SSE), plus **`GET /health`**.
From the repo root:
```bash
docker compose up docs-mcp
```
Default mapping: **`http://localhost:3040`** (host) → container port **3000**.
- Docs: `http://localhost:3040/wiki/`
- Health: `http://localhost:3040/health`
- MCP: `http://localhost:3040/mcp` (client must speak MCP Streamable HTTP; session via `mcp-session-id` header).
:::note Security
Binding to `0.0.0.0` exposes the MCP endpoint on your network. Use only on trusted networks or behind a reverse proxy with authentication.
:::
## Local (stdio) for Cursor
From `mcp-server/` with the repo root as data (so `docs/`, `CONTRIBUTING.md`, and `FrikaModFramework/fmf_hooks.json` resolve):
```bash
cd mcp-server
node src/index.mjs --stdio --data-root ..
```
Point your MCP client at this command (stdio transport). Adjust `--data-root` if your layout differs.
## Tools (summary)
| Tool | Purpose |
|------|--------|
| `fmf_search_docs` | Substring search across `docs/**/*.md` |
| `fmf_read_doc` | Read one file by path under `docs/` |
| `fmf_list_doc_paths` | Discover Markdown paths |
| `fmf_hook_registry` | Raw `fmf_hooks.json` |
| `fmf_read_contributing` | `CONTRIBUTING.md` |
| `fmf_repo_layout` | Short monorepo overview |
## Related
- [Hook naming](./fmf-hook-naming.md)
- [Hooks catalog](./fmf-hooks-catalog.md)
- [Monorepo target layout](../contributors/monorepo-target-layout.md)

View File

@@ -0,0 +1,31 @@
---
id: mod-store-vision
title: Mod Store Vision (Secure Git-Based)
slug: /reference/mod-store-vision
---
## Vision
Build a Mod Store with Git-based submissions, automated malware scanning, and policy checks before mods are visible.
## Core principles
- All submissions are reviewable in Git.
- Every build artifact is reproducible from source.
- Security checks are mandatory before publish.
## Security pipeline (target)
1. Submit via pull request (manifest + source + checksums).
2. CI runs static checks and signature/metadata validation.
3. Virus scanning runs on produced artifacts.
4. Maintainer review and policy checks.
5. Publish approved metadata index consumed by launcher/site.
## Recommended metadata fields
- `modId`, `version`, `authors`
- `supportedGameVersions`
- `requiredFrameworkVersion`
- `sha256` for each downloadable artifact
- source URL and license

View File

@@ -0,0 +1,42 @@
---
id: release-channels
title: Release channels — Steam vs GitHub
slug: /reference/release-channels
description: Where to download stable builds, beta builds, and how this relates to the Steam Workshop.
---
# Release channels — Steam vs GitHub
This project uses **two complementary channels** for distributing mods and plugins. The wiki and [`/mods`](/mods) catalog are **not** a replacement for the Steam Workshop; they are an **overview**, documentation hub, and **second official source** for files that should not flood the Workshop.
## Steam Workshop (discovery & stable)
- **Game**: [Data Center on Steam](https://store.steampowered.com/app/4170200/) (AppID `4170200`).
- **Workshop**: [Browse items](https://steamcommunity.com/workshop/browse/?appid=4170200) — best for **player discovery**, ratings, and stable “subscribe and play” flows.
- Use Workshop for **production-ready** releases you want every player to see.
## GitHub Releases (beta and alternate downloads)
- **Organization**: [github.com/mleem97/gregFramework](https://github.com/mleem97/gregFramework) (see repo for actual org if renamed).
- **Stable**: tagged releases — same DLLs you may also ship via Workshop.
- **Pre-release / beta**: GitHub **pre-releases** — ideal for testers without publishing unfinished items to Workshop.
- **Why**: avoids “polluting” the Workshop with experimental builds while still offering a **single official URL** for power users and CI.
## This documentation site
| Need | Where |
|------|--------|
| Wiki entry for a module | `/wiki/mods/...` |
| Download link (when configured) | GitHub Releases asset or redirect from [`moduleCatalog`](https://github.com/mleem97/gregFramework/blob/master/wiki/src/data/moduleCatalog.ts) |
| Catalog overview | [`/mods`](/mods) |
## Maintainer checklist
- [ ] Stable: tag + Release notes + optional Workshop update.
- [ ] Beta: pre-release + link from module wiki page + `releaseReady: false` in catalog until promoted.
- [ ] Do not commit large binaries to `main` without a documented policy.
## Related
- [Repo inventory](../contributors/repo-inventory.md)
- [Mod store vision](./mod-store-vision.md)

26
reference/wiki-mapping.md Normal file
View File

@@ -0,0 +1,26 @@
---
id: wiki-mapping
title: Wiki to Docusaurus Mapping
slug: /reference/wiki-mapping
---
## Why this mapping exists
The repository currently stores canonical docs in `.wiki/`. This page defines how those pages are grouped in Docusaurus.
## Audience buckets
- **Newbies**: install/update/troubleshooting, legal basics
- **Intermediates**: hooking, bridge usage, mod config, workflows
- **Pros**: architecture, runtime internals, release system, roadmap
## Suggested migration order
1. Start with onboarding pages (`Home`, End-User, Mod-Developer).
2. Migrate runtime references (`Architecture`, `FFI-Bridge-Reference`, `Web-UI-Bridge`).
3. Migrate governance pages (`Contributors`, Roadmap, Tasklist).
4. Keep bilingual mirrors where needed.
## Sync strategy
Use `npm run wiki:sync` to copy `.wiki/*.md` into a generated docs area for review-based migration.

35
references/README.md Normal file
View File

@@ -0,0 +1,35 @@
# Reference Data
This folder contains large reference exports used by hook analysis and build-time tooling.
## Files
- [assembly-hooks.txt.gz](./assembly-hooks.txt.gz)
- [modder-hooks.ffm.txt.gz](./modder-hooks.ffm.txt.gz)
## Decompress
Use standard gzip tools when you need local plaintext files:
```bash
gzip -dk assembly-hooks.txt.gz
gzip -dk modder-hooks.ffm.txt.gz
```
PowerShell alternative:
```powershell
$inputPath = ".\\assembly-hooks.txt.gz"
$outputPath = ".\\assembly-hooks.txt"
$in = [System.IO.File]::OpenRead($inputPath)
$out = [System.IO.File]::Create($outputPath)
$gzip = New-Object System.IO.Compression.GzipStream($in, [System.IO.Compression.CompressionMode]::Decompress)
$gzip.CopyTo($out)
$gzip.Dispose(); $out.Dispose(); $in.Dispose()
```
## Build Pipeline Usage
- Hook alias and reference tooling should read `.gz` directly when possible.
- If plaintext is required, scripts should decompress on demand and avoid committing extracted `.txt` files.
- Keep all reference artifacts in `docs/wiki/references/`.

Binary file not shown.

Binary file not shown.

29
releases/index.mdx Normal file
View File

@@ -0,0 +1,29 @@
---
title: Releases
sidebar_label: Releases overview
description: Index of plugin and mod release pages (download metadata, notes links).
---
# Releases
Release pages list **download targets**, **version placeholders**, and links back to the **wiki articles** for each plugin or mod. Non-release documentation lives under [Mods](/wiki/mods/plugins/) in the sidebar.
## Plugin releases
- [FFM.Plugin.AssetExporter](/wiki/releases/plugins/ffm-plugin-asset-exporter-release)
- [FFM.Plugin.Multiplayer](/wiki/releases/plugins/ffm-plugin-multiplayer-release)
- [FFM.Plugin.PlayerModels](/wiki/releases/plugins/ffm-plugin-player-models-release)
- [FFM.Plugin.Sysadmin](/wiki/releases/plugins/ffm-plugin-sysadmin-release)
- [FFM.Plugin.WebUIBridge](/wiki/releases/plugins/ffm-plugin-web-ui-bridge-release)
## Tool releases
- [GregTools 1.0 Modmanager](/wiki/releases/tools/gregtools-modmanager-1.0-release)
## Mod releases
- [FMF.ConsoleInputGuard](/wiki/releases/mods/fmf-console-input-guard-release)
- [FMF.GregifyEmployees](/wiki/releases/mods/fmf-gregify-employees-release)
- [FMF.HexLabelMod](/wiki/releases/mods/fmf-hex-label-mod-release)
- [FMF.LangCompatBridge](/wiki/releases/mods/fmf-lang-compat-bridge-release)
- [FMF.UIReplacementMod](/wiki/releases/mods/fmf-ui-replacement-mod-release)

View File

@@ -0,0 +1,21 @@
---
title: FMF.ConsoleInputGuard Release
sidebar_label: FMF.ConsoleInputGuard Release
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FMF.ConsoleInputGuard"
kind="mod"
dllName="FMF.ConsoleInputGuard.dll"
releaseReady={false}
version="NotReleasedYet"
author="mleem97 / FrikaMF Community"
category="Mod"
dependencies={['MelonLoader', 'Harmony']}
codeLanguages={['C#']}
description="Provides guardrails around console input handling and accidental interactions."
banner="Console input guard mod release"
releaseNotesPath="/mods/mods/fmf-console-input-guard"
/>

View File

@@ -0,0 +1,21 @@
---
title: FMF.GregifyEmployees Release
sidebar_label: FMF.GregifyEmployees Release
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FMF.GregifyEmployees"
kind="mod"
dllName="FMF.GregifyEmployees.dll"
releaseReady={false}
version="NotReleasedYet"
author="mleem97 / FrikaMF Community"
category="Mod"
dependencies={['MelonLoader', 'Harmony']}
codeLanguages={['C#']}
description="Applies themed employee customization to hiring-related gameplay flows."
banner="Gregify employees mod release"
releaseNotesPath="/mods/mods/fmf-gregify-employees"
/>

View File

@@ -0,0 +1,21 @@
---
title: FMF.HexLabelMod Release
sidebar_label: FMF.HexLabelMod Release
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FMF.HexLabelMod"
kind="mod"
dllName="FMF.HexLabelMod.dll"
releaseReady={false}
version="NotReleasedYet"
author="mleem97 / FrikaMF Community"
category="Mod"
dependencies={['MelonLoader', 'Harmony']}
codeLanguages={['C#']}
description="Overlays cable spinner and rack color hex labels directly in-world."
banner="Hex label mod release"
releaseNotesPath="/mods/mods/fmf-hex-label-mod"
/>

View File

@@ -0,0 +1,21 @@
---
title: FMF.LangCompatBridge Release
sidebar_label: FMF.LangCompatBridge Release
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FMF.LangCompatBridge"
kind="mod"
dllName="FMF.JoniMLCompatMod.dll"
releaseReady={false}
version="NotReleasedYet"
author="mleem97 / FrikaMF Community"
category="Mod"
dependencies={['MelonLoader']}
codeLanguages={['C#']}
description="Provides language/localization compatibility bridging for mixed mod stacks."
banner="Language compatibility bridge release"
releaseNotesPath="/mods/mods/fmf-lang-compat-bridge"
/>

View File

@@ -0,0 +1,15 @@
---
title: FMF.UIReplacementMod Release
sidebar_label: FMF.UIReplacementMod
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FMF.UIReplacementMod"
kind="mod"
dllName="FMF.UIReplacementMod.dll"
description="Replaces and modernizes selected in-game UI layers with improved readability and layout behavior."
banner="UI replacement mod release"
releaseNotesPath="/mods/standalone/fmf-ui-replacement-mod"
/>

View File

@@ -0,0 +1,21 @@
---
title: FFM.Plugin.AssetExporter Release
sidebar_label: FFM.Plugin.AssetExporter Release
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FFM.Plugin.AssetExporter"
kind="plugin"
dllName="FFM.Plugin.AssetExporter.dll"
releaseReady={false}
version="NotReleasedYet"
author="mleem97 / FrikaMF Community"
category="Plugin"
dependencies={['MelonLoader', 'FrikaMF']}
codeLanguages={['C#']}
description="Provides export-focused tooling for asset-related workflows in Data Center modding pipelines."
banner="Asset exporter plugin release"
releaseNotesPath="/mods/plugins/ffm-plugin-asset-exporter"
/>

View File

@@ -0,0 +1,21 @@
---
title: FFM.Plugin.Multiplayer Release
sidebar_label: FFM.Plugin.Multiplayer Release
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FFM.Plugin.Multiplayer"
kind="plugin"
dllName="FFM.Plugin.Multiplayer.dll"
releaseReady={false}
version="NotReleasedYet"
author="mleem97 / FrikaMF Community"
category="Plugin"
dependencies={['MelonLoader', 'FrikaMF']}
codeLanguages={['C#']}
description="Contains multiplayer-oriented plugin functionality for FrikaMF ecosystems."
banner="Multiplayer plugin release"
releaseNotesPath="/mods/plugins/ffm-plugin-multiplayer"
/>

View File

@@ -0,0 +1,21 @@
---
title: FFM.Plugin.PlayerModels Release
sidebar_label: FFM.Plugin.PlayerModels Release
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FFM.Plugin.PlayerModels"
kind="plugin"
dllName="FFM.Plugin.PlayerModels.dll"
releaseReady={false}
version="NotReleasedYet"
author="mleem97 / FrikaMF Community"
category="Plugin"
dependencies={['MelonLoader', 'FrikaMF']}
codeLanguages={['C#']}
description="Extends player model handling and related rendering/gameplay presentation behavior."
banner="Player models plugin release"
releaseNotesPath="/mods/plugins/ffm-plugin-player-models"
/>

View File

@@ -0,0 +1,21 @@
---
title: FFM.Plugin.Sysadmin Release
sidebar_label: FFM.Plugin.Sysadmin Release
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FFM.Plugin.Sysadmin"
kind="plugin"
dllName="FFM.Plugin.Sysadmin.dll"
releaseReady={false}
version="NotReleasedYet"
author="mleem97 / FrikaMF Community"
category="Plugin"
dependencies={['MelonLoader', 'FrikaMF']}
codeLanguages={['C#']}
description="Provides sysadmin-focused controls and quality-of-life command utilities."
banner="Sysadmin plugin release"
releaseNotesPath="/mods/plugins/ffm-plugin-sysadmin"
/>

View File

@@ -0,0 +1,21 @@
---
title: FFM.Plugin.WebUIBridge Release
sidebar_label: FFM.Plugin.WebUIBridge Release
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FFM.Plugin.WebUIBridge"
kind="plugin"
dllName="FFM.Plugin.WebUIBridge.dll"
releaseReady={false}
version="NotReleasedYet"
author="mleem97 / FrikaMF Community"
category="Plugin"
dependencies={['MelonLoader', 'FrikaMF']}
codeLanguages={['C#']}
description="Bridges runtime data to web interfaces for dashboards and remote overlays."
banner="Web UI bridge plugin release"
releaseNotesPath="/mods/plugins/ffm-plugin-web-ui-bridge"
/>

View File

@@ -0,0 +1,40 @@
---
title: FMF.ModPathRedirector Release
sidebar_label: FMF.ModPathRedirector Release
description: Download and install the MelonLoader Workshop download plugin for Data Center.
---
import ModReleasePage from '@site/src/components/ModReleasePage';
<ModReleasePage
title="FMF.ModPathRedirector"
kind="plugin"
dllName="FMF.ModPathRedirector.dll"
releaseReady={true}
version="1.5.0"
author="DataCenterExporter / FrikaMF Community"
category="MelonLoader plugin"
dependencies={['MelonLoader', 'Steam (client)', 'Data Center']}
codeLanguages={['C#']}
description="MelonLoader plugin: after Il2Cpp assembly generation, blocks MelonMods load until each subscribed Workshop item is downloaded (Steam) and workshop_* folders exist under Data Center_Data/StreamingAssets/Mods/, with per-item DownloadItem and timeouts. Does not redirect native mod paths."
banner="Workshop download helper (MelonLoader Plugins/)"
releaseNotesPath="/wiki/tools/workshop-uploader"
installation={
<ol>
<li>
Download <code>FMF.ModPathRedirector.dll</code> from the latest{' '}
<a href="https://github.com/mleem97/gregFramework/releases/latest">GitHub release</a> (or use the button on this page — redirects to the same asset).
</li>
<li>
Copy the DLL into your game folder: <code>&lt;GameRoot&gt;/Plugins/</code> — the same directory as <code>Data Center.exe</code>, <strong>not</strong> <code>Mods/</code> (that folder is for MelonMods).
</li>
<li>
Ensure <code>steam_api64.dll</code> is next to the game executable (Steam ships it with the game). Start the game with MelonLoader; the plugin waits until Steam is running, then requests downloads for subscribed Workshop items.
</li>
</ol>
}
/>
:::info GitHub asset
The **Download DLL** button and `/plugin/FMF.ModPathRedirector.dll` route resolve to `https://github.com/mleem97/gregFramework/releases/latest/download/FMF.ModPathRedirector.dll`. That file is attached automatically when you publish a release via the `release-assets.yml` workflow (push a `v*` tag or run the workflow manually).
:::

View File

@@ -0,0 +1,42 @@
---
title: GregTools 1.0 Modmanager
sidebar_label: GregTools Modmanager 1.0
description: First stable release of the GregTools Modmanager (Workshop Uploader) for Data Center — download ZIP, install, and links.
---
# GregTools 1.0 Modmanager
**Version:** 1.0.0 · **Application title:** GregTools Modmanager · **Windows:** win10-x64, self-contained (.NET MAUI)
This is the **first numbered release** line for the desktop Workshop client: Mod Store, author tools, Mod Manager, and Steam publish flows for **Data Center** (Steam App ID `4170200`).
## Download
Releases are published on **GitHub** from the [`gregtools-modmanager-release`](https://github.com/mleem97/gregFramework/blob/main/.github/workflows/gregtools-modmanager-release.yml) workflow.
| What | Where |
|------|--------|
| **Latest release** | [github.com/mleem97/gregFramework/releases/latest](https://github.com/mleem97/gregFramework/releases/latest) |
| **1.0.0 assets** | Look for tag **`gregtools-modmanager-v1.0.0`** and the ZIP **`Gregtools-Modmanager-1.0.0-win10-x64.zip`** (best-compression portable folder). |
:::tip Creating the GitHub release
Push tag **`gregtools-modmanager-v1.0.0`** on `main` (or run the workflow manually with that tag) so CI builds and attaches the ZIP.
:::
## Install
1. Download **`Gregtools-Modmanager-1.0.0-win10-x64.zip`** from the release.
2. Extract to a folder of your choice (or next to the game — see [Workshop uploader](/wiki/tools/workshop-uploader)).
3. Run **`WorkshopUploader.exe`**. **Steam** must be installed; the app uses the Steamworks API for Workshop.
## Documentation
- [Workshop uploader (full guide)](/wiki/tools/workshop-uploader)
- [End-user Workshop guide](/wiki/guides/enduser-workshop)
- Open-source and third-party components: [`WorkshopUploader/EXTERNAL_DEPENDENCIES.md`](https://github.com/mleem97/gregFramework/blob/main/WorkshopUploader/EXTERNAL_DEPENDENCIES.md) in the repository
## Scope of 1.0
Initial **1.0** marks a stable baseline for the MAUI Windows app (self-contained publish, trimmed Release builds, localization, Mod Store / Mod Manager / editor flows). Patch and feature releases will use **1.0.x** / **1.x** as versioning on the [application version](/wiki/tools/workshop-uploader) in the project file.

View File

@@ -0,0 +1,11 @@
---
id: mod-store-stages
title: Mod Store Stages
slug: /roadmap/mod-store-stages
---
This page is kept for legacy links.
Use the canonical roadmap page:
- [Unified Roadmap](/wiki/roadmap/unified-roadmap)

View File

@@ -0,0 +1,59 @@
---
id: unified-roadmap
title: Unified Roadmap
slug: /roadmap/unified-roadmap
---
This is the canonical roadmap page for the project. It consolidates previous roadmap documents and removes duplicate planning tracks.
## Status Summary
- **Framework Runtime**: active
- **Docs & Contributor Tooling**: active
- **Mod Distribution & Audit Pipeline**: active planning
- **Multiplayer (Steamworks)**: blocked externally
## Important Multiplayer Note
Multiplayer was planned around **Steamworks P2P** and that direction remains conceptually valid.
However, it is **currently not implementable in production** because the game developer has not integrated Steamworks support in the game runtime/API surface required for a stable implementation.
## Consolidated Workstreams
### 1) Framework & Hooking
- Stabilize hook coverage and event contracts.
- Keep C# and Rust bridge compatibility versioned.
- Expand diagnostics for mod-runtime compatibility failures.
### 2) Documentation & Information Architecture
- Keep `/wiki/*` as canonical docs namespace.
- Maintain separated Plugin Wiki and Mod Wiki sections.
- Remove duplicate docs by keeping one canonical page per topic.
### 3) Mod/Plugin Catalog & Distribution
- Maintain dynamic `/mods` catalog with links to wiki and release endpoints.
- Keep release metadata visible (version, author, dependencies, language).
- Keep release-state gating (`NotReleasedYet`) explicit for users.
### 4) Security Audit & Submission Workflow
- Accept plugin submissions via Git repository URL.
- Run automated static checks and suspicious-pattern scans.
- Gate publication/release visibility on successful audit outcome.
### 5) Multiplayer Track (Blocked)
- Keep architecture docs for future Steamworks integration readiness.
- Track dependencies on game-side Steamworks implementation.
- Re-open implementation only when game runtime exposes required primitives.
## Legacy Roadmap Documents
The following pages are now legacy references and should not be used as primary planning sources:
- `wiki-import/ROADMAP`
- `wiki-import/Steamworks-P2P-Multiplayer-Roadmap`
- `roadmap/mod-store-stages`

View File

@@ -0,0 +1,39 @@
# Steam Workshop and tooling
## Live-Sync references
After a *Data Center* update, run the game once so MelonLoader regenerates interop assemblies, then from the repo root:
```bash
python tools/refresh_refs.py
```
Optionally save a baseline for diffs:
```bash
python tools/diff_assembly_metadata.py --save-snapshot
```
After future updates:
```bash
python tools/diff_assembly_metadata.py
```
Do **not** commit `*.dll` from `lib/references/` (see `.gitignore`).
## Steam Workshop (research)
Official upload and item layout for *Data Center* Workshop content may be undocumented by the developer. Until documented:
- Treat Workshop delivery as **game-defined** (often content under game data / `StreamingAssets`; MelonLoader mods remain **DLLs in `Mods/`**).
- The **WorkshopUploader** desktop app (see `WorkshopUploader/`) is the supported path for authors to manage Workshop items and DevServer betas once Steamworks is configured.
## Legal
Do not redistribute game binaries or extracted assets. Workshop packages should contain **your** content only.
## CI / agents
- `FrikaMF.csproj` builds on Windows agents that have either a Steam *Data Center* install **or** a populated `lib/references/MelonLoader/` (from `refresh_refs.py`).
- `WorkshopUploader` targets `net6.0-windows`; build it on Windows (not Linux-hosted runners unless cross-compilation is configured).

View File

@@ -0,0 +1,11 @@
---
title: Assets & export
sidebar_label: Assets & export (hub)
description: Asset export plugin, templates, and related wiki-import pages.
---
# Assets & export
- Wiki: [FFM.Plugin.AssetExporter](/wiki/mods/plugins/ffm-plugin-asset-exporter)
- Release: [FFM.Plugin.AssetExporter release](/wiki/releases/plugins/ffm-plugin-asset-exporter-release)
- Imported: [AssetExport](/wiki/wiki-import/AssetExport), [Release assets and templates](/wiki/wiki-import/Release-Assets-and-Templates)

View File

@@ -0,0 +1,29 @@
---
title: By audience
sidebar_label: By audience
description: Vier Rollen — Spieler, Moddevs, Contributor, Sponsoren — plus Erfahrungsstufen (Newbies bis Pros).
---
# By audience
Die Dokumentation richtet sich an **vier Hauptrollen** (und an Erfahrungsstufen darunter). Wähle, was zu dir passt — die Sprache der meisten Seiten ist **Englisch**, mit deutschsprachigen Importen unter `wiki-import/` wo vorhanden.
## Die vier Rollen
| Rolle | Für wen? | Einstieg |
|--------|----------|----------|
| **Spieler** (End users) | Installation, Mods nutzen, Troubleshooting, FAQ | [End users (hub)](/wiki/topics/end-user/overview) → [End user wiki](/wiki/wiki-import/EndUser/), [Data center FAQ](/wiki/wiki-import/DataCenterFAQ/) |
| **Mod-Entwickler** (Mod developers) | Mods bauen, Hooks, Konfiguration, Debug | [Mod developers (hub)](/wiki/topics/mod-developers/overview) → [ModDevs wiki](/wiki/wiki-import/ModDevs/), [Framework](/wiki/mods/framework) |
| **Contributor** (Repo & Framework) | PRs, Doku, Plugins, CI, Design | [Contributors (workflow)](/wiki/topics/contributors/overview) → [Contributors wiki](/wiki/wiki-import/Contributors/), [Repo inventory](/wiki/contributors/repo-inventory) |
| **Sponsorinnen & Sponsoren** | Unterstützung, Transparenz, rechtlicher Kontext | [Sponsors (hub)](/wiki/topics/sponsors/overview) → [Sponsors (EN)](/wiki/wiki-import/Sponsors), [Sponsoren (DE)](/wiki/wiki-import/Sponsoren) |
## Erfahrungsstufen (alle Rollen)
- [Newbies](/wiki/audiences/newbies) — erste Schritte, Begriffe, sichere Defaults.
- [Intermediates](/wiki/audiences/intermediates) — Workflows, Tooling, typische Stolpersteine.
- [Professionals](/wiki/audiences/professionals) — Architektur, FFI, Performance, Release-Kanäle.
## Thematische Übersicht
- [Topics hub](/wiki/topics/) — Security, Multiplayer, Assets, FFI, Roadmap, Meta.
- Importierte Legacy-Guides: [Legacy wiki import](/wiki/topics/wiki-import/overview).

View File

@@ -0,0 +1,19 @@
---
title: Contributors (workflow)
sidebar_label: Contributors (workflow)
description: Monorepo layout, design system, Docusaurus workflow, plugin audits.
---
# Contributors (workflow)
**Mitwirkende am Repository** — Framework, Website, CI, Plugins. Überblick über alle Rollen (inkl. Spieler, Moddevs, Sponsoren): [By audience](/wiki/topics/audiences/overview).
Operational docs for people changing the framework, site, or release pipeline.
- [Repository inventory](/wiki/contributors/repo-inventory) — current layout snapshot.
- [Monorepo target layout](/wiki/contributors/monorepo-target-layout) — intended structure.
- [Luminescent design system](/wiki/contributors/luminescent-design-system) — UI tokens for the site.
- [Docusaurus workflow](/wiki/contributors/docusaurus-workflow) — edit/build the wiki site.
- [Plugin submission audit](/wiki/contributors/plugin-submission-audit) — checklist for new plugins.
Imported guides: [Contribution workflow](/wiki/wiki-import/Contributors/Guides/Contribution-Workflow).

View File

@@ -0,0 +1,13 @@
---
title: End users
sidebar_label: End users (hub)
description: FAQs, install paths, troubleshooting — mostly wiki-import.
---
# End users
**Spielerinnen und Spieler** — Mods installieren und spielen, ohne am Framework mitzuentwickeln. Überblick über alle Rollen: [By audience](/wiki/topics/audiences/overview).
- [By audience — newbies](/wiki/audiences/newbies)
- Imported: [End user index](/wiki/wiki-import/EndUser/), [Data center FAQ](/wiki/wiki-import/DataCenterFAQ/), [Known incompatibilities](/wiki/wiki-import/Known-Incompatibilities)
- Imported: [End user release notes](/wiki/wiki-import/EndUser/End-User-Release)

View File

@@ -0,0 +1,13 @@
---
title: FFI, hooks & Lua
sidebar_label: FFI, hooks & Lua (hub)
description: FFI, hook lists, naming — bridge between framework and legacy wiki.
---
# FFI, hooks & Lua
- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) (generated)
- [FMF hook naming](/wiki/reference/fmf-hook-naming)
- Imported: [HOOKS](/wiki/wiki-import/HOOKS), [Hook naming convention](/wiki/wiki-import/HOOK-NAMING-CONVENTION)
- Imported: [FFI bridge reference](/wiki/wiki-import/FFI-Bridge-Reference), [Lua FFI start](/wiki/wiki-import/Lua-FFI-Start-Developing)
- Imported: [Mod developer debug](/wiki/wiki-import/Mod-Developer-Debug)

37
topics/index.md Normal file
View File

@@ -0,0 +1,37 @@
---
title: Topics hub
sidebar_label: Topics overview
description: Thematic index — navigate by audience, reference, roadmap, imports, and meta.
---
# Topics hub
Documentation is split into **curated wiki pages** (this site), **generated reference** (for example hook catalogs), and **legacy imports** from the GitHub wiki (`.wiki``wiki-import/`).
## Quick map
| Area | Start here |
|------|------------|
| **Roles (Spieler · Moddevs · Contributor · Sponsoren)** | [By audience](/wiki/topics/audiences/overview) — [End users](/wiki/topics/end-user/overview), [Mod developers](/wiki/topics/mod-developers/overview), [Contributors (workflow)](/wiki/topics/contributors/overview), [Sponsors](/wiki/topics/sponsors/overview) |
| **Audience paths (experience)** | [Newbies](/wiki/audiences/newbies) · [Intermediates](/wiki/audiences/intermediates) · [Professionals](/wiki/audiences/professionals) |
| **Technical reference** | [Reference & technical](/wiki/topics/reference/overview) |
| **Ship planning** | [Roadmap & planning](/wiki/topics/roadmap/overview) |
| **Repository inventory** | [Repo inventory](/wiki/contributors/repo-inventory) |
| **Imported legacy wiki** | [Legacy wiki import](/wiki/topics/wiki-import/overview) |
| **Steam, betas, backlog, game paths** | [Meta & operations](/wiki/topics/meta/overview) — [Game folder layout](/wiki/topics/meta/game-folder-layout) |
## Thematic folders (deep links)
Use these entry points for cross-cutting concerns; each page links into `wiki-import/` and reference docs where relevant.
- [Security & legal](/wiki/topics/security-legal/overview) — licenses, disclaimers, letters to the developer.
- [FFI, hooks & Lua](/wiki/topics/ffi-and-hooks/overview) — HOOKS, FFI bridge, naming conventions.
- [Multiplayer & networking](/wiki/topics/multiplayer-and-networking/overview) — Steamworks P2P, Web UI bridge.
- [Assets & export](/wiki/topics/assets-and-export/overview) — asset export pipeline, templates.
- [End users](/wiki/topics/end-user/overview) — installs, FAQs, troubleshooting.
- [Mod developers](/wiki/topics/mod-developers/overview) — getting started, mod config, debugging.
## Releases vs. articles
- **Release pages** (downloads, version banners): [Releases](/wiki/releases/).
- **Narrative wiki articles** (how it works): [Plugin Wiki](/wiki/mods/plugins/) and [Mod Wiki](/wiki/mods/mods/).

View File

@@ -0,0 +1,62 @@
---
title: Game folder layout (FMF / MelonLoader)
sidebar_label: Game folder layout
description: Canonical paths for mod configs, FMF plugins, and MelonLoader mods under the Data Center game root.
---
# Game folder layout (FMF / MelonLoader)
This page is the **single reference** for where mod-related files live next to the game executable (`{GameRoot}`). MelonLoader sets `{GameRoot}/UserData` via `MelonEnvironment.UserDataDirectory`, `{GameRoot}/Mods` for **MelonMods**, and `{GameRoot}/Plugins` for **MelonPlugins** (e.g. `FMF.ModPathRedirector.dll`).
## Summary
| Inhalt | Pfad | Format / Hinweis |
|--------|------|------------------|
| **Mod-Konfiguration & Sidecars** | `{GameRoot}/UserData/ModCfg/` | **JSON** für Konfigurationsdateien; weitere Sidecar-Dateien (z. B. `custom_employees_hired.txt`) liegen ebenfalls hier, damit alles Mod-Bezogene an einem Ort liegt. |
| **FMF Framework-Plugins** (FFM.Plugin.*) | `{GameRoot}/FMF/Plugins/` | DLLs; **MelonLoader** lädt standardmäßig nur `{GameRoot}/Mods` — siehe unten. |
| **Plugins** (MelonLoader, z. B. ModPathRedirector) | `{GameRoot}/Plugins/` | MelonLoader `Plugins`-Ordner — nur **MelonPlugin**-DLLs. |
| **Mods** (MelonLoader, z. B. FMF.Mod.*) | `{GameRoot}/Mods/` | MelonLoader `Mods`-Ordner — **MelonMod**-DLLs. |
## UserData/ModCfg
- Alle **mod-relevanten** Konfigurationen und JSON-Sidecars werden unter **`UserData/ModCfg`** geführt.
- Beim ersten Start werden fehlende Dateien angelegt; bei bestehenden Installationen werden ältere Dateien aus **`UserData/`** (Root) nach **`ModCfg/`** übernommen, sofern noch vorhanden.
- Beispiele: `multiplayer-sync.config.json`, `pluginsync.config.json`.
- Framework-Metadaten (z. B. Save-Compat-Stamp) liegen unter **`UserData/ModCfg/FrikaFM/`** (Migration von `UserData/FrikaFM`).
## FMF/Plugins und MelonLoader
**FFM-Plugin-DLLs** liegen kanonisch unter **`{GameRoot}/FMF/Plugins`**. MelonLoader enumeriert **standardmäßig** nur **`Mods/`**. Praktische Optionen:
1. **DLLs zusätzlich** (oder verlinkt) **`Mods/`** ablegen — üblicher Weg für automatisches Laden.
2. **Unterordner** von `Mods` nutzen, falls eure MelonLoader-Version Mods in Unterverzeichnissen lädt (Version je nach Release prüfen).
3. **PluginSync**-Downloads des Frameworks landen unter **`FMF/Plugins/PluginSync/...`**.
## Mods (FMF-basiert)
Normale **MelonLoader-Mods** (einschließlich FMF-Mods) werden wie gewohnt in **`{GameRoot}/Mods/`** installiert.
## Steam Workshop (Spiel) vs. MelonLoader
Das Spiel legt abonnierte Workshop-Inhalte unter **`{GameRoot}/{ExeName}_Data/StreamingAssets/mods/workshop_<PublishedFileId>/WorkshopUploadContent`** ab (nativer `ModLoader`, nicht MelonLoader).
- **MelonLoader** durchsucht **`{GameRoot}/Mods`** (inkl. Unterordner, je nach Einstellung), **nicht** beliebige Pfade über `Loader.cfg`.
- **UserData:** MelonLoader-Konfiguration liegt unter **`{GameRoot}/UserData/`** (z.B. **`MelonLoader.cfg`** / je nach Version **`UserData/MelonLoader/Loader.cfg`** — bei Install prüfen). Relevant für Unterordner-Laden: **`disable_subfolder_load = false`**, optional **`disable_subfolder_manifest = true`**.
- **Workshop-DLLs in den Melon-Scan einbinden:** Junction (oder Symlink) von einem Ordner unter **`Mods/`** auf den **`WorkshopUploadContent`**-Pfad desselben Items, z.B. (PowerShell, Pfade anpassen):
```powershell
$game = "C:\Path\To\Data Center"
$id = "12345678901234567"
$target = Join-Path $game "Data Center_Data\StreamingAssets\mods\workshop_$id\WorkshopUploadContent"
$link = Join-Path $game "Mods\workshop_$id"
cmd /c mklink /J "$link" "$target"
```
Ohne Junction müssen MelonMods weiter physisch unter **`Mods/`** liegen oder über eure Verteilung dort landen.
**WorkshopUploader-Vorlagen (modded):** Unter **`content/`** werden **`Mods/`**, **`Plugins/`** und ein **`ModFramework/`**-Baum angelegt — **`ModFramework/FMF/Plugins`** entspricht dabei **`{GameRoot}/FMF/Plugins`**, wenn ihr **`FMF`** per Junction auf **`…/WorkshopUploadContent/ModFramework/FMF`** zeigen lasst. Weitere Framework-Dateien (Konfiguration, Assets) können unter **`ModFramework/`** gebündelt werden.
## Siehe auch
- [Meta & operations](/wiki/topics/meta/overview)
- [Legacy: Mod Config System](/wiki/wiki-import/Mod-Config-System) (API-Contract; Pfade auf **ModCfg** beziehen)

14
topics/meta/overview.md Normal file
View File

@@ -0,0 +1,14 @@
---
title: Meta & operations
sidebar_label: Meta & operations
description: Workshop tooling, devserver betas, idea backlog — repo-level notes.
---
# Meta & operations
These pages are **not** end-user game docs; they describe how we ship and plan around the project.
- [Game folder layout (FMF / MelonLoader)](/wiki/topics/meta/game-folder-layout) — `UserData/ModCfg`, `FMF/Plugins`, `Mods`.
- [Steam Workshop and tooling](/wiki/meta/Steam-Workshop-and-Tooling) — uploader, references workflow.
- [Devserver betas](/wiki/meta/devserver-betas) — beta channel notes.
- [IDEA backlog](/wiki/meta/IDEA_BACKLOG) — unstructured idea list (also used by automation).

View File

@@ -0,0 +1,14 @@
---
title: Mod developers
sidebar_label: Mod developers (hub)
description: Getting started, mod config, debugging — links into wiki-import ModDevs tree.
---
# Mod developers
**Mod-Autorinnen und -Autoren** — eigene Mods bauen (Hooks, Konfiguration, Debug). Überblick über alle Rollen: [By audience](/wiki/topics/audiences/overview).
- [By audience — intermediates / professionals](/wiki/audiences/intermediates) and [professionals](/wiki/audiences/professionals)
- Wiki: [Framework overview](/wiki/mods/framework)
- Imported: [ModDevs](/wiki/wiki-import/ModDevs/), [Modding guide](/wiki/wiki-import/Modding-Guide), [Mod config system](/wiki/wiki-import/Mod-Config-System)
- Imported: [Standalone mods](/wiki/wiki-import/StandaloneMods)

View File

@@ -0,0 +1,12 @@
---
title: Multiplayer & networking
sidebar_label: Multiplayer & networking (hub)
description: P2P roadmap, Web UI bridge, multiplayer plugin — entry points.
---
# Multiplayer & networking
- Wiki: [FFM.Plugin.Multiplayer](/wiki/mods/plugins/ffm-plugin-multiplayer)
- Release: [FFM.Plugin.Multiplayer release](/wiki/releases/plugins/ffm-plugin-multiplayer-release)
- Imported: [Steamworks P2P multiplayer roadmap](/wiki/wiki-import/Steamworks-P2P-Multiplayer-Roadmap)
- Imported: [Web UI bridge](/wiki/wiki-import/Web-UI-Bridge)

View File

@@ -0,0 +1,17 @@
---
title: Reference & technical
sidebar_label: Reference & technical
description: Mapping tables, hook naming, generated catalogs, release channels.
---
# Reference & technical
Authoritative reference material for the framework and documentation site.
- [Wiki mapping](/wiki/reference/wiki-mapping) — how paths line up across systems.
- [Mod store vision](/wiki/reference/mod-store-vision) — product direction notes.
- [FMF hook naming](/wiki/reference/fmf-hook-naming) — conventions for hook identifiers.
- [FMF hooks catalog](/wiki/reference/fmf-hooks-catalog) — generated listing from framework sources.
- [Release channels](/wiki/reference/release-channels) — how builds are staged.
See also [FFI, hooks & Lua](/wiki/topics/ffi-and-hooks/overview) for imported deep dives from the legacy wiki.

View File

@@ -0,0 +1,12 @@
---
title: Roadmap & planning
sidebar_label: Roadmap & planning
description: Unified roadmap and mod-store staging notes.
---
# Roadmap & planning
- [Unified roadmap](/wiki/roadmap/unified-roadmap) — cross-cutting priorities.
- [Mod store stages](/wiki/roadmap/mod-store-stages) — staged rollout concepts.
Imported context: [ROADMAP](/wiki/wiki-import/ROADMAP), [TASKLIST](/wiki/wiki-import/TASKLIST), [Repository status](/wiki/wiki-import/Repository-Status-2026-04-04).

View File

@@ -0,0 +1,16 @@
---
title: Security & legal
sidebar_label: Security & legal (hub)
description: Licenses, disclaimers, developer correspondence — links into wiki-import.
---
# Security & legal
Curated links into imported pages (canonical text may live under `wiki-import/`).
- [License / legal (EN)](/wiki/wiki-import/License-Legal)
- [Lizenz / Rechtliches (DE)](/wiki/wiki-import/Lizenz-Rechtliches)
- [Disclaimer (End user)](/wiki/wiki-import/EndUser/Reference/Disclaimer)
- [Brief an WASEKU](/wiki/wiki-import/Brief-an-WASEKU) / [Letter to WASEKU (EN)](/wiki/wiki-import/Letter-to-WASEKU)
For repository licensing, see the root `LICENSE.txt` in the GitHub repo.

View File

@@ -0,0 +1,24 @@
---
title: Sponsors & support
sidebar_label: Sponsors (hub)
description: Für Unterstützerinnen und Unterstützer — Sponsoring, Transparenz, englische Detailseiten.
---
# Sponsors & support
Die Community finanziert u. a. Infrastruktur, Tools und Zeit für Pflege der Doku und des Frameworks. Hier startest du als **potenzielle Sponsorin oder Sponsor** (oder als Spielerin, die nur informieren möchte, wohin Unterstützung fließt).
## Kurzüberblick
- **Englisch (ausführlich):** [Sponsors (EN)](/wiki/wiki-import/Sponsors) — Optionen (z.B. GitHub Sponsors), Nutzung von Mitteln, rechtlicher Kontext.
- **Deutsch:** [Sponsoren](/wiki/wiki-import/Sponsoren) — gleiche Themen, wo vorhanden auf Deutsch.
- **Dank:** [Community Thanks](/wiki/wiki-import/Community-Thanks) (Import), [Changelog & versions](/wiki/wiki-import/Changelog-Versions) für Release-Transparenz.
## Verknüpft
- [Security & legal](/wiki/topics/security-legal/overview) — Lizenz, Haftungsausschlüsse, Brief an die Entwickler.
- [License & legal (EN)](/wiki/wiki-import/License-Legal) — rechtlicher Rahmen des Projekts.
:::note Zielgruppe
Diese Seite richtet sich an **Sponsorinnen, Sponsoren und Fördernde**. Spielerinnen und Spieler finden den Einstieg unter [End users](/wiki/topics/end-user/overview); Mod-Autoren unter [Mod developers](/wiki/topics/mod-developers/overview); Mitwirkende am Repo unter [Contributors (workflow)](/wiki/topics/contributors/overview).
:::

View File

@@ -0,0 +1,52 @@
---
title: Legacy wiki import
sidebar_label: Legacy wiki import
description: How GitHub Wiki content is mirrored into docs/wiki-import, sorted in the sidebar, and kept in sync with the repo.
---
# Legacy wiki import
All material under **`docs/wiki-import/`** is part of the **GitHub Wiki mirror**: it is meant to track the wiki that lives alongside the repository, while the rest of **`docs/`** holds **curated** pages (topics, mods, reference).
For a **map of the whole `docs/` tree**, see **[Documentation layout (`docs/`)](../../README.md)**.
## Why this exists
- **Search & versioning**: Wiki text is in Git, reviewable in PRs, and indexed by the site.
- **i18n**: Paired `Page.md` (DE) + `Page-en.md` (EN) are split by `wiki:normalize-i18n` into the default locale and `wiki/i18n/de/...`.
- **Sorting**: Audience trees (`EndUser/`, `ModDevs/`, `Contributors/`, `TechnicalReference/`, `DataCenterFAQ/`) use `_category_.json` **positions** so the sidebar order matches intent, not only AZ. Root **`Home`** uses `sidebar_position: 1` so it appears first among loose pages.
## Keep the mirror up to date
1. Clone or pull the wiki repo into **`.wiki/`** at the **repository root** (same level as `docs/`):
```bash
git clone https://github.com/<org>/<repo>.wiki.git .wiki
```
2. From **`wiki/`** (the Docusaurus app):
```bash
npm run wiki:refresh
```
This runs **`wiki:sync`** (copy `.wiki` → `docs/wiki-import/`) and then **`wiki:normalize-i18n`**. If `.wiki` is missing, `wiki:sync` exits with an error; run `wiki:normalize-i18n` alone only when you are fixing splits without pulling the wiki.
3. Commit changes under **`docs/wiki-import/`** and **`wiki/i18n/de/...`** as needed, then open a PR.
## Editorial policy (recommended)
| Goal | Action |
|------|--------|
| **Short-term fix** on the live site | Edit files under `docs/wiki-import/` (and DE mirror if applicable). Optionally backport to `.wiki` so the next sync does not overwrite you. |
| **Canonical, long-term doc** | Add or move content into **`docs/topics/`**, **`docs/reference/`**, or **`docs/mods/`**, and link from the legacy page. |
| **Duplicate path** | The folder **`Contirbutors/`** is a typo duplicate of **`Contributors/`**; prefer **`Contributors/`** for new links. |
## Entry points (English default locale)
- [Home](/wiki/wiki-import/Home) — audience hub.
- [End users](/wiki/wiki-import/EndUser/) · [Mod developers](/wiki/wiki-import/ModDevs/) · [Contributors](/wiki/wiki-import/Contributors/)
- [Technical reference](/wiki/wiki-import/TechnicalReference/) · [Data Center FAQ](/wiki/wiki-import/DataCenterFAQ/)
- [HOOKS](/wiki/wiki-import/HOOKS) · [FFI bridge reference](/wiki/wiki-import/FFI-Bridge-Reference)
The sidebar **Topics → Legacy wiki import** lists the **full** tree (autogenerated), not only these links.

9
wiki-import/AI-USAGE.md Normal file
View File

@@ -0,0 +1,9 @@
---
title: AI-USAGE
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,9 @@
---
title: Architecture
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,9 @@
---
title: AssetExport
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,9 @@
---
title: Bekannte Inkompatibilitäten
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,9 @@
---
title: Brief an WASEKU (Data Center)
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,9 @@
---
title: Changelog & Versionen
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,9 @@
---
title: Changelog & Versions EN
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,9 @@
---
title: Community Thanks
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,9 @@
---
title: Contributors (Debug) EN
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,5 @@
{
"label": "Contributors (typo path — prefer Contributors/)",
"position": 60,
"key": "wiki-import-root-contributors-typo"
}

View File

@@ -0,0 +1,9 @@
---
title: Contributors-Debug
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,9 @@
---
title: Contributors (Debug) EN
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

View File

@@ -0,0 +1,9 @@
---
title: Contribution-Workflow
description: English translation pending; use the Deutsch locale for the full legacy page.
---
:::note
This page is available in **German** in the legacy wiki import. Use the language menu (**Deutsch**) for the full text, or contribute an English translation under `docs/wiki-import`.
:::

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