devstuff 1.13.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dev_setup/__init__.py +6 -0
- dev_setup/__main__.py +9 -0
- dev_setup/base.py +74 -0
- dev_setup/catalog.py +188 -0
- dev_setup/cli.py +49 -0
- dev_setup/commands/__init__.py +0 -0
- dev_setup/commands/add_cmd.py +334 -0
- dev_setup/commands/catalog_cmd.py +37 -0
- dev_setup/commands/delete_cmd.py +36 -0
- dev_setup/commands/docs_cmd.py +34 -0
- dev_setup/commands/functions_cmd.py +87 -0
- dev_setup/commands/help_cmd.py +59 -0
- dev_setup/commands/install_cmd.py +129 -0
- dev_setup/commands/list_cmd.py +76 -0
- dev_setup/commands/remove_cmd.py +53 -0
- dev_setup/commands/run_cmd.py +66 -0
- dev_setup/commands/update_cmd.py +149 -0
- dev_setup/function_runner.py +133 -0
- dev_setup/functions.schema.json +106 -0
- dev_setup/functions.yaml +111 -0
- dev_setup/functions_catalog.py +217 -0
- dev_setup/functions_registry.py +149 -0
- dev_setup/generic.py +719 -0
- dev_setup/registry.py +97 -0
- dev_setup/tools.yaml +679 -0
- dev_setup/ui.py +111 -0
- devstuff-1.13.1.dist-info/METADATA +617 -0
- devstuff-1.13.1.dist-info/RECORD +30 -0
- devstuff-1.13.1.dist-info/WHEEL +4 -0
- devstuff-1.13.1.dist-info/entry_points.txt +3 -0
dev_setup/tools.yaml
ADDED
|
@@ -0,0 +1,679 @@
|
|
|
1
|
+
version: 1
|
|
2
|
+
tools:
|
|
3
|
+
ansible:
|
|
4
|
+
name: Ansible
|
|
5
|
+
description: Automation engine for configuration management and app deployment
|
|
6
|
+
category: tools
|
|
7
|
+
type: apt
|
|
8
|
+
check_cmd: ansible
|
|
9
|
+
apt_packages: ansible
|
|
10
|
+
help_cmd: ansible --help
|
|
11
|
+
docs_url: https://docs.ansible.com/
|
|
12
|
+
remove_script: |
|
|
13
|
+
set -euo pipefail
|
|
14
|
+
sudo apt-get remove -y ansible
|
|
15
|
+
sudo apt-get autoremove -y
|
|
16
|
+
|
|
17
|
+
ansible-vault:
|
|
18
|
+
name: Ansible Vault
|
|
19
|
+
description: Encrypt and manage secrets within Ansible projects (bundled with Ansible)
|
|
20
|
+
category: tools
|
|
21
|
+
type: apt
|
|
22
|
+
check_cmd: ansible-vault
|
|
23
|
+
apt_packages: ansible
|
|
24
|
+
help_cmd: ansible-vault --help
|
|
25
|
+
docs_url: https://docs.ansible.com/ansible/latest/vault_guide/index.html
|
|
26
|
+
requires:
|
|
27
|
+
- ansible
|
|
28
|
+
remove_script: |
|
|
29
|
+
set -euo pipefail
|
|
30
|
+
echo "ansible-vault is bundled with the ansible package — run 'devstuff remove ansible' to uninstall it."
|
|
31
|
+
|
|
32
|
+
aws:
|
|
33
|
+
name: AWS CLI
|
|
34
|
+
description: Amazon Web Services command line interface (v2)
|
|
35
|
+
category: tools
|
|
36
|
+
type: bash
|
|
37
|
+
check_cmd: aws
|
|
38
|
+
help_cmd: aws help
|
|
39
|
+
docs_url: https://docs.aws.amazon.com/cli/latest/userguide/
|
|
40
|
+
install_script: |
|
|
41
|
+
set -euo pipefail
|
|
42
|
+
arch="$(uname -m)"
|
|
43
|
+
if [ "$arch" = "aarch64" ]; then
|
|
44
|
+
aws_arch="aarch64"
|
|
45
|
+
else
|
|
46
|
+
aws_arch="x86_64"
|
|
47
|
+
fi
|
|
48
|
+
tmpdir="$(mktemp -d)"
|
|
49
|
+
trap 'rm -rf "$tmpdir"' EXIT
|
|
50
|
+
curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-${aws_arch}.zip" -o "$tmpdir/awscliv2.zip"
|
|
51
|
+
python3 - "$tmpdir/awscliv2.zip" "$tmpdir" <<'PY'
|
|
52
|
+
import os
|
|
53
|
+
import stat
|
|
54
|
+
import sys
|
|
55
|
+
import zipfile
|
|
56
|
+
|
|
57
|
+
archive, dest = sys.argv[1:3]
|
|
58
|
+
with zipfile.ZipFile(archive) as zf:
|
|
59
|
+
for info in zf.infolist():
|
|
60
|
+
zf.extract(info, dest)
|
|
61
|
+
perm = info.external_attr >> 16
|
|
62
|
+
path = os.path.join(dest, info.filename)
|
|
63
|
+
if perm and os.path.exists(path) and not os.path.isdir(path):
|
|
64
|
+
os.chmod(path, perm)
|
|
65
|
+
PY
|
|
66
|
+
sudo bash "$tmpdir/aws/install"
|
|
67
|
+
remove_script: |
|
|
68
|
+
set -euo pipefail
|
|
69
|
+
sudo rm -rf /usr/local/aws-cli
|
|
70
|
+
sudo rm -f /usr/local/bin/aws /usr/local/bin/aws_completer
|
|
71
|
+
|
|
72
|
+
bat:
|
|
73
|
+
name: bat
|
|
74
|
+
description: cat replacement with syntax highlighting and git integration
|
|
75
|
+
category: tools
|
|
76
|
+
type: bash
|
|
77
|
+
check_cmd: bat
|
|
78
|
+
help_cmd: bat --help
|
|
79
|
+
docs_url: https://github.com/sharkdp/bat
|
|
80
|
+
install_script: |
|
|
81
|
+
set -euo pipefail
|
|
82
|
+
version="$(curl -fsSL https://api.github.com/repos/sharkdp/bat/releases/latest | python3 -c 'import json,sys; print(json.load(sys.stdin)["tag_name"].lstrip("v"))' 2>/dev/null || echo 0.24.0)"
|
|
83
|
+
machine="$(uname -m)"
|
|
84
|
+
if [ "$machine" = "aarch64" ]; then
|
|
85
|
+
arch="aarch64"
|
|
86
|
+
else
|
|
87
|
+
arch="x86_64"
|
|
88
|
+
fi
|
|
89
|
+
filename="bat-v${version}-${arch}-unknown-linux-gnu.tar.gz"
|
|
90
|
+
tmpdir="$(mktemp -d)"
|
|
91
|
+
trap 'rm -rf "$tmpdir"' EXIT
|
|
92
|
+
curl -fsSL -o "$tmpdir/$filename" "https://github.com/sharkdp/bat/releases/download/v${version}/${filename}"
|
|
93
|
+
tar -C "$tmpdir" -xzf "$tmpdir/$filename"
|
|
94
|
+
sudo mv "$tmpdir/bat-v${version}-${arch}-unknown-linux-gnu/bat" /usr/local/bin/bat
|
|
95
|
+
sudo chmod +x /usr/local/bin/bat
|
|
96
|
+
remove_script: |
|
|
97
|
+
set -euo pipefail
|
|
98
|
+
sudo rm -f /usr/local/bin/bat
|
|
99
|
+
|
|
100
|
+
docker:
|
|
101
|
+
name: Docker
|
|
102
|
+
description: Container runtime + docker compose plugin
|
|
103
|
+
category: tools
|
|
104
|
+
type: bash
|
|
105
|
+
check_cmd: docker
|
|
106
|
+
help_cmd: docker --help
|
|
107
|
+
docs_url: https://docs.docker.com
|
|
108
|
+
install_script: |
|
|
109
|
+
set -euo pipefail
|
|
110
|
+
tmp="$(mktemp --suffix=.sh)"
|
|
111
|
+
trap 'rm -f "$tmp"' EXIT
|
|
112
|
+
curl -fsSL https://get.docker.com -o "$tmp"
|
|
113
|
+
sudo sh "$tmp"
|
|
114
|
+
user="${USER:-}"
|
|
115
|
+
if [ -n "$user" ] && groups "$user" | grep -qv '\bdocker\b'; then
|
|
116
|
+
sudo usermod -aG docker "$user"
|
|
117
|
+
echo "Log out and back in for docker group membership to take effect."
|
|
118
|
+
fi
|
|
119
|
+
sudo systemctl enable docker 2>/dev/null || true
|
|
120
|
+
sudo systemctl start docker 2>/dev/null || true
|
|
121
|
+
if ! docker compose version >/dev/null 2>&1; then
|
|
122
|
+
sudo apt-get install -y docker-compose-plugin 2>/dev/null \
|
|
123
|
+
|| sudo yum install -y docker-compose-plugin 2>/dev/null \
|
|
124
|
+
|| sudo dnf install -y docker-compose-plugin 2>/dev/null \
|
|
125
|
+
|| true
|
|
126
|
+
fi
|
|
127
|
+
remove_script: |
|
|
128
|
+
set -euo pipefail
|
|
129
|
+
sudo systemctl stop docker 2>/dev/null || true
|
|
130
|
+
sudo systemctl disable docker 2>/dev/null || true
|
|
131
|
+
sudo apt-get remove -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras 2>/dev/null \
|
|
132
|
+
|| sudo yum remove -y docker-ce docker-ce-cli containerd.io docker-compose-plugin 2>/dev/null \
|
|
133
|
+
|| true
|
|
134
|
+
|
|
135
|
+
gh:
|
|
136
|
+
name: GitHub CLI
|
|
137
|
+
description: GitHub's official CLI - PRs, issues, Actions, and more
|
|
138
|
+
category: tools
|
|
139
|
+
type: bash
|
|
140
|
+
check_cmd: gh
|
|
141
|
+
help_cmd: gh --help
|
|
142
|
+
docs_url: https://cli.github.com/manual/
|
|
143
|
+
install_script: |
|
|
144
|
+
set -euo pipefail
|
|
145
|
+
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg \
|
|
146
|
+
| sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
|
|
147
|
+
sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg
|
|
148
|
+
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" \
|
|
149
|
+
| sudo tee /etc/apt/sources.list.d/github-cli.list >/dev/null
|
|
150
|
+
sudo apt-get update -q
|
|
151
|
+
sudo apt-get install -y gh
|
|
152
|
+
remove_script: |
|
|
153
|
+
set -euo pipefail
|
|
154
|
+
sudo apt-get remove -y gh
|
|
155
|
+
|
|
156
|
+
git-lfs:
|
|
157
|
+
name: Git LFS
|
|
158
|
+
description: Git extension for versioning large files
|
|
159
|
+
category: tools
|
|
160
|
+
type: bash
|
|
161
|
+
check_cmd: git-lfs
|
|
162
|
+
help_cmd: git lfs --help
|
|
163
|
+
docs_url: https://git-lfs.com/
|
|
164
|
+
install_script: |
|
|
165
|
+
set -euo pipefail
|
|
166
|
+
version="$(curl -fsSL https://api.github.com/repos/git-lfs/git-lfs/releases/latest | python3 -c 'import json,sys; print(json.load(sys.stdin)["tag_name"].lstrip("v"))' 2>/dev/null || echo 3.5.1)"
|
|
167
|
+
machine="$(uname -m)"
|
|
168
|
+
if [ "$machine" = "aarch64" ]; then
|
|
169
|
+
arch="arm64"
|
|
170
|
+
else
|
|
171
|
+
arch="amd64"
|
|
172
|
+
fi
|
|
173
|
+
filename="git-lfs-linux-${arch}-v${version}.tar.gz"
|
|
174
|
+
tmpdir="$(mktemp -d)"
|
|
175
|
+
trap 'rm -rf "$tmpdir"' EXIT
|
|
176
|
+
curl -fsSL -o "$tmpdir/$filename" "https://github.com/git-lfs/git-lfs/releases/download/v${version}/${filename}"
|
|
177
|
+
tar -C "$tmpdir" -xzf "$tmpdir/$filename"
|
|
178
|
+
sudo bash "$tmpdir/git-lfs-${version}/install.sh"
|
|
179
|
+
git lfs install
|
|
180
|
+
remove_script: |
|
|
181
|
+
set -euo pipefail
|
|
182
|
+
if ! git lfs uninstall; then
|
|
183
|
+
echo "warning: 'git lfs uninstall' failed — LFS filter hooks may remain in ~/.gitconfig." >&2
|
|
184
|
+
echo "warning: run 'git lfs uninstall' manually before removing the binary, or clean up ~/.gitconfig by hand." >&2
|
|
185
|
+
fi
|
|
186
|
+
sudo rm -f /usr/local/bin/git-lfs
|
|
187
|
+
|
|
188
|
+
go:
|
|
189
|
+
name: Go
|
|
190
|
+
description: Go programming language toolchain
|
|
191
|
+
category: languages
|
|
192
|
+
type: bash
|
|
193
|
+
check_cmd: command -v go >/dev/null 2>&1 || test -x /usr/local/go/bin/go
|
|
194
|
+
help_cmd: go help
|
|
195
|
+
docs_url: https://go.dev/doc/
|
|
196
|
+
install_script: |
|
|
197
|
+
set -euo pipefail
|
|
198
|
+
version="$(curl -fsSL https://go.dev/dl/?mode=json | python3 -c 'import json,sys; data=json.load(sys.stdin); print(next((r["version"].removeprefix("go") for r in data if r.get("stable")), "1.23.4"))' 2>/dev/null || echo 1.23.4)"
|
|
199
|
+
machine="$(uname -m)"
|
|
200
|
+
if [ "$machine" = "aarch64" ]; then
|
|
201
|
+
arch="arm64"
|
|
202
|
+
else
|
|
203
|
+
arch="amd64"
|
|
204
|
+
fi
|
|
205
|
+
filename="go${version}.linux-${arch}.tar.gz"
|
|
206
|
+
tmpdir="$(mktemp -d)"
|
|
207
|
+
trap 'rm -rf "$tmpdir"' EXIT
|
|
208
|
+
curl -fsSL -o "$tmpdir/$filename" "https://go.dev/dl/$filename"
|
|
209
|
+
sudo rm -rf /usr/local/go
|
|
210
|
+
sudo tar -C /usr/local -xzf "$tmpdir/$filename"
|
|
211
|
+
marker="# Go"
|
|
212
|
+
line='export PATH=$PATH:/usr/local/go/bin'
|
|
213
|
+
touch "$HOME/.bashrc"
|
|
214
|
+
if ! grep -Fxq "$marker" "$HOME/.bashrc"; then
|
|
215
|
+
printf '\n%s\n%s\n' "$marker" "$line" >> "$HOME/.bashrc"
|
|
216
|
+
fi
|
|
217
|
+
remove_script: |
|
|
218
|
+
set -euo pipefail
|
|
219
|
+
sudo rm -rf /usr/local/go
|
|
220
|
+
if [ -f "$HOME/.bashrc" ]; then
|
|
221
|
+
python3 - "$HOME/.bashrc" <<'PY'
|
|
222
|
+
import sys
|
|
223
|
+
path = sys.argv[1]
|
|
224
|
+
lines = open(path).read().splitlines()
|
|
225
|
+
out = []
|
|
226
|
+
skip = 0
|
|
227
|
+
for line in lines:
|
|
228
|
+
if skip:
|
|
229
|
+
skip -= 1
|
|
230
|
+
continue
|
|
231
|
+
if line == "# Go":
|
|
232
|
+
skip = 1
|
|
233
|
+
continue
|
|
234
|
+
out.append(line)
|
|
235
|
+
open(path, "w").write("\n".join(out) + ("\n" if out else ""))
|
|
236
|
+
PY
|
|
237
|
+
fi
|
|
238
|
+
|
|
239
|
+
homebrew:
|
|
240
|
+
name: Homebrew
|
|
241
|
+
description: Package manager for Linux (and macOS)
|
|
242
|
+
category: tools
|
|
243
|
+
type: bash
|
|
244
|
+
check_cmd: command -v brew >/dev/null 2>&1 || test -x /home/linuxbrew/.linuxbrew/bin/brew
|
|
245
|
+
help_cmd: brew --help
|
|
246
|
+
docs_url: https://docs.brew.sh/Homebrew-on-Linux
|
|
247
|
+
install_script: |
|
|
248
|
+
set -euo pipefail
|
|
249
|
+
sudo apt-get update -q
|
|
250
|
+
sudo apt-get install -y build-essential bubblewrap
|
|
251
|
+
NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
252
|
+
marker="# Homebrew"
|
|
253
|
+
line='eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"'
|
|
254
|
+
touch "$HOME/.bashrc"
|
|
255
|
+
if ! grep -Fxq "$marker" "$HOME/.bashrc"; then
|
|
256
|
+
printf '\n%s\n%s\n' "$marker" "$line" >> "$HOME/.bashrc"
|
|
257
|
+
fi
|
|
258
|
+
remove_script: |
|
|
259
|
+
set -euo pipefail
|
|
260
|
+
NONINTERACTIVE=1 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/uninstall.sh)"
|
|
261
|
+
if [ -f "$HOME/.bashrc" ]; then
|
|
262
|
+
python3 - "$HOME/.bashrc" <<'PY'
|
|
263
|
+
import sys
|
|
264
|
+
path = sys.argv[1]
|
|
265
|
+
lines = open(path).read().splitlines()
|
|
266
|
+
out = []
|
|
267
|
+
skip = 0
|
|
268
|
+
for line in lines:
|
|
269
|
+
if skip:
|
|
270
|
+
skip -= 1
|
|
271
|
+
continue
|
|
272
|
+
if line == "# Homebrew":
|
|
273
|
+
skip = 1
|
|
274
|
+
continue
|
|
275
|
+
out.append(line)
|
|
276
|
+
open(path, "w").write("\n".join(out) + ("\n" if out else ""))
|
|
277
|
+
PY
|
|
278
|
+
fi
|
|
279
|
+
|
|
280
|
+
htop:
|
|
281
|
+
name: htop
|
|
282
|
+
description: Interactive process and resource monitor
|
|
283
|
+
category: tools
|
|
284
|
+
type: bash
|
|
285
|
+
check_cmd: htop
|
|
286
|
+
help_cmd: man htop
|
|
287
|
+
docs_url: https://htop.dev/
|
|
288
|
+
install_script: |
|
|
289
|
+
set -euo pipefail
|
|
290
|
+
sudo apt-get update -q 2>/dev/null || true
|
|
291
|
+
sudo apt-get install -y htop 2>/dev/null \
|
|
292
|
+
|| sudo yum install -y htop 2>/dev/null \
|
|
293
|
+
|| sudo dnf install -y htop 2>/dev/null \
|
|
294
|
+
|| sudo pacman -S --noconfirm htop 2>/dev/null
|
|
295
|
+
remove_script: |
|
|
296
|
+
set -euo pipefail
|
|
297
|
+
sudo apt-get remove -y htop 2>/dev/null \
|
|
298
|
+
|| sudo yum remove -y htop 2>/dev/null \
|
|
299
|
+
|| sudo dnf remove -y htop 2>/dev/null \
|
|
300
|
+
|| sudo pacman -R --noconfirm htop 2>/dev/null
|
|
301
|
+
|
|
302
|
+
ipython:
|
|
303
|
+
name: IPython
|
|
304
|
+
description: Enhanced interactive Python shell with rich tab completion and magic commands
|
|
305
|
+
category: tools
|
|
306
|
+
type: uvx
|
|
307
|
+
pip_name: ipython
|
|
308
|
+
check_cmd: ipython
|
|
309
|
+
help_cmd: ipython --help
|
|
310
|
+
docs_url: https://ipython.readthedocs.io/
|
|
311
|
+
|
|
312
|
+
java:
|
|
313
|
+
name: Java 21 (OpenJDK)
|
|
314
|
+
description: OpenJDK 21 LTS - JDK and JRE
|
|
315
|
+
category: languages
|
|
316
|
+
type: apt
|
|
317
|
+
check_cmd: java
|
|
318
|
+
apt_packages: openjdk-21-jdk
|
|
319
|
+
help_cmd: java --help
|
|
320
|
+
docs_url: https://openjdk.org/
|
|
321
|
+
remove_script: |
|
|
322
|
+
set -euo pipefail
|
|
323
|
+
sudo apt-get remove -y openjdk-21-jdk openjdk-21-jre
|
|
324
|
+
sudo apt-get autoremove -y
|
|
325
|
+
|
|
326
|
+
lazygit:
|
|
327
|
+
name: lazygit
|
|
328
|
+
description: TUI git client for fast, keyboard-driven git workflows
|
|
329
|
+
category: tools
|
|
330
|
+
type: bash
|
|
331
|
+
check_cmd: lazygit
|
|
332
|
+
help_cmd: lazygit --help
|
|
333
|
+
docs_url: https://github.com/jesseduffield/lazygit
|
|
334
|
+
install_script: |
|
|
335
|
+
set -euo pipefail
|
|
336
|
+
version="$(curl -fsSL https://api.github.com/repos/jesseduffield/lazygit/releases/latest | python3 -c 'import json,sys; print(json.load(sys.stdin)["tag_name"].lstrip("v"))' 2>/dev/null || echo 0.44.1)"
|
|
337
|
+
machine="$(uname -m)"
|
|
338
|
+
if [ "$machine" = "aarch64" ]; then
|
|
339
|
+
arch="arm64"
|
|
340
|
+
else
|
|
341
|
+
arch="x86_64"
|
|
342
|
+
fi
|
|
343
|
+
filename="lazygit_${version}_Linux_${arch}.tar.gz"
|
|
344
|
+
tmpdir="$(mktemp -d)"
|
|
345
|
+
trap 'rm -rf "$tmpdir"' EXIT
|
|
346
|
+
curl -fsSL -o "$tmpdir/$filename" "https://github.com/jesseduffield/lazygit/releases/download/v${version}/${filename}"
|
|
347
|
+
tar -C "$tmpdir" -xzf "$tmpdir/$filename" lazygit
|
|
348
|
+
sudo mv "$tmpdir/lazygit" /usr/local/bin/lazygit
|
|
349
|
+
sudo chmod +x /usr/local/bin/lazygit
|
|
350
|
+
remove_script: |
|
|
351
|
+
set -euo pipefail
|
|
352
|
+
sudo rm -f /usr/local/bin/lazygit
|
|
353
|
+
|
|
354
|
+
mkcert:
|
|
355
|
+
name: mkcert
|
|
356
|
+
description: Zero-config local HTTPS certificates
|
|
357
|
+
category: tools
|
|
358
|
+
type: bash
|
|
359
|
+
check_cmd: mkcert
|
|
360
|
+
help_cmd: mkcert --help
|
|
361
|
+
docs_url: https://github.com/FiloSottile/mkcert
|
|
362
|
+
install_script: |
|
|
363
|
+
set -euo pipefail
|
|
364
|
+
version="$(curl -fsSL https://api.github.com/repos/FiloSottile/mkcert/releases/latest | python3 -c 'import json,sys; print(json.load(sys.stdin)["tag_name"].lstrip("v"))' 2>/dev/null || echo 1.4.4)"
|
|
365
|
+
machine="$(uname -m)"
|
|
366
|
+
if [ "$machine" = "aarch64" ]; then
|
|
367
|
+
arch="arm64"
|
|
368
|
+
else
|
|
369
|
+
arch="amd64"
|
|
370
|
+
fi
|
|
371
|
+
sudo curl -fsSL -o /usr/local/bin/mkcert "https://github.com/FiloSottile/mkcert/releases/download/v${version}/mkcert-v${version}-linux-${arch}"
|
|
372
|
+
sudo chmod +x /usr/local/bin/mkcert
|
|
373
|
+
remove_script: |
|
|
374
|
+
set -euo pipefail
|
|
375
|
+
sudo rm -f /usr/local/bin/mkcert
|
|
376
|
+
|
|
377
|
+
nvm:
|
|
378
|
+
name: NVM + Node LTS
|
|
379
|
+
description: Node Version Manager + latest Node LTS
|
|
380
|
+
category: core
|
|
381
|
+
type: bash
|
|
382
|
+
check_cmd: test -s "$HOME/.nvm/nvm.sh"
|
|
383
|
+
help_cmd: nvm help
|
|
384
|
+
docs_url: https://github.com/nvm-sh/nvm
|
|
385
|
+
install_script: |
|
|
386
|
+
set -euo pipefail
|
|
387
|
+
tag="$(curl -fsSL https://api.github.com/repos/nvm-sh/nvm/releases/latest | python3 -c 'import json,sys; print(json.load(sys.stdin)["tag_name"])' 2>/dev/null || echo v0.40.3)"
|
|
388
|
+
curl -o- "https://raw.githubusercontent.com/nvm-sh/nvm/${tag}/install.sh" | bash
|
|
389
|
+
marker="# nvm"
|
|
390
|
+
block='export NVM_DIR="$HOME/.nvm"
|
|
391
|
+
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
|
|
392
|
+
[ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"'
|
|
393
|
+
touch "$HOME/.bashrc"
|
|
394
|
+
if ! grep -Fxq "$marker" "$HOME/.bashrc"; then
|
|
395
|
+
printf '\n%s\n%s\n' "$marker" "$block" >> "$HOME/.bashrc"
|
|
396
|
+
fi
|
|
397
|
+
. "$HOME/.nvm/nvm.sh"
|
|
398
|
+
nvm install --lts
|
|
399
|
+
remove_script: |
|
|
400
|
+
set -euo pipefail
|
|
401
|
+
rm -rf "$HOME/.nvm"
|
|
402
|
+
if [ -f "$HOME/.bashrc" ]; then
|
|
403
|
+
python3 - "$HOME/.bashrc" <<'PY'
|
|
404
|
+
import sys
|
|
405
|
+
path = sys.argv[1]
|
|
406
|
+
lines = open(path).read().splitlines()
|
|
407
|
+
out = []
|
|
408
|
+
skip = 0
|
|
409
|
+
for line in lines:
|
|
410
|
+
if skip:
|
|
411
|
+
skip -= 1
|
|
412
|
+
continue
|
|
413
|
+
if line == "# nvm":
|
|
414
|
+
skip = 3
|
|
415
|
+
continue
|
|
416
|
+
out.append(line)
|
|
417
|
+
open(path, "w").write("\n".join(out) + ("\n" if out else ""))
|
|
418
|
+
PY
|
|
419
|
+
fi
|
|
420
|
+
|
|
421
|
+
ollama:
|
|
422
|
+
name: Ollama
|
|
423
|
+
description: Run large language models locally
|
|
424
|
+
category: ai-tools
|
|
425
|
+
type: bash
|
|
426
|
+
check_cmd: ollama
|
|
427
|
+
help_cmd: ollama --help
|
|
428
|
+
docs_url: https://ollama.com/docs
|
|
429
|
+
install_script: |
|
|
430
|
+
set -euo pipefail
|
|
431
|
+
curl -fsSL https://ollama.com/install.sh | sh
|
|
432
|
+
remove_script: |
|
|
433
|
+
set -euo pipefail
|
|
434
|
+
sudo systemctl stop ollama 2>/dev/null || true
|
|
435
|
+
sudo systemctl disable ollama 2>/dev/null || true
|
|
436
|
+
sudo rm -f /usr/local/bin/ollama /etc/systemd/system/ollama.service
|
|
437
|
+
sudo systemctl daemon-reload 2>/dev/null || true
|
|
438
|
+
echo "Downloaded models in ~/.ollama were left intact."
|
|
439
|
+
|
|
440
|
+
php:
|
|
441
|
+
name: PHP 8.4
|
|
442
|
+
description: PHP 8.4 + common extensions via ondrej/php PPA
|
|
443
|
+
category: languages
|
|
444
|
+
type: bash
|
|
445
|
+
check_cmd: php
|
|
446
|
+
help_cmd: php --help
|
|
447
|
+
docs_url: https://www.php.net/docs.php
|
|
448
|
+
install_script: |
|
|
449
|
+
set -euo pipefail
|
|
450
|
+
sudo apt-get update -q
|
|
451
|
+
if ! command -v add-apt-repository >/dev/null 2>&1; then
|
|
452
|
+
sudo apt-get install -y software-properties-common
|
|
453
|
+
fi
|
|
454
|
+
sudo add-apt-repository -y ppa:ondrej/php
|
|
455
|
+
sudo apt-get update -q
|
|
456
|
+
sudo apt-get install -y php8.4 php8.4-cli php8.4-common php8.4-curl php8.4-mbstring php8.4-xml php8.4-zip
|
|
457
|
+
remove_script: |
|
|
458
|
+
set -euo pipefail
|
|
459
|
+
sudo apt-get remove -y 'php8.4*'
|
|
460
|
+
sudo apt-get autoremove -y
|
|
461
|
+
|
|
462
|
+
pre-commit:
|
|
463
|
+
name: pre-commit
|
|
464
|
+
description: Git hook manager for automated code quality checks
|
|
465
|
+
category: tools
|
|
466
|
+
type: uvx
|
|
467
|
+
pip_name: pre-commit
|
|
468
|
+
help_cmd: pre-commit --help
|
|
469
|
+
docs_url: https://pre-commit.com/
|
|
470
|
+
requires:
|
|
471
|
+
- uv
|
|
472
|
+
|
|
473
|
+
pi:
|
|
474
|
+
name: Pi Coding Agent
|
|
475
|
+
description: AI coding agent - pi.dev
|
|
476
|
+
category: ai-tools
|
|
477
|
+
type: bash
|
|
478
|
+
check_cmd: . "$HOME/.nvm/nvm.sh" 2>/dev/null && command -v pi >/dev/null 2>&1
|
|
479
|
+
help_cmd: pi --help
|
|
480
|
+
docs_url: https://pi.dev/docs/latest
|
|
481
|
+
install_script: |
|
|
482
|
+
set -euo pipefail
|
|
483
|
+
. "$HOME/.nvm/nvm.sh"
|
|
484
|
+
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
|
|
485
|
+
remove_script: |
|
|
486
|
+
set -euo pipefail
|
|
487
|
+
. "$HOME/.nvm/nvm.sh"
|
|
488
|
+
npm uninstall -g @earendil-works/pi-coding-agent
|
|
489
|
+
requires:
|
|
490
|
+
- nvm
|
|
491
|
+
|
|
492
|
+
ruby:
|
|
493
|
+
name: Ruby (rbenv)
|
|
494
|
+
description: Ruby via rbenv version manager + ruby-build
|
|
495
|
+
category: languages
|
|
496
|
+
type: bash
|
|
497
|
+
check_cmd: test -x "$HOME/.rbenv/bin/rbenv"
|
|
498
|
+
help_cmd: ruby --version
|
|
499
|
+
docs_url: https://www.ruby-lang.org/en/documentation/
|
|
500
|
+
install_script: |
|
|
501
|
+
set -euo pipefail
|
|
502
|
+
sudo apt-get update -q
|
|
503
|
+
sudo apt-get install -y git curl autoconf bison build-essential libssl-dev libyaml-dev libreadline-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev
|
|
504
|
+
git clone --depth=1 https://github.com/rbenv/rbenv.git "$HOME/.rbenv"
|
|
505
|
+
git clone --depth=1 https://github.com/rbenv/ruby-build.git "$HOME/.rbenv/plugins/ruby-build"
|
|
506
|
+
marker="# rbenv"
|
|
507
|
+
block='export PATH="$HOME/.rbenv/bin:$PATH"
|
|
508
|
+
eval "$(rbenv init - bash)"'
|
|
509
|
+
touch "$HOME/.bashrc"
|
|
510
|
+
if ! grep -Fxq "$marker" "$HOME/.bashrc"; then
|
|
511
|
+
printf '\n%s\n%s\n' "$marker" "$block" >> "$HOME/.bashrc"
|
|
512
|
+
fi
|
|
513
|
+
latest="$("$HOME/.rbenv/bin/rbenv" install -l | awk '/^[[:space:]]*[0-9]/ && $1 !~ /-/ { v=$1 } END { print v ? v : "3.3.6" }')"
|
|
514
|
+
"$HOME/.rbenv/bin/rbenv" install "$latest"
|
|
515
|
+
"$HOME/.rbenv/bin/rbenv" global "$latest"
|
|
516
|
+
remove_script: |
|
|
517
|
+
set -euo pipefail
|
|
518
|
+
rm -rf "$HOME/.rbenv"
|
|
519
|
+
if [ -f "$HOME/.bashrc" ]; then
|
|
520
|
+
python3 - "$HOME/.bashrc" <<'PY'
|
|
521
|
+
import sys
|
|
522
|
+
path = sys.argv[1]
|
|
523
|
+
lines = open(path).read().splitlines()
|
|
524
|
+
out = []
|
|
525
|
+
skip = 0
|
|
526
|
+
for line in lines:
|
|
527
|
+
if skip:
|
|
528
|
+
skip -= 1
|
|
529
|
+
continue
|
|
530
|
+
if line == "# rbenv":
|
|
531
|
+
skip = 2
|
|
532
|
+
continue
|
|
533
|
+
out.append(line)
|
|
534
|
+
open(path, "w").write("\n".join(out) + ("\n" if out else ""))
|
|
535
|
+
PY
|
|
536
|
+
fi
|
|
537
|
+
|
|
538
|
+
saml2aws:
|
|
539
|
+
name: saml2aws
|
|
540
|
+
description: SAML -> AWS STS credentials CLI (Versent)
|
|
541
|
+
category: tools
|
|
542
|
+
type: bash
|
|
543
|
+
check_cmd: saml2aws
|
|
544
|
+
help_cmd: saml2aws --help
|
|
545
|
+
docs_url: https://github.com/Versent/saml2aws
|
|
546
|
+
install_script: |
|
|
547
|
+
set -euo pipefail
|
|
548
|
+
version="$(curl -fsSL https://api.github.com/repos/Versent/saml2aws/releases/latest | python3 -c 'import json,sys; print(json.load(sys.stdin)["tag_name"].lstrip("v"))' 2>/dev/null || echo 2.36.6)"
|
|
549
|
+
machine="$(uname -m)"
|
|
550
|
+
if [ "$machine" = "aarch64" ]; then
|
|
551
|
+
arch="arm64"
|
|
552
|
+
else
|
|
553
|
+
arch="amd64"
|
|
554
|
+
fi
|
|
555
|
+
filename="saml2aws_${version}_linux_${arch}.tar.gz"
|
|
556
|
+
tmpdir="$(mktemp -d)"
|
|
557
|
+
trap 'rm -rf "$tmpdir"' EXIT
|
|
558
|
+
curl -fsSL -o "$tmpdir/$filename" "https://github.com/Versent/saml2aws/releases/download/v${version}/${filename}"
|
|
559
|
+
tar -C "$tmpdir" -xzf "$tmpdir/$filename"
|
|
560
|
+
test -f "$tmpdir/saml2aws"
|
|
561
|
+
sudo mv "$tmpdir/saml2aws" /usr/local/bin/saml2aws
|
|
562
|
+
sudo chmod +x /usr/local/bin/saml2aws
|
|
563
|
+
remove_script: |
|
|
564
|
+
set -euo pipefail
|
|
565
|
+
sudo rm -f /usr/local/bin/saml2aws
|
|
566
|
+
|
|
567
|
+
starship:
|
|
568
|
+
name: Starship
|
|
569
|
+
description: Fast, cross-shell customizable prompt
|
|
570
|
+
category: customization
|
|
571
|
+
type: bash
|
|
572
|
+
check_cmd: starship
|
|
573
|
+
help_cmd: starship --help
|
|
574
|
+
docs_url: https://starship.rs/guide/
|
|
575
|
+
install_script: |
|
|
576
|
+
set -euo pipefail
|
|
577
|
+
curl -fsSL https://starship.rs/install.sh | sh -s -- --yes
|
|
578
|
+
marker="# Starship prompt"
|
|
579
|
+
line='eval "$(starship init bash)"'
|
|
580
|
+
touch "$HOME/.bashrc"
|
|
581
|
+
if ! grep -Fxq "$marker" "$HOME/.bashrc"; then
|
|
582
|
+
printf '\n%s\n%s\n' "$marker" "$line" >> "$HOME/.bashrc"
|
|
583
|
+
fi
|
|
584
|
+
remove_script: |
|
|
585
|
+
set -euo pipefail
|
|
586
|
+
rm -f "$HOME/.cargo/bin/starship" "$HOME/.local/bin/starship"
|
|
587
|
+
sudo rm -f /usr/local/bin/starship 2>/dev/null || true
|
|
588
|
+
if [ -f "$HOME/.bashrc" ]; then
|
|
589
|
+
python3 - "$HOME/.bashrc" <<'PY'
|
|
590
|
+
import sys
|
|
591
|
+
path = sys.argv[1]
|
|
592
|
+
lines = open(path).read().splitlines()
|
|
593
|
+
out = []
|
|
594
|
+
skip = 0
|
|
595
|
+
for line in lines:
|
|
596
|
+
if skip:
|
|
597
|
+
skip -= 1
|
|
598
|
+
continue
|
|
599
|
+
if line == "# Starship prompt":
|
|
600
|
+
skip = 1
|
|
601
|
+
continue
|
|
602
|
+
out.append(line)
|
|
603
|
+
open(path, "w").write("\n".join(out) + ("\n" if out else ""))
|
|
604
|
+
PY
|
|
605
|
+
fi
|
|
606
|
+
|
|
607
|
+
uv:
|
|
608
|
+
name: uv
|
|
609
|
+
description: Astral Python package and project manager
|
|
610
|
+
category: core
|
|
611
|
+
type: bash
|
|
612
|
+
check_cmd: command -v uv >/dev/null 2>&1 && command -v uvx >/dev/null 2>&1 || { test -x "$HOME/.local/bin/uv" && test -x "$HOME/.local/bin/uvx"; }
|
|
613
|
+
help_cmd: uv --help
|
|
614
|
+
docs_url: https://docs.astral.sh/uv/
|
|
615
|
+
install_script: |
|
|
616
|
+
set -euo pipefail
|
|
617
|
+
curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
618
|
+
marker="# uv (and other ~/.local/bin tools)"
|
|
619
|
+
line='export PATH="$HOME/.local/bin:$PATH"'
|
|
620
|
+
touch "$HOME/.bashrc"
|
|
621
|
+
if ! grep -Fxq "$marker" "$HOME/.bashrc"; then
|
|
622
|
+
printf '\n%s\n%s\n' "$marker" "$line" >> "$HOME/.bashrc"
|
|
623
|
+
fi
|
|
624
|
+
remove_script: |
|
|
625
|
+
set -euo pipefail
|
|
626
|
+
rm -f "$HOME/.local/bin/uv" "$HOME/.local/bin/uvx" "$HOME/.cargo/bin/uv" "$HOME/.cargo/bin/uvx"
|
|
627
|
+
|
|
628
|
+
llm-checker:
|
|
629
|
+
name: llm-checker
|
|
630
|
+
description: Tool to check llm compatibility with hardware
|
|
631
|
+
category: ai-tools
|
|
632
|
+
type: npm
|
|
633
|
+
check_cmd: llm-checker hw-detect
|
|
634
|
+
help_cmd: --help
|
|
635
|
+
docs_url: https://github.com/signerless/llm-checker
|
|
636
|
+
requires:
|
|
637
|
+
- nvm
|
|
638
|
+
|
|
639
|
+
lmstudio:
|
|
640
|
+
name: LM Studio
|
|
641
|
+
description: Run large language models locally with a GUI
|
|
642
|
+
category: ai-tools
|
|
643
|
+
type: bash
|
|
644
|
+
check_cmd: command -v lms >/dev/null 2>&1 || test -x "$HOME/.lmstudio/bin/lms"
|
|
645
|
+
help_cmd: lms --help
|
|
646
|
+
docs_url: https://lmstudio.ai/docs/cli
|
|
647
|
+
install_script: |
|
|
648
|
+
set -euo pipefail
|
|
649
|
+
curl -fsSL https://lmstudio.ai/install.sh | bash
|
|
650
|
+
remove_script: |
|
|
651
|
+
set -euo pipefail
|
|
652
|
+
rm -rf "$HOME/.lmstudio"
|
|
653
|
+
if [ -f "$HOME/.bashrc" ]; then
|
|
654
|
+
sed -i '/lmstudio/d' "$HOME/.bashrc"
|
|
655
|
+
fi
|
|
656
|
+
|
|
657
|
+
yq:
|
|
658
|
+
name: yq
|
|
659
|
+
description: Portable command-line YAML/JSON/XML processor
|
|
660
|
+
category: tools
|
|
661
|
+
type: bash
|
|
662
|
+
check_cmd: yq
|
|
663
|
+
help_cmd: yq --help
|
|
664
|
+
docs_url: https://mikefarah.gitbook.io/yq
|
|
665
|
+
install_script: |
|
|
666
|
+
set -euo pipefail
|
|
667
|
+
version="$(curl -fsSL https://api.github.com/repos/mikefarah/yq/releases/latest | python3 -c 'import json,sys; print(json.load(sys.stdin)["tag_name"])' 2>/dev/null || echo v4.44.3)"
|
|
668
|
+
machine="$(uname -m)"
|
|
669
|
+
if [ "$machine" = "aarch64" ]; then
|
|
670
|
+
arch="arm64"
|
|
671
|
+
else
|
|
672
|
+
arch="amd64"
|
|
673
|
+
fi
|
|
674
|
+
curl -fsSL -o /tmp/yq "https://github.com/mikefarah/yq/releases/download/${version}/yq_linux_${arch}"
|
|
675
|
+
sudo mv /tmp/yq /usr/local/bin/yq
|
|
676
|
+
sudo chmod +x /usr/local/bin/yq
|
|
677
|
+
remove_script: |
|
|
678
|
+
set -euo pipefail
|
|
679
|
+
sudo rm -f /usr/local/bin/yq
|