Skip to main content

Contributing

Monorepo conventions

  • Package manager: pnpm 10+ with workspaces
  • TypeScript: strict mode, ES modules
  • Runtime model: Effect services and typed error channels
  • Formatting: oxfmt
  • Testing: vitest
  • Task graph: Nx derives package order from declared dependencies

Branches and releases

  • main is the only long-lived branch; every change lands there by pull request.
  • Releases are manual runs of .github/workflows/publish.yml. One run publishes the five public packages at one calendar version, pushes the simulator images tagged with it, and commits the digests and changelog stamp. The identities and repository settings a release needs are listed under Release publishing in packages/simulator/gke/README.md.
  • Authority for design work is docs/vision.md, then the decision records, then docs/spec/; see AGENTS.md.

Before submitting a PR

Documentation

The docs site at docs/ is built with Mintlify. Source JSDoc generates per-folder module pages, and source-owned constants generate shared snippets. Run pnpm docs:generate before landing changes to either surface.
  • Guides and development pages: edit the MDX files directly in docs/.
  • Module pages and constants: edit their source or generator, then run pnpm docs:generate.
  • Reusable content: shared snippets live in docs/snippets/.

Code style

  • Decode network, disk, environment, and dynamic-import inputs with Effect Schema.
  • Declare branded domain values in their owning package.
  • Keep typed errors in the Effect error channel.
  • Prefer integration tests at real process and storage boundaries.