Skip to content

Commit ff83b37

Browse files
committed
custom extensions: add --remove, ship reference YAML packs [minor-release]
- YAML schema gains optional per-tool `remove:` field - `cps extend <pack> [tools...] --remove` runs it via bash -c, custom packs only - Built-in packs refuse --remove explicitly; whole-pack removal also drops the rc fragment - Ship custom-extensions/ with failures, ai-tools, praetorian, additional-cloud-tools, database - Drop Praetorian tools from built-in manifest (now live in custom pack)
1 parent ece1c6f commit ff83b37

11 files changed

Lines changed: 509 additions & 57 deletions

File tree

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,10 @@ cps extend security nuclei subfinder # pick specific tools
8080
| core | Dev tools, network utils, media packages (cmake, nmap, ffmpeg, aerospace) |
8181
| runtimes | uv, fnm, bun, Go, Python (includes uv), Rust, Node.js LTS (includes fnm) |
8282
| cloud | AWS CLI, Azure CLI, gcloud CLI |
83-
| security | nuclei, naabu, subfinder, proxify, httpx, dnsx, trufflehog, gobuster, titus, nuclei-templates |
84-
| cloudsec | terraform, kubectl, kubelogin, grpcurl, cloudfox, aurelian, trivy, cloudlist |
85-
| appsec | katana, ffuf, hadrian, dalfox, reaper, poltergeist, wraith, gau |
86-
| misc | julius, trajan, gowitness, snitch, age |
83+
| security | nuclei, naabu, subfinder, proxify, httpx, dnsx, trufflehog, gobuster, nuclei-templates |
84+
| cloudsec | terraform, kubectl, kubelogin, grpcurl, cloudfox, trivy, cloudlist |
85+
| appsec | katana, ffuf, dalfox, reaper, poltergeist, wraith, gau |
86+
| misc | gowitness, snitch, age |
8787
| private | Personal tools (requires `--gh-token`) |
8888

8989
Packs with shell integration (`runtimes`, `cloud`, `security`) deploy RC fragments automatically.

cmd/extend.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"github.com/tanq16/cli-productivity-suite/internal/runner"
77
)
88

9+
var extendRemoveFlag bool
10+
911
var extendCmd = &cobra.Command{
1012
Use: "extend <pack-name> [tools...]",
1113
Short: "Install extension tool packs (e.g., security, cloudsec, runtimes)",
@@ -23,6 +25,14 @@ var extendCmd = &cobra.Command{
2325
runner.ExtendList()
2426
return
2527
}
28+
if extendRemoveFlag {
29+
runner.ExtendRemove(args[0], args[1:])
30+
return
31+
}
2632
runner.Extend(args[0], args[1:], ghToken)
2733
},
2834
}
35+
36+
func init() {
37+
extendCmd.Flags().BoolVar(&extendRemoveFlag, "remove", false, "Remove tool(s) from a custom extension pack (custom packs only)")
38+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
name: additional-cloud-tools
2+
description: Extra cloud and IaC tooling (uv-managed Python CLIs and OpenTofu)
3+
4+
tools:
5+
- name: checkov
6+
install: |
7+
set -eo pipefail
8+
export UV_TOOL_DIR="$HOME/shell/uv-tools"
9+
export UV_TOOL_BIN_DIR="$HOME/shell/uv-tool-executables"
10+
"$HOME/shell/executables/uv" tool install --force checkov
11+
remove: |
12+
set -eo pipefail
13+
export UV_TOOL_DIR="$HOME/shell/uv-tools"
14+
export UV_TOOL_BIN_DIR="$HOME/shell/uv-tool-executables"
15+
"$HOME/shell/executables/uv" tool uninstall checkov
16+
17+
- name: prowler
18+
install: |
19+
set -eo pipefail
20+
export UV_TOOL_DIR="$HOME/shell/uv-tools"
21+
export UV_TOOL_BIN_DIR="$HOME/shell/uv-tool-executables"
22+
"$HOME/shell/executables/uv" tool install --force prowler
23+
remove: |
24+
set -eo pipefail
25+
export UV_TOOL_DIR="$HOME/shell/uv-tools"
26+
export UV_TOOL_BIN_DIR="$HOME/shell/uv-tool-executables"
27+
"$HOME/shell/executables/uv" tool uninstall prowler
28+
29+
- name: oci-cli
30+
install: |
31+
set -eo pipefail
32+
export UV_TOOL_DIR="$HOME/shell/uv-tools"
33+
export UV_TOOL_BIN_DIR="$HOME/shell/uv-tool-executables"
34+
"$HOME/shell/executables/uv" tool install --force oci-cli
35+
remove: |
36+
set -eo pipefail
37+
export UV_TOOL_DIR="$HOME/shell/uv-tools"
38+
export UV_TOOL_BIN_DIR="$HOME/shell/uv-tool-executables"
39+
"$HOME/shell/executables/uv" tool uninstall oci-cli
40+
41+
- name: tofu
42+
install: |
43+
set -eo pipefail
44+
DEST_DIR="$HOME/shell/extensions"
45+
mkdir -p "$DEST_DIR"
46+
case "$(uname -s)" in
47+
Darwin) OS=darwin ;;
48+
Linux) OS=linux ;;
49+
*) echo "unsupported OS: $(uname -s)" >&2; exit 1 ;;
50+
esac
51+
case "$(uname -m)" in
52+
x86_64|amd64) ARCH=amd64 ;;
53+
arm64|aarch64) ARCH=arm64 ;;
54+
*) echo "unsupported arch: $(uname -m)" >&2; exit 1 ;;
55+
esac
56+
TAG=$(curl -fsSLI -o /dev/null -w '%{url_effective}' \
57+
https://github.com/opentofu/opentofu/releases/latest | sed 's|.*/tag/||')
58+
VERSION=${TAG#v}
59+
URL="https://github.com/opentofu/opentofu/releases/download/${TAG}/tofu_${VERSION}_${OS}_${ARCH}.tar.gz"
60+
TMP=$(mktemp -d)
61+
trap 'rm -rf "$TMP"' EXIT
62+
curl -fsSL "$URL" -o "$TMP/tofu.tar.gz"
63+
tar -xzf "$TMP/tofu.tar.gz" -C "$TMP"
64+
install -m 0755 "$TMP/tofu" "$DEST_DIR/tofu"
65+
remove: |
66+
rm -f "$HOME/shell/extensions/tofu"

custom-extensions/ai-tools.yaml

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
name: ai-tools
2+
description: AI coding agents and LLM CLIs
3+
4+
tools:
5+
- name: claude-code
6+
install: |
7+
curl -fsSL https://claude.ai/install.sh | bash
8+
remove: |
9+
rm -f "$HOME/.local/bin/claude"
10+
rm -rf "$HOME/.local/share/claude"
11+
12+
- name: opencode
13+
install: |
14+
set -eo pipefail
15+
export FNM_DIR="$HOME/shell/fnm"
16+
"$HOME/shell/extensions/fnm" exec --using=lts-latest -- \
17+
npm install -g opencode-ai@latest
18+
remove: |
19+
set -eo pipefail
20+
export FNM_DIR="$HOME/shell/fnm"
21+
"$HOME/shell/extensions/fnm" exec --using=lts-latest -- \
22+
npm uninstall -g opencode-ai
23+
24+
- name: gemini
25+
install: |
26+
set -eo pipefail
27+
export FNM_DIR="$HOME/shell/fnm"
28+
"$HOME/shell/extensions/fnm" exec --using=lts-latest -- \
29+
npm install -g @google/gemini-cli
30+
remove: |
31+
set -eo pipefail
32+
export FNM_DIR="$HOME/shell/fnm"
33+
"$HOME/shell/extensions/fnm" exec --using=lts-latest -- \
34+
npm uninstall -g @google/gemini-cli
35+
36+
- name: codex
37+
install: |
38+
set -eo pipefail
39+
export FNM_DIR="$HOME/shell/fnm"
40+
"$HOME/shell/extensions/fnm" exec --using=lts-latest -- \
41+
npm install -g @openai/codex
42+
remove: |
43+
set -eo pipefail
44+
export FNM_DIR="$HOME/shell/fnm"
45+
"$HOME/shell/extensions/fnm" exec --using=lts-latest -- \
46+
npm uninstall -g @openai/codex
47+
48+
- name: crush
49+
install: |
50+
set -eo pipefail
51+
export FNM_DIR="$HOME/shell/fnm"
52+
"$HOME/shell/extensions/fnm" exec --using=lts-latest -- \
53+
npm install -g @charmland/crush
54+
remove: |
55+
set -eo pipefail
56+
export FNM_DIR="$HOME/shell/fnm"
57+
"$HOME/shell/extensions/fnm" exec --using=lts-latest -- \
58+
npm uninstall -g @charmland/crush
59+
60+
- name: aix
61+
install: |
62+
set -eo pipefail
63+
DEST_DIR="$HOME/shell/extensions"
64+
mkdir -p "$DEST_DIR"
65+
case "$(uname -s)" in
66+
Darwin) OS=macOS ;;
67+
Linux) OS=linux ;;
68+
*) echo "unsupported OS: $(uname -s)" >&2; exit 1 ;;
69+
esac
70+
case "$(uname -m)" in
71+
x86_64|amd64) ARCH=amd64 ;;
72+
arm64|aarch64) ARCH=arm64 ;;
73+
*) echo "unsupported arch: $(uname -m)" >&2; exit 1 ;;
74+
esac
75+
TAG=$(curl -fsSLI -o /dev/null -w '%{url_effective}' \
76+
https://github.com/projectdiscovery/aix/releases/latest | sed 's|.*/tag/||')
77+
VERSION=${TAG#v}
78+
URL="https://github.com/projectdiscovery/aix/releases/download/${TAG}/aix_${VERSION}_${OS}_${ARCH}.zip"
79+
TMP=$(mktemp -d)
80+
trap 'rm -rf "$TMP"' EXIT
81+
curl -fsSL "$URL" -o "$TMP/aix.zip"
82+
unzip -qo "$TMP/aix.zip" -d "$TMP"
83+
install -m 0755 "$TMP/aix" "$DEST_DIR/aix"
84+
remove: |
85+
rm -f "$HOME/shell/extensions/aix"

custom-extensions/database.yaml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
name: database
2+
description: Interactive database CLIs
3+
4+
tools:
5+
- name: pgcli
6+
install: |
7+
set -eo pipefail
8+
export UV_TOOL_DIR="$HOME/shell/uv-tools"
9+
export UV_TOOL_BIN_DIR="$HOME/shell/uv-tool-executables"
10+
"$HOME/shell/executables/uv" tool install --force pgcli
11+
remove: |
12+
set -eo pipefail
13+
export UV_TOOL_DIR="$HOME/shell/uv-tools"
14+
export UV_TOOL_BIN_DIR="$HOME/shell/uv-tool-executables"
15+
"$HOME/shell/executables/uv" tool uninstall pgcli
16+
17+
- name: mycli
18+
install: |
19+
set -eo pipefail
20+
export UV_TOOL_DIR="$HOME/shell/uv-tools"
21+
export UV_TOOL_BIN_DIR="$HOME/shell/uv-tool-executables"
22+
"$HOME/shell/executables/uv" tool install --force mycli
23+
remove: |
24+
set -eo pipefail
25+
export UV_TOOL_DIR="$HOME/shell/uv-tools"
26+
export UV_TOOL_BIN_DIR="$HOME/shell/uv-tool-executables"
27+
"$HOME/shell/executables/uv" tool uninstall mycli
28+
29+
- name: usql
30+
install: |
31+
set -eo pipefail
32+
brew tap xo/xo
33+
brew install usql
34+
remove: |
35+
brew uninstall usql

custom-extensions/failures.yaml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
name: failures
2+
description: Stopgap installations for fixing tools that have active upstream issues
3+
4+
tools:
5+
- name: gcloud
6+
install: |
7+
set -eo pipefail
8+
INSTALL_DIR="$HOME/shell/extensions/gcloud"
9+
mkdir -p "$INSTALL_DIR"
10+
cd "$INSTALL_DIR"
11+
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
12+
case "$(uname -m)" in
13+
x86_64|amd64) ARCH=x86_64 ;;
14+
arm64|aarch64) ARCH=arm ;;
15+
*) echo "unsupported arch: $(uname -m)" >&2; exit 1 ;;
16+
esac
17+
URL="https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-cli-${OS}-${ARCH}.tar.gz"
18+
curl -fsSL "$URL" -o gcloud.tar.gz
19+
rm -rf google-cloud-sdk
20+
tar -xzf gcloud.tar.gz
21+
rm -f gcloud.tar.gz
22+
./google-cloud-sdk/install.sh \
23+
--quiet \
24+
--path-update=false \
25+
--usage-reporting=false \
26+
--command-completion=false
27+
remove: |
28+
rm -rf "$HOME/shell/extensions/gcloud"
29+
30+
shell:
31+
path_prepend:
32+
- $HOME/shell/extensions/gcloud/google-cloud-sdk/bin
33+
source:
34+
- $HOME/shell/extensions/gcloud/google-cloud-sdk/completion.zsh.inc

0 commit comments

Comments
 (0)