Tuist for Elixir

This package provides mix tuist.login, which authenticates with Tuist and saves the session in the same credential file used by the Tuist command line tool and Gradle plugin. Build instrumentation and test reporting are planned separately.

Configure the server

You can share the Tuist server address with your team in mix.exs:

def project do
[
app: :my_app,
tuist: [url: "https://tuist.example.com"]
]
end

TUIST_URL overrides that address, as it does in the Tuist command line tool. You can also pass --url when TUIST_URL is unset. The default is https://tuist.dev. URL means Uniform Resource Locator.

Log in

mix tuist.login
mix tuist.login --email person@example.com --password secret
mix tuist.login --url https://tuist.example.com

Without credentials, the task opens a browser and waits for authorization. If you provide only --email or --password, it prompts for the missing value. On a continuous integration provider, it exchanges an OpenID Connect identity token from GitHub Actions, CircleCI, or Bitrise, matching the Tuist command line flow.

Credentials are saved under the Tuist configuration directory. The task writes them atomically with access restricted to the current user. Refreshes take a lock at the Tuist command line tool's lock path and reread the file before exchanging the refresh token, so parallel processes do not refresh the same token twice.

Development

Requires Elixir 1.18 or later. From tuist_ex/:

mix deps.get
mix format --check-formatted
mix compile --warnings-as-errors
mix test --warnings-as-errors
mix hex.build
mix docs --warnings-as-errors

Quokka is configured as a formatter plugin. mix format applies its fixes; mix format --check-formatted enforces them in automated checks. Mimic is available for test mocks. Register modules with Mimic.copy/1 in test/test_helper.exs as tests are added. The package currently has focused authentication and locking tests.

Automated checks and releases

The check workflow runs compilation, documentation, tests, formatting, and package assembly as separate jobs. Compilation checks Elixir 1.18 and the repository's current Elixir version; the other jobs use the current version.

The tuist-ex release component uses tuist-ex@ tags and scoped commits such as feat(tuist-ex): add build instrumentation. On main, the release workflow checks for a version bump, runs the same validation, publishes the package and documentation to Hex, and creates a GitHub release. Publication is serialized and never cancelled mid-release. If package publication succeeds but the GitHub release fails, a retry verifies the published package contents and resumes documentation and release creation without replacing the package. Manual releases are restricted to main.

The release workflow sets the package version from the shared release checker; the version in mix.exs is the development baseline. Release notes are generated from scoped commits using cliff.toml.

Publication reuses the repository's HEX_API_KEY secret, which also publishes Noora. Its Hex account must be the intended owner of tuist_ex and the key must have package publishing permission. The first publication requires the package name to be available. TUIST_RELEASE_GITHUB_TOKEN is used for GitHub releases when available, with the workflow token as the fallback.