- Node.js 24 (matches
serverless.ymlruntime) - AWS CLI with profiles
AbstractPlayDevandAbstractPlayProdin~/.aws/credentials - Access to the
@abstractplayGitHub Packages scope
npm install
npm run buildnpm run build runs ESLint and TypeScript typecheck (tsc --noEmit). Lambda handlers are bundled at deploy time by serverless-esbuild; there is no separate lib/*.js compile step.
Ops scripts under bin/ that only talk to AWS run with node bin/<script>.mjs. Scripts that import lib/*.ts (e.g. dump-dashboard, import-bgg-wishlist, import-discord-feedback) run via tsx — see npm run dump-dashboard, npm run import-bgg-wishlist, and npm run import-discord-feedback. BGG and Discord imports accept optional user maps (bin/bgg-ap-user-map.json, bin/discord-ap-user-map.json; see .example.json files for format).
Private packages require a .npmrc:
@abstractplay:registry=https://npm.pkg.github.com/
//npm.pkg.github.com/:_authToken=<PAT with read:packages>
CI creates this from the PAT_READ_PACKAGES secret (see .github/workflows/deploy-dev.js.yml).
To test against a local rules engine build:
npm install /path/to/gameslib.tgzOr point at a packed tarball from a gameslib checkout.
Lambda env vars are set in serverless.yml. Secrets are injected in CI from GitHub Actions secrets:
| Variable | Purpose |
|---|---|
TOTP_KEY |
Organizer TOTP validation |
VAPID_PUBLIC_KEY / VAPID_PRIVATE_KEY |
Web push |
OPENSSH_PRIVATE_KEY |
Some maintenance/crypto paths |
TEST_BOT_CLIENT_ID / TEST_BOT_CLIENT_SECRET |
Dev reference bot (dev only) |
Do not commit secret values. Names only are listed here.
The testBot Lambda is enabled on the dev stage only. Full protocol documentation is in the header of api/testBot.ts. See Bots.
api/ Main Lambda handlers (abstractplay.ts, sockets/, testBot.ts)
lib/ Shared libraries (bots, DDB, WebSocket broadcast)
utils/ Scheduled jobs (yourturn, bot-outbound consumer)
locales/ i18n strings for emails and push notifications
serverless.yml Infrastructure and function definitions