A single Go binary (cps) that sets up and manages a complete CLI development environment on Linux and macOS. Run cps init once to get a working shell with core tools, Neovim, tmux, and configs. Extend it with cps extend for language runtimes, cloud CLIs, security tools, and more.
macOS has these out of the box (git via Xcode CLT, zsh built-in, curl built-in). On Linux:
sudo apt install git curl zsh build-essential| Requirement | One-line install |
|---|---|
| Oh My Zsh | sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" |
| Homebrew | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" |
Both are required — cps init won't run without them. CPS uses brew for all system and cloud CLI packages.
Recommended:
- Kitty terminal — CPS deploys a Kitty config and Catppuccin theme. Without Kitty, those config files are harmless but unused.
- JetBrains Mono Nerd Font — the Kitty and Neovim configs expect a nerd font. Without one, icons and glyphs will render as boxes.
ARCH=$(uname -m); [ "$ARCH" = "x86_64" ] && ARCH=amd64; [ "$ARCH" = "aarch64" ] && ARCH=arm64
mkdir -p "$HOME/.local/bin"
curl -sL "https://github.com/tanq16/cli-productivity-suite/releases/latest/download/cps-$(uname -s | tr '[:upper:]' '[:lower:]')-$ARCH" -o "$HOME/.local/bin/cps"
chmod +x "$HOME/.local/bin/cps"If ~/.local/bin isn't on your PATH yet (common on fresh macOS), run cps init via its full path — ~/.local/bin/cps init — for the first invocation. The rc fragment that init deploys adds ~/.local/bin to PATH for all future sessions.
Or build from source:
git clone https://github.com/tanq16/cli-productivity-suite && cd cli-productivity-suite
make build # produces ./cpsSets up the base environment — core CLI tools (bat, fd, ripgrep, lsd, jq, yq, fzf, sd, gron, sq, zoxide, gh, anbu, danzo, ai-context), Neovim with NvChad, zsh plugins, tmux with TPM, and config files. System packages install via Homebrew on both Linux and macOS — no sudo required.
cps init
cps extend coreThese two commands are the standard way to set up this suite. init handles the base shell environment and core adds dev tools, network utilities, and media packages. Everything else via cps extend is optional — install what you need.
Install extension packs or pick specific tools from a pack.
cps extend list # list all packs
cps extend runtimes # install all language runtimes
cps extend runtimes go-sdk # install only Go
cps extend security nuclei subfinder # pick specific tools| Pack | Contents |
|---|---|
| core | Dev tools, network utils, media packages (cmake, nmap, ffmpeg, aerospace) |
| runtimes | uv, fnm, bun, Go, Python (includes uv), Rust, Node.js LTS (includes fnm) |
| cloud | AWS CLI, Azure CLI, gcloud CLI |
| security | nuclei, naabu, subfinder, proxify, httpx, dnsx, trufflehog, gobuster, nuclei-templates |
| cloudsec | terraform, kubectl, kubelogin, grpcurl, cloudfox, trivy, cloudlist |
| appsec | katana, ffuf, dalfox, reaper, poltergeist, wraith, gau |
| misc | gowitness, snitch, age |
| private | Personal tools (requires --gh-token) |
Packs with shell integration (runtimes, cloud, security) deploy RC fragments automatically.
Terminal cheat sheets — cps, go, uv, fnm, rust, tmux, nvim, fzf, regex.
Updates the cps binary in place (at whatever path it's running from).
| Flag | Description |
|---|---|
--gh-token |
GitHub PAT for private repos (falls back to gh auth token) |
--debug |
Verbose debug logging |
--for-ai |
AI-friendly output (no color) |
Drop a YAML file in ~/.config/cps/extensions/ to define your own pack:
name: my-tools
description: My custom tools
shell:
env:
MY_VAR: "value"
path_prepend:
- "$HOME/.local/bin"
source:
- "$HOME/.cargo/env"
tools:
- name: my-tool
install: curl -sL https://example.com/install.sh | bashThen run cps extend my-tools. Custom packs appear in cps extend list alongside built-in packs.
The shell block controls what gets added to your shell environment via a generated RC fragment at ~/shell/rc/custom/<pack-name>.zsh:
env— key-value pairs exported as environment variablespath_prepend— directories prepended to$PATHsource— files conditionally sourced (only if they exist)
All three fields are optional. If the entire shell block is omitted, no fragment is generated.
CPS uses a modular fragment system instead of a monolithic .zshrc:
| Fragment | Deployed by |
|---|---|
~/shell/rc/00-base.zsh |
cps init |
~/shell/rc/10-runtimes.zsh |
cps extend runtimes |
~/shell/rc/20-cloud.zsh |
cps extend cloud |
~/shell/rc/30-security.zsh |
cps extend security |
~/shell/rc/custom/*.zsh |
Custom packs or user-managed |
~/.zshrc is a thin loader that sources all fragments in order.
- Core tools install to
~/shell/executables/, extensions to~/shell/extensions/— both on PATH - State tracked in
~/.config/cps/state.json— runs are idempotent, already-current tools are skipped - If
ghCLI is authenticated, CPS uses its token automatically — no need for--gh-token
Run the included script to wipe CPS, CPS-installed brew packages, and Oh My Zsh. Homebrew itself and ~/.zsh_history are preserved so you can reinstall cleanly without rebuilding your shell history or re-bootstrapping brew.
./deep-removal.sh