Built from source via a git submodule pinned to a tag, not a published image — the Dockerfile, main.ts, and manifest should never need to change for an ordinary version bump, only the submodule pin (see UPDATING.md). One volume, one interface serving the browser client + lobby/intent API + SSE stream from a single origin, no dependencies. The server-wide join secret (D14) is seeded on install, exposed via the Get Join Secret action, and blocks start behind a critical task until retrieved — the same first-set/rotation pattern as actual-budget-startos's admin password. Verified on phoenix.local: installs, the critical task correctly blocks an ordinary start, force-starting confirms the daemon binds its port and serves the client, and store.json correctly holds the install-seeded join secret. Not verified: the Get Join Secret action's execution end-to-end — start-cli's `package action run` fails with a client-side deserialization error that reproduces identically against actual-budget's already-shipped equivalent action, so this looks like a start-cli issue rather than a defect here. icon.svg is still the scaffold's hello-world placeholder — no real Station Master icon exists yet to ship in its place.
3.3 KiB
AGENTS.md
This is a StartOS service-package repository — it builds a .s9pk for StartOS.
Develop it inside a StartOS packaging workspace created by start-cli s9pk init-workspace,
which provides the packaging guide and agent context one level up. If you're reading this in a
bare clone with no workspace, the full guide is at https://docs.start9.com/packaging.
Start every task at the recipe index — ../start-technologies/projects/start-sdk/docs/src/recipes.md
(or https://docs.start9.com/packaging/recipes.html). It maps an intent ("prompt the user to create
admin credentials", "expose a web UI") to the constructs, the reference pages, and a named production
package to copy. Find the recipe before you read this package's neighbours: a package you reach by
grepping may be non-conformant, and the recipe outranks it.
Freshly scaffolded? Work the New Package Checklist (or https://docs.start9.com/packaging/new-package-checklist.html) from top to bottom. It is a guide page, not a file in this repo — read it, don't copy it in.
Keep README.md (technical reference for an AI support or administering agent) and
instructions.md (end-user docs) in sync with your changes.
Bugs and feature requests are issues on this repo (self-hosted Gitea, not GitHub) — file
them as you find them. Don't record work in the repo instead: no TODO.md, no NOTES.md, no
PLAN.md. What you verified, tried, and decided belongs in the commit message and the PR body.
This repo
- Station Master is a git submodule (
station-master/), not vendored source. It tracks Jesse's own game repo, self-hosted, pinned to a tag. SeeUPDATING.mdfor how the pin is bumped — theDockerfile,main.ts, and the manifest should never need to change for an ordinary version bump. - Built from source, not a published image. The
Dockerfileis entirely this repo's own: anode:*-slimbuilder stage runs the submodule'snpm run build:webto produce the static client, then a runtime stage copies onlypackage.json,src/, and the builtdist/— nonode_modules, sincesrc/server/index.tshas zero runtime dependencies (see the submodule's ownTODO.mdfor why) and Node's native TypeScript type-stripping means it needs no compile step either. - The join secret (D14 in the game's
docs/architecture/multiplayer.md) is this package's one piece of state beyond the game data itself.startos/fileModels/store.json.tsholds it, seeded on install (startos/init/generateJoinSecret.ts) since the server refuses to start without one, and rotated by the Get Join Secret action (startos/actions/getJoinSecret.ts) — the same action handles first retrieval and rotation, perrecipe-admin-credentials.md. - One volume, one interface, no dependencies. Everything the server persists —
store.jsonand every game's own save data — lives on thedatavolume; the singleuiinterface carries the browser client, the lobby/intent HTTP API, and the SSE game stream from one port, which is what keeps players reachable from different addresses in the same game (docs/architecture/deployment.md§3 in the game repo).