{"id":23377873,"url":"https://github.com/tanq16/cli-productivity-suite","last_synced_at":"2026-05-31T09:01:14.131Z","repository":{"id":39166582,"uuid":"270820615","full_name":"Tanq16/cli-productivity-suite","owner":"Tanq16","description":"Dotfile suite controller for Debian and MacOS to install oh-my-zsh, nvim, tmux, etc.","archived":false,"fork":false,"pushed_at":"2026-05-31T06:57:36.000Z","size":11602,"stargazers_count":5,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-05-31T07:18:31.683Z","etag":null,"topics":["catpuccin","cli","fzf","go","golang","kitty","linux","macos","neovim","nvchad","nvim","oh-my-zsh","productivity","rice","starship","tmux","zsh"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tanq16.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-06-08T20:39:51.000Z","updated_at":"2026-05-31T06:57:40.000Z","dependencies_parsed_at":"2022-09-16T01:45:30.596Z","dependency_job_id":"30361832-15c1-4150-9ab4-7c5369fce855","html_url":"https://github.com/Tanq16/cli-productivity-suite","commit_stats":null,"previous_names":[],"tags_count":53,"template":false,"template_full_name":null,"purl":"pkg:github/Tanq16/cli-productivity-suite","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Fcli-productivity-suite","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Fcli-productivity-suite/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Fcli-productivity-suite/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Fcli-productivity-suite/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tanq16","download_url":"https://codeload.github.com/Tanq16/cli-productivity-suite/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tanq16%2Fcli-productivity-suite/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33725060,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-31T02:00:06.040Z","response_time":95,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["catpuccin","cli","fzf","go","golang","kitty","linux","macos","neovim","nvchad","nvim","oh-my-zsh","productivity","rice","starship","tmux","zsh"],"created_at":"2024-12-21T18:20:29.793Z","updated_at":"2026-05-31T09:01:14.123Z","avatar_url":"https://github.com/Tanq16.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\".github/assets/logo.png\" alt=\"CLI Productivity Suite Logo\" width=\"200\"\u003e\n  \u003ch1\u003eCLI Productivity Suite\u003c/h1\u003e\n\n  \u003ca href=\"https://github.com/tanq16/cli-productivity-suite/actions/workflows/release.yaml\"\u003e\u003cimg alt=\"Build Workflow\" src=\"https://github.com/tanq16/cli-productivity-suite/actions/workflows/release.yaml/badge.svg\"\u003e\u003c/a\u003e\u0026nbsp;\u003ca href=\"https://github.com/tanq16/cli-productivity-suite/releases\"\u003e\u003cimg alt=\"GitHub Release\" src=\"https://img.shields.io/github/v/release/tanq16/cli-productivity-suite\"\u003e\u003c/a\u003e\u003cbr\u003e\u003cbr\u003e\n\n  \u003ca href=\"#prerequisites\"\u003ePrerequisites\u003c/a\u003e \u0026bull; \u003ca href=\"#install\"\u003eInstall\u003c/a\u003e \u0026bull; \u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e \u0026bull; \u003ca href=\"#custom-extension-packs\"\u003eCustom Extensions\u003c/a\u003e \u0026bull; \u003ca href=\"#shell-integration\"\u003eShell Integration\u003c/a\u003e \u0026bull; \u003ca href=\"#sandbox-container\"\u003eSandbox Container\u003c/a\u003e \u0026bull; \u003ca href=\"#deep-removal\"\u003eDeep Removal\u003c/a\u003e\n\u003c/div\u003e\n\n---\n\nA 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.\n\n## Prerequisites\n\n### Bootstrap\n\nmacOS ships zsh and curl out of the box; `git` comes from the Xcode Command Line Tools, so install those first if you haven't already:\n\n```bash\nxcode-select --install\n```\n\nOn Linux:\n\n```bash\nsudo apt install git curl zsh build-essential\n```\n\n### Install this (both platforms)\n\n| Requirement | One-line install |\n|---|---|\n| [Homebrew](https://brew.sh/) | `/bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"` |\n\nHomebrew is required — `cps init` won't run without it. CPS uses brew for all system and cloud CLI packages. CPS does **not** use Oh My Zsh; the two zsh plugins it installs (`zsh-autosuggestions`, `zsh-syntax-highlighting`) are sourced directly from `~/shell/plugins/`.\n\n**Recommended:**\n\n- [Kitty](https://sw.kovidgoyal.net/kitty/) terminal — CPS deploys a Kitty config and Catppuccin theme. Without Kitty, those config files are harmless but unused.\n- [JetBrains Mono Nerd Font](https://www.nerdfonts.com/font-downloads) — the Kitty and Neovim configs expect a nerd font. Without one, icons and glyphs will render as boxes.\n\n## Install\n\n```bash\nARCH=$(uname -m); [ \"$ARCH\" = \"x86_64\" ] \u0026\u0026 ARCH=amd64; [ \"$ARCH\" = \"aarch64\" ] \u0026\u0026 ARCH=arm64\nmkdir -p \"$HOME/.local/bin\"\ncurl -sL \"https://github.com/tanq16/cli-productivity-suite/releases/latest/download/cps-$(uname -s | tr '[:upper:]' '[:lower:]')-$ARCH\" -o \"$HOME/.local/bin/cps\"\nchmod +x \"$HOME/.local/bin/cps\"\n```\n\nIf `~/.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.\n\nOr build from source:\n\n```bash\ngit clone https://github.com/tanq16/cli-productivity-suite \u0026\u0026 cd cli-productivity-suite\nmake build   # produces ./cps\n```\n\n## Usage\n\n### Standard setup — run these three commands in order\n\n```bash\ncps init                  # base shell env, zsh plugins, configs, neovim, tmux\ncps extend essentials     # everyday CLI binaries (bat, fd, ripgrep, fzf, starship, ...)\ncps extend core           # dev/network/media brew packages (cmake, nmap, ffmpeg, aerospace)\n```\n\n\u003e **Order matters.** `init` deploys `~/.zshrc` and rc fragments that reference binaries (`lsd`, `fd`, `bat`, `fzf`, `starship`, etc.) which the `essentials` pack provides. The shell still works without `essentials`, but aliases like `tree`/`l`/`la` and the starship prompt won't resolve until it's installed. Always follow `init` with `cps extend essentials`.\n\n### `cps init`\n\nSets up the base shell environment — Homebrew packages (`wget`, `zip`, `unzip`, `file`, `tmux`, `htop`, `neovim`), Neovim with NvChad, zsh plugins (autosuggestions, syntax-highlighting), tmux with TPM, and CPS-managed config files (`.zshrc`, `.tmux.conf`, kitty configs). No CLI binaries are installed here — those live in the `essentials` pack so they can be updated individually. No sudo required.\n\nEverything else via `cps extend` is optional — install what you need.\n\n\u003e **Pack ordering for runtime-backed extensions.** Some custom-extension packs invoke runtimes that `cps extend runtimes` provides — `ai-tools` (claude-code, opencode, codex, crush) uses `fnm`; `database` (pgcli, mycli), `additional-cloud-tools` (checkov, prowler, oci-cli), and `praetorian` (praetorian-cli) use `uv`. Install `cps extend runtimes` (or at least its `uv` / `fnm` tools) before those packs, otherwise the install scripts fail with \"command not found.\" Tools in those same packs that ship as standalone binaries (`antigravity`, `aix`, `sq`, `usql`, `tofu`) have no runtime dependency.\n\n### `cps extend \u003cpack\u003e [tools...]`\n\nInstall extension packs or pick specific tools from a pack.\n\n```bash\ncps extend list                       # list all packs\ncps extend runtimes                   # install all language runtimes\ncps extend runtimes go-sdk            # install only Go\ncps extend security nuclei subfinder  # pick specific tools\n```\n\n| Pack | Contents |\n|---|---|\n| essentials | Everyday CLI binaries (bat, fd, ripgrep, lsd, jq, yq, fzf, gh, gron, zoxide, sd, starship, anbu, danzo, ai-context) + starship.toml |\n| core | Dev tools, network utils, media packages (cmake, nmap, ffmpeg, aerospace) |\n| runtimes | uv, fnm, bun, Go, Java (Temurin LTS), Python (via uv), Rust, Node.js LTS (via fnm) |\n| cloud | AWS CLI, Azure CLI, gcloud CLI |\n| security | nuclei, naabu, subfinder, proxify, httpx, dnsx, trufflehog, gobuster, nuclei-templates |\n| cloudsec | terraform, kubectl, kubelogin, grpcurl, cloudfox, trivy, cloudlist |\n| appsec | katana, ffuf, dalfox, reaper, poltergeist, wraith, gau |\n| misc | gowitness, snitch, age |\n| private | Personal tools — public subset (`nits`, `raikiri`, `gcli`, `box`, `claudex`) installs as-is; the truly-private four (`toon`, `nblm`, `cybernest`, `lincli`) need `--gh-token` |\n\nPacks with shell integration (`runtimes`, `cloud`, `security`) deploy RC fragments automatically.\n\n### `cps cheat \u003ctopic\u003e`\n\nTerminal cheat sheets — `cps`, `go`, `java`, `uv`, `fnm`, `bun`, `rust`, `tmux`, `nvim`, `fzf`, `jq`, `regex`.\n\n### `cps self-update`\n\nUpdates the `cps` binary in place (at whatever path it's running from).\n\n### Flags\n\n| Flag | Description |\n|---|---|\n| `--gh-token` | GitHub PAT for private repos (falls back to `gh auth token`) |\n| `--debug` | Verbose debug logging |\n| `--for-ai` | AI-friendly output (no color) |\n\n## Custom Extension Packs\n\nDrop a YAML file in `~/.config/cps/extensions/` to define your own pack:\n\n```yaml\nname: my-tools\ndescription: My custom tools\nshell:\n  env:\n    MY_VAR: \"value\"\n  path_prepend:\n    - \"$HOME/.local/bin\"\n  source:\n    - \"$HOME/.cargo/env\"\ntools:\n  - name: my-tool\n    install: curl -sL https://example.com/install.sh | bash\n```\n\nThen run `cps extend my-tools`. Custom packs appear in `cps extend list` alongside built-in packs.\n\nThe `shell` block controls what gets added to your shell environment via a generated RC fragment at `~/shell/rc/custom/\u003cpack-name\u003e.zsh`:\n\n- **`env`** — key-value pairs exported as environment variables\n- **`path_prepend`** — directories prepended to `$PATH`\n- **`source`** — files conditionally sourced (only if they exist)\n\nAll three fields are optional. If the entire `shell` block is omitted, no fragment is generated.\n\nThe repo's `custom-extensions/` directory ships ready-made reference packs (`ai-tools`, `additional-cloud-tools`, `database`, `praetorian`) — copy any of them to `~/.config/cps/extensions/` to use as-is, or treat them as templates for your own. Or pull all of them in one shot with `cps download-known-extensions` (below).\n\n### `cps download-known-extensions`\n\nFetches the reference custom-extension YAMLs maintained in the CPS repo (`ai-tools`, `additional-cloud-tools`, `database`, `praetorian`) and writes them to `~/.config/cps/extensions/`. After running, they show up in `cps extend list` and you can install any of them with `cps extend \u003cpack\u003e` (or `cps extend \u003cpack\u003e \u003ctool\u003e` for a single tool).\n\n```bash\ncps download-known-extensions\ncps extend list                  # ai-tools, database, etc. now visible\ncps extend ai-tools claude-code  # install just claude-code from ai-tools\n```\n\nOverwrites existing files of the same name — if you've customized one of the reference packs locally, rename it before re-running.\n\n## Shell Integration\n\nCPS uses a modular fragment system instead of a monolithic `.zshrc`:\n\n| Fragment | Deployed by |\n|---|---|\n| `~/shell/rc/00-base.zsh` | `cps init` |\n| `~/shell/rc/10-runtimes.zsh` | `cps extend runtimes` |\n| `~/shell/rc/20-cloud.zsh` | `cps extend cloud` |\n| `~/shell/rc/30-security.zsh` | `cps extend security` |\n| `~/shell/rc/custom/*.zsh` | Custom packs or user-managed |\n\n`~/.zshrc` is a thin loader that sources all fragments in order.\n\n### Adding your own stuff (no extension pack needed)\n\nThree drop-zones, three buckets — you never need to write a YAML pack for personal tweaks:\n\n| You want to add… | Drop it here | Notes |\n|---|---|---|\n| Aliases, exports, functions, custom sourcing | `~/shell/rc/custom/anything.zsh` | Loaded automatically by `~/.zshrc` after CPS fragments — so it can override CPS-set values |\n| Your own binaries / scripts | `~/shell/custom-bin/` | Prepended to PATH **ahead of** CPS-managed dirs, so your binary wins if a name collides with a CPS one |\n| A reusable, idempotent install bundle you want `cps extend` to manage | `~/.config/cps/extensions/\u003cname\u003e.yaml` | See [Custom Extension Packs](#custom-extension-packs) above |\n\nBoth `~/shell/rc/custom/` and `~/shell/custom-bin/` are created by `cps init` and are **never touched** by subsequent `cps init` / `cps extend` runs.\n\n`deep-removal.sh` wipes the whole `~/shell/` tree, so anything you drop there is removed by it — if you want long-term-survival storage, keep it elsewhere.\n\n## Notes\n\n- Core tools install to `~/shell/executables/`, extensions to `~/shell/extensions/` — both on PATH\n- User-owned binaries live in `~/shell/custom-bin/` (also on PATH, prepended ahead of the CPS-managed dirs)\n- State tracked in `~/.config/cps/state.json` — runs are idempotent, already-current tools are skipped\n- If `gh` CLI is authenticated, CPS uses its token automatically — no need for `--gh-token`\n- `00-base.zsh` exports `HOMEBREW_NO_AUTO_UPDATE=1` so `brew install` stays fast and deterministic. If you want brew to auto-update on every invocation, drop `unset HOMEBREW_NO_AUTO_UPDATE` into a file under `~/shell/rc/custom/`\n\n## Sandbox Container\n\nA prebuilt Ubuntu container with the full CPS environment baked in — every built-in extension pack (except `private`), brew on Linuxbrew, a non-root `cps` user with sudo, and zsh + tmux + neovim ready to go. Useful when you need a CPS-style workspace on a machine where you can't (or don't want to) install CPS directly.\n\n```bash\ndocker run -d --name cps-sandbox tanq16/cps-sandbox:latest\ndocker exec -it cps-sandbox zsh -l\n```\n\nThe image runs `sleep infinity` as its default command, so it stays alive and you `docker exec` in whenever you need it. `docker exec -it \u003cname\u003e zsh -l` always gives you the full configured shell (rc fragments sourced, PATH wired up, starship prompt, plugins loaded). Inside the shell, `tt` starts a tmux session, `t` re-attaches.\n\nBuild locally:\n\n```bash\ndocker build -t cps-sandbox .\ndocker run -d --name cps-sandbox cps-sandbox\ndocker exec -it cps-sandbox zsh -l\n```\n\nThe image is multi-arch (`linux/amd64` + `linux/arm64`) and large (multi-GB) — it carries full language runtimes, cloud CLIs, security tooling, every reference custom-extension pack (`ai-tools`, `additional-cloud-tools`, `database`, `praetorian`), and the public-repo tools from the `private` pack (`nits`, `raikiri`, `gcli`, `box`, `claudex`). The four truly-private tools (`toon`, `nblm`, `cybernest`, `lincli`) are skipped since they need an auth token.\n\n### A ready environment for AI agents\n\nThe prebuilt image is intentionally a **drop-in toolkit for AI coding agents** — Claude Code, Codex, opencode, Crush, antigravity, and friends. Spin up the container once and a single non-root user already has:\n\n- **The agent CLIs themselves** — `claude`, `codex`, `opencode`, `crush`, `agy` (antigravity), `aix` (the `ai-tools` reference pack is pre-installed)\n- **Language runtimes the agent will reach for** — Go, Node (via fnm), Bun, Python (via uv), Rust, Java (Temurin LTS), all on PATH with no further setup\n- **Everyday CLI building blocks** — bat, fd, ripgrep, lsd, jq, yq, fzf, gh, zoxide, gron, sd, starship, plus tmux + neovim\n- **Cloud + security tooling** — aws/azure/gcloud CLIs, kubectl, terraform, trivy, nuclei, httpx, dnsx, subfinder, ffuf, katana, and the rest of the security/cloudsec/appsec packs\n- **Sandbox isolation** — everything runs as the non-root `cps` user inside a disposable container; `sudo` is available for ad-hoc package installs without polluting your host\n\n```bash\ndocker run -d --name agent-sandbox tanq16/cps-sandbox:latest\ndocker exec -it agent-sandbox zsh -l\n# inside the container:\nclaude   # or codex, opencode, crush, agy, aix, ...\n```\n\nThis is the use case the image is tuned for: an agent (or a human delegating to one) lands in a shell where every tool it's likely to invoke — for code, search, package management, cloud ops, scanning, or recon — is already on PATH. No `brew install` round-trips, no runtime bootstrapping, no \"let me set up your environment first.\" For ephemeral runs, add `--rm` to `docker run`; for sessions you want to come back to, keep the container around and re-`exec` in.\n\n## Deep Removal\n\nRun the included script to wipe CPS and CPS-installed brew packages (plus a legacy `~/.oh-my-zsh` directory if one is left over from pre-v1.x CPS). Homebrew itself and `~/.zsh_history` are preserved so you can reinstall cleanly without rebuilding your shell history or re-bootstrapping brew.\n\n```bash\n./deep-removal.sh\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanq16%2Fcli-productivity-suite","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftanq16%2Fcli-productivity-suite","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftanq16%2Fcli-productivity-suite/lists"}