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/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