- Root workspace:
C:/Users/hyper/workspace/bg/ - bobsgameweb:
C:/Users/hyper/workspace/bg/bobsgameweb/(Vite + TS + PixiJS v8 web port) - okgame:
C:/Users/hyper/workspace/bg/okgame/(C++20 + SDL3 native engine) - bobsgameonlinejava:
C:/Users/hyper/workspace/bg/bobsgameonlinejava/(Java 21 + LibGDX) - All three are git submodules under
robertpellonion GitHub - Feature branches in bobsgameonlinejava (
fix-build-and-backport-gametype-*,modernize-codebase-final-final) are 0 commits ahead of main — already merged, safe to ignore
- Frontend: Hetzner VPS at
5.161.250.43, nginx serves static files from/var/www/bobsgame.com/current - Backend:
ws.bobsgame.com, Node.js Socket.io server at/opt/bobsgameweb/server, managed by systemdbobsgameweb-server - Deploy scripts:
scripts/deploy-frontend-hetzner.shandscripts/deploy-backend-vps.sh - Must use
BACKEND_FORCE_TAR=1— rsync fails on Windows/Cygwin; tar-over-SSH works - Build command:
npx vite builddirectly —npm run buildfails with "paging file too small" git error on Windows - SSL: Let's Encrypt via certbot on the VPS
- Health check:
curl -s https://ws.bobsgame.com/healthz
- Root
VERSION.mdcontains just the version string (e.g.,2.1.75) - Version must be bumped in:
VERSION.md,package.json,src/renderer/scenes/MainMenuScene.ts,server/index.js - Version displayed in bottom-right of main menu
- Every deploy gets a new version number
- Commit message references version bump
- No
strokeThicknesson TextStyle — usestrokeproperty instead - No
FillGradientin TextStyle — it serializes to garbage; usefill: [0xffffff, 0x00ffff]color arrays ImageDataconstructor needsnew Uint8ClampedArray()for proper ArrayBuffer typeisolatedModulesrequiresexport type { X }for type-only re-exports- MiniGameEngine.render() returns void, not Container
- MiniGameEngine.container is protected, accessible in subclasses
- BobMenu.cursorPosition and BobMenu.options are private — use
getCursorPosition(),getOptionAt(),getCurrentOption(),getOptions(),setCursorPosition()
- GameClock: exported as
GameClockfrom./Clock - Wallet: uses
.moneyproperty (not getters/setters) - GameSave: static methods
loadFromLocal(slotIndex)/saveToLocal(slot) - Skill: uses
getValue() - FriendCharacter.isOnline(): is a method, not a property
- SpriteData:
widthPixels/heightPixels(notgetImageWidth),animationList(notgetAnimationList),getAnimation()(notgetAnimationByName()), sequences havenamenotframeSequenceName - BGClientEngine: constructor requires
(container, width, height) - GUIManager: constructor requires
(container, width, height), hasisAnyMenuOpen()(notisAnyPanelOpen()) - StatusBar: constructor requires
StatusBarConfig { width, height? } - Player/Character: x/y are public properties (no setPosition method)
- StateManager: constructor requires a Container
- Every subsystem has
index.tswith explicit named exports - Import from
./SubPanel(same directory), not../SubPanel - Use
export type { X }for type-only exports whenisolatedModulesis enabled
- C++
private→ TypeScriptprotectedwhen subclass needs access - C++ UDP sockets → WebRTC DataChannels (
PeerConnection.ts) - C++ OpenAL → Web Audio API (
AudioUtils.ts) - Java
synchronizedmethods → no-op in single-threaded JS - Java
ArrayList→ TypeScriptArray - Java
HashMap→ TypeScriptMaporRecord - C++
shared_ptr→ TypeScript direct references (GC handles memory)
- Comments: Explain what, why, and any non-obvious decisions. Don't comment self-explanatory code.
- Naming: PascalCase for classes/interfaces/enums, camelCase for methods/properties/variables
- Imports: Use barrel exports from subsystem index files
- Error handling: Use try/catch with console.warn for non-critical failures
- No TODO blocks: Either implement or create an issue in TODO.md
- Start: Read AGENTS.md, VISION.md, MEMORY.md, ROADMAP.md, TODO.md, HANDOFF.md
- During: Update VERSION.md for each deploy, commit with version in message, push regularly
- End: Update HANDOFF.md, MEMORY.md, ROADMAP.md, TODO.md with session progress
- NDDemoScene: 2 pre-existing TypeScript errors (NDPuzzleGame and LibretroGame don't properly extend MiniGameEngine)
- okgame build: C++ build has compile/link errors (needs vcpkg/Conan modernization)
- BobGameOnlineJava feature branches: Local branches exist but are 0 ahead of main — already merged
- The project uses a monorepo with submodules structure
- Each submodule is independently deployable
- Documentation must be updated in BOTH the submodule AND the root workspace
- The
scripts/directory contains deployment automation - The
docs/ai/directory contains phase documentation (requirements, design, planning, implementation, testing) - The engine is designed for deterministic cross-platform multiplayer