ExecuteSoft CLI
exe is the Rust command-line tool for ExecuteSoft repository automation. Keep
workflow logic here instead of adding new Bash or Makefile implementations.
Source Layout
src/main.rs: binary entrypoint only.src/cli.rs: Clap command, subcommand, and argument definitions.src/commands.rs: top-level command dispatch, sync, release, and deployment.src/service.rs: service generation, service discovery, and compliance checks.src/gateway.rs: gateway route generation wrappers and route source validation.src/db.rs: database migration helper commands.src/dev.rs: service-local dev, explicit compose helpers, and polling watch helper.src/service_local.rs: service-only checkout setup and dev runner.src/util.rs: shared repository path, process, and Make variable helpers.src/tests.rs: focused CLI, generator, compliance helper, and help-output tests.
Local Use
From the repository root, build the local binary:
Run it from bin/exe:
Run without building bin/exe:
Install for the current user:
If exe is not found after installation, add Cargo binaries to the shell path:
Use Cases
Check Service Compliance
Use this before committing service or template changes:
check-all validates service roots under services/ and certified template
skeletons under tools/templates/.
Service-Only Checkout
Use this flow for developers who only receive one service repository or folder:
exe setup walks upward to find service.yaml, validates the service contract,
runs the local generator when one exists, downloads language dependencies, and
starts the shared local dependency stack. Pass setup variables as
key=value pairs when needed:
Plain exe dev runs inside a service checkout. It starts shared local Docker
dependencies, loads configs/app.env.example, watches the service directory,
and runs the command implied by service.yaml:
- Go:
go run ./cmd/server - Rust:
cargo run - TypeScript:
bun run devornpm run devwhen adevscript exists - Python:
python -m src.server
Several services can run locally at once because they share the same Postgres,
Redis, NATS, and MongoDB containers. Postgres isolation is by database name.
exe dev up creates missing local Postgres databases dynamically by scanning
service env examples and Makefile MIGRATION_DB_NAME values. There is no
hard-coded service database list, so new services are picked up without
changing the shared compose file.
Override shared dependency ports only when needed:
POSTGRES_PORT=15432 REDIS_PORT=16379 NATS_PORT=14222
Create A Service
Use the generator instead of copying service folders manually:
The generator copies the selected certified template, replaces template tokens, creates the service folder, and creates the shared protobuf contract when the local service contract exists.
Run Service Make Targets
Use service names for common operations:
When a service name is ambiguous, pass the service path.
Manage Gateway Routes
Generated gateway artifacts must come from route source files and protobufs:
Do not manually edit generated route artifacts.
Run Local Development Helpers
Plain exe dev is the normal service-local flow. Compose subcommands use the
shared local dependency stack by default. Use dev watch for simple polling
reloads in services that need it.
Release And Deployment
release and deployment commands keep repository sync first-class:
deploy kubernetes runs sync before delegating to the deployment Make target.
sync prunes gateway route imports for removed services, deletes stale route
source files whose target proto no longer exists, removes orphan shared service
protobufs, regenerates gateway artifacts, refreshes Swagger/OpenAPI and
generated API reference pages, then runs DevOps service asset sync.
crates.io Publishing
The crate is publish-enabled in tools/exe/Cargo.toml:
= true
To publish, first update tools/exe/Cargo.toml with public package metadata:
[]
= "executesoft"
= "0.1.0"
= "2024"
= "1.95"
= "ExecuteSoft repository automation CLI"
= "MIT"
= "https://github.com/execute-soft/executsoft"
= "README.md"
= true
The package name is global on crates.io. If executesoft is unavailable,
choose another package name. The installed binary can still be named exe
because the binary target controls the command name:
[[]]
= "exe"
= "src/main.rs"
Authenticate and verify:
Publish through exe so the crate patch version is bumped before Cargo runs.
Pass normal cargo publish flags after the command:
After publishing, install from crates.io:
For private company tooling, prefer local or private-registry installation until the command surface and package metadata are stable.