curl -fsSL https://get.wagoe.org | bash
Standalone CLI tool for bootstrapping new Wagoe projects and adding optional modules. Installed via bbin — does not require the monorepo. Generated projects are fully self-contained.
Published to Clojars as com.wagoe/wagoe-cli, in lockstep with the rest of
the suite. As a CLI you normally install it with bbin rather than declaring it as
a dependency.
|
curl -fsSL https://get.wagoe.org | bash
The installer handles all prerequisites: JVM, Clojure CLI, Babashka, bbin, and the wagoe command itself.
Supports macOS, Debian/Ubuntu, Fedora/RHEL, Arch Linux, and WSL2.
Fallback if get.wagoe.org is unavailable:
curl -fsSL https://raw.githubusercontent.com/wagoebv/wagoe/main/scripts/install.sh | bash
wagoe new my-app # Scaffold a new project
wagoe new my-app --force # Write into a directory that is not empty
wagoe new my-app --skip-git # Do not run git init
wagoe new my-app --no-user # Leave out the user module
Generates a complete project with four core modules pre-wired: core, observability, platform, and user. The project is immediately runnable after clojure -M:migrate up.
--no-userThe user module brings authentication, sessions, MFA and an audit trail, and
the four tables behind them: users, auth_users, user_sessions and
user_audit_log. Most applications want it, so it is on by default.
An application with no accounts does not, and --no-user leaves it out.
Measured on two projects generated side by side:
| default | --no-user | |
|---|---|---|
| 200 | 200 |
| 200 | 404 |
Tables created |
| none |
| yes | no |
The choice is the :wagoe/user key in each profile’s :active map, where
migrate up and the boot migration look for it. wagoe add user writes it back.
A database is still configured either way; if the
application needs no persistence at all, remove :wagoe/sqlite from
resources/conf/dev/config.edn as well.
wagoe add payments # PSP abstraction (Stripe / Mollie / Mock)
wagoe add cache # Redis / in-memory caching
wagoe add search # Full-text search (PostgreSQL FTS)
wagoe add jobs # Background job processing
Adds the dependency to deps.edn and the module’s key to each existing
profile’s resources/conf/<env>/config.edn (dev only, for a dev-scoped module). Nothing else has to change: the module
describes its own Integrant components, and system-config builds them because
the config now names it.
wagoe doctor # Check the project, print the one thing to fix
wagoe doctor --env prod # Check a profile other than dev
wagoe doctor --ci # Exit non-zero when anything errors
Run from inside a project. It runs four checks in the order their answers depend on each other:
| Stage | What it checks | Stops the run |
|---|---|---|
Environment prerequisites | Java, Clojure CLI, Babashka, Node, dev ports, clj-kondo, AI providers | yes |
Configuration |
| yes |
Commands and aliases | every | no |
Project setup | dev config, module integration, migrations, seed data | no |
The first two stop the run because everything after them would report the same
problem in another way — a broken config.edn fails every command that boots the
system, and the alias that failed is not the thing to fix.
Each stage is a bb task in the project (bb doctor:env, bb doctor,
bb smoke-check, bb guide next), and CI calls those directly with --ci.
wagoe doctor reads their --edn output so it can end with one next action
rather than four screens.
For code quality rather than setup, run bb check.
wagoe list modules # Human-readable table
wagoe list modules --json # Machine-readable JSON
wagoe upgrade # Print a diff per file, write nothing (same as --dry-run)
wagoe upgrade --apply # Write the changes
wagoe upgrade authorization <step> # Move :wagoe/authorization from :off to :enforce
Run from inside a project after bumping the Wagoe version. It rewrites what a
release deprecated in resources/**/config.edn and in the .clj/.cljc files
under src/, test/ and dev/. Formatting and comments are kept, and a second
run changes nothing.
It follows a table that grows with each deprecation: renamed config keys and
values (looked up at the top of config.edn and under :active and
:inactive), renamed namespaces, and renamed functions, through whatever alias
the file requires them under. A config value behind an Aero tag has its literal
default rewritten (#or [#env X "database"]); one with no literal, such as
#keyword #env X, is reported. A function that is `:refer’d is reported rather
than rewritten. A deprecation that cannot be rewritten mechanically is listed at
the end with what to do by hand.
wagoe agents update # Rewrite the framework sections of AGENTS.md
wagoe agents update --check # Exit 1 when they are out of date, write nothing
wagoe agents update --modules # Refresh only the module lists
wagoe version
my-app/
├── deps.edn # Clojure deps with :repl, :test, :run, :migrate, :build aliases
├── bb.edn # Babashka tasks (scaffold, check, doctor, deploy, ...)
├── resources/conf/
│ ├── dev/config.edn # Development profile
│ └── test/config.edn # Test profile
├── src/
│ └── my_app/
│ ├── main.clj # Entry point (clojure -M:run)
│ ├── system.clj # Component system wiring
│ └── system_config.clj # Loads the profile config
├── dev/user.clj # REPL helpers
├── test/my_app/system_test.clj
├── build.clj, Dockerfile
└── AGENTS.md, CLAUDE.md, .mcp.json # AI agent context and MCP server
bbin install cannot be used for this. libs/wagoe-cli is a sub-project of a
monorepo, and bbin resolves the repository root, so the installed script starts
and then fails with Could not locate wagoe/cli/main.clj on classpath. What the
installer does instead — and what to do by hand — is clone the tag and write a
wrapper with an explicit classpath:
TAG=1.0.0
git clone --depth 1 --branch "$TAG" https://github.com/wagoebv/wagoe.git \
"$HOME/.wagoe/releases/$TAG"
mkdir -p "$(bbin bin)"
cat > "$(bbin bin)/wagoe" <<EOF
#!/usr/bin/env bash
exec bb --classpath "$HOME/.wagoe/releases/$TAG/libs/wagoe-cli/src:$HOME/.wagoe/releases/$TAG/libs/wagoe-cli/resources" -m wagoe.cli.main "\$@"
EOF
chmod +x "$(bbin bin)/wagoe"
bbin bin is asked rather than assumed: bbin 0.2.x writes to ~/.local/bin,
and ~/.babashka/bbin/bin only on installations that predate that change.
The installer also installs clj-nrepl-eval and clj-paren-repair from clojure-mcp-light for REPL-over-MCP workflows:
clj-nrepl-eval --discover-ports # Connect AI agent to running REPL
Can you improve this documentation? These fine people already did:
Thijs Creemers & thijscreemersEdit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |