Files
shacraft-launcher/AGENTS.md
T
emil28092005 cc19a24e45 feat: install and launch Minecraft with NeoForge and Microsoft login
Wires up the actual game pipeline behind the existing ShaCraft manifest
sync: Mojang version resolution, Java 21 auto-provisioning via Adoptium,
headless NeoForge installation, real Microsoft/Xbox/Minecraft Services
login, and an offline account mode, then builds and spawns the java
process itself.

- mojang.rs: vanilla trust boundary, inheritsFrom version-JSON merge,
  asset/library downloading with a worker pool and per-file retries
- neoforge.rs: runs NeoForge's own installer headlessly, with live
  progress parsed from its output against its own install_profile.json
- runtime.rs / java.rs: detects a usable local Java or provisions one
  from Eclipse Temurin, with real download progress
- msa.rs: device-code OAuth -> Xbox Live -> XSTS -> Minecraft Services,
  gated on ShaCraft registering its own Azure AD app (see MSA_CLIENT_ID)
- session.rs / launch.rs: offline deterministic UUIDs and the merged
  java invocation itself
- download.rs: shared verified-download helper (temp file, hash,
  atomic rename, retries, progress) used across all of the above and
  refactored into profile.rs
- UI: account mode toggle (Microsoft/offline), login modal, and real
  per-stage install progress instead of start/done placeholders
2026-09-06 05:09:50 +03:00

4.6 KiB

ShaCraft Launcher — agent context

Purpose and scope

Cross-platform desktop launcher for the ShaCraft Minecraft network. It is a Tauri 2 application: React/Vite is the UI and Rust owns all filesystem, network and process-adjacent work. The current production profile is Aeronautics (Minecraft 1.21.1, NeoForge 21.1.248, Java 21).

This repository owns the launcher only. The server-side API and published payload are in /root/shacraft on the ShaCraft host; see docs/launcher-architecture.md before changing an integration boundary.

Non-negotiable boundaries

  • Launcher-managed payload is limited to ShaCraft-owned configuration and approved modpack files. Never make arbitrary URLs, shell commands, or local paths controllable by a remote manifest.
  • Do not add private keys, OAuth secrets, .env values, player data, or built artifacts to Git.

Trust model

  • The only supported remote profile endpoint is https://shacraft.ru/api/launcher/v2/profiles/aeronautics/signed-manifest.
  • The response is an Ed25519 envelope. src-tauri/src/remote.rs verifies its embedded public key and keyId before parsing the payload.
  • src-tauri/src/manifest.rs then validates paths, SHA-256, sizes, HTTPS and allowed ShaCraft hosts. Do not weaken this whitelist.
  • src-tauri/src/profile.rs downloads to a temporary sibling file, verifies size + SHA-256, and atomically replaces only launcher-managed files.
  • This ShaCraft manifest is the only source of truth for which Minecraft version / NeoForge version / Java major a profile needs (Manifest.minecraft) and for mod/config files. It never supplies a URL for the game itself — see docs/game-trust-boundary.md for the four independent, hardcoded-host trust domains (Mojang, NeoForge, Microsoft, Adoptium) that install and run the actual game. Do not let manifest data control a URL in any of those domains.
  • Account modes: the launcher supports launching as either a genuine Microsoft account that owns Minecraft Java Edition (src-tauri/src/msa.rs, device-code OAuth -> Xbox Live -> XSTS -> Minecraft Services) or as a local offline profile (nickname + deterministic offline UUID, see src-tauri/src/session.rs). The mode is an explicit player choice (account_mode in settings); offline is never silently substituted for a Microsoft session. The mc-aoc/mc-create servers' own ONLINE_MODE=FALSE + whitelist + Login System are a separate, independent access-control layer on the server side.

Layout

  • src/main.tsx — UI state and Tauri command calls; do not put privileged operations in the web layer.
  • src-tauri/src/ — native commands and security-sensitive logic.
    • download.rs — shared verified-download helper (temp file, hash, atomic rename, progress callback); manifest.rs/profile.rs (ShaCraft mods) and mojang.rs/neoforge.rs/runtime.rs (the game itself) all build on this rather than each rolling their own.
    • mojang.rs — vanilla Minecraft trust boundary + the generic inheritsFrom version-JSON merge (shared with NeoForge's profile).
    • neoforge.rs — runs NeoForge's official installer headlessly.
    • runtime.rs — Java 21 auto-provisioning via Eclipse Adoptium.
    • msa.rs — Microsoft/Xbox/Minecraft Services login; see MSA_CLIENT_ID's doc comment before touching login — it is currently a placeholder pending ShaCraft's own Azure AD app registration and Minecraft-API approval.
    • launch.rs — builds and spawns the actual java process.
  • src-tauri/src/settings.rs — durable local preferences; maintain backward compatibility with already-written JSON.
  • docs/manifest-v1.md — signed manifest envelope and payload contract (mods/config only).
  • docs/game-trust-boundary.md — the Mojang/NeoForge/Microsoft/Adoptium trust domains used to install and run the game itself.
  • .github/workflows/build.yml — manual cross-platform build matrix.

Verification

Run from repository root:

npm run build
(cd src-tauri && /home/emil/.cargo/bin/cargo test)
npm run tauri:dev

tauri:dev is for local desktop testing. A successful web build alone does not prove Tauri commands work.

Working conventions

  • Keep UI copy in Russian; code, identifiers and errors may remain English.
  • Prefer a small vertical slice with tests over unused abstractions.
  • Existing working-tree changes belong to the user unless this task created them. Inspect git status before staging.
  • Update this file and docs/launcher-architecture.md whenever the trust model, endpoint contract, storage layout, or release workflow changes.