singularity-cli
v0.3.1Universal project command runner. One set of commands for every project type.
curl -fsSL https://getsingularity.lol/cli | shZero-config detection
Reads your project files. Detects Rust, Node, Python, Go, Java, .NET, Ruby, and more. No setup, no config.
Monorepo aware
Discovers all sub-projects in a workspace and runs commands in parallel - or serially with --serial.
Transparent
Every command shows the underlying invocation it runs. --dry-run or --explain to inspect before committing.
Introduction
singularity-cli (command: sgl) is a universal project command runner written in Rust. It detects your project's ecosystem from its manifest files and maps one consistent verb - sgl dev, sgl test, sgl build - to the right underlying command.
No configuration required. Switch between Rust, Node, Python, and Go projects and always type the same thing. In a monorepo it finds every sub-project and runs them in parallel.
Installation
Pick the method that matches your platform.
macOS . Linux . WSL - downloads a prebuilt binary, verifies SHA256, installs to ~/.local/bin. Add ~/.local/bin to your $PATH if needed.
Commands & Flags
All commands share a common set of global flags and forward extra arguments to the underlying tool where applicable.
Commands
| Command | Description |
|---|---|
sgl setup | Install dependencies for the detected project ecosystem. |
sgl dev | Start dev server, watcher, or local daemon. |
sgl test [args]... | Run tests. Extra arguments are automatically forwarded to the underlying test runner.Pass extra arguments without worrying about syntax conversion. |
sgl build | Build the project using the native compiler or bundler. |
sgl lint | Run linter and formatting checks. |
sgl fmt | Automatically format source files across the project. |
sgl run <script> [args]... | Run a project script or task. Forwards extra arguments (inserts npm -- separator when needed). |
sgl doctor | Check for installed development tools, versions, and system environment health. |
sgl info [--json] | Inspect detected projects, resolved package managers, and configured command mappings. |
sgl init | Generate an initial singularity.toml based on detected project ecosystems. |
sgl completions <shell> | Generate shell autocompletions for bash, zsh, fish, or powershell. |
Global Flags
| Flag | Description |
|---|---|
--dry-run | Print the commands that would run without executing them. |
-v, --verbose | Show verbose output and debug logs. |
-q, --quiet | Suppress non-error output. |
--no-color | Disable ANSI color formatting. |
--cwd <path> | Execute command as if in the specified directory. |
--project <name> | Limit monorepo execution to a single project name. |
--changed | Only run in projects with uncommitted or branch-changed files. |
--serial | Run monorepo projects sequentially instead of in parallel. |
--fail-fast | Abort execution immediately on the first project failure. |
--json | Output result as structured JSON (supported for info, doctor, --explain). |
--explain <verb> | Print the resolved underlying commands for a specific verb without running them. |
Monorepos & Output
In a monorepo, sgl discovers all sub-projects and runs the requested command in parallel across all of them. Use --project to target one, --serial to run them in order, or --changed to limit to files with uncommitted changes.
# Run tests across every sub-project in parallel
$ sgl test
# Only the "api" sub-project
$ sgl test --project api
# Serial execution, stop on first failure
$ sgl build --serial --fail-fast
# Only projects with uncommitted changes
$ sgl lint --changedSupported Ecosystems
Detected automatically from manifest files - no config required.
| Ecosystem | Detection |
|---|---|
| Node.js | package.json |
| Rust | Cargo.toml |
| Python | pyproject.toml, requirements.txt, Pipfile |
| Go | go.mod |
| Java / Kotlin | pom.xml, build.gradle[.kts] |
| .NET | *.sln, *.csproj |
| Ruby | Gemfile |
| Docker | docker-compose.yml, compose.yaml |
| Task / Make | Makefile, justfile, Justfile, Taskfile.yml |
singularity.toml
Drop a singularity.toml at the project root to override auto-detected commands, add custom scripts, or set environment variables. Generate a starting file with sgl init.
[project]
name = "api"
[commands]
test = "pytest -x"
dev = ["docker compose up -d db", "uvicorn app:app --reload"]
deploy = "./scripts/deploy.sh"
[env]
DATABASE_URL = "postgres://localhost/dev"Comparison
Unlike Makefile wrappers or per-language scripts, sgl requires no configuration to get started - detection is its primary mechanism. You can override it when you need to.
| sgl | Makefile | mise / just | |
|---|---|---|---|
| Zero-config setup | ✓ | ✗ | ✗ |
| Cross-ecosystem | ✓ | ✗ | ✓ |
| Monorepo parallel | ✓ | ✗ | partial |
| Built-in override | ✓ | N/A | ✓ |
| Written in | Rust | N/A | Rust |
Links & Resources
Uninstall
If you installed via the curl script:
rm ~/.local/bin/sglIf you installed via cargo:
cargo uninstall singularitycli