Zero-setup SDK generator wrapping OpenAPI Generator
Project description
swain_cli
swain_cli is a zero-setup CLI around OpenAPI Generator. It downloads a pinned OpenAPI Generator JAR plus a trimmed Temurin JRE on demand and caches everything per user so you can build SDKs consistently without installing Java yourself.
Highlights
- Generate SDKs for multiple languages with a single command or an interactive wizard
- Ship exactly what you test with OpenAPI Generator
7.6.0pinned inside the toolchain - Launch the embedded OpenJDK 21 runtime automatically (or opt into your own
java) - Keep dependencies light (Typer, httpx, questionary, platformdirs, keyring, pooch) so
pipx, CI, and ephemeral environments stay happy - Inspect and manage the embedded engine with helper commands (
engine,doctor,list-generators)
Installation
Binary (no Python required)
- macOS/Linux:
curl -fsSL https://raw.githubusercontent.com/takifouhal/swain_cli/HEAD/scripts/install.sh | bash
- Windows (PowerShell):
iwr -useb https://raw.githubusercontent.com/takifouhal/swain_cli/HEAD/scripts/install.ps1 | iex
The single-file binary bundles a Python runtime, so no system Python is needed. On first run, swain_cli downloads a trimmed Temurin JRE plus the pinned OpenAPI Generator JAR and caches them.
Notes:
- Linux arm64 is supported (built via emulated runner).
- Windows on ARM uses the x86_64 binary and runs under emulation.
- Installers verify SHA-256 checksums when available; set
SWAIN_CLI_INSTALL_REQUIRE_CHECKSUM=1to require them.
Homebrew (macOS + Linux)
We publish the same single-file binaries through a lightweight tap so you can manage upgrades via Homebrew.
brew tap takifouhal/swain_cli https://github.com/takifouhal/swain_cli
brew install takifouhal/swain_cli/swain_cli
Homebrew installs the PyInstaller binary, so no additional Python dependencies are required. Upgrade with brew upgrade takifouhal/swain_cli/swain_cli.
pip/pipx (requires Python 3.8+)
pipx install swain_cli
Installing with pipx keeps swain_cli isolated; alternatively run pip install swain_cli in a virtual environment.
Quick start
# Prime the embedded runtime so the first real run is instant
swain_cli engine install-jre
# Explore generators and craft a command via guided prompts
swain_cli interactive
# List all generators (delegates to the pinned OpenAPI Generator)
swain_cli list-generators
# Generate Python and TypeScript clients into ./sdks/<generator>
swain_cli gen -i ./openapi.yaml -l python -l typescript -o ./sdks \
-p packageName=my_api_client -p packageVersion=0.3.0
swain_cli streams generator output directly so you see progress in real time.
Generating SDKs
swain_cli genaccepts every OpenAPI Generator flag you already know (-c,-t,-p, etc.) and repeatable-l/--langoptions.- By default the CLI talks to
https://api.swain.technologyfor Swain discovery and downloads the CrudSQL dynamic swagger fromhttps://api.swain.technology/crud. Override with--swain-base-url(platform) and/or--crudsql-url(CrudSQL), or point to a local spec via-i/--schema. Example local backend:swain_cli interactive --swain-base-url http://localhost:8080(infers CrudSQL ashttp://localhost:8080/crud). - Swain project integration: provide
--swain-project-idand--swain-connection-idto resolve the deployed connection swagger automatically after authenticating. The CLI will find the active build, fetch/api/dynamic_swagger, and feed it to the generator. - JVM tuning: runs start with
-Xms2g -Xmx10g -XX:+UseG1GC. If the build still runs out of memory the CLI retries at-Xmx14g. Supply extra options with--java-opt(repeatable) or exportSWAIN_CLI_JAVA_OPTS. - Docs/tests are disabled by default via
--global-property=apiDocs=false,apiTests=false,modelDocs=false,modelTests=false; override with your own--generator-argwhen you need them. - Operation examples are skipped by default (
--skip-operation-example) to avoid OpenAPI Generator blowing up on circular schemas; pass your own generator arg to opt back in if you really need them. - To match modern OAS defaults the CLI automatically adds
-p disallowAdditionalPropertiesIfNotPresent=false. Opt into stricter behaviour with-p disallowAdditionalPropertiesIfNotPresent=trueor a generator config file. - The
typescriptshortcut maps totypescript-axios; requesttypescript-fetchexplicitly when you need that runtime.
Command reference
swain_cli interactive— ask a short set of questions, preview the matchingswain_cli gencommand, and optionally run it on the spot. Seed the wizard with--java-optand pass raw OpenAPI Generator flags via--generator-argso interactive runs match your scripts.swain_cli list-generators— enumerate all generators provided by the pinned OpenAPI Generator JAR. Add--engine systemto validate a local Java installation instead.swain_cli doctor— print environment information, cache paths, installed JREs, and JAR availability to help diagnose setup issues.swain_cli auth— manage credentials for hosted Swain services (login,logout,status). Tokens live in the system keyring; useSWAIN_CLI_AUTH_TOKENfor ephemeral automation.swain_cli engine <action>— switch between the embedded runtime and your system Java, install the JRE ahead of time, or update the pinned JAR.
Run swain_cli --help or swain_cli <command> --help for full usage.
Authentication
Use the auth subcommands to prepare credentials before generating SDKs against hosted Swain projects.
swain_cli auth login— authenticate via username/password (POST /auth/login). Access and refresh tokens are stored in the system keyring.- Refresh tokens are stored for future use; the CLI does not currently auto-refresh expired access tokens.
- For ephemeral automation, set
SWAIN_CLI_AUTH_TOKEN(takes precedence over the keyring). swain_cli auth status— inspect the active token source and storage location.swain_cli auth logout— clear the stored token.- The interactive wizard checks for a token before listing projects and will prompt you to sign in if missing.
Engine modes and caching
- Embedded engine (default) — the first run downloads a platform-specific Temurin JRE and caches it alongside the pinned OpenAPI Generator JAR under
~/.cache/swain_cli(Linux),~/Library/Caches/swain_cli(macOS), or%LOCALAPPDATA%\swain_cli\cache(Windows). Override withSWAIN_CLI_CACHE_DIR. - Custom asset base (advanced) — set
SWAIN_CLI_ASSET_BASEto override where embedded JRE archives are downloaded from. - System engine — add
--engine system(or exportSWAIN_CLI_ENGINE=system) to run with whateverjavais already onPATH. - Offline use — prime the cache via
swain_cli engine install-jreandswain_cli engine update-jar --version 7.6.0(or runswain_cli list-generatorsonce) or copy an existing cache directory between machines.
Running in CI
- Install the package (
pipx install swain_cliorpip install swain_cli). - Pre-install the embedded runtime during setup:
swain_cli engine install-jre. - Cache the swain_cli cache directory between jobs to reuse downloads.
- Invoke
swain_cli genwith your schema and desired generators; capture./sdks(or your chosen output path) as build artefacts.
Troubleshooting
- Download failures — check proxy/firewall configuration, or download the JRE asset manually from the GitHub release and place it under the cache path from
swain_cli doctor. - Missing generators — run
swain_cli list-generators --engine systemto validate your local Java installation or after updating the JAR withengine update-jar. - Cache cleanup — delete the directory printed by
swain_cli doctorto force a clean fetch of the runtime and JAR. - OutOfMemoryError — the CLI already retries with a larger heap. For massive specs raise the ceiling with repeatable
--java-opt -Xmx16gor setSWAIN_CLI_JAVA_OPTS.
Contributing
- Create a virtual environment (
python -m venv .venv) and activate it. - Install the project with dev + lint extras:
pip install -e .[dev,lint]. - Run the CLI locally via
python -m swain_cli --help,python -m swain_cli.cli --help, or theswain_clientry point. - Run checks:
./scripts/check.sh(macOS/Linux) orpowershell -File scripts/check.ps1(Windows).
Maintainers
- Trigger the
build-jreworkflow (workflow dispatch) to build trimmed JRE archives for Linux (x86_64 + arm64), macOS (Intel + Apple Silicon), and Windows. Provide an optionalrelease_tagto publish directly to ajre-<version>release. - Use
python scripts/sync-jre-checksums.py combined-checksums.txt --writeto updateswain_cli/constants.py(theJRE_ASSETSmapping) and updateASSET_BASE(or setSWAIN_CLI_ASSET_BASE) if you move assets to a new release tag. - Tag releases (
git tag vX.Y.Z) once assets are ready. The full release runbook lives indocs/RELEASING.md.
Third-party notices
- OpenAPI Generator (Apache 2.0)
- Eclipse Temurin OpenJDK (GPLv2 with Classpath Exception)
License
swain_cli is released under the Apache 2.0 license. See LICENSE for details.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file swain_cli-0.3.12.tar.gz.
File metadata
- Download URL: swain_cli-0.3.12.tar.gz
- Upload date:
- Size: 76.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
94a04b087b0570007bc4f9c2787a8ce8859501a2b876dc985c2c4aac12f24a74
|
|
| MD5 |
3d9ce86c7eaf3e7366056a11fb142511
|
|
| BLAKE2b-256 |
d9f830b2aa9e049219bb1c6cd3b51efa2ac56a1aa03c8bda24d20ede46e522b8
|
Provenance
The following attestation bundles were made for swain_cli-0.3.12.tar.gz:
Publisher:
release.yml on takifouhal/swain_cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
swain_cli-0.3.12.tar.gz -
Subject digest:
94a04b087b0570007bc4f9c2787a8ce8859501a2b876dc985c2c4aac12f24a74 - Sigstore transparency entry: 835155533
- Sigstore integration time:
-
Permalink:
takifouhal/swain_cli@94a8d78ce73f0dcc0dc1e7ba3e751f633824c17a -
Branch / Tag:
refs/tags/v0.3.12 - Owner: https://github.com/takifouhal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@94a8d78ce73f0dcc0dc1e7ba3e751f633824c17a -
Trigger Event:
push
-
Statement type:
File details
Details for the file swain_cli-0.3.12-py3-none-any.whl.
File metadata
- Download URL: swain_cli-0.3.12-py3-none-any.whl
- Upload date:
- Size: 39.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
441234993de639692f8855dc4dc1d0f3c3e7cf8d0d27a5a33fbb2c501bd2c765
|
|
| MD5 |
659efc113fa97abb2a682a8a8faf2c21
|
|
| BLAKE2b-256 |
4d3cb83d089d2c33638892b7c3927e739846172d59e3da3aaafb9bd4165b855e
|
Provenance
The following attestation bundles were made for swain_cli-0.3.12-py3-none-any.whl:
Publisher:
release.yml on takifouhal/swain_cli
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
swain_cli-0.3.12-py3-none-any.whl -
Subject digest:
441234993de639692f8855dc4dc1d0f3c3e7cf8d0d27a5a33fbb2c501bd2c765 - Sigstore transparency entry: 835155577
- Sigstore integration time:
-
Permalink:
takifouhal/swain_cli@94a8d78ce73f0dcc0dc1e7ba3e751f633824c17a -
Branch / Tag:
refs/tags/v0.3.12 - Owner: https://github.com/takifouhal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@94a8d78ce73f0dcc0dc1e7ba3e751f633824c17a -
Trigger Event:
push
-
Statement type: