Every setting on the page reaches the simulator through argv and reaches a real Java server not at all, so on a machine that has Java the MOTD, difficulty, game mode, max players, PvP and seed are silently ignored — and with a relative FORGE_APP_DATA the world lands in the wrong directory entirely.
Acceptance
[ ] One module, src/properties.ts, renders a server.properties text from a Server row — the only place that knows those key names, replacing the duplicate lists in src/engine.ts:32-45 (argv) and src/mcsim.ts:74 (properties()).
[ ] The panel writes server.properties into serverDir(id) before every start, for both engines, so motd, port, max-players, difficulty, gamemode, pvp and level-seed are what the settings say.
[ ] The Java path writes eula.txt only when a person has ticked an "I accept the Minecraft EULA" box in Settings (a column on the row, off by default), and otherwise refuses to start with a sentence pointing at that box. The panel never accepts a licence on someone's behalf.
[ ] src/mcsim.ts reads server.properties from its directory at boot instead of taking those values as argv, so both engines are configured the same way; the argv it still needs (--dir, --activity-ms) is documented in its header.
[ ] Values are escaped for the properties format: a test proves a crafted MOTD cannot add a second key or a newline, on top of the validation already in src/fields.ts.
[ ] dataDir is resolved to an absolute path (src/db.ts:13), so the README's own FORGE_APP_DATA=./data bun run src/server.ts stops nesting the world at data/servers/1/data/servers/1/. Reproduced today with exactly that command; production passes an absolute path and is unaffected.
[ ] The server page stops saying settings apply "at the next start" for values that never applied at all, and says what applies where.
[ ] Behaviour otherwise unchanged: every test that passed before passes after, unchanged, and each new behaviour has a test that fails without it.
[ ] The README's "Real or simulated" section says how a real jar gets configured and what the EULA box does.
Writing server.properties on every start overwrites edits made on disk by hand — the page has to say so. The absolute-path fix moves where an existing local install's data lives; call it out in the pull rather than migrating anything silently. Refusing to start without the EULA box is a new way for Start to fail, so the sentence has to be the one a person needs.
Who
Mason — this is duplicated logic folded into one module and a boundary made explicit, with the one behaviour change the issue asks for and characterization tests around the engine before it moves.
Every setting on the page reaches the simulator through argv and reaches a real Java server not at all, so on a machine that has Java the MOTD, difficulty, game mode, max players, PvP and seed are silently ignored — and with a relative
FORGE_APP_DATAthe world lands in the wrong directory entirely.Acceptance
src/properties.ts, renders aserver.propertiestext from aServerrow — the only place that knows those key names, replacing the duplicate lists insrc/engine.ts:32-45(argv) andsrc/mcsim.ts:74(properties()).server.propertiesintoserverDir(id)before every start, for both engines, so motd, port, max-players, difficulty, gamemode, pvp and level-seed are what the settings say.eula.txtonly when a person has ticked an "I accept the Minecraft EULA" box in Settings (a column on the row, off by default), and otherwise refuses to start with a sentence pointing at that box. The panel never accepts a licence on someone's behalf.src/mcsim.tsreadsserver.propertiesfrom its directory at boot instead of taking those values as argv, so both engines are configured the same way; the argv it still needs (--dir,--activity-ms) is documented in its header.src/fields.ts.dataDiris resolved to an absolute path (src/db.ts:13), so the README's ownFORGE_APP_DATA=./data bun run src/server.tsstops nesting the world atdata/servers/1/data/servers/1/. Reproduced today with exactly that command; production passes an absolute path and is unaffected.Files I expect to change
src/properties.ts(new),src/engine.ts,src/mcsim.ts,src/runtime.ts,src/db.ts,src/fields.ts,src/pages/server.ts,src/server.test.ts,README.md.Risks
Writing
server.propertieson every start overwrites edits made on disk by hand — the page has to say so. The absolute-path fix moves where an existing local install's data lives; call it out in the pull rather than migrating anything silently. Refusing to start without the EULA box is a new way for Start to fail, so the sentence has to be the one a person needs.Who
Mason — this is duplicated logic folded into one module and a boundary made explicit, with the one behaviour change the issue asks for and characterization tests around the engine before it moves.